diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index 9bfc6fa90b0..0b450df9848 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -274,6 +274,7 @@ CREATE TABLE `player` (
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
+ `exp` mediumtext,
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1;
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index c0cc8c86d6b..2489e6cb325 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -273,6 +273,7 @@ CREATE TABLE `SS13_player` (
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
+ `exp` mediumtext,
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1;
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 15a969e7a47..89a73aceaaf 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -1072,7 +1072,7 @@
"auF" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auG" = (/obj/structure/closet/crate,/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"auH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/syndicatebomb/training,/turf/simulated/floor/plasteel,/area/security/main)
-"auI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"auI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fore)
"auJ" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/fore)
"auK" = (/obj/structure/closet/crate,/obj/item/weapon/restraints/handcuffs,/obj/item/bodybag,/obj/item/device/radio,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fore)
"auL" = (/obj/effect/decal/cleanable/blood,/obj/structure/stool/bed/chair,/obj/item/weapon/restraints/handcuffs,/obj/effect/decal/remains/human,/obj/item/clothing/under/soviet,/turf/simulated/floor/plating,/area/maintenance/fore)
@@ -1156,7 +1156,7 @@
"awl" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -30},/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"awm" = (/obj/structure/disposalpipe/segment,/obj/structure/filingcabinet/chestdrawer{pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
"awn" = (/obj/structure/table,/obj/machinery/door_control{id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = 0; pixel_y = 7; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Cell Window Control"; normaldoorcontrol = 0; pixel_x = -5; pixel_y = -3; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/door_control{id = "briglockdown"; name = "Brig Lockdown Control"; pixel_x = 5; pixel_y = -3; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden)
-"awo" = (/obj/effect/spawner/window/reinforced,/obj/structure/grille,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"awo" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"awp" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/reinforced,/obj/item/weapon/paper,/obj/machinery/door/window/brigdoor{dir = 1; name = "Brig Control Desk"; req_access_txt = "3"},/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; name = "Reception Window"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden)
"awq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig Control"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden)
"awr" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/warden)
@@ -1277,10 +1277,10 @@
"ayC" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ayD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ayE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ayF" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ayG" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ayH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"ayI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"ayF" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore)
+"ayG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fore)
+"ayH" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"ayI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fore)
"ayJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"ayK" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"ayL" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/brig)
@@ -1339,9 +1339,9 @@
"azM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azN" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"azP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"azQ" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"azR" = (/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"azP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;50"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"azQ" = (/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fore)
+"azR" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/fore)
"azS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"azT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Office"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"azU" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/siberia)
@@ -1400,8 +1400,8 @@
"aAV" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aAW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aAX" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aAY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aAZ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"aAY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
+"aAZ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aBa" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore)
"aBb" = (/turf/simulated/wall/r_wall,/area/security/nuke_storage)
"aBc" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor{icon = 'icons/turf/floors.dmi'; icon_state = "dark"},/area/shuttle/siberia)
@@ -1439,10 +1439,10 @@
"aBI" = (/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aBJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aBK" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"aBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aBM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aBN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
-"aBO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep)
+"aBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aBM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
+"aBN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
+"aBO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep)
"aBP" = (/obj/machinery/door/airlock{id_tag = "Cabin5"; name = "Cabin 3"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aBQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
"aBR" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small,/turf/simulated/floor/wood,/area/crew_quarters/sleep)
@@ -1484,7 +1484,7 @@
"aCB" = (/obj/structure/filingcabinet,/obj/item/weapon/folder/documents,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
"aCC" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aCD" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"aCE" = (/turf/simulated/wall,/area/prison/solitary{name = "Prisoner Education Chamber"})
+"aCE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
"aCF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "Secure Gate"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig)
"aCG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aCH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "Secure Gate"; name = "brig shutters"},/turf/simulated/floor/plating,/area/security/brig)
@@ -2108,7 +2108,7 @@
"aOB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor/preopen{id_tag = "lawyer_blast"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/lawoffice)
"aOC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
"aOD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
-"aOE" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/storage/primary)
+"aOE" = (/mob/living/carbon/slime,/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"aOF" = (/turf/simulated/wall/r_wall,/area/storage/primary)
"aOG" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"aOH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
@@ -2409,7 +2409,7 @@
"aUq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Fore Primary Hallway Aft"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
"aUr" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/central)
"aUs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"; req_access_txt = "42"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
-"aUt" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry)
+"aUt" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/checkpoint2{name = "Customs"})
"aUu" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/storage/primary)
"aUv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Law Office"; req_access_txt = "38"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/lawoffice)
"aUw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/chiefs_office)
@@ -3284,7 +3284,7 @@
"blh" = (/obj/structure/sign/directions/security{dir = 4; pixel_y = 8},/obj/structure/sign/directions/engineering{dir = 4},/turf/simulated/wall,/area/janitor)
"bli" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/mechanic_workshop)
"blj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor/plasteel,/area/storage/tools)
-"blk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint2)
+"blk" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint2{name = "Customs"})
"bll" = (/obj/structure/closet/emcloset,/obj/structure/sign/double/map/left{icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/starboard)
"blm" = (/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; icon_state = "map-right-MS"; pixel_y = 32},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/starboard)
"bln" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -3432,7 +3432,7 @@
"bnZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"})
"boa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/security{name = "Customs Desk"; req_access = null; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/checkpoint2{name = "Customs"})
"bob" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads)
-"boc" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/port)
+"boc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/starboard)
"bod" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"boe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bof" = (/obj/machinery/door/window/eastleft{base_state = "right"; icon_state = "right"; name = "Deliveries"; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/quartermaster/office{name = "\improper Cargo Office"})
@@ -5703,7 +5703,7 @@
"cfI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cfJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/starboard)
"cfK" = (/turf/simulated/wall,/area/maintenance/incinerator)
-"cfL" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cfL" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12;24"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cfM" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/camera{c_tag = "Atmospherics - Port-Aft"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/atmos)
"cfN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel,/area/atmos)
"cfO" = (/obj/machinery/atmospherics/trinary/filter{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
@@ -5995,8 +5995,8 @@
"clo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clp" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"})
"clq" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"})
-"clr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cls" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
+"clr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"cls" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard)
"clt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plating,/area/maintenance/starboard)
"clu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard)
"clv" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -6267,11 +6267,11 @@
"cqA" = (/obj/structure/closet,/obj/item/weapon/storage/box/donkpockets,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cqB" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/item/device/assembly/infra,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cqC" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cqD" = (/obj/structure/table,/obj/structure/sign/greencross{pixel_y = 32},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cqE" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cqF" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cqG" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"cqH" = (/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/reagentgrinder{pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/starboard)
+"cqD" = (/obj/structure/table,/obj/structure/sign/greencross{pixel_y = 32},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cqE" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cqF" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cqG" = (/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/reagentgrinder{pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cqH" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cqI" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "turbine_control"; name = "Gas Turbine Airlock Control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/obj/structure/sign/fire{pixel_x = 32},/turf/simulated/floor/engine,/area/maintenance/incinerator)
"cqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine,/area/maintenance/incinerator)
"cqK" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
@@ -7938,15 +7938,15 @@
"cWH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/stool/bed/chair/comfy/beige{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor/wood,/area/medical/psych)
"cWI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/medical/psych)
"cWJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar)
-"cWK" = (/turf/space,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"cWL" = (/turf/space,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/space)
+"cWK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
+"cWL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cWM" = (/obj/machinery/door/window/eastleft{dir = 4; name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plating,/area/chapel/main)
"cWN" = (/obj/structure/stool/bed/chair{pixel_y = -2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cWO" = (/obj/structure/stool/bed/chair{pixel_y = -2},/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cWP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"cWR" = (/turf/space,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless/catwalk,/area/space)
-"cWS" = (/turf/space,/area/solar/starboard)
+"cWR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/space,/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
+"cWS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/research)
"cWT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cWU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cWV" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
@@ -7968,7 +7968,7 @@
"cXl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cXm" = (/obj/item/device/flashlight/lantern{pixel_y = 7},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cXn" = (/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"cXo" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/medical/research{name = "Research Division"})
+"cXo" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/research)
"cXp" = (/obj/machinery/door/airlock/external{id_tag = "emergency_home"; name = "Departure Lounge Airlock"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cXq" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 7},/obj/item/weapon/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXr" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/structure/table/glass,/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -7983,11 +7983,11 @@
"cXA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cXB" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research)
"cXC" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/research)
-"cXD" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/space)
+"cXD" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/research)
"cXE" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cXF" = (/obj/machinery/door/window{dir = 4; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cXG" = (/obj/machinery/mass_driver{dir = 2; id_tag = "chapelgun"},/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/machinery/light/small{dir = 1},/obj/item/device/gps,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/chapel/main)
-"cXH" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/space)
+"cXH" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/research)
"cXI" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cXJ" = (/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
"cXK" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
@@ -8006,7 +8006,7 @@
"cXX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXY" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cXZ" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/research)
-"cYa" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space)
+"cYa" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research)
"cYb" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/research)
"cYc" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"cYd" = (/turf/simulated/shuttle/floor,/area/shuttle/research)
@@ -8029,18 +8029,18 @@
"cYu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYw" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cYx" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/medical/research{name = "Research Division"})
+"cYx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research)
"cYy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"cYz" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/space)
+"cYz" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/shuttle/research)
"cYA" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "aftstarboard"; name = "Aft-Starboard Solar Array"},/turf/simulated/floor/plating/airless{icon_state = "solarpanel"},/area/solar/starboard)
"cYB" = (/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cYC" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/turf/simulated/floor/plating,/area/chapel/main)
"cYD" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
"cYE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"cYF" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/escape)
-"cYG" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/space)
+"cYG" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/research)
"cYH" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"cYI" = (/turf/simulated/shuttle/floor,/area/space)
+"cYI" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_closed"; id_tag = "research_dock_outer"; locked = 0; name = "Shuttle Airlock"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cYJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
"cYK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "xenobiology air connector port"},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cYL" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 3},/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8063,17 +8063,15 @@
"cZc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cZd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cZe" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"cZf" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/space)
+"cZf" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cZg" = (/obj/structure/dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"cZh" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/space)
-"cZi" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/space)
+"cZh" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
+"cZi" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cZj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"cZk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/chapel/main)
"cZl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
-"cZn" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/medical/research{name = "Research Division"})
-"cZo" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space)
-"cZp" = (/obj/machinery/computer/shuttle/science,/turf/simulated/shuttle/floor,/area/space)
+"cZn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"cZq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
"cZr" = (/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8089,7 +8087,6 @@
"cZC" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
"cZD" = (/turf/simulated/shuttle/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
"cZE" = (/turf/simulated/shuttle/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"cZF" = (/turf/space,/area/shuttle/research)
"cZG" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZI" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8102,10 +8099,8 @@
"cZP" = (/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZQ" = (/obj/structure/bookcase{name = "Holy Bookcase"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cZR" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
-"cZS" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/medical/research{name = "Research Division"})
"cZT" = (/obj/structure/lattice,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cZU" = (/obj/structure/lattice,/obj/machinery/door/airlock/external{id_tag = "emergency_home"; name = "Departure Lounge Airlock"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"cZV" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/shuttle/research)
"cZW" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
"cZX" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #1"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio3"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cZY" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #1"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8114,16 +8109,13 @@
"dab" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dac" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #2"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dad" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #2"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio8"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"dae" = (/turf/simulated/wall,/area/shuttle/research)
"daf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
-"dag" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_closed"; id_tag = "research_dock_outer"; locked = 0; name = "Shuttle Airlock"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/shuttle/research)
"dah" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/shuttle/escape)
"dai" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"daj" = (/obj/structure/sign/nosmoking_2,/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/shuttle/escape)
"dak" = (/obj/docking_port/mobile/emergency{dir = 2; dwidth = 5; height = 14; width = 25},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 14; id = "emergency_home"; name = "emergency evac bay"; width = 25},/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dal" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
"dam" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/simulated/shuttle/plating{icon_state = "bot"},/area/shuttle/escape)
-"dan" = (/mob/living/simple_animal/slime,/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dao" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dap" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8133,8 +8125,6 @@
"dau" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dav" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daw" = (/obj/machinery/computer/shuttle/science,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"})
-"dax" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/shuttle/research)
-"day" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/shuttle/research)
"daz" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/escape)
"daA" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"daB" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/shuttle/floor,/area/shuttle/escape)
@@ -8149,9 +8139,7 @@
"daK" = (/obj/structure/closet/crate{name = "lifejackets"},/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/mask/breath{pixel_x = -5; pixel_y = -2},/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/obj/item/clothing/head/hardhat,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"daL" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
"daM" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research{name = "Research Division"})
-"daN" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/shuttle/research)
"daO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_closed"; id_tag = "research_dock_inner"; locked = 0; name = "Shuttle Airlock"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"daP" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/shuttle/research)
"daQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"daS" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner (WEST)"; icon_state = "warnwhitecorner"; dir = 8},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8194,7 +8182,6 @@
"dbD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbE" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; width = 18},/turf/space,/area/space)
"dbF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"dbG" = (/turf/space,/area/medical/research{name = "Research Division"})
"dbH" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #5"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio1"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbI" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #5"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8564,27 +8551,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaktaktakIakIakIakIakIajBakvakwakxajBabqabqabqabqabqaaaaaaacgacgaiNacgacgacgaiNacgacgakAakBakCakDakEakFakGakHakHakHagBagBagBakOakJakKakLakMakNakRagBabqagCakPakQakTakSalAakUakVagCdeOdeNajdakdajfaheakWajgakXakYakZalaafbalbakhakialcaldaldaldaleakmalfalgalhairairairairairalialjalkaeNaaaabqabqabqabqabqabqabfabqabqabqabqabqaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaflallallafgaaaaaaaehalmaeGaeGaeGalnaehaaaaaaaflallallafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaloalpakIalqalralsaltajBalualvalwajBakyalLakyakyabqabqaaaaaaaaaabqaaaaaaaaaabqabqalMalBalCalBalDalEalFalGakHalHalIalJagBagBagBalKalNagBagBalOagBagBalPagCagCalQamualRamzamwagCagCatzdePalTalUalVaheajgajgalWalWalXalYafbalZakhamaambamcamcamdameamfamgamhaeNairairairairairaeNamiamjaeNaaaabqaaaabqaaaamkamkamkamkamkamkamkabqabqabqadFabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehamlaeGaeGaeGalnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktammaktamnamoampamqajBajBamramsajBalxalyalzakyakyabqabqabqabqabqabqabqabqaaaaaaamxakDakDakDakDamyamEamAakHamBamCamDagBamFamIamGamHamKamJanYanFagBamMamNamOamPamQamRamSamTamOamUdeRdePamWamXamYaheamZalWalWanaanLajgafbanbancandaneanfanfangameamjanhamhaeNairairairairairaeNanianjaeNabqabqabqabqabqamkankanlanmannankamkabqaaaanoanpanoansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehantanuaglantanuaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakIanvanwanxanyanzanAanBanCanDanEakyamtanGamvanIakyabqaaaaaaabqaaaaaaaaaajgakDakDamxaouanKanSanManNanOanPakHanQamCanRagBanTanWanUanVanZanXanYaonaoaaobaocaodaoeaofaogaohaoiaojaokdeUaoHaoLaooaopaheaoqaoraosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGapeaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaapgaoMapgasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaajgapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqoaqpaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktaquaqvaqwakyaqxaqyaqzaqAakyapfapfaqBaqCanEapfajgajgaqFaqEamxaqGarSaqTaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaxfaqYaqUaqVaqWakHaqXdfnaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqDairairairairairaqbarrarsaoGaqeaoGaoGapeaoGamkartaruankarvarwamkabqapgapgaoMapgansaoGaoGaoGafdacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktanHaqvapdapfarIapdapdapdarJapfarKarUarTarNapfatAarWarParRaumazcaCTarVaCVarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassastasuastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKasLasMasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCblyavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgathapdatiapfaoXaElaEjapfapfatlatmatnatoamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYatJakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOatLafbaeNatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfautausausausausausauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEapfauIatmakeauJauKajgauLamxauMauNaqJatqapnauQauPauTauRauSauSauUauVauWauXaqUauYamLakHdfsdfravcauZaveavfaveavhaveaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAawMavCasJavDavEavHavGawZavIavJamkapeansavKavLavMaoGdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakIanvanwanxanyanzanAanBanCanDanEakyamtanGamvanIakyabqaaaaaaabqaaaaaaaaaakDakDakDamxaouanKanSanManNanOanPakHanQamCanRagBanTanWanUanVanZanXanYaonaoaaobaocaodaoeaofaogaohaoiaojaokdeUaoHaoLaooaopaheaoqaoraosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGapeaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaapgaoMapgasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaakDapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqoaqpaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktaquaqvaqwakyaqxaqyaqzaqAakyapfapfaqBaqCanEajgajgakDaqFaqEamxaqGarSaqTaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaxfaqYaqUaqVaqWakHaqXdfnaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqDairairairairairaqbarrarsaoGaqeaoGaoGapeaoGamkartaruankarvarwamkabqapgapgaoMapgansaoGaoGaoGafdacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktanHaqvapdapfarIapdapdapdarJapfarKarUarTarNajgatAarWarParRaumazcaCTarVaCVarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassastasuastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKasLasMasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCblyavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgathapdatiapfaoXaElaEjajgajgatlatmatnatoamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYatJakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOatLafbaeNatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfautausausausausausauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEajgauIatmakeauJauKajgauLamxauMauNaqJatqapnauQauPauTauRauSauSauUauVauWauXaqUauYamLakHdfsdfravcauZaveavfaveavhaveaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAawMavCasJavDavEavHavGawZavIavJamkapeansavKavLavMaoGdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqalLavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaawbavUawcbflavUaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatrasSavdawdavgawlawkawmaqUawnaqYawsawtawuasdawvdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLaxjavqavrawNawOawPawoawRawSawTavvawUawVawWavvaoGaoGasJaubavBasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxansansaxdaxeaoGaoGbnIaxhbnJbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxlaxkaxkaxkaxkaxkaxZapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamEaxGaxHaqJaxIaxJaxKaqYawpagBagBagBawrawqasdagBaxPawQakHakHamOaxLaxRaxSaxLamOaxNaxMamOaxOatKatKaxWaxWaxWamOamOaxXafbdeeaAAdefavrayaaybayaawoaycaydayeayfaygayhayiavvayjaoGaykaylaymaynaoGasMaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaoGdfCdgCdfEaoGaoGaoGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayGayHayIajgajgajgaxTaxQaxQaxQaxUajgajgayMayNayOayPayMamEamEakDayQayRapnaySaySayTayUaySaySayVayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYaWvavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmdfobpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaWwaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLazMapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfathaoXapdaoXazNazOazPazQazRazSajgaaaabqaaaaaaaaaaaaaaaabqaaaaxEazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAdaxVaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDatLafbaxYaWxavqavraABaACaADayJaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGaucaoGaAMaxhaxhawYaANamkaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAOaxhabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPazSapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXapfaAYaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamEamEakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDatLaBIaBIaBIaBIavraBJaPWaBLaBMaBNaBOayeaBPaBQaBRaBSavvaBTaBUaBVaBWaBXaBWaBYaBWaBZaBWdgEaCaaCbaCcaCdaCeaCfaCgaChaCgaCiaCjaCkaCjaClaxhaxhaxhaCiaCjaClaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXazSarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuaCvaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaaCEayLaCGazwakDayLaCIazwakDayLaCJazwakDaCKamEaCLakDamEazzaCNamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDatLaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaDdaDeaDfaWyaDfaDhaDiaDjaWzaDkaCjaDlaCjaDmaWzaDjaDiaCmaDnaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLayBazSaqwapfaaaaASaDqaDraDqaASayKaDsaDtaCsaDuaDvaDwaDxaDyaCsaDzaDAaDBaDCaDDaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaDKayMaAfaAfacAaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaEdaEeaCSaEfaEgaEgaEhaEgaEiaBIaRtaEkaRyaBIaEmaEnaEmavvaEoaEpaEqaEraEsaEtaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaExaExaEyaEzaEAaEBaECaEDaCgaCgaCgabqabqaEEaEFaDiaDiaDiaDiaDiaEGaEEaDiaEHaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyazSapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQaERaESaETaEUaEVaEWaCuaCwajgaaaaBbaEXaEYaEZaFaaFbaBbaaaayMaFcaCCaCCaFdaFeaFfacAaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaFkaFlaFmakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSaFyaFzaFzaFzaFAaFBaBIaTeaFDaThaBIaFFaFGaFGaFHaFIaFJaFKavvavvavvavvavvaoGaFLaxhaFMaFNaFOaFPaFQaFRaFSaFTaFTaFTaFTaFUaFVaFWaFXaFYaCgaFZabqabqaaaaaaaaaabqabqaaaaaaabqaaaaaaaWAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaGbalLaaaaaaaASaDraDraDraASayKaGcaGdaGeaEMaEKaGfaGgaGhaCsaGiaGjaGkaGlaGmaCuaCwajgabqaBbaGnaGoaGpaGqaGraBbaaaayMaGsaGsaGsayMaAfaGtacAaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaGCaGDaGEaGFaGGaGHaCSaGIajgajgajgaGJajgaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaGTaGUawWavvaGVaGWaxhaGXaGYaGZaGZaHaaCMaDcaHcaHdaHeaHeaHeaHfaHgaHhaHiaDLarAaMKaMJaOhaMJaMJaOhaMJaMJaOhaMJaMJaPwabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayHayGayIajgajgajgaxTaxQaxQaxQaxUajgajgayMayNayOayPayMamEamEakDayQayRapnaySaySayTayUaySaySayVayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYaWvavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmdfobpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaWwaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLazMapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfathaoXapdaoXazNazOazPazRazQaAYajgaaaabqaaaaaaaaaaaaaaaabqaaaaxEazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAdaxVaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDatLafbaxYaWxavqavraABaACaADayJaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGaucaoGaAMaxhaxhawYaANamkaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAOaxhabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPazSapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXajgaCEaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamEamEakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDatLaBIaBIaBIaBIavraBJaPWaBLaBNaBMaBOayeaBPaBQaBRaBSavvaBTaBUaBVaBWaBXaBWaBYaBWaBZaBWdgEaCaaCbaCcaCdaCeaCfaCgaChaCgaCiaCjaCkaCjaClaxhaxhaxhaCiaCjaClaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXazSarIalLaaaaCoaCpaCqaCpaCoayKayKayKaCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuaCvaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaakDayLaCGazwakDayLaCIazwakDayLaCJazwakDaCKamEaCLakDamEazzaCNamEamEaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDatLaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaDdaDeaDfaWyaDfaDhaDiaDjaWzaDkaCjaDlaCjaDmaWzaDjaDiaCmaDnaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqabqabqarAarAarAarAataarAarAarAaDparAarAarAarAabqaaaabqalLayBazSaqwapfaaaaASaDqaDraDqaASayKaDsaDtaCsaDuaDvaDwaDxaDyaCsaDzaDAaDBaDCaDDaCuaCwajgaaaaBbaDEaDFaDGaDHaDIaBbaaaaxEaDJaCCaDKayMaAfaAfamxaDMaDNaDOakDaDPaDNaDOakDaDQaDNaDOakDaDRaDSaDTakDaDUaDVaDWaDXaDYaCOaDZaEaaEbaEcaEdaEeaCSaEfaEgaEgaEhaEgaEiaBIaRtaEkaRyaBIaEmaEnaEmavvaEoaEpaEqaEraEsaEtaEuaEvaBWaEwaxhaxhaxhaxhaxhaxhaxhaExaExaEyaEzaEAaEBaECaEDaCgaCgaCgabqabqaEEaEFaDiaDiaDiaDiaDiaEGaEEaDiaEHaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqarAarAarAarAarAarAarAabqarAabqabqarAarAabqabqapfapfauyazSapfapfaaaaCobxFaDqaDqaEIaEJaEKaEKaELaEMaENaEOaEPaEQaERaESaETaEUaEVaEWaCuaCwajgaaaaBbaEXaEYaEZaFaaFbaBbaaaayMaFcaCCaCCaFdaFeaFfamxaFgaDNaFhakDaFgaDNaFiakDaFgaDNaFjakDaFkaFlaFmakDaFnaFoaFpaFqaFraCOaFsaFtaFuaFvaFwaFxaCSaFyaFzaFzaFzaFAaFBaBIaTeaFDaThaBIaFFaFGaFGaFHaFIaFJaFKavvavvavvavvavvaoGaFLaxhaFMaFNaFOaFPaFQaFRaFSaFTaFTaFTaFTaFUaFVaFWaFXaFYaCgaFZabqabqaaaaaaaaaabqabqaaaaaaabqaaaaaaaWAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarAarAarAarAarAabqabqabqarAarAarAabeaaaabqabqabqapfaAgaoXaoXaGbalLaaaaaaaASaDraDraDraASayKaGcaGdaGeaEMaEKaGfaGgaGhaCsaGiaGjaGkaGlaGmaCuaCwajgabqaBbaGnaGoaGpaGqaGraBbaaaayMaGsaGsaGsayMaAfaGtamxaAEaCFaCramxaAEaCFaCramxaAEaCFaCramxaGxaCHaGzamxamxazzaGAamxaGBaCOaGCaGDaGEaGFaGGaGHaCSaGIajgajgajgaGJajgaBIaGKaGLaBIaBIaGMaGNaGOaGPaGQaGRaGSazlaGTaGUawWavvaGVaGWaxhaGXaGYaGZaGZaHaaCMaDcaHcaHdaHeaHeaHeaHfaHgaHhaHiaDLarAaMKaMJaOhaMJaMJaOhaMJaMJaOhaMJaMJaPwabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqaHkaHlaHkabfaaaabqaaaabqapfaHmaHnanEazSapfapfaaaaCoaHoaHpaHqaCoayKayKayKaCsaHraEKaHsaGgaHtaCsaHuaHvaHwaHxaHyaCuaCwajgaaaaBbaHzaHAaHBaHCaBbaBbaaaaHDaHEaHEaHEaHFaHGaHHaHGaHIaHJaHIaHKaHIaHJaHIaHLaHIaHJaHMaHNaHOaHPaHQaFCaHSaHTaHUamxazeaCSaHVaHWaHXaHYaHZaIaaCSaIbaBIaIcaIdaIeaIfaIfaIgaIhaIiaIjaIkaIlaImaInaIoaIpayeaIqaIraIsaItavvaucaGWaxhaIuaIvaIwaIxaIyaIzaIAaIBaICaIDaIDaIDaIEaIFaHhaHiaDLaMIaPxarAaPyarAarAaPyarAarAaPyarAarAaPxaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqaaaaHkaIGaHkabqabqabqabqabqapfaIHapdapdaIIaIJapfaaaaIKaARaILaARaIMabqabqabqayKaINaIOaIPaIQaIRaCsaISaITaIUaIVaIWaCuaCwajgaaaabqaaaaGaaIYaGuaaaabqaaaaHGaAfaAfaAfaHGaHGaJaaJbaJcaJdaJeaJfaJgaJhaJhaJiaJhaJjaJgaJkaJlaJmaJnaJoaJpaJqaJramxazeaCSaCSaJsaJtaCSaJuaCSaCSaGIaBIaBIaBIaJvaJwaJxaJyaJzaJAaJBaJCaJDaJEaJFaJFaJGaJHavvavvavvavvavvaubaGWaxhaJIaJJaJKaJLaJMaGvaJOaJPaJQaJRaJSaJTaJUaJVaHhaHiaDLaDLaPxaJWaaaaaaaaaaaaaJWaaaaaaaJWarAaPxabqaCgaJXabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaabqaaaaHkaHlaHkaHkaGwaGwaGwaHkaHkaHkaHkaHkaJZaKaapfaaaaaaaaaaaaaaaaaaaaaaaaabqayKaKbaKcaKdaKeaKfaCsaKgaKhaCuaCuaCuaCuaKiajgaKjaGyaHjaHbaKnaHRaIZaIXaKjaHGaKraKsaKsaKtaKuaKvaKwaKxaKyaKzaKAaKBaTiaKDaKEaKCaKFaKGaKHaKIaKJaKKaJNaKMaKNaKOamxazeaKPaCSaKQaKRaCSaKSaKTaKUaKVaBIaKWaKXaKYaKZaBIaLaaLbaLcaBIaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmavvasJaGWaxhaLnaLoaLpaLqaLraFRaLsaLtaJQaLuaCgaCgaLvaLwaCgaDLaDLaDLaPxaaaaaaaaaaaaaaaaLxaaaaaaaaaaTMaRgabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaHkaLyaLzaLAaLBaLBaLCaLDaLEaLFaLGaHkaHkazSapfaaaaLHaLIaLIaLIaLIaLIaLJabqaCsaCsaCsaJYazTaCsaCsaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLWaLZaMaaMbaHGaMcaMdaMeaMfaMfaKkaMfaMfaMfaMfaMfaMfaMfaMfaKkaMfaMhaMiaMjaMkaMkaMkaMlaMlaMlaMlaMlaMkaMmaMkaMnaMnaMnaMnaMoaMnaGIaBIaBIaBIaMpaMqaBIaMraBIaMsaBIaMtaMuaMvazlaMwaMxaMyazlaMzaMAaMBavvaMCaMDaxhaCgaCgaCgaCgaCgaFRaMEaMFaJQaMGaCgaMHaXGaWubssaWuddkaDLaPxaaaaaaabqabqabqabqabqaaaaaaarAaPxarAaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaaaaaHkaMLaMLaMLaLBaLBaLBaLBaLBaLBaMLaMLaMMaHkazSalLaaaaMNaMOaMOaMOaMOaMOaMNabqabqaKlaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZaNaaNbaNcaLRaNdaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaKmaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaKoaNraNsaNtaMkaNuaNvaNwaNxaNyaNzaNAaNBaNCaMkaNDaUfaNFaNGaNHaMnaNIaBIaNJaNKaJwaMqaBIaNLaBIaNMaBIaNNaNOaNPaNQaNQaNQaNQaNQaNQaNQaNQaNQaoGaNRaxhaNSaNTaNUaNVaCgaNWaIvaMFaNXaNYaNZaOaaObaOcaOdaOeddRaDLaPxaJWabqabqaOgddSaOiabqaOjaaaarAaPxataaCgaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaHkaOkaLBaLBaLBaLBaLBaLBaLBaLBaMLaMLaMLaOlaOmapfaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaOpaOqaOraOraOsaOtaOuaOvaOwaOxapfaOyapfapfapfapfaOzaOAaKqaOCaODaOEaOAaOAaOAaOAaOFaaaaaaaOGaOGaOGaOGaOGaOGaOGaaaaaaaMfaOHaOIaOJaOKaOLaNAaOMaONaOOaVsaOQaORaOSaMkaOTaOUaOVaOWaOXaMnaOYaBIaBIaBIaOZaOZaBIaBIaBIaBIaBIaPaaPbaPcaNQaPdaPeaPfaPgaPhaPiaPjaNQaPkaGWaxhaNTaNTaPlaOdaPmaGYaPnaPoaPpaPqaCgaPraPsaPtaPuaPvddUaKLddVaaaaaaabqddWcspaPzabqaaaaaaaTMaRgaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHaXIaWBaXJaWBaXKaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaHkaOkaLBaLBaLBaLBaLBaLBaLBaLBaMLaMLaMLaOlaOmapfaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaOpaOqaOraOraOsaOtaOuaOvaOwaOxapfaOyapfapfapfapfaOzaOAaKqaOCaODaKqaOAaOAaOAaOAaOFaaaaaaaOGaOGaOGaOGaOGaOGaOGaaaaaaaMfaOHaOIaOJaOKaOLaNAaOMaONaOOaVsaOQaORaOSaMkaOTaOUaOVaOWaOXaMnaOYaBIaBIaBIaOZaOZaBIaBIaBIaBIaBIaPaaPbaPcaNQaPdaPeaPfaPgaPhaPiaPjaNQaPkaGWaxhaNTaNTaPlaOdaPmaGYaPnaPoaPpaPqaCgaPraPsaPtaPuaPvddUaKLddVaaaaaaabqddWcspaPzabqaaaaaaaTMaRgaMIaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaaaaaaaaaaabdabdabdabdabdabdabdaXHaXIaWBaXJaWBaXKaXOabdabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabqaHkaPAaLBaLBaLBaLBaPBaLBaPCaLBaLBaMLaPDaHkaGbapfaaaaMNaMOaMOaMOaMOaMOaPEaPFaPGaPFaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaPRaPSaPTaPTaPUaPTaPVaOAaYOaPXaPYaPZaQaaQbaQcbeBaQeaQfaQgaQgaQhaQiaQjaQkaQlaQmaQmaQnaQoaQpaKGaNtaMkaQqaNAaQraNAaQsaNAaQtaNAaNAaMkaQubeLaOVaQwaQxaMnaQyaQzaQAaQBaQCaQDaQEaQFaQGaQHaQIaQJaQKaQLaNQaQMaQNaQNaQNaQOaQPaQQaNQaQRaGWaxhaQSaQSaQTaOdaPmaJJaQUaQVaQWaQXaQYaQZaRaaRbaRcaRdaOfaDLaPxaaaaReabqaRfddXaRhabqabqaJWarAaPxabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaUUaUUaUUaUUaUVaXNbbXbbWbbYbbWbbZbgUaUVaUUaUUaUUaUUaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGwaLBaLBaLBaLBaLBaLBaLBaLBaLBaLBaRiaHkaHkaRjapfabqaMNaMOaMOaMOaMOaMOaRkaRlaRmaRlaRnaPIaRoaRoaRpaRoaOuaRqaRraRsapfapfapfapfapfapfazSaOAbgkaRuaRvaRwaRxaRxaRxbgyaOFaaaaOGaRzaRAaRAaRAaRAaRAaRBaOGaaaaMfaRCaMiaMjaMkaRDaREaRFaNAaRGaNAaRHaRIaNAaRJaRKaRLaRMaRNaROaMnaRPaRQaRRaRRaRRaRSaRTaRTaRUaRUaRVaRWaRXaRYaRZaSaaSbaSbaSbaScaSdaSeaNQaSfaGWaxhaQSaSgaShaSiaCgaSjaIvaSkaJQaSlaCgaSmaSnaSoaSoaSoaSpaDLaPxaaaaaaabqabqabqabqabqaaaaaaarAaPxabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbcbbcabcabcabcabcabzhbzhbdJbzhbzhbcabcabcabcabcaaXKaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSqaSraSsaaaaGwaLBaLBaLBaLBaLyaLBaStaSuaSuaSvaSwaHkaqBazSapfabqaMNaMOaMOaMOaMOaSxaMNaKpaKlaKlaSyaPIaSzaSAaSBaSCaSDaSEaSFaSGaLKaSIaSJaSKaSLapfaSMaOAaSNaRuaSOaSPaSQaSQaSRaSSaOFaaaaMgaSUaRAaSVaSWaSXaRAaSYaMgaaaaMfaMhaMiaMjaMkaSZaTaaTbaTcaTdaTcbjbaTfaTgaMkbmIbkZaTjaTkaTlaMnaTmaTnaToaTpaTqaTraTsaTtaTuaTvaTwaTxaTyaTzaTAaTBaTCaTDaTEaTFaTGaTHaNQasIaGWaxhaCgaCgaCgaCgaCgaFRaTIaTJaTKaTLaCgaCgaLvaLwaCgaDLaDLaDLaPxaaaaaaaaaabqaaaaaaaaaaaaaaaaTMaRgabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbdKbdNbdNbdNbdNbdNbdNbdObdNbdNbdNbdNbdNbdNbdPbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8593,7 +8580,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaWDaWEaWFaWGaWDaHkaLCaMLaWHaWIaWJaLBaLBaLBaLBaUYaWKaHkazSapdalLaaaaMNaOnaMOaMOaMOaMOaMNaKpaKlaKlaWLaPIaRoaRoaRpaRoaOuaVjaWMaWNaVlaWOaWPaWQaWRapfazMaOAaWSaWTaWTaWUaWVaRuaUgaWWaOFabqaOGaOGaOGaWXaWYaWZaOGaOGaOGabqaMfaOHaXaaMjaXbaXcaVEaVEaVEaXdaVEaVEaXeaNCaXbaQCaXfaXgaXhaToaUiaToaTnaTpaToaXjaToaXkaTpaTqaToaTqaTpaXlaXmaNQaXnaXoaXpaXqaXraPiaQQaNQaXsaGWaxhaXtaXuaXvaXwaXxaXyaXzaXAaXBaXCaXDaXDaXEaXFaHhaHiaDLarAdeaaMJdebaMJaMJdebaMJaMJdebaMJaMJdecabqaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabdaaabgMbdMbeWbeXbeXaXLaXLaXLaXLbfabpvaXLaXLaXLbeXbeXbeYbdMbMnaaaabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaXPaXQaXRaXSaHkaXTaMLaXUaXVaXWaMLaMLaMLaXXaXYaXZaHkaYaaYbapfabqaYcaYdaMOaMOaMOaYeaYfabqabqaKlaWLaYgaPJaPKaYhaYiaYjaYkaYlaYmaYnaYnaYnaYnaYnapfaYoaYpaYqaYraYraYsaYtaYuaYvaYwaUoaaaaaaaaaaOGaOGaYyaOGaOGaaaaaaaaaaKoaNraYzaMjaYAaYBaYCaYDaYEaNCaNCaYFaYGaNCaYAaQCaYHaYIaYJaYKaYLaYKaYMaYNbmLaYPaYKaYKaYKaYKaYKaYKaYQaYRaYSaNQaNQaNQaNQaYTaNQaNQaNQaNQaoGaGWaxhaYVaYUaYUaSTaYWaYXaYYaYZaZaaZbaZcaZdaZeaZfaFXaZgaCgaaaabqabqaaaaaaaaaaaaabqaaaaaaabqabqarAaDiaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdclHbcbbfcbfbbgNaXLaXLbdIbdIbdIbgPbgObdIbdIaXLaXLbgNbgQbgSbgRaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaWDaWDaZiaZjaWDaWDaWDaZkaWDaWDaZlaZmaWDaWDaWDaZnaWDaWDaZoapfapfabqaZpaZqaZraZraZraZqaZsabqabqaZtaZuaPIaRoaRoaRpaRoaOuaZvaOuaZwaYnaZxaZyaZzaZAapfazSaOAaZBaZCaZDaZEaZFaZGaZHaZIaOFaZJaUraZJaZLaZMaZNaZOaZLaZJaUraZJaMfaZPaZQaZRaZSaMkaMkaMkaMkaZTaZUaZVaNCaZWaMkaQCaZXaTraZYaZZaZZaZZaZZaoGaoGaoGbaababbacbadbaebafaZZbagbagaoGbahazAazybaiazybajazybakazybalaxhbambambambambanbaobapbaqbarbasbataIvbaubavaCgaCgaCgabqabqbawbaxaDiaDiaDiaDiaDiaDibawaDibayaCgaCgaDoabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabdaXHbgTbicbeXbeXaXLbdIbidbifbiebihbigbiibidbdIaXLbeXbeXbijbgTaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUtbaAbaBbaCbaDbaEbaBbaFbaGbaHbaGbaIbaJbaGbaKbaLbaMbaNbaOapfaaaaaabaPbaQbaQbaQbaRaaaabqaZtbaSaWLaPIaRoaRobaTbaUaOubaVbaWbaXbaYbaZbbabbbbbcapfazSaOAaOAaOAaKqaKqaUuaOFbbebbfaOFbbgbbhbbiaZLbbjbbkbblaZLbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwaMkaMkaYAaLLaYAaMkaMkaUibbybbzaUibbAbbBbbCbbDbbEbbFaoGaoGaoGaoGbbGaoGaoGaoGaoGaoGaoGaGWasIasJbbHbbHbbHbbHbbHbbHbbHbambbIbbJbbKbamaUwbbMbambbNbbOaFRaFRbbPbbQbbRaDfbbSaDfbbTaDibbUaDiaCiaCjbbVaCjaClaDibbUaDiaCmaDnaDoabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbdIbikbilbdLbnQbimbjPbjObdIaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaUNbaAbaBbaCbaDbaEbaBbaFbaGbaHbaGbaIbaJbaGbaKbaLbaMbaNbaOapfaaaaaabaPbaQbaQbaQbaRaaaabqaZtbaSaWLaPIaRoaRobaTbaUaOubaVbaWbaXbaYbaZbbabbbbbcapfazSaOAaOAaOAaKqaKqaUuaOFbbebbfaOFbbgbbhbbiaZLbbjbbkbblaZLbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwaMkaMkaYAaLLaYAaMkaMkaUibbybbzaUibbAbbBbbCbbDbbEbbFaoGaoGaoGaoGbbGaoGaoGaoGaoGaoGaoGaGWasIasJbbHbbHbbHbbHbbHbbHbbHbambbIbbJbbKbamaUwbbMbambbNbbOaFRaFRbbPbbQbbRaDfbbSaDfbbTaDibbUaDiaCiaCjbbVaCjaClaDibbUaDiaCmaDnaDoabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbdIbikbilbdLbnQbimbjPbjObdIaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaUNbcdbcebcebcfbcebcebcebcgbchbcibcjbckbckbckbclbcmbcnbcoapfaaaaaaabqabqaaaaaaabqabqabqaZtbcpbcqbcrbcsaRobctbcubcvbcwbcxbcybczbcAbcBbcCbcDapfbcEbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbcQbcPbcRbcSbcTbcUbcVbcPbcWbcXbcXbcYbcZbdabcXbcXbdbbdcbdcbdcbddbdebdcbdcbdfbdcbdgbdhbdcbdcbdcbdibdjaoGbdkbdlbdmbdnbdobdpbdobdqbdobdrazBbakbalaubasJbbHbdsbdtbdubdvbdwbdxbambdybdzbdzbdAbdzbdBbambdCbarbdDbdEbdEbdEbdEbdEbdFaCgbdGaCjbdHaCjaDmaCgaCgaCgbdGaCjaDmaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaXHbdMbeWbeXaXLaXLbdIbjQbilbdIbjRbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaUNaUNbdQaUNaWDaUNbdRaUNbcdbcebdSbdTaUNbdRaUNbdUbdVbdWbdXapfapfapfapfalLalLalLapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnaWjapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgbeVaCgaCgaCgaCgaCgaLwaCgabqarBbjUabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabdaXHbdMbeWbeXaXLaXLbjWbjVbjYbjXblFblDblIblGblJbdIaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaUNabqaaaabqaaaaUNbfdaUNbfebfebffbfgaUNbfdaUNaUNaWDbfhbfibfjavTavUbfkavUbflavUbfmbfnavVbfobfpbfqbfqbfrbfsbftbfubfvbfwbfxbfybfwbfzbfAbfwbfBbfCbfDbfEbfFbfGbfHbfIbfJbfKbfKbfLbfMbfNbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbgabfWbfVbfVbgbbgcbgdbezbgebgfbggbghbgibezbgjbmOaoGbglaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxbmPbgzbambgAbgBbgCbdEbgDbgEbgFbdEbgGaOdaOdbgHaOdbgIaOdaOdaOdbgJaOdbgKbgLbgKbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabdaXHbdMbeWbeXaXLaXLbdIblKbilbdIblLbdIbjTbjSbdIbdIaXLbeXbeYbdMaXOabdabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8601,7 +8588,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbiBbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbazbiPbiQbiRbiSbiTbbdbiVbiWbiXbhqbiYbiZbjabhKbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDbjEbjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEdeWavPdfadfcdfbdfdasXdfeanqanqaaaaaaaFRbgLaFRabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaUUaUUblMaXNbmHblNbfbbgNaXLaXLbdIbidbilbmTbnLbnEbnMbidbdIbdIaXLbgNbgQbnNbnPbnOaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkibkjaUNbgVbgWbbLbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDaXibkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbccabqabqbefbhvbhabhHbkWbiObhvbhHbkWbiObhabhabiUabqabqbhwbmRblablbblcblbbldblebhwblfbfIblgbwlbezbkkbljbkRbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambambkTbkSbambltblubltbdEbkUblwbkVbdEdffdfhdfgdfgdfjdfkdfkdfkdflabqaaaaaaaaaaWwaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWwbnRblEbnTbnSbnUbicbeXbeXaXLaXLbdIbpsbptbdLbqZbpubrbbrabdIbdIaXLbeXbeXbrcbijbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVaUNbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqbkXboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbkYabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDblidfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaWwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaWwbnRblEbnKbrgbrhbeWbrjbeXaXLaXLbdIbrlbrmbifbrIbrnbrQbrKbdIbdIaXLbeXbeXbeXbeYbrfaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVaUNbnWbnXbnYbnZboablkbocblkbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbbdbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWblrbkWbsbboCboDboEboDboFboDboEboDboGbscbkWblrbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAdfGdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdblMbsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbsObdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVaUNbnWbnXbnYbnZboablkaUtblkbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbbdbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWblrbkWbsbboCboDboEboDboFboDboEboDboGbscbkWblrbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAdfGdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbsdbsdblMbsebsfbeWbsnaXLaXLaXLbsMbdIblHblHbsObdIbdIbdIbdIbrkaXLaXLaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUblVaUNbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMblsbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqbsPbsRbsQbsSbrdcKIaXNbsfbsTbsUaXLbsWbsVbsXbribsZbsYbtbbtabtcbrkbtebtdbtgbtfaXLbeXbeYbdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibruaUNbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGaXibrHblvbfwbfwbfwbfwbfwaXibrJblxbfwbfwbbdbrLbrMbbdbbdbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZiblCbsoblCbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbmBaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaabuLbudbuMabqbuObuNbuQbuPbuSbuRbuTbBebuVbuUbuWbribuYbuXbvabuZbvcbvbbvebvdbvgbvfaXLbvhbvibdMaXOabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbvjbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJbobbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukboAdedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGaxcbuDaoGbuEbuFbuGbqNbuHbuHbuHbuIbuJbqSbqSbuKbvlbvkbvnbvmbvpbvobvrbvqbvsbvsbvvbvtbvwbvwbvwbxlbxmbvwbvwbvwbvwbvwbxlbvwbvwbvwbvwbvwbvwbxlbvwbxmbxobxnbxpbxpbxrbxqbxtbxsbxvbxubxxbxwbxzbxybxBbxAbxDbxCbzebxEbzgbzfbzjbzibzlbzkbznbzmbzpbzoaWCabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8631,12 +8618,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaaabTYcfTbTYaaaabqaaaaaaaaabZUceNbZUbZUbZUbZUcfUbZUbZUcfVcfWcfVbZUbZUbZUbZUbZUcfXcfYbZUcfZcgacgbcgccgdcgecgfcggcgfcghcgicgjcgkcglcgmbVocgocgpcgqcgrcgscgtcgucgvcfkcgwcgxcgycftcgzcgAcgBcgCcgDcgEcgFcgGcgHcfxcgIcgJcgKcfxcgLbZucgMcgNcgOcgPcgQcgRcgScgTcgUcgRcgScgTcgTcgRcgVcgWcgXcgYcgZchacbVasIchbchccfKcfKcfKcfKcfKchdchechfbCMchgchhbGGbGGbSPchibIqbIqchjchkchjbIqchlchmbRibCMbCMbCMaUVaUUaUVaUUaUVaaabFcaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqbTYceMbTYabqabqabqabqabqbZUchnchochpbZUchqchrchsbZUchtchuchvchwchxchychzbZUchAchBchCchDchEcmJcoQchHchIchJchKchLchMchNchOcdUchPchQcaHchSchTchUchVchWchXchYchZciacgwcgxcgycibciccidciecifcigcihcihciiciicelcikcilcimcfxcinbZuciocipciqbQAcircisciuciucivciuciwciucKCcJFciybZvcizciAciBciCcfJaoGaoGaoGcfKciDciEciFciGciHciIciJbCMciKciLciMciNciOciPciQciRciSciTciUciVciWciXbRiciYciZciYcjacjacjacjacjbabqabeaaaabqaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaacjcaaaaaaabqaaaabqaaabZUbZUbZUceNbZUcjdcjecjfcjgcjhcjicjjchychychscjkbZUcjlcjmbZUcdNcjncjocjpcdTcjqcjrcjscjtcjucjvcjwcjxcjxcjycjxcjzcjAcjBcjBcjCcjDcjEcjFcjGcjHcjIcjJcibciccicciccjKcjLcjMcjNcjOcjPceLcjRcjScjTcfxcjUbZubZubZubZubZvbZvcjVbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvbZvcjWcjXaoGcjYcjZcfKckackbckcckdckeckfcqcbCMckhckhckickhckjckhckickkckjckjbRickhcklckmcknbCMbCMbCMckockpcjackqckoaaabFcaaaabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckyckzchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRckSckTcfscgwckVcgybVickWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljclkcljcllclmclncljcljclocljcljcljcljclpclqclrclscdocltcluclvclwbVKcfKclxclyclzclAclBclCclDbCMbCMbCMcgnbzLchRbzLcgnbzLchRchRcijbzLcijbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRclSclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcjQcmjcjQcmkcmlckVcmmcmncmocmocmocmocmpcmqcmrcmscmtcfxcmucmvcmwcfxcmxcmycmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCbZUcmDasJasJasJaoGasJazocfKcmEcmFcmGclAcqrcqJcqIclAabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchnchocjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngckUcnicdTcjxcrjclEcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmocnvcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCbZUcnOasIcnPcnQaoGcnRcnScfKcnTcnUcnVctucnXcnWcNmctuabqbGLcnYbzLcnYbGLcnYbzLcnYbGLcnZbzLcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbbZUbZUbZUbZUbZUaoGaoGaoGcfKcfKcfKclFctucpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcjQcnsckVcrWcmocqdcqecqfcqgcqhcqiclGcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqEcqFcqGcqHaoGcsoctuctucsRctuctuabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacmicqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrocnhcrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccnkcqjcqjcmBcsfcmBcsgcshcsicsjbZUcskasJasJasJcdKcslbZUcsmcynctucyqctucspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaackraaaaaaabqaaacksckscktckubZUckvckwckxbZUbZUbZUckyckzchyckAckBbZUbZUbZUckCckDbZUckEckEckEckEckEckEckEckFcjtckGckHckIcjxckJckKckLckMckNckOckPckQckRckSckTcfscgwckVcgybVickWckXckYckZclaclbclccldclecfxclfclgclhcfxclicljcljcljclkcljcllclmclncljcljclocljcljcljcljclpclqclrboccdocltcluclvclwbVKcfKclxclyclzclAclBclCclDbCMbCMbCMcgnbzLchRbzLcgnbzLchRchRcijbzLcijbCMbCMbCMabqabqabqclHcjaaWCabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeabqclIabqabqabqaaaabqabqbZUcbtclJclKbZUbZUbZUclLbZUbZUbZUbZUbZUbZUbZUclMclNcjlclOclPckEclQclRclSclTclUckEclVclWclXclYclZcjxcmacmbcmccmdcmecmfcmgcmhcjQcmjcjQcmkcmlckVcmmcmncmocmocmocmocmpcmqcmrcmscmtcfxcmucmvcmwcfxcmxcmycmzcmzcmzcmzcmAcmzcmBcmBcmBcmBcmBcmBcmBcmBcmBcmCaoGaucasJasJasJaoGasJazocfKcmEcmFcmGclAcqrcqJcqIclAabqabqcmKabqcmLabqcmKabqcmMcmNcmOabqcmOabqabqabqabqaaaaaacmPcjacmQaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchnchocjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngckUcnicdTcjxcrjclEcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmocnvcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCaoGclsasIcnPcnQaoGcnRcnScfKcnTcnUcnVctucnXcnWcNmctuabqbGLcnYbzLcnYbGLcnYbzLcnYbGLcnZbzLcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbaoGaoGaoGaoGaoGaoGaoGaoGcfKcfKcfKclFctucpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcjQcnsckVcrWcmocqdcqecqfcqgcqhcqiclGcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqFcqEcqHcqGbZUcsoctuctucsRctuctuabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacmicqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricCKcrkcrlcrmcoeaovaotcrpcrncrocnhcrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccnkcqjcqjcmBcsfcmBcsgcshcsicsjbZUcskchychychycdKcslbZUcsmcynctucyqctucspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacmicsvcrccqZcswcpycsxbZUbZUcsycoecrscqXcrscsdcrscoecrscsCcrscoeckEcsecsEcszckEckEcsGcsHcsIcsJcsJcsAcsDcsBcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttdbjctvdbjarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacmictwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMcsFctOcgrctPcsJctQctRcABctTctUcsJccvcmgctVctWctXctYcjQctZcuacubcuccudcuecufcugcuhcuicujcsKculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcmiabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacmicmicqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRcsLcuTcuUcuVcuWcuXcuYcuZcgrcgscsAcvacvbcvccvdcvecsJchscmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcvLcvMcvNcvOcvPcvQcvRcvSbZUcvTcvUcvVcbvctqchychycvWcvXbZUcvYabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8668,22 +8655,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaabqaaaaaacTxabqdeycHZcHZcHZcHZcHZcHZcHZaaaaaacRhcTycTzcRhcTAcTBcTCcTDcRhcTEcTFcTGcTHcTIcTJcTKcTLcTLcTMcTNcTOcTPcTQcRtcSYcTRcTacRtcSocSpcSYcLScTTcRtcTUcTVbZUcTWbZUabqaaacNzcTYcNzaaaaaacOmcWkbZUcmDchychycUacjicUbcjicUccUdcQWcOycUfcOycQWaaaabqaaaabqabqaaaaaaabqaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqabqaaaaaaaaaabqabqabqaaaaaaaaaabqaaaaaaaaacRhcUgcUhcUicUjcUkcUlcUmcRhcUncRhcUocUpcUqcUrcUscTHcTHcUtcUucUvcUwcUxcUycSYcUzcTacRtcSocUAcUBcUCcUDcUEcUFcUGbZUcTjbZUabqabqcNzcUHcNzabqaaacOmcWlbZUchychychycUJcUKcctcULbZUcmicQWcOycWJcWmcWKcWKcWKcWKcWKcWKcWKcWKcWLarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaacRhcTycUNcRhcUOcUPcUQcURcUScUTcRhcUUcUVcUWcUXcUYcUZcVacSOcSWcTacRtcVccVdcVecVfcVgcUwcVhcVicVjcVkcVkcSVcTScVkbZUaefabqaaaaaacNzcVncNzaaaaaacOmcWkbZUcVocVpcVqbZUcVrcVscVqbZUaaaabqcOycOycOyabqaaaabqaaaaaaabqabqaaacWRarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcTXabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacOmcWkbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaacWSaaaabqabqabqabqabqabqaaaaaacWRarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacOmdafcWTcWTcWTcXlcXAcXocXHcXDcXHcXDcXHcYacWSaaaabqabqaaaaaaaaaabqaaaaaacWRaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSOcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcTXaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncOmcYccYccYccYccZvcYycYxcYGcYzcZfcYIcZicZhcWScWScWScWScWScWScWScWScWScWScZjaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncWMcVRcWNcWOcUXcWPcWQcZlcZkcZmcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcYccZvcYycZncZocYzcYIcYzcZpcXDaaaabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcXrcXscXtcVGcXucXvcVGcVGcXwdeQcXycXzcVGcYccZvcYycYxcYIcYbcYdcYdcYecXZcZFcZFabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcXRcXScXTcXUcXVcXVcXWcXXcXYcNzcYccZvcYycZScXHcXCcZycXCcXBcZzcZFcZFabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaabqaaacTXcXpcTXcZUcZTabqabqaaacNzdeBcYpcYqcYrcYrcYscYtcYucYucYucYucYvcYwcNzcYccZvcYycOmcHfcZVdagdaecZFcZFcZFcZFabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaidcbcYFdcbdajcYFcYFcYFdaidakcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmdaxdaycZVcZFcZFcZFcZFabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLciccWkdaMdaOdaNdaPdaecZFcZFcZFcZFabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqdaVdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcVbcZJcZKcZLcZMcZNcVlcZPcZPcZPcVGcYcdbudbFdbvcfwcfwcOmcfwdbGdbGaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcZXcZYcZZdaadabdacdadcZPcZPcZPcVGcOmcfwcOmcOmcfwdbGdbGdbGdbGdbGaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddaZcZedcedddcZBcZBdcFcZBcZBcYFdclcYFdcmcYFcZBcYFdcmcYFdclcYFcZBcZBcZBcYFaaacVGdancZPcZPcVmdapdaqdardasdatcVEcZHcZHdavcVGaaadbGdbGdbGdbGdbGdbGdbGdbGdbGaaaaaaabqabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdbaddmddacZBcZBdcocZBcZBdaCdcpdaCdaCdaCcZBdaCdaCdaCdcpdaCcZBcZBdcqdaiaaacVGcZrcZrcZrcZrdaFdaGdaHdaIdaFcZrcZrcZrcZrcVGaaadbGdbGdbGdbGdbGdbGdbGdbGdbGaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBabqcZAcZAcZAcZAcZAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaVdaZcZedcrcZBddccZBcZedcJcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcYFaaacVGcZGcZHcZHcVKcZJdaRdaHdaSdaTcYncZPcZPdancVGaaadbGdbGdbGdbGaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaabqaaacYBaaaabqaaaabqabqabqabqaupaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcTXabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacOmcWkbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaaaaaaaaabqabqabqabqabqabqaaaaaacWRarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacOmdafcWTcWTcWTcXlcXAcWScXBcXCcXBcXCcXBcXoaaaaaaabqabqaaaaaaaaaabqaaaaaacWRaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSOcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcTXaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncOmcYccYccYccYccZvcYycXZcXDcYbcXHcYdcYecXZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZjaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacTZcWncWMcVRcWNcWOcUXcWPcWQcZlcZkcZmcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcYccZvcYycYacYxcYbcYdcYbcYzcXCaaaabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacTZcXjcVMcVRcWNcWNcXkcSOcSOcSOcSOcZwcWzcXmcUXcXncUXcXmcZxcZCcSOcXpcTXcXpcTXcTXcTXcTXcTXcXpcTXcXpcTXaaaabqabqcVGcXqcXrcXscXtcVGcXucXvcVGcVGcXwdeQcXycXzcVGcYccZvcYycXZcYdcYbcYdcYdcYecXZaaaaaaabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcSOcSOcXEcUXcUXcUXcXFcXGcSOcZQcVacXIcXJcXJcXKcXJcXJcXLcZRcVkcXMcTXcXacTXaaaaaaaaacTXcXNcTXcXacTXaaaabqaaacNzcXOcXPcXQcXRcXRcXScXTcXUcXVcXVcXWcXXcXYcNzcYccZvcYycYGcXBcXCcZycXCcXBcZzaaaaaaabqaaaabqaaaabqaaaaaaaaacYfaaaaaaabqaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacTZcYgcYhcYicYjcYkcXKcYlcYmcSOcSOcSOcSOcUecUecUecUecUecSOcSOcVkcXpcTXcXpcTXaaaabqaaacTXcXpcTXcZUcZTabqabqaaacNzdeBcYpcYqcYrcYrcYscYtcYucYucYucYucYvcYwcNzcYccZvcYycOmcOmcOmcYIcfwaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcSOcTZcSOcSOcTZcTZcTZcSOcYCcSOaaaaaacYDcYFcYFcYFcYFdahdaXcYFdaidcbcYFdcbdajcYFcYFcYFdaidakcYFdcbdalcYEcYJaaacVGcYKcYLcYMcYNcYOcYPcYQcYRdgXdgWcYUcYVcYWcVGcYcciccWkdawcOmcZfcZhcOmaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcZacZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaaaaaaaaaaabqabqdazdbadaAdcTdcPdaBcZedcncZBdaCcZBdaDcZBdaCdaCdaDdaCdaEcZBdaCcZBcZBdaKdaJaaacVGcZrcZrcZrcZrcTkcZscZtcZucTkcZrcZrcZrcZrcVGdaLciccWkdaMdaOcZicZncfwaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBaaacZAcZAcZAcZAcZAabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqabqdaVdaZcZedbkcZBddadbqdbhcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZgcYFaaacVGcZGcZHcZHcVbcZJcZKcZLcZMcZNcVlcZPcZPcZPcVGcYcdbudbFdbvcfwcfwcOmcfwaaaaaaaaaaaaabqaaaabqaaaabqabqabqaaacYBaaaabqaaaabqaaaabqaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZedbPddccZBcZBdaJcZBcZBdbQdbYdbQdbQdbQcZBdbQdbQdbQdbYdbQcZBcZBdccdaiabqcVGcZPcZPcZPcZXcZYcZZdaadabdacdadcZPcZPcZPcVGcOmcfwcOmcOmcfwaaaaaaaaaaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqcYBabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddaZcZedcedddcZBcZBdcFcZBcZBcYFdclcYFdcmcYFcZBcYFdcmcYFdclcYFcZBcZBcZBcYFaaacVGaOEcZPcZPcVmdapdaqdardasdatcVEcZHcZHdavcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdbaddmddacZBcZBdcocZBcZBdaCdcpdaCdaCdaCcZBdaCdaCdaCdcpdaCcZBcZBdcqdaiaaacVGcZrcZrcZrcZrdaFdaGdaHdaIdaFcZrcZrcZrcZrcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBabqcZAcZAcZAcZAcZAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaVdaZcZedcrcZBddccZBcZedcJcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcZBcYFaaacVGcZGcZHcZHcVKcZJdaRdaHdaSdaTcYncZPcZPaOEcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaabqaaacYBaaaabqaaaabqabqabqabqaupaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddbOcZedcMdcKdcNcZBcZedcncZBdbQdbQdcQdbQdbQcZBdbQdbQdbYdbQdbQcZBcZBdcRdcoaaacVGcZPcZPcZPdbbdbccZZdbddabdbedbfcZPcZPcZPcVGaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqdbgabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdcGdcScYEdaXddedaWcYEdcUcYFdalcYHdaXcYFdaYcYFdcVdaXcYFdcmdcWdcWdaldbaabqcVGdancZPcZPcZIdbmdaqdbndbodatcZOcZHcZHdavcVGaaaaaaabqaaaaaaabqaaaaaaaaaaaaaaaaaaarBabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadalcYEdcGdcScYEdaXddedaWcYEdcUcYFdalcYHdaXcYFdaYcYFdcVdaXcYFdcmdcWdcWdaldbaabqcVGaOEcZPcZPcZIdbmdaqdbndbodatcZOcZHcZHdavcVGaaaaaaabqaaaaaaabqaaaaaaaaaaaaaaaaaaarBabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaVdaZcZeddbcZEddgddfcZeddiddfddjddjcZeddnddlcZBddodaJddpddwddqcZDcZDddDdaJcVGcVGcZrcZrcZrcZrdaFdbrdaHdbsdaFcZrcZrcZrcZrcVGcVGaaaabqabqabqabqaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaadbtaaacZAcZAcZAcZAcZAaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbNdbOcZeddbcZEdalddEddFddiddfddfddGcZedbwcZBcZBdbicYFddHcZEcZEcZEcZEcZDcYFcVGcZGcZHcZHdaocZJdbzdbAdaHdaScZMdbBdaudbDcZPcZPcVGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaabqabqabqaaaaaacVJabqaaaaaaabqabqaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcddaZcZeddIcZEcZEddTdbhddYddfddfdevcZedeKcZBcZBcZBdaYdeTcZEcZEcZEcZEcZDcYFcVGcZPcZPcZPdbHdbIdabdabdbJdabdabdbKdbLdbMcZPcZPcVGaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacVJaaaaaaaaaarBarBarBauparBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 9a718efd052..ba174a3771b 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -462,7 +462,7 @@
"aiT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/rack,/obj/item/ammo_box/shotgun/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/beanbag,/obj/item/ammo_box/shotgun/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/beanbag{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/beanbag,/obj/item/ammo_box/shotgun/beanbag,/obj/item/ammo_box/shotgun/tranquilizer{pixel_x = 3; pixel_y = -3},/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aiU" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 3; pixel_y = -3},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aiV" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/ammo_box/shotgun/buck{pixel_x = -3; pixel_y = 3},/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
-"aiW" = (/turf/space,/area/security/securearmoury)
+"aiW" = (/obj/item/toy/prize/honk,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aiX" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aiY" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aiZ" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
@@ -2029,7 +2029,7 @@
"aNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aNb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aNc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
-"aNd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/camera{c_tag = "Fitness Rooms North"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aNd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/camera{c_tag = "Fitness Rooms North"; dir = 2; network = list("SS13")},/obj/machinery/computer/mob_battle_terminal/red,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
"aNe" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "bar_maint"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNf" = (/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/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -2068,7 +2068,7 @@
"aNN" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aNO" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aNP" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aNQ" = (/obj/item/toy/prize/honk,/turf/simulated/floor/plating,/area/space)
+"aNQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aNR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Mime's Office"; dir = 1; network = list("SS13")},/obj/structure/closet/secure_closet/mime,/turf/simulated/floor/wood,/area/mimeoffice)
"aNS" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/spray/waterflower,/turf/simulated/floor/wood,/area/mimeoffice)
"aNT" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice)
@@ -2246,7 +2246,7 @@
"aRj" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aRk" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aRl" = (/obj/structure/table/glass,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aRm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aRm" = (/obj/structure/cable{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/plating,/area/maintenance/fpmaint2)
"aRn" = (/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/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aRo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/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/plating,/area/maintenance/fpmaint)
"aRp" = (/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/plating,/area/maintenance/fpmaint)
@@ -2305,7 +2305,7 @@
"aSq" = (/obj/structure/table/glass,/obj/item/weapon/hemostat,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aSr" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aSs" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"aSt" = (/obj/structure/cable{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/plating,/area/maintenance/fpmaint)
+"aSt" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2)
"aSu" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint)
"aSv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aSw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -2342,7 +2342,7 @@
"aTb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aTc" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aTd" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/fitness)
-"aTe" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
+"aTe" = (/obj/machinery/computer/mob_battle_terminal/blue,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
"aTf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aTg" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aTh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -2359,7 +2359,7 @@
"aTs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
"aTt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
"aTu" = (/turf/simulated/wall,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aTv" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aTv" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aTw" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
"aTx" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/gateway)
"aTy" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
@@ -2416,10 +2416,10 @@
"aUx" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUy" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUz" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
-"aUA" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aUB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aUC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"aUD" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aUA" = (/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/plating,/area/maintenance/fpmaint2)
+"aUB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aUC" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aUD" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{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/plating,/area/maintenance/fpmaint2)
"aUE" = (/turf/simulated/wall/r_wall,/area/security/nuke_storage)
"aUF" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/gateway)
"aUG" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/gateway)
@@ -2449,7 +2449,7 @@
"aVe" = (/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aVf" = (/obj/structure/table/glass,/obj/item/seeds/appleseed,/obj/item/seeds/bananaseed,/obj/item/seeds/cocoapodseed,/obj/item/seeds/grapeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/towermycelium,/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aVg" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/storage/primary)
-"aVh" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{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/plating,/area/maintenance/fpmaint)
+"aVh" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"aVi" = (/turf/simulated/wall,/area/storage/primary)
"aVj" = (/turf/simulated/wall/r_wall,/area/storage/primary)
"aVk" = (/obj/structure/closet/secure_closet/freezer/money,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
@@ -2487,8 +2487,8 @@
"aVQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/window/basic{dir = 4},/obj/structure/window/basic,/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fsmaint2)
"aVR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint1"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aVS" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint1"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aVT" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
-"aVU" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
+"aVT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"aVU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"aVV" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/arrival/station)
"aVW" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
"aVX" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
@@ -2557,11 +2557,11 @@
"aXi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aXj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aXk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aXl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
-"aXm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
-"aXn" = (/obj/machinery/mass_driver{dir = 4; id_tag = "chapelgun"},/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fsmaint2)
-"aXo" = (/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/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/fsmaint2)
-"aXp" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aXl" = (/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/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/chapel/main)
+"aXm" = (/obj/machinery/mass_driver{dir = 4; id_tag = "chapelgun"},/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/chapel/main)
+"aXn" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/chapel/main)
+"aXo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/chapel/main)
+"aXp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"aXq" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/arrival/station)
"aXr" = (/obj/effect/landmark{name = "HONKsquad"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aXs" = (/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
@@ -2637,7 +2637,7 @@
"aYK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/chapel/office)
"aYL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/chapel/office)
"aYM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/driver_button{id_tag = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"aYN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/maintenance/fsmaint2)
+"aYN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"aYO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/chapel/main)
"aYP" = (/turf/simulated/wall,/area/chapel/main)
"aYQ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/chapel/main)
@@ -3376,7 +3376,7 @@
"bmV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bmW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bmX" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"bmY" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"bmY" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"bmZ" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bna" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"bnb" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape)
@@ -4231,9 +4231,9 @@
"bDs" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
"bDt" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bDu" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bDv" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape)
+"bDv" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"bDw" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"bDx" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"bDx" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bDy" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bDz" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"bDA" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
@@ -4368,7 +4368,7 @@
"bFZ" = (/obj/machinery/light{dir = 1},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"bGa" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception)
"bGb" = (/obj/machinery/camera{c_tag = "Medbay Lobby East"; network = list("SS13")},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bGc" = (/obj/structure/stool,/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bGc" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table,/obj/machinery/computer/mob_healer_terminal,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"bGd" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/alarm{pixel_y = 26},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/reception)
"bGe" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
"bGf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
@@ -6998,7 +6998,7 @@
"cED" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/biostorage)
"cEE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/biostorage)
"cEF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/biostorage)
-"cEG" = (/obj/structure/lattice,/turf/space,/area/maintenance/asmaint)
+"cEG" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cEH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cEI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cEJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
@@ -7050,7 +7050,7 @@
"cFD" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyb"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_b)
"cFE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cFF" = (/turf/simulated/wall/r_wall,/area/medical/patients_rooms)
-"cFG" = (/turf/space,/area/maintenance/asmaint)
+"cFG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cFH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cFI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cFJ" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/effect/decal/warning_stripes/southwestcorner,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
@@ -8517,7 +8517,7 @@
"dhO" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dhP" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"dhQ" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"dhR" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dhR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2)
"dhS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dhT" = (/obj/machinery/door/airlock/maintenance,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dhU" = (/obj/structure/rack,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -8544,7 +8544,7 @@
"dip" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine)
"diq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/maintenance/asmaint)
"dir" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint)
-"dis" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"dis" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dit" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"diu" = (/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"div" = (/obj/structure/stool/bed/chair,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -8926,7 +8926,7 @@
"dpH" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "AI Satellite Antechamber South"; dir = 4},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Atmospherics"; name = "AI Satellite Atmospherics Turret Control"; pixel_x = -28; pixel_y = 0; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
"dpI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/aisat_interior)
"dpJ" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/turretid/stun{control_area = "\improper AI Satellite Service"; name = "AI Satellite Service Bay Turret Control"; pixel_x = 24; pixel_y = 0; req_access_txt = "75"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior)
-"dpK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
+"dpK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/computer/cryopod/robot{pixel_x = -30; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dpL" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dpM" = (/obj/effect/decal/warning_stripes/northeast,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dpN" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/obj/item/device/multitool,/obj/machinery/camera{c_tag = "AI Satellite Service Bay"; dir = 8; network = list("SS13","MiniSat")},/turf/simulated/floor/plating,/area/aisat/maintenance{name = "\improper AI Satellite Service"})
@@ -8955,13 +8955,12 @@
"dqk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dql" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"})
"dqm" = (/turf/simulated/wall/r_wall,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqn" = (/turf/simulated/wall,/area/aisat)
+"dqn" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqo" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqp" = (/turf/simulated/wall,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Hallway"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
"dqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqs" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"dqt" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/aisat)
"dqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqv" = (/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
@@ -8970,11 +8969,8 @@
"dqz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqA" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqB" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/starboard)
-"dqC" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/aisat)
"dqD" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqE" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior West"; dir = 8; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
-"dqF" = (/turf/simulated/wall/r_wall,/area/aisat)
-"dqG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/aisat)
"dqH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/porta_turret{dir = 4; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"dqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
"dqJ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
@@ -8997,7 +8993,6 @@
"dra" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"drb" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"drc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
-"drd" = (/turf/simulated/floor/plating,/area/aisat)
"dre" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom/locked/ai_private{broadcasting = 1; listening = 0; pixel_x = -29; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
"drf" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"drg" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
@@ -9055,10 +9050,9 @@
"dsg" = (/obj/item/flag/nt,/obj/effect/decal/warning_stripes/east,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"dsh" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"dsi" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
-"dsj" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"dsj" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"dsk" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"dsl" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
-"dsm" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/space,/area/shuttle/escape)
"dsn" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"dso" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"dsp" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
@@ -9133,7 +9127,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTahyahyahyabTaaaacqahNahOahPacsaaaabTahyahyahyabTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQahRahSahTahUahVahWabNahXaaaaaaaaaaaaaaaaaaaabaabaabahYafXafXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZahIagZagZagZagZagZagZagZahZagZagZagZagZagZagZagZahIagZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqahNahOahPacsaaaaaaaaaaaaaaaaaaaaaacqahNahOahPacsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQaiaaibaicaidaieaifaigabNabNabNabNabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaihaihaihaiiaijaihaihaihaikaikaikaikaikaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahoahIailailailailailailagwaimagwailailailailailailahIahraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQainaioaipaiqairaisaitabNaiuaivaivaivaivaivaaaaaaaaaaaaaaaaaaaaaaaaaihaiwaixaiyaizaiAaiBaihafXafXafXafXafXaikaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCaiDaiEaiFaiGaiHagwahZagZahZagZahZagwaiIaiJaiKaiLaiDaiMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQaiNaiOaiPaiQaiRaiSaitabNaivaivaiTaiUaiVaivaivaiWaaaaaaaaaaaaaaaaaaaihaiXaiYaiZaiYaiYajaaihajbajbajbajbajbajbafXajcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaiDahaahaahaajdagwahaahaahaahaahaagwahaahaajeahaaiDahMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQaiNaiOaiPaiQaiRaiSaitabNaivaivaiTaiUaiVaivaivaaaaaaaaaaaaaaaaaaaaaaihaiXaiYaiZaiYaiYajaaihajbajbajbajbajbajbafXajcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaiDahaahaahaajdagwahaahaahaahaahaagwahaahaajeahaaiDahMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQajfajgaivaivajhajiajjajkajlaivaivaaaaaaaaaaaaaaaaaaaihajmajnajoajpajqajraihajsajtajuajvajwajxajyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajzajAajBajCajDagwajEahaahaahaajFagwajGahaajHajIajzagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaababNajJajKaivajLajMajNajOajPajQajRaivaaaaaaaaaaaaaaaaaaaihajSajTajUajVaiYajWaihajXajwajwajwajwajxajyaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaababNahRaigaivakbakcakdajOakeakfakgaivaaaaaaaaaaaaaaaakhaihakiakjakkaklaiYakmaihaknajwakoajwajwajxajyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9170,27 +9164,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaIIaIJaIIaaaaaaaabaGnaIKaILaHSaHSaIMaHSaGnaIIaIIaGjaGjaINaIOaIaaHSaGnaGnaIIaIIaIIaGnaGnaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaIbaIPaIQaIRaISaITaIgaIUaIVaIWaIjaIXaIlaIYaIZaJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaFFaFHaJnaJoaJpaJqaJraJqaJqaJqaJsaJqaJqaJqaJqaJtaJuaJvaJwaJxaJyaJzaJAaJBaJCaJDaDPaabaJEaJFaJFaJFaJFaJFaJGaabaabaaaaaaaaaaaaaHNaJHaHNaaaaIFaGTaGTaJIaJJaGTaJKaGYaGYaGYaHaaJLaGYaJMaGXaGYaGYaGYaJNaHaaGYaGXaJOaJPaGXaGYaJQaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJRaJSaJTaaaaJUaJVaJWaabaabaIIaHSaIIaaaaaaaabaGnaJXaJYaJZaKaaKbaKcaGnaKdaHSaKeaKfaKgaKhaKhaKhaKhaKhaKhaKhaKhaKiaGnaaaaKjaaaaaaaaaaaaaaaaaaaaaaaaaIbaKkaKlaKmaKnaKoaKpaKqaKraKsaIjaIXaIlaKtaKuaKvaJbaJcaKwaKxaKxaKxaKxaKxaJjaKyaJlaFzaFFaFHaEjaKzaKAaKBaKCaKBaKBaKDaKEaKFaKFaKFaKFaKFaKFaKGaKHaKIaKJaKKaKLaKMaKNaDPaDPaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaaaaaaaaaaaaaHNaKRaKSaaaaIFaKTaKUaKVaKWaGYaGYaGYaHaaGYaHaaKXaGYaGYaGXaGYaKYaKZaKXaIHaGYaGXaLaaLbaGXaGYaLcaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLeaLfaLeaLdaLgaLhaLgaLdaabaIIaLiaLjaaaaaaaGnaGnaGnaGnaGnaLkaLlaLmaLnaLoaLpaLpaLqaLraLraLsaLtaGnaHSaGnaGnaGnaLuaGnaaaaabaaaaaaaaaaaaaaaaaaaabaabaIbaLvaLwaLxaLyaLzaLAaLBaLCaKsaIjaIXaIlaLDaLEaLFaJbaLGaLHaKxaLIaKxaLJaLJaJjaKxaJlaFzaFFaLKaEjaLLaKAaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLZaMaaMbaMcaMdaMeaMfaMgaMhaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaabaabaabaHNaHNaMiaMjaHNaIFaMkaGYaMlaGYaHbaGYaGXaGXaMmaGXaGXaMnaHaaHaaKXaMoaMpaGYaGXaGYaMqaMqaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraacaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaMwaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaIcaLAaMBaMCaMDaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaMTaLNaLOaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNqaNraNsaMsaNtaNuaNvaNwaNxaHSaNyaNzaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLuaGnaNCafOaNDaGnaNEaNFaNGaHSaNBaGnaNAaNHaKhaKiaNIaaaaaaaaaaaaaaaaNJaNKaNLaNMaNNaNOaNPaMAaNQaLAaNRaNSaNTaLAaNUaIlaNVaNWaNXaNYaJcaNZaKxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaOnaLNaLOaLPaOoaMVaOpaOpaOpaMVaMVaOqaOraOraOsaMWaOtaOuaOvaOvaOwaOxaOyaOzaKQaKQaKQaKQaKQaOAaOBaOCaODaaaaaaaHNaGYaGYaOEaGYaHaaOFaGYaOGaOHaOHaOHaOHaOIaOHaOJaGYaGYaGYaGYaGYaGYaGYaGYaHaaGZaMqaOKaOLaOLaMqaOMaONaOOaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaMwaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaMBaMCaMDaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaMTaLNaLOaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNqaNraNsaMsaNtaNuaNvaNwaNxaHSaNyaNzaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLuaGnaNCafOaNDaGnaNEaNFaNGaHSaNBaGnaNAaNHaKhaKiaNIaaaaaaaaaaaaaaaaNJaNKaNLaNMaNNaNOaNPaMAaiWaLAaNRaNSaNTaLAaNUaIlaNVaNWaNXaNYaJcaNZaKxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaOnaLNaLOaLPaOoaMVaOpaOpaOpaMVaMVaOqaOraOraOsaMWaOtaOuaOvaOvaOwaOxaOyaOzaKQaKQaKQaKQaKQaOAaOBaOCaODaaaaaaaHNaGYaGYaOEaGYaHaaOFaGYaOGaOHaOHaOHaOHaOIaOHaOJaGYaGYaGYaGYaGYaGYaGYaGYaHaaGZaMqaOKaOLaOLaMqaOMaONaOOaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaOPaOQaORaMsaOPaOQaORaNwaKcaHSaOSaHSaHSaHSaHSaHSaGnaOTaOUaOVaOWaOXaGnaLuaGnafOaOYaNCaOZaPaaPbaGnaPcaGnaGnaGnaGnaPcaLuaNIaaaaHQaHQaHQaHQaPdaNKaPeaPfaPgaPhaPiaPjaMAaLAaPkaPlaPlaPlaPmaPnaPoaPnaPnaPnaPpaPqaPraPsaPtaPtaPtaPtaPuaPvaPwaFFaPxaEjaAPaPyaPzaLNaLOaLPaMUaOpaPAaPAaPBaOpaMVaPCaPDaPDaPEaPFaOtaPGaPHaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaPLaPMaODaabaabaGXaGYaGYaHaaHaaHaaHPaHPaGXaGXaGXaHaaHaaHaaGXaPNaPOaGXaHaaHaaGXaHaaHaaGXaGXaPPaPQaPRaPSaPTaPUaPVaOKaPWaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaPYaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaQcaHSaHSaGnaLuaGnaQdaabaQdaGnaJYaPbaGnaQeaQfaGnaNAaKcaGnaIXaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQpaQqaQraQsaQtaQuaQpaQpaQvaQvaQwaQxaQyaQzaQAaQBaPyaQCaQDaQDaLPaMUaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOtaPGaPIaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQJaHaaQKaHOaQLaQMaHbaGXaOFaHbaGXaQNaGYaGXaQOaGYaGXaQPaQQaQRaOHaQSaOHaQTaQUaQVaQWaQXaQYaQZaMqaMraMraacaacaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaRbaOQaRbaRcaRcaRcaRdaRcaRcaRcaReaRfaRgaRgaRgaRgaRhaGnaHSaGnaRiaRjaRkaHSaRlaPcaLuaGnaGnaGnaGnaGnaGnaPcaGnaHSaRkaLkaHSaHSaPiaRmaRnaRoaRpaRpaRpaRpaRqaRpaRpaRraRsaRoaRtaRuaRuaRuaRuaRuaRuaRuaRvaRwaRwaRwaRwaRxaRyaRwaRzaRwaRAaRxaRwaRwaRwaRwaRBaRCaRDaREaRFaOmaRGaRHaQDaRIaMUaOpaRJaRKaRLaOpaMVaRMaRNaRNaROaMWaOtaRPaRQaRQaRRaMVaRSaRTaKQaKQaKQaKQaKQaRUaRVaRWaODaaaaaaaGXaGYaGYaGYaGYaGYaGYaQRaOHaOHaOHaOHaOHaOHaOHaKVaGYaGYaGYaGYaMnaGYaGYaMlaGYaRXaRYaRZaSaaSbaOLaOLaOLaScaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaPYaSdaSeaSfaSgaShaSiaSjaSkaSlaSjaSmaSnaSjaSjaSoaGnaHSaGnaSpaHSaHSaSqaSraGnaNHaKiaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaMAaStaMAaSuaSvaSwaSwaSwaSxaSwaSwaSwaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSDaSEaSFaSGaSHaSIaSJaSKaSLaSCaSMaRwaSNaFFaSOaEjaSPaPyaSQaSRaSRaSSaSTaSUaSVaSWaSWaSXaSYaSZaSXaSYaSYaTaaTbaTcaMVaMVaTdaMVaTeaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaHaaHaaIHaGXaGXaMlaHaaGXaTgaHaaGXaIHaGXaMlaQIaHaaGXaIHaGXaGYaQIaMlaGYaThaMqaTiaQUaTjaTkaTlaQUaTmaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaTnaSdaToaSfaSfaTpaSdaTnaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIkaTuaTuaTuaTuaTuaPiaMAaMAaMAaMAaMAaMAaMAaStaTvaSuaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTxaTyaTzaTAaSAaPiaRwaTBaTBaTCaTDaTEaTFaTGaTFaTHaTIaTJaTBaTBaRwaSNaFFaTKaEjaSPaPyaPzaLNaLOaLPaMUaTLaTMaTNaTOaTPaTPaTQaTRaTPaTRaTSaTTaTUaTVaTWaTXaTYaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTZaUaaHaaGXaHaaLcaGYaGXaLcaMlaGXaUbaGYaGXaUcaGYaHaaUdaUeaGXaUfaGYaHaaIHaIHaMlaIHaUgaMqaUhaQUaUiaUjaUiaQUaUkaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaUlaLdaUmaOQaSdaUnaUoaUpaUqaSdaOQaUraPYaLdaUsaUtaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUwaUxaUyaUzaUuaTuaUAaUBaRpaRpaRpaRpaRpaRpaUCaUDaSuaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUGaUHaUIaUFaSAaPiaRwaUJaUJaUJaUKaULaSCaUMaSCaULaUNaUJaUJaUJaRwaSNaFFaUOaEjaSPaPyaOnaLNaLOaLPaOoaUPaUQaUQaUQaUQaUQaUQaUQaURaUQaUSaUSaUSaUSaUSaUTaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaUUaUaaHaaUVaGXaGYaGYaGXaGYaMlaHaaGYaGYaGXaGYaGYaHaaMlaGZaGXaGYaGYaHaaUWaGYaMlaGYaUXaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaTnaSdaSdaSdaSdaSdaSdaTnaPYaUZaLdaVaaVbaVcaVcaVcaVcaVcaVcaVdaTuaUuaVeaUwaVfaVeaVeaUuaTuaVgaVhaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVlaVmaVnaVoaUEaaaaSuaSzaSAaVpaVqaVraVsaUFaSAaPiaRwaVtaVtaTCaVuaVvaTFaTGaTFaVvaVwaVxaTBaTBaRwaSNaFFaSOaEjaVyaKAaVzaLNaLOaLPaMUaUPaUQaVAaVBaVCaVCaUQaVDaVEaVFaUSaVGaVHaVIaUSaVJaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVOaHaaHaaGXaGXaHaaHaaVPaVQaHaaGXaHPaGXaGXaHaaHaaVRaVSaGXaGXaGXaQLaUWaGYaMlaGYaUXaHOaHbaOFaGXaVTaVUaVTaGXaGXaGXaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVWaVXaVWaVWaVYaVZaVWaVWaVXaWaaWbaLdaToaWcaVcaWdaWeaWfaWgaWhaWiaTuaUuaVeaUwaWjaVeaVeaUuaTuaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaVjaabaUEaWuaWvaWwaWxaWyaUEaabaSuaSzaSAaWzaWAaWBaWCaWDaSAaPiaRwaSBaSCaWEaWFaULaSCaWGaSCaULaWHaWIaSCaSMaRwaSNaFFaWJaEjaSPaMSaMTaLNaLOaLPaWKaWLaUQaWMaVEaVEaVEaWNaWOaWPaWQaUSaWRaWSaWTaWUaWVaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWWaWXaWYaWZaXaaGXaNgaGYaQIaMlaGYaGXaaaaGXaGYaGYaGYaGYaMlaXbaXcaXdaXdaXdaXdaXeaXfaXgaXhaXiaXjaXiaXkaXlaXlaXmaXnaXoaXpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVWaXqaXraXsaXtaXuaXvaXwaXxaXyaXzaXAaXBaSdaToaXCaVcaXDaXEaXFaXGaXFaXHaTuaXIaVeaXJaXKaXLaXKaXMaXNaXOaXPaXQaXQaXQaXQaXQaXQaXRaXSaVjaaaaUEaXTaWvaXUaWxaXVaUEaaaaSuaSzaSAaXWaXXaXYaXZaYaaSAaPiaRwaYbaYbaTCaYcaVvaTFaYdaTFaVvaYeaTJaYfaYfaRwaYgaIraYhaEjaSPaMSaYiaYiaYiaYiaYjaYkaYlaYmaYnaYoaYoaYoaYpaYoaYqaYraYsaYtaYuaYraYvaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYxaGXaGXaGXaGXaGYaMlaWWaHNaabaHNaGYaYyaYzaYAaYBaYCaYDaYEaYEaYEaYEaYFaYGaYHaYIaYJaYKaYJaYLaYJaYJaYMaYNaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYTaYUaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPXaPYaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaQcaHSaHSaGnaLuaGnaQdaabaQdaGnaJYaPbaGnaQeaQfaGnaNAaKcaGnaLuaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQpaQqaQraQsaQtaQuaQpaQpaQvaQvaQwaQxaQyaQzaQAaQBaPyaQCaQDaQDaLPaMUaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOtaPGaPIaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQJaHaaQKaHOaQLaQMaHbaGXaOFaHbaGXaQNaGYaGXaQOaGYaGXaQPaQQaQRaOHaQSaOHaQTaQUaQVaQWaQXaQYaQZaMqaMraMraacaacaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaaRbaOQaRbaRcaRcaRcaRdaRcaRcaRcaReaRfaRgaRgaRgaRgaRhaGnaHSaGnaRiaRjaRkaHSaRlaPcaLuaGnaGnaGnaGnaGnaGnaPcaGnaHSaRkaLkaHSaHSaHSaNQaRnaRoaRpaRpaRpaRpaRqaRpaRpaRraRsaRoaRtaRuaRuaRuaRuaRuaRuaRuaRvaRwaRwaRwaRwaRxaRyaRwaRzaRwaRAaRxaRwaRwaRwaRwaRBaRCaRDaREaRFaOmaRGaRHaQDaRIaMUaOpaRJaRKaRLaOpaMVaRMaRNaRNaROaMWaOtaRPaRQaRQaRRaMVaRSaRTaKQaKQaKQaKQaKQaRUaRVaRWaODaaaaaaaGXaGYaGYaGYaGYaGYaGYaQRaOHaOHaOHaOHaOHaOHaOHaKVaGYaGYaGYaGYaMnaGYaGYaMlaGYaRXaRYaRZaSaaSbaOLaOLaOLaScaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaPYaSdaSeaSfaSgaShaSiaSjaSkaSlaSjaSmaSnaSjaSjaSoaGnaHSaGnaSpaHSaHSaSqaSraGnaNHaKiaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaRmaMAaSuaSvaSwaSwaSwaSxaSwaSwaSwaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSDaSEaSFaSGaSHaSIaSJaSKaSLaSCaSMaRwaSNaFFaSOaEjaSPaPyaSQaSRaSRaSSaSTaSUaSVaSWaSWaSXaSYaSZaSXaSYaSYaTaaTbaTcaMVaMVaTdaMVaTeaTfaKQaKQaKQaKQaKQaTfaKOaKOaKOaGXaGXaGXaHbaHaaHaaIHaGXaGXaMlaHaaGXaTgaHaaGXaIHaGXaMlaQIaHaaGXaIHaGXaGYaQIaMlaGYaThaMqaTiaQUaTjaTkaTlaQUaTmaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaTnaSdaToaSfaSfaTpaSdaTnaSdaTqaTraTsaTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIkaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaRmaKdaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTxaTyaTzaTAaSAaPiaRwaTBaTBaTCaTDaTEaTFaTGaTFaTHaTIaTJaTBaTBaRwaSNaFFaTKaEjaSPaPyaPzaLNaLOaLPaMUaTLaTMaTNaTOaTPaTPaTQaTRaTPaTRaTSaTTaTUaTVaTWaTXaTYaKOaTfaKQaKQaKQaKQaKQaTfaGXaLcaGYaTZaUaaHaaGXaHaaLcaGYaGXaLcaMlaGXaUbaGYaGXaUcaGYaHaaUdaUeaGXaUfaGYaHaaIHaIHaMlaIHaUgaMqaUhaQUaUiaUjaUiaQUaUkaMqaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaUlaLdaUmaOQaSdaUnaUoaUpaUqaSdaOQaUraPYaLdaUsaUtaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUwaUxaUyaUzaUuaTuaTvaUBaUAaUAaUAaUAaUAaUAaUCaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUGaUHaUIaUFaSAaPiaRwaUJaUJaUJaUKaULaSCaUMaSCaULaUNaUJaUJaUJaRwaSNaFFaUOaEjaSPaPyaOnaLNaLOaLPaOoaUPaUQaUQaUQaUQaUQaUQaUQaURaUQaUSaUSaUSaUSaUSaUTaGXaKOaTfaKQaKQaKQaKQaKQaTfaGXaGXaGYaUUaUaaHaaUVaGXaGYaGYaGXaGYaMlaHaaGYaGYaGXaGYaGYaHaaMlaGZaGXaGYaGYaHaaUWaGYaMlaGYaUXaUYaUYaMqaMqaMqaMqaMqaMqaMqaMraMraMraMraMraabaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYaTnaSdaSdaSdaSdaSdaSdaTnaPYaUZaLdaVaaVbaVcaVcaVcaVcaVcaVcaVdaTuaUuaVeaUwaVfaVeaVeaUuaTuaVgaUDaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVlaVmaVnaVoaUEaaaaSuaSzaSAaVpaVqaVraVsaUFaSAaPiaRwaVtaVtaTCaVuaVvaTFaTGaTFaVvaVwaVxaTBaTBaRwaSNaFFaSOaEjaVyaKAaVzaLNaLOaLPaMUaUPaUQaVAaVBaVCaVCaUQaVDaVEaVFaUSaVGaVHaVIaUSaVJaGXaaaaVKaVLaVLaVLaVLaVLaVMaaaaGXaGYaVNaVOaHaaHaaGXaGXaHaaHaaVPaVQaHaaGXaHPaGXaGXaHaaHaaVRaVSaGXaGXaGXaQLaUWaGYaMlaGYaUXaHOaHbaOFaYPbcDaVhbcDaYPaYPaYPaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVWaVXaVWaVWaVYaVZaVWaVWaVXaWaaWbaLdaToaWcaVcaWdaWeaWfaWgaWhaWiaTuaUuaVeaUwaWjaVeaVeaUuaTuaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaVjaabaUEaWuaWvaWwaWxaWyaUEaabaSuaSzaSAaWzaWAaWBaWCaWDaSAaPiaRwaSBaSCaWEaWFaULaSCaWGaSCaULaWHaWIaSCaSMaRwaSNaFFaWJaEjaSPaMSaMTaLNaLOaLPaWKaWLaUQaWMaVEaVEaVEaWNaWOaWPaWQaUSaWRaWSaWTaWUaWVaHPaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaWWaWXaWYaWZaXaaGXaNgaGYaQIaMlaGYaGXaaaaGXaGYaGYaGYaGYaMlaXbaXcaXdaXdaXdaXdaXeaXfaXgaXhaXiaXjaXiaXkaVTaVTaVUaXmaXlaXnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVWaXqaXraXsaXtaXuaXvaXwaXxaXyaXzaXAaXBaSdaToaXCaVcaXDaXEaXFaXGaXFaXHaTuaXIaVeaXJaXKaXLaXKaXMaXNaXOaXPaXQaXQaXQaXQaXQaXQaXRaXSaVjaaaaUEaXTaWvaXUaWxaXVaUEaaaaSuaSzaSAaXWaXXaXYaXZaYaaSAaPiaRwaYbaYbaTCaYcaVvaTFaYdaTFaVvaYeaTJaYfaYfaRwaYgaIraYhaEjaSPaMSaYiaYiaYiaYiaYjaYkaYlaYmaYnaYoaYoaYoaYpaYoaYqaYraYsaYtaYuaYraYvaYwaHPaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaGXaYxaGXaGXaGXaGXaGYaMlaWWaHNaabaHNaGYaYyaYzaYAaYBaYCaYDaYEaYEaYEaYEaYFaYGaYHaYIaYJaYKaYJaYLaYJaYJaYMaXoaYOaYPaYQaYRaYSaYSaYSaYSaYSaYSaYSaYSaYSafXajcaaaaaaaaaaaaaaaaaaaaaaYTaYUaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAaYWaYXaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaToaZcaVcaZdaZeaZfaZgaZhaZiaTuaZjaVeaZkaZlaZmaZnaZoaTuaZpaZqaXQaXQaXQaXQaXQaXQaXRaZraVjaabaUEaZsaZtaZuaZvaZwaUEaabaSuaSzaSAaZxaZyaZzaZAaZBaSAaPiaRwaUJaUJaUJaZCaULaSCaUMaSCaULaZDaUJaUJaUJaRwaZEaZFaZGaEjaVyaZHaZIaZIaZIaZJaZKaZLaZMaZNaZOaZMaZPaZQaZRaZMaZSaZTaZUaZVaZWaUSaZXaZYaZZbaabaaaZYbabbacbacbacbacbacbadbaebacbafbagbahbaibajbakbalbambanbaobanbapbaqaGYaGXbarbasbatbaubavbawbaxbaybazbaAbazbaBbaCbaDbaEbaFbaGbaHbaIbaJbaKbaLaYPbaMbaNbaObaPbaQbaRbaSbaTbaUbaVaaaaaaaaaaaaaaaaaaaaaaYTbaWbaXbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaZaaZbaSdaTobbbaVcaVcbbcbbdbbebbdaVcaTuaTuaTuaTubbfbbgbbhbbiaTubbjbbkbblaXQaXQbbmaXQbbnbbobbpaVjaaaaUEaUEbbqbbrbbqaUEaUEaaaaSuaSzaSAbbsbbtbbuaZAbbvaSAaPiaRwaSBaSCbbwaWFaULaSCaUMaSCaULaWHbbxaRwaRwaRwbbybbzbbAbbBbbCbbDatGatGbbEbbFbbGbbHaUQbbIaVEaUQbbJaUQbbKaUQbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbVbbWbbXbbVbbVbbYbbVbbSbbZbbSaXjbcabbSbcbbccbcdbcebcfbcgbchbcibcjbckbclaXibcmbcnbcobcpbcqbcrbcsbctbaybcubcvbazbcwbcxbcybczbaFbcAbcBbcCbcDbcEbcFaYPbcGbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYTbaWbcJbcKbcLbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXAbcMbcNaYYaXzaYZaXsaYZaXsaYZaXsaYZaXzaZaaZbaSdaTobcObcPbcQbcRbcSbcSaSfbcTbcUbcVbcWbcXbcYbcZaVebdaaTubdbbdcbddbdebdfbdgbdhbdibdjbdkaVjaaaaabaaabdlbdmbdlaaaaabaaaaSuaSzaSAbdnbdobdpbdqbdraSAaPiaRwbdsbdtaTCbdubdvaTFbdwaTFbdxbdybdzaRwbdAbdBbdCbdDbdEbdFbdGbdHaaaaaabbEbdIbdJbdKaUQbdLbdMaVEaVEbdNaVEaVEaVEbdOaUSbdPaUSbdQbdRaUSbdSaUSbdTbdUbdVbdWbdXbdYbdTbdZbeabebbecbebbebbebbebbedbeebebbefbegbehbeibebbejaGYbaubekbcpbelbembenbeobepbeqberbesbazbetbeubevbewbexbcAbcBbcCbcDbaKbeyaYPbezbcHbcHbcIbaTbaTbaTbaTbaUbaVaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEbeFaVWaXqaXzaXsbeGbeHaXsaXsbeIbeGaXzaXAbeJaSdaTobeKbeLbeMbeNbeMbeMbeMbeMbeMbeOaSfaTubePbeQbePaTuaTubeRbeSbeRaViaViaViaVibeRbeTbeUaVjbeVbeWbeWbeXbeYbeXbeWbeWbeZaSubfaaSAbfbaSAbfcbfdbfeaSAbffaRwaRwaRwaRwbfgbfhbfibfjbfibfhbfgaRwaRwbfkbdDbdDbdDbdDbflbfmbfnbfobfpbbEbfqbdJbfraUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfubfvbfwbfxbfybfzbdTbfAbfBbfCbfDbfEbdTbfFbfGbfHbfIbfHbfJbfKbfLbfMbfNbfObfPbfQbfRbfSbebbfTbfUbfVbfWbfXbelbfYbfZbeobgabazbgbbgcbgdbgebgfbczbczbazbazbcBbcCbcDbcEbggaYPbghbgibgjbgkbglbgmbaTbaTbgnbaVaaaaaaaaaaaaaaaaYTbaWbgobeCbeCbeCbgpbaYaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeEaVWaVXaVWaVWaVYaVZaVWaVWaVXbeFbgqaLdbgrbeKaPYbgsbgsbgtbgsbguaMsbgvbgwaSfbgxbgybgzbgzbgAbgBbgzbgCbgzbgzbgzbgDbgzbgzbgEbgFbgGbgHbgIbgJbgHbgKbgHbgHbgHbgHbgLbgMbgNbgzbgzbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgXbgXbgXbgXbgXbgXbgYbgZbhabhbbhcbhdbhebhfbhgbhhbdDbdDbhibhjbhkbhjbhkbhlbhmbhnbhobhpbhqaUSbhrbhsbhtbhubhvbhvbhwbhxbhybhzbdTbhAbhBbhCbhCbhDbdTbhEbhFbhGbhHbhIbhIbhJbhKbhLbhMbhNbhObhPbhQbhRbebbejaTgbaubhSbhTbhTbhUbhVbhTbhWbazbhXbhYbazbhZbiabczbibbazbicbidbiebcDaYPaYPaYPbifbigbihbiibigbigbigbigaYSafXajcaaaaaaaaaaaabijbikbilbeCbeCbimbinbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYbioaSdaSdaSdaSdaSdaSdbioaPYaUZaLdbipbiqaPYbirbisbitbitbiuaMsbivbgwbiwbixbgybiybizbiAbiBbiBbiCbiDbiDbiDbiEbiFbiFbiGbiHbiIbiBbiBbiJbiFbiKbiLbiMbiMbiNbiObiPbiQbiQbiQbiRbgPbgQbgRbgSbgSbgSbgSbiSbgSbgSbgSbgSbgSbgSbiTbiUbiVbiWbiXbiYbiZbjabjbbjcbiVbiVbiVbjdbjebjebjebjfbhqbhqbhqbjgbjhbhqaUSbjibjjbhvbhvbjkbhvbjlbjmbhybjnbdTbjobjpbjqbjrbjsbdTbjtbjubjvbjwbjxbjybebbebbjzbjAbebbebbjBbjCbjBbebbejaGYbaubjDbcpbcpbcpbjEbcpbjFbazbazbazbazbazbazbazbjGbazbcDbcDbcCbcDbjHbjIaYPbjJbjNbjLblwbjKbjObjPbjQbjRaaaaaaaaaaaaaYTbjSbjTbjSbjSbjSbjUbjSbjVbjSbjTbjSaYVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaUlaLdaPYaOQaSdbjWbjXbjYbjZaSdaOQaPYaPYaLdbkabeKaPYbkbbkcbitbitbiuaMsbkdbgwaSfbixbgybgzbkebkfbkgbkgbkhbkibkjbkgbkkbkgbklbkgbkmbknbkgbkgbkgbkgbkgbkobkpbkgbkqbkrbksbktbgzbgzbkubkvbkwbkxbkybkzbkybkAbkBbkAbkAbkAbkAbkAbkAbkCbkDbkEbkEbkEbkEbkFbkEbkGbkHbkEbkEbkIbkJbkKbkKbkKbkKbkKbkKbkKbkLbhqbhqaUSbkMbkNbkObkPbkPbkQbkRbjmbhybkSbdTbdTbdTbdTbdTbkTbdTbkUbkVbkWbkXbfHbkYbebbkZblablbblcbldbleblfblgbebbejaQLbaublhblibcpbljblkbcpbllbllbaublmblnbloaYPblpblqblrbcDbcDblsbltaYPbluaYPblvbjKbjLblxblybjKbjKblzbjRaaaaaaaaaaaabijbmXbnabmYblDblAbeCblCblDblAblBblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaPYbioaSdaToaSfaSfaTpaSdbioaSdblEblFblGblHaPYblIblIbgtblIbguaMsblJbgwaSfaMsblKblKblLblMblMblMblMblMblMblNblOblMblMblMblMblMblMblPblQblRblRblSblRblTblUblVblTblTblWblXblYblKblZblZbmabmabmabmbbmbbmbbmbbmbbmbbmbbmbbmcbmdbmdbmebmdbmfbmfbmfbmfbmgbmhbmfbmcbmibmibmibmibmibmibmibmibmjbmjbmjaUSbmkbmlbmmbmmbmmbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbdTbdTbmxbmybmzbmybmybebbmAbmBbmCbmDbmDbmDbmEbmFbebbmGbmHbaubmIbcpbljbljblkbljbcpbmJbaubmKbmLbmMaYPbcDbmNbmObmPbmPbmQbmRbmSbmTbmUbmVbmWboObzpbjMbjKbjKblzbjRbjRbjRbjRbjRbijbBTbDzbDzbBVbDwbeCblCbnbblAbeCbncbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabndbneaSfbnfbngbnhbnibnjbnkbnibnlbnmbnibnibnnbnobnpbnqbnrbnrbnrbnsbnrbntbnuaMsbnvbnwbnxblMbnybnzbnAbnBbnCbnDbnEbnFbnGbnHbnIbnJblMbnKbnLblRbnMbnNbnOblTbnPbnQbnRblTbnSbnTbnUbnSbnSbnSbnVbgSbnWbmbaaaaaaaaaaaaaaaaaaaaabmcbnXbnYbnZboabobbocbodboebofbogbohbmcaaaaaaaaaaaaaaaaaaaaabmiboibhqbojaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbonbooboobopboqborbosbotboubovbowbebboxboybozboAboAboBboCboDbebbejaGYbauboEboFbcpbljblkbcpboGboGbaubauboHbauaYPboIblqbltboJboJboKbltaYPaYPaYPboLbjKbEFbDubjMbjKbjKbmZbAMbrKbrMbrMbrKbDvbDzbGJbDxbnbblAbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabndboPboQboPboPboPboPboPboPboQboPboPboRaSfboSboTboUaSfboVaSfboWboXboYboZbpaaMsbnwbnwbpbblMbpcbnDbnDbnDbnDbnDbnEbpdbnDbnDbnDbpeblMbnKbpfblRbpgbphbpiblTbpjbpkbplblTbpmbpnbpobppbpqbnTbnVbgSbnWbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbmcbmcbmcbmcaaaaaaaaaaaabmiboibhqbpCbpDbpEbpFbpGbpHbpEbpIbpJbpKbpLbpMbpNbmqbpObpPboobpQbpRboobpSbpTbpUbpVboobpWbpXbpYbozboAboAboBbpZbqabebbejaTgbaubmIbcpbljbljblkbljbcpbcpbqbbqcbcpbqdaYPbqebqfbqgboJboJbqhbqgbqiaYPbqjbqkbjKbDybDybEHbEIbDybDybjRbqnbjRbjRbjRbEJbjSbjSbjSbqoblAbeCblCbqoblAbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaUlaLdaPYaOQaSdbjWbjXbjYbjZaSdaOQaPYaPYaLdbkabeKaPYbkbbkcbitbitbiuaMsbkdbgwaSfbixbgybgzbkebkfbkgbkgbkhbkibkjbkgbkkbkgbklbkgbkmbknbkgbkgbkgbkgbkgbkobkpbkgbkqbkrbksbktbgzbgzbkubkvbkwbkxbkybkzbkybkAbkBbkAbkAbkAbkAbkAbkAbkCbkDbkEbkEbkEbkEbkFbkEbkGbkHbkEbkEbkIbkJbkKbkKbkKbkKbkKbkKbkKbkLbhqbhqaUSbkMbkNbkObkPbkPbkQbkRbjmbhybkSbdTbdTbdTbdTbdTbkTbdTbkUbkVbkWbkXbfHbkYbebbkZblablbblcbldbleblfblgbebbejaQLbaublhblibcpbljblkbcpbllbllbaublmblnbloaYPblpblqblrbcDbcDblsbltaYPbluaYPblvbjKbjLblxblybjKbjKblzbjRaaaaaaaaaaaabijbmXbnabmYbmYblDbeCblCblDblAblBblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaPYbioaSdaToaSfaSfaTpaSdbioaSdblEblFblGblHaPYblIblIbgtblIbguaMsblJbgwaSfaMsblKblKblLblMblMblMblMblMblMblNblOblMblMblMblMblMblMblPblQblRblRblSblRblTblUblVblTblTblWblXblYblKblZblZbmabmabmabmbbmbbmbbmbbmbbmbbmbbmbbmcbmdbmdbmebmdbmfbmfbmfbmfbmgbmhbmfbmcbmibmibmibmibmibmibmibmibmjbmjbmjaUSbmkbmlbmmbmmbmmbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbdTbdTbmxbmybmzbmybmybebbmAbmBbmCbmDbmDbmDbmEbmFbebbmGbmHbaubmIbcpbljbljblkbljbcpbmJbaubmKbmLbmMaYPbcDbmNbmObmPbmPbmQbmRbmSbmTbmUbmVbmWboObzpbjMbjKbjKblzbjRbjRbjRbjRbjRbijbBTbDzbDzbDzbBVbeCblCbnbblAbeCbncbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabndbneaSfbnfbngbnhbnibnjbnkbnibnlbnmbnibnibnnbnobnpbnqbnrbnrbnrbnsbnrbntbnuaMsbnvbnwbnxblMbnybnzbnAbnBbnCbnDbnEbnFbnGbnHbnIbnJblMbnKbnLblRbnMbnNbnOblTbnPbnQbnRblTbnSbnTbnUbnSbnSbnSbnVbgSbnWbmbaaaaaaaaaaaaaaaaaaaaabmcbnXbnYbnZboabobbocbodboebofbogbohbmcaaaaaaaaaaaaaaaaaaaaabmiboibhqbojaUSbokbmlbmqbmqbmqbmqbmqbolbombmqbmqbmqbonbooboobopboqborbosbotboubovbowbebboxboybozboAboAboBboCboDbebbejaGYbauboEboFbcpbljblkbcpboGboGbaubauboHbauaYPboIblqbltboJboJboKbltaYPaYPaYPboLbjKbEFbDubjMbjKbjKbmZbAMbrKbrMbrMbrKbDvbDzbDzbGJbGJbnbbeCblCbnbblAbeCblCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabndboPboQboPboPboPboPboPboPboQboPboPboRaSfboSboTboUaSfboVaSfboWboXboYboZbpaaMsbnwbnwbpbblMbpcbnDbnDbnDbnDbnDbnEbpdbnDbnDbnDbpeblMbnKbpfblRbpgbphbpiblTbpjbpkbplblTbpmbpnbpobppbpqbnTbnVbgSbnWbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbmcbmcbmcbmcaaaaaaaaaaaabmiboibhqbpCbpDbpEbpFbpGbpHbpEbpIbpJbpKbpLbpMbpNbmqbpObpPboobpQbpRboobpSbpTbpUbpVboobpWbpXbpYbozboAboAboBbpZbqabebbejaTgbaubmIbcpbljbljblkbljbcpbcpbqbbqcbcpbqdaYPbqebqfbqgboJboJbqhbqgbqiaYPbqjbqkbjKbDybDybEHbEIbDybDybjRbqnbjRbjRbjRbEJbjSbjSbjSbjSbqobeCblCbqoblAbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaPYaPYaPYaPYaPYaPYaPYaPYaPYaLdaMsbqpbqqbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnWbmbbmbbqNbmcbmcbmcbqObqPbqQbqRbqSbqSbqTbqUbqSbqVbqSbqWbqXbqYbqZbrabrbbmcbmcbmcbqNbmibmiboibhqbhqaUSbrcbrdbpMbrebmqbrfbrgbmqbrhbribpNbmqbonbooboobrjbrkbrlbrmbrnbrobrpboobrqbpXbrrbozboAboAbrsbrtbrubebbejaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrDbrEboJboJbrFbrEbrGaYPbrHbqkbjKbjObGIbjMbjKbjKbrIbrJbrKbrLbrMbrKbrNbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObrPbrPbrQbrPbrPbrPbrRbrPbrPbrSaabaPYaUnaShbrTbqrbrUbrVbrWbrXbrYbrZbsabsbbqrbscbsdbsebsfblMbsgbnDbnDbqvbqxbshbsibqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsmbsnbsoblTbspbqJbsqbqJbsrbnTbnVbssbnWbgXbgXbstbsubsvbmcbswbptbsxbqSbqSbsybszbsAbsBbsAbsCbsDbsEbsFbsGbsHbsIbmcbsJbsubsKbsLbsMboibhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsRbpNbmqbpObooboobsSbsTbsUbsVbsWbsXbrpbsYbebbsZbtabtbboAboAboBbrtbtcbebbtdbtebaubtfbaubaubtgblkbthbtibcpbtjbtkbtlbtmbmUbtnbtobtpbtqbtqbtrbtsbttbmUbtubtvbjKbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbijbtybeCblCblDblAbeCblCblDblAbeCbtzbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObtAbtBbtCbtDbtDbtEbtDbtDbtDbtEbrQaPXaPYaSdaToboSbqrbrUbtFbtGbrUbtHbtIbtJbtKbqrbtLbtMbtNblQblMbtObtPbtQbtRbtSbtTbtUbtVbtVbtVbtWbtXblMbnKbsdbtYbtZbuabubblTblTblTblTblTbucbudbuebufbugbnTbnVbssbgSbgSbgSbuhbuibujbukbulbumbqSbunbuobupbuqburbusbutbuubuvbuwbuxbulbuybuzbuAbuBbuCbuDbuEbuEbuFbhqbuGaUSbmqbuHbuIbpNbmqbuJbuKbmqbuLbuMbpNbmqbonboobooboobopboobuNboobsXbrpbuObebbuPbrrboBboAboAboBbrtbuQbebbuRbuSbuTbuUbuVbuWbuXbuYbuZbuZbuZbuZbuZbuZbvabvbbvcboJboJboJboJboJboJbvdbvebvfbqkbjKbjKbjKbjMbjKbjKbvgbqnbvhbvhbvhbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9198,10 +9192,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbwFbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaPYaPYaSdbwKblHbwLbrUbwMbvnbvnbvnbvobwMbrUbqrbwNbwObtNbvsbwPbwQbwRbwSbvsbwTbwUbwVblMbwWbwXbwYbwZblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxdbxebxebxebxfbxebxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxsbxtbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwkbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxCbxDbmqbxEbdTbxFbxGbdTbdTbxHbxIbxJbxIbdTbdTbebbxKbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbqkbjKbqlbqlbqmbqlbjKbvgbqnbvhbvhbvhbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbrPbrPbrQbrPbrPbrPbrRbrPbrPbydaabaPYbyebngbyfbqrbtFbtFbtFbrUbygbyhbyibyjbqrbykbylbtNbvsbymbvsbynbyobvsbypbyqbyrblMbwWbwXbwYbskblMbnKbxabxbbysbytbyubyvbywbxbbyxbyybyzbyAbyBbyBbyBbyCbyDbyEbyFbxlbyGbyHbyIbyJbyKbyLbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyTbyUbyVbyWbyXbyYbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzfbzgbzgbzgbzgbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbzmbznbjKbjKbjKbjMbjKbjKdsgbjRbjRbjRbjRbqnbijbzobeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzqbzrbqrbqrbqrbqrbqrbqrbzsbqrbqrbqrbnKbnKbztbvsbzubzvbynbzwbvsbzxbzybzzblMbwWbwXbwYbnDblMbnKbxabxbbzAbzBbzCbyvbzCbxbbyxbzDbzEbzFbzGbzHbzIbzJbzKbzLbyFbzMbzNbzObzPbzQbzQbzPbzRbzSbvXbzTbxqbxqbyPbzUbyPbxqbxqbzVbwbbzWbzXbzYbzZbAabAbbzYbAcbxvbAdbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAlbAmbAnbAkbAkbAobAkbAkbAkbAkbAkbAkbAkbAkbApbAqbArbArbArbArbArbArbAsbAibAtbAubAubAvbAwbAxbAwbAybAwbAzbAAbABbAwbACbADbAEbAFbAGbAGbAGbAGbAGbAGbAGbAHbAIbAJbAJbAJbAJbAKbAJbALbrIbAMbrKbANbrMbrKbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaPYaUnaShbAUbAVbAWbAXbAXbAXbAXbAYbAZbBablQbnwbBbbBcbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBfbBgblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyxbBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzMbBrbBsbBtbBubBvbBwbzRbBxbvXbBybyPbxqbBzbBAbBzbxqbyPbBBbxubBCbzYbzYbzZbBDbAbbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbBObBPbjKbjKbjKbjKbjKbjKbjKbBQbjRbqnbjRbjRbjRbEJbjSdsidshbjSbBUaYUbBUaYUdsjbBRbBSbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbBYbBZbCabCbbCbbCcbCdbARbATaPXaPYaPYaTobCebCfbCgbCfbCfbCfbCfbChbCibCjblQblQbCkbClbvsbwPbCmbCnbzwbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCtbCubzCbCvbCwbxbbyxbzJbCxbzFbBnbBnbCybzJbCzbzLbyFbzMbCAbBsbBtbCBbCCbBwbzRbCDbvXbCEbCFbxqbCGbCHbCIbxqbCJbCKbCLbCMbCNbCObCPbCQbCRbzYbCSbxvbCTbCUbAfbAgbAhbAibAkbCVbAkbAkbAkbAkbCWbCXbCXbCXbCXbCYbAkbAkbAkbAkbCZbAkbCVbDabAkbDbbDcbDdbAkbDebDfbDfbDgbDhbDibDjbwvbwvbwvbwvbwvbwvbwvbDkbDlbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDmbDnbDnbDobDpbDqbDrbDsbDsbDsbDsbDtdskbAMbrKbrMbrMbrKdsmdsldsldsldsnbijaaabijdsobDwbDwdspbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaPYaUnaShbAUbAVbAWbAXbAXbAXbAXbAYbAZbBablQbnwbBbbBcbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBfbBgblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyxbBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzMbBrbBsbBtbBubBvbBwbzRbBxbvXbBybyPbxqbBzbBAbBzbxqbyPbBBbxubBCbzYbzYbzZbBDbAbbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbBObBPbjKbjKbjKbjKbjKbjKbjKbBQbjRbqnbjRbjRbjRbEJbjSdsidshbjSbBUaYUbBUaYUbDxbBRbBSbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbBYbBZbCabCbbCbbCcbCdbARbATaPXaPYaPYaTobCebCfbCgbCfbCfbCfbCfbChbCibCjblQblQbCkbClbvsbwPbCmbCnbzwbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCtbCubzCbCvbCwbxbbyxbzJbCxbzFbBnbBnbCybzJbCzbzLbyFbzMbCAbBsbBtbCBbCCbBwbzRbCDbvXbCEbCFbxqbCGbCHbCIbxqbCJbCKbCLbCMbCNbCObCPbCQbCRbzYbCSbxvbCTbCUbAfbAgbAhbAibAkbCVbAkbAkbAkbAkbCWbCXbCXbCXbCXbCYbAkbAkbAkbAkbCZbAkbCVbDabAkbDbbDcbDdbAkbDebDfbDfbDgbDhbDibDjbwvbwvbwvbwvbwvbwvbwvbDkbDlbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDmbDnbDnbDobDpbDqbDrbDsbDsbDsbDsbDtdskbAMbrKbrMbrMbrKdsjdsldsldsldsnbijaaabijdsobDwbDwdspbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbDAbCbbCbbCbbCbbCbbCbbCbbDBbDCaOQbDCaSfbDDbCfbDEbDFbDGbDHbDIbChbDJbDKbDLbDLbDMbDNbvsbvsbvsbynbDObymblQblQblQblQbDPbnKbnKbCsbnKbCrbCsbxbbDQbDRbDSbDTbyvbxbbDUbzJbDVbzFbBnbBnbDWbDXbDYbzLbDZbxlbEabEbbzPbzPbzPbzPbzRbEcbvXbEdbEebvXbvXbvXbvXbvXbvXbvXbxubxvbEfbEgbEhbEibEjbEkbElbxvbEmbEnbEnbEobEobEobEobEobEobEobEpbEpbEqbErbEsbEsbErbEqbEpbEpbEtbEtbEtbEtbEtbEtbEubEubEvbEubEubEubEubEubEubEwbExbEybwvbwvbEzbEzbEAbEAbEAbEAbEAbEBbDnbDnbDmbDnbwvbDnbDnbDnbDnbECbEDbEDbEDbEDbEEbEFbEFbEGbEGbEGbEGbEGbEGbEGbjRbjRbjRbjRaYUdsqdsldsldsrbijaaabijdssbDwbDwdstbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbEKbELbELbCbbELbELbELbARbEMaPYaPYaPYaTobENbCfbEObEPbEPbEPbEQbChbnKbERbESbETbEUbEVbvsbwPbEWbynbEXbymbEYbEZbFabFbbFcbFdbFdbFebFdbFfbFgbxbbFhbFibFjbFkbFlbFmbFnbyBbFobFpbBnbFqbFrbFsbDYbzLbFtbxlbFubFvbFwbFxbFybFzbFAbxmbxmbFBbFCbFDbFEbFFbFEbFGbFCaaabFHbxvbFIbFJbFKbFLbEjbzYbFMbxvbFNbFObFPbEobFQbFRbFSbFTbFUbFVbFWbFXbFYbFZbGabGabFZbGbbGcbGdbEtbGebGfbGgbGhbEtbGibGjbGkbGlbGmbGnbGnbGobEubGpbGqbGrbGsbGrbGtbGtbEAbGubGvbGwbEAbGxbGybGxbEAbGzbDnbECbEDbGAbGBbGAbEDbGCbGDbEDbGEbGFbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabijdsudswdsvdsvbijaaabijdsxdsxdsxbDwbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBWbBXbEKbELbELbCbbELbELbELbARbEMaPYaPYaPYaTobENbCfbEObEPbEPbEPbEQbChbnKbERbESbETbEUbEVbvsbwPbEWbynbEXbymbEYbEZbFabFbbFcbFdbFdbFebFdbFfbFgbxbbFhbFibFjbFkbFlbFmbFnbyBbFobFpbBnbFqbFrbFsbDYbzLbFtbxlbFubFvbFwbFxbFybFzbFAbxmbxmbFBbFCbFDbFEbFFbFEbFGbFCaaabFHbxvbFIbFJbFKbFLbEjbzYbFMbxvbFNbFObFPbEobFQbFRbFSbFTbFUbFVbFWbFXbFYbFZbGabGabFZbGbbGcbGdbEtbGebGfbGgbGhbEtbGibGjbGkbGlbGmbGnbGnbGobEubGpbGqbGrbGsbGrbGtbGtbEAbGubGvbGwbEAbGxbGybGxbEAbGzbDnbECbEDbGAbGBbGAbEDbGCbGDbEDbGEbGFbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabijdsudswdsvdsvbijaaabijdsxbDwdsxbDwbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGKbARbARbARbARbARbARbARbARbEMaaaaaaaPYbGLbngbGMbCfbGNbCfbGObEPbGPbGQbChbGRbGSbGTbGUbEVbvsbvsbvsbvsbvsbvsbGVbGWbGXbGYbGZbxbbxbbxbbxbbxbbxbbxbbHabxbbxbbxbbHbbxbbHcbHdbHebBnbBnbBnbHfbDXbHgbzLbHhbxlbHibFvbxlbxlbxlbxmbHjbxmbHkbHlbHmbHnbHobHpbHqbHrbHsbHtbHubxvbHvbzYbHwbHxbEjbHybzYbxvbHzbHAbHBbEobHCbHDbHEbHFbHGbHHbHIbGabGabGabGabGabGabGabGabHJbHKbHLbHMbHNbHObEtbHPbHQbHRbHSbHTbHUbHQbHTbEubHVbGqbHWbHXbHYbHZbHZbIabIbbIcbIdbIebIfbIgbIhbEAbIibIjbIkbEDbIlbImbInbIobIpbIqbEDbIrbGGbIsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbjVbIubIubIubIvaaabIwbIxbIxbIxbjVbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaPYaPYaPYaPYaPYaPYaPYaToaSfbIzbCfbIAbIBbICbIDbIDbIEbIFbIGbIHbIHbIIbIJbDLbDLbDLbDLbDLbDLbIKbILbILbIMbINbxbbIObIPbIQbIRbISbITbIUbIVbxbbIWbIXbyBbyCbDXbHebBnbBnbIYbzJbzJbIZbJabJbbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbHsbJnbJobJnbJobJpbHsbHtbJqbJrbJsbJtbJubJvbJwbJxbJybJrbJzbFObFObEobJAbJBbJCbJDbJEbEobHIbGabGabGabGabGabGabGabJFbJGbJHbJIbJJbHLbJKbEtbJLbJMbJNbHSbHTbHUbJObJPbEubJQbJRbJSbJTbJTbJUbJVbJWbJXbJYbJYbJYbJZbJYbKabKbbKcbKdbKebKfbKgbKhbKibKibKibKjbEDbKkbGGbKlbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabItbKmbKmbKmbIyaaabItbKmbKmbKmbIyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPYbKnbKobKpaRcaRcaRcbngaSfaSfbCfbKqbCfbKrbKsbKtbKubCfblQbKvbKvbKwbKxbKwbKwbKwbKxbKwblQblQbxbbxbbxbbKybxbbKzbKzbKzbKzbKzbKzbIUbKAbKBbKCbzFbKDbKEbKFbKGbKHbKIbKJbKKbKLbKMbKNbKObKPbKQbKQbKRbKSbKTbKUbKVbKWbKXbKYbFCbKZbHqbLabHobLbbFCaaabLcbLdbLebLfbLdbLdbLdbLdbLgbxvbLhbFObLibLjbLkbLlbLmbLnbLobEobLpbLqbLrbLsbLtbLubLvbLwbGabLxbEtbLybJJbLzbLAbEtbLBbLCbHRbHSbHTbHUbHQbHTbEubHVbGqbLDbLEbLFbLGbLHbLIbLJbLKbLLbLMbLNbLObLPbEAbLQbLRbLSbEDbLTbLUbLVbIpbLWbLXbEDbKkbGGbLYbGHaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9232,10 +9226,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFczGczHczIczJczKczKczLcwxcsncoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcsqcngaaacymczOczPczQczRczSczTczUczRczRczVczWczXczYczZczZcAacAbctYcAccAdcyBcyDcyDcyDcyDcAecvIcsLcsLcxhcAfcAgcAhcAicAjcAkcAkcAlcAmcAncAocyKcApcxhcAqcuocArcvYcAscAtcAucAvcAwcAxcxBcAycAzcAAcxBcABcACcADcAEcAEcAEcAEcAEcAFcAGcAHcAIcAJcAJcAKcAKcAJcALcAMcANcAOcAPcAPcAQcARcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScATcAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnfcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcAWcAXcAYcAXcAZcBacBbcBccBdcBecwxcsncgQcgQcBfcngcngcngcngcngcngcngcBgcvocwIcwIcwIcwIcBhcwIcwIcvocygcqGcngaaacymcBicBjcBkcBlcwOcBmcBncBocBpcvxcyvcsBcnycBqcsDcBrcsDcvBcvBcvBcBscBtcyDcyDcBucBvcvIcsLcBwcxhcBxcBycBzcBAcBAcBBcBCcBDcBAcBAcBEcyKcBFcxhcBGcuocBHcvYcvYcBIcvYcvYcAwcBJcxBcBKcBLcBMcxBcBNcBOcBwcBPcBPcBPcBPcBPcBQcBQcBQcBPcBPaaaaaaaaaaaacBRcBScBTcBUcAPcBVcBWcBXcBYcBZcCacCbcCccCdcCecCfcCgcChcCicAPcAScCjcCkcClcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCmcCncCocieclzcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcCpcCqcCrcCsczJcCtcCucCvczJcCwcCxcCycskcgQcoLcngaaaaaaaaaaaaaaacngcoLcCzcwFcCAcwIcwIcwIcwIcCBcCCcCDcCEcngaaacCFcwKcCGcwMcCHcwOcwOcCIcCJcCKcCLcCMcCNcCOcBqcsDcCPcCQcCRcCScCTcvHcCUcyDcyDcyDcCVcvIcsLcsLcCWcCWcCXcCYcCZcCZcDacDbcDccDdcDdcDecDfcDgcDfcAqcuocArcDhcDicDjcDkcDlcAwcDmcxBcDncDocDpcxBcsLcBOcBPcBPaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcDrcDscDtcDucDvcDwcDwcDxcDwcDwcDwcDwcDwcDycDzcDAcDBcDCbGHcDDcjUbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecDEcDFcDGciecieckbckbcDHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcDIcAXcDJcAXcDKcDLcDMcDNcBbcDOcwxcDPcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcDUcvocoLcqGcvpaaaaaaaaaaaacvqcDVcDWcDXcDXcvxcDYcvxcDZcsBcnycEacEbcEccEdcEecEecEecEfcEgcyDcEhcyDcEicvIcsLcsLcCWcEjcEkcElcEmcEncEocCWcEpcEqcErcEscEtcEucDfcEvcEwcExcDhcEycEzcEAcEBcECczbcxBcEDcEEcEFcxBcsLcBOcBPcEGaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEIcEJcEKcELcEMcENcEOcDwcDwcEPcDwcDwcDycDAcDAcDAcEQbGHcERbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcEVcEWcEWcEWcEWcEWcEXcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcEZcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFbcsBcnycFccFdcFecFfcFgcFhcFicFjcFkcFlcFmcFncFocvIcsLcsLcCWcFpcFqcFrcFscFscFtcCWcFucFvcFvcFwcFvcFxcFycFzcFzcFzcFAcFBcFCcFDcDlcFEczbcFFcFFcFFcBPcBPcsLcBOcBQcFGaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFHcFIcFJcFKcFLcFMcFNcFOcDwcDwcDwcDwcFPcFQcFRcFScFTcFUbGHcERbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecifaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFYcFXcFZcFWcGacGbcGccGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGmcGncGmcGocGpcGpcGqcGrcGscGtcGucGtcGtcGtcGscGtcGtcGvcGwcGxcGycsBcnycGzcGAcGBcGCcsDcGDczZcGEcGFcGGcGHcGIcGJcGKcsLcsLcCWcGLcGMcGNcGOcGPcGQcCWcGRcGScGTcGUcGVcGWcGXaaaaaaaaacFAcDhcGYcDhcDhcGZcHacHbcHccHdcHechfcsLcBOcBQcFGaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcHfcHgcBScHhcHicHjcHkcHlcHmcHncDwcDwcHocHpcHqcHrcHsbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcHucFXcHvcHwcHxcHycHzcHAcHzcHBcHCcHDcHEcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQcFGaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcDIcAXcDJcAXcDKcDLcDMcDNcBbcDOcwxcDPcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcDUcvocoLcqGcvpaaaaaaaaaaaacvqcDVcDWcDXcDXcvxcDYcvxcDZcsBcnycEacEbcEccEdcEecEecEecEfcEgcyDcEhcyDcEicvIcsLcsLcCWcEjcEkcElcEmcEncEocCWcEpcEqcErcEscEtcEucDfcEvcEwcExcDhcEycEzcEAcEBcECczbcxBcEDcEEcEFcxBcsLcBOcBPaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEIcEJcEKcELcEMcENcEOcDwcDwcEPcDwcDwcDycDAcDAcDAcEQbGHcERbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcEVcEWcEWcEWcEWcEWaXpcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcEZcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFbcsBcnycFccFdcFecFfcFgcFhcFicFjcFkcFlcFmcFncFocvIcsLcsLcCWcFpcFqcFrcFscFscFtcCWcFucFvcFvcFwcFvcFxcFycFzcFzcFzcFAcFBcFCcFDcDlcFEczbcFFcFFcFFcBPcBPcsLcBOcBQaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFHcFIcFJcFKcFLcFMcFNcFOcDwcDwcDwcDwcFPcFQcFRcFScFTcFUbGHcERbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecifaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFYcFXcFZcFWcGacGbcGccGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGmcGncGmcGocGpcGpcGqcGrcGscGtcGucGtcGtcGtcGscGtcGtcGvcGwcGxcGycsBcnycGzcGAcGBcGCcsDcGDczZcGEcGFcGGcGHcGIcGJcGKcsLcsLcCWcGLcGMcGNcGOcGPcGQcCWcGRcGScGTcGUcGVcGWcGXaaaaaaaaacFAcDhcGYcDhcDhcGZcHacHbcHccHdcHechfcsLcBOcBQaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcHfcHgcBScHhcHicHjcHkcHlcHmcHncDwcDwcHocHpcHqcHrcHsbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcHucFXcHvcHwcHxcHycHzcHAcHzcHBcHCcHDcHEcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcIFcFXcIGcFXcFZcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScITcIUcIVcIWcIXcIYcqVcIZcqVcIUcJacIUcIUcIUcIUcIUcIUcIUcIUcIUcIUcJbcHDcJccJdcJecJfcJgcJhcJicJjcJkcJlcJmcJncJocJpcJqcJrcGHcrecJscJtcJucEmcElcEmcEmcJvcDfcJwcErcErcEscErcJxcGXaaaaaaaaacImcJycJzcJAcJBcJCcJDcJEcJFcHdcsLcuccJGcBOcBPaaaaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcJHcJIcJJcxNcJKcJKcJLcBRaabcAPcAPcJMcAPcJNcJOcJPcAPcJQcuQcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJRcJScEWcEWcEWcEWcEXcEYcEYcEYcEYcJTcEYcJUcJVcJVcJWcJXcJYcEYcJZcKacKbcKbcKccKbcKdcKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcKgcKhcKicKjcKkcKlcKmcKncKocKncKncKncKncKpcKqcKrcKscKtcGKcsLcKucKvcKwcKxcKycKzcKAcKBcDfcKCcKDcKEcKFcKGcKHcFyaaaaaaaaacImcKIcKJcKKcIqcKLcKMcJDcKNcHdcKOchfchfcBOcBPaaaaaaaaaaaaaaaaaacBRcKPcKQcKRcKScKTcKUcKVcxNcKWcKXcKYcxNcJKcKZcLacBRaabaabcLbcLccLdcLecLfcLgcLbbGGbGGcERcLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalwalvalvalwalvalvaabamhaabayiaaaayiayicLicLjcLkcLkcLkcLlcLmcEYcLncLocLpcLqcLrcLscEYcLtcLucKfcLvcLwcLxcLycLzcLAcLBcLCcLDcKbcLCcLEcLFcLGcLGcLHcKbcLIcLJcHCcLKcnycLLcLMcLNcLOcLPcLQcLPcLRcLScLTcLUcLVcLWcGKcGKcKucKvcCWcCWcLXcCWcCWcKvcLYcLZcLZcLZcMacLZcMbcFyaaaaaaaaacImcImcImcImcImcFFcMccMdcMecHdcsLcsLcMfcBOcBPaaaaaaaaaaaaaaaaaacBRcJKcMgcJKcMhcMicEHcJIcxNcxQcMjcxQcxNcJKcJKcMkcBRaabaaacLbcMlcMmcLecLecMncLbcMobGGcERbKlcMpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9258,12 +9252,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucXucXudcLdcMdcMdcMdardcNdcOdcPdcPdcQdcRdawdcSdcTdcUdcVdcWdcXdcYdcZddaddbddcddddcYddeddfddgddhddiddjddkddldbDcZSddmddncSddaMcSdddocSddaPdaQcXTcXUddpcXWdbIcQZcQZcQZcQZcQZcRacBQddqcYccuccTBddrddsddsddsddtchfdduddvddwchfddxcYbcYbddyddzcMfcsLcsLcBPcBPaaaaaaddAaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaabaaabGHcJQddBddCcuQddDddEbGGbZZaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddFcXucZucZucZudcMaabaabdarddGddHdcPdcPddIdarddJddKddLddMddNddOddPcSUddQddRddScVjddTcSUddUddVddWddMddMddXddYcSUddZcZSdeadebcSddaMcSdcZUcZVdecdeddaRdeedefcWXdegcSndehdeideicQZcRacBQdejdekchfchfcOYchfchfcsLdelchfchfdemchfchfdendeodepdeqdercBPcBPcBPcBPaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaabaabbGHdbgcASbZYcuQcuQcuQbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucZucZucZudcMaabaaadardesddHdcPdcPdetdardeudevcSUdewdexdexdeycSUdezdeAdeBdeCdeDcSUdexdexdexdewcSUdeEdeucSUdbDcZSdeFdeGdeHdeIdeJdeKdeLdeMcWUdeNcXUdeOcXWdbIcTodePdeQdeRcQZcRacBPcBPcOYcprdeScOYdeTchfcsLdeUdeVdeWdeXddsddsdeYcYichfdeZcBPcBPaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGHbGHbGHbGHdfabZYcuQdfbdfcbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcLdfdaaaaaadardfedffdcPdcPdfgdardfhdfidfjdfkdfldfmdfndfodfpdfqdfrdfsddkdfodfldfldfldftdfjdfudfvcSUdbDdfwdaMdfxdfydeLdfzdfAdfBdfCdfDdfEdfFdfGcZadcycSndfHdeideicQZcRacBPcsLdfIdfJdfKdeYcsKchfcsLcsLcsLcYidfLcsLcXkdfMddzchfcOYbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfNdfOcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfRdfSdfSdfTdfSdfSdfUdardfVdcOdcPdcPdfWdardaGdfXcSUcSUdfodfodfodfodfYdfZdgaddMdgbdfodfodfodfocSUcSUdgcdgdcSUdbDcZSdgedgfdfydggdghcSdcSddgicXPdggcXUdgjcXWdbIcQZcQZcQZcQZcQZcRacBPcTBcsLdgkdglcsLdgmchfchfdgnchfdgocpscJGdgpchfchfchfcOYbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgqdgrcJQdfNbZYbGGbGGbGGdgsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgvdgxdgydardgzdgAdcPdcPdgBdarcSUdgCcSUdgDaacdgEdfodfodfodfodgFdfodfodfodfodgEaacdgDcSUdgGcSUcSUdbDcZSdgHdeHdgIdgJdgKdgLdgMdgJdgMdgJdgNdeLdgOdbIdgPdgQdgQdgQdgQdgRdgSdgTdgTdgUdgVdgTdgTdgTdgWdgXdgYdgodgZchfdgochfdhachfcOYbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMpbGHcJQcuQdhbbGGcQwdfNbZYcuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgwdhddhedardhfdhgdcPdcPdhhdardhidhjdhkaacdhldhmdhmdhmdhmdhmdhndhmdhmdhmdhmdhmdhoaacdhpdhqdhrcSUdhsdaIdhtdhudhvdhwdhxdhydhzdhAcSddhBdhCdhDdhEdbIdhFaaaaabaabaaadhGdhHdhIdhJdhKdhLdhMdhNdgTdhOcsLcsLdhPcpsdhQcYicsLcsLdhRddqdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhTdhSdhSdhSdhSczDcuQbPAcAUbGGdhUcMpcuQcuQcuQdbhcuQdfNbZYcuQdhVbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdhWdgvdhXdhYdardfVdcOdcPdcPdhZdardiadibdibaaadicaacaacaacaacaacaacaacaacaacaacaacdicaaadibdibdiacSUdaGcZSdhEdiddiedifdigdihdhEdifdhEcXWdhEcXWdhEdbIdhFaaaalwalwdiidhHdijdikdildimdindiodipdgTcsLcsLchfdgodiqchfcYicXkdfMdirdisditditditditditditdiudivditditditditditditdiwdixdiydizdiAdiBdiCdiCdiCdiCdiDdiEdiFdiCdiCdiCdiCdiGcjUcuQdfcbGGdiHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiIdfSdfSdfSdfSdfSdiJdardiKdiLdcPdcPdiMdardiNdiOdiPaabdicaacdiQaaaaaaaaaaaadiQaaaaaadiQaacdicaaadiRdiSdiTcSUdaGcSUaabdiUaabdiVdiWdiXdiYdiZdiYdjadiYdjadjbdjcdhFaaaalwaabdjddgSdjedjfdjgdjhdjidjjdjkdgTdjlcsLcsLcYidjmchfcYicYidjncBPcBPbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHdjobGGcuQcTLbGGcuQcuQbZZbZZcxScuQdjpbGGdjpcuQdjqbZYdjrbGHbGHbGHbGHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcLdfdaaaaaadardfedffdcPdcPdfgdardfhdfidfjdfkdfldfmdfndfodfpdfqdfrdfsddkdfodfldfldfldftdfjdfudfvcSUdbDdfwdaMdfxdfydeLdfzdfAdfBdfCdfDdfEdfFdfGcZadcycSndfHdeideicQZcRacBPcsLdfIdfJdfKdeYcsKchfcsLcsLcsLcYidfLcsLcXkdfMddzcuQcERbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfNdfOcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfRdfSdfSdfTdfSdfSdfUdardfVdcOdcPdcPdfWdardaGdfXcSUcSUdfodfodfodfodfYdfZdgaddMdgbdfodfodfodfocSUcSUdgcdgdcSUdbDcZSdgedgfdfydggdghcSdcSddgicXPdggcXUdgjcXWdbIcQZcQZcQZcQZcQZcRacBPcTBcsLdgkdglcsLdgmchfchfdgnchfdgocpscJGdgpchfchfcuQcERbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgqdgrcJQdfNbZYbGGbGGbGGdgsbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgvdgxdgydardgzdgAdcPdcPdgBdarcSUdgCcSUdgDaacdgEdfodfodfodfodgFdfodfodfodfodgEaacdgDcSUdgGcSUcSUdbDcZSdgHdeHdgIdgJdgKdgLdgMdgJdgMdgJdgNdeLdgOdbIdgPdgQdgQdgQdgQdgRdgSdgTdgTdgUdgVdgTdgTdgTdgWdgXdgYdgodgZchfdgochfdhacuQcERbGHbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbGHbGHbGHbGHbGHbGHbGHbGHbGHcMpbGHcJQcuQdhbbGGcQwdfNbZYcuQcuQdbhcuQbGHaabdhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdgwdgwdhddhedardhfdhgdcPdcPdhhdardhidhjdhkaacdhldhmdhmdhmdhmdhmdhndhmdhmdhmdhmdhmdhoaacdhpdhqdhrcSUdhsdaIdhtdhudhvdhwdhxdhydhzdhAcSddhBdhCdhDdhEdbIdhFaaaaabaabaaadhGdhHdhIdhJdhKdhLdhMdhNdgTdhOcsLcsLdhPcpsdhQcYicsLcsLcEGaYNdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhSdhTdhSdhSdhSdhSczDcuQbPAcAUbGGdhUcMpcuQcuQcuQdbhcuQdfNbZYcuQdhVbGGbGGbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgtdgudgvdhWdgvdhXdhYdardfVdcOdcPdcPdhZdardiadibdibaaadicaacaacaacaacaacaacaacaacaacaacaacdicaaadibdibdiacSUdaGcZSdhEdiddiedifdigdihdhEdifdhEcXWdhEcXWdhEdbIdhFaaaalwalwdiidhHdijdikdildimdindiodipdgTcsLcsLchfdgodiqchfcYicXkdfMdhRcFGditditditditditditdiudivditditditditditditdiwdixdiydizdiAdiBdiCdiCdiCdiCdiDdiEdiFdiCdiCdiCdiCdiGcjUcuQdfcbGGdiHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiIdfSdfSdfSdfSdfSdiJdardiKdiLdcPdcPdiMdardiNdiOdiPaabdicaacdiQaaaaaaaaaaaadiQaaaaaadiQaacdicaaadiRdiSdiTcSUdaGcSUaabdiUaabdiVdiWdiXdiYdiZdiYdjadiYdjadjbdjcdhFaaaalwaabdjddgSdjedjfdjgdjhdjidjjdjkdgTdjlcsLcsLcYidjmchfcYicYidjnbGHbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHbZZbZZbZZbZZbGHdjobGGcuQcTLbGGcuQcuQbZZbZZcxScuQdjpbGGdjpcuQdjqbZYdjrbGHbGHbGHbGHbGHaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjsdiLdcPdcPdjtdardjudibdjvaaadjwdjxaaaaaaaaaaaaaaadjyaaaaaaaaadjzdjAaaadibdibdjucSUdaGcSUcQZdjBcTodjBcQZdjBcTodjBcQZdjCcTodjDcQZaabdhFaaaalwaabdjEdgSdjFdjfdjGdjHdjidjIdjJdjKdirdjLdjMcYicpscsLdjNdgochfcBPaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdjOcLhcuQdjPbGGcuQaaaaaaaaaaaacuQbGGbGGdbgdjQdjQdjRdjSdjQaaaaabaabaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadardjUdcOdcPdcPdhZdardjVdjWdibaaadicaacaaaaaaaabaabaabaabaabaaaaaaaacdicaaadibdjXdjYcSUdjZcSUcQZdkadkbdkccQZdkddkedkfcQZdkgdkhdkicQZaabdhFaaaalwaaadjEdkjdkkdkldkmdkndkodkpdkqdgTdkrdgochfdgodkschfdktdgocBNcBPcBQcBQcBQaHQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabGHdkucuQcuQcQxbGGcuQcuQbZZbZZcuQcuQbGGdkvcLhdjQdkwdkxdkydjQaaaaaaaabaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdardardardardardardarcSUdiadibaaadicaacdiQaabaabdkzdkAdkBaabdkCaaaaacdicaaadibdiacSUcSUdaGcSUcQZdkDdkEdkDcQZdkFdkGdkFcQZdkHdkIdkHcQZaabdhFaaaalwaaadjddgSdkJdkKdkLdkldkMdkNdkOdgTdkPdkQdkRdkSdkTcsLcYicYidkUdkVdkWcsLdkXaHQaaaaabaaabZZbZZbZZbGHbGHbGHbGHbGHbGHdkYcJQcuQdkZbGGbGGcuQbGGbGGbGGbGGdhbbGGdfPdjQdladlbdlcdjQaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9287,19 +9281,19 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpCdpDdpEdpFdpGdpHdpIdpJdpGdpKdpLdpMdpNdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdogdohdohdohdohdpOdpPdpOdoldoldoldoldpcaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaadpddpQdpRdpSdpTdpUdpVdpWdpXdpYdpZdqadqbdqcdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdovdovdovdovdovaaadnAaaadovdovdovdovdovaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddqddqedqfdpfdqgdqhdqidpfdqjdqkdqldppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaaaaabaabaabaaaaaadnAaabaaaaaaaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqndqodqpdqmdqmdqqdqrdqmdqpdqsdqpdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaadnAaaaaaaaaaamWamWamWayiamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqtdqudqpdqvdqwdqxdqydqvdqpdqzdqAdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdqBaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqCdqudqpdqvdqwdqxdqydqvdqpdqzdqDdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqEdqmdqFdqGdqpdqHdqwdqIdqJdqKdqpdqzdqmdqmdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqFdqMdqpdqNdqwdqxdqydqvdqpdqOdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqFdqPdqQdqRdqSdqTdqydqUdqVdqWdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqFdqXdqpdqYdqZdqxdqydradqpdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqFdqXdqpdqHdrbdrcdqydqKdqpdqXdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqFdqXdqpdqvdqwdqxdqydqvdqpdqXdqmdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdrddqXdqpdqvdqwdredqydqvdqpdqXdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrddrfdrfdrgdrfdrhdridrgdrfdrfdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrddrfdrfdrkdrldrmdrndrodrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrddrfdrfdrpdrqdrrdrsdrtdrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqpdqodqpdqmdqmdqqdqrdqmdqpdqsdqpdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaadnAaaaaaaaaaamWamWamWayiamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdisdqudqpdqvdqwdqxdqydqvdqpdqzdqAdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdqBaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqndqudqpdqvdqwdqxdqydqvdqpdqzdqDdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqEdqmdqmdqudqpdqHdqwdqIdqJdqKdqpdqzdqmdqmdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqmdqMdqpdqNdqwdqxdqydqvdqpdqOdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqPdqQdqRdqSdqTdqydqUdqVdqWdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqXdqpdqYdqZdqxdqydradqpdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabdqmdqXdqpdqHdrbdrcdqydqKdqpdqXdqmaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqmdqXdqpdqvdqwdqxdqydqvdqpdqXdqmdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqXdqXdqpdqvdqwdredqydqvdqpdqXdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrgdrfdrhdridrgdrfdrfdqXdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrkdrldrmdrndrodrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdqXdrfdrfdrpdrqdrrdrsdrtdrfdrfdqXdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrudrfdrfdrvdrvdrwdrxdrvdrfdrfdrudqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdrudrfdrydrydrzdrAdrsdrydrydrfdrudqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadrfdrfdrfdrBdrCdrDdrEdrFdrGdrHdrfdrfdrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm
index 66c7a9ff8c8..d96ec7d366d 100644
--- a/_maps/map_files/shuttles/emergency_bar.dmm
+++ b/_maps/map_files/shuttles/emergency_bar.dmm
@@ -22,7 +22,7 @@
"av" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access_txt = "19"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"aw" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"ax" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"ay" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"ay" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
"az" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
"aA" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
"aB" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape)
@@ -34,7 +34,7 @@
"aH" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/shuttle/escape)
"aI" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aJ" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"aK" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aK" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"aL" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aM" = (/obj/item/weapon/stool,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
"aN" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
@@ -60,10 +60,10 @@
"bh" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light/spot,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/shuttle/escape)
"bi" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bj" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"bk" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"bk" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bl" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "14"},/turf/simulated/floor/plating,/area/shuttle/escape)
"bm" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "17"},/turf/simulated/floor/plating,/area/shuttle/escape)
-"bn" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/space,/area/shuttle/escape)
+"bn" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bo" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
"bp" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/machinery/shower,/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
"bq" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
@@ -97,10 +97,10 @@ aaaaaaacakaialaiamacaaaaaa
aaaaabaeaialanalaoagadaaaa
aaaaapaqaralalasalarapaaaa
abatauatatatavatatatauatad
-apawaxayacazaAazaAaBaCaDap
-apaEaFaFaGaAaAaAaAaHaHaHap
-aIaFaJaKaLaAaAaMaNaNaOaPac
-aQatatataRaAaAaMaNaAaAaSap
+apawaxaKaKacaAazaAaBaCaDap
+apaEaFaFaFaGaAaAaAaHaHaHap
+aIaFaFaJaJaLaAaMaNaNaOaPac
+aQatatatatbkaAaMaNaAaAaSap
aTaAaAaAaAaAaAaMaNaAaAaUap
apaHaVaVaHaAaAaMaNaAaAaWap
aLaXaYaYaHaAaAaMaNaAaAaZaL
@@ -108,10 +108,11 @@ baaBbbbcaHaAaAaMaNaAaAbdba
aRaXaYaYaHaAaAaMaNaNaNaNaR
apaHbebeaHaAaAazaMaMaMbfap
bgaAaAaAaAbhaAbhaAaAaAaAac
-aQatatbiatbjatbjacbkblbmap
-bnbobobobobobpapbqbrbrbsap
+aQatatbiatbjatbjacbnblbmap
+aybobobobobobpapbqbrbrbsap
acbtbubvbubwbuapbxbrbrbyap
-apbzbubzbubAbBapbCbCbCbDap
+apbzbubzbubAbBapbCbrbCbDap
bEbFbGbGbGbHatbIbJbJbJbFbK
aabEbLbLbLbKaabEbLbLbLbKaa
"}
+
diff --git a/_maps/map_files/shuttles/emergency_clown.dmm b/_maps/map_files/shuttles/emergency_clown.dmm
index 4b1d1c8f79b..f8bf085bb50 100644
--- a/_maps/map_files/shuttles/emergency_clown.dmm
+++ b/_maps/map_files/shuttles/emergency_clown.dmm
@@ -48,10 +48,10 @@
"aV" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"aW" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aX" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"aY" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aY" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/noslip,/area/shuttle/escape)
"aZ" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "14"},/turf/simulated/floor/plating,/area/shuttle/escape)
"ba" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "17"},/turf/simulated/floor/plating,/area/shuttle/escape)
-"bb" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/space,/area/shuttle/escape)
+"bb" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
"bc" = (/obj/machinery/vending/clothing,/turf/simulated/floor/noslip,/area/shuttle/escape)
"bd" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/floor/noslip,/area/shuttle/escape)
"be" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/stool/bed/roller,/turf/simulated/floor/noslip,/area/shuttle/escape)
@@ -90,10 +90,11 @@ aJaDamaDaJaDapaDaJaDamaDaJ
aOaDamaDaOaDapaDaOaDamaDaO
araSamamamamamamamamamamar
aTamamamamaUamaUamamamamac
-aNaxaVaWaxaXacaXacaYaZbaar
-bbawawawbcaraaarbdawawbear
+aNaxaVaWaxaXacaXacbbaZbaar
+aYawawawbcaraaarbdawawbear
acbfawawbgaraaarbhawawbiar
-arbjbjbkblaraaarbmbmbmawar
+arbjbjbkblaraaarbmawbmawar
bnaAbobobobpaabqbrbrbraAbs
aabnbtbtbtbsaabnbtbtbtbsaa
"}
+
diff --git a/_maps/map_files/shuttles/emergency_cyb.dmm b/_maps/map_files/shuttles/emergency_cyb.dmm
index 562f7a9cbff..14a9b7b3788 100644
--- a/_maps/map_files/shuttles/emergency_cyb.dmm
+++ b/_maps/map_files/shuttles/emergency_cyb.dmm
@@ -25,7 +25,7 @@
"ay" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
"az" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"aA" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"aB" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aB" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"aC" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aD" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aE" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/floor/plating,/area/shuttle/escape)
@@ -38,7 +38,7 @@
"aL" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aM" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aN" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"aO" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"aO" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"aP" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape)
"aQ" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aR" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; timid = 1; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
@@ -50,10 +50,10 @@
"aX" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
"aY" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"ba" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access_txt = "2"},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
+"ba" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"bb" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "14"},/turf/simulated/floor/plating,/area/shuttle/escape)
"bc" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "17"},/turf/simulated/floor/plating,/area/shuttle/escape)
-"bd" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/space,/area/shuttle/escape)
+"bd" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
"be" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"bf" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape)
"bg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
@@ -82,10 +82,10 @@ aaaaaaacakalamalanacaaaaaa
aaaaabaeaoamamamapagadaaaa
aaaaaqarasamamatauamaqaaaa
abavawavavavaxavayavawavad
-aqazaAaBacaCamaDaEaCaFaDaq
-aqaGaHaHaIaJamaDaKaCamaLaq
-aMaHaNaOaEaCamaDaKaCamaDac
-aPavavavaQaCamaDaQaCamaDaq
+aqazaAaOaOacamaDaEaCaFaDaq
+aqaGaHaHaHaIamaDaKaCamaLaq
+aMaHaHaNaNaEamaDaKaCamaDac
+aPavavavavbaamaDaQaCamaDaq
aRamamamamamamamamamamaDaq
aqaSamaDaEaCamaDaEaCamaTaq
aEaCamaDaKaCamaDaKaCamaDaE
@@ -93,10 +93,11 @@ aKaCamaDaKaCamaDaKaCamaDaK
aQaCamaDaQaCamaDaQaCamaDaQ
aqaUamamamamamamamamamamaq
aVamamamamaWamaWamamamamac
-aPavaXaYavaZacaZacbabbbcaq
-bdbebebebfaqaaaqbgaJaJbhaq
+aPavaXaYavaZacaZacbdbbbcaq
+aBbebebebfaqaaaqbgaJaJbhaq
acbibebebjaqaaaqbkaJaJblaq
-aqbmbnboboaqaaaqbpbpbpaJaq
+aqbmbnboboaqaaaqbpaJbpaJaq
bqaybrbrbrbsaabtbububuaybv
aabqbwbwbwbvaabqbwbwbwbvaa
"}
+
diff --git a/_maps/map_files/shuttles/emergency_old.dmm b/_maps/map_files/shuttles/emergency_old.dmm
index db5b88cd337..faffa6374d1 100644
--- a/_maps/map_files/shuttles/emergency_old.dmm
+++ b/_maps/map_files/shuttles/emergency_old.dmm
@@ -31,7 +31,6 @@
"aE" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aF" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aG" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"aH" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aI" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"aJ" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/shuttle/escape)
"aK" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 9; height = 13; timid = 1; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape)
@@ -76,7 +75,7 @@ aaaaarasatananauavanaraaaa
abawaxawawawayawazawaxawad
araAaBaCaDaAanaCaDaAaBaCar
araEanaCaFaAanaCaFaAanaGar
-aHaIanaCaFaAanaCaFaAanaCac
+aWaIanaCaFaAanaCaFaAanaCac
araAanaCaJaAanaCaJaAanaCar
aKananananananananananaCar
araLanaCaDaAanaCaDaAanaMar
@@ -92,3 +91,4 @@ arbfaIaIbgaraaaYbhbhbhbhar
biazbjbjbjbkaablbmbmbmazbn
aabibobobobnaabibobobobnaa
"}
+
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index fad455ed438..47c5689054c 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -66,6 +66,10 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/update_icon()
return null
+/obj/machinery/atmospherics/proc/update_pipe_image()
+ pipe_image = image(src, loc, layer = 20, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view)
+ pipe_image.plane = HUD_PLANE
+
/obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0)
if(!istype(icon_manager))
if(!safety) //to prevent infinite loops
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 37ce3b19057..299d0c20e22 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -100,6 +100,8 @@
overlays += icon_manager.get_atmos_icon("device", , , vent_icon)
+ update_pipe_image()
+
/obj/machinery/atmospherics/unary/vent_pump/update_underlays()
if(..())
underlays.Cut()
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 244e9c26aa3..5554723c945 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -107,6 +107,7 @@
scrubber_icon = "scrubberweld"
overlays += icon_manager.get_atmos_icon("device", , , scrubber_icon)
+ update_pipe_image()
/obj/machinery/atmospherics/unary/vent_scrubber/update_underlays()
if(..())
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index e6804ee1f96..5e9815b7758 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -255,10 +255,11 @@
0, 0, 1, 0,\
0, 0, 0, 1)
-#define MATRIX_GREYSCALE list(0.3, 0.3, 0.3, 0,\
- 0.3, 0.3, 0.3, 0,\
- 0.3, 0.3, 0.3, 0,\
- 0, 0, 0, 1)
+#define MATRIX_GREYSCALE list(0.33, 0.33, 0.33, 0,\
+ 0.33, 0.33, 0.33, 0,\
+ 0.33, 0.33, 0.33, 0,\
+ 0.00, 0.00, 0.00, 1,\
+ 0.00, 0.00, 0.00, 0)
//Gun trigger guards
#define TRIGGER_GUARD_ALLOW_ALL -1
#define TRIGGER_GUARD_NONE 0
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index d39cc600221..05200eea7dd 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -27,3 +27,10 @@
#define DONATOR_PUBLIC 32768
#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC)
+
+// Playtime tracking system, see jobs_exp.dm
+#define EXP_TYPE_LIVING "Living"
+#define EXP_TYPE_CREW "Crew"
+#define EXP_TYPE_SPECIAL "Special"
+#define EXP_TYPE_GHOST "Ghost"
+#define EXP_TYPE_EXEMPT "Exempt"
\ No newline at end of file
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 53285c92fa1..f54726c4161 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -115,6 +115,7 @@
result += e
else
result = first - second
+
return result
/*
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 9e38a1b46e1..600dac2f273 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -33,4 +33,4 @@ var/global/list/shuttle_caller_list = list() //list of all communication cons
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
var/global/list/pinpointer_list = list() //list of all pinpointers. Used to change stuff they are pointing to all at once.
var/global/list/abductor_equipment = list() //list of all abductor equipment
-var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
+var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
\ No newline at end of file
diff --git a/code/controllers/Processes/nano_mob_hunter.dm b/code/controllers/Processes/nano_mob_hunter.dm
new file mode 100644
index 00000000000..469ce22651d
--- /dev/null
+++ b/code/controllers/Processes/nano_mob_hunter.dm
@@ -0,0 +1,157 @@
+var/global/datum/controller/process/mob_hunt/mob_hunt_server
+
+/datum/controller/process/mob_hunt
+ var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this
+ var/list/normal_spawns = list()
+ var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps
+ var/list/trap_spawns = list()
+ var/list/connected_clients = list()
+ var/server_status = 1 //1 is online, 0 is offline
+ var/reset_cooldown = 0 //number of controller cycles before the manual_reboot proc can be used again (ignored if server is offline so you can always boot back up)
+ var/obj/machinery/computer/mob_battle_terminal/red_terminal
+ var/obj/machinery/computer/mob_battle_terminal/blue_terminal
+ var/battle_turn = null
+
+/datum/controller/process/mob_hunt/setup()
+ name = "Nano-Mob Hunter GO Server"
+ start_delay = 20
+ mob_hunt_server = src
+
+/datum/controller/process/mob_hunt/doWork()
+ if(reset_cooldown) //if reset_cooldown is set (we are on cooldown, duh), reduce the remaining cooldown every cycle
+ reset_cooldown--
+ if(!server_status)
+ return
+ client_mob_update()
+ if(normal_spawns.len < max_normal_spawns)
+ spawn_mob()
+
+//leaving this here in case admins want to use it for a random mini-event or something
+/datum/controller/process/mob_hunt/proc/server_crash(recover_time = 3000)
+ server_status = 0
+ for(var/datum/data/pda/app/mob_hunter_game/client in connected_clients)
+ client.disconnect("Server Crash")
+ for(var/obj/effect/nanomob/N in trap_spawns)
+ N.despawn()
+ for(var/obj/effect/nanomob/N in normal_spawns)
+ N.despawn()
+ //just in case
+ normal_spawns.Cut()
+ trap_spawns.Cut()
+ connected_clients.Cut()
+ if(!isnum(recover_time))
+ recover_time = 3000
+ if(recover_time > 0) //when provided with a negative or zero valued recover_time argument, the server won't auto-restart but can be manually rebooted still
+ //set a timer to automatically recover after recover_time has passed (can be manually restarted if you get impatient too)
+ addtimer(src, "auto_recover", recover_time, TRUE)
+
+/datum/controller/process/mob_hunt/proc/client_mob_update()
+ var/list/ex_players = list()
+ for(var/datum/data/pda/app/mob_hunter_game/client in connected_clients)
+ var/mob/living/carbon/human/H = client.get_player()
+ if(connected_clients[client])
+ if(!H || H != connected_clients[client])
+ ex_players |= connected_clients[client]
+ connected_clients[client] = H
+ if(ex_players.len) //to make sure we don't do this if we didn't lose any player since the last update
+ for(var/obj/effect/nanomob/N in (normal_spawns + trap_spawns))
+ N.conceal(ex_players)
+
+/datum/controller/process/mob_hunt/proc/auto_recover()
+ if(server_status != 0)
+ return
+ server_status = 1
+ while(normal_spawns.len < max_normal_spawns) //repopulate the server's spawns completely if we auto-recover from crash
+ spawn_mob()
+
+/datum/controller/process/mob_hunt/proc/manual_reboot()
+ if(server_status && reset_cooldown)
+ return 0
+ for(var/obj/effect/nanomob/N in trap_spawns)
+ N.despawn()
+ for(var/obj/effect/nanomob/N in normal_spawns)
+ N.despawn()
+ server_status = 1
+ reset_cooldown = 25 //25 controller cycle cooldown for manual restarts
+ return 1
+
+/datum/controller/process/mob_hunt/proc/spawn_mob()
+ var/list/nanomob_types = subtypesof(/datum/mob_hunt)
+ var/datum/mob_hunt/mob_info = pick(nanomob_types)
+ new mob_info()
+
+/datum/controller/process/mob_hunt/proc/register_spawn(datum/mob_hunt/mob_info)
+ if(!mob_info)
+ return 0
+ var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(mob_info.spawn_point, mob_info)
+ normal_spawns += new_mob
+ new_mob.reveal()
+ return 1
+
+/datum/controller/process/mob_hunt/proc/register_trap(datum/mob_hunt/mob_info)
+ if(!mob_info)
+ return 0
+ if(!mob_info.is_trap)
+ return register_spawn(mob_info)
+ var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(mob_info.spawn_point, mob_info)
+ trap_spawns += new_mob
+ new_mob.reveal()
+ if(trap_spawns.len > max_trap_spawns)
+ var/obj/effect/nanomob/old_trap = trap_spawns[1]
+ old_trap.despawn()
+ return 1
+
+/datum/controller/process/mob_hunt/proc/start_check()
+ if(battle_turn) //somehow we got called mid-battle, so lets just stop now
+ return
+ if(red_terminal && red_terminal.ready && blue_terminal && blue_terminal.ready)
+ battle_turn = pick("Red", "Blue")
+ red_terminal.audible_message("Battle starting!", null, 5)
+ blue_terminal.audible_message("Battle starting!", null, 5)
+ if(battle_turn == "Red")
+ red_terminal.audible_message("Red Player's Turn!", null, 5)
+ else if(battle_turn == "Blue")
+ blue_terminal.audible_message("Blue Player's Turn!", null, 5)
+
+/datum/controller/process/mob_hunt/proc/launch_attack(team, raw_damage, datum/mob_type/attack_type)
+ if(!team || !raw_damage)
+ return
+ var/obj/machinery/computer/mob_battle_terminal/target = null
+ if(team == "Red")
+ target = blue_terminal
+ else if(team == "Blue")
+ target = red_terminal
+ else
+ return
+ target.receive_attack(raw_damage, attack_type)
+
+/datum/controller/process/mob_hunt/proc/end_battle(loser, surrender = 0)
+ var/obj/machinery/computer/mob_battle_terminal/winner_terminal = null
+ var/obj/machinery/computer/mob_battle_terminal/loser_terminal = null
+ if(loser == "Red")
+ loser_terminal = red_terminal
+ winner_terminal = blue_terminal
+ else if (loser == "Blue")
+ loser_terminal = blue_terminal
+ winner_terminal = red_terminal
+ battle_turn = null
+ winner_terminal.ready = 0
+ loser_terminal.ready = 0
+ if(surrender) //surrender doesn't give exp, to avoid people just farming exp without actually doing a battle
+ winner_terminal.audible_message("Your rival surrendered!", null, 2)
+ else
+ var/progress_message = winner_terminal.mob_info.gain_exp()
+ winner_terminal.audible_message("[winner_terminal.team] Player wins!", null, 5)
+ winner_terminal.audible_message(progress_message, null, 2)
+
+/datum/controller/process/mob_hunt/proc/end_turn()
+ red_terminal.updateUsrDialog()
+ blue_terminal.updateUsrDialog()
+ if(!battle_turn)
+ return
+ if(battle_turn == "Red")
+ battle_turn = "Blue"
+ blue_terminal.audible_message("Blue's turn.", null, 5)
+ else if(battle_turn == "Blue")
+ battle_turn = "Red"
+ blue_terminal.audible_message("Red's turn.", null, 5)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 9ac4a0eb4d6..763a9c7b08c 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -89,6 +89,8 @@
var/overflow_server_url
var/forbid_singulo_possession = 0
+ var/check_randomizer = 0
+
//game_options.txt configs
var/health_threshold_softcrit = 0
@@ -127,6 +129,10 @@
var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database
var/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database
+ var/use_exp_tracking = 0
+ var/use_exp_restrictions = 0
+ var/use_exp_restrictions_admin_bypass = 0
+
var/simultaneous_pm_warning_timeout = 100
var/assistant_maint = 0 //Do assistants get maint access?
@@ -140,6 +146,7 @@
var/main_irc = ""
var/admin_irc = ""
var/admin_notify_irc = ""
+ var/cidrandomizer_irc = ""
var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
var/default_laws = 0 //Controls what laws the AI spawns with.
@@ -240,6 +247,15 @@
if("use_age_restriction_for_antags")
config.use_age_restriction_for_antags = 1
+ if("use_exp_tracking")
+ config.use_exp_tracking = 1
+
+ if("use_exp_restrictions")
+ config.use_exp_restrictions = 1
+
+ if("use_exp_restrictions_admin_bypass")
+ config.use_exp_restrictions_admin_bypass = 1
+
if("jobs_have_minimal_access")
config.jobs_have_minimal_access = 1
@@ -405,6 +421,9 @@
if("forbid_singulo_possession")
forbid_singulo_possession = 1
+ if("check_randomizer")
+ check_randomizer = 1
+
if("popup_admin_pm")
config.popup_admin_pm = 1
@@ -472,6 +491,9 @@
if("admin_notify_irc")
config.admin_notify_irc = value
+ if("cidrandomizer_irc")
+ config.cidrandomizer_irc = value
+
if("python_path")
if(value)
config.python_path = value
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 3aa638aa40f..a7678e1d261 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -18,7 +18,7 @@
return
-/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote"))
+/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Mob Hunt Server"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -76,6 +76,9 @@
if("Vote")
debug_variables(vote)
feedback_add_details("admin_verb","DVote")
+ if("Mob Hunt Server")
+ debug_variables(mob_hunt_server)
+ feedback_add_details("admin_verb","DMobHuntServer")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index a8846f2134a..0384276a5e6 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -17,7 +17,8 @@
access_heads, access_construction, access_sec_doors,
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_minisat, access_mechanic, access_mineral_storeroom)
minimal_player_age = 21
-
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -51,7 +52,6 @@
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_mineral_storeroom)
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
minimal_player_age = 7
-
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
@@ -83,7 +83,6 @@
minimal_access = list(access_eva, access_atmospherics, access_maint_tunnels, access_external_airlocks, access_emergency_storage, access_construction, access_mineral_storeroom)
alt_titles = list("Atmospheric Technician")
minimal_player_age = 7
-
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 104ed27bc05..52a33e0f0fb 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -41,6 +41,9 @@
//If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
var/minimal_player_age = 0
+ var/exp_requirements = 0
+ var/exp_type = ""
+
var/admin_only = 0
var/spawn_ert = 0
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 1baceb6a57e..64b34a4fa79 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -15,6 +15,8 @@
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels, access_paramedic, access_mineral_storeroom)
minimal_player_age = 21
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -109,7 +111,6 @@
alt_titles = list("Pharmacist","Pharmacologist")
minimal_player_age = 7
-
equip(var/mob/living/carbon/human/H)
if(!H) return 0
switch(H.backbag)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index f03f5b4c0a1..7ea2eb5464f 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -17,6 +17,8 @@
access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom)
minimal_player_age = 21
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
// All science-y guys get bonuses for maxing out their tech.
required_objectives=list(
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 47532f8d081..19539a83f4e 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -17,6 +17,8 @@
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_pilot, access_weapons)
minimal_player_age = 21
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -56,6 +58,8 @@
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_weapons)
minimal_player_age = 21
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -98,6 +102,8 @@
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
alt_titles = list("Forensic Technician")
minimal_player_age = 14
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
@@ -148,6 +154,8 @@
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons)
minimal_player_age = 14
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 7bb2b006f87..eedb50a8412 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -8,6 +8,8 @@
supervisors = "your laws"
req_admin_notify = 1
minimal_player_age = 30
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -15,7 +17,7 @@
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
-
+
/datum/job/cyborg
title = "Cyborg"
@@ -26,6 +28,8 @@
supervisors = "your laws and the AI" //Nodrak
selection_color = "#ddffdd"
minimal_player_age = 21
+ exp_requirements = 300
+ exp_type = EXP_TYPE_CREW
alt_titles = list("Android", "Robot")
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 66f0ddb2c65..586fd27d639 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -12,6 +12,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access = list() //See get_access()
minimal_access = list() //See get_access()
minimal_player_age = 30
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(H), slot_l_ear)
@@ -56,6 +58,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
minimal_player_age = 21
+ exp_requirements = 600
+ exp_type = EXP_TYPE_CREW
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 9073f56ceb3..93d048ce96e 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -123,6 +123,9 @@ var/global/datum/controller/occupations/job_master
if(job.admin_only) // No admin positions either.
continue
+ if(job.available_in_playtime(player.client))
+ continue
+
if(jobban_isbanned(player, job.title))
Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
continue
diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm
new file mode 100644
index 00000000000..520b1182e49
--- /dev/null
+++ b/code/game/jobs/job_exp.dm
@@ -0,0 +1,190 @@
+// Admin Verbs
+
+/client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are.
+ set category = "Admin"
+ set name = "Check Player Playtime"
+ if(!check_rights(R_ADMIN))
+ return
+ var/msg = "
Playtime ReportPlaytime:
"
+ src << browse(msg, "window=Player_playtime_check")
+
+
+/datum/admins/proc/cmd_show_exp_panel(var/client/C)
+ if(!C)
+ to_chat(usr, "ERROR: Client not found.")
+ return
+ if(!check_rights(R_ADMIN))
+ return
+ var/body = "Playtime for [C.key]
Playtime:"
+ body += C.get_exp_report()
+ body += ""
+ usr << browse(body, "window=playerplaytime[C.ckey];size=550x615")
+
+
+// Procs
+
+
+/datum/job/proc/available_in_playtime(client/C)
+ if(!C)
+ return 0
+ if(!exp_requirements || !exp_type)
+ return 0
+ if(!config.use_exp_restrictions)
+ return 0
+ if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, C.mob))
+ return 0
+ var/list/play_records = params2list(C.prefs.exp)
+ var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT])
+ if(isexempt)
+ return 0
+ var/my_exp = text2num(play_records[get_exp_req_type()])
+ var/job_requirement = text2num(get_exp_req_amount())
+ if(my_exp >= job_requirement)
+ return 0
+ else
+ return (job_requirement - my_exp)
+
+/datum/job/proc/get_exp_req_amount()
+ return exp_requirements
+
+/datum/job/proc/get_exp_req_type()
+ return exp_type
+
+/mob/proc/get_exp_report()
+ if(client)
+ return client.get_exp_report()
+ else
+ return "[src] has no client."
+
+/client/proc/get_exp_report()
+ if(!config.use_exp_tracking)
+ return "Tracking is disabled in the server configuration file."
+ var/list/play_records = params2list(prefs.exp)
+ if(!play_records.len)
+ return "[key] has no records."
+ var/return_text = ""
+ var/list/exp_data = list()
+ for(var/category in exp_jobsmap)
+ if(text2num(play_records[category]))
+ exp_data[category] = text2num(play_records[category])
+ else
+ exp_data[category] = 0
+ for(var/dep in exp_data)
+ if(exp_data[dep] > 0)
+ if(dep == EXP_TYPE_EXEMPT)
+ return_text += "- Exempt (all jobs auto-unlocked)
"
+ else if(exp_data[EXP_TYPE_LIVING] > 0)
+ var/my_pc = num2text(round(exp_data[dep]/exp_data[EXP_TYPE_LIVING]*100))
+ return_text += "- [dep] [get_exp_format(exp_data[dep])] ([my_pc]%)
"
+ else
+ return_text += "- [dep] [get_exp_format(exp_data[dep])]
"
+ if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, mob))
+ return_text += "- Admin (all jobs auto-unlocked)
"
+ return_text += "
"
+ var/list/jobs_locked = list()
+ var/list/jobs_unlocked = list()
+ for(var/datum/job/job in job_master.occupations)
+ if(job.exp_requirements && job.exp_type)
+ if(!job.available_in_playtime(mob.client))
+ jobs_unlocked += job.title
+ else
+ var/xp_req = job.get_exp_req_amount()
+ jobs_locked += "[job.title] [get_exp_format(text2num(play_records[job.get_exp_req_type()]))] / [get_exp_format(xp_req)] as [job.get_exp_req_type()])"
+ if(jobs_unlocked.len)
+ return_text += "
Jobs Unlocked:- "
+ return_text += jobs_unlocked.Join("
- ")
+ return_text += "
"
+ if(jobs_locked.len)
+ return_text += "
Jobs Not Unlocked:- "
+ return_text += jobs_locked.Join("
- ")
+ return_text += "
"
+ return return_text
+
+
+/client/proc/get_exp_living()
+ var/list/play_records = params2list(prefs.exp)
+ var/exp_living = text2num(play_records[EXP_TYPE_LIVING])
+ return get_exp_format(exp_living)
+
+/proc/get_exp_format(var/expnum)
+ if(expnum > 60)
+ return num2text(round(expnum / 60)) + "h"
+ else if(expnum > 0)
+ return num2text(expnum) + "m"
+ else
+ return "0h"
+
+/proc/update_exp(var/mins, var/ann = 0)
+ if(!establish_db_connection())
+ return -1
+ spawn(0)
+ for(var/client/L in clients)
+ if(L.inactivity >= (10 MINUTES))
+ continue
+ spawn(0)
+ L.update_exp_client(mins, ann)
+ sleep(10)
+
+/client/proc/update_exp_client(var/minutes, var/announce_changes = 0)
+ if(!src ||!ckey)
+ return
+ var/DBQuery/exp_read = dbcon.NewQuery("SELECT exp FROM [format_table_name("player")] WHERE ckey='[ckey]'")
+ if(!exp_read.Execute())
+ var/err = exp_read.ErrorMsg()
+ log_game("SQL ERROR during exp_update_client read. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during exp_update_client read. Error : \[[err]\]\n")
+ return
+ var/list/read_records = list()
+ var/hasread = 0
+ while(exp_read.NextRow())
+ read_records = params2list(exp_read.item[1])
+ hasread = 1
+ if(!hasread)
+ return
+ var/list/play_records = list()
+ for(var/rtype in exp_jobsmap)
+ if(text2num(read_records[rtype]))
+ play_records[rtype] = text2num(read_records[rtype])
+ else
+ play_records[rtype] = 0
+ if(mob.stat == CONSCIOUS && mob.mind.assigned_role)
+ play_records[EXP_TYPE_LIVING] += minutes
+ if(announce_changes)
+ to_chat(mob,"You got: [minutes] Living EXP!")
+ for(var/category in exp_jobsmap)
+ if(exp_jobsmap[category]["titles"])
+ if(mob.mind.assigned_role in exp_jobsmap[category]["titles"])
+ play_records[category] += minutes
+ if(announce_changes)
+ to_chat(mob,"You got: [minutes] [category] EXP!")
+ if(mob.mind.special_role)
+ play_records[EXP_TYPE_SPECIAL] += minutes
+ if(announce_changes)
+ to_chat(mob,"You got: [minutes] Special EXP!")
+ else if(isobserver(mob))
+ play_records[EXP_TYPE_GHOST] += minutes
+ if(announce_changes)
+ to_chat(mob,"You got: [minutes] Ghost EXP!")
+ else
+ return
+ var/new_exp = list2params(play_records)
+ prefs.exp = new_exp
+ new_exp = sanitizeSQL(new_exp)
+ var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("player")] SET exp = '[new_exp]' WHERE ckey='[ckey]'")
+ if(!update_query.Execute())
+ var/err = update_query.ErrorMsg()
+ log_game("SQL ERROR during exp_update_client write. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during exp_update_client write. Error : \[[err]\]\n")
+ return
+
+/hook/roundstart/proc/exptimer()
+ if(!config.sql_enabled || !config.use_exp_tracking)
+ return 1
+ spawn(0)
+ while(TRUE)
+ sleep(5 MINUTES)
+ update_exp(5,0)
+ return 1
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index 6af69ebed9d..73f5cc2e5b0 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -183,3 +183,10 @@ var/list/whitelisted_positions = list(
return titles
+var/global/list/exp_jobsmap = list(
+ EXP_TYPE_LIVING = list(), // all living mobs
+ EXP_TYPE_CREW = list(titles = command_positions | engineering_positions | medical_positions | science_positions | support_positions | supply_positions | security_positions | civilian_positions | list("AI","Cyborg") | whitelisted_positions), // crew positions
+ EXP_TYPE_SPECIAL = list(), // antags, ERT, etc
+ EXP_TYPE_GHOST = list(), // dead people, observers
+ EXP_TYPE_EXEMPT = list() // special grandfather setting
+)
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index 8a8c7a04114..542ed8b47b4 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -109,7 +109,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/atmospherics/unary/cold_sink/freezer/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/atmospherics/unary/cold_sink/freezer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["on"] = on ? 1 : 0
data["gasPressure"] = round(air_contents.return_pressure())
@@ -267,7 +267,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/atmospherics/unary/heat_reservoir/heater/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["on"] = on ? 1 : 0
data["gasPressure"] = round(air_contents.return_pressure())
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 566fc4f80ff..a5db47222e6 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -696,7 +696,7 @@
data["danger"] = danger
return data
-/obj/machinery/alarm/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/alarm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/list/href_list = state.href_list()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index a7d62d74b94..65f6fb7b09d 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -131,7 +131,7 @@ var/datum/canister_icons/canister_icon_container = new()
var/list/LL = L[i]
LL = LL.Copy() //make sure we don't edit the datum list
LL.Add(list("active" = decals[LL["icon"]])) //"active" used by nanoUI
- possibledecals[i] = LL
+ possibledecals.Add(LL)
/obj/machinery/portable_atmospherics/canister/proc/check_change()
var/old_flag = update_flag
@@ -181,6 +181,7 @@ update_flag
if(src.destroyed)
src.overlays = 0
src.icon_state = text("[]-1", src.canister_color["prim"])//yes, I KNOW the colours don't reflect when the can's borked, whatever.
+ return
if(icon_state != src.canister_color["prim"])
icon_state = src.canister_color["prim"]
@@ -420,9 +421,9 @@ update_flag
data["hasHoldingTank"] = holding ? 1 : 0
if(holding)
- data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure()))
-
- return data
+ data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure()))
+
+ return data
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
if(..())
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 8f7f6d72bb4..acdb4d30aa0 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -117,7 +117,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/portable_atmospherics/pump/ui_data(mob/user, datum/topic_state/state = physical_state)
+/obj/machinery/portable_atmospherics/pump/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state)
var/data[0]
data["portConnected"] = connected_port ? 1 : 0
data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index de5ac2dc49d..044023c394a 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -128,7 +128,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/portable_atmospherics/scrubber/ui_data(mob/user, datum/topic_state/state = physical_state)
+/obj/machinery/portable_atmospherics/scrubber/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state)
var/data[0]
data["portConnected"] = connected_port ? 1 : 0
data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 1c40370f56d..31700f8c2d3 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -92,7 +92,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/computer/operating/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/operating/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/mob/living/carbon/human/occupant = src.table.victim
data["hasOccupant"] = occupant ? 1 : 0
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 7dd5075d28e..f42e50d9618 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -1,14 +1,14 @@
/obj/machinery/computer/security
name = "security camera console"
desc = "Used to access the various cameras networks on the station."
-
+
icon_keyboard = "security_key"
icon_screen = "cameras"
light_color = LIGHT_COLOR_RED
circuit = /obj/item/weapon/circuitboard/camera
-
+
var/mapping = 0 // For the overview file (overview.dm), not used on this page
-
+
var/list/network = list()
var/list/available_networks = list()
var/list/watchers = list() //who's using the console, associated with the camera they're on.
@@ -16,7 +16,7 @@
/obj/machinery/computer/security/New() // Lists existing networks and their required access. Format: available_networks[] = list()
generate_network_access()
..()
-
+
/obj/machinery/computer/security/proc/generate_network_access()
available_networks["SS13"] = list(access_hos,access_captain)
available_networks["Telecomms"] = list(access_hos,access_captain)
@@ -39,7 +39,7 @@
available_networks["ERT"] = list(access_cent_specops_commander,access_cent_commander)
available_networks["CentComm"] = list(access_cent_security,access_cent_commander)
available_networks["Thunderdome"] = list(access_cent_thunder,access_cent_commander)
-
+
/obj/machinery/computer/security/Destroy()
if(watchers.len)
for(var/mob/M in watchers)
@@ -58,11 +58,11 @@
user.unset_machine()
return
return 1
-
+
/obj/machinery/computer/security/on_unset_machine(mob/user)
watchers.Remove(user)
user.reset_perspective(null)
-
+
/obj/machinery/computer/security/attack_hand(mob/user)
if(stat || ..())
user.unset_machine()
@@ -83,7 +83,7 @@
attack_hand(user)
else
attack_hand(user)
-
+
/obj/machinery.computer/security/proc/get_user_access(mob/user)
var/list/access = list()
if(ishuman(user))
@@ -105,8 +105,8 @@
ui.add_template("mapHeader", "sec_camera_map_header.tmpl")
ui.open()
-
-/obj/machinery/computer/security/ui_data(mob/user, datum/topic_state/state = default_state)
+
+/obj/machinery/computer/security/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/list/cameras = list()
@@ -126,7 +126,7 @@
cameras.Swap(j, j + 1)
data["cameras"] = cameras
-
+
var/list/access = get_user_access(user)
if(emagged)
access = get_all_accesses() // Assume captain level access when emagged
@@ -149,8 +149,8 @@
data["current"] = null
if(watchers[user])
var/obj/machinery/camera/watched = watchers[user]
- data["current"] = watched.nano_structure()
-
+ data["current"] = watched.nano_structure()
+
return data
/obj/machinery/computer/security/Topic(href, href_list)
@@ -162,7 +162,7 @@
var/obj/machinery/camera/C = locate(href_list["switchTo"]) in cameranet.cameras
if(!C)
return 1
-
+
switch_to_camera(usr, C)
else if(href_list["reset"])
@@ -180,31 +180,31 @@
else
network += net
break
-
+
nanomanager.update_uis(src)
// Check if camera is accessible when jumping
/obj/machinery/computer/security/proc/can_access_camera(var/obj/machinery/camera/C, var/mob/M)
if(CanUseTopic(M, default_state) != STATUS_INTERACTIVE || M.incapacitated() || M.blinded)
return 0
-
+
if(isrobot(M))
var/list/viewing = viewers(src)
if(!viewing.Find(M))
return 0
-
+
if(isAI(M))
var/mob/living/silicon/ai/A = M
if(!A.is_in_chassis())
return 0
-
+
if(!issilicon(M) && !Adjacent(M))
return 0
-
+
var/list/shared_networks = network & C.network
if(!shared_networks.len || !C.can_use())
return 0
-
+
return 1
// Switching to cameras
@@ -212,7 +212,7 @@
if(!can_access_camera(C, user))
user.unset_machine()
return 1
-
+
if(isAI(user))
var/mob/living/silicon/ai/A = user
A.eyeobj.setLoc(get_turf(C))
@@ -226,12 +226,12 @@
/obj/machinery/computer/security/proc/jump_on_click(var/mob/user, var/A)
if(user.machine != src)
return
-
+
var/obj/machinery/camera/jump_to
-
+
if(istype(A, /obj/machinery/camera))
jump_to = A
-
+
else if(ismob(A))
if(ishuman(A))
var/mob/living/carbon/human/H = A
@@ -239,11 +239,11 @@
else if(isrobot(A))
var/mob/living/silicon/robot/R = A
jump_to = R.camera
-
+
else if(isobj(A))
var/obj/O = A
jump_to = locate() in O
-
+
else if(isturf(A))
var/best_dist = INFINITY
for(var/obj/machinery/camera/camera in get_area(A))
@@ -255,10 +255,10 @@
if(dist < best_dist)
best_dist = dist
jump_to = camera
-
+
if(isnull(jump_to))
return
-
+
if(can_access_camera(jump_to, user))
switch_to_camera(user, jump_to)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index a33d3aa02eb..ebba68ec570 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -181,7 +181,7 @@ var/time_last_changed_position = 0
ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 775, 700)
ui.open()
-/obj/machinery/computer/card/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/card/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["src"] = UID()
data["station_name"] = station_name()
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 847f20a3f23..0d47420edc9 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -127,7 +127,7 @@
ui = new(user, src, ui_key, "cloning_console.tmpl", "Cloning Console UI", 640, 520)
ui.open()
-/obj/machinery/computer/cloning/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/cloning/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["menu"] = src.menu
data["scanner"] = sanitize("[src.scanner]")
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 7420aaaa24a..86a8b2d2bcf 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -276,6 +276,18 @@
src.emagged = 0
setMenuState(usr,COMM_SCREEN_MAIN)
+ if("RestartNanoMob")
+ if(mob_hunt_server)
+ if(mob_hunt_server.manual_reboot())
+ var/loading_msg = pick("Respawning spawns", "Reticulating splines", "Flipping hat",
+ "Capturing all of them", "Fixing minor text issues", "Being the very best",
+ "Nerfing this", "Not communicating with playerbase", "Coding a ripoff in a 2D spaceman game")
+ to_chat(usr, "Restarting Nano-Mob Hunter GO! game server. [loading_msg]...")
+ else
+ to_chat(usr, "Nano-Mob Hunter GO! game server reboot failed due to recent restart. Please wait before re-attempting.")
+ else
+ to_chat(usr, "Nano-Mob Hunter GO! game server is offline for extended maintenance. Contact your Central Command administrators for more info if desired.")
+
if("AcceptDocking")
to_chat(usr, "Docking request accepted!")
trade_dock_timelimit = world.time + 1200
@@ -322,7 +334,7 @@
// open the new ui window
ui.open()
-/obj/machinery/computer/communications/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/communications/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["is_ai"] = isAI(user)||isrobot(user)
data["menu_state"] = data["is_ai"] ? ai_menu_state : menu_state
diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm
index 8664d786a24..75bad25bfab 100644
--- a/code/game/machinery/computer/pod_tracking_console.dm
+++ b/code/game/machinery/computer/pod_tracking_console.dm
@@ -20,7 +20,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/computer/podtracker/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/podtracker/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/list/pods[0]
for(var/obj/item/device/spacepod_equipment/misc/tracker/TR in world)
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index a195ad253df..5235fffd9ba 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -41,7 +41,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/computer/robotics/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/robotics/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/list/robots = get_cyborgs(user)
if(robots.len)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index f42650a8e86..0b078a74ec8 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -190,7 +190,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/atmospherics/unary/cryo_cell/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/atmospherics/unary/cryo_cell/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["isOperating"] = on
data["hasOccupant"] = occupant ? 1 : 0
diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm
index d9be59bde59..99b5189e206 100644
--- a/code/game/machinery/embedded_controller/airlock_controllers.dm
+++ b/code/game/machinery/embedded_controller/airlock_controllers.dm
@@ -27,7 +27,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data = list(
@@ -83,7 +83,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data = list(
@@ -146,7 +146,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data = list(
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index b1f7d33244d..3e77a7548b3 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -180,7 +180,7 @@ FIRE ALARM
ui.open()
ui.set_auto_update(1)
-/obj/machinery/firealarm/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/firealarm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/area/A = get_area(src)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 519a7177d7a..60ce5e32a34 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -154,7 +154,7 @@ Class Procs:
if(use_power && stat == 0)
use_power(7500/severity)
- new/obj/effect/overlay/temp/emp(src.loc)
+ new/obj/effect/overlay/temp/emp(loc)
..()
/obj/machinery/ex_act(severity)
@@ -184,9 +184,9 @@ Class Procs:
/obj/machinery/proc/auto_use_power()
if(!powered(power_channel))
return 0
- if(src.use_power == 1)
+ if(use_power == 1)
use_power(idle_power_usage,power_channel, 1)
- else if(src.use_power >= 2)
+ else if(use_power >= 2)
use_power(active_power_usage,power_channel, 1)
return 1
@@ -229,7 +229,7 @@ Class Procs:
if(!(href_list["set_tag"] in vars))
to_chat(usr, "Something went wrong: Unable to find [href_list["set_tag"]] in vars!")
return 1
- var/current_tag = src.vars[href_list["set_tag"]]
+ var/current_tag = vars[href_list["set_tag"]]
var/newid = copytext(reject_bad_text(input(usr, "Specify the new value", src, current_tag) as null|text),1,MAX_MESSAGE_LEN)
if(newid)
vars[href_list["set_tag"]] = newid
@@ -355,13 +355,13 @@ Class Procs:
return 1
if(panel_open)
- src.add_fingerprint(user)
+ add_fingerprint(user)
return 0
if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT))
return 1
- src.add_fingerprint(user)
+ add_fingerprint(user)
return ..()
@@ -379,8 +379,8 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/weapon/crowbar/C, var/ignore_panel = 0)
if(istype(C) && (panel_open || ignore_panel))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
+ playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
M.state = 2
M.icon_state = "box_1"
for(var/obj/item/I in component_parts)
@@ -393,7 +393,7 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S)
if(istype(S))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(!panel_open)
panel_open = 1
icon_state = icon_state_open
@@ -407,7 +407,7 @@ Class Procs:
/obj/machinery/proc/default_change_direction_wrench(var/mob/user, var/obj/item/weapon/wrench/W)
if(panel_open && istype(W))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
dir = turn(dir,-90)
to_chat(user, "You rotate [src].")
return 1
@@ -416,11 +416,14 @@ Class Procs:
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
if(istype(W))
to_chat(user, "Now [anchored ? "un" : ""]securing [name].")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, time, target = src))
to_chat(user, "You've [anchored ? "un" : ""]secured [name].")
anchored = !anchored
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(istype(src, /obj/machinery))
+ var/obj/machinery/M = src
+ M.power_change() //Turn on or off the machine depending on the status of power in the new area.
+ playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
return 1
return 0
@@ -506,7 +509,7 @@ Class Procs:
if(check_access && !allowed(perp))
threatcount += 4
- if(auth_weapons && !src.allowed(perp))
+ if(auth_weapons && !allowed(perp))
if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee))
threatcount += 4
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 80f5e8be5d7..db60adb5c9a 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -135,7 +135,7 @@
ui = new(user, src, ui_key, "poolcontroller.tmpl", "Pool Controller Interface", 520, 410)
ui.open()
-/obj/machinery/poolcontroller/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/poolcontroller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["currentTemp"] = temperature
diff --git a/code/game/machinery/portable_tag_turret.dm b/code/game/machinery/portable_tag_turret.dm
index de78d46178f..1944da8f071 100644
--- a/code/game/machinery/portable_tag_turret.dm
+++ b/code/game/machinery/portable_tag_turret.dm
@@ -49,7 +49,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/porta_turret/tag/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/porta_turret/tag/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["access"] = !isLocked(user)
data["locked"] = locked
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index a6eb360f45d..17fe32f39ec 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -200,7 +200,7 @@ var/list/turret_icons
ui.open()
ui.set_auto_update(1)
-/obj/machinery/porta_turret/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/porta_turret/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["access"] = !isLocked(user)
data["screen"] = screen
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 9de1806852f..704da886685 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -115,7 +115,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
ui.open()
ui.set_auto_update(1)
-/obj/machinery/requests_console/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/requests_console/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["department"] = department
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index c72e987cd92..1c6dcf6322e 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -28,7 +28,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/slot_machine/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/slot_machine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["working"] = working
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 0fec852c2f5..843002a804d 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -75,7 +75,7 @@
ui = new(user, src, ui_key, "teleporter_console.tmpl", "Teleporter Console UI", 400, 400)
ui.open()
-/obj/machinery/computer/teleporter/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/teleporter/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["powerstation"] = power_station
if(power_station)
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index eda38ee6120..21da8c4159c 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -125,7 +125,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/turretid/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/turretid/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["access"] = !isLocked(user)
data["locked"] = locked
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ed6a23998c4..4ec9471a36a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -416,7 +416,7 @@
ui = new(user, src, ui_key, "vending_machine.tmpl", src.name, 440, 600)
ui.open()
-/obj/machinery/vending/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/vending/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/list/data = list()
if(currently_vending)
data["mode"] = 1
@@ -834,11 +834,11 @@
product_slogans = "Carts to go!"
icon_state = "cart"
icon_deny = "cart-deny"
- products = list(/obj/item/device/pda =10,/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/chemistry = 10,
+ products = list(/obj/item/device/pda =10,/obj/item/weapon/cartridge/mob_hunt_game = 25,/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/chemistry = 10,
/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/atmos = 10,/obj/item/weapon/cartridge/janitor = 10,
/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/weapon/cartridge/signal = 10)
contraband = list(/obj/item/weapon/cartridge/clown = 1,/obj/item/weapon/cartridge/mime = 1)
- prices = list(/obj/item/device/pda =300,/obj/item/weapon/cartridge/medical = 200,/obj/item/weapon/cartridge/chemistry = 150,/obj/item/weapon/cartridge/engineering = 100,
+ prices = list(/obj/item/device/pda =300,/obj/item/weapon/cartridge/mob_hunt_game = 50,/obj/item/weapon/cartridge/medical = 200,/obj/item/weapon/cartridge/chemistry = 150,/obj/item/weapon/cartridge/engineering = 100,
/obj/item/weapon/cartridge/atmos = 75,/obj/item/weapon/cartridge/janitor = 100,/obj/item/weapon/cartridge/signal/toxins = 150,
/obj/item/weapon/cartridge/signal = 75)
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index ea8a06961cc..24b6b1822d9 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -155,7 +155,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/computer/mech_bay_power_console/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/mech_bay_power_console/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
if(!recharge_port)
reconnect()
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 6838aae1b29..11c940f7971 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -23,7 +23,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/computer/mecha/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/mecha/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["screen"] = screen
if(screen == 0)
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index ab897d80ec0..0d02add30a3 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -48,7 +48,7 @@
ui.set_auto_update(1)
-/obj/item/device/aicard/ui_data(mob/user, datum/topic_state/state = inventory_state)
+/obj/item/device/aicard/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
var/data[0]
var/mob/living/silicon/ai/AI = locate() in src
diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm
index 73831d1f468..eaf1c668e3c 100644
--- a/code/game/objects/items/devices/guitar.dm
+++ b/code/game/objects/items/devices/guitar.dm
@@ -33,8 +33,8 @@
song.ui_interact(user, ui_key, ui, force_open)
-/obj/item/device/guitar/ui_data(mob/user, datum/topic_state/state = default_state)
- return song.ui_data(user, state)
+/obj/item/device/guitar/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ return song.ui_data(user, ui_key, state)
/obj/item/device/guitar/Topic(href, href_list)
song.Topic(href, href_list)
@@ -46,4 +46,4 @@
/obj/item/stack/cable_coil = 6,
/obj/item/stack/tape_roll = 5)
tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters)
- time = 80
\ No newline at end of file
+ time = 80
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 51859fd27ac..35848bdc087 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -105,7 +105,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/item/device/radio/electropack/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/item/device/radio/electropack/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["power"] = on
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 6078f855b61..f4f95559ad9 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -114,7 +114,7 @@ var/global/list/default_medbay_channels = list(
ui.open()
ui.set_auto_update(1)
-/obj/item/device/radio/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/item/device/radio/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["mic_status"] = broadcasting
@@ -757,7 +757,7 @@ var/global/list/default_medbay_channels = list(
ui.open()
ui.set_auto_update(1)
-/obj/item/device/radio/borg/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/item/device/radio/borg/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["mic_status"] = broadcasting
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 84b397780dc..f126910bcbb 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -101,7 +101,7 @@
// auto update every Master Controller tick
//ui.set_auto_update(1)
-/obj/item/device/transfer_valve/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/item/device/transfer_valve/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["attachmentOne"] = tank_one ? tank_one.name : null
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index d29e5e5ede4..0c21ef212c9 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -198,7 +198,7 @@ var/list/world_uplinks = list()
// open the new ui window
ui.open()
-/obj/item/device/uplink/hidden/ui_data(mob/user, datum/topic_state/state = inventory_state)
+/obj/item/device/uplink/hidden/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
var/data[0]
data["welcome"] = welcome
diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm
index 7802e832fde..323fb3db4f4 100644
--- a/code/game/objects/items/devices/violin.dm
+++ b/code/game/objects/items/devices/violin.dm
@@ -38,8 +38,8 @@
song.ui_interact(user, ui_key, ui, force_open)
-/obj/item/device/violin/ui_data(mob/user, datum/topic_state/state = default_state)
- return song.ui_data(user, state)
+/obj/item/device/violin/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ return song.ui_data(user, ui_key, state)
/obj/item/device/violin/Topic(href, href_list)
song.Topic(href, href_list)
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 0a503aa7cb9..088c26f06c2 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -89,7 +89,7 @@ RCD
ui.open()
ui.set_auto_update(1)
-/obj/item/weapon/rcd/ui_data(mob/user, datum/topic_state/state = inventory_state)
+/obj/item/weapon/rcd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
var/data[0]
data["mode"] = mode
data["door_type"] = door_type
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 5dbcc68ab2b..a61a3cea5ce 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -152,7 +152,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/item/weapon/tank/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/item/weapon/tank/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/using_internal
if(iscarbon(loc))
var/mob/living/carbon/C = loc
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index c28ebe05c55..f1d9b6ac578 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -122,7 +122,7 @@
ui.open()
ui.set_auto_update(1)
-/datum/song/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/song/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["lines"] = lines
@@ -296,8 +296,8 @@
song.ui_interact(user, ui_key, ui, force_open)
-/obj/structure/piano/ui_data(mob/user, datum/topic_state/state = default_state)
- return song.ui_data(user, state)
+/obj/structure/piano/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ return song.ui_data(user, ui_key, state)
/obj/structure/piano/Topic(href, href_list)
song.Topic(href, href_list)
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index a247e35a86f..cf1a1303025 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -120,10 +120,11 @@
return 0
var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter
if(!B)
- blood_splatter(src,M.get_blood(M.vessel),1)
- B = locate(/obj/effect/decal/cleanable/blood) in contents
- B.add_blood_list(M)
- return 1 //we bloodied the floor
+ B = blood_splatter(src,M.get_blood(M.vessel),1)
+ if(B)
+ B.add_blood_list(M)
+ return 1 //we bloodied the floor
+ return 0 // Clean floors club
// Only adds blood on the floor -- Skie
/turf/simulated/add_blood_floor(mob/living/carbon/M as mob)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 72de785456e..88a0c7708f0 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -41,7 +41,8 @@ var/global/nologevent = 0
body += "Options panel for [M]"
if(M.client)
body += " played by [M.client] "
- body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]"
+ body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\] "
+ body += "\[" + M.client.get_exp_living() + "\]"
if(istype(M, /mob/new_player))
body += " Hasn't Entered Game "
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 565f37961dd..c56b3c7404f 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -74,6 +74,7 @@ var/list/admin_verbs_admin = list(
/client/proc/debug_variables,
/client/proc/show_snpc_verbs,
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
+ /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */
/client/proc/toggle_mentor_chat
)
var/list/admin_verbs_ban = list(
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index dad2e0547de..1efb3567828 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1996,6 +1996,15 @@
fax_panel(usr)
+ else if(href_list["getplaytimewindow"])
+ if(!check_rights(R_ADMIN))
+ return
+ var/mob/M = locateUID(href_list["getplaytimewindow"])
+ if(!M)
+ to_chat(usr, "ERROR: Mob not found.")
+ return
+ cmd_show_exp_panel(M.client)
+
else if(href_list["jumpto"])
if(!check_rights(R_ADMIN)) return
diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm
new file mode 100644
index 00000000000..97055664cdb
--- /dev/null
+++ b/code/modules/arcade/mob_hunt/battle_computer.dm
@@ -0,0 +1,278 @@
+
+/obj/machinery/computer/mob_battle_terminal
+ name = "Nano-Mob Hunter GO! Battle Terminal"
+ desc = "Insert a mob card to partake in life-like Nano-Mob Battle Action!"
+ icon_state = "mob_battle_empty"
+ icon_screen = null
+ icon_keyboard = null
+ density = 0
+ anchored = 1
+ var/obj/item/weapon/nanomob_card/card
+ var/datum/mob_hunt/mob_info
+ var/obj/effect/nanomob/battle/avatar
+ var/ready = 0
+ var/team = "Grey"
+ var/avatar_x_offset = 4
+ var/avatar_y_offset = 0
+
+/obj/machinery/computer/mob_battle_terminal/red
+ pixel_y = 24
+ dir = SOUTH
+ team = "Red"
+ avatar_y_offset = -1
+
+/obj/machinery/computer/mob_battle_terminal/blue
+ pixel_y = -24
+ dir = NORTH
+ team = "Blue"
+ avatar_y_offset = 1
+
+/obj/machinery/computer/mob_battle_terminal/red/initialize()
+ ..()
+ check_connection()
+
+/obj/machinery/computer/mob_battle_terminal/blue/initialize()
+ ..()
+ check_connection()
+
+/obj/machinery/computer/mob_battle_terminal/update_icon()
+ if(card)
+ icon_state = "mob_battle_loaded"
+ else
+ icon_state = "mob_battle_empty"
+ ..()
+
+/obj/machinery/computer/mob_battle_terminal/Destroy()
+ eject_card(1)
+ if(mob_hunt_server)
+ if(mob_hunt_server.battle_turn)
+ mob_hunt_server.battle_turn = null
+ if(mob_hunt_server.red_terminal == src)
+ mob_hunt_server.red_terminal = null
+ if(mob_hunt_server.blue_terminal == src)
+ mob_hunt_server.blue_terminal = null
+ if(avatar)
+ qdel(avatar)
+ return ..()
+
+/obj/machinery/computer/mob_battle_terminal/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/weapon/nanomob_card))
+ insert_card(O, user)
+
+/obj/machinery/computer/mob_battle_terminal/proc/insert_card(obj/item/weapon/nanomob_card/new_card, mob/user)
+ if(!new_card)
+ return
+ if(card)
+ to_chat(user, "The card slot is currently filled.")
+ return
+ if(!new_card.mob_data)
+ to_chat(user, "This is a blank mob card.")
+ return
+ if(new_card.mob_data && !new_card.mob_data.cur_health)
+ to_chat(user, "This mob is incapacitated! Heal it before attempting to use it in battle!")
+ return
+ user.unEquip(new_card)
+ new_card.forceMove(src)
+ card = new_card
+ mob_info = card.mob_data
+ update_icon()
+ update_avatar()
+ updateUsrDialog()
+
+/obj/machinery/computer/mob_battle_terminal/proc/eject_card(override = 0)
+ if(!override)
+ if(ready && mob_hunt_server.battle_turn != team)
+ audible_message("You can't recall on your rival's turn!", null, 2)
+ return
+ card.mob_data = mob_info
+ mob_info = null
+ card.forceMove(get_turf(src))
+ card = null
+ update_avatar()
+ update_icon()
+ updateUsrDialog()
+
+/obj/machinery/computer/mob_battle_terminal/proc/update_avatar()
+ //if we don't have avatars yet, spawn them
+ if(!avatar)
+ avatar = new(locate((x + avatar_x_offset), (y + avatar_y_offset), z))
+ //update avatar info from card
+ if(mob_info)
+ avatar.mob_info = mob_info
+ else
+ avatar.mob_info = null
+ //tell the avatar to update themself with the new info
+ avatar.update_self()
+
+/obj/machinery/computer/mob_battle_terminal/attack_hand(mob/user)
+ add_fingerprint(user)
+ interact(user)
+
+/obj/machinery/computer/mob_battle_terminal/attack_ai(mob/user)
+ to_chat(user, "You cannot interface with this portion of the simulation.")
+ return
+
+/obj/machinery/computer/mob_battle_terminal/interact(mob/user)
+ check_connection()
+ var/dat = ""
+ dat += ""
+ dat += ""
+ dat += "| "
+ dat += "[team] PLAYER"
+ dat += " | "
+ dat += "
"
+ dat += ""
+ dat += ""
+ if(!card)
+ dat += "No Nano-Mob card loaded."
+ dat += " | "
+ dat += "
"
+ if(ready && mob_hunt_server.battle_turn) //offer the surrender option if they are in a battle (ready), but don't have a card loaded
+ dat += ""
+ dat += "| Surrender! | "
+ dat += "
"
+ else
+ dat += ""
+ dat += ""
+ dat += ""
+ dat += "[mob_info.mob_name]"
+ dat += " | "
+ if(mob_info.nickname)
+ dat += ""
+ else
+ dat += " | "
+ var/img_src = "[mob_info.icon_state_normal].png"
+ if(mob_info.is_shiny)
+ dat += "[mob_info.icon_state_shiny].png"
+ dat += " "
+ dat += " | "
+ dat += "
"
+ if(mob_info.nickname)
+ dat += ""
+ dat += ""
+ dat += "[mob_info.nickname]"
+ dat += " | "
+ dat += "
"
+ dat += "
"
+ dat += "
"
+ dat += "Health: [mob_info.cur_health] / [mob_info.max_health]
"
+ dat += ""
+ dat += ""
+ if(mob_info.cur_health)
+ dat += "| Attack! | "
+ else
+ dat += "Incapacitated! | "
+ dat += "Recall! | "
+ dat += "
"
+ dat += "
"
+ dat += ""
+ dat += ""
+ if(!ready)
+ dat += ""
+ dat += "| Battle! | "
+ dat += "
"
+ if(ready && !mob_hunt_server.battle_turn)
+ dat += ""
+ dat += "| Cancel Battle! | "
+ dat += "
"
+ dat += "
"
+
+ var/datum/browser/popup = new(user, "mob_battle_terminal", "Nano-Mob Hunter GO! Battle Terminal", 575, 400)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/computer/mob_battle_terminal/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["attack"])
+ do_attack()
+
+ if(href_list["eject"])
+ eject_card()
+
+ if(href_list["surrender"])
+ surrender()
+
+ if(href_list["ready"])
+ var/option = text2num(href_list["ready"])
+ if(option == 1)
+ start_battle()
+ else if(option == 2)
+ ready = 0
+ audible_message("[team] Player cancels their battle challenge.", null, 5)
+
+ updateUsrDialog()
+
+/obj/machinery/computer/mob_battle_terminal/proc/check_connection()
+ if(team == "Red")
+ if(mob_hunt_server && !mob_hunt_server.red_terminal)
+ mob_hunt_server.red_terminal = src
+ else if(team == "Blue")
+ if(mob_hunt_server && !mob_hunt_server.blue_terminal)
+ mob_hunt_server.blue_terminal = src
+
+/obj/machinery/computer/mob_battle_terminal/proc/do_attack()
+ if(!ready) //no attacking if you arent ready to fight (duh)
+ return
+ if(!mob_hunt_server || team != mob_hunt_server.battle_turn) //don't attack unless it is actually our turn
+ return
+ else
+ var/message = "[mob_info.mob_name] attacks!"
+ if(mob_info.nickname)
+ message = "[mob_info.nickname] attacks!"
+ audible_message(message, null, 5)
+ mob_hunt_server.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type())
+
+/obj/machinery/computer/mob_battle_terminal/proc/start_battle()
+ if(ready) //don't do anything if we are still ready
+ return
+ if(!card) //don't do anything if there isn't a card inserted
+ return
+ ready = 1
+ audible_message("[team] Player is ready for battle! Waiting for rival...", null, 5)
+ mob_hunt_server.start_check()
+
+/obj/machinery/computer/mob_battle_terminal/proc/receive_attack(raw_damage, datum/mob_type/attack_type)
+ var/message = mob_info.take_damage(raw_damage, attack_type)
+ avatar.audible_message(message, null, 5)
+ if(!mob_info.cur_health)
+ mob_hunt_server.end_battle(team)
+ eject_card(1) //force the card out, they were defeated
+ else
+ mob_hunt_server.end_turn()
+
+/obj/machinery/computer/mob_battle_terminal/proc/surrender()
+ audible_message("[team] Player surrenders the battle!", null, 5)
+ mob_hunt_server.end_battle(team, 1)
+
+//////////////////////////////
+// Mob Healing Terminal //
+// (Pokemon Center) //
+//////////////////////////////
+
+/obj/machinery/computer/mob_healer_terminal
+ name = "Nano-Mob Hunter GO! Restoration Terminal"
+ desc = "Swipe a mob card to instantly restore it to full health!"
+ icon_state = "mob_battle_loaded"
+ icon_screen = null
+ icon_keyboard = null
+ density = 0
+ anchored = 1
+ dir = EAST
+
+/obj/machinery/computer/mob_healer_terminal/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/weapon/nanomob_card))
+ heal_card(O, user)
+
+/obj/machinery/computer/mob_healer_terminal/proc/heal_card(obj/item/weapon/nanomob_card/patient, mob/user)
+ if(!patient)
+ return
+ if(!patient.mob_data)
+ to_chat(user, "This is a blank mob card.")
+ return
+ if(patient.mob_data && patient.mob_data.cur_health == patient.mob_data.max_health)
+ to_chat(user, "This mob is already at maximum health!")
+ return
+ patient.mob_data.cur_health = patient.mob_data.max_health
+ to_chat(user, "[patient.mob_data.nickname ? patient.mob_data.nickname : patient.mob_data.mob_name] has been restored to full health!")
\ No newline at end of file
diff --git a/code/modules/arcade/mob_hunt/mob_avatar.dm b/code/modules/arcade/mob_hunt/mob_avatar.dm
new file mode 100644
index 00000000000..8717d5eb2a5
--- /dev/null
+++ b/code/modules/arcade/mob_hunt/mob_avatar.dm
@@ -0,0 +1,162 @@
+
+/obj/effect/nanomob
+ name = "Nano-Mob Avatar" //will be overridden by the mob datum name value when created
+ desc = "A wild Nano-Mob appeared! Hit it with your PDA with the game open to attempt to capture it!"
+ invisibility = 101
+ alpha = 128
+ anchored = 1 //just in case
+ density = 0
+ icon = 'icons/effects/mob_hunt.dmi'
+ var/state_name
+ var/datum/mob_hunt/mob_info = null
+ var/list/clients_encountered = list() //tracks who has already interacted with us, so they can't attempt a second capture
+ var/image/avatar
+
+/obj/effect/nanomob/New(loc, datum/mob_hunt/new_info)
+ ..()
+ if(!new_info)
+ qdel(src)
+ return
+ mob_info = new_info
+ update_self()
+ forceMove(mob_info.spawn_point)
+ if(!mob_info.is_trap)
+ addtimer(src, "despawn", mob_info.lifetime)
+
+/obj/effect/nanomob/proc/update_self()
+ if(!mob_info)
+ return
+ name = mob_info.mob_name
+ desc = "A wild [name] (level [mob_info.level]) appeared! Hit it with your PDA with the game open to attempt to capture it!"
+ if(mob_info.is_shiny)
+ state_name = mob_info.icon_state_shiny
+ else
+ state_name = mob_info.icon_state_normal
+ avatar = image(icon, src, state_name)
+ avatar.override = 1
+ add_alt_appearance("nanomob_avatar", avatar)
+
+/obj/effect/nanomob/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/device/pda))
+ var/obj/item/device/pda/P = O
+ attempt_capture(P, -20) //attempting a melee capture reduces the mob's effective run_chance by 20% to balance the risk of triggering a trap mob
+ return 1
+
+/obj/effect/nanomob/hitby(obj/item/O)
+ if(istype(O, /obj/item/device/pda))
+ var/obj/item/device/pda/P = O
+ attempt_capture(P) //attempting a ranged capture does not affect the mob's effective run_chance but does prevent you from being shocked by a trap mob
+ return 1
+
+/obj/effect/nanomob/proc/attempt_capture(obj/item/device/pda/P, catch_mod = 0) //negative catch_mods lower effective run chance,
+ if(!P || !P.current_app || !istype(P.current_app, /datum/data/pda/app/mob_hunter_game) || !P.cartridge)
+ return
+
+ var/datum/data/pda/app/mob_hunter_game/client = P.current_app
+ var/total_catch_mod = client.catch_mod + catch_mod //negative values decrease the chance of the mob running, positive values makes it more likely to flee
+ if(!client.connected) //must be connected to attempt captures
+ P.audible_message("[bicon(P)] No server connection. Capture aborted.", null, 4)
+ return
+
+ if(mob_info.is_trap) //traps work even if you ran into them before, which is why this is before the clients_encountered check
+ if(client.hacked) //hacked copies of the game (copies capable of setting traps) are protected from traps
+ return
+ if(iscarbon(P.loc))
+ var/mob/living/carbon/C = P.loc
+ //Strike them down with a lightning bolt to complete the illusion (copied from the surge reagent overdose, probably could make this a general-use proc in the future)
+ playsound(get_turf(C), 'sound/effects/eleczap.ogg', 75, 1)
+ var/icon/I=new('icons/obj/zap.dmi',"lightningend")
+ I.Turn(-135)
+ var/obj/effect/overlay/beam/B = new(get_turf(C))
+ B.pixel_x = rand(-20, 0)
+ B.pixel_y = rand(-20, 0)
+ B.icon = I
+ //then actually do the damage/stun
+ C.electrocute_act(20, P, 1) //same damage as a revenant's overload ability, except subject to gloves/species shock resistance (for human mobs at least)
+ return
+
+ if(client in clients_encountered) //we've already dealt with you, go away!
+ return
+ else //deal with the new hunter by either running away or getting caught
+ clients_encountered += client
+ var/message = "[bicon(P)] "
+ var/effective_run_chance = mob_info.run_chance + total_catch_mod
+ if((effective_run_chance > 0) && prob(effective_run_chance))
+ message += "Capture failed! [name] escaped [P.owner ? "from [P.owner]" : "from this hunter"]!"
+ conceal(client)
+ else
+ if(client.register_capture(mob_info, 1))
+ message += "Capture success! [P.owner ? P.owner : "This hunter"] captured [name]!"
+ conceal(client)
+ else
+ message += "Capture error! Try again."
+ clients_encountered -= client //if the capture registration failed somehow, let them have another chance with this mob
+ P.audible_message(message, null, 4)
+
+/obj/effect/nanomob/proc/despawn()
+ if(mob_hunt_server)
+ if(mob_info.is_trap)
+ mob_hunt_server.trap_spawns -= src
+ else
+ mob_hunt_server.normal_spawns -= src
+ qdel(src)
+
+/obj/effect/nanomob/proc/reveal()
+ if(!mob_hunt_server)
+ return
+ var/list/show_to = list()
+ for(var/A in mob_hunt_server.connected_clients)
+ if((A in clients_encountered) || !mob_hunt_server.connected_clients[A])
+ continue
+ show_to |= mob_hunt_server.connected_clients[A]
+ display_alt_appearance("nanomob_avatar", show_to)
+
+/obj/effect/nanomob/proc/conceal(list/hide_from)
+ if(!mob_hunt_server)
+ return
+ var/list/hiding_from = list()
+ if(hide_from)
+ hiding_from = hide_from
+ else
+ for(var/A in mob_hunt_server.connected_clients)
+ if((A in clients_encountered) && mob_hunt_server.connected_clients[A])
+ hiding_from |= mob_hunt_server.connected_clients[A]
+ hide_alt_appearance("nanomob_avatar", hiding_from)
+
+// BATTLE MOB AVATARS
+
+/obj/effect/nanomob/battle
+ name = "Nano-Mob Battle Avatar"
+ desc = "A new challenger approaches!"
+ invisibility = 0
+ icon_state = "placeholder"
+ var/obj/machinery/computer/mob_battle_terminal/my_terminal
+
+/obj/effect/nanomob/battle/New(loc, datum/mob_hunt/new_info)
+ if(new_info)
+ mob_info = new_info
+ update_self()
+
+/obj/effect/nanomob/battle/update_self()
+ if(!mob_info)
+ name = "Nano-Mob Battle Avatar"
+ desc = "A new challenger approaches"
+ icon_state = "placeholder"
+ else
+ name = mob_info.mob_name
+ desc = "A tamed [name] (level [mob_info.level]) ready for battle!"
+ if(mob_info.is_shiny)
+ icon_state = mob_info.icon_state_shiny
+ else
+ icon_state = mob_info.icon_state_normal
+
+/obj/effect/nanomob/battle/attempt_capture(obj/item/device/pda/P, catch_mod = 0)
+ //you can't capture battle avatars, since they belong to someone already
+ return
+
+//battle avatars are always visible, so we can ignore reveal and conceal calls for them
+/obj/effect/nanomob/battle/reveal()
+ return
+
+/obj/effect/nanomob/battle/conceal()
+ return
diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm
new file mode 100644
index 00000000000..16aea7ba55f
--- /dev/null
+++ b/code/modules/arcade/mob_hunt/mob_cards.dm
@@ -0,0 +1,43 @@
+
+//Standard Cards
+/obj/item/weapon/nanomob_card
+ name = "Nano-Mob Hunter Trading Card"
+ desc = "A blank Nano-Mob Hunter Trading Card. Worthless!"
+ icon = 'icons/obj/card.dmi'
+ icon_state = "trade_card"
+ force = 0
+ throwforce = 1
+ w_class = 1
+ var/datum/mob_hunt/mob_data
+
+/obj/item/weapon/nanomob_card/proc/update_info()
+ if(!mob_data)
+ return
+ if(mob_data.is_shiny)
+ name = "Holographic [mob_data.mob_name] Nano-Mob Hunter Card"
+ desc = "WOW! A holographic trading card containing a level [mob_data.level] [mob_data.mob_name]!"
+ icon_state = "trade_card_holo"
+ else
+ name = "[mob_data.mob_name] Nano-Mob Hunter Card"
+ desc = "A trading card containing a level [mob_data.level] [mob_data.mob_name]!"
+
+//Booster Pack Cards (random mob data)
+/obj/item/weapon/nanomob_card/booster
+ name = "Nano-Mob Hunter Booster Pack Card"
+ desc = "A random Nano-Mob Trading Card from a Booster Pack. Wonder what it is?"
+
+/obj/item/weapon/nanomob_card/booster/New()
+ var/datum/mob_hunt/mob_info = pick(subtypesof(/datum/mob_hunt))
+ mob_data = new mob_info(0,null,1)
+ update_info()
+
+//Booster Packs (Box of booster pack cards)
+/obj/item/weapon/storage/box/nanomob_booster_pack
+ name = "Nano-Mob Hunter Trading Card Booster Pack"
+ desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
+ can_hold = list("/obj/item/weapon/nanomob_card")
+
+/obj/item/weapon/storage/box/nanomob_booster_pack/New()
+ ..()
+ for(var/i in 1 to 6)
+ new /obj/item/weapon/nanomob_card/booster(src)
\ No newline at end of file
diff --git a/code/modules/arcade/mob_hunt/mob_datums.dm b/code/modules/arcade/mob_hunt/mob_datums.dm
new file mode 100644
index 00000000000..f6bc9dff826
--- /dev/null
+++ b/code/modules/arcade/mob_hunt/mob_datums.dm
@@ -0,0 +1,501 @@
+
+#define TYPE_FIRE /datum/mob_type/fire
+#define TYPE_WATER /datum/mob_type/water
+#define TYPE_GRASS /datum/mob_type/grass
+#define TYPE_ELECTRIC /datum/mob_type/electric
+#define TYPE_GROUND /datum/mob_type/ground
+#define TYPE_ROCK /datum/mob_type/rock
+#define TYPE_BUG /datum/mob_type/bug
+#define TYPE_POISON /datum/mob_type/poison
+#define TYPE_NORMAL /datum/mob_type/normal
+#define TYPE_FIGHTING /datum/mob_type/fighting
+#define TYPE_PSYCHIC /datum/mob_type/psychic
+#define TYPE_GHOST /datum/mob_type/ghost
+#define TYPE_ICE /datum/mob_type/ice
+#define TYPE_FLYING /datum/mob_type/flying
+#define TYPE_BLUESPACE /datum/mob_type/bluespace
+#define TYPE_DARK /datum/mob_type/dark
+#define TYPE_STEEL /datum/mob_type/steel
+
+/datum/mob_hunt
+ //GENERAL STATS AND VARIABLES
+ var/mob_name = "Generic Mob" //the mob's original name (its species/type/whatever)
+ var/nickname = "" //the mob's nickname (if given by the owner)
+ var/run_chance = 0 //percent chance the mob will escape capture attempts (higher is obviously more likely to get away)
+
+ //COMBAT STATS AND VARIABLES
+ var/level = 0 //actual level of this mob (don't set this, it gets overwritten in New())
+ var/min_level = 1 //minimum level of this mob (used for randomizing the actual level)
+ var/max_level = 1 //maximum level of this mob (used for randomizing the actual level)
+ var/exp = 0 //number of battles the mob has won towards the next level (resets to 0 on level-up)
+ var/exp_to_level = 3 //number of battles the mob must win to level up (in case we want to make some mobs harder or easier to level)
+ //the types of the mob will be used for battles to determine damage resistance or weakness (mob_type_datums.dm)
+ var/datum/mob_type/primary_type //Make sure you set this or the mob will be unable to deal damage and will take absurd damage in battles
+ var/datum/mob_type/secondary_type //Don't set if not a dual-type mob so the mob will only calculate damage based on primary type
+ var/base_attack = 5 //base damage dealt by the mob's attacks for battling (effectively damage dealt at level 0)
+ var/base_health = 5 //base health of the mob for battling (effectively max health at level 0)
+ var/attack_multiplier = 1 //how much additional damage per level the mob deals (level * attack_multiplier)
+ var/health_multiplier = 1 //how much additional health per level the mob gets (level * health_multiplier) for calculating max health
+ var/cur_health = 0
+ var/max_health = 0
+
+ //SPAWN PREFERENCES AND VARIABLES
+ //A note on mob spawn preferences: The mob types also have preferences, which are handled prior to per-mob preferences, so ultimately you use a combined set of preferences
+ var/list/area_blacklist = list() //list of areas this mob can NOT spawn in (such as the bridge)
+ var/list/turf_blacklist = list() //list of turfs this mob can NOT spawn on (such as wood floors)
+ var/list/area_whitelist = list() //list of areas this mob is more likely to spawn in (can be used to reinclude subtypes of blacklisted areas)
+ var/list/turf_whitelist = list() //list of turfs this mob is more likely to spawn on (can be used to reinclude subtypes of blacklisted turfs)
+ var/turf/spawn_point //gets set and sent to the game server to spawn its avatar (generated in select_spawn or assigned via set_trap)
+ var/lifetime = 6000 //number of deciseconds the mob will remain before despawning (REMEMBER: DECISECONDS! So 6000 is 600 seconds which is 10 minutes)
+ var/is_shiny = 0 //if this gets set at spawn (super rare), the mob is considered "shiny" and will use the shiny icon_state and holographic cards
+
+ //the icon file for mob_hunt stuff is 'icons/effects/mob_hunt.dmi' so reference that for the following vars
+ var/icon_state_normal = "placeholder" //the icon_state for this mob's normal version
+ var/icon_state_shiny = "placeholder" //the icon_state for this mob's rare shiney version
+
+ var/is_trap = 0 //if this gets set, the mob is a booby-trap and will electrocute any players that dare attempt to catch it
+
+/datum/mob_hunt/New(set_trap = 0, turf/trap_turf = null, no_register = 0)
+ if(set_trap)
+ level = max_level
+ is_trap = 1
+ spawn_point = trap_turf
+ else
+ level = rand(min_level, max_level)
+ if(prob(1) && prob(1))
+ is_shiny = 1
+ max_health = base_health + (level * health_multiplier)
+ cur_health = max_health
+ if(primary_type)
+ primary_type = new primary_type()
+ if(secondary_type)
+ secondary_type = new secondary_type()
+ if(no_register) //for booster pack cards
+ return
+ if(mob_hunt_server)
+ if(set_trap)
+ if(mob_hunt_server.register_trap(src))
+ return
+ else if(select_spawn())
+ if(mob_hunt_server.register_spawn(src))
+ return
+ qdel(src) //if you reach this, the datum is just pure clutter, so delete it
+
+/datum/mob_hunt/proc/select_spawn()
+ var/list/possible_areas = get_possible_areas()
+ if(!possible_areas.len)
+ log_admin("No possible areas to spawn [type] found. Possible code/mapping error?")
+ return 0
+ while(possible_areas.len)
+ //randomly select an area from our possible_areas list to try spawning in, then remove it from possible_areas so it won't get picked over and over forever.
+ var/area/spawn_area = locate(pickweight(possible_areas))
+ possible_areas -= spawn_area
+ if(!spawn_area)
+ break
+ //clear and generate a fresh list of turfs in the selected area, weighted based on white/black lists
+ var/list/possible_turfs = get_possible_turfs(spawn_area)
+ if(!possible_turfs.len) //If we don't have any possible turfs, this attempt was a failure. Try again.
+ continue
+ //if we got this far, we're spawning on this attempt, hooray!
+ spawn_point = pickweight(possible_turfs)
+ break
+ if(!spawn_point)
+ //if we get to this, we failed every attempt to find a suitable turf for EVERY area in our list of possible areas. DAMN.
+ log_admin("No acceptable turfs to spawn [type] on could be located. Possible code/mapping error, or someone replaced/destroyed all the acceptable turf types?")
+ return 0
+ return 1
+
+/datum/mob_hunt/proc/get_possible_areas()
+ var/list/possible_areas = list()
+ //setup, sets all station areas (and subtypes) to weight 1
+ for(var/A in the_station_areas)
+ if(A == /area/holodeck) //don't allow holodeck areas as possible spawns since it will allow it to spawn in the holodeck rooms on z2 as well
+ continue
+ if(A in possible_areas)
+ continue
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] = 1
+ //primary type preferences
+ if(primary_type)
+ for(var/A in primary_type.area_whitelist)
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] += 4
+ for(var/A in primary_type.area_blacklist)
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] -= 2
+ //secondary type preferences
+ if(secondary_type)
+ for(var/A in secondary_type.area_whitelist)
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] += 4
+ for(var/A in secondary_type.area_blacklist)
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] -= 2
+ //mob preferences
+ for(var/A in area_whitelist)
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] += 4
+ for(var/A in area_blacklist)
+ for(var/areapath in typesof(A))
+ possible_areas[areapath] -= 2
+ //removes "bad areas" which shouldn't be on-station but are subtypes of station areas. probably should the unused ones and consider repathing the rest
+ var/list/bad_areas = list(subtypesof(/area/construction), /area/solar/derelict_starboard, /area/solar/derelict_aft, /area/solar/constructionsite)
+ for(var/A in bad_areas)
+ possible_areas -= A
+ //weight check, remove negative or zero weight areas from the list, then return the list.
+ for(var/areapath in possible_areas)
+ //remove any areas that shouldn't be on the station-level
+ if(possible_areas[areapath] < 1)
+ possible_areas -= areapath
+ continue
+ return possible_areas
+
+/datum/mob_hunt/proc/get_possible_turfs(area/spawn_area)
+ if(!spawn_area)
+ return list()
+ var/list/possible_turfs = list()
+ //setup, sets all turfs in spawn_area to weight 1
+ for(var/turf/T in spawn_area)
+ if(!is_station_level(T.z)) //mobs will only consider station-level turfs for spawning. Largely here so we won't have to worry about mapping errors or mobs on the derelict solars
+ continue
+ possible_turfs[T] = 1
+ //primary type preferences
+ if(primary_type)
+ if(is_type_in_list(T, primary_type.turf_whitelist))
+ possible_turfs[T] += 4
+ if(is_type_in_list(T, primary_type.turf_blacklist))
+ possible_turfs[T] -= 2
+ //secondary type preferences
+ if(secondary_type)
+ if(is_type_in_list(T, secondary_type.turf_whitelist))
+ possible_turfs[T] += 4
+ if(is_type_in_list(T, secondary_type.turf_blacklist))
+ possible_turfs[T] -= 2
+ //mob preferences
+ if(is_type_in_list(T, turf_whitelist))
+ possible_turfs[T] += 4
+ if(is_type_in_list(T, turf_blacklist))
+ possible_turfs[T] -= 2
+ //weight check, remove negative or zero weight turfs from the list, then return the list
+ if(possible_turfs[T] < 1)
+ possible_turfs -= T
+ return possible_turfs
+
+/datum/mob_hunt/proc/calc_def_multiplier(datum/mob_type/attack_type)
+ if(!primary_type)
+ return 99 //typeless mobs are weak to everything since they shouldn't exist
+ if(!attack_type) //typeless attacks will return a multiplier of 1 in case we want to use this for calculating unmodified damage for some reason (UI maybe?)
+ return 1
+
+ var/multiplier = 1
+ if(attack_type in primary_type.immunity)
+ return 0 //a single immunity negates all damage
+ else if(attack_type in primary_type.resistance)
+ multiplier *= 0.5
+ else if(attack_type in primary_type.weakness)
+ multiplier *= 2
+ else
+ multiplier *= 1
+
+ if(!secondary_type) //if we don't have a second type, we're done here
+ return multiplier
+ if(attack_type in secondary_type.immunity)
+ return 0 //a single immunity negates all damage
+ else if(attack_type in secondary_type.resistance)
+ multiplier *= 0.5
+ else if(attack_type in secondary_type.weakness)
+ multiplier *= 2
+ else
+ multiplier *= 1
+ return multiplier
+
+/datum/mob_hunt/proc/take_damage(raw_damage, datum/mob_type/attack_type)
+ var/message = ""
+ var/multiplier = calc_def_multiplier(attack_type)
+ var/total_damage = raw_damage * multiplier
+ if(!cur_health) //it's already downed, quit hitting it
+ return null
+ if(!total_damage)
+ message += "The attack is completely ineffective! "
+ else
+ cur_health = max(cur_health - total_damage, 0)
+ switch(multiplier)
+ if(0)
+ message += "The attack is completely ineffective! "
+ if(0.25)
+ message += "It's barely effective... "
+ if(0.5)
+ message += "It's not very effective... "
+ if(2)
+ message += "It's super effective! "
+ if(4)
+ message += "It's ultra effective! "
+ if(99)
+ message += pick("REKT! ", "DUNKED! ", "DEFENSE BREAK! ", "WOMBO-COMBO'D!")
+ if(!cur_health)
+ message += "[nickname ? nickname : mob_name] is downed!"
+ return message
+
+/datum/mob_hunt/proc/get_raw_damage()
+ return (level * attack_multiplier)
+
+/datum/mob_hunt/proc/get_attack_type()
+ var/datum/mob_type/attack_type = primary_type
+ if(secondary_type && prob(40))
+ attack_type = secondary_type
+ return attack_type
+
+/datum/mob_hunt/proc/gain_exp()
+ exp++
+ var/message = "[nickname ? nickname : mob_name] gained EXP! ([exp] / [exp_to_level] EXP)"
+ if(exp >= exp_to_level)
+ message = levelup()
+ return message
+
+/datum/mob_hunt/proc/levelup()
+ var/message = ""
+ level++
+ exp = 0
+ if(level > max_level) //This is where we would trigger an evolution, when those are added (need to add evolved forms first)
+ level = max_level //for now though, we'll just cap them back at their max_level
+ message += "[nickname ? nickname : mob_name] can't get any stronger right now!"
+ else
+ max_health = base_health + (level * health_multiplier)
+ cur_health = max_health //full heal on level-up
+ message += "[nickname ? nickname : mob_name] has reached level [level]!"
+ return message
+
+/datum/mob_hunt/proc/get_type1()
+ if(!primary_type)
+ return "Typeless"
+ else
+ return primary_type.name
+
+/datum/mob_hunt/proc/get_type2()
+ if(!secondary_type)
+ return null
+ else
+ return secondary_type.name
+
+
+/datum/mob_hunt/nemabug
+ mob_name = "Nemabug"
+ run_chance = 50
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_BUG
+ icon_state_normal = "nemabug"
+ icon_state_shiny = "nemabug_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/stoutquill
+ mob_name = "Stoutquill"
+ run_chance = 50
+ min_level = 5
+ max_level = 15
+ primary_type = TYPE_ICE
+ icon_state_normal = "stoutquill"
+ icon_state_shiny = "stoutquill_shiny"
+ lifetime = 4500
+
+/datum/mob_hunt/spectra
+ mob_name = "Spectra"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_POISON
+ icon_state_normal = "spectra"
+ icon_state_shiny = "spectra_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/dunny
+ mob_name = "Dunny"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_FIRE
+ icon_state_normal = "dunny"
+ icon_state_shiny = "dunny_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/buffsel
+ mob_name = "Buffsel"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_ROCK
+ icon_state_normal = "buffsel"
+ icon_state_shiny = "buffsel_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/quarrel
+ mob_name = "Quarrel"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_NORMAL
+ icon_state_normal = "quarrel"
+ icon_state_shiny = "quarrel_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/vulerrt
+ mob_name = "Vulerrt"
+ run_chance = 50
+ min_level = 5
+ max_level = 15
+ primary_type = TYPE_DARK
+ icon_state_normal = "vulerrt"
+ icon_state_shiny = "vulerrt_shiny"
+ turf_whitelist = list()
+ lifetime = 4500
+
+/datum/mob_hunt/strudel
+ mob_name = "Strudel"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_ELECTRIC
+ icon_state_normal = "strudel"
+ icon_state_shiny = "strudel_shiny"
+ lifetime = 4500
+
+/datum/mob_hunt/folstick
+ mob_name = "Folstick"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_WATER
+ icon_state_normal = "folstick"
+ icon_state_shiny = "folstick_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/glimmerflare
+ mob_name = "Glimmerflare"
+ run_chance = 50
+ min_level = 5
+ max_level = 15
+ primary_type = TYPE_PSYCHIC
+ icon_state_normal = "glimmerflare"
+ icon_state_shiny = "glimmerflare_shiny"
+ lifetime = 4500
+
+/datum/mob_hunt/leecoon
+ mob_name = "Leecoon"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_GRASS
+ icon_state_normal = "leecoon"
+ icon_state_shiny = "leecoon_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/halk
+ mob_name = "Halk"
+ run_chance = 35
+ min_level = 1
+ max_level = 10
+ primary_type = TYPE_FLYING
+ icon_state_normal = "halk"
+ icon_state_shiny = "halk_shiny"
+ lifetime = 6000
+
+/datum/mob_hunt/gooby
+ mob_name = "Gooby"
+ run_chance = 65
+ min_level = 5
+ max_level = 20
+ primary_type = TYPE_ELECTRIC
+ secondary_type = TYPE_BUG
+ icon_state_normal = "gooby"
+ icon_state_shiny = "gooby_shiny"
+ lifetime = 3000
+
+/datum/mob_hunt/pandoom
+ mob_name = "Pandoom"
+ run_chance = 50
+ min_level = 5
+ max_level = 15
+ primary_type = TYPE_GHOST
+ icon_state_normal = "pandoom"
+ icon_state_shiny = "pandoom_shiny"
+ lifetime = 4500
+
+/datum/mob_hunt/relish
+ mob_name = "Relish"
+ run_chance = 65
+ min_level = 5
+ max_level = 20
+ primary_type = TYPE_FIRE
+ secondary_type = TYPE_GROUND
+ icon_state_normal = "relish"
+ icon_state_shiny = "relish_shiny"
+ lifetime = 3000
+
+/datum/mob_hunt/xofine
+ mob_name = "Xofine"
+ run_chance = 50
+ min_level = 5
+ max_level = 10
+ primary_type = TYPE_FIRE
+ secondary_type = TYPE_NORMAL
+ icon_state_normal = "xofine"
+ icon_state_shiny = "xofine_shiny"
+ lifetime = 3000
+
+/datum/mob_hunt/gitten
+ mob_name = "Gitten"
+ run_chance = 65
+ min_level = 5
+ max_level = 20
+ primary_type = TYPE_WATER
+ secondary_type = TYPE_POISON
+ icon_state_normal = "gitten"
+ icon_state_shiny = "gitten_shiny"
+ lifetime = 3000
+
+/datum/mob_hunt/nai
+ mob_name = "Nai"
+ run_chance = 65
+ min_level = 5
+ max_level = 20
+ primary_type = TYPE_GRASS
+ secondary_type = TYPE_NORMAL
+ icon_state_normal = "nai"
+ icon_state_shiny = "nai_shiny"
+ lifetime = 3000
+
+/datum/mob_hunt/pyroghast
+ mob_name = "Pyroghast"
+ run_chance = 65
+ min_level = 5
+ max_level = 20
+ primary_type = TYPE_FIRE
+ secondary_type = TYPE_GHOST
+ icon_state_normal = "pyroghast"
+ icon_state_shiny = "pyroghast"
+ lifetime = 4500
+
+/datum/mob_hunt/starslam
+ mob_name = "Starslam"
+ run_chance = 65
+ min_level = 5
+ max_level = 20
+ primary_type = TYPE_FIGHTING
+ secondary_type = TYPE_ICE
+ icon_state_normal = "starslam"
+ icon_state_shiny = "starslam_shiny"
+ lifetime = 2500
+
+/datum/mob_hunt/pheron
+ mob_name = "Pheron"
+ run_chance = 85
+ min_level = 10
+ max_level = 20
+ primary_type = TYPE_BLUESPACE
+ icon_state_normal = "pheron"
+ icon_state_shiny = "pheron_shiny"
+ area_blacklist = list()
+ turf_blacklist = list()
+ area_whitelist = list()
+ turf_whitelist = list()
+ lifetime = 2000
\ No newline at end of file
diff --git a/code/modules/arcade/mob_hunt/mob_type_datums.dm b/code/modules/arcade/mob_hunt/mob_type_datums.dm
new file mode 100644
index 00000000000..9d27a844ea8
--- /dev/null
+++ b/code/modules/arcade/mob_hunt/mob_type_datums.dm
@@ -0,0 +1,256 @@
+
+/datum/mob_type
+ var/name = "Typeless"
+ var/list/weakness = list()
+ var/list/resistance = list()
+ var/list/immunity = list()
+
+ //Type-based spawn preferences (to eliminate copy-pasting the same area and turf lists on each mob type)
+ var/list/area_blacklist = list() //areas to be avoided
+ var/list/area_whitelist = list() //areas to be more preferred
+ var/list/turf_blacklist = list() //turf types to be avoided
+ var/list/turf_whitelist = list() //turf types to be more preferred
+
+//Type defines, to avoid spelling mistakes
+/datum/mob_type/fire
+ name = "Fire"
+ weakness = list(TYPE_WATER,
+ TYPE_ROCK,
+ TYPE_GROUND)
+ resistance = list(TYPE_BUG,
+ TYPE_FIRE,
+ TYPE_GRASS,
+ TYPE_ICE,
+ TYPE_STEEL)
+ area_blacklist = list(/area/crew_quarters/toilet,
+ /area/crew_quarters/sleep_male/toilet_male,
+ /area/crew_quarters/sleep_female/toilet_female,
+ /area/crew_quarters/locker/locker_toilet,
+ /area/toxins/server_coldroom)
+ area_whitelist = list(/area/maintenance/turbine,
+ /area/maintenance/incinerator,
+ /area/crew_quarters/kitchen)
+ turf_blacklist = list(/turf/simulated/floor/beach/water)
+
+/datum/mob_type/water
+ name = "Water"
+ weakness = list(TYPE_ELECTRIC,
+ TYPE_GRASS)
+ resistance = list(TYPE_FIRE,
+ TYPE_ICE,
+ TYPE_STEEL,
+ TYPE_WATER)
+ area_blacklist = list(/area/maintenance/turbine,
+ /area/maintenance/incinerator,
+ /area/crew_quarters/kitchen)
+ area_whitelist = list(/area/crew_quarters/toilet,
+ /area/crew_quarters/sleep_male/toilet_male,
+ /area/crew_quarters/sleep_female/toilet_female,
+ /area/crew_quarters/locker/locker_toilet)
+ turf_whitelist = list(/turf/simulated/floor/beach/water)
+
+/datum/mob_type/grass
+ name = "Grass"
+ weakness = list(TYPE_FIRE,
+ TYPE_BUG,
+ TYPE_POISON,
+ TYPE_ICE,
+ TYPE_FLYING)
+ resistance = list(TYPE_WATER,
+ TYPE_GRASS,
+ TYPE_ELECTRIC,
+ TYPE_GROUND)
+ area_blacklist = list(/area/toxins)
+ area_whitelist = list(/area/hydroponics,
+ /area/hallway/secondary/construction)
+ turf_whitelist = list(/turf/simulated/floor/grass)
+
+/datum/mob_type/electric
+ name = "Electric"
+ weakness = list(TYPE_GROUND)
+ resistance = list(TYPE_ELECTRIC,
+ TYPE_FLYING,
+ TYPE_STEEL)
+ area_whitelist = list(/area/engine,
+ /area/toxins/server,
+ /area/maintenance,
+ /area/turret_protected/ai,
+ /area/turret_protected/ai_upload,
+ /area/turret_protected/aisat_interior,
+ /area/aisat,
+ /area/assembly)
+ turf_whitelist = list(/turf/simulated/floor/bluegrid)
+
+/datum/mob_type/ground
+ name = "Ground"
+ weakness = list(TYPE_WATER,
+ TYPE_GRASS,
+ TYPE_ICE)
+ resistance = list(TYPE_ROCK,
+ TYPE_POISON)
+ immunity = list(TYPE_ELECTRIC)
+
+/datum/mob_type/rock
+ name = "Rock"
+ weakness = list(TYPE_WATER,
+ TYPE_GRASS,
+ TYPE_GROUND,
+ TYPE_FIGHTING,
+ TYPE_STEEL)
+ resistance = list(TYPE_FIRE,
+ TYPE_FLYING,
+ TYPE_POISON,
+ TYPE_NORMAL)
+ area_whitelist = list(/area/quartermaster,
+ /area/maintenance/disposal)
+ turf_whitelist = list(/turf/simulated/wall,
+ /turf/simulated/floor/mineral)
+
+/datum/mob_type/bug
+ name = "Bug"
+ weakness = list(TYPE_FIRE,
+ TYPE_ROCK,
+ TYPE_FLYING)
+ resistance = list(TYPE_GRASS,
+ TYPE_GROUND,
+ TYPE_FIGHTING)
+ area_blacklist = list(/area/toxins)
+ area_whitelist = list(/area/hydroponics,
+ /area/hallway/secondary/construction)
+ turf_whitelist = list(/turf/simulated/floor/grass)
+
+/datum/mob_type/poison
+ name = "Poison"
+ weakness = list(TYPE_GROUND,
+ TYPE_PSYCHIC)
+ resistance = list(TYPE_GRASS,
+ TYPE_BUG,
+ TYPE_POISON,
+ TYPE_FIGHTING)
+ area_blacklist = list(/area/medical,
+ /area/security/medbay,
+ /area/janitor)
+ area_whitelist = list(/area/medical/virology,
+ /area/toxins,
+ /area/medical/research,
+ /area/medical/research_shuttle_dock,
+ /area/crew_quarters/hor,
+ /area/maintenance/asmaint2)
+
+/datum/mob_type/normal
+ name = "Normal"
+ weakness = list(TYPE_FIGHTING)
+ immunity = list(TYPE_GHOST)
+
+/datum/mob_type/fighting
+ name = "Fighting"
+ weakness = list(TYPE_PSYCHIC,
+ TYPE_FLYING)
+ resistance = list(TYPE_ROCK,
+ TYPE_BUG,
+ TYPE_DARK)
+ area_blacklist = list(/area/medical)
+ area_whitelist = list(/area/crew_quarters/bar,
+ /area/crew_quarters/fitness,
+ /area/security)
+ turf_whitelist = list(/turf/simulated/floor/wood)
+
+/datum/mob_type/psychic
+ name = "Psychic"
+ weakness = list(TYPE_BUG,
+ TYPE_GHOST,
+ TYPE_DARK)
+ resistance = list(TYPE_FIGHTING,
+ TYPE_PSYCHIC)
+ area_blacklist = list(/area/toxins,
+ /area/medical/research,
+ /area/medical/research_shuttle_dock,
+ /area/crew_quarters/hor,
+ /area/maintenance/asmaint2,
+ /area/teleporter,
+ /area/gateway)
+ area_whitelist = list(/area/library,
+ /area/chapel,
+ /area/medical/psych)
+
+/datum/mob_type/ghost
+ name = "Ghost"
+ weakness = list(TYPE_GHOST,
+ TYPE_DARK)
+ resistance = list(TYPE_BUG,
+ TYPE_POISON)
+ immunity = list(TYPE_NORMAL,
+ TYPE_FIGHTING)
+ area_whitelist = list(/area/medical/morgue,
+ /area/chapel,
+ /area/medical/genetics_cloning)
+
+/datum/mob_type/ice
+ name = "Ice"
+ weakness = list(TYPE_FIRE,
+ TYPE_ROCK,
+ TYPE_FIGHTING,
+ TYPE_STEEL)
+ resistance = list(TYPE_ICE)
+ area_blacklist = list(/area/maintenance/turbine,
+ /area/maintenance/incinerator,
+ /area/crew_quarters/kitchen)
+ area_whitelist = list(/area/toxins/server_coldroom)
+
+/datum/mob_type/flying
+ name = "Flying"
+ weakness = list(TYPE_ELECTRIC,
+ TYPE_ROCK,
+ TYPE_ICE)
+ resistance = list(TYPE_GRASS,
+ TYPE_BUG,
+ TYPE_FIGHTING)
+ immunity = list(TYPE_GROUND)
+ area_blacklist = list(/area/maintenance)
+ area_whitelist = list(/area/hallway,
+ /area/escapepodbay,
+ /area/engine/mechanic_workshop,
+ /area/security/podbay)
+
+/datum/mob_type/bluespace
+ name = "Bluespace"
+ weakness = list(TYPE_ICE,
+ TYPE_BLUESPACE)
+ resistance = list(TYPE_FIRE,
+ TYPE_WATER,
+ TYPE_GRASS,
+ TYPE_ELECTRIC)
+
+/datum/mob_type/dark
+ name = "Dark"
+ weakness = list(TYPE_BUG,
+ TYPE_FIGHTING)
+ resistance = list(TYPE_GHOST,
+ TYPE_DARK)
+ immunity = list(TYPE_PSYCHIC)
+ area_blacklist = list(/area/solar,
+ /area/maintenance/auxsolarport,
+ /area/maintenance/starboardsolar,
+ /area/maintenance/portsolar,
+ /area/maintenance/auxsolarstarboard,
+ /area/clownoffice)
+ area_whitelist = list(/area/maintenance,
+ /area/assembly/assembly_line,
+ /area/mimeoffice)
+ turf_blacklist = list(/turf/simulated/floor/light)
+
+/datum/mob_type/steel
+ name = "Steel"
+ weakness = list(TYPE_FIRE,
+ TYPE_GROUND,
+ TYPE_FIGHTING)
+ resistance = list(TYPE_GRASS,
+ TYPE_ROCK,
+ TYPE_BUG,
+ TYPE_NORMAL,
+ TYPE_PSYCHIC,
+ TYPE_ICE,
+ TYPE_FLYING,
+ TYPE_BLUESPACE,
+ TYPE_STEEL)
+ immunity = list(TYPE_POISON)
\ No newline at end of file
diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm
index da78a7806ef..9334502dd10 100644
--- a/code/modules/arcade/prize_datums.dm
+++ b/code/modules/arcade/prize_datums.dm
@@ -190,6 +190,12 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/weapon/spellbook/oneuse/fake_gib
cost = 100
+/datum/prize_item/nanomob_booster
+ name = "Nano-Mob Hunter Trading Card Booster Pack"
+ desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
+ typepath = /obj/item/weapon/storage/box/nanomob_booster_pack
+ cost = 100
+
/datum/prize_item/capgun
name = "Capgun Revolver"
desc = "Do you feel lucky... punk?"
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
index 9eb71904de5..6b6eb863b45 100644
--- a/code/modules/awaymissions/bluespaceartillery.dm
+++ b/code/modules/awaymissions/bluespaceartillery.dm
@@ -24,7 +24,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/computer/artillerycontrol/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/artillerycontrol/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/time_to_wait = round(reload_cooldown - ((world.time / 10) - last_fire), 1)
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 5045b5369a1..cf6da43847b 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -9,14 +9,14 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
unacidable = 1
var/active = 0
+/obj/machinery/gateway/initialize()
+ ..()
+ update_icon()
+ update_density_from_dir()
-/obj/machinery/gateway/New()
- if(!the_gateway)
- the_gateway = src
- spawn(25)
- update_icon()
- if(dir == 2)
- density = 0
+/obj/machinery/gateway/proc/update_density_from_dir()
+ if(dir == 2)
+ density = 0
/obj/machinery/gateway/update_icon()
@@ -40,13 +40,18 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
var/obj/machinery/gateway/centeraway/awaygate = null
/obj/machinery/gateway/centerstation/New()
+ ..()
if(!the_gateway)
the_gateway = src
- spawn(25)
- update_icon()
- wait = world.time + config.gateway_delay //+ thirty minutes default
- awaygate = locate(/obj/machinery/gateway/centeraway) in world
+/obj/machinery/gateway/centerstation/initialize()
+ ..()
+ update_icon()
+ wait = world.time + config.gateway_delay //+ thirty minutes default
+ awaygate = locate(/obj/machinery/gateway/centeraway) in world
+
+/obj/machinery/gateway/centerstation/update_density_from_dir()
+ return
/obj/machinery/gateway/centerstation/Destroy()
if(the_gateway == src)
@@ -61,7 +66,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
-obj/machinery/gateway/centerstation/process()
+/obj/machinery/gateway/centerstation/process()
if(stat & (NOPOWER))
if(active) toggleoff()
return
@@ -165,12 +170,15 @@ obj/machinery/gateway/centerstation/process()
var/obj/machinery/gateway/centeraway/stationgate = null
-/obj/machinery/gateway/centeraway/New()
- spawn(25)
- update_icon()
- stationgate = locate(/obj/machinery/gateway/centerstation) in world
+/obj/machinery/gateway/centeraway/initialize()
+ ..()
+ update_icon()
+ stationgate = locate(/obj/machinery/gateway/centerstation) in world
+/obj/machinery/gateway/centeraway/update_density_from_dir()
+ return
+
/obj/machinery/gateway/centeraway/update_icon()
if(active)
icon_state = "oncenter"
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 082fc0d930f..e02a1a8d810 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -261,6 +261,8 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
send_asset_list(client, uncommon)
send_asset_list(client, common)
+
+//Pill sprites for UIs
/datum/asset/chem_master
var/assets = list()
var/verify = FALSE
@@ -274,4 +276,21 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
register_asset(asset_name, assets[asset_name])
/datum/asset/chem_master/send(client)
- send_asset_list(client,assets,verify)
\ No newline at end of file
+ send_asset_list(client, assets, verify)
+
+
+//Mob Hunt sprites for UIs
+/datum/asset/mob_hunt
+ var/assets = list()
+ var/verify = FALSE
+
+/datum/asset/mob_hunt/register()
+ for(var/state in icon_states('icons/effects/mob_hunt.dmi'))
+ if(state == "Placeholder")
+ continue
+ assets["[state].png"] = icon('icons/effects/mob_hunt.dmi', state)
+ for(var/asset_name in assets)
+ register_asset(asset_name, assets[asset_name])
+
+/datum/asset/mob_hunt/send(client)
+ send_asset_list(client, assets, verify)
\ No newline at end of file
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 0209b16c40e..6e1fe9126fd 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -111,49 +111,49 @@
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Barber",5)
+ DB_job_unlock("Barber",5)
return
if("2")
if(karma <5)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Brig Physician",5)
+ DB_job_unlock("Brig Physician",5)
return
if("3")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Nanotrasen Representative",30)
+ DB_job_unlock("Nanotrasen Representative",30)
return
if("5")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Blueshield",30)
+ DB_job_unlock("Blueshield",30)
return
if("6")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Mechanic",30)
+ DB_job_unlock("Mechanic",30)
return
if("7")
if(karma <45)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Magistrate",45)
+ DB_job_unlock("Magistrate",45)
return
if("9")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_job_unlock("Security Pod Pilot",30)
+ DB_job_unlock("Security Pod Pilot",30)
return
if(href_list["KarmaBuy2"])
var/karma=verify_karma()
@@ -163,55 +163,55 @@
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Machine",15)
+ DB_species_unlock("Machine",15)
return
if("2")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Kidan",30)
+ DB_species_unlock("Kidan",30)
return
if("3")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Grey",30)
+ DB_species_unlock("Grey",30)
return
if("4")
if(karma <45)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Vox",45)
+ DB_species_unlock("Vox",45)
return
if("5")
if(karma <45)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Slime People",45)
+ DB_species_unlock("Slime People",45)
return
if("6")
if(karma <100)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Plasmaman",100)
+ DB_species_unlock("Plasmaman",100)
return
if("7")
if(karma <30)
to_chat(usr, "You do not have enough karma!")
return
else
- src.DB_species_unlock("Drask",30)
+ DB_species_unlock("Drask",30)
return
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
var/cost = href_list["KarmaRefundCost"]
- src.karmarefund(type,job,cost)
+ karmarefund(type,job,cost)
return
switch(href_list["_src_"])
@@ -273,6 +273,7 @@
//CONNECT//
///////////
/client/New(TopicData)
+ var/tdata = TopicData //save this for later use
chatOutput = new /datum/chatOutput(src) // Right off the bat.
TopicData = null //Prevent calls to client.Topic from connect
@@ -290,8 +291,8 @@
// Change the way they should download resources.
if(config.resource_urls)
- src.preload_rsc = pick(config.resource_urls)
- else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal.
+ preload_rsc = pick(config.resource_urls)
+ else preload_rsc = 1 // If config.resource_urls is not set, preload like normal.
to_chat(src, "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears.")
@@ -340,7 +341,7 @@
winset(src, null, "command=\".configure graphics-hwmode off\"")
winset(src, null, "command=\".configure graphics-hwmode on\"")
- log_client_to_db()
+ log_client_to_db(tdata)
if(ckey in clientmessages)
for(var/message in clientmessages[ckey])
@@ -399,7 +400,7 @@
donator_level = text2num(query_donor_select.item[2])
break
-/client/proc/log_client_to_db()
+/client/proc/log_client_to_db(connectiontopic)
if(IsGuestKey(key))
return
@@ -430,6 +431,14 @@
if(ckey != query_cid.item[1])
related_accounts_cid.Add("[query_cid.item[1]]")
+ var/admin_rank = "Player"
+ if(holder)
+ admin_rank = holder.rank
+ // Admins don't get slammed by this, I guess
+ else
+ if(check_randomizer(connectiontopic))
+ return
+
//Log all the alts
if(related_accounts_cid.len)
log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]")
@@ -446,10 +455,6 @@
if(!isnum(sql_id))
return
- var/admin_rank = "Player"
- if(src.holder)
- admin_rank = src.holder.rank
-
var/sql_ip = sanitizeSQL(address)
var/sql_computerid = sanitizeSQL(computer_id)
var/sql_admin_rank = sanitizeSQL(admin_rank)
@@ -469,11 +474,128 @@
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');")
query_accesslog.Execute()
-
#undef TOPIC_SPAM_DELAY
#undef UPLOAD_LIMIT
#undef MIN_CLIENT_VERSION
+// Returns true if a randomizer is being used
+/client/proc/check_randomizer(topic)
+ . = FALSE
+ if(connection != "seeker") //Invalid connection type.
+ return null
+ topic = params2list(topic)
+ if(!config.check_randomizer)
+ return
+ // Stash o' ckeys
+ var/static/cidcheck = list()
+ var/static/tokens = list()
+ // Ckeys that failed the test, stored to send acceptance messages only for atoners
+ var/static/cidcheck_failedckeys = list()
+ var/static/cidcheck_spoofckeys = list()
+
+ var/oldcid = cidcheck[ckey]
+
+ if(!oldcid)
+ var/DBQuery/query_cidcheck = dbcon.NewQuery("SELECT computerid FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
+ query_cidcheck.Execute()
+
+ var/lastcid = computer_id
+ if(query_cidcheck.NextRow())
+ lastcid = query_cidcheck.item[1]
+
+ if(computer_id != lastcid)
+ // Their current CID does not match what the DB says - OFF WITH THEIR HEAD
+ cidcheck[ckey] = computer_id
+
+ // Disable the reconnect button to force a CID change
+ winset(src, "reconnectbutton", "is-disable=true")
+
+ tokens[ckey] = cid_check_reconnect()
+ sleep(10) // Since browse is non-instant, and kinda async
+
+ to_chat(src, "you're a huge nerd. wakka wakka doodle doop nobody's ever gonna see this, the chat system shouldn't be online by this point
")
+ del(src)
+ return TRUE
+ else
+ if (!topic || !topic["token"] || !tokens[ckey] || topic["token"] != tokens[ckey])
+ if (!cidcheck_spoofckeys[ckey])
+ message_admins("[key_name(src)] appears to have attempted to spoof a cid randomizer check.")
+ cidcheck_spoofckeys[ckey] = TRUE
+ cidcheck[ckey] = computer_id
+ tokens[ckey] = cid_check_reconnect()
+
+ sleep(10) //browse is queued, we don't want them to disconnect before getting the browse() command.
+ del(src)
+ return TRUE
+ // We DO have their cached CID handy - compare it, now
+ if(oldcid != computer_id)
+ // Change detected, they are randomizing
+ cidcheck -= ckey // To allow them to try again after removing CID randomization
+
+ to_chat(src, "Connection Error:")
+ to_chat(src, "Invalid ComputerID(spoofed). Please remove the ComputerID spoofer from your BYOND installation and try again.")
+
+ if(!cidcheck_failedckeys[ckey])
+ message_admins("[key_name(src)] has been detected as using a CID randomizer. Connection rejected.")
+ send2irc(config.cidrandomizer_irc, "[key_name(src)] has been detected as using a CID randomizer. Connection rejected.")
+ cidcheck_failedckeys[ckey] = TRUE
+ note_randomizer_user()
+
+ log_access("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])")
+
+ del(src)
+ return TRUE
+ else
+ // don't shoot, I'm innocent
+ if(cidcheck_failedckeys[ckey])
+ // Atonement
+ message_admins("[key_name_admin(src)] has been allowed to connect after showing they removed their cid randomizer")
+ send2irc(config.cidrandomizer_irc, "[key_name(src)] has been allowed to connect after showing they removed their cid randomizer.")
+ cidcheck_failedckeys -= ckey
+ if (cidcheck_spoofckeys[ckey])
+ message_admins("[key_name_admin(src)] has been allowed to connect after appearing to have attempted to spoof a cid randomizer check because it appears they aren't spoofing one this time")
+ cidcheck_spoofckeys -= ckey
+ cidcheck -= ckey
+
+/client/proc/note_randomizer_user()
+ var/const/adminckey = "CID-Error"
+
+ // Check for notes in the last day - only 1 note per 24 hours
+ var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT id from [format_table_name("notes")] WHERE ckey = '[ckey]' AND adminckey = '[adminckey]' AND timestamp + INTERVAL 1 DAY < NOW()")
+ if(!query_get_notes.Execute())
+ var/err = query_get_notes.ErrorMsg()
+ log_game("SQL ERROR obtaining id from notes table. Error : \[[err]\]\n")
+ return
+ if(query_get_notes.NextRow())
+ return
+
+ // Only add a note if their most recent note isn't from the randomizer blocker, either
+ query_get_notes = dbcon.NewQuery("SELECT adminckey FROM [format_table_name("notes")] WHERE ckey = '[ckey]' ORDER BY timestamp DESC LIMIT 1")
+ if(!query_get_notes.Execute())
+ var/err = query_get_notes.ErrorMsg()
+ log_game("SQL ERROR obtaining adminckey from notes table. Error : \[[err]\]\n")
+ return
+ if(query_get_notes.NextRow())
+ if(query_get_notes.item[1] == adminckey)
+ return
+ add_note(ckey, "Detected as using a cid randomizer.", null, adminckey, logged = 0)
+
+/client/proc/cid_check_reconnect()
+ var/token = md5("[rand(0,9999)][world.time][rand(0,9999)][ckey][rand(0,9999)][address][rand(0,9999)][computer_id][rand(0,9999)]")
+ . = token
+ log_access("Failed Login: [key] [computer_id] [address] - CID randomizer check")
+ var/url = winget(src, null, "url")
+ //special javascript to make them reconnect under a new window.
+ src << browse("\
+ byond://[url]?token=[token]\
+ \
+ ",
+ "border=0;titlebar=0;size=1x1")
+ to_chat(src, "You will be automatically taken to the game, if not, click here to be taken manually. Except you can't, since the chat window doesn't exist yet.")
+
//checks if a client is afk
//3000 frames = 5 minutes
/client/proc/is_afk(duration=3000)
diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm
index 347447f892f..919a77a44e8 100644
--- a/code/modules/client/preference/loadout/loadout_general.dm
+++ b/code/modules/client/preference/loadout/loadout_general.dm
@@ -74,3 +74,8 @@
/datum/gear/skullbandana
display_name = "bandana, skull"
path = /obj/item/clothing/mask/bandana/skull
+
+/datum/gear/mob_hunt_game
+ display_name = "Nano-Mob Hunter GO! Cartridge"
+ path = /obj/item/weapon/cartridge/mob_hunt_game
+ cost = 2
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index c049852e3be..8f82ab7274f 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -82,6 +82,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
+ var/exp
var/ooccolor = "#b82e00"
var/be_special = list() //Special role selection
var/UI_style = "Midnight"
@@ -593,6 +594,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(jobban_isbanned(user, rank))
HTML += "[rank] \[BANNED] | "
continue
+ var/available_in_playtime = job.available_in_playtime(user.client)
+ if(available_in_playtime)
+ HTML += "[rank] \[ " + get_exp_format(available_in_playtime) + " as " + job.get_exp_req_type() + " | "
+ continue
if(!job.player_old_enough(user.client))
var/available_in_days = job.available_in_days(user.client)
HTML += "[rank] \[IN [(available_in_days)] DAYS] | "
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index 1425f714183..581daf222d3 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -13,7 +13,8 @@
volume,
nanoui_fancy,
show_ghostitem_attack,
- lastchangelog
+ lastchangelog,
+ exp
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -40,6 +41,7 @@
nanoui_fancy = text2num(query.item[11])
show_ghostitem_attack = text2num(query.item[12])
lastchangelog = query.item[13]
+ exp = query.item[14]
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -54,6 +56,7 @@
nanoui_fancy = sanitize_integer(nanoui_fancy, 0, 1, initial(nanoui_fancy))
show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack))
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
+ exp = sanitize_text(exp, initial(exp))
return 1
/datum/preferences/proc/save_preferences(client/C)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index ab5f8832ab3..078f83f506a 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -154,7 +154,7 @@
var/invis_override = 0
var/emagged = 0
- var/color_view = null//overrides client.color while worn
+ var/list/color_view = null//overrides client.color while worn
var/prescription = 0
var/prescription_upgradable = 0
strip_delay = 20 // but seperated to allow items to protect but not impair vision, like space helmets
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index f8ff3ea4ecc..4fde338ba54 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -243,26 +243,35 @@
return 1
/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir()
+ var/list/difference = difflist(usr.client.color, color_view)
+
if(!noir_mode)
- if(color_view && usr.client && !usr.client.color)
+ if(color_view && usr.client && (!usr.client.color || difference))
animate(usr.client, color = color_view, time = 10)
noir_mode = 1
else
- if(usr.client && usr.client.color)
- animate(usr.client, color = null, time = 10)
+ if(usr.client && usr.client.color && !difference)
+ animate(usr.client, color = initial(usr.client.color), time = 10)
noir_mode = 0
/obj/item/clothing/glasses/sunglasses/noir/equipped(mob/user, slot)
+ var/list/difference = difflist(user.client.color, color_view)
+
if(slot == slot_glasses)
if(noir_mode)
- if(color_view && user.client && !user.client.color)
+ if(color_view && user.client && (!user.client.color || difference.len))
animate(user.client, color = color_view, time = 10)
+ else
+ if(user.client && user.client.color && !difference.len)
+ animate(user.client, color = initial(user.client.color), time = 10)
..(user, slot)
/obj/item/clothing/glasses/sunglasses/noir/dropped(mob/living/carbon/human/user)
+ var/list/difference = difflist(user.client.color, color_view)
+
if(istype(user) && user.glasses == src)
- if(user.client && user.client.color)
- animate(user.client, color = null, time = 10)
+ if(user.client && user.client.color && !difference.len)
+ animate(user.client, color = initial(user.client.color), time = 10)
..(user)
/obj/item/clothing/glasses/sunglasses/yeah
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 7e5dfcad115..2ebd01a9162 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -514,7 +514,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/item/weapon/rig/ui_data(mob/user, datum/topic_state/state = inventory_state)
+/obj/item/weapon/rig/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
var/data[0]
data["primarysystem"] = null
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 63875ee04ee..df0f6916530 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -313,6 +313,11 @@
icon_state = "eyepro"
item_state = "eyepro"
+/obj/item/clothing/glasses/hud/security/sunglasses/fluff/voxxyhud //LP Spartan: Kaskreyarawkta
+ name = "VoxxyHUD"
+ desc = "A worn down visor from a vox raider's gear, crudely ripped from its helmet and linked into the security systems of the station. The word 'Kask' is scratched into the side."
+ icon_state = "hud-spartan"
+
//////////// Hats ////////////
/obj/item/clothing/head/fluff/heather_winceworth // Regens: Heather Winceworth
name= "Heather's rose"
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 1b238acea6e..44299826454 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -83,7 +83,7 @@
ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640)
ui.open()
-/obj/machinery/computer/account_database/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/account_database/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["src"] = UID()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 4c487d05afb..149744675a9 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -322,7 +322,7 @@
ui = new(user, src, ui_key, "smartfridge.tmpl", name, 400, 500)
ui.open()
-/obj/machinery/smartfridge/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/smartfridge/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["contents"] = null
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 22fb9156004..4343bc75686 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -634,14 +634,20 @@
chems[rid] = gene_chem.Copy()
continue
+ // Normally a length 2 list - but sometimes, it's length 1 - poisonberries, etc.
+ // This means the reagent does not scale with potency.
+ // Index 1 is the base value, index 2 is the potency per u of reagent
+ var/list/rgnt_list = chems[rid]
+ rgnt_list.len = max(gene_chem.len, rgnt_list.len)
+
for(var/i=1;i<=gene_chem.len;i++)
if(isnull(gene_chem[i])) gene_chem[i] = 0
- if(chems[rid][i])
- chems[rid][i] = max(1,round((gene_chem[i] + chems[rid][i])/2))
+ if(rgnt_list[i])
+ rgnt_list[i] = max(1,round((gene_chem[i] + rgnt_list[i])/2))
else
- chems[rid][i] = gene_chem[i]
+ rgnt_list[i] = gene_chem[i]
var/list/new_gasses = gene.values["[TRAIT_EXUDE_GASSES]"]
if(islist(new_gasses))
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index c50503d7aa5..7e21e12370e 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -166,7 +166,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/botany/extractor/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/botany/extractor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/list/geneMasks[0]
@@ -318,7 +318,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/botany/editor/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/botany/editor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["activity"] = active
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index c9e410d9e9b..be101742dfa 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -428,6 +428,19 @@
flags = RESTRICTED | HIVEMIND
follow = 1
+
+/datum/language/terrorspider
+ name = "Spider Hivemind"
+ desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs."
+ speech_verb = "chitters"
+ ask_verb = "chitters"
+ exclaim_verb = "chitters"
+ colour = "terrorspider"
+ key = "ts"
+ flags = RESTRICTED | HIVEMIND
+ follow = 1
+
+
/datum/language/ling
name = "Changeling"
desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
@@ -559,7 +572,7 @@
flags = RESTRICTED | HIVEMIND
drone_only = 1
follow = 1
-
+
/datum/language/drone
name = "Drone"
desc = "An encrypted stream of data converted to speech patterns."
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a26b5e967af..fed16671887 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -454,8 +454,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
totalMembers |= pipeline.other_atmosmch
for(var/obj/machinery/atmospherics/A in totalMembers)
if(!A.pipe_image)
- A.pipe_image = image(A, A.loc, layer = 20, dir = A.dir) //the 20 puts it above Byond's darkness (not its opacity view)
- A.pipe_image.plane = HUD_PLANE
+ A.update_pipe_image()
pipes_shown += A.pipe_image
client.images += A.pipe_image
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index fe0924880f2..94814045871 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -47,10 +47,12 @@
to_chat(src, "Alert cancelled. Power has been restored without our assistance.")
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
+ update_sight()
else if(aiRestorePowerRoutine == 3)
to_chat(src, "Alert cancelled. Power has been restored.")
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
+ update_sight()
else
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 43249060652..d0aeb8b9fa7 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -114,8 +114,6 @@
C.toff = 1
..()
-/mob/living/silicon/pai/Login()
- ..()
// this function shows the information about being silenced as a pAI in the Status panel
/mob/living/silicon/pai/proc/show_silenced()
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index ed5ba8ce49a..4847931e543 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -41,7 +41,12 @@ var/global/list/default_pai_software = list()
if(ui_key != "main")
var/datum/pai_software/S = software[ui_key]
if(S && !S.toggle)
- S.on_ui_interact(src, ui, force_open)
+ ui = nanomanager.try_update_ui(user, src, S.id, ui, force_open)
+ if(!ui)
+ ui = new(user, src, S.id, S.template_file, S.ui_title, S.ui_width, S.ui_height, state = state)
+ ui.open()
+ if(S.autoupdate)
+ ui.set_auto_update(1)
else
if(ui)
ui.set_status(STATUS_CLOSE, 0)
@@ -53,9 +58,15 @@ var/global/list/default_pai_software = list()
ui.open()
ui.set_auto_update(1)
-/mob/living/silicon/pai/ui_data(mob/user, datum/topic_state/state = self_state)
+/mob/living/silicon/pai/ui_data(mob/user, ui_key = "main", datum/topic_state/state = self_state)
var/data[0]
+ if(ui_key != "main")
+ var/datum/pai_software/S = software[ui_key]
+ if(S && !S.toggle)
+ return S.on_ui_data(user, state)
+ log_runtime(EXCEPTION("Unrecognized/invalid pAI UI state '[ui_key]'"), src)
+ return
// Software we have bought
var/bought_software[0]
// Software we have not bought
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 104c2746d16..12f94d5fe64 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -7,18 +7,25 @@
var/id = ""
// Whether this software is a toggle or not
// Toggled software should override toggle() and is_active()
- // Non-toggled software should override on_ui_interact() and Topic()
+ // Non-toggled software should override on_ui_data() and Topic()
var/toggle = 1
// Whether pAIs should automatically receive this module at no cost
var/default = 0
- proc/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
+ // Vars for pAI nanoUI handling
+ var/autoupdate = 0
+ var/template_file = "oops"
+ var/ui_title = "somebody forgot to set this"
+ var/ui_width = 450
+ var/ui_height = 600
+
+/datum/pai_software/proc/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ return list()
+
+/datum/pai_software/proc/toggle(mob/living/silicon/pai/user)
return
- proc/toggle(mob/living/silicon/pai/user)
- return
-
- proc/is_active(mob/living/silicon/pai/user)
+/datum/pai_software/proc/is_active(mob/living/silicon/pai/user)
return 0
/datum/pai_software/directives
@@ -28,54 +35,52 @@
toggle = 0
default = 1
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ template_file = "pai_directives.tmpl"
+ ui_title = "pAI Directives"
+ autoupdate = 1
- data["master"] = user.master
- data["dna"] = user.master_dna
- data["prime"] = user.pai_law0
- data["supplemental"] = user.pai_laws
+/datum/pai_software/directives/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_directives.tmpl", "pAI Directives", 450, 600)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
+ data["master"] = user.master
+ data["dna"] = user.master_dna
+ data["prime"] = user.pai_law0
+ data["supplemental"] = user.pai_laws
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
+ return data
- if(href_list["getdna"])
- var/mob/living/M = P.loc
- var/count = 0
+/datum/pai_software/directives/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
- // Find the carrier
- while(!istype(M, /mob/living))
- if(!M || !M.loc || count > 6)
- //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
- to_chat(P, "You are not being carried by anyone!")
- return 0
- M = M.loc
- count++
+ if(href_list["getdna"])
+ var/mob/living/M = P.loc
+ var/count = 0
- // Check the carrier
- var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
- if(answer == "Yes")
- var/turf/T = get_turf_or_move(P.loc)
- for(var/mob/v in viewers(T))
- v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
- var/datum/dna/dna = M.dna
- to_chat(P, "[M]'s UE string : [dna.unique_enzymes]
")
- if(dna.unique_enzymes == P.master_dna)
- to_chat(P, "DNA is a match to stored Master DNA.")
- else
- to_chat(P, "DNA does not match stored Master DNA.")
+ // Find the carrier
+ while(!istype(M, /mob/living))
+ if(!M || !M.loc || count > 6)
+ //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
+ to_chat(P, "You are not being carried by anyone!")
+ return 0
+ M = M.loc
+ count++
+
+ // Check the carrier
+ var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
+ if(answer == "Yes")
+ var/turf/T = get_turf_or_move(P.loc)
+ for(var/mob/v in viewers(T))
+ v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
+ var/datum/dna/dna = M.dna
+ to_chat(P, "[M]'s UE string : [dna.unique_enzymes]
")
+ if(dna.unique_enzymes == P.master_dna)
+ to_chat(P, "DNA is a match to stored Master DNA.")
else
- to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.")
- return 1
+ to_chat(P, "DNA does not match stored Master DNA.")
+ else
+ to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.")
+ return 1
/datum/pai_software/radio_config
name = "Radio Configuration"
@@ -84,35 +89,35 @@
toggle = 0
default = 1
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui = null, force_open = 1)
- var/data[0]
+ template_file = "pai_radio.tmpl"
+ ui_title = "Radio Configuration"
+ ui_width = 300
+ ui_height = 150
- data["listening"] = user.radio.broadcasting
- data["frequency"] = format_frequency(user.radio.frequency)
+/datum/pai_software/radio_config/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- var/channels[0]
- for(var/ch_name in user.radio.channels)
- var/ch_stat = user.radio.channels[ch_name]
- var/ch_dat[0]
- ch_dat["name"] = ch_name
- // FREQ_LISTENING is const in /obj/item/device/radio
- ch_dat["listening"] = !!(ch_stat & user.radio.FREQ_LISTENING)
- channels[++channels.len] = ch_dat
+ data["listening"] = user.radio.broadcasting
+ data["frequency"] = format_frequency(user.radio.frequency)
+ var/channels[0]
+ for(var/ch_name in user.radio.channels)
+ var/ch_stat = user.radio.channels[ch_name]
+ var/ch_dat[0]
+ ch_dat["name"] = ch_name
+ // FREQ_LISTENING is const in /obj/item/device/radio
+ ch_dat["listening"] = !!(ch_stat & user.radio.FREQ_LISTENING)
+ channels[++channels.len] = ch_dat
- data["channels"] = channels
+ data["channels"] = channels
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- ui = new(user, user, id, "pai_radio.tmpl", "Radio Configuration", 300, 150)
- ui.set_initial_data(data)
- ui.open()
+ return data
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
+/datum/pai_software/radio_config/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
- P.radio.Topic(href, href_list)
- return 1
+ P.radio.Topic(href, href_list)
+ return 1
/datum/pai_software/crew_manifest
name = "Crew Manifest"
@@ -120,19 +125,17 @@
id = "manifest"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
+ autoupdate = 1
+ template_file = "pai_manifest.tmpl"
+ ui_title = "Crew Manifest"
- var/data[0]
- data_core.get_manifest_json()
- data["manifest"] = PDA_Manifest
+/datum/pai_software/crew_manifest/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
+ data_core.get_manifest_json()
+ data["manifest"] = PDA_Manifest
+
+ return data
/datum/pai_software/messenger
name = "Digital Messenger"
@@ -140,88 +143,88 @@
id = "messenger"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ autoupdate = 1
+ template_file = "pai_messenger.tmpl"
+ ui_title = "Digital Messenger"
- if(!user.pda)
- return
- var/datum/data/pda/app/messenger/M = user.pda.find_program(/datum/data/pda/app/messenger)
+/datum/pai_software/messenger/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
+
+ if(!user.pda)
+ log_runtime(EXCEPTION("pAI found without PDA."), user)
+ return data
+ var/datum/data/pda/app/messenger/M = user.pda.find_program(/datum/data/pda/app/messenger)
+ if(!M)
+ log_runtime(EXCEPTION("pAI PDA lacks a messenger program"), user)
+ return data
+
+ data["receiver_off"] = M.toff
+ data["ringer_off"] = M.notify_silent
+ data["current_ref"] = null
+ data["current_name"] = user.current_pda_messaging
+
+ var/pdas[0]
+ if(!M.toff)
+ for(var/obj/item/device/pda/P in PDAs)
+ var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
+
+ if(P == user.pda || !PM || !PM.can_receive())
+ continue
+ var/pda[0]
+ pda["name"] = "[P]"
+ pda["owner"] = "[P.owner]"
+ pda["ref"] = "\ref[P]"
+ if(P.owner == user.current_pda_messaging)
+ data["current_ref"] = "\ref[P]"
+ pdas[++pdas.len] = pda
+
+ data["pdas"] = pdas
+
+ var/messages[0]
+ if(user.current_pda_messaging)
+ for(var/index in M.tnote)
+ if(index["owner"] != user.current_pda_messaging)
+ continue
+ var/msg[0]
+ var/sent = index["sent"]
+ msg["sent"] = sent ? 1 : 0
+ msg["target"] = index["owner"]
+ msg["message"] = index["message"]
+ messages[++messages.len] = msg
+
+ data["messages"] = messages
+
+ return data
+
+/datum/pai_software/messenger/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
+
+ if(!isnull(P.pda))
+ var/datum/data/pda/app/messenger/M = P.pda.find_program(/datum/data/pda/app/messenger)
if(!M)
return
- data["receiver_off"] = M.toff
- data["ringer_off"] = M.notify_silent
- data["current_ref"] = null
- data["current_name"] = user.current_pda_messaging
+ if(href_list["toggler"])
+ M.toff = href_list["toggler"] != "1"
+ return 1
+ else if(href_list["ringer"])
+ M.notify_silent = href_list["ringer"] != "1"
+ return 1
+ else if(href_list["select"])
+ var/s = href_list["select"]
+ if(s == "*NONE*")
+ P.current_pda_messaging = null
+ else
+ P.current_pda_messaging = s
+ return 1
+ else if(href_list["target"])
+ if(P.silence_time)
+ return alert("Communications circuits remain uninitialized.")
- var/pdas[0]
- if(!M.toff)
- for(var/obj/item/device/pda/P in PDAs)
- var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
-
- if(P == user.pda || !PM || !PM.can_receive())
- continue
- var/pda[0]
- pda["name"] = "[P]"
- pda["owner"] = "[P.owner]"
- pda["ref"] = "\ref[P]"
- if(P.owner == user.current_pda_messaging)
- data["current_ref"] = "\ref[P]"
- pdas[++pdas.len] = pda
-
- data["pdas"] = pdas
-
- var/messages[0]
- if(user.current_pda_messaging)
- for(var/index in M.tnote)
- if(index["owner"] != user.current_pda_messaging)
- continue
- var/msg[0]
- var/sent = index["sent"]
- msg["sent"] = sent ? 1 : 0
- msg["target"] = index["owner"]
- msg["message"] = index["message"]
- messages[++messages.len] = msg
-
- data["messages"] = messages
-
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_messenger.tmpl", "Digital Messenger", 450, 600)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
-
- if(!isnull(P.pda))
- var/datum/data/pda/app/messenger/M = P.pda.find_program(/datum/data/pda/app/messenger)
- if(!M)
- return
-
- if(href_list["toggler"])
- M.toff = href_list["toggler"] != "1"
- return 1
- else if(href_list["ringer"])
- M.notify_silent = href_list["ringer"] != "1"
- return 1
- else if(href_list["select"])
- var/s = href_list["select"]
- if(s == "*NONE*")
- P.current_pda_messaging = null
- else
- P.current_pda_messaging = s
- return 1
- else if(href_list["target"])
- if(P.silence_time)
- return alert("Communications circuits remain uninitialized.")
-
- var/target = locate(href_list["target"])
- M.create_message(P, target, 1)
- return 1
+ var/target = locate(href_list["target"])
+ M.create_message(P, target, 1)
+ return 1
/datum/pai_software/chatroom
name = "Digital Chatroom"
@@ -229,116 +232,116 @@
id = "chatroom"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ autoupdate = 1
+ template_file = "pai_chatroom.tmpl"
+ ui_title = "Digital Chatroom"
- if(!user.pda)
- return
- var/datum/data/pda/app/chatroom/M = user.pda.find_program(/datum/data/pda/app/chatroom)
+/datum/pai_software/chatroom/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
+
+ if(!user.pda)
+ log_runtime(EXCEPTION("pAI found without PDA."), user)
+ return data
+ var/datum/data/pda/app/chatroom/M = user.pda.find_program(/datum/data/pda/app/chatroom)
+ if(!M)
+ log_runtime(EXCEPTION("pAI PDA lacks a chatroom program"), user)
+ return data
+
+ data["receiver_off"] = M.toff
+ data["ringer_off"] = M.notify_silent
+
+ var/list/rooms[0]
+ for(var/datum/chatroom/c in chatrooms)
+ if((M in c.users) || (M in c.invites) || c.is_public)
+ rooms += list(list(name = "[c]", ref = "\ref[c]"))
+ data["rooms"] = rooms
+
+ if(M.disconnected || !M.messaging_available(1))
+ data["disconnected"] = 1
+ else if(M.current_room)
+ data["current_room"] = "\ref[M.current_room]"
+ data["current_room_name"] = M.current_room.name
+ data["current_room_topic"] = M.current_room.topic
+ data["messages"] = M.current_room.logs
+ var/list/users[0]
+ for(var/U in M.current_room.users)
+ var/datum/data/pda/app/chatroom/ch = U
+ users += "[ch.pda.owner]"
+ for(var/U in (M.current_room.invites - M.current_room.users))
+ var/datum/data/pda/app/chatroom/ch = U
+ users += "[ch.pda.owner]"
+ data["users"] = users
+
+ return data
+
+/datum/pai_software/chatroom/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P))
+ return
+
+ if(!isnull(P.pda) && P.pda.can_use())
+ var/datum/data/pda/app/chatroom/M = P.pda.find_program(/datum/data/pda/app/chatroom)
if(!M)
return
- data["receiver_off"] = M.toff
- data["ringer_off"] = M.notify_silent
-
- var/list/rooms[0]
- for(var/datum/chatroom/c in chatrooms)
- if((M in c.users) || (M in c.invites) || c.is_public)
- rooms += list(list(name = "[c]", ref = "\ref[c]"))
- data["rooms"] = rooms
-
- if(M.disconnected || !M.messaging_available(1))
- data["disconnected"] = 1
- else if(M.current_room)
- data["current_room"] = "\ref[M.current_room]"
- data["current_room_name"] = M.current_room.name
- data["current_room_topic"] = M.current_room.topic
- data["messages"] = M.current_room.logs
- var/list/users[0]
- for(var/U in M.current_room.users)
- var/datum/data/pda/app/chatroom/ch = U
- users += "[ch.pda.owner]"
- for(var/U in (M.current_room.invites - M.current_room.users))
- var/datum/data/pda/app/chatroom/ch = U
- users += "[ch.pda.owner]"
- data["users"] = users
-
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_chatroom.tmpl", "Digital Chatroom", 450, 600)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P))
- return
-
- if(!isnull(P.pda) && P.pda.can_use())
- var/datum/data/pda/app/chatroom/M = P.pda.find_program(/datum/data/pda/app/chatroom)
- if(!M)
- return
-
- if(href_list["toggler"])
- M.toff = href_list["toggler"] != "1"
+ if(href_list["toggler"])
+ M.toff = href_list["toggler"] != "1"
+ return 1
+ else if(href_list["ringer"])
+ M.notify_silent = href_list["ringer"] != "1"
+ return 1
+ else if(href_list["topic"])
+ if(!M.current_room)
return 1
- else if(href_list["ringer"])
- M.notify_silent = href_list["ringer"] != "1"
- return 1
- else if(href_list["topic"])
- if(!M.current_room)
- return 1
- var/t = input("Enter new topic:", M.current_room, M.current_room.topic) as text|null
+ var/t = input("Enter new topic:", M.current_room, M.current_room.topic) as text|null
+ spawn()
+ if(!t || !M.check_messaging_available() || !P.pda.can_use())
+ return
+ t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
+ t = readd_quotes(t)
+ if(!t)
+ return
+
+ M.current_room.topic = t
+ M.current_room.announce(M, "Topic has been changed to '[t]' by [P.pda.owner].")
+ return 1
+ else if(href_list["select"])
+ var/s = href_list["select"]
+ if(s == "*NONE*")
+ M.current_room = null
+ else
+ var/datum/chatroom/CR = locate(s)
+ if(istype(CR))
+ if(!(M in CR.users))
+ if(!CR.login(M))
+ return
+ M.current_room = CR
+ return 1
+ else if(href_list["target"])
+ if(P.silence_time)
+ return alert("Communications circuits remain uninitialized.")
+
+ var/datum/chatroom/target = locate(href_list["target"])
+ if(istype(target))
+ if(!(M in target.users))
+ if(!target.login(M))
+ return
+ var/t = input("Please enter message", target) as text|null
spawn()
- if(!t || !M.check_messaging_available() || !P.pda.can_use())
+ if(!t || !M.check_messaging_available())
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
- if(!t)
+ if(!t || !P.pda.can_use())
return
- M.current_room.topic = t
- M.current_room.announce(M, "Topic has been changed to '[t]' by [P.pda.owner].")
- return 1
- else if(href_list["select"])
- var/s = href_list["select"]
- if(s == "*NONE*")
- M.current_room = null
- else
- var/datum/chatroom/CR = locate(s)
- if(istype(CR))
- if(!(M in CR.users))
- if(!CR.login(M))
- return
- M.current_room = CR
- return 1
- else if(href_list["target"])
- if(P.silence_time)
- return alert("Communications circuits remain uninitialized.")
-
- var/datum/chatroom/target = locate(href_list["target"])
- if(istype(target))
- if(!(M in target.users))
- if(!target.login(M))
- return
- var/t = input("Please enter message", target) as text|null
- spawn()
- if(!t || !M.check_messaging_available())
- return
- t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
- t = readd_quotes(t)
- if(!t || !P.pda.can_use())
- return
-
- target.post(M, t)
- return 1
- else if(href_list["reconnect"])
- spawn()
- M.messaging_available()
- return 1
+ target.post(M, t)
+ return 1
+ else if(href_list["reconnect"])
+ spawn()
+ M.messaging_available()
+ return 1
/datum/pai_software/med_records
name = "Medical Records"
@@ -346,53 +349,52 @@
id = "med_records"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ autoupdate = 1
+ template_file = "pai_medrecords.tmpl"
+ ui_title = "Medical Records"
- var/records[0]
- for(var/datum/data/record/general in sortRecord(data_core.general))
- var/record[0]
- record["name"] = general.fields["name"]
- record["ref"] = "\ref[general]"
- records[++records.len] = record
- data["records"] = records
+/datum/pai_software/med_records/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- var/datum/data/record/G = user.medicalActive1
- var/datum/data/record/M = user.medicalActive2
- data["general"] = G ? G.fields : null
- data["medical"] = M ? M.fields : null
- data["could_not_find"] = user.medical_cannotfind
+ var/records[0]
+ for(var/datum/data/record/general in sortRecord(data_core.general))
+ var/record[0]
+ record["name"] = general.fields["name"]
+ record["ref"] = "\ref[general]"
+ records[++records.len] = record
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
+ data["records"] = records
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
+ var/datum/data/record/G = user.medicalActive1
+ var/datum/data/record/M = user.medicalActive2
+ data["general"] = G ? G.fields : null
+ data["medical"] = M ? M.fields : null
+ data["could_not_find"] = user.medical_cannotfind
- if(href_list["select"])
- var/datum/data/record/record = locate(href_list["select"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/M = null
- if(!( data_core.general.Find(R) ))
- P.medical_cannotfind = 1
- else
- P.medical_cannotfind = 0
- for(var/datum/data/record/E in data_core.medical)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- P.medicalActive1 = R
- P.medicalActive2 = M
- else
+ return data
+
+/datum/pai_software/med_records/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
+
+ if(href_list["select"])
+ var/datum/data/record/record = locate(href_list["select"])
+ if(record)
+ var/datum/data/record/R = record
+ var/datum/data/record/M = null
+ if(!( data_core.general.Find(R) ))
P.medical_cannotfind = 1
- return 1
+ else
+ P.medical_cannotfind = 0
+ for(var/datum/data/record/E in data_core.medical)
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ M = E
+ P.medicalActive1 = R
+ P.medicalActive2 = M
+ else
+ P.medical_cannotfind = 1
+ return 1
/datum/pai_software/sec_records
name = "Security Records"
@@ -400,57 +402,56 @@
id = "sec_records"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ autoupdate = 1
+ template_file = "pai_secrecords.tmpl"
+ ui_title = "Security Records"
- var/records[0]
- for(var/datum/data/record/general in sortRecord(data_core.general))
- var/record[0]
- record["name"] = general.fields["name"]
- record["ref"] = "\ref[general]"
- records[++records.len] = record
- data["records"] = records
+/datum/pai_software/sec_records/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- var/datum/data/record/G = user.securityActive1
- var/datum/data/record/S = user.securityActive2
- data["general"] = G ? G.fields : null
- data["security"] = S ? S.fields : null
- data["could_not_find"] = user.security_cannotfind
+ var/records[0]
+ for(var/datum/data/record/general in sortRecord(data_core.general))
+ var/record[0]
+ record["name"] = general.fields["name"]
+ record["ref"] = "\ref[general]"
+ records[++records.len] = record
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
+ data["records"] = records
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
+ var/datum/data/record/G = user.securityActive1
+ var/datum/data/record/S = user.securityActive2
+ data["general"] = G ? G.fields : null
+ data["security"] = S ? S.fields : null
+ data["could_not_find"] = user.security_cannotfind
- if(href_list["select"])
- var/datum/data/record/record = locate(href_list["select"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/S = null
- if(!( data_core.general.Find(R) ))
- P.securityActive1 = null
- P.securityActive2 = null
- P.security_cannotfind = 1
- else
- P.security_cannotfind = 0
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
- P.securityActive1 = R
- P.securityActive2 = S
- else
+ return data
+
+/datum/pai_software/sec_records/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
+
+ if(href_list["select"])
+ var/datum/data/record/record = locate(href_list["select"])
+ if(record)
+ var/datum/data/record/R = record
+ var/datum/data/record/S = null
+ if(!( data_core.general.Find(R) ))
P.securityActive1 = null
P.securityActive2 = null
P.security_cannotfind = 1
- return 1
+ else
+ P.security_cannotfind = 0
+ for(var/datum/data/record/E in data_core.security)
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ S = E
+ P.securityActive1 = R
+ P.securityActive2 = S
+ else
+ P.securityActive1 = null
+ P.securityActive2 = null
+ P.security_cannotfind = 1
+ return 1
/datum/pai_software/door_jack
name = "Door Jack"
@@ -458,44 +459,44 @@
id = "door_jack"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ autoupdate = 1
+ template_file = "pai_doorjack.tmpl"
+ ui_title = "Door Jack"
+ ui_width = 300
+ ui_height = 150
- data["cable"] = user.cable != null
- data["machine"] = user.cable && (user.cable.machine != null)
- data["inprogress"] = user.hackdoor != null
- data["progress_a"] = round(user.hackprogress / 10)
- data["progress_b"] = user.hackprogress % 10
- data["aborted"] = user.hack_aborted
+/datum/pai_software/door_jack/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
+ data["cable"] = user.cable != null
+ data["machine"] = user.cable && (user.cable.machine != null)
+ data["inprogress"] = user.hackdoor != null
+ data["progress_a"] = round(user.hackprogress / 10)
+ data["progress_b"] = user.hackprogress % 10
+ data["aborted"] = user.hack_aborted
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
+ return data
- if(href_list["jack"])
- if(P.cable && P.cable.machine)
- P.hackdoor = P.cable.machine
- P.hackloop()
- return 1
- else if(href_list["cancel"])
- P.hackdoor = null
- return 1
- else if(href_list["cable"])
- var/turf/T = get_turf_or_move(P.loc)
- P.hack_aborted = 0
- P.cable = new /obj/item/weapon/pai_cable(T)
- for(var/mob/M in viewers(T))
- M.show_message("A port on [P] opens to reveal [P.cable], which promptly falls to the floor.", 3,
- "You hear the soft click of something light and hard falling to the ground.", 2)
- return 1
+/datum/pai_software/door_jack/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
+
+ if(href_list["jack"])
+ if(P.cable && P.cable.machine)
+ P.hackdoor = P.cable.machine
+ P.hackloop()
+ return 1
+ else if(href_list["cancel"])
+ P.hackdoor = null
+ return 1
+ else if(href_list["cable"])
+ var/turf/T = get_turf_or_move(P.loc)
+ P.hack_aborted = 0
+ P.cable = new /obj/item/weapon/pai_cable(T)
+ for(var/mob/M in viewers(T))
+ M.show_message("A port on [P] opens to reveal [P.cable], which promptly falls to the floor.", 3,
+ "You hear the soft click of something light and hard falling to the ground.", 2)
+ return 1
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
@@ -534,66 +535,68 @@
id = "atmos_sense"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ template_file = "pai_atmosphere.tmpl"
+ ui_title = "Atmosphere Sensor"
+ ui_width = 350
+ ui_height = 300
- var/turf/T = get_turf_or_move(user.loc)
- if(!T)
- data["reading"] = 0
- data["pressure"] = 0
- data["temperature"] = 0
- data["temperatureC"] = 0
- data["gas"] = list()
- else
- var/datum/gas_mixture/env = T.return_air()
- data["reading"] = 1
- data["pressure"] = env.return_pressure()
- data["temperature"] = round(env.temperature)
- data["temperatureC"] = round(env.temperature-T0C)
- var/t_moles = env.total_moles()
- var/gases[0]
- if(t_moles)
- var/n2[0]
- n2["name"] = "Nitrogen"
- n2["percent"] = round((env.nitrogen/t_moles)*100)
- var/o2[0]
- o2["name"] = "Oxygen"
- o2["percent"] = round((env.oxygen/t_moles)*100)
- var/co2[0]
- co2["name"] = "Carbon Dioxide"
- co2["percent"] = round((env.carbon_dioxide/t_moles)*100)
- var/plasma[0]
- plasma["name"] = "Plasma"
- plasma["percent"] = round((env.toxins/t_moles)*100)
- var/other[0]
- other["name"] = "Other"
- other["percent"] = round(1-((env.oxygen/t_moles)+(env.nitrogen/t_moles)+(env.carbon_dioxide/t_moles)+(env.toxins/t_moles)))
- gases[++gases.len] = n2
- gases[++gases.len] = o2
- gases[++gases.len] = co2
- gases[++gases.len] = plasma
- gases[++gases.len] = other
- data["gas"] = gases
+/datum/pai_software/atmosphere_sensor/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300)
- ui.set_initial_data(data)
- ui.open()
+ var/turf/T = get_turf_or_move(user.loc)
+ if(!T)
+ data["reading"] = 0
+ data["pressure"] = 0
+ data["temperature"] = 0
+ data["temperatureC"] = 0
+ data["gas"] = list()
+ else
+ var/datum/gas_mixture/env = T.return_air()
+ data["reading"] = 1
+ data["pressure"] = env.return_pressure()
+ data["temperature"] = round(env.temperature)
+ data["temperatureC"] = round(env.temperature-T0C)
+
+ var/t_moles = env.total_moles()
+ var/gases[0]
+ if(t_moles)
+ var/n2[0]
+ n2["name"] = "Nitrogen"
+ n2["percent"] = round((env.nitrogen/t_moles)*100)
+ var/o2[0]
+ o2["name"] = "Oxygen"
+ o2["percent"] = round((env.oxygen/t_moles)*100)
+ var/co2[0]
+ co2["name"] = "Carbon Dioxide"
+ co2["percent"] = round((env.carbon_dioxide/t_moles)*100)
+ var/plasma[0]
+ plasma["name"] = "Plasma"
+ plasma["percent"] = round((env.toxins/t_moles)*100)
+ var/other[0]
+ other["name"] = "Other"
+ other["percent"] = round(1-((env.oxygen/t_moles)+(env.nitrogen/t_moles)+(env.carbon_dioxide/t_moles)+(env.toxins/t_moles)))
+ gases[++gases.len] = n2
+ gases[++gases.len] = o2
+ gases[++gases.len] = co2
+ gases[++gases.len] = plasma
+ gases[++gases.len] = other
+ data["gas"] = gases
+
+ return data
/datum/pai_software/sec_hud
name = "Security HUD"
ram_cost = 20
id = "sec_hud"
- toggle(mob/living/silicon/pai/user)
- user.secHUD = !user.secHUD
- user.remove_med_sec_hud()
- if(user.secHUD)
- user.add_sec_hud()
- is_active(mob/living/silicon/pai/user)
+/datum/pai_software/sec_hud/toggle(mob/living/silicon/pai/user)
+ user.secHUD = !user.secHUD
+ user.remove_med_sec_hud()
+ if(user.secHUD)
+ user.add_sec_hud()
+
+/datum/pai_software/sec_hud/is_active(mob/living/silicon/pai/user)
return user.secHUD
/datum/pai_software/med_hud
@@ -601,48 +604,48 @@
ram_cost = 20
id = "med_hud"
- toggle(mob/living/silicon/pai/user)
- user.medHUD = !user.medHUD
- user.remove_med_sec_hud()
- if(user.medHUD)
- user.add_med_hud()
+/datum/pai_software/med_hud/toggle(mob/living/silicon/pai/user)
+ user.medHUD = !user.medHUD
+ user.remove_med_sec_hud()
+ if(user.medHUD)
+ user.add_med_hud()
- is_active(mob/living/silicon/pai/user)
- return user.medHUD
+/datum/pai_software/med_hud/is_active(mob/living/silicon/pai/user)
+ return user.medHUD
/datum/pai_software/translator
name = "Universal Translator"
ram_cost = 35
id = "translator"
- toggle(mob/living/silicon/pai/user)
- // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages
- user.translator_on = !user.translator_on
- if(user.translator_on)
- user.add_language("Sinta'unathi")
- user.add_language("Siik'tajr")
- user.add_language("Canilunzt")
- user.add_language("Skrellian")
- user.add_language("Vox-pidgin")
- user.add_language("Rootspeak")
- user.add_language("Chittin")
- user.add_language("Bubblish")
- user.add_language("Orluum")
- user.add_language("Clownish")
- else
- user.remove_language("Sinta'unathi")
- user.remove_language("Siik'tajr")
- user.remove_language("Canilunzt")
- user.remove_language("Skrellian")
- user.remove_language("Vox-pidgin")
- user.remove_language("Rootspeak")
- user.remove_language("Chittin")
- user.remove_language("Bubblish")
- user.remove_language("Orluum")
- user.remove_language("Clownish")
+/datum/pai_software/translator/toggle(mob/living/silicon/pai/user)
+ // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages
+ user.translator_on = !user.translator_on
+ if(user.translator_on)
+ user.add_language("Sinta'unathi")
+ user.add_language("Siik'tajr")
+ user.add_language("Canilunzt")
+ user.add_language("Skrellian")
+ user.add_language("Vox-pidgin")
+ user.add_language("Rootspeak")
+ user.add_language("Chittin")
+ user.add_language("Bubblish")
+ user.add_language("Orluum")
+ user.add_language("Clownish")
+ else
+ user.remove_language("Sinta'unathi")
+ user.remove_language("Siik'tajr")
+ user.remove_language("Canilunzt")
+ user.remove_language("Skrellian")
+ user.remove_language("Vox-pidgin")
+ user.remove_language("Rootspeak")
+ user.remove_language("Chittin")
+ user.remove_language("Bubblish")
+ user.remove_language("Orluum")
+ user.remove_language("Clownish")
- is_active(mob/living/silicon/pai/user)
- return user.translator_on
+/datum/pai_software/translator/is_active(mob/living/silicon/pai/user)
+ return user.translator_on
/datum/pai_software/signaller
name = "Remote Signaller"
@@ -650,42 +653,42 @@
id = "signaller"
toggle = 0
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
+ template_file = "pai_signaller.tmpl"
+ ui_title = "Signaller"
+ ui_width = 320
+ ui_height = 150
- data["frequency"] = format_frequency(user.sradio.frequency)
- data["code"] = user.sradio.code
+/datum/pai_software/signaller/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
- ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150)
- ui.set_initial_data(data)
- ui.open()
+ data["frequency"] = format_frequency(user.sradio.frequency)
+ data["code"] = user.sradio.code
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
+ return data
- if(href_list["send"])
- P.sradio.send_signal("ACTIVATE")
- for(var/mob/O in hearers(1, P.loc))
- O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2)
- return 1
+/datum/pai_software/signaller/Topic(href, href_list)
+ var/mob/living/silicon/pai/P = usr
+ if(!istype(P)) return
- else if(href_list["freq"])
- var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"]))
- if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ)
- new_frequency = sanitize_frequency(new_frequency)
- P.sradio.set_frequency(new_frequency)
- return 1
+ if(href_list["send"])
+ P.sradio.send_signal("ACTIVATE")
+ for(var/mob/O in hearers(1, P.loc))
+ O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2)
+ return 1
- else if(href_list["code"])
- P.sradio.code += text2num(href_list["code"])
- P.sradio.code = round(P.sradio.code)
- P.sradio.code = min(100, P.sradio.code)
- P.sradio.code = max(1, P.sradio.code)
- return 1
+ else if(href_list["freq"])
+ var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"]))
+ if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ)
+ new_frequency = sanitize_frequency(new_frequency)
+ P.sradio.set_frequency(new_frequency)
+ return 1
+
+ else if(href_list["code"])
+ P.sradio.code += text2num(href_list["code"])
+ P.sradio.code = round(P.sradio.code)
+ P.sradio.code = min(100, P.sradio.code)
+ P.sradio.code = max(1, P.sradio.code)
+ return 1
/datum/pai_software/host_scan
name = "Host Bioscan"
@@ -693,36 +696,33 @@
id = "bioscan"
toggle = 0
+ template_file = "pai_bioscan.tmpl"
+ ui_title = "Host Bioscan"
+ ui_width = 400
+ ui_height = 350
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
+/datum/pai_software/host_scan/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = self_state)
+ var/data[0]
+ var/mob/living/held = user.loc
+ var/count = 0
- var/data[0]
- var/mob/living/held = user.loc
- var/count = 0
+ // Find the carrier
+ while(!isliving(held))
+ if(!held || !held.loc || count > 6)
+ //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
+ to_chat(user, "You are not being carried by anyone!")
+ return 0
+ held = held.loc
+ count++
+ if(isliving(held))
+ data["holder"] = held
+ data["health"] = "[held.stat > 1 ? "dead" : "[held.health]% healthy"]"
+ data["brute"] = "[held.getBruteLoss() > 50 ? "" : ""][held.getBruteLoss()]"
+ data["oxy"] = "[held.getOxyLoss() > 50 ? "" : ""][held.getOxyLoss()]"
+ data["tox"] = "[held.getToxLoss() > 50 ? "" : ""][held.getToxLoss()]"
+ data["burn"] = "[held.getFireLoss() > 50 ? "" : ""][held.getFireLoss()]"
+ data["temp"] = "[held.bodytemperature-T0C]°C ([held.bodytemperature*1.8-459.67]°F)"
+ else
+ data["holder"] = 0
- // Find the carrier
- while(!isliving(held))
- if(!held || !held.loc || count > 6)
- //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
- to_chat(user, "You are not being carried by anyone!")
- return 0
- held = held.loc
- count++
- if(isliving(held))
- data["holder"] = held
- data["health"] = "[held.stat > 1 ? "dead" : "[held.health]% healthy"]"
- data["brute"] = "[held.getBruteLoss() > 50 ? "" : ""][held.getBruteLoss()]"
- data["oxy"] = "[held.getOxyLoss() > 50 ? "" : ""][held.getOxyLoss()]"
- data["tox"] = "[held.getToxLoss() > 50 ? "" : ""][held.getToxLoss()]"
- data["burn"] = "[held.getFireLoss() > 50 ? "" : ""][held.getFireLoss()]"
- data["temp"] = "[held.bodytemperature-T0C]°C ([held.bodytemperature*1.8-459.67]°F)"
- else
- data["holder"] = 0
-
- ui = nanomanager.try_update_ui(user, user, id, ui,data , force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_bioscan.tmpl", "Host Bioscan", 400, 350)
- ui.set_initial_data(data)
- ui.open()
- //.set_auto_update(1)
+ return data
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 0e354b4c4a6..fdc1ace289c 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -285,6 +285,7 @@
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(src)
+ player.mob.mind.assigned_role = "Drone"
lawupdate = 0
to_chat(src, "Systems rebooted. Loading base pattern maintenance protocol... loaded.")
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
new file mode 100644
index 00000000000..fafd30a4ae4
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
@@ -0,0 +1,11 @@
+
+#define SPINNING_WEB 1
+#define LAYING_EGGS 2
+#define MOVING_TO_TARGET 3
+#define SPINNING_COCOON 4
+
+#define TS_TIER_1 1
+#define TS_TIER_2 2
+#define TS_TIER_3 3
+#define TS_TIER_4 4
+#define TS_TIER_5 5
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
new file mode 100644
index 00000000000..2111f350b0b
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
@@ -0,0 +1,127 @@
+
+
+/datum/action/innate/terrorspider/web
+ name = "Web"
+ icon_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "stickyweb1"
+
+/datum/action/innate/terrorspider/web/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
+ user.Web()
+
+/datum/action/innate/terrorspider/wrap
+ name = "Wrap"
+ icon_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "cocoon_large1"
+
+/datum/action/innate/terrorspider/wrap/Activate()
+ var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
+ user.FindWrapTarget()
+ user.DoWrap()
+
+
+// ---------- WEB
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web()
+ visible_message("[src] begins to secrete a sticky substance.")
+ if(do_after(src, 40, target = loc))
+ var/obj/effect/spider/terrorweb/T = locate() in get_turf(src)
+ if(T)
+ to_chat(src, "There is already a web here.")
+ else
+ new /obj/effect/spider/terrorweb(loc)
+
+/obj/effect/spider/terrorweb
+ name = "terror web"
+ desc = "it's stringy and sticky"
+ icon = 'icons/effects/effects.dmi'
+ anchored = 1 // prevents people dragging it
+ density = 0 // prevents it blocking all movement
+ health = 20 // two welders, or one laser shot (15 for the normal spider webs)
+ icon_state = "stickyweb1"
+
+
+/obj/effect/spider/terrorweb/New()
+ ..()
+ if(prob(50))
+ icon_state = "stickyweb2"
+
+
+/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider))
+ return 1
+ if(isliving(mover))
+ if(prob(80))
+ to_chat(mover, "You get stuck in [src] for a moment.")
+ var/mob/living/M = mover
+ M.Stun(4) // 8 seconds.
+ M.Weaken(4) // 8 seconds.
+ return 1
+ else
+ return 0
+ if(istype(mover, /obj/item/projectile))
+ return prob(20)
+ return ..()
+
+
+
+
+// ---------- WRAP
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/FindWrapTarget()
+ if(!cocoon_target)
+ var/list/choices = list()
+ for(var/mob/living/L in oview(1,src))
+ if(Adjacent(L))
+ if(L.stat == DEAD)
+ choices += L
+ for(var/obj/O in oview(1,src))
+ if(Adjacent(O) && !O.anchored)
+ if(!istype(O, /obj/effect/spider/terrorweb) && !istype(O, /obj/effect/spider/cocoon))
+ choices += O
+ if(choices.len)
+ cocoon_target = input(src,"What do you wish to cocoon?") in null|choices
+ else
+ to_chat(src, "There is nothing nearby you can wrap.")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoWrap()
+ if(cocoon_target && busy != SPINNING_COCOON)
+ busy = SPINNING_COCOON
+ visible_message("[src] begins to secrete a sticky substance around [cocoon_target].")
+ stop_automated_movement = 1
+ walk(src,0)
+ if(do_after(src, 40, target = cocoon_target.loc))
+ if(busy == SPINNING_COCOON)
+ if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1)
+ var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
+ var/large_cocoon = 0
+ C.pixel_x = cocoon_target.pixel_x
+ C.pixel_y = cocoon_target.pixel_y
+ for(var/obj/O in C.loc)
+ if(istype(O, /obj/item))
+ O.loc = C
+ else if(istype(O, /obj/machinery) || istype(O, /obj/structure))
+ O.loc = C
+ large_cocoon = 1
+ for(var/mob/living/L in C.loc)
+ if(istype(L, /mob/living/simple_animal/hostile/poison/terror_spider))
+ continue
+ if(L.stat != DEAD)
+ continue
+ if(iscarbon(L))
+ regen_points += regen_points_per_kill
+ fed++
+ large_cocoon = 1
+ last_cocoon_object = 0
+ L.loc = C
+ C.pixel_x = L.pixel_x
+ C.pixel_y = L.pixel_y
+ visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out.")
+ break
+ if(large_cocoon)
+ C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
+ cocoon_target = null
+ busy = 0
+ stop_automated_movement = 0
+
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
new file mode 100644
index 00000000000..68d25a29492
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
@@ -0,0 +1,38 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T2 BLACK TERROR ------------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: assassin, poisoner, DoT expert
+// -------------: AI: attacks to inject its venom, then retreats. Will inject its enemies multiple times then hang back to ensure they die.
+// -------------: SPECIAL: venom that does more damage the more of it is in you
+// -------------: TO FIGHT IT: if bitten once, retreat, get charcoal/etc treatment, and come back with a gun.
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/black
+ name = "Black Terror spider"
+ desc = "An ominous-looking spider, black as the darkest night, and with merciless eyes and a blood-red hourglass pattern on its back."
+ spider_role_summary = "Hit-and-run attacker with extremely venomous bite."
+
+ icon_state = "terror_widow"
+ icon_living = "terror_widow"
+ icon_dead = "terror_widow_dead"
+ maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but its bite will kill you!
+ health = 120
+ melee_damage_lower = 5
+ melee_damage_upper = 10
+ move_to_delay = 5
+ stat_attack = 1 // ensures they will target people in crit, too!
+ spider_tier = TS_TIER_2
+
+/mob/living/simple_animal/hostile/poison/terror_spider/black/spider_specialattack(mob/living/carbon/human/L, poisonable)
+ if(!poisonable)
+ return ..()
+ if(L.reagents.has_reagent("terror_black_toxin", 50))
+ return ..()
+ var/inject_target = pick("chest", "head")
+ if(L.stunned || L.can_inject(null, 0, inject_target, 0))
+ L.reagents.add_reagent("terror_black_toxin", 15) // inject our special poison
+ visible_message("[src] buries its long fangs deep into the [inject_target] of [target]!")
+ else
+ visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!")
+ L.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm
new file mode 100644
index 00000000000..8ad926a8729
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/chem.dm
@@ -0,0 +1,33 @@
+// Terror Spider, Black, Deadly Venom
+
+/datum/reagent/terror_black_toxin
+ name = "Black Widow venom"
+ id = "terror_black_toxin"
+ description = "An incredibly toxic venom injected by the Black Widow spider."
+ color = "#CF3600"
+ metabolization_rate = 0.1
+
+/datum/reagent/terror_black_toxin/on_mob_life(mob/living/M)
+ if(volume < 15)
+ // bitten once, die slowly. Easy to survive a single bite - just go to medbay.
+ // total damage: 2/tick, human health 150 until crit, = 75 ticks, = 150 seconds = 2.5 minutes to get to medbay.
+ M.adjustToxLoss(2) // same damage/tick as tabun cycle 0 to 60
+ else if(volume < 30)
+ // bitten twice, die more quickly, muscle cramps make movement difficult. Call medics immediately.
+ // total damage: 4, human health 150 until crit, = 37.5 ticks, = 75s = 1m15s until death
+ M.adjustToxLoss(4)
+ M.Confused(3)
+ M.EyeBlurry(3)
+ else if(volume < 45)
+ // bitten thrice, die very quickly, severe muscle cramps make movement very difficult. Even calling for help probably won't save you.
+ // total damage: 8, human health 150 until crit, = 18.75 ticks, = 37s until death
+ M.adjustToxLoss(8) // a bit worse than coiine
+ M.Confused(6)
+ M.EyeBlurry(6)
+ else
+ // bitten 4 or more times, whole body goes into shock/death
+ // total damage: 12, human health 150 until crit, = 12.5 ticks, = 25s until death
+ M.adjustToxLoss(12)
+ M.EyeBlurry(6)
+ M.Paralyse(5)
+ ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
new file mode 100644
index 00000000000..06703cc2106
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
@@ -0,0 +1,43 @@
+
+/mob/living/simple_animal/hostile/poison/terror_spider/Topic(href, href_list)
+ if(href_list["activate"])
+ var/mob/dead/observer/ghost = usr
+ if(istype(ghost))
+ humanize_spider(ghost)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/attack_ghost(mob/user)
+ humanize_spider(user)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/humanize_spider(mob/user)
+ if(key)//Someone is in it
+ return
+ var/error_on_humanize = ""
+ var/humanize_prompt = "Take direct control of [src]?"
+ humanize_prompt += "Role: [spider_role_summary]"
+ if(user.ckey in ts_ckey_blacklist)
+ error_on_humanize = "You are not able to control any terror spider this round."
+ else if(!ai_playercontrol_allowingeneral)
+ error_on_humanize = "Terror spiders cannot currently be player-controlled."
+ else if(spider_awaymission)
+ error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts."
+ else if(!ai_playercontrol_allowtype)
+ error_on_humanize = "This specific type of terror spider is not player-controllable."
+ else if(stat == DEAD)
+ error_on_humanize = "Dead spiders are not player-controllable."
+ if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien"))
+ to_chat(user,"You are jobbanned from role of syndicate and/or alien lifeform.")
+ return
+ if(error_on_humanize == "")
+ var/spider_ask = alert(humanize_prompt, "Join as Terror Spider?", "Yes", "No")
+ if(spider_ask == "No" || !src || qdeleted(src))
+ return
+ else
+ to_chat(user, "Cannot inhabit spider: [error_on_humanize]")
+ return
+ if(key)
+ to_chat(user, "Someone else already took this spider.")
+ return
+ key = user.key
+ for(var/mob/dead/observer/G in player_list)
+ G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).")
+
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
new file mode 100644
index 00000000000..42c16cc7666
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
@@ -0,0 +1,40 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T1 GRAY TERROR -------------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: fast, weak terror spider
+// -------------: SPECIAL: silences targets
+// -------------: TO FIGHT IT: shoot it!
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray
+ name = "Gray Terror spider"
+ desc = "An ominous-looking gray spider, it seems jittery."
+ spider_role_summary = "Fast-moving but weak spider."
+ icon_state = "terror_gray"
+ icon_living = "terror_gray"
+ icon_dead = "terror_gray_dead"
+ maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but silences its targets
+ health = 120
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+ ventcrawler = 1
+ move_to_delay = 5 // normal speed
+ stat_attack = 1 // ensures they will target people in crit, too!
+ environment_smash = 1
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(mob/living/carbon/human/L, poisonable)
+ if(!poisonable)
+ ..()
+ return
+ if(L.silent >= 10)
+ L.attack_animal(src)
+ else
+ var/inject_target = pick("chest","head")
+ if(L.stunned || L.can_inject(null,0,inject_target,0))
+ L.Silence(20) // instead of having a venom that only lasts seconds, we just add the silence directly.
+ visible_message("[src] buries grey fangs deep into the [inject_target] of [target]!")
+ else
+ visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!")
+ L.attack_animal(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
new file mode 100644
index 00000000000..669449a6ae3
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
@@ -0,0 +1,35 @@
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T3 PRINCE OF TERROR --------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: boss
+// -------------: AI: no special ai
+// -------------: SPECIAL: massive health
+// -------------: TO FIGHT IT: a squad of at least 4 people with laser rifles.
+// -------------: SPRITES FROM: Travelling Merchant, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=2766
+
+/mob/living/simple_animal/hostile/poison/terror_spider/prince
+ name = "Prince of Terror spider"
+ desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Its hide seems armored, and it bears the scars of many battles."
+ spider_role_summary = "Boss-level terror spider. Lightning bruiser. Capable of taking on a squad by itself."
+ icon_state = "terror_allblack"
+ icon_living = "terror_allblack"
+ icon_dead = "terror_allblack_dead"
+ maxHealth = 400 // 20 laser shots.
+ health = 400
+ melee_damage_lower = 15
+ melee_damage_upper = 25
+ move_to_delay = 5
+ ventcrawler = 1
+ loot = list(/obj/item/clothing/accessory/medal)
+ spider_tier = TS_TIER_3
+ spider_opens_doors = 2
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L)
+ if(prob(15))
+ visible_message("[src] rams into [L], knocking them to the floor!")
+ L.Weaken(5)
+ L.Stun(5)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
new file mode 100644
index 00000000000..33480f9509c
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
@@ -0,0 +1,60 @@
+
+
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T1 RED TERROR --------------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: generic attack spider
+// -------------: AI: uses very powerful fangs to wreck people in melee
+// -------------: SPECIAL: the more you hurt it, the harder it bites you
+// -------------: TO FIGHT IT: shoot it from range. Kite it.
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/red
+ name = "Red Terror spider"
+ desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs! It looks like it has a vicious streak a mile wide."
+
+ spider_role_summary = "High health, high damage, very slow, melee juggernaut"
+
+ icon_state = "terror_red"
+ icon_living = "terror_red"
+ icon_dead = "terror_red_dead"
+ maxHealth = 200
+ health = 200
+ melee_damage_lower = 15
+ melee_damage_upper = 20
+ move_to_delay = 20
+ spider_opens_doors = 2
+ var/enrage = 0
+ var/melee_damage_lower_rage0 = 15
+ var/melee_damage_upper_rage0 = 20
+ var/melee_damage_lower_rage1 = 15
+ var/melee_damage_upper_rage1 = 35
+ var/melee_damage_lower_rage2 = 35
+ var/melee_damage_upper_rage2 = 40
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/red/AttackingTarget()
+ if(enrage == 0)
+ if(health < maxHealth)
+ enrage = 1
+ visible_message("[src] growls, flexing its fangs!")
+ melee_damage_lower = melee_damage_lower_rage1
+ melee_damage_upper = melee_damage_upper_rage1
+ else if(enrage == 1)
+ if(health == maxHealth)
+ enrage = 0
+ visible_message("[src] retracts its fangs a little.")
+ melee_damage_lower = melee_damage_lower_rage0
+ melee_damage_upper = melee_damage_upper_rage0
+ else if(health < (maxHealth/2))
+ enrage = 2
+ visible_message("[src] growls, spreading its fangs wide!")
+ melee_damage_lower = melee_damage_lower_rage2
+ melee_damage_upper = melee_damage_upper_rage2
+ else if(enrage == 2)
+ if(health > (maxHealth/2))
+ enrage = 1
+ visible_message("[src] retracts its fangs a little.")
+ melee_damage_lower = melee_damage_lower_rage0
+ melee_damage_upper = melee_damage_upper_rage0
+ ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
new file mode 100644
index 00000000000..67683d39b39
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -0,0 +1,329 @@
+
+var/global/list/ts_ckey_blacklist = list()
+var/global/ts_count_dead = 0
+var/global/ts_count_alive_awaymission = 0
+var/global/ts_count_alive_station = 0
+var/global/ts_death_last = 0
+var/global/ts_death_window = 9000 // 15 minutes
+var/global/list/ts_spiderlist = list()
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: DEFAULTS ---------------------------------
+// --------------------------------------------------------------------------------
+// Because: http://tvtropes.org/pmwiki/pmwiki.php/Main/SpidersAreScary
+
+/mob/living/simple_animal/hostile/poison/terror_spider
+ // Name / Description
+ name = "terror spider"
+ desc = "The generic parent of all other terror spider types. If you see this in-game, it is a bug."
+
+ // Icons
+ icon = 'icons/mob/terrorspider.dmi'
+ icon_state = "terror_red"
+ icon_living = "terror_red"
+ icon_dead = "terror_red_dead"
+
+ // Health
+ maxHealth = 120
+ health = 120
+
+ // Melee attacks
+ melee_damage_lower = 15
+ melee_damage_upper = 20
+ attacktext = "bites"
+ attack_sound = 'sound/weapons/bite.ogg'
+ poison_type = "" // we do not use that silly system.
+
+ // Movement
+ move_to_delay = 6
+ turns_per_move = 5
+ pass_flags = PASSTABLE
+
+ // Ventcrawling
+ ventcrawler = 1 // allows player ventcrawling
+
+ // Speech
+ speak_chance = 0 // quiet but deadly
+ speak_emote = list("hisses")
+ emote_hear = list("hisses")
+
+ // Languages are handled in terror_spider/New()
+
+ // Interaction keywords
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+
+ // regeneration settings - overridable by child classes
+ var/regen_points = 0 // number of regen points they have by default
+ var/regen_points_max = 100 // max number of points they can accumulate
+ var/regen_points_per_tick = 1 // gain one regen point per tick
+ var/regen_points_per_kill = 90 // gain extra regen points if you kill something
+ var/regen_points_per_hp = 3 // every X regen points = 1 health point you can regen
+ // desired: 20hp/minute unmolested, 40hp/min on food boost, assuming one tick every 2 seconds
+ // 90/kill means bonus 30hp/kill regenerated over the next 1-2 minutes
+
+ // Vision
+ idle_vision_range = 10
+ aggro_vision_range = 10
+ see_in_dark = 10
+ nightvision = 1
+ vision_type = new /datum/vision_override/nightvision/thermals/ling_augmented_eyesight
+ see_invisible = 5
+
+ // player control by ghosts
+ var/ai_playercontrol_allowingeneral = 1 // if 0, no spiders are player controllable. Default set in code, can be changed by queens.
+ var/ai_playercontrol_allowtype = 1 // if 0, this specific class of spider is not player-controllable. Default set in code for each class, cannot be changed.
+
+ var/spider_opens_doors = 1 // all spiders can open firedoors (they have no security). 1 = can open depowered doors. 2 = can open powered doors
+ faction = list("terrorspiders")
+ var/spider_awaymission = 0 // if 1, limits certain behavior in away missions
+ var/spider_role_summary = "UNDEFINED"
+ var/spider_placed = 0
+
+ // AI variables designed for use in procs
+ var/atom/cocoon_target // for queen and nurse
+ var/obj/machinery/atmospherics/unary/vent_pump/entry_vent // nearby vent they are going to try to get to, and enter
+ var/obj/machinery/atmospherics/unary/vent_pump/exit_vent // remote vent they intend to come out of
+ var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens
+ var/fed = 0
+ var/travelling_in_vent = 0
+ var/busy = 0 // leave this alone!
+ var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen, 5 for empress.
+ var/hasdied = 0
+ var/attackstep = 0
+ var/attackcycles = 0
+ var/mylocation = null
+ var/chasecycles = 0
+ var/last_cocoon_object = 0 // leave this, changed by procs.
+ var/killcount = 0
+
+ // Breathing, Pressure & Fire
+ // - No breathing / cannot be suffocated (spiders can hold their breath, look it up)
+ // - No pressure damage either - they have effectively exoskeletons
+ // - HOWEVER they can be burned to death!
+ // - Normal SPACE spiders should probably be immune to SPACE too, but meh, we try to leave the base spiders alone.
+ atmos_requirements = list("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
+ maxbodytemp = 1500
+ heat_damage_per_tick = 5 //amount of damage applied if animal's body temperature is higher than maxbodytemp
+
+ // DEBUG OPTIONS & COMMANDS
+ var/spider_debug = 0
+
+ var/datum/action/innate/terrorspider/web/web_action
+ var/datum/action/innate/terrorspider/wrap/wrap_action
+
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: SHARED ATTACK CODE -----------------------
+// --------------------------------------------------------------------------------
+
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/AttackingTarget()
+ if(istype(target, /mob/living/simple_animal/hostile/poison/terror_spider))
+ var/mob/living/simple_animal/hostile/poison/terror_spider/T = target
+ if(T.spider_tier > spider_tier)
+ visible_message("[src] bows in respect for the terrifying presence of [target].")
+ else if(T.spider_tier == spider_tier)
+ visible_message("[src] nuzzles [target].")
+ else if(T.spider_tier < spider_tier && spider_tier >= 4)
+ visible_message("[src] gives [target] a stern look.")
+ else
+ visible_message("[src] harmlessly nuzzles [target].")
+ T.CheckFaction()
+ CheckFaction()
+ else if(istype(target, /obj/effect/spider/cocoon))
+ to_chat(src, "Destroying our own cocoons would not help us.")
+ else if(istype(target, /obj/machinery/door/firedoor))
+ var/obj/machinery/door/firedoor/F = target
+ if(F.density)
+ if(F.blocked)
+ to_chat(src, "The fire door is welded shut.")
+ else
+ visible_message("\The [src] pries open the firedoor!")
+ F.open()
+ else
+ to_chat(src, "Closing fire doors does not help.")
+ else if(istype(target, /obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/A = target
+ if(A.density)
+ try_open_airlock(A)
+ else if(isliving(target))
+ var/mob/living/G = target
+ if(issilicon(G))
+ G.attack_animal(src)
+ return
+ else if(G.reagents && (iscarbon(G)))
+ var/can_poison = 1
+ if(ishuman(G))
+ var/mob/living/carbon/human/H = G
+ if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON))
+ can_poison = 0
+ spider_specialattack(G,can_poison)
+ else
+ G.attack_animal(src)
+ else
+ target.attack_animal(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_specialattack(mob/living/carbon/human/L, var/poisonable)
+ L.attack_animal(src)
+
+
+
+
+
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: PROC OVERRIDES ---------------------------
+// --------------------------------------------------------------------------------
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/examine(mob/user)
+ ..()
+ var/list/msgs = list()
+ if(stat == DEAD)
+ msgs += "It appears to be dead.\n"
+ else
+ if(key)
+ msgs += "Its eyes regard you with a curious intelligence."
+ if(health > (maxHealth*0.95))
+ msgs += "It is in excellent health."
+ else if(health > (maxHealth*0.75))
+ msgs += "It has a few injuries."
+ else if(health > (maxHealth*0.55))
+ msgs += "It has many injuries."
+ else if(health > (maxHealth*0.25))
+ msgs += "It is barely clinging on to life!"
+ else if(health < maxHealth && regen_points > regen_points_per_kill)
+ msgs += "It appears to be regenerating quickly."
+ if(killcount >= 1)
+ msgs += "It has blood dribbling from its mouth."
+ to_chat(usr,msgs.Join("
"))
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/New()
+ ..()
+ ts_spiderlist += src
+ add_language("Spider Hivemind")
+ add_language("Galactic Common")
+ default_language = all_languages["Spider Hivemind"]
+
+ web_action = new()
+ web_action.Grant(src)
+ wrap_action = new()
+ wrap_action.Grant(src)
+
+ name += " ([rand(1, 1000)])"
+ msg_terrorspiders("[src] has grown in [get_area(src)].")
+ if(is_away_level(z))
+ spider_awaymission = 1
+ ts_count_alive_awaymission++
+ else
+ ts_count_alive_station++
+ // after 30 seconds, assuming nobody took control of it yet, offer it to ghosts.
+ addtimer(src, "CheckFaction", 150)
+ addtimer(src, "announcetoghosts", 300)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/announcetoghosts()
+ if(spider_awaymission)
+ return
+ if(stat == DEAD)
+ return
+ if(ckey)
+ var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state)
+ notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay)
+ else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype)
+ var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state)
+ notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "(Click to control)", source = src, alert_overlay = alert_overlay, attack_not_jump = 1)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/Destroy()
+ ts_spiderlist -= src
+ handle_dying()
+ return ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/Life()
+ ..()
+ if(stat == DEAD)
+ if(prob(2))
+ // 2% chance every cycle to decompose
+ visible_message("\The dead body of the [src] decomposes!")
+ gib()
+ else
+ if(regen_points < regen_points_max)
+ regen_points += regen_points_per_tick
+ if((bruteloss > 0) || (fireloss > 0))
+ if(regen_points > regen_points_per_hp)
+ if(bruteloss > 0)
+ adjustBruteLoss(-1)
+ regen_points -= regen_points_per_hp
+ else if(fireloss > 0)
+ adjustFireLoss(-1)
+ regen_points -= regen_points_per_hp
+ if(prob(5))
+ CheckFaction()
+
+
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying()
+ if(!hasdied)
+ hasdied = 1
+ ts_count_dead++
+ ts_death_last = world.time
+ if(spider_awaymission)
+ ts_count_alive_awaymission--
+ else
+ ts_count_alive_station--
+
+/mob/living/simple_animal/hostile/poison/terror_spider/death(gibbed)
+ if(!gibbed)
+ msg_terrorspiders("[src] has died in [get_area(src)].")
+ handle_dying()
+ ..()
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/spider_special_action()
+ return
+
+/mob/living/simple_animal/hostile/poison/terror_spider/Bump(atom/A)
+ if(istype(A, /obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/L = A
+ if(L.density)
+ try_open_airlock(L)
+ if(istype(A, /obj/machinery/door/firedoor))
+ var/obj/machinery/door/firedoor/F = A
+ if(F.density && !F.blocked)
+ F.open()
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/msg_terrorspiders(msgtext)
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ if(T.stat != DEAD)
+ to_chat(T, "TerrorSense: [msgtext]")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/CheckFaction()
+ if(faction.len != 1 || (!("terrorspiders" in faction)) || master_commander != null)
+ visible_message("[src] writhes in pain!")
+ log_runtime(EXCEPTION("Terror spider created with incorrect faction list at: [atom_loc_line(src)]"))
+ death()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/try_open_airlock(obj/machinery/door/airlock/D)
+ if(D.operating)
+ return
+ if(!D.density)
+ to_chat(src, "Closing doors does not help us.")
+ else if(D.welded)
+ to_chat(src, "The door is welded shut.")
+ else if(D.locked)
+ to_chat(src, "The door is bolted shut.")
+ else if(D.allowed(src))
+ D.open(1)
+ else if(D.arePowerSystemsOn() && (spider_opens_doors != 2))
+ to_chat(src, "The door's motors resist your efforts to force it.")
+ else if(!spider_opens_doors)
+ to_chat(src, "Your type of spider is not strong enough to force open doors.")
+ else
+ visible_message("[src] pries open the door!")
+ playsound(src.loc, "sparks", 100, 1)
+ D.open(1)
\ No newline at end of file
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index f8a73364264..3c5e3ac0130 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -244,8 +244,10 @@
if(!job.is_position_available()) return 0
if(jobban_isbanned(src,rank)) return 0
if(!is_job_whitelisted(src, rank)) return 0
- if(!job.player_old_enough(src.client)) return 0
+ if(!job.player_old_enough(client)) return 0
if(job.admin_only && !(check_rights(R_EVENT, 0))) return 0
+ if(job.available_in_playtime(client))
+ return 0
if(config.assistantlimit)
if(job.title == "Civilian")
diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm
index cf90b61bf29..015d0990ee7 100644
--- a/code/modules/nano/modules/alarm_monitor.dm
+++ b/code/modules/nano/modules/alarm_monitor.dm
@@ -62,7 +62,7 @@
ui.open()
ui.set_auto_update(1)
-/datum/nano_module/alarm_monitor/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/nano_module/alarm_monitor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/categories[0]
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index ee776ba4467..0670193e498 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -39,7 +39,7 @@
ui.set_auto_update(1)
ui_ref = ui
-/datum/nano_module/atmos_control/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/nano_module/atmos_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["alarms"] = air_alarm_repository.air_alarm_data(monitored_alarms)
return data
diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm
index c5f8f6ecfb8..05749741461 100644
--- a/code/modules/nano/modules/crew_monitor.dm
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -31,7 +31,7 @@
// should make the UI auto-update; doesn't seem to?
ui.set_auto_update(1)
-/datum/nano_module/crew_monitor/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/nano_module/crew_monitor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/turf/T = get_turf(nano_host())
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 8bc9058db37..21636465d4a 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -217,7 +217,7 @@
ui.open()
ui.set_auto_update(1)
-/datum/nano_module/appearance_changer/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/nano_module/appearance_changer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
generate_data(check_whitelist, whitelist, blacklist)
var/data[0]
diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm
index 0d79f719677..92378e3abcc 100644
--- a/code/modules/nano/modules/law_manager.dm
+++ b/code/modules/nano/modules/law_manager.dm
@@ -154,7 +154,7 @@
ui.open()
ui.set_auto_update(1)
-/datum/nano_module/law_manager/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/nano_module/law_manager/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
owner.lawsync()
diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm
index 1ebe6e99c9f..33e08b00e83 100644
--- a/code/modules/nano/modules/power_monitor.dm
+++ b/code/modules/nano/modules/power_monitor.dm
@@ -18,7 +18,7 @@
ui.open()
ui.set_auto_update(1)
-/datum/nano_module/power_monitor/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/nano_module/power_monitor/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["powermonitor"] = powermonitor
diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm
index 288a9df2255..6864c834f3a 100644
--- a/code/modules/nano/nanoexternal.dm
+++ b/code/modules/nano/nanoexternal.dm
@@ -44,11 +44,12 @@
* The ui_data proc is used to get data for the interface
*
* @param user /mob The mob who is viewing this ui
+ * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main")
* @param state /datum/topic_state Current topic state of the UI
*
* @return list()
*/
-/datum/proc/ui_data(mob/user, datum/topic_state/state = default_state)
+/datum/proc/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
return list()
// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm
index 2d0fe09c887..774aa875b89 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/nanomanager.dm
@@ -23,7 +23,7 @@
ui = get_open_ui(user, src_object, ui_key)
if(!isnull(ui))
- var/data = src_object.ui_data(user, ui.state) // Get data from src_object.
+ var/data = src_object.ui_data(user, ui_key, ui.state) // Get data from src_object.
if(!force_open)
ui.push_data(data)
else
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index be5ad871a36..1622fe1700e 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -415,7 +415,7 @@ nanoui is used to open and update nano browser uis
return
if(!initial_data)
- set_initial_data(src_object.ui_data(user, state)) // Get the UI data.
+ set_initial_data(src_object.ui_data(user, ui_key, state)) // Get the UI data.
user << browse(get_html(), "window=[window_id];[window_size][window_options]")
winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 27a671590db..80f45fa0eaf 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -62,7 +62,7 @@ var/list/alldepartments = list()
ui = new(user, src, ui_key, "faxmachine.tmpl", "Fax Machine UI", 540, 450)
ui.open()
-/obj/machinery/photocopier/faxmachine/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/photocopier/faxmachine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
if(scan)
@@ -109,16 +109,18 @@ var/list/alldepartments = list()
if(href_list["paper"])
if(copyitem)
- copyitem.loc = usr.loc
- usr.put_in_hands(copyitem)
- to_chat(usr, "You take \the [copyitem] out of \the [src].")
+ copyitem.forceMove(get_turf(src))
+ if(ishuman(usr))
+ if(!usr.get_active_hand())
+ usr.put_in_hands(copyitem)
+ to_chat(usr, "You eject \the [copyitem] from \the [src].")
copyitem = null
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle))
usr.drop_item()
copyitem = I
- I.loc = src
+ I.forceMove(src)
to_chat(usr, "You insert \the [I] into \the [src].")
flick(insert_anim, src)
@@ -163,24 +165,24 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null)
if(scan) // Card is in machine
if(ishuman(usr))
- scan.loc = usr.loc
+ scan.forceMove(get_turf(usr))
if(!usr.get_active_hand())
usr.put_in_hands(scan)
scan = null
else
- scan.loc = src.loc
+ scan.forceMove(get_turf(src))
scan = null
else
if(!card)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
- I.loc = src
+ I.forceMove(src)
scan = I
else
if(istype(card))
usr.drop_item()
- card.loc = src
+ card.forceMove(src)
scan = card
nanomanager.update_uis(src)
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 104de41520e..d333ed1cf47 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -79,8 +79,10 @@
updateUsrDialog()
else if(href_list["remove"])
if(copyitem)
- copyitem.loc = usr.loc
- usr.put_in_hands(copyitem)
+ copyitem.forceMove(get_turf(src))
+ if(ishuman(usr))
+ if(!usr.get_active_hand())
+ usr.put_in_hands(copyitem)
to_chat(usr, "You take \the [copyitem] out of \the [src].")
copyitem = null
updateUsrDialog()
@@ -125,7 +127,7 @@
if(!copyitem)
user.drop_item()
copyitem = O
- O.loc = src
+ O.forceMove(src)
to_chat(user, "You insert \the [O] into \the [src].")
flick(insert_anim, src)
updateUsrDialog()
@@ -150,10 +152,10 @@
if(ismob(G.affecting) && G.affecting != ass)
var/mob/GM = G.affecting
visible_message("[usr] drags [GM.name] onto the photocopier!")
- GM.loc = get_turf(src)
+ GM.forceMove(get_turf(src))
ass = GM
if(copyitem)
- copyitem.loc = src.loc
+ copyitem.forceMove(get_turf(src))
copyitem = null
updateUsrDialog()
return
@@ -290,10 +292,10 @@
W = copy(W)
else if(istype(W, /obj/item/weapon/photo))
W = photocopy(W)
- W.loc = p
+ W.forceMove(p)
p.amount++
p.amount--
- p.loc = src.loc
+ p.forceMove(get_turf(src))
p.update_icon()
p.icon_state = "paper_words"
p.name = bundle.name
@@ -313,10 +315,10 @@
if(target.anchored) return
if(!ishuman(user)) return
visible_message("[usr] drags [target.name] onto the photocopier!")
- target.loc = get_turf(src)
+ target.forceMove(get_turf(src))
ass = target
if(copyitem)
- copyitem.loc = src.loc
+ copyitem.forceMove(get_turf(src))
visible_message("[copyitem] is shoved out of the way by [ass]!")
copyitem = null
updateUsrDialog()
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index ed7c380c426..6874593f33a 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -129,7 +129,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
// auto update every Master Controller tick
ui.set_auto_update(auto_update)
-/obj/item/device/pda/ui_data(mob/user, datum/topic_state/state = inventory_state)
+/obj/item/device/pda/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
var/data[0]
data["owner"] = owner // Who is your daddy...
@@ -427,6 +427,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
user.drop_item()
C.forceMove(src)
to_chat(user, "You slide \the [C] into \the [src].")
+ else if(istype(C, /obj/item/weapon/nanomob_card))
+ if(cartridge && istype(cartridge, /obj/item/weapon/cartridge/mob_hunt_game))
+ cartridge.attackby(C, user, params)
/obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob)
if(istype(C, /mob/living/carbon) && scanmode)
@@ -498,3 +501,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
close(usr)
return 0
+
+/obj/item/device/pda/process()
+ if(current_app)
+ current_app.program_process()
+
+/obj/item/device/pda/hit_check(speed)
+ if(current_app)
+ current_app.program_hit_check()
+ ..()
\ No newline at end of file
diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm
index e7c433c65a6..4ad6c40ae24 100644
--- a/code/modules/pda/app.dm
+++ b/code/modules/pda/app.dm
@@ -1,6 +1,6 @@
// Base class for anything that can show up on home screen
/datum/data/pda
- var/icon = "tasks"
+ var/icon = "tasks" //options comes from http://fontawesome.io/icons/
var/notify_icon = "exclamation-circle"
var/notify_silent = 0
var/hidden = 0 // program not displayed in main menu
@@ -12,6 +12,16 @@
return ..()
/datum/data/pda/proc/start()
+ return
+
+/datum/data/pda/proc/stop()
+ return
+
+/datum/data/pda/proc/program_process()
+ return
+
+/datum/data/pda/proc/program_hit_check()
+ return
/datum/data/pda/proc/notify(message, blink = 1)
if(message)
@@ -56,6 +66,8 @@
title = name
/datum/data/pda/app/start()
+ if(pda.current_app)
+ pda.current_app.stop()
pda.current_app = src
return 1
diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm
index c96a8cfb11c..30d26607113 100644
--- a/code/modules/pda/cart.dm
+++ b/code/modules/pda/cart.dm
@@ -22,7 +22,7 @@
if(radio)
radio.initialize()
..()
-
+
/obj/item/weapon/cartridge/Destroy()
if(radio)
qdel(radio)
@@ -53,8 +53,7 @@
/obj/item/weapon/cartridge/atmos
name = "BreatheDeep Cartridge"
icon_state = "cart-a"
- programs = list(
- new/datum/data/pda/utility/scanmode/gas)
+ programs = list(new/datum/data/pda/utility/scanmode/gas)
/obj/item/weapon/cartridge/medical
name = "Med-U Cartridge"
@@ -66,8 +65,7 @@
/obj/item/weapon/cartridge/chemistry
name = "ChemWhiz Cartridge"
icon_state = "cart-chem"
- programs = list(
- new/datum/data/pda/utility/scanmode/reagent)
+ programs = list(new/datum/data/pda/utility/scanmode/reagent)
/obj/item/weapon/cartridge/security
name = "R.O.B.U.S.T. Cartridge"
@@ -94,30 +92,25 @@
name = "CustodiPRO Cartridge"
desc = "The ultimate in clean-room design."
icon_state = "cart-j"
- programs = list(
- new/datum/data/pda/app/janitor)
+ programs = list(new/datum/data/pda/app/janitor)
/obj/item/weapon/cartridge/lawyer
name = "P.R.O.V.E. Cartridge"
icon_state = "cart-s"
- programs = list(
- new/datum/data/pda/app/crew_records/security)
+ programs = list(new/datum/data/pda/app/crew_records/security)
/obj/item/weapon/cartridge/clown
name = "Honkworks 5.0"
icon_state = "cart-clown"
charges = 5
- programs = list(
- new/datum/data/pda/utility/honk)
- messenger_plugins = list(
- new/datum/data/pda/messenger_plugin/virus/clown)
+ programs = list(new/datum/data/pda/utility/honk)
+ messenger_plugins = list(new/datum/data/pda/messenger_plugin/virus/clown)
/obj/item/weapon/cartridge/mime
name = "Gestur-O 1000"
icon_state = "cart-mi"
charges = 5
- messenger_plugins = list(
- new/datum/data/pda/messenger_plugin/virus/mime)
+ messenger_plugins = list(new/datum/data/pda/messenger_plugin/virus/mime)
/*
/obj/item/weapon/cartridge/botanist
@@ -129,8 +122,7 @@
/obj/item/weapon/cartridge/signal
name = "generic signaler cartridge"
desc = "A data cartridge with an integrated radio signaler module."
- programs = list(
- new/datum/data/pda/app/signaller)
+ programs = list(new/datum/data/pda/app/signaller)
/obj/item/weapon/cartridge/signal/initialize()
radio = new /obj/item/radio/integrated/signal(src)
@@ -162,8 +154,7 @@
/obj/item/weapon/cartridge/head
name = "Easy-Record DELUXE"
icon_state = "cart-h"
- programs = list(
- new/datum/data/pda/app/status_display)
+ programs = list(new/datum/data/pda/app/status_display)
/obj/item/weapon/cartridge/hop
name = "HumanResources9001"
@@ -303,12 +294,38 @@
icon_state = "cart"
var/initial_remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
charges = 4
- programs = list(
- new/datum/data/pda/utility/toggle_door)
- messenger_plugins = list(
- new/datum/data/pda/messenger_plugin/virus/detonate)
+ programs = list(new/datum/data/pda/utility/toggle_door)
+ messenger_plugins = list(new/datum/data/pda/messenger_plugin/virus/detonate)
/obj/item/weapon/cartridge/syndicate/New()
var/datum/data/pda/utility/toggle_door/D = programs[1]
if(istype(D))
- D.remote_door_id = initial_remote_door_id
\ No newline at end of file
+ D.remote_door_id = initial_remote_door_id
+
+/obj/item/weapon/cartridge/mob_hunt_game
+ name = "Nano-Mob Hunter GO! Cartridge"
+ desc = "The hit new PDA game that lets you track down and capture your favorite Nano-Mobs living in your world!"
+ icon_state = "cart-eye"
+ programs = list(new/datum/data/pda/app/mob_hunter_game)
+ var/emagged = 0
+
+/obj/item/weapon/cartridge/mob_hunt_game/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/weapon/nanomob_card))
+ var/obj/item/weapon/nanomob_card/card = O
+ var/datum/data/pda/app/mob_hunter_game/my_game = programs[1]
+ if(my_game.register_capture(card.mob_data))
+ to_chat(user, "Transfer successful!")
+ qdel(card)
+ else
+ to_chat(user, "Transfer failed. Could not read mob data from card.")
+ else
+ ..()
+
+/obj/item/weapon/cartridge/mob_hunt_game/emag_act(mob/user)
+ if(!emagged)
+ emagged = 1
+ var/datum/data/pda/app/mob_hunter_game/my_game = programs[1]
+ my_game.hacked = 1
+ to_chat(user, "TR4P_M45T3R.mod successfully initialized. ToS violated. User Agreement nullified. Gotta pwn them all.")
+ to_chat(user, "You can now create trapped versions of any mob in your collection that will damage hunters who attempt to capture it.")
+ description_antag = "This copy of Nano-Mob Hunter GO! has been hacked to allow the creation of trap mobs which will cause any PDA that attempts to capture it to shock anyone holding it. Hacked copies of the game will not trigger the trap."
\ No newline at end of file
diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm
new file mode 100644
index 00000000000..9b8e3225976
--- /dev/null
+++ b/code/modules/pda/mob_hunt_game_app.dm
@@ -0,0 +1,182 @@
+
+/*
+ This stuff isn't included with in core_apps.dm because it is so distinct and would end up making the file huge (more than it already is).
+ I put it in it's own file in order to help it stay organized and easier to locate the procs and such.
+ For reference, the other Nano-mob Hunter GO files are in /code/game/modules/arcade/mob_hunt
+*/
+
+/datum/data/pda/app/mob_hunter_game
+ name = "Nano-Mob Hunter GO"
+ icon = "gamepad"
+ template = "pda_mob_hunt"
+ category = "Games"
+
+ var/list/my_collection = list()
+ var/current_index = 0
+ var/connected = 0
+ var/hacked = 0 //if set, this cartridge is able to spawn trap mobs from its collection (set via emag_act on the cartridge)
+ var/catch_mod = 0 //used to adjust the likelihood of a mob running from this client, a negative value means it is less likely to run (support for temporary bonuses)
+ var/wild_captures = 0 //used to track the total number of mobs captured from the wild (does not count card mobs) by this client
+ var/scan_range = 3 //maximum distance (in tiles) from which the client can reveal nearby mobs
+
+/datum/data/pda/app/mob_hunter_game/start()
+ ..()
+ processing_objects.Add(pda)
+
+/datum/data/pda/app/mob_hunter_game/stop()
+ ..()
+ disconnect("Program Terminated")
+ processing_objects.Remove(pda)
+
+/datum/data/pda/app/mob_hunter_game/proc/scan_nearby()
+ if(!mob_hunt_server || !connected)
+ return
+ for(var/turf/T in range(scan_range, get_turf(pda)))
+ for(var/obj/effect/nanomob/N in T.contents)
+ if(src in N.clients_encountered)
+ //hide the mob
+ N.conceal()
+ else
+ //reveal the mob
+ N.reveal()
+
+/datum/data/pda/app/mob_hunter_game/proc/reconnect()
+ if(!mob_hunt_server || !mob_hunt_server.server_status || connected)
+ //show a message about the server being unavailable (because it doesn't exist / didn't get set to the global var / is offline)
+ return 0
+ mob_hunt_server.connected_clients += src
+ connected = 1
+ if(pda)
+ pda.audible_message("[bicon(pda)] Connection established. Capture all of the mobs, [pda.owner ? pda.owner : "hunter"]!", null, 2)
+ return 1
+
+/datum/data/pda/app/mob_hunter_game/proc/get_player()
+ if(!pda)
+ return null
+ if(ishuman(pda.loc))
+ var/mob/living/carbon/human/H = pda.loc
+ return H
+ return null
+
+/datum/data/pda/app/mob_hunter_game/proc/disconnect(reason = null)
+ if(!mob_hunt_server || !connected)
+ return
+ mob_hunt_server.connected_clients -= src
+ for(var/obj/effect/nanomob/N in (mob_hunt_server.normal_spawns + mob_hunt_server.trap_spawns))
+ N.conceal(list(get_player()))
+ connected = 0
+ //show a disconnect message if we were disconnected involuntarily (reason argument provided)
+ if(pda && reason)
+ pda.audible_message("[bicon(pda)] Disconnected from server. Reason: [reason].", null, 2)
+
+/datum/data/pda/app/mob_hunter_game/program_process()
+ if(!mob_hunt_server || !connected)
+ return
+ scan_nearby()
+
+/datum/data/pda/app/mob_hunter_game/program_hit_check()
+ if(!pda)
+ return
+ for(var/obj/effect/nanomob/hit_mob in get_turf(pda))
+ hit_mob.hitby(pda)
+
+/datum/data/pda/app/mob_hunter_game/proc/register_capture(datum/mob_hunt/captured, wild = 0)
+ if(!captured)
+ return 0
+ my_collection.Add(captured)
+ if(wild)
+ wild_captures++
+ return 1
+
+/datum/data/pda/app/mob_hunter_game/update_ui(mob/user, list/data)
+ if(!mob_hunt_server || !(src in mob_hunt_server.connected_clients))
+ data["connected"] = 0
+ else
+ data["connected"] = 1
+ data["wild_captures"] = wild_captures
+ data["no_collection"] = 0
+ if(!my_collection.len)
+ data["no_collection"] = 1
+ return
+ var/datum/mob_hunt/mob_info
+ if(!current_index)
+ current_index = 1
+ if(current_index > my_collection.len)
+ current_index = 1
+ if(current_index < 1)
+ current_index = my_collection.len
+ mob_info = my_collection[current_index]
+ var/list/entry = list(
+ "nickname" = mob_info.nickname,
+ "real_name" = mob_info.mob_name,
+ "level" = mob_info.level,
+ "type1" = mob_info.get_type1(),
+ "type2" = mob_info.get_type2(),
+ "sprite" = "[mob_info.icon_state_normal].png",
+ "is_hacked" = hacked
+ )
+ if(mob_info.is_shiny)
+ entry["sprite"] = "[mob_info.icon_state_shiny].png"
+ data["entry"] = entry
+
+/datum/data/pda/app/mob_hunter_game/proc/assign_nickname()
+ if(!my_collection.len)
+ return
+ var/datum/mob_hunt/mob_info = my_collection[current_index]
+ var/old_name = mob_info.mob_name
+ if(mob_info.nickname)
+ old_name = mob_info.nickname
+ mob_info.nickname = input("Give a nickname to [old_name]?", "Nickname", old_name)
+
+/datum/data/pda/app/mob_hunter_game/proc/release()
+ if(!my_collection.len)
+ return
+ if(alert("Are you sure you want to release this mob back into the wild?", "Confirm Release", "Yes", "No") == "Yes")
+ remove_mob()
+
+/datum/data/pda/app/mob_hunter_game/proc/print_card()
+ if(!pda || !my_collection.len)
+ return
+ var/obj/item/weapon/nanomob_card/card = new/obj/item/weapon/nanomob_card(null)
+ var/datum/mob_hunt/mob_info = my_collection[current_index]
+ card.mob_data = mob_info
+ card.update_info()
+ card.forceMove(get_turf(pda))
+ remove_mob()
+
+/datum/data/pda/app/mob_hunter_game/proc/remove_mob()
+ if(!my_collection.len)
+ return
+ my_collection.Remove(my_collection[current_index])
+ if(current_index > my_collection.len)
+ current_index = my_collection.len
+
+/datum/data/pda/app/mob_hunter_game/proc/set_trap()
+ if(!my_collection.len || !pda || !hacked)
+ return
+ var/datum/mob_hunt/bait = my_collection[current_index]
+ bait = bait.type
+ new bait(1, get_turf(pda))
+
+/datum/data/pda/app/mob_hunter_game/Topic(href, list/href_list)
+ switch(href_list["choice"])
+ if("Rename")
+ assign_nickname()
+ if("Release")
+ release()
+ if("Next")
+ current_index++
+ if(current_index > my_collection.len)
+ current_index = 1
+ if("Prev")
+ current_index--
+ if(current_index < 1)
+ current_index = my_collection.len
+ if("Reconnect")
+ reconnect()
+ if("Disconnect")
+ disconnect()
+ if("Transfer")
+ print_card()
+ if("Set_Trap")
+ set_trap()
\ No newline at end of file
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 675cbcdfac6..ae931484524 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -787,7 +787,7 @@
// Auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/power/apc/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/power/apc/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["locked"] = is_locked(user)
data["isOperating"] = operating
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 4a35e57764c..0abb033e3e8 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -327,7 +327,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/power/port_gen/pacman/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/power/port_gen/pacman/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["active"] = active
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index a75bdd3ec80..7fba50784b8 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -95,10 +95,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if(src.anchored)
+ if(anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
- src.dir = turn(src.dir, 270)
+ dir = turn(dir, 270)
return 1
/obj/structure/particle_accelerator/AltClick(mob/user)
@@ -116,29 +116,29 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if(src.anchored)
+ if(anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
- src.dir = turn(src.dir, 90)
+ dir = turn(dir, 90)
return 1
/obj/structure/particle_accelerator/examine(mob/user)
- switch(src.construction_state)
+ switch(construction_state)
if(0)
- src.desc = text("A [name], looks like it's not attached to the flooring")
+ desc = text("A [name], looks like it's not attached to the flooring")
if(1)
- src.desc = text("A [name], it is missing some cables")
+ desc = text("A [name], it is missing some cables")
if(2)
- src.desc = text("A [name], the panel is open")
+ desc = text("A [name], the panel is open")
if(3)
- src.desc = text("The [name] is assembled")
+ desc = text("The [name] is assembled")
if(powered)
- src.desc = src.desc_holder
+ desc = desc_holder
..(user)
/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params)
if(istool(W))
- if(src.process_tool_hit(W,user))
+ if(process_tool_hit(W,user))
return
..()
return
@@ -208,7 +208,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
/obj/structure/particle_accelerator/proc/connect_master(var/obj/O)
if(O && istype(O,/obj/machinery/particle_accelerator/control_box))
- if(O.dir == src.dir)
+ if(O.dir == dir)
master = O
return 1
return 0
@@ -219,51 +219,51 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 0
if(!ismob(user) || !isobj(O))
return 0
- var/temp_state = src.construction_state
+ var/temp_state = construction_state
- switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
+ switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
if(iswrench(O) && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- src.anchored = 1
- user.visible_message("[user.name] secures the [src.name] to the floor.", \
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ anchored = 1
+ user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.")
temp_state++
if(1)
if(iswrench(O))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- src.anchored = 0
- user.visible_message("[user.name] detaches the [src.name] from the floor.", \
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ anchored = 0
+ user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.")
temp_state--
else if(iscoil(O))
var/obj/item/stack/cable_coil/C = O
if(C.use(1))
- user.visible_message("[user.name] adds wires to the [src.name].", \
+ user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
temp_state++
else
- to_chat(user, "You need one length of cable to wire the [src.name]!")
+ to_chat(user, "You need one length of cable to wire the [name]!")
return
if(2)
if(iswirecutter(O))//TODO:Shock user if its on?
- user.visible_message("[user.name] removes some wires from the [src.name].", \
+ user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.")
temp_state--
else if(isscrewdriver(O))
- user.visible_message("[user.name] closes the [src.name]'s access panel.", \
+ user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
if(isscrewdriver(O))
- user.visible_message("[user.name] opens the [src.name]'s access panel.", \
+ user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.")
temp_state--
- if(temp_state == src.construction_state)//Nothing changed
+ if(temp_state == construction_state)//Nothing changed
return 0
else
- src.construction_state = temp_state
- if(src.construction_state < 3)//Was taken apart, update state
+ construction_state = temp_state
+ if(construction_state < 3)//Was taken apart, update state
update_state()
update_icon()
return 1
@@ -296,10 +296,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if(src.anchored)
+ if(anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
- src.dir = turn(src.dir, 270)
+ dir = turn(dir, 270)
return 1
/obj/machinery/particle_accelerator/verb/rotateccw()
@@ -309,10 +309,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if(src.anchored)
+ if(anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
- src.dir = turn(src.dir, 90)
+ dir = turn(dir, 90)
return 1
/obj/machinery/particle_accelerator/update_icon()
@@ -320,7 +320,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user, params)
if(istool(W))
- if(src.process_tool_hit(W,user))
+ if(process_tool_hit(W,user))
return
..()
return
@@ -357,51 +357,53 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 0
if(!ismob(user) || !isobj(O))
return 0
- var/temp_state = src.construction_state
- switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
+ var/temp_state = construction_state
+ switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
if(iswrench(O))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- src.anchored = 1
- user.visible_message("[user.name] secures the [src.name] to the floor.", \
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ anchored = 1
+ user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.")
temp_state++
+ power_change()
if(1)
if(iswrench(O))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- src.anchored = 0
- user.visible_message("[user.name] detaches the [src.name] from the floor.", \
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ anchored = 0
+ user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.")
temp_state--
+ power_change()
else if(iscoil(O))
if(O:use(1))
- user.visible_message("[user.name] adds wires to the [src.name].", \
+ user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
temp_state++
if(2)
if(iswirecutter(O))//TODO:Shock user if its on?
- user.visible_message("[user.name] removes some wires from the [src.name].", \
+ user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.")
temp_state--
else if(isscrewdriver(O))
- user.visible_message("[user.name] closes the [src.name]'s access panel.", \
+ user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
if(isscrewdriver(O))
- user.visible_message("[user.name] opens the [src.name]'s access panel.", \
+ user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.")
temp_state--
active = 0
- if(temp_state == src.construction_state)//Nothing changed
+ if(temp_state == construction_state)//Nothing changed
return 0
else
- if(src.construction_state < 3)//Was taken apart, update state
+ if(construction_state < 3)//Was taken apart, update state
update_state()
if(use_power)
use_power = 0
- src.construction_state = temp_state
- if(src.construction_state >= 3)
+ construction_state = temp_state
+ if(construction_state >= 3)
use_power = 1
update_icon()
return 1
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index ed2fb257015..636fe7d338b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -24,6 +24,7 @@
/obj/machinery/particle_accelerator/control_box/New()
wires = new(src)
connected_parts = list()
+ update_icon()
..()
/obj/machinery/particle_accelerator/control_box/Destroy()
@@ -34,7 +35,7 @@
return ..()
/obj/machinery/particle_accelerator/control_box/attack_ghost(user as mob)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob)
if(construction_state >= 3)
@@ -62,9 +63,12 @@
/obj/machinery/particle_accelerator/control_box/update_icon()
if(active)
- icon_state = "[reference]p1"
+ icon_state = "[reference]p[strength]"
else
- if(use_power)
+ if(stat & NOPOWER)
+ icon_state = "[reference]w"
+ return
+ else if(use_power)
if(assembled)
icon_state = "[reference]p"
else
@@ -89,16 +93,16 @@
to_chat(usr, "ERROR: Request timed out. Check wire contacts.")
return
- if( href_list["close"] )
+ if(href_list["close"])
usr << browse(null, "window=pacontrol")
usr.unset_machine()
return
if(href_list["togglep"])
if(!wires.IsIndexCut(PARTICLE_TOGGLE_WIRE))
- src.toggle_power()
+ toggle_power()
else if(href_list["scan"])
- src.part_scan()
+ part_scan()
else if(href_list["strengthup"])
if(!wires.IsIndexCut(PARTICLE_STRENGTH_WIRE))
@@ -108,8 +112,8 @@
if(!wires.IsIndexCut(PARTICLE_STRENGTH_WIRE))
remove_strength()
- src.updateDialog()
- src.update_icon()
+ updateDialog()
+ update_icon()
return
@@ -152,32 +156,39 @@
use_power = 0
else if(!stat && construction_state <= 3)
use_power = 1
+ update_icon()
+
+ if((stat & NOPOWER) || (!stat && construction_state <= 3)) //Only update the part icons if something's changed (i.e. any of the above condition sets are met).
+ for(var/obj/structure/particle_accelerator/part in connected_parts)
+ part.strength = null
+ part.powered = 0
+ part.update_icon()
return
/obj/machinery/particle_accelerator/control_box/process()
- if(src.active)
+ if(active)
//a part is missing!
- if( length(connected_parts) < 6 )
+ if(length(connected_parts) < 6)
investigate_log("lost a connected part; It powered down.","singulo")
- src.toggle_power()
+ toggle_power()
return
//emit some particles
for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts)
if(PE)
- PE.emit_particle(src.strength)
+ PE.emit_particle(strength)
return
/obj/machinery/particle_accelerator/control_box/proc/part_scan()
for(var/obj/structure/particle_accelerator/fuel_chamber/F in orange(1,src))
- src.dir = F.dir
+ dir = F.dir
connected_parts = list()
var/tally = 0
var/ldir = turn(dir,-90)
var/rdir = turn(dir,90)
var/odir = turn(dir,180)
- var/turf/T = src.loc
+ var/turf/T = loc
T = get_step(T,rdir)
if(check_part(T,/obj/structure/particle_accelerator/fuel_chamber))
tally++
@@ -213,26 +224,26 @@
if(istype(PA, type))
if(PA.connect_master(src))
if(PA.report_ready(src))
- src.connected_parts.Add(PA)
+ connected_parts.Add(PA)
return 1
return 0
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
- src.active = !src.active
+ active = !active
investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo")
if(active)
msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1)
log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])")
use_log += text("\[[time_stamp()]\] [usr.name] ([usr.ckey]) has turned on the PA Control Computer.")
- if(src.active)
- src.use_power = 2
+ if(active)
+ use_power = 2
for(var/obj/structure/particle_accelerator/part in connected_parts)
- part.strength = src.strength
+ part.strength = strength
part.powered = 1
part.update_icon()
else
- src.use_power = 1
+ use_power = 1
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength = null
part.powered = 0
@@ -262,13 +273,13 @@
else
dat += "Off
"
dat += "Toggle Power
"
- dat += "Particle Strength: [src.strength] "
+ dat += "Particle Strength: [strength] "
dat += "--|++
"
//user << browse(dat, "window=pacontrol;size=420x500")
//onclose(user, "pacontrol")
var/datum/browser/popup = new(user, "pacontrol", name, 420, 500)
popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
return
\ No newline at end of file
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 62557e85384..02597b46840 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -375,7 +375,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/power/smes/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/power/smes/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["nameTag"] = name_tag
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 98d899cdbca..5f137f4cb74 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -395,7 +395,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/power/solar_control/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/power/solar_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["generated"] = round(lastgen)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index e0be4e3c0a0..323c240d239 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -265,7 +265,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/power/supermatter_shard/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/power/supermatter_shard/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["integrity_percentage"] = round(get_integrity())
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index acbdc19b659..9a3ecffedb6 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -121,7 +121,7 @@
// open the new ui window
ui.open()
-/obj/machinery/chem_dispenser/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/chem_dispenser/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["amount"] = amount
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index bd32fcee6cd..e9025a2aa3d 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -136,7 +136,7 @@
ui = new(user, src, ui_key, "chem_heater.tmpl", "ChemHeater", 350, 270)
ui.open()
-/obj/machinery/chem_heater/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/chem_heater/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["targetTemp"] = desired_temp
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 3ef20cff9b3..569bdb3f4e1 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -328,7 +328,7 @@
ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400)
ui.open()
-/obj/machinery/chem_master/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/chem_master/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["condi"] = condi
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index feb350d4d91..6691df19a1d 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -247,7 +247,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/disposal/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/disposal/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
var/pressure = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100)
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index a39c6485fc7..121eb0ee2d3 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -652,7 +652,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
ui = new(user, src, ui_key, "r_n_d.tmpl", src.name, 800, 550)
ui.open()
-/obj/machinery/computer/rdconsole/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/rdconsole/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
files.RefreshResearch()
diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
index c231912484b..bd2c704f21f 100644
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
@@ -126,7 +126,7 @@
// auto update every Master Controller tick
ui.set_auto_update(1)
-/obj/machinery/radiocarbon_spectrometer/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/radiocarbon_spectrometer/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["scanned_item"] = (scanned_item ? scanned_item.name : "")
data["scanned_item_desc"] = (scanned_item ? (scanned_item.desc ? scanned_item.desc : "No information on record.") : "")
diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm
index f2d36842504..8435d8cf992 100644
--- a/code/modules/security_levels/keycard authentication.dm
+++ b/code/modules/security_levels/keycard authentication.dm
@@ -75,7 +75,7 @@
ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 540, 320)
ui.open()
-/obj/machinery/keycard_auth/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/keycard_auth/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["screen"] = screen
data["event"] = event
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 815541f36bc..4d5e38d17ec 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -8,10 +8,13 @@
/atom/movable/lighting_overlay/onShuttleMove()
return 0
-/obj/onShuttleMove()
- if(invisibility >= 101)
- return 0
- . = ..()
+/obj/effect/landmark/shuttle_import/onShuttleMove()
+ // Used for marking where to preview/load shuttles
+ return 0
+
+/obj/docking_port/onShuttleMove()
+ // Stationary ports shouldn't move, mobile ones move themselves
+ return 0
/obj/machinery/door/onShuttleMove()
. = ..()
diff --git a/code/modules/shuttle/shuttle_manipulator.dm b/code/modules/shuttle/shuttle_manipulator.dm
index 9259ac5051e..34196c888b0 100644
--- a/code/modules/shuttle/shuttle_manipulator.dm
+++ b/code/modules/shuttle/shuttle_manipulator.dm
@@ -59,13 +59,12 @@
ui_interact(user)
/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
-
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
- ui = new(user, src, ui_key, "shuttle_manipulator.tmpl", "Shuttle Manipulator", 660, 700)
+ ui = new(user, src, ui_key, "shuttle_manipulator.tmpl", "Shuttle Manipulator", 660, 700, null, null, admin_state)
// when the ui is first opened this is the data it will use
// open the new ui window
ui.open()
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 23d2fe52787..970daf16e80 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -430,7 +430,7 @@
ui = new(user, src, ui_key, "order_console.tmpl", name, ORDER_SCREEN_WIDTH, ORDER_SCREEN_HEIGHT)
ui.open()
-/obj/machinery/computer/ordercomp/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/ordercomp/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["last_viewed_group"] = last_viewed_group
@@ -579,7 +579,7 @@
ui = new(user, src, ui_key, "supply_console.tmpl", name, SUPPLY_SCREEN_WIDTH, SUPPLY_SCREEN_HEIGHT)
ui.open()
-/obj/machinery/computer/supplycomp/ui_data(mob/user, datum/topic_state/state = default_state)
+/obj/machinery/computer/supplycomp/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["last_viewed_group"] = last_viewed_group
diff --git a/code/modules/spacepods/parts.dm b/code/modules/spacepods/parts.dm
index 0747f1c5a14..d1aefb535e6 100644
--- a/code/modules/spacepods/parts.dm
+++ b/code/modules/spacepods/parts.dm
@@ -30,7 +30,7 @@
var/turf/T
var/obj/item/pod_parts/pod_frame/linked
var/obj/item/pod_parts/pod_frame/pointer
- var/connectedparts = list()
+ var/list/connectedparts = list()
neededparts -= src
//log_admin("Starting with [src]")
linked = src
@@ -44,7 +44,8 @@
connectedparts += pointer
linked = pointer
pointer = null
- //log_admin("Parts left: [neededparts.len]") //len not working
+ if(connectedparts.len < 4)
+ return 0
for(var/i = 1; i <=4; i++)
var/obj/item/pod_parts/pod_frame/F = connectedparts[i]
if(F.type in neededparts) //if one of the items can be founded in neededparts
@@ -122,4 +123,4 @@
name = "civilian pod armor"
icon = 'icons/goonstation/pods/pod_parts.dmi'
icon_state = "pod_armor_civ"
- desc = "Spacepod armor. This is the civilian version. It looks rather flimsy."
\ No newline at end of file
+ desc = "Spacepod armor. This is the civilian version. It looks rather flimsy."
diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm
index c67ed43fd92..4fc51d7fb8d 100644
--- a/code/modules/store/items.dm
+++ b/code/modules/store/items.dm
@@ -57,6 +57,12 @@
typepath = /obj/item/weapon/storage/box/dice
cost = 200
+/datum/storeitem/nanomob_booster
+ name = "Nano-Mob Hunter Trading Card Booster Pack"
+ desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
+ typepath = /obj/item/weapon/storage/box/nanomob_booster_pack
+ cost = 250
+
/datum/storeitem/crayons
name = "Crayons"
desc = "Let security know how they're doing by scrawling lovenotes all over their hallways."
diff --git a/config/example/config.txt b/config/example/config.txt
index 31bde9c5e4f..4a948a39c1c 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -17,6 +17,13 @@ JOBS_HAVE_MINIMAL_ACCESS
## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days.
#USE_AGE_RESTRICTION_FOR_JOBS
+##Unhash this to track player playtime in the database. Requires database to be enabled.
+#USE_EXP_TRACKING
+##Unhash this to enable playtime requirements for jobs that have them defined.
+#USE_EXP_RESTRICTIONS
+##Allows admins to bypass job playtime requirements.
+USE_EXP_RESTRICTIONS_ADMIN_BYPASS
+
## Unhash this entry to have certain antagonist roles require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different antag roles by editing special_role_times in /code/modules/client/preferences.dm.
## See USE_AGE_RESTRICTION_FOR_JOBS for more information
#USE_AGE_RESTRICTION_FOR_ANTAGS
@@ -153,6 +160,9 @@ GUEST_JOBBAN
## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting)
GUEST_BAN
+## Comment to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected)
+CHECK_RANDOMIZER
+
## the whitelist
#USEWHITELIST
@@ -251,6 +261,9 @@ GHOST_INTERACTION
## IRC channel to send direct messages to admins to. Leave blank to disable.
#ADMIN_NOTIFY_IRC #paradiseStaff
+## IRC channel to log CID randomizer blocker hits to. Leave blank to silence
+#CIDRANDOMIZER_IRC #cidrandomizer
+
## Path to the python2 executable on the system. Leave blank for default.
## Default is "python" on Windows, "/usr/bin/env python2" on UNIX.
#PYTHON_PATH pythonw
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
index f39a3f27c20..c5c0e8e93d2 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -291,6 +291,8 @@ h1.alert, h2.alert {color: #000000;}
.alien {color: #543354;}
.noticealien {color: #00c000;}
.alertalien {color: #00c000; font-weight: bold;}
+.terrorspider {color: #320E32;}
+
.sinister {color: #800080; font-weight: bold; font-style: italic;} /* /vg/ */
.blob {color: #006221; font-weight: bold; font-style: italic;}
diff --git a/html/changelog.html b/html/changelog.html
index 5e5007eae87..ad5adf00e12 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,74 @@
-->
+
06 January 2017
+
Crazylemon64 updated:
+
+ - pAI UIs no longer break
+ - The chem dispenser's UI now displays the remaining energy again
+
+
Kyep updated:
+
+ - Mobs in vents no longer see vents/scrubbers as unwelded when they are welded, and vice versa.
+
+
+
03 January 2017
+
KasparoVy updated:
+
+ - The Vulpkanin Anita hairstyle no longer has rogue extra-bright pixels.
+
+
Kyep updated:
+
+ - Added tracking for how much playtime each player has.
+ - Added the ability to lock jobs based on playtime. E.g: must play for 10 hours to unlock HoS.
+
+
+
02 January 2017
+
KasparoVy updated:
+
+ - Particle Accelerators ordered from Cargo can now function.
+ - Wrenching powerless machines in a powered area will no longer require you to toggle the lights (or whatever you did before to sort this).
+
+
Krausus updated:
+
+ - The syndicate nuke and pinpointer locker will once again spawn into their ship, rather than into space near the station.
+
+
Kyep updated:
+
+ - Terror Spiders can no longer create more than one web on a tile.
+
+
+
01 January 2017
+
Kyep updated:
+
+ - Added basic, AI-less versions of some Terror Spiders.
+
+
+
31 December 2016
+
Crazylemon64 updated:
+
+ - The home gateway now will send ghosts to the other end by default, now
+
+
+
30 December 2016
+
Crazylemon updated:
+
+ - The shuttle manipulator can now only be used by admins
+
+
FalseIncarnate updated:
+
+ - Adds Nano-Mob Hunter GO! PDA game cartridges and related stuff. Grab a cartridge from the cartridge vendor or loadout and join in on the hunt!
+ - Adds Nano-Mob Hunter GO! Battle Terminals to the Holodeck and a Nano-Mob Hunter GO! Restoration Terminal to medbay's lobby.
+
+
Fox McCloud updated:
+
+ - Fixes cyborg cryo oddities
+
+
KasparoVy updated:
+
+ - Taking off noir glasses while noir mode is on will now give you your colour vision back.
+
+
29 December 2016
Fethas updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index fff174d9e41..2e2a987390e 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3222,3 +3222,46 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: The camera console has been refactored so there's no longer a delay when
switching cameras.
- bugfix: The camera console should no longer lag for several seconds.
+2016-12-30:
+ Crazylemon:
+ - bugfix: The shuttle manipulator can now only be used by admins
+ FalseIncarnate:
+ - rscadd: Adds Nano-Mob Hunter GO! PDA game cartridges and related stuff. Grab a
+ cartridge from the cartridge vendor or loadout and join in on the hunt!
+ - rscadd: Adds Nano-Mob Hunter GO! Battle Terminals to the Holodeck and a Nano-Mob
+ Hunter GO! Restoration Terminal to medbay's lobby.
+ Fox McCloud:
+ - bugfix: Fixes cyborg cryo oddities
+ KasparoVy:
+ - bugfix: Taking off noir glasses while noir mode is on will now give you your colour
+ vision back.
+2016-12-31:
+ Crazylemon64:
+ - bugfix: The home gateway now will send ghosts to the other end by default, now
+2017-01-01:
+ Kyep:
+ - rscadd: Added basic, AI-less versions of some Terror Spiders.
+2017-01-02:
+ KasparoVy:
+ - bugfix: Particle Accelerators ordered from Cargo can now function.
+ - bugfix: Wrenching powerless machines in a powered area will no longer require
+ you to toggle the lights (or whatever you did before to sort this).
+ Krausus:
+ - bugfix: The syndicate nuke and pinpointer locker will once again spawn into their
+ ship, rather than into space near the station.
+ Kyep:
+ - bugfix: Terror Spiders can no longer create more than one web on a tile.
+2017-01-03:
+ KasparoVy:
+ - bugfix: The Vulpkanin Anita hairstyle no longer has rogue extra-bright pixels.
+ Kyep:
+ - rscadd: Added tracking for how much playtime each player has.
+ - rscadd: 'Added the ability to lock jobs based on playtime. E.g: must play for
+ 10 hours to unlock HoS.'
+2017-01-06:
+ Crazylemon64:
+ - bugfix: pAI UIs no longer break
+ - bugfix: The chem dispenser's UI now displays the remaining energy again
+ Kyep:
+ - bugfix: Mobs in vents no longer see vents/scrubbers as unwelded when they are
+ welded, and vice versa.
diff --git a/icons/effects/mob_hunt.dmi b/icons/effects/mob_hunt.dmi
new file mode 100644
index 00000000000..1eea83a9afa
Binary files /dev/null and b/icons/effects/mob_hunt.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 9d8462c03c5..f74ebda9d34 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index bf6507c412c..c61955bf778 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi
index e1345302358..99ee47ac1fa 100644
Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ
diff --git a/icons/mob/terrorspider.dmi b/icons/mob/terrorspider.dmi
new file mode 100644
index 00000000000..a5d678f3f38
Binary files /dev/null and b/icons/mob/terrorspider.dmi differ
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index 00588161a65..4799f8736d2 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 0fc42d7bd4d..938d810a612 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 09380373db8..9ad68e22072 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index eef051bcc53..6a6d616832f 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1374,7 +1374,7 @@ menu "menu"
group = ""
is-disabled = false
saved-params = "is-checked"
- elem
+ elem "reconnectbutton"
name = "&Reconnect"
command = ".reconnect"
category = "&File"
diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css
index d8746687b44..d91a6ece4ae 100644
--- a/nano/assets/nanoui.css
+++ b/nano/assets/nanoui.css
@@ -1,2 +1,2 @@
-@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.5.0);src:url(fontawesome-webfont.eot?#iefix&v=4.5.0) format("embedded-opentype"),url(fontawesome-webfont.woff2?v=4.5.0) format("woff2"),url(fontawesome-webfont.woff?v=4.5.0) format("woff"),url(fontawesome-webfont.ttf?v=4.5.0) format("truetype"),url(fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
-.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.displayBarFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes a{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:a;animation-duration:.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff}.good,.white{font-weight:700}.good{color:#4f7529}.average{color:#cd6500}.average,.bad{font-weight:700}.bad{color:#e00}.idle{color:#272727;font-weight:700}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:blue}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{overflow:hidden}.statusDisplay,.statusDisplayRecords{background:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background:rgba(0,0,0,.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.statusDisplayRecords{overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.fancy{display:none}.minimize{color:#e9c183;position:absolute;top:6px;right:46px}.minimize.hover{color:#b8c9d6}.close{color:#e9c183;position:absolute;top:4px;right:12px}.close.hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;transform:rotate(1turn)}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:.125;margin-left:-1px}.mapIcon16.bad,.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-atmospherictechnician,.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-chemist,.mapIcon16.rank-geneticist,.mapIcon16.rank-medicaldoctor,.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-geneticist,.mapIcon16.rank-roboticist,.mapIcon16.rank-scientist,.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-detective,.mapIcon16.rank-securityofficer,.mapIcon16.rank-warden{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px}th.command{background:#33f}th.command,th.sec{font-weight:700;color:#fff}th.sec{background:#8e0000}th.med{background:#060}th.eng,th.med{font-weight:700;color:#fff}th.eng{background:#b27300}th.sci{background:#a65ba6}th.sci,th.ser{font-weight:700;color:#fff}th.ser{background:#7100aa}th.sup{background:#666621}th.civ,th.sup{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}span.qm-job{color:#b77a41;font-weight:700}.striped:not(table)>:nth-child(even),.striped tr:nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:700;z-index:1;padding:0 10px;text-align:center}.notice{background:url(uiNoticeBackground.jpg) 50% 50%;color:#000}.notice,.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:700;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:700}.item.mainmenu{padding-bottom:.5em}div.clock{color:#fff;font-weight:700;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:50%}.dnaBlock{float:left;width:90px;padding:0 0 5px}.dnaBlockNumber{color:#fff;background:#363636;min-width:20px}.dnaBlockNumber,.dnaSubBlock{font-family:Fixed,monospace;float:left;height:20px;padding:0;text-align:center}.dnaSubBlock{min-width:16px}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{background:#272727;color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020) no-repeat fixed 50%/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}#uiWrapper{width:100%;height:100%;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#uiTitleWrapper{position:relative;height:30px}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{top:50%;left:50%;margin:-512px 0 0 -512px;overflow:hidden;zoom:4}#uiMap,#uiMapImage{position:absolute;width:256px;height:256px}#uiMapImage{bottom:1px;left:1px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:1}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}
\ No newline at end of file
+@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.5.0);src:url(fontawesome-webfont.eot?#iefix&v=4.5.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.5.0) format('woff2'),url(fontawesome-webfont.woff?v=4.5.0) format('woff'),url(fontawesome-webfont.ttf?v=4.5.0) format('truetype'),url(fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
+.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.displayBarFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarText.average,.displayBarText.bad,.displayBarText.good,.displayBarText.notgood{color:#fff}.displayBarText.highlight{color:#000}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive.hover,.zoomLink.hover,a.hover{background:#507aac}@keyframes a{to{color:#fff;background:#507aac}}.linkPending,.linkPending.hover{animation-name:a;animation-duration:.25s}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px;margin:0 2px 0 0;cursor:default}a.white.hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn.hover,a.linkOn:active,a.linkOn:link,a.linkOn:visited,a.selected.hover,a.selected:active,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled.hover,a.disabled:active,a.disabled:link,a.disabled:visited,a.linkOff.hover,a.linkOff:active,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger.hover{background-color:#f66}.inactive,a.inactive.hover,a.inactive:active,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff}.good,.white{font-weight:700}.good{color:#4f7529}.average{color:#cd6500}.average,.bad{font-weight:700}.bad{color:#e00}.idle{color:#272727;font-weight:700}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:blue}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{overflow:hidden}.statusDisplay,.statusDisplayRecords{background:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background:rgba(0,0,0,.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.statusDisplayRecords{overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.fancy{display:none}.minimize{color:#e9c183;position:absolute;top:6px;right:46px}.minimize.hover{color:#b8c9d6}.close{color:#e9c183;position:absolute;top:4px;right:12px}.close.hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;transform:rotate(1turn)}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:.125;margin-left:-1px}.mapIcon16.bad,.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-atmospherictechnician,.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-chemist,.mapIcon16.rank-geneticist,.mapIcon16.rank-medicaldoctor,.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-geneticist,.mapIcon16.rank-roboticist,.mapIcon16.rank-scientist,.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-detective,.mapIcon16.rank-securityofficer,.mapIcon16.rank-warden{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px}th.command{background:#33f}th.command,th.sec{font-weight:700;color:#fff}th.sec{background:#8e0000}th.med{background:#060}th.eng,th.med{font-weight:700;color:#fff}th.eng{background:#b27300}th.sci{background:#a65ba6}th.sci,th.ser{font-weight:700;color:#fff}th.ser{background:#7100aa}th.sup{background:#666621}th.civ,th.sup{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}span.qm-job{color:#b77a41;font-weight:700}.striped:not(table)>:nth-child(even),.striped tr:nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:700;z-index:1;padding:0 10px;text-align:center}.notice{background:url(uiNoticeBackground.jpg) 50% 50%;color:#000}.notice,.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:700;text-align:center}.pdalink{float:left;white-space:nowrap;cursor:default!important}.pdalink.disabled{background:none;border:none;color:#999;text-align:left}.pdanote{color:#cd6500;font-weight:700}.item.mainmenu{padding-bottom:.5em}div.clock{color:#fff;font-weight:700;float:right;padding-right:2em}#pdaFooter{position:fixed;left:0;bottom:0;width:100%;background:#272727}.pdaFooterButton{width:33%;padding:.5em 0;font-size:200%;border:none;background:none;color:#fff}.pdaFooterButton.hover{background:#507aac}.pdaFooterButton.disabled{background:none!important;color:#555!important}.pdaFooterButton .uiLinkPendingIcon{position:absolute;width:33%;background-repeat:no-repeat;background-position:50%}.dnaBlock{float:left;width:90px;padding:0 0 5px}.dnaBlockNumber{color:#fff;background:#363636;min-width:20px}.dnaBlockNumber,.dnaSubBlock{font-family:Fixed,monospace;float:left;height:20px;padding:0;text-align:center}.dnaSubBlock{min-width:16px}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{background:#272727;color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020) no-repeat fixed 50%/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}#uiWrapper{width:100%;height:100%;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#uiTitleWrapper{position:relative;height:30px}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.039H106.8a6.761 6.026 0 0 0-6.761 6.025v187.872a6.761 6.026 0 0 0 6.761 6.025h53.107a6.761 6.026 0 0 0 6.762-6.025V92.392l72.216 104.7a6.761 6.026 0 0 0 5.76 2.87H318.2a6.761 6.026 0 0 0 6.761-6.026V6.064A6.761 6.026 0 0 0 318.2.04h-54.717a6.761 6.026 0 0 0-6.76 6.025v102.62L183.763 2.909a6.761 6.026 0 0 0-5.76-2.87zM4.845 22.109A13.412 12.502 0 0 1 13.478.039h66.118A5.365 5 0 0 1 84.96 5.04v79.88zM420.155 177.891a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5.001v-79.88z'/%3E%3C/svg%3E") 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{top:50%;left:50%;margin:-512px 0 0 -512px;overflow:hidden;zoom:4}#uiMap,#uiMapImage{position:absolute;width:256px;height:256px}#uiMapImage{bottom:1px;left:1px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:1}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}
\ No newline at end of file
diff --git a/nano/styles/_bars.less b/nano/styles/_bars.less
index f154274f596..90eb3557144 100644
--- a/nano/styles/_bars.less
+++ b/nano/styles/_bars.less
@@ -31,6 +31,26 @@
float: right;
}
+.displayBarText.good {
+ color: white;
+}
+
+.displayBarText.notgood {
+ color: white;
+}
+
+.displayBarText.average {
+ color: white;
+}
+
+.displayBarText.bad {
+ color: white;
+}
+
+.displayBarText.highlight {
+ color: black;
+}
+
.displayBarFill.good {
color: #ffffff;
background: @good-color;
@@ -54,4 +74,4 @@
.displayBarFill.highlight {
color: #ffffff;
background: @highlight-color;
-}
\ No newline at end of file
+}
diff --git a/nano/templates/comm_console.tmpl b/nano/templates/comm_console.tmpl
index 6d566aa85fb..c4e1799afcf 100644
--- a/nano/templates/comm_console.tmpl
+++ b/nano/templates/comm_console.tmpl
@@ -68,6 +68,9 @@ Used In File(s): /code/game/machinery/computers/communications.dm
{{:helper.link('Message List','comment',{'operation':'messagelist'})}}
+
+ {{:helper.link('Restart Nano-Mob Hunter GO! Server','power-off',{'operation':'RestartNanoMob'})}}
+
{{if data.dock_request}}
{{:helper.link('Accept Docking Request','signal',{'operation':'AcceptDocking'})}}
diff --git a/nano/templates/pda_mob_hunt.tmpl b/nano/templates/pda_mob_hunt.tmpl
new file mode 100644
index 00000000000..dde4ab82a5c
--- /dev/null
+++ b/nano/templates/pda_mob_hunt.tmpl
@@ -0,0 +1,91 @@
+
+
+
+
+ |
+ Connection Status:
+ |
+ {{if data.connected}}
+
+ Connected
+ |
+
+ {{:helper.link('Disconnect', 'sign-out', {'choice': 'Disconnect'})}}
+ |
+ {{else}}
+
+ No Connection
+ |
+
+ {{:helper.link('Connect', 'sign-in', {'choice': 'Reconnect'})}}
+ |
+ {{/if}}
+
+
+
+
+
+
My Collection:
+{{if data.no_collection}}
+
+
+ Your collection is empty! Go capture some Nano-Mobs!
+
+
+
+ Wild mobs captured: {{:data.wild_captures}}
+{{else}}
+
+
+
+ {{if data.entry}}
+ {{if data.entry.nickname}}
+
Name: {{:data.entry.nickname}}
+ {{/if}}
+
Species: {{:data.entry.real_name}}
+
Level: {{:data.entry.level}}
+
Primary Type: {{:data.entry.type1}}
+ {{if data.entry.type2}}
+
Secondary Type: {{:data.entry.type2}}
+ {{/if}}
+ {{if data.entry.sprite}}
+

+ {{else}}
+
Mob Image Missing!
+ {{/if}}
+ {{else}}
+
+ Mob Data Missing!
+
+ {{/if}}
+
+
+
+
+ Wild mobs captured: {{:data.wild_captures}}
+
+
+
+ |
+ {{:helper.link('Previous Mob', 'arrow-left', {'choice': 'Prev'})}}
+ |
+
+ {{:helper.link('Transfer Mob', 'exchange', {'choice': 'Transfer'})}}
+ |
+
+ {{:helper.link('Rename Mob', 'pencil', {'choice': 'Rename'})}}
+ |
+
+ {{:helper.link('Release Mob', 'tree', {'choice': 'Release'})}}
+ |
+
+ {{:helper.link('Next Mob', 'arrow-right', {'choice': 'Next'})}}
+ |
+
+
+ {{if data.entry.is_hacked}}
+
+ {{:helper.link('Set Trap', 'bolt', {'choice': 'Set_Trap'})}}
+ {{/if}}
+
+{{/if}}
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index 8cc1e89b535..39123caaca2 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -177,6 +177,7 @@
#include "code\controllers\Processes\lighting.dm"
#include "code\controllers\Processes\machinery.dm"
#include "code\controllers\Processes\mob.dm"
+#include "code\controllers\Processes\nano_mob_hunter.dm"
#include "code\controllers\Processes\nanoui.dm"
#include "code\controllers\Processes\npcai.dm"
#include "code\controllers\Processes\npcpool.dm"
@@ -468,6 +469,7 @@
#include "code\game\gamemodes\wizard\wizard.dm"
#include "code\game\jobs\access.dm"
#include "code\game\jobs\job_controller.dm"
+#include "code\game\jobs\job_exp.dm"
#include "code\game\jobs\job_objective.dm"
#include "code\game\jobs\jobs.dm"
#include "code\game\jobs\whitelist.dm"
@@ -1061,6 +1063,11 @@
#include "code\modules\arcade\claw_game.dm"
#include "code\modules\arcade\prize_counter.dm"
#include "code\modules\arcade\prize_datums.dm"
+#include "code\modules\arcade\mob_hunt\battle_computer.dm"
+#include "code\modules\arcade\mob_hunt\mob_avatar.dm"
+#include "code\modules\arcade\mob_hunt\mob_cards.dm"
+#include "code\modules\arcade\mob_hunt\mob_datums.dm"
+#include "code\modules\arcade\mob_hunt\mob_type_datums.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
#include "code\modules\assembly\health.dm"
@@ -1677,6 +1684,15 @@
#include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
#include "code\modules\mob\new_player\new_player.dm"
@@ -1735,6 +1751,7 @@
#include "code\modules\pda\core_apps.dm"
#include "code\modules\pda\messenger.dm"
#include "code\modules\pda\messenger_plugins.dm"
+#include "code\modules\pda\mob_hunt_game_app.dm"
#include "code\modules\pda\PDA.dm"
#include "code\modules\pda\pdas.dm"
#include "code\modules\pda\radio.dm"