diff --git a/_maps/map_files/RandomZLevels/fileList.txt b/_maps/map_files/RandomZLevels/fileList.txt
index 4b12cdc0fe4..104b4dac7e4 100644
--- a/_maps/map_files/RandomZLevels/fileList.txt
+++ b/_maps/map_files/RandomZLevels/fileList.txt
@@ -10,7 +10,7 @@
#_maps/map_files/RandomZLevels/academy.dmm
_maps/map_files/RandomZLevels/beach.dmm
#_maps/map_files/RandomZLevels/blackmarketpackers.dmm
-_maps/map_files/RandomZLevels/challenge.dmm
+#_maps/map_files/RandomZLevels/challenge.dmm
#_maps/map_files/RandomZLevels/centcomAway.dmm
#_maps/map_files/RandomZLevels/clownplanet.dmm
#_maps/map_files/RandomZLevels/example.dmm
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 1c0163e3b43..678e2ca9a95 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -6110,7 +6110,7 @@
"cnz" = (/turf/simulated/wall/r_wall,/area/maintenance/asmaint)
"cnA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/wall,/area/crew_quarters/sleep)
"cnB" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 8; req_access_txt = "24"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/atmos/control)
-"cnC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor,/area/atmos/control)
+"cnC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/atmos/control)
"cnD" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology)
"cnE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"cnF" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/toxins/xenobiology)
@@ -6683,10 +6683,14 @@
"cyA" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
"cyB" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
"cyC" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
+"cyD" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"cyE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"cyF" = (/turf/simulated/floor{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube{icon_state = "Block"},/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
+"cyG" = (/turf/simulated/floor{icon_state = "dark"},/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
"cyH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 3"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/medical/virology)
+"cyK" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/turf/space,/area/space)
"cyL" = (/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{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/toxins/xenobiology)
"cyM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"cyN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
@@ -6704,10 +6708,12 @@
"cyZ" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/port)
"cza" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port)
"czb" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
+"czc" = (/obj/structure/transit_tube/station{icon_state = "closed"; dir = 4},/turf/simulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/aisat/entrance)
"czd" = (/turf/simulated/floor/plating,/area/assembly/assembly_line)
"cze" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line)
"czf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line)
"czg" = (/obj/item/weapon/paper,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line)
+"czh" = (/obj/machinery/light,/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/obj/structure/transit_tube{dir = 1; icon_state = "Block"},/turf/simulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/aisat/entrance)
"czi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/aft)
"czj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/aft)
"czk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 7},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor,/area/engine/break_room)
@@ -6784,7 +6790,6 @@
"cAP" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"})
"cAQ" = (/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)
"cAR" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"cAS" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/security/checkpoint2)
"cAT" = (/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"})
"cAU" = (/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,/area/hallway/secondary/construction{name = "\improper Garden"})
"cAW" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line)
@@ -7641,7 +7646,6 @@
"cUN" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engine/engineering)
"cUO" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engine/engineering)
"cUP" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engine/engineering)
-"cUQ" = (/turf/simulated/floor{icon_state = "dark"},/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/obj/structure/transit_tube_pod,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
"cUS" = (/turf/space,/area/syndicate_station/southeast)
"cUT" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cUU" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity West"; dir = 4; network = list("Singularity","SS13")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
@@ -7696,7 +7700,6 @@
"cVX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Teleporter Room"; req_access_txt = "17;75"},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance)
"cVY" = (/obj/machinery/bluespace_beacon,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance)
"cVZ" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/aisat/entrance)
-"cWa" = (/obj/machinery/light,/obj/structure/transit_tube/station{icon_state = "closed"; dir = 4},/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/turf/simulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/aisat/entrance)
"cWb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance)
"cWc" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "teledoor"; name = "AI Satellite Teleport Access"},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance)
"cWd" = (/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "17;75"},/obj/effect/decal/warning_stripes/east,/obj/machinery/camera{c_tag = "Mini Satellite Teleporter"; dir = 1; network = list("SS13","MiniSat")},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/entrance)
@@ -8101,9 +8104,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEaAyaDtaDuazEaAyaDvaDuazEaABaDwaABaABaABaABaABayYaABayYcwjcwkayYayYaABaMnaABcwmaabcwmaABaItaIraABaIPcxEaABaHGaCraABaygaAHaAHaAuaAuaAuaAuaAuaAuaAuaAuaAuaCJaCJaCKaDDaDEaISaDGaDHaDIaDJaDKaDLaDLaDLaDLaDMcmMaDNaDOaDPaDLaDLaDQaDQaDRaDSaDTaDUaDVaDWaCWaDXaDYaDYazZaBbaCgaDZaEaaEbaCgaAxaEdaDeaDecxDaGAaBdaFgaFhaFhaGsaAxaQtazKazBazBazBazBazBazKaEmaDnazKaaaaaaaMUaJeaLHaLHaJYdcmaLqaNaaWacZWaAraMUaOMaAraMUcZYaLHaMUcZZaLHaMUdabdaadacaNodadaNodafdaedahdagdajdaidakaIQaIRaIRaacaacaIRaIRaIRaIRaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaEwaExaEwaEyaEwaEzaEwaEAaEBaECaECaECaECaEDaABayYaABcxHcxGcxIayYcyScwgaMnaABaABaABaABaABaABcwgaABayYcxIaDwayYayYaCJcyTcyUaEKaEJaEJaEJaEJaELaEJaEJaEMaENaEKaEOaEPaEPaEPaEPaEPaEPaEPaEQaERaERaERaERaESaETaERaEUaERaEVaESaERaERaERaERaEWaEXaEYaEZaFaaCdaFbaFcaDYaFdaBbaCgaFeaMBaCYaCgaAxaFfaHCaHCaHIaBcaBdaHJaITaITaPhaAxdamaFmazBazBazBazBazBaFnaFoaFpazKaaaaaaaMUaLHaLHaLHaLHaLHaLHdacaNoaNoaNoaNoaNoaNoaNoaEcaLHaLHaLHaLHaHNaLHaLHaHKaLHdaodandaqdapdaraOCaOCaOCdasaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaFyaFzaFAaFBaFCaFDaFEaFFaFDaFGaFHaFDaFDaFIaABayYaABcyVayYayYcyWczLaABaPyaKxayYayYayYayYayYayYcwgczNayYaABaRkaRkaAHczOaAHaFPaACaAwaAwaAwaAEaAwaAwaAwaAFaFPaFUaFVaFVaFVaFVaFVaFVaFVaCJaERaFWaFXaFYaFZaGaaGbaGcaGdaGeaGfaGgaFXaGhaERaGiavVaGjaxzaGkaCWaGlaGmaGmaGnaGoaGpcuNaGraGraGuaGtaDgaGuaGtaGtaGvaGwaGxaAxaAxcwlaAxaEgaBkazBazBazBazBazBaBkazzazzazzaMUaMUaMUaArdcmdcmaxBaMUaMUaHKdcmaMUdaudcmaMUaxBaMUaHKaJedcmaMUaxBaMUaLHaJeaHKaLHaLIaIQdaydaedaAdazdaBdaedaCaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPaABaxFaABczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPczPaxFczPczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIfazEaDkaCzaBmaIiaIjaIkaIlaBmaCzaDlaAvazEaIoaIpaABayYayYayYayYayYayYczPczRczTczScAOczUcAPczRczPbgbaIwaEJaEJaEJaEJaEJaEJcAQcARaFPaabaIAaIAaIAaIAaIAaIAaIAaabaFPaFUaFVaIBaICaIDaIEaIBaFVaCJaERaERaERaERaIFaIGaFXaIHaFXaIGaIIaERaERaERaERaGiavVaIJaxzaGkaCWaCeazXazYazZaCfaIKaILaILaILaILaILaILaILaIMaILaINaINaINaINaINaIOaMUazzaBkazBazBazBazBazBaBkaMUaMUaLHdaYdaJdcmdaZaMUaLHaLHaMUaLHaHKdcmaLHaLHaMUaLHaLHdcmaHKaKaaMUaLHaLHdcmdbaaLHaHKaLHdbcdbbdbbaIQaIQaIQaIQaIQaIQaIQaIRaIRaIRaIRaIRaabaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcASczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcyDczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKmaKnaKmaKmaKoaKpaKmaKmaKnaKqaKrazEaGTaKsaJqaKtaKuaKvcBXcZjcBYczPczRcATczScZkcATcATczRczPaKDaKEaKFaKGaKHaKIaKJaKKaKLaKMaJwaabaIAaKNaKOaKPaKQaKRaIAaabaFPaFUaFVaKSaKTaKUaKVaKWaFVaCJaERaFWaFXaKXaKYaIGaFXaKZaFXaIGaLaaLbaFXaGhaERaGiavVaLcaxzaGkaAZaBaazXazYazZaLdaLeaILaLfaJQaJQaJQaLgaLhaLiaLjaINaLkaLlaLmaLnaLoaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaMUdbodbndbqdbpdbraMUaGyaLHaJeaHKaLHaMUaaaaMUaLHaLHaLHaLHaHKaLyaLzaLAaLAaLAaLAaLCaLBaLDdbtaLEaLFaLEdbvdbudbudbwdbydbxdbAdbzdbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKqaKmaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaBmaGTaLWaJqaLXaLYaLZaMaaLZaMbczPcZlcATcZmcZwcZvcZwcZxcZyaMkaMlaMmaMmaMmaMmaMmaMmaMoaMpaJwaaaaIAaMqaKOaMraKQaMsaIAaaaaFPaFUaFVaMtaMuaMvaMwaMxaFVaCJaERaMyaMyaBQaMzaJKaHraMAaHraJKaNOaBYaMCaMCaERaMDaxNaMEaxzaGkaAZaMFaMFaMFaMFaMGaMHaMIaMJaMKaMLaMLaMLaMMaMLaMNaMOaMPaMQaMRaMOaMSdbBaAsaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUdbCaMUaMUaMUaMUaLHaHKdboavqaabavqaLHaNbaNcaNddbEaNfaNgaNhaNhaNhaNhaNiaNjaNkdbFaNlaNmaNlaNnaNlaNldbGdbHaNqaNqaDxaLJaNsaNsaNsaNsaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLUaNuaNvaNwaLTaNxaLMaNxaLMaNxaLMaNxaLTaNyaNzaBmaGTaNAaJqaNBaNCaNDaNEaNFaNGczPcZzcATcZAcZCcZBcZEcZDczPaZqaMmaMmaMmaMmaMmaMmaMmaMoaNPaJwaabaIAaNQaNRaNSaNTaNUaIAaabaFPaFUaFVaNVaNWaNXaNYaNZaFVaCJaERaERaERaERaOaaIGaFXaIHaFXaIGaObaERaERaERaERaOcaOdaOeaxzaJNaOfaOgaOgaOgaOhaOiaCnaOjaOkaOlaOjaOmaOnaOoaOjaOpaOqaOraOsaOtaINaOuaOvaOwaOxaOxaOvaOyaOzaOzaOzaOzaOzaOAaOBaOzdbJaODdbKaOGdbLaOHdbMaOIaDAdbOaDAaOKaOLaLHaMUaONaOOaOPaOQaORaOSaOTaOUaOVaOWaOVaOXaOYaOZaPaaPbaPcaPdaPeaPfaSFdbPaLJaPiaPjaPkaPlaPmaPnaPoaPpaPqaPraaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8195,12 +8198,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaabaacaacaabaabaabaczaczcEEcEEcUCcTwaaaaaaaabaaaaaaaabcUDcUEaacaabaaaaaaaabaaaaaacTwcUFcEEcEEcNbcEEcCDcUwcUGcUwcCDcUycUHcUycCDcUAcUIcUAcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabaczcEEcEEcTvcTwaaaaaaaabaaacUJaabaacaacaacaabaabcTMaabaaaaaacTwcTvcEEcEEcNbcEEcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcEEcUjcUkcTwaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacTwcUhcUicEEcUlcEEcEEcEEcEEcEEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaacRzcRzcRzcRzaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaacRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaabcEEcTZcTwcULaaaaaacUMaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacTwcTwcTZcEEcNbcUNcUOcUPcUQbQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcEEcUTcUUcTwaabaabaabcTMaaaaaacTMaaaaaaaaaaaacTMaabcUVaabcTwcUWcUXcEEcNbcUYcUZcGTcVabQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaacRzcRzcRzcRzaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaacRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaabcEEcTZcTwcULaaaaaacUMaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacTwcTwcTZcEEcNbcUNcUOcUPcyFbQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcEEcUTcUUcTwaabaabaabcTMaaaaaacTMaaaaaaaaaaaacTMaabcUVaabcTwcUWcUXcEEcNbcUYcUZcGTcyGbQYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcVccVdcVeaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacVfcVdcVgcEEcNbcEEcVhcVicVabNzaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNVcEEcKVcTccVeaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacVfcTbcKVcEEcEEcNbcEEcEEcEEbQZcEEaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacEEcEEcTccSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcSGcTbcEEcEEcEEcEEcUlcEEaaaaabcVlcVmaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEaaacEEcEEcVncEEaabaabcVocVpcVqcVrcVrcVrcVqcVrcVrcVrcVqcVrcVrcVrcVqcVrcVrcVscVtaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEcEEaaacEEcEEcVncEEaabaabcVocVpcVqcVrcyKcVrcVqcVrcyKcVrcVqcVrcyKcVrcVqcVrcyKcVscVtaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRzcRzcRzcRzcRzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcEEcVucEEcEEcEEcEEaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaacVocVvcVmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcNbcNbcVwcVxcVxcVyaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabcVzcVvcVtaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEEcUlcNbcVAcVBcVCcVDaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacVocVvcVmaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTGcTGcTGcTGcTGcTGcTGcTGcTGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8208,8 +8211,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNVcEEcEEcEEcEEcEEcEEaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVzcVIaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJbRacVJbRcbRccVNcVNcVNcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabcVJcVOcVPcVQcVRcVScVTcVUcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJcVOcVVcVWcVWcVXcVYcVZcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJcWacWbcVWcVWcWccWdcWecVNaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJczccVVcVWcVWcVXcVYcVZcVNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaabcVJczhcWbcVWcVWcWccWdcWecVNaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabcVJcVJcWfcVWcVWcVNcWgcVNcVNaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaoMaoMaaaaabaaabRccWicVWcVWcWjcWkbRcaabaabaabaoMaoMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKcUKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczcWlcWlaczaczaaabRccWncWocWpcWqcWrbRcaaaaczaczcWlcWlaczaczaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUScUSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 571e5e81d99..bb9eb22cba0 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -982,7 +982,7 @@
"sT" = (/obj/structure/closet/secure_closet/freezer/meat{req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control)
"sU" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control)
"sV" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control)
-"sW" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control)
+"sW" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/living)
"sX" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"sY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"sZ" = (/obj/machinery/door/airlock/centcom{name = "Freezer"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/control)
@@ -1020,7 +1020,7 @@
"tF" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
"tG" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"tH" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control)
-"tI" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control)
+"tI" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"tJ" = (/obj/mecha/combat/marauder/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"tK" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops)
"tL" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control)
@@ -1034,9 +1034,9 @@
"tT" = (/obj/machinery/computer/pod/deathsquad,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"tU" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
"tV" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
-"tW" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/living)
-"tX" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/living)
-"tY" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/living)
+"tW" = (/turf/unsimulated/wall,/area/centcom/bathroom)
+"tX" = (/obj/machinery/door/airlock/centcom{name = "Unit 4"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"tY" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
"tZ" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control)
"ua" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control)
"ub" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
@@ -1080,7 +1080,7 @@
"uN" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops)
"uO" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control)
"uP" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access_txt = "113"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
-"uQ" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Administration Wing"},/area/centcom/control)
+"uQ" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 15},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
"uR" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1443; listening = 0; name = "Response Team Intercom"; pixel_y = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uS" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "nukecode"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uT" = (/obj/structure/table/reinforced,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -1114,7 +1114,7 @@
"vv" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vw" = (/obj/machinery/computer/robotics,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vx" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
-"vy" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
+"vy" = (/obj/structure/sink{pixel_y = 15},/obj/structure/mirror{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
"vz" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vA" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass,/area/centcom/specops)
"vB" = (/obj/structure/table/woodentable{dir = 9},/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
@@ -1797,6 +1797,15 @@
"IC" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"ID" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"IE" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Specialist Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
+"IF" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/structure/curtain/open/shower/centcom,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"IG" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)"},/obj/structure/curtain/open/shower/centcom,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"IH" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"II" = (/obj/machinery/door/airlock/centcom{name = "Unit 3"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"IJ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"IK" = (/obj/machinery/door/airlock/centcom{name = "Unit 2"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"IL" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/evac)
+"IM" = (/obj/machinery/door/airlock/centcom{name = "Unit 1"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom)
+"IN" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor,/area/centcom/bathroom)
(1,1,1) = {"
aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaOaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaR
@@ -1913,47 +1922,47 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsqsrssspspspspspststststspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsusrsrsvswsxsyszsAsBsCsDsEspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspswsCsBsFsGsBsCsCsCspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNstsCsCsCsCsCsCsCsCsCspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNstsCsCsCsCsCsCsCswswspspspspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspsCsCsBsFsAsBsCsHsIspsJsKsLsMspsNsOsPspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsqsrssspsQsCsBsFsRsBsCswswspsSsSsSsSspsTsUsVspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsusrsrsvsCsCsCsCsCsCsCsCsWspsSsXsYsYspspsZspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspspsptaspspspsCsCsCtbsStctcsSsSsSsStdspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsptetftgspthtitititjspsCsCsCsCsSsSsSsStksSsStlspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmaNaNaNaNaNaNsptntotptqtititititrspsCsCsCtbtssSsSsSttsSsStuspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtwtxtytytztmaNaNaNaNaNaNspsptbtbspspsptbtbtbspsCsCsCsptbtbtbtbtbtbtbspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtCtDtBtBtBtCtEtFtGtytytytmaNaNaNaNaNaNsptHtHtHtHtHtHtHtHtHspsptIspsptHtHtHtHtHtHtHspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytytmaNaNaNaNaNaNspspspspspspspspspspsptLtMtNspspspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtOtDtBtBtBtOtPtFtGtytytytmaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytTtmaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtUtDtBtBtBtUtVtFtGtytytytmaNaNaNaNaNaNaNaNaNaNspspspspspspsptWtXtYspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytytmaNaNaNaNaNaNaNaNaNaNsptLtMtMtMtMtMtZtRuatMtMtMtMtMtNspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBubtDtBtBtBubucudtGtytytytmaNaNaNaNaNaNaNaNaNaNsptQtRtRtRtRtRtRtRtRtRtRtRtRtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmueuftmtmtmtmtmtmtmtmtmtmtmaNsptQtRuguhuhuhuhuhuhuhuhuhuitRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmujukukulumunununtmuououououououpuqurtmaNsptQtRtStbtbtbtbtbtbtbtbtbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsqsrssspspspsptbstststspspspspspspspspspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspsusrsrsvswsxsyszsAsBsCsCswswspsJsKsLsMspsNsOsPspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNspspspspspswsCsBsFsGsBsCsCsHsIspsSsSsSsSspsTsUsVspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNstsCsCsCsCsCsCsCsCswswspsSsXsYsYspspsZspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmspaNaNaNstsCsCsCsCsCsCsCsCsCsCtbsStctcsSsSsSsStdspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtwtxtytytzspspspspspsCsCsBsFsAsBsCsCsCsCsCsSsSsSsStksSsStlspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtCtDtBtBtBtCtEtFtGtytytyspsqsrssspsQsCsBsFsRsBsCsCsCsCtbtssSsSsSttsSsStuspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytyspsusrsrsvsCsCsCsCsCsCsCsCsCsCsptbtbtbtbtbtbtbspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtOtDtBtBtBtOtPtFtGtytytyspspspspspspsptaspspspspsCsCsEsptHtHtHtHtHtHtHspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytTsptetftgspthtititititjspsCsCsDsptHtHtHtHtHtHtHspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBtUtDtBtBtBtUtVtFtGtytytysptntotptqtitititititrsptbsvtbsptbtbsWsWsWtbtbspspspspspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtvtJtKtytytyspsptbtbspspsptbtbtbtbsptQtRuatMtMtMtMtMtMtMtMtMtMtMtNspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtAtBtBtBtBtBtBtBtBtBubtDtBtBtBubucudtGtytytysptHtHtHtHtHtHtHtHtHtHsptQtRtRtRtRtRtRtRtRtRtRtRtRtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmueuftmspspspspspspsptmtmtmtmsptQtRuguhuhuhuhuhuhuhuhuhuitRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmujukukulumunununtmuououououououpuqururursptQtRtStbtbtbtbtbtbtbtbtbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNusununununununununutuuuuuuuuuuuuuvtmtmtmtmsptQtRtStbuwuxuyuzuAuBuCtbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNusununununununununtmuDuEuEuEuEuEuFtmuGuGuGsptZtRuatbuHtRuIuJtRtRtRtbtZtRuaspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmunununuKuKunununuLuMuMuMuMuMuMuMuNuMuMuMuOtRtRtRuPtRtRtRtRtRtRtRuPtRtRtRuQaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmununuRuSuTuUununtmtmuVuWuVtmtmuqtmuXuXuXspuitRugtbtRtRtRtRtRtRtRtbuitRugspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNusununununununununtmuDuEuEuEuEuEuFtmuGuGuGsptZtRuatbuHtRuIuJtRtRtRtbtZtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmunununuKuKunununuLuMuMuMuMuMuMuMuNuMuMuMuOtRtRtRuPtRtRtRtRtRtRtRuPtRtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmununuRuSuTuUununtmtmuVuWuVtmtmuqtmuXuXuXspuitRugtbtRtRtRtRtRtRtRtbuitRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmuYtmtmunuZuUvavbvcvdunvevfvfvfvfvgtmurtmtmtmtmsptQtRtStbvhuxvivivivjvktbtQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmvlvmvntmununvcuUvouUununvpvfvqvrvsvftmtmtmtLtMtNsptQtRtSspspvtvuvvvwvxspsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmvmvmvmvyunununvzvzunununvAvfvBvCvDvEtmvFtMtZtRtRvGtRtRtSspsptbtbtbtbtbspsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmvmvmvmtIunununvzvzunununvAvfvBvCvDvEtmvFtMtZtRtRvGtRtRtSspsptbtbtbtbtbspsptQtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmvHvmtmunvIunvJununununtmvfvKvLvMvNtmvOtRtRtRtStbtQtRuatMtMtMtMtMtMtMtMtMtZtRtSspaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtmtmtmtmtmtmtmtmvPvPtmtmtmvQvRvSvTvftmvUtRtRtRvVtbtQtRtRtRtRtRtRtRtRtRtRtRtRtRtSspaNaNaNaNaNaNaNaNaNaNvWvXvYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNvZwawbvZwctmwdwewfwgwhtmwiuhuhuhwjtbwkuhuhuhuhuhuitRuguhuhuhuhuhwlspaNaNaNaNaNaNaNaNaNvWwmwnwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwpwqwrwpwctmtmtmtmtmtmtmspspspspspspspspspspspspspwsspspspspspspspspaNaNaNaNaNaNaNaNvWwmwtwuwvwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwwwxwxwxwxwywywxwxwzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAwBwCwDwEwFwAaNaNaNaNaNaNaNaNaNaNaNaNaNvXwGwHwIwHwJvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwMwNwOwPwPwQwRwxwzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAwSwTwUwTwVwAaNaNaNaNaNaNaNaNaNaNaNaNvWwmwWwIwIwIwXwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwYwPwPwPwPwPwPwZxatmaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAxbxcwDxdwVwAaNaNaNaNaNaNaNaNaNaNaNaNxexfxgwIwIxhxiwIxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLxjxkxkxkxkxkxkwxxlaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAxmxnxoxnxnwAwAwAwAwAwAwAwAwAaNaNvWxpxqxpxpxpxrxpxsxpxqxpvYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxvwxwxwxwxwxwxwxwxxlaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAwAxwxnxxxnwBwFxnxyxyxzxyxyxzwAaNaNxexAxBxCxDxAwIxCxDxAxBxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTwBxExExExEwCwVwTxywAxnxnxnxnwAaNaNxexFwIxCxGxAwIxCxGxAwIxHxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVwTxywAxKxKxKxKwAaNaNvXxAwIxCxGxAwIxCxGxAwIxCvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxLxMxNxOxPxtxtxtaNxuxuxuxLxMxNxOxPaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVxnxywAwDwDwDxQxnxnxnxexAwIxCxRxAwIxCxRxAwIxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSxTxTxTxUxVxWxVxVxVxXxVxYxTxTxTxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwwwxwxwxwxwywywxwxwzaNaNaNaNaNaNaNtWtYtXvyuQtWIFIHIGwAwBwCwDwEwFwAaNaNaNaNaNaNaNaNaNaNaNaNaNvXwGwHwIwHwJvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwMwNwOwPwPwQwRwxwzaNaNaNaNaNaNtWtWtWIHIHIHIHIHIHwAwSwTwUwTwVwAaNaNaNaNaNaNaNaNaNaNaNaNvWwmwWwIwIwIwXwovYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLwYwPwPwPwPwPwPwZxatmaNaNaNaNaNtWtYIIIHIHIHIHIHIHwAxbxcwDxdwVwAaNaNaNaNaNaNaNaNaNaNaNaNxexfxgwIwIxhxiwIxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKwLxjxkxkxkxkxkxkwxxlaNaNaNaNaNaNtWtWtWIHIJtWIFIHIGwAxmxnxoxnxnwAwAwAwAwAwAwAwAwAaNaNvWxpxqxpxpxpxrxpxsxpxqxpvYaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxvwxwxwxwxwxwxwxwxxlaNaNaNaNaNaNaNtWtYIKIHIJtWtWtWwAwAxwxnxxxnwBwFxnxyxyxzxyxyxzwAaNaNxexAxBxCxDxAwIxCxDxAxBxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtWtWtWIHIHIHIHIHILwBxExExExEwCwVwTxywAxnxnxnxnwAaNaNxexFwIxCxGxAwIxCxGxAwIxHxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxtxtxtaNxuxuxuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtWtYIMIHIHIHIHIHILxbxIxJwDxIxJwVwTxywAxKxKxKxKwAaNaNvXxAwIxCxGxAwIxCxGxAwIxCvXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxLxMxNxOxPxtxtxtaNxuxuxuxLxMxNxOxPaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNtWtWtWINININININwAxbxIxJwDxIxJwVxnxywAwDwDwDxQxnxnxnxexAwIxCxRxAwIxCxRxAwIxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSxTxTxTxUxVxWxVxVxVxXxVxYxTxTxTxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVxZwTwAyawDwDybycydycyewIwIwIwIwIwIwIwIwIwIxCxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSyfyfygyhyiyjykylymynyiyoypyfyfxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwTxbxIxJwDxIxJwVyqydyqwDwDwDyrxnxnxnxeyswIxCxDxAwIxCxDxAwIytxeaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNxSyfyfyuyvywyxywyyywyxywyzyuyfyfxSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwAxmyAyAyAyBwDwVxZwTwAyawDwDwDwAaNaNxDxAwIxCxGxAwIxCxGxAwIxCxDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyCypyfyDywyxyxyxyxyxyxyxywyDyfygyEaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -2055,3 +2064,4 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
"}
+
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 690ac0e5c5b..2e748d40b7b 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -20,3 +20,6 @@ var/global/list/machines = list()
var/global/list/processing_power_items = list() //items that ask to be called every cycle
var/global/list/rcd_list = list() //list of Rapid Construction Devices.
+var/global/list/apcs = list()
+var/global/list/air_alarms = list()
+var/global/list/power_monitors = list()
\ No newline at end of file
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 30ee4a99e43..6a05464cf73 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -211,7 +211,7 @@ datum/controller/vote
question = "End the shift?"
choices.Add("Initiate Crew Transfer", "Continue The Round")
else
- if (get_security_level() == "red" || get_security_level() == "delta")
+ if (security_level > SEC_LEVEL_BLUE)
return 0
if(ticker.current_state <= 2)
return 0
@@ -272,12 +272,7 @@ datum/controller/vote
proc/interface(var/client/C)
if(!C) return
- var/admin = 0
- var/trialmin = 0
- if(C.holder)
- admin = 1
- if(C.holder.rights & R_ADMIN)
- trialmin = 1
+ var/admin = check_rights(R_ADMIN,0)
voting |= C
. = "
Voting Panel"
@@ -299,29 +294,29 @@ datum/controller/vote
else
. += "Start a vote:
- "
//restart
- if(trialmin || config.allow_vote_restart)
+ if(admin || config.allow_vote_restart)
. += "Restart"
else
. += "Restart (Disallowed)"
. += "
- "
- if(trialmin || config.allow_vote_restart)
+ if(admin || config.allow_vote_restart)
. += "Crew Transfer"
else
. += "Crew Transfer (Disallowed)"
- if(trialmin)
+ if(admin)
. += "\t([config.allow_vote_restart?"Allowed":"Disallowed"])"
. += "
- "
//gamemode
- if(trialmin || config.allow_vote_mode)
+ if(admin || config.allow_vote_mode)
. += "GameMode"
else
. += "GameMode (Disallowed)"
- if(trialmin)
+ if(admin)
. += "\t([config.allow_vote_mode?"Allowed":"Disallowed"])"
. += "
"
//custom
- if(trialmin)
+ if(admin)
. += "- Custom
"
. += "
"
. += "Close"
@@ -330,31 +325,32 @@ datum/controller/vote
Topic(href,href_list[],hsrc)
if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid
+ var/admin = check_rights(R_ADMIN,0)
switch(href_list["vote"])
if("close")
voting -= usr.client
usr << browse(null, "window=vote")
return
if("cancel")
- if(usr.client.holder)
+ if(admin)
reset()
if("toggle_restart")
- if(usr.client.holder)
+ if(admin)
config.allow_vote_restart = !config.allow_vote_restart
if("toggle_gamemode")
- if(usr.client.holder)
+ if(admin)
config.allow_vote_mode = !config.allow_vote_mode
if("restart")
- if(config.allow_vote_restart || usr.client.holder)
+ if(config.allow_vote_restart || admin)
initiate_vote("restart",usr.key)
if("gamemode")
- if(config.allow_vote_mode || usr.client.holder)
+ if(config.allow_vote_mode || admin)
initiate_vote("gamemode",usr.key)
if("crew_transfer")
- if(config.allow_vote_restart || usr.client.holder)
+ if(config.allow_vote_restart || admin)
initiate_vote("crew_transfer",usr.key)
if("custom")
- if(usr.client.holder)
+ if(admin)
initiate_vote("custom",usr.key)
else
submit_vote(usr.ckey, round(text2num(href_list["vote"])))
diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm
index 07caea0f3ad..83b2e8246e5 100644
--- a/code/datums/cache/air_alarm.dm
+++ b/code/datums/cache/air_alarm.dm
@@ -14,7 +14,7 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new()
if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time
alarms[++alarms.len] = passed_alarm.get_nano_data_console()
else
- for(var/obj/machinery/alarm/alarm in sortAtom((monitored_alarms ? monitored_alarms : machines)))
+ for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms))
if(!monitored_alarms && alarm.z != ZLEVEL_STATION && alarm.z != ZLEVEL_ASTEROID)
continue
alarms[++alarms.len] = alarm.get_nano_data_console()
diff --git a/code/datums/cache/powermonitor.dm b/code/datums/cache/powermonitor.dm
index a99b380a13d..e269ddc8afe 100644
--- a/code/datums/cache/powermonitor.dm
+++ b/code/datums/cache/powermonitor.dm
@@ -11,7 +11,7 @@ var/global/datum/repository/powermonitor/powermonitor_repository = new()
if(!refresh)
return cache_entry.data
- for(var/obj/machinery/computer/monitor/pMon in machines)
+ for(var/obj/machinery/computer/monitor/pMon in power_monitors)
if( !(pMon.stat & (NOPOWER|BROKEN)) )
pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]")
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 85a1c2b0215..d29e6769dd2 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -31,7 +31,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
if(5)
return "Science"
if(6)
- return "Food & Livestock"
+ return "Food and Livestock"
if(7)
return "Raw Materials"
if(8)
@@ -75,7 +75,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/emergency/evac
- name = "Emergency equipment"
+ name = "Emergency Equipment Crate"
contains = list(/obj/machinery/bot/floorbot,
/obj/machinery/bot/floorbot,
/obj/machinery/bot/medbot,
@@ -125,7 +125,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "firefighting crate"
/datum/supply_packs/emergency/atmostank
- name = "Firefighting Watertank"
+ name = "Firefighting Watertank Crate"
contains = list(/obj/item/weapon/watertank/atmos)
cost = 10
containertype = /obj/structure/closet/crate/secure
@@ -144,7 +144,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
access = access_hydroponics
/datum/supply_packs/emergency/specialops
- name = "Special Ops supplies"
+ name = "Special Ops Supplies"
contains = list(/obj/item/weapon/storage/box/emps,
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/smokebomb,
@@ -413,7 +413,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "insulated gloves crate"
/datum/supply_packs/engineering/power
- name = "Powercell Crate"
+ name = "Power Cell Crate"
contains = list(/obj/item/weapon/stock_parts/cell/high, //Changed to an extra high powercell because normal cells are useless
/obj/item/weapon/stock_parts/cell/high,
/obj/item/weapon/stock_parts/cell/high)
@@ -524,7 +524,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/storage/briefcase/inflatable,
/obj/item/weapon/storage/briefcase/inflatable)
cost = 20
- containername = "Inflatable Barrier Crate"
+ containername = "inflatable barrier crate"
/datum/supply_packs/engineering/engine/supermatter_shard
name = "Supermatter Shard Crate"
@@ -543,7 +543,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
)
cost = 25
containertype = /obj/structure/closet/crate/secure
- containername = "Thermo-Electric Generator Components"
+ containername = "thermo-electric generator crate"
access = access_ce
//////////////////////////////////////////////////////////////////////////////
@@ -586,21 +586,21 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "first aid kits crate"
/datum/supply_packs/medical/firstaidadv
- name = "Advaced First Aid Kits Crate"
+ name = "Advanced First Aid Kits Crate"
contains = list(/obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/storage/firstaid/adv)
cost = 10
- containername = "advaced first aid kits crate"
+ containername = "advanced first aid kits crate"
/datum/supply_packs/medical/firstaibrute
- name = "Brute Trauma Treatment Kits Crate"
+ name = "Brute Treatment Kits Crate"
contains = list(/obj/item/weapon/storage/firstaid/brute,
/obj/item/weapon/storage/firstaid/brute,
/obj/item/weapon/storage/firstaid/brute)
cost = 10
- containername = "brute trauma treatment kit"
+ containername = "brute first aid kits crate"
/datum/supply_packs/medical/firstaidburns
name = "Burns Treatment Kits Crate"
@@ -619,12 +619,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "toxin first aid kits crate"
/datum/supply_packs/medical/firstaidoxygen
- name = "Oxygen Deprivation Kits Crate"
+ name = "Oxygen Treatment Kits Crate"
contains = list(/obj/item/weapon/storage/firstaid/o2,
/obj/item/weapon/storage/firstaid/o2,
/obj/item/weapon/storage/firstaid/o2)
cost = 10
- containername = "oxygen deprivation kits crate"
+ containername = "oxygen first aid kits crate"
/datum/supply_packs/medical/virus
name = "Virus Crate"
@@ -657,11 +657,11 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
contains = list(/obj/machinery/iv_drip)
cost = 30
containertype = /obj/structure/closet/crate/secure
- containername = "iv drip crate"
+ containername = "IV drip crate"
access = access_cmo
/datum/supply_packs/medical/surgery
- name = "Surgery crate"
+ name = "Surgery Crate"
contains = list(/obj/item/weapon/cautery,
/obj/item/weapon/surgicaldrill,
/obj/item/clothing/mask/breath/medical,
@@ -675,7 +675,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/circular_saw)
cost = 25
containertype = /obj/structure/closet/crate/secure
- containername = "Surgery crate"
+ containername = "surgery crate"
access = access_medical
@@ -703,7 +703,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
access = access_robotics
/datum/supply_packs/science/robotics/mecha_ripley
- name = "Circuit Crate (\"Ripley\" APLU)"
+ name = "Circuit Crate (Ripley APLU)"
contains = list(/obj/item/weapon/book/manual/ripley_build_and_repair,
/obj/item/weapon/circuitboard/mecha/ripley/main, //TEMPORARY due to lack of circuitboard printer
/obj/item/weapon/circuitboard/mecha/ripley/peripherals) //TEMPORARY due to lack of circuitboard printer
@@ -712,7 +712,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "\improper APLU \"Ripley\" circuit crate"
/datum/supply_packs/science/robotics/mecha_odysseus
- name = "Circuit Crate (\"Odysseus\")"
+ name = "Circuit Crate (Odysseus)"
contains = list(/obj/item/weapon/circuitboard/mecha/odysseus/peripherals, //TEMPORARY due to lack of circuitboard printer
/obj/item/weapon/circuitboard/mecha/odysseus/main) //TEMPORARY due to lack of circuitboard printer
cost = 25
@@ -740,7 +740,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
group = supply_science
/datum/supply_packs/science/shieldwalls
- name = "Shield Generators"
+ name = "Shield Generators Crate"
contains = list(/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen,
@@ -752,12 +752,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/science/transfer_valves
- name = "Tank Transfer Valves"
+ name = "Tank Transfer Valves Crate"
contains = list(/obj/item/device/transfer_valve,
/obj/item/device/transfer_valve)
cost = 60
containertype = /obj/structure/closet/crate/secure
- containername = "transfer valves crate"
+ containername = "tank transfer valves crate"
access = access_rd
@@ -805,33 +805,33 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "monkey crate"
/datum/supply_packs/organic/farwa
- name = "Farwa crate"
+ name = "Farwa Crate"
contains = list (/obj/item/weapon/storage/box/farwacubes)
cost = 30
containername = "farwa crate"
/datum/supply_packs/organic/wolpin
- name = "Wolpin crate"
+ name = "Wolpin Crate"
contains = list (/obj/item/weapon/storage/box/wolpincubes)
cost = 30
containername = "wolpin crate"
/datum/supply_packs/organic/skrell
- name = "Neaera crate"
+ name = "Neaera Crate"
contains = list (/obj/item/weapon/storage/box/neaeracubes)
cost = 30
containername = "neaera crate"
/datum/supply_packs/organic/stok
- name = "Stok crate"
+ name = "Stok Crate"
contains = list (/obj/item/weapon/storage/box/stokcubes)
cost = 30
containername = "stok crate"
/datum/supply_packs/organic/party
- name = "Party equipment"
+ name = "Party Equipment Crate"
contains = list(/obj/item/weapon/storage/box/drinkingglasses,
/obj/item/weapon/reagent_containers/food/drinks/shaker,
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,
@@ -923,7 +923,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "hydroponics crate"
/datum/supply_packs/misc/hydroponics/hydrotank
- name = "Hydroponics Watertank Backpack Crate"
+ name = "Hydroponics Watertank Crate"
contains = list(/obj/item/weapon/watertank)
cost = 10
containertype = /obj/structure/closet/crate/secure
@@ -995,42 +995,42 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/materials/metal50
- name = "50 Metal Sheets"
+ name = "50 Metal Sheets Crate"
contains = list(/obj/item/stack/sheet/metal)
amount = 50
cost = 10
containername = "metal sheets crate"
/datum/supply_packs/materials/plasteel20
- name = "20 Plasteel Sheets"
+ name = "20 Plasteel Sheets Crate"
contains = list(/obj/item/stack/sheet/plasteel)
amount = 20
cost = 30
containername = "plasteel sheets crate"
/datum/supply_packs/materials/plasteel50
- name = "50 Plasteel Sheets"
+ name = "50 Plasteel Sheets Crate"
contains = list(/obj/item/stack/sheet/plasteel)
amount = 50
cost = 50
containername = "plasteel sheets crate"
/datum/supply_packs/materials/glass50
- name = "50 Glass Sheets"
+ name = "50 Glass Sheets Crate"
contains = list(/obj/item/stack/sheet/glass)
amount = 50
cost = 10
containername = "glass sheets crate"
/datum/supply_packs/materials/cardboard50
- name = "50 Cardboard Sheets"
+ name = "50 Cardboard Sheets Crate"
contains = list(/obj/item/stack/sheet/cardboard)
amount = 50
cost = 10
containername = "cardboard sheets crate"
/datum/supply_packs/materials/sandstone30
- name = "30 Sandstone Blocks"
+ name = "30 Sandstone Blocks Crate"
contains = list(/obj/item/stack/sheet/mineral/sandstone)
amount = 30
cost = 20
@@ -1038,7 +1038,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/materials/plastic30
- name = "30 Plastic Sheets"
+ name = "30 Plastic Sheets Crate"
contains = list(/obj/item/stack/sheet/mineral/plastic)
amount = 30
cost = 25
@@ -1057,7 +1057,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
contains = list(/obj/machinery/bot/mulebot)
cost = 20
containertype = /obj/structure/largecrate/mule
- containername = "\improper MULEbot Crate"
+ containername = "\improper MULEbot crate"
/datum/supply_packs/misc/watertank
name = "Water Tank Crate"
@@ -1120,7 +1120,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "bureaucracy crate"
/datum/supply_packs/misc/toner
- name = "Toner Cartridges crate"
+ name = "Toner Cartridges Crate"
contains = list(/obj/item/device/toner,
/obj/item/device/toner,
/obj/item/device/toner,
@@ -1131,7 +1131,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "toner cartridges crate"
/datum/supply_packs/misc/artscrafts
- name = "Arts and Crafts supplies"
+ name = "Arts and Crafts Supplies Crate"
contains = list(/obj/item/weapon/storage/fancy/crayons,
/obj/item/device/camera,
/obj/item/device/camera_film,
@@ -1151,7 +1151,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/stack/wrapping_paper,
/obj/item/stack/wrapping_paper)
cost = 10
- containername = "Arts and Crafts crate"
+ containername = "arts and crafts crate"
/datum/supply_packs/misc/posters
name = "Corporate Posters Crate"
@@ -1161,7 +1161,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/contraband/poster/legit,
/obj/item/weapon/contraband/poster/legit)
cost = 8
- containername = "Corporate Posters Crate"
+ containername = "corporate posters crate"
///////////// Janitor Supplies
@@ -1200,12 +1200,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
access = access_janitor
/datum/supply_packs/misc/janitor/lightbulbs
- name = "Replacement Lights"
+ name = "Replacement Lights Crate"
contains = list(/obj/item/weapon/storage/box/lights/mixed,
/obj/item/weapon/storage/box/lights/mixed,
/obj/item/weapon/storage/box/lights/mixed)
cost = 10
- containername = "replacement lights"
+ containername = "replacement lights crate"
///////////// Costumes
@@ -1239,7 +1239,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "wizard costume crate"
/datum/supply_packs/misc/mafia
- name = "Mafia Supply crate"
+ name = "Mafia Supply Crate"
contains = list(/obj/item/clothing/suit/browntrenchcoat =1,/obj/item/clothing/suit/blacktrenchcoat =1,/obj/item/clothing/head/fedora/whitefedora =1,
/obj/item/clothing/head/fedora/brownfedora =1,/obj/item/clothing/head/fedora =1,/obj/item/clothing/under/flappers =1,/obj/item/clothing/under/mafia =1,/obj/item/clothing/under/mafia/vest =1,/obj/item/clothing/under/mafia/white =1,
/obj/item/clothing/under/mafia/sue =1,/obj/item/clothing/under/mafia/tan =1, /obj/item/toy/crossbow/tommygun =2)
@@ -1268,7 +1268,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/head/collectable/slime,
/obj/item/clothing/head/collectable/xenom,
/obj/item/clothing/head/collectable/petehat)
- name = "Collectable hat crate!"
+ name = "Collectible Hats Crate"
cost = 200
containername = "collectable hats crate! Brought to you by Bass.inc!"
@@ -1289,7 +1289,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
contraband = 1
/datum/supply_packs/misc/formalwear //This is a very classy crate.
- name = "Formal-wear Crate"
+ name = "Formal Wear Crate"
contains = list(/obj/item/clothing/under/blacktango,
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/assistantformal,
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 098ae32e538..68765df5447 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -54,7 +54,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/air_doors_activated = 0
var/tele_proof = 0
-
+
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list()
@@ -71,7 +71,7 @@ var/list/teleportlocs = list()
teleportlocs = sortAssoc(teleportlocs)
return 1
-
+
var/list/ghostteleportlocs = list()
/hook/startup/proc/process_ghost_teleport_locs()
for(var/area/AR in world)
@@ -119,7 +119,7 @@ var/list/ghostteleportlocs = list()
power_equip = 0
power_environ = 0
ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
-
+
/area/space/atmosalert()
return
@@ -131,7 +131,7 @@ var/list/ghostteleportlocs = list()
/area/space/readyalert()
return
-
+
/area/space/radiation_alert()
return
@@ -465,6 +465,9 @@ var/list/ghostteleportlocs = list()
/area/centcom/holding
name = "\improper Holding Facility"
+/area/centcom/bathroom
+ name = "\improper Centcom Emergency Shuttle Bathrooms"
+
//SYNDICATES
/area/syndicate_mothership
@@ -1506,7 +1509,7 @@ var/list/ghostteleportlocs = list()
/area/security/brig
name = "\improper Brig"
icon_state = "brig"
-
+
/area/security/brig/prison_break()
for(var/obj/structure/closet/secure_closet/brig/temp_closet in src)
temp_closet.locked = 0
@@ -1522,7 +1525,7 @@ var/list/ghostteleportlocs = list()
/area/security/prison
name = "\improper Prison Wing"
icon_state = "sec_prison"
-
+
/area/security/prison/prison_break()
for(var/obj/structure/closet/secure_closet/brig/temp_closet in src)
temp_closet.locked = 0
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 7239061a61d..d74b2672360 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -5,6 +5,8 @@
#define DNA2_BUF_UE 2
#define DNA2_BUF_SE 4
+#define NEGATE_MUTATION_THRESHOLD 30 // Occupants with over ## percent radiation threshold will not gain mutations
+
//list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0),
/datum/dna2/record
var/datum/dna/dna = null
@@ -306,12 +308,27 @@
else
return
-
/obj/machinery/dna_scannernew/blob_act()
if(prob(75))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
qdel(src)
+
+// Checks if occupants can be irradiated/mutated - prevents exploits where wearing full rad protection would still let you gain mutations
+/obj/machinery/dna_scannernew/proc/radiation_check()
+ if(!occupant)
+ return 1
+
+ if(ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ if((H.species.flags & NO_DNA_RAD))
+ return 1
+
+ var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.")
+ if (radiation_protection > NEGATE_MUTATION_THRESHOLD)
+ return 1
+
+ return 0
/obj/machinery/computer/scan_consolenew
name = "DNA Modifier Access Console"
@@ -562,10 +579,16 @@
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
+ src.connected.locked = lock_state
if (!src.connected.occupant)
return 1 // return 1 forces an update to all Nano uis attached to src
+ var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff)
+ src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+ if(src.connected.radiation_check())
+ return 1
+
if (prob(95))
if(prob(75))
randmutb(src.connected.occupant)
@@ -577,8 +600,6 @@
else
randmuti(src.connected.occupant)
- src.connected.occupant.radiation += (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff)
- src.connected.locked = lock_state
return 1 // return 1 forces an update to all Nano uis attached to src
if (href_list["radiationDuration"])
@@ -663,24 +684,33 @@
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
+ src.connected.locked = lock_state
if (!src.connected.occupant)
return 1
-
+
if (prob((80 + (src.radiation_duration / 2))))
+ var/radiation = (src.radiation_intensity+src.radiation_duration)
+ src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+
+ if(src.connected.radiation_check())
+ return 1
+
block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration)
src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block)
src.connected.occupant.UpdateAppearance()
- src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration)
else
+ var/radiation = ((src.radiation_intensity*2)+src.radiation_duration)
+ src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+ if(src.connected.radiation_check())
+ return 1
+
if (prob(20+src.radiation_intensity))
randmutb(src.connected.occupant)
domutcheck(src.connected.occupant,src.connected)
else
randmuti(src.connected.occupant)
- src.connected.occupant.UpdateAppearance()
- src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration)
- src.connected.locked = lock_state
+ src.connected.occupant.UpdateAppearance()
return 1 // return 1 forces an update to all Nano uis attached to src
////////////////////////////////////////////////////////
@@ -722,11 +752,16 @@
sleep(10*src.radiation_duration) // sleep for radiation_duration seconds
irradiating = 0
-
- if(src.connected.occupant)
+ src.connected.locked = lock_state
+
+ if(src.connected.occupant)
if (prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3)))))
- // FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be.
- //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20))
+ var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff)
+ src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+
+ if(src.connected.radiation_check())
+ return 1
+
var/real_SE_block=selected_se_block
block = miniscramble(block, src.radiation_intensity, src.radiation_duration)
if(prob(20))
@@ -737,10 +772,14 @@
//testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!")
connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block)
- src.connected.occupant.radiation += ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff)
domutcheck(src.connected.occupant,src.connected)
else
- src.connected.occupant.radiation += (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff)
+ var/radiation = (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff)
+ src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+
+ if(src.connected.radiation_check())
+ return 1
+
if (prob(80-src.radiation_duration))
//testing("Random bad mut!")
randmutb(src.connected.occupant)
@@ -749,7 +788,6 @@
randmuti(src.connected.occupant)
//testing("Random identity mut!")
src.connected.occupant.UpdateAppearance()
- src.connected.locked = lock_state
return 1 // return 1 forces an update to all Nano uis attached to src
if(href_list["ejectBeaker"])
@@ -839,7 +877,7 @@
if (bufferOption == "transfer")
if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna)
- return
+ return 1
irradiating = 2
var/lock_state = src.connected.locked
@@ -851,6 +889,12 @@
irradiating = 0
src.connected.locked = lock_state
+ var/radiation = (rand(20,50) / connected.damage_coeff)
+ src.connected.occupant.apply_effect(radiation,IRRADIATE,0)
+
+ if(src.connected.radiation_check())
+ return 1
+
var/datum/dna2/record/buf = src.buffers[bufferId]
if ((buf.types & DNA2_BUF_UI))
@@ -862,7 +906,6 @@
src.connected.occupant.dna.SE = buf.dna.SE
src.connected.occupant.dna.UpdateSE()
domutcheck(src.connected.occupant,src.connected)
- src.connected.occupant.radiation += (rand(20,50) / connected.damage_coeff)
return 1
if (bufferOption == "createInjector")
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 0444eb9997f..5f981b3fb1a 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -488,7 +488,7 @@
dat += cat_dat[category]
dat += ""
- user << browse(wrap(dat), "window=spellbook;size=600x300")
+ user << browse(wrap(dat), "window=spellbook;size=700x300")
onclose(user, "spellbook")
return
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index f9f13d4f907..5d6c2ff7730 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -183,6 +183,9 @@
/obj/machinery/alarm/New(var/loc, var/dir, var/building = 0)
..()
+ air_alarms += src
+ air_alarms = sortAtom(air_alarms)
+
wires = new(src)
if(building)
@@ -202,11 +205,9 @@
first_run()
/obj/machinery/alarm/Destroy()
+ air_alarms -= src
if(radio_controller)
radio_controller.remove_object(src, frequency)
-
- if (src in machines) // So the cache can properly update
- removeAtProcessing()
air_alarm_repository.update_cache(src)
return ..()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 702f7512535..644420fc3c1 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -74,6 +74,7 @@ var/datum/canister_icons/canister_icon_container = new()
var/temperature_resistance = 1000 + T0C
volume = 1000
use_power = 0
+ interact_offline = 1
var/release_log = ""
var/busy = 0
var/update_flag = 0
@@ -424,16 +425,9 @@ update_flag
possibledecals = new /list(3)
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
-
- //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict. // yeah but without SOME sort of Topic check any dick can mess with them via exploits as he pleases -walter0o
- if (!istype(src.loc, /turf))
- return 0
-
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) // exploit protection -walter0o
- usr << browse(null, "window=canister")
- onclose(usr, "canister")
- return
-
+ if(..())
+ return 1
+
if (href_list["choice"] == "menu")
menu = text2num(href_list["mode_target"])
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index e9fb01b034c..23dca91dd51 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -99,7 +99,7 @@
src.add_hiddenprint(user)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/pump/attack_ghost(var/mob/user)
+/obj/machinery/portable_atmospherics/pump/attack_ghost(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/portable_atmospherics/pump/attack_hand(var/mob/user as mob)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index b6dabbdec32..5ab92bd3088 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -109,7 +109,7 @@
src.add_hiddenprint(user)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/scrubber/attack_ghost(var/mob/user)
+/obj/machinery/portable_atmospherics/scrubber/attack_ghost(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/portable_atmospherics/scrubber/attack_hand(var/mob/user as mob)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 5df74641bcc..6228fe05ddd 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -168,6 +168,9 @@
busy = 0
src.updateUsrDialog()
+/obj/machinery/autolathe/attack_ghost(mob/user)
+ interact(user)
+
/obj/machinery/autolathe/attack_hand(mob/user)
if(..(user, 0))
return
@@ -176,6 +179,7 @@
/obj/machinery/autolathe/Topic(href, href_list)
if(..())
return 1
+
if(href_list["menu"])
screen = text2num(href_list["menu"])
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 31e53150081..44b3a16f27f 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -159,7 +159,7 @@
else
src.network += net
break
- invalidateCameraCache()
+ invalidateCameraCache()
nanomanager.update_uis(src)
else
. = ..()
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index 55cf68c3234..855b5f7cbb6 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -13,6 +13,8 @@
/obj/machinery/computer/monitor/New()
..()
+ power_monitors += src
+ power_monitors = sortAtom(power_monitors)
power_monitor = new(src)
powermonitor_repository.update_cache()
@@ -21,8 +23,7 @@
powernet = find_powernet()
/obj/machinery/computer/monitor/Destroy()
- if (src in machines) // So the cache can properly update
- removeAtProcessing()
+ power_monitors -= src
powermonitor_repository.update_cache()
return ..()
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 2c03a7a92e8..75acd99fb58 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -53,12 +53,15 @@ FIRE ALARM
if(src.detecting)
if(temperature > T0C+200)
src.alarm() // added check of detector status here
- return
-
+ return
+
/obj/machinery/firealarm/attack_ai(mob/user as mob)
src.add_hiddenprint(user)
return src.attack_hand(user)
+/obj/machinery/firealarm/attack_ghost(mob/user as mob)
+ return src.attack_hand(user)
+
/obj/machinery/firealarm/bullet_act(BLAH)
return src.alarm()
@@ -174,7 +177,7 @@ FIRE ALARM
var/area/A = src.loc
var/d1
var/d2
- if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon))
+ if (ishuman(user) || issilicon(user) || isobserver(user))
A = A.loc
if (A.fire)
@@ -208,34 +211,27 @@ FIRE ALARM
return
/obj/machinery/firealarm/Topic(href, href_list)
- ..()
- if (usr.stat || stat & (BROKEN|NOPOWER))
- return
-
+ if(..())
+ return 1
+
if (buildstage != 2)
- return
+ return 1
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- if (href_list["reset"])
- src.reset()
- else if (href_list["alarm"])
- src.alarm()
- else if (href_list["time"])
- src.timing = text2num(href_list["time"])
- last_process = world.timeofday
- processing_objects.Add(src)
- else if (href_list["tp"])
- var/tp = text2num(href_list["tp"])
- src.time += tp
- src.time = min(max(round(src.time), 0), 120)
+ if (href_list["reset"])
+ src.reset()
+ else if (href_list["alarm"])
+ src.alarm()
+ else if (href_list["time"])
+ src.timing = text2num(href_list["time"])
+ last_process = world.timeofday
+ processing_objects.Add(src)
+ else if (href_list["tp"])
+ var/tp = text2num(href_list["tp"])
+ src.time += tp
+ src.time = min(max(round(src.time), 0), 120)
- src.updateUsrDialog()
-
- src.add_fingerprint(usr)
- else
- usr << browse(null, "window=firealarm")
- return
+ src.updateUsrDialog()
+ src.add_fingerprint(usr)
return
/obj/machinery/firealarm/proc/reset()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index eef7223d15b..43d4363a997 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -183,9 +183,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(!src.ispowered || src.isbroken)
return
- if(!user.IsAdvancedToolUser())
- return 0
-
if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) )
var/mob/living/human_or_robot_user = user
var/dat
@@ -444,273 +441,272 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return 1
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- if(href_list["set_channel_name"])
- src.channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))
- while (findtext(src.channel_name," ") == 1)
- src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
- src.updateUsrDialog()
- //src.update_icon()
+
+ usr.set_machine(src)
+ if(href_list["set_channel_name"])
+ src.channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))
+ while (findtext(src.channel_name," ") == 1)
+ src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
+ src.updateUsrDialog()
+ //src.update_icon()
- else if(href_list["set_channel_lock"])
- src.c_locked = !src.c_locked
- src.updateUsrDialog()
- //src.update_icon()
+ else if(href_list["set_channel_lock"])
+ src.c_locked = !src.c_locked
+ src.updateUsrDialog()
+ //src.update_icon()
- else if(href_list["submit_new_channel"])
- //var/list/existing_channels = list() //OBSOLETE
- var/list/existing_authors = list()
- for(var/datum/feed_channel/FC in news_network.network_channels)
- //existing_channels += FC.channel_name
- if(FC.author == "\[REDACTED\]")
- existing_authors += FC.backup_author
- else
- existing_authors +=FC.author
- var/check = 0
+ else if(href_list["submit_new_channel"])
+ //var/list/existing_channels = list() //OBSOLETE
+ var/list/existing_authors = list()
+ for(var/datum/feed_channel/FC in news_network.network_channels)
+ //existing_channels += FC.channel_name
+ if(FC.author == "\[REDACTED\]")
+ existing_authors += FC.backup_author
+ else
+ existing_authors +=FC.author
+ var/check = 0
+ for(var/datum/feed_channel/FC in news_network.network_channels)
+ if(FC.channel_name == src.channel_name)
+ check = 1
+ break
+ if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) )
+ src.screen=7
+ else
+ var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
+ if(choice=="Confirm")
+ var/datum/feed_channel/newChannel = new /datum/feed_channel
+ newChannel.channel_name = src.channel_name
+ newChannel.author = src.scanned_user
+ newChannel.locked = c_locked
+ feedback_inc("newscaster_channels",1)
+ /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
+ NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
+ news_network.network_channels += newChannel //Adding channel to the global network
+ src.screen=5
+ src.updateUsrDialog()
+ //src.update_icon()
+
+ else if(href_list["set_channel_receiving"])
+ //var/list/datum/feed_channel/available_channels = list()
+ var/list/available_channels = list()
+ for(var/datum/feed_channel/F in news_network.network_channels)
+ if( (!F.locked || F.author == scanned_user) && !F.censored)
+ available_channels += F.channel_name
+ src.channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
+ src.updateUsrDialog()
+
+ else if(href_list["set_new_message"])
+ src.msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))
+ while (findtext(src.msg," ") == 1)
+ src.msg = copytext(src.msg,2,lentext(src.msg)+1)
+ src.updateUsrDialog()
+
+ else if(href_list["set_attachment"])
+ AttachPhoto(usr)
+ src.updateUsrDialog()
+
+ else if(href_list["submit_new_message"])
+ if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
+ src.screen=6
+ else
+ var/datum/feed_message/newMsg = new /datum/feed_message
+ newMsg.author = src.scanned_user
+ newMsg.body = src.msg
+ if(photo)
+ newMsg.img = photo.img
+ feedback_inc("newscaster_stories",1)
+ var/announcement = ""
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.channel_name)
- check = 1
+ FC.messages += newMsg //Adding message to the network's appropriate feed_channel
+ announcement = FC.announce_news()
break
- if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) )
- src.screen=7
- else
- var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
- if(choice=="Confirm")
- var/datum/feed_channel/newChannel = new /datum/feed_channel
- newChannel.channel_name = src.channel_name
- newChannel.author = src.scanned_user
- newChannel.locked = c_locked
- feedback_inc("newscaster_channels",1)
- /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
- NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
- news_network.network_channels += newChannel //Adding channel to the global network
- src.screen=5
- src.updateUsrDialog()
- //src.update_icon()
+ src.screen=4
+ for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
+ NEWSCASTER.newsAlert(announcement)
- else if(href_list["set_channel_receiving"])
- //var/list/datum/feed_channel/available_channels = list()
- var/list/available_channels = list()
- for(var/datum/feed_channel/F in news_network.network_channels)
- if( (!F.locked || F.author == scanned_user) && !F.censored)
- available_channels += F.channel_name
- src.channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
- src.updateUsrDialog()
+ src.updateUsrDialog()
- else if(href_list["set_new_message"])
- src.msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))
- while (findtext(src.msg," ") == 1)
- src.msg = copytext(src.msg,2,lentext(src.msg)+1)
- src.updateUsrDialog()
+ else if(href_list["create_channel"])
+ src.screen=2
+ src.updateUsrDialog()
- else if(href_list["set_attachment"])
- AttachPhoto(usr)
- src.updateUsrDialog()
+ else if(href_list["create_feed_story"])
+ src.screen=3
+ src.updateUsrDialog()
- else if(href_list["submit_new_message"])
- if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
- src.screen=6
- else
- var/datum/feed_message/newMsg = new /datum/feed_message
- newMsg.author = src.scanned_user
- newMsg.body = src.msg
- if(photo)
- newMsg.img = photo.img
- feedback_inc("newscaster_stories",1)
- var/announcement = ""
- for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
- FC.messages += newMsg //Adding message to the network's appropriate feed_channel
- announcement = FC.announce_news()
- break
- src.screen=4
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert(announcement)
+ else if(href_list["menu_paper"])
+ src.screen=8
+ src.updateUsrDialog()
+ else if(href_list["print_paper"])
+ if(!src.paper_remaining)
+ src.screen=21
+ else
+ src.print_paper()
+ src.screen = 20
+ src.updateUsrDialog()
- src.updateUsrDialog()
+ else if(href_list["menu_censor_story"])
+ src.screen=10
+ src.updateUsrDialog()
- else if(href_list["create_channel"])
- src.screen=2
- src.updateUsrDialog()
+ else if(href_list["menu_censor_channel"])
+ src.screen=11
+ src.updateUsrDialog()
- else if(href_list["create_feed_story"])
- src.screen=3
- src.updateUsrDialog()
+ else if(href_list["menu_wanted"])
+ var/already_wanted = 0
+ if(news_network.wanted_issue)
+ already_wanted = 1
- else if(href_list["menu_paper"])
- src.screen=8
- src.updateUsrDialog()
- else if(href_list["print_paper"])
- if(!src.paper_remaining)
- src.screen=21
- else
- src.print_paper()
- src.screen = 20
- src.updateUsrDialog()
+ if(already_wanted)
+ src.channel_name = news_network.wanted_issue.author
+ src.msg = news_network.wanted_issue.body
+ src.screen = 14
+ src.updateUsrDialog()
- else if(href_list["menu_censor_story"])
- src.screen=10
- src.updateUsrDialog()
+ else if(href_list["set_wanted_name"])
+ src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
+ while (findtext(src.channel_name," ") == 1)
+ src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
+ src.updateUsrDialog()
- else if(href_list["menu_censor_channel"])
- src.screen=11
- src.updateUsrDialog()
+ else if(href_list["set_wanted_desc"])
+ src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
+ while (findtext(src.msg," ") == 1)
+ src.msg = copytext(src.msg,2,lentext(src.msg)+1)
+ src.updateUsrDialog()
- else if(href_list["menu_wanted"])
- var/already_wanted = 0
- if(news_network.wanted_issue)
- already_wanted = 1
-
- if(already_wanted)
- src.channel_name = news_network.wanted_issue.author
- src.msg = news_network.wanted_issue.body
- src.screen = 14
- src.updateUsrDialog()
-
- else if(href_list["set_wanted_name"])
- src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
- while (findtext(src.channel_name," ") == 1)
- src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
- src.updateUsrDialog()
-
- else if(href_list["set_wanted_desc"])
- src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
- while (findtext(src.msg," ") == 1)
- src.msg = copytext(src.msg,2,lentext(src.msg)+1)
- src.updateUsrDialog()
-
- else if(href_list["submit_wanted"])
- var/input_param = text2num(href_list["submit_wanted"])
- if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown")
- src.screen = 16
- else
- var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel")
- if(choice=="Confirm")
- if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below
- var/datum/feed_message/WANTED = new /datum/feed_message
- WANTED.author = src.channel_name
- WANTED.body = src.msg
- WANTED.backup_author = src.scanned_user //I know, a bit wacky
- if(photo)
- WANTED.img = photo.img
- news_network.wanted_issue = WANTED
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert()
- NEWSCASTER.update_icon()
- src.screen = 15
- else
- if(news_network.wanted_issue.is_admin_message)
- alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
- return
- news_network.wanted_issue.author = src.channel_name
- news_network.wanted_issue.body = src.msg
- news_network.wanted_issue.backup_author = src.scanned_user
- if(photo)
- news_network.wanted_issue.img = photo.img
- src.screen = 19
-
- src.updateUsrDialog()
-
- else if(href_list["cancel_wanted"])
- if(news_network.wanted_issue.is_admin_message)
- alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok")
- return
- var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
+ else if(href_list["submit_wanted"])
+ var/input_param = text2num(href_list["submit_wanted"])
+ if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown")
+ src.screen = 16
+ else
+ var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
- news_network.wanted_issue = null
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.update_icon()
- src.screen=17
- src.updateUsrDialog()
+ if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below
+ var/datum/feed_message/WANTED = new /datum/feed_message
+ WANTED.author = src.channel_name
+ WANTED.body = src.msg
+ WANTED.backup_author = src.scanned_user //I know, a bit wacky
+ if(photo)
+ WANTED.img = photo.img
+ news_network.wanted_issue = WANTED
+ for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
+ NEWSCASTER.newsAlert()
+ NEWSCASTER.update_icon()
+ src.screen = 15
+ else
+ if(news_network.wanted_issue.is_admin_message)
+ alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
+ return
+ news_network.wanted_issue.author = src.channel_name
+ news_network.wanted_issue.body = src.msg
+ news_network.wanted_issue.backup_author = src.scanned_user
+ if(photo)
+ news_network.wanted_issue.img = photo.img
+ src.screen = 19
- else if(href_list["view_wanted"])
- src.screen=18
- src.updateUsrDialog()
- else if(href_list["censor_channel_author"])
- var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
- if(FC.is_admin_channel)
- alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
- return
- if(FC.author != "\[REDACTED\]")
- FC.backup_author = FC.author
- FC.author = "\[REDACTED\]"
- else
- FC.author = FC.backup_author
- src.updateUsrDialog()
+ src.updateUsrDialog()
- else if(href_list["censor_channel_story_author"])
- var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"])
- if(MSG.is_admin_message)
- alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
- return
- if(MSG.author != "\[REDACTED\]")
- MSG.backup_author = MSG.author
- MSG.author = "\[REDACTED\]"
- else
- MSG.author = MSG.backup_author
- src.updateUsrDialog()
+ else if(href_list["cancel_wanted"])
+ if(news_network.wanted_issue.is_admin_message)
+ alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok")
+ return
+ var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
+ if(choice=="Confirm")
+ news_network.wanted_issue = null
+ for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
+ NEWSCASTER.update_icon()
+ src.screen=17
+ src.updateUsrDialog()
- else if(href_list["censor_channel_story_body"])
- var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"])
- if(MSG.is_admin_message)
- alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
- return
- if(MSG.img != null)
- MSG.backup_img = MSG.img
- MSG.img = null
- else
- MSG.img = MSG.backup_img
- if(MSG.body != "\[REDACTED\]")
- MSG.backup_body = MSG.body
- MSG.body = "\[REDACTED\]"
- else
- MSG.body = MSG.backup_body
- src.updateUsrDialog()
+ else if(href_list["view_wanted"])
+ src.screen=18
+ src.updateUsrDialog()
+ else if(href_list["censor_channel_author"])
+ var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
+ if(FC.is_admin_channel)
+ alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
+ return
+ if(FC.author != "\[REDACTED\]")
+ FC.backup_author = FC.author
+ FC.author = "\[REDACTED\]"
+ else
+ FC.author = FC.backup_author
+ src.updateUsrDialog()
- else if(href_list["pick_d_notice"])
- var/datum/feed_channel/FC = locate(href_list["pick_d_notice"])
- src.viewing_channel = FC
- src.screen=13
- src.updateUsrDialog()
+ else if(href_list["censor_channel_story_author"])
+ var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"])
+ if(MSG.is_admin_message)
+ alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
+ return
+ if(MSG.author != "\[REDACTED\]")
+ MSG.backup_author = MSG.author
+ MSG.author = "\[REDACTED\]"
+ else
+ MSG.author = MSG.backup_author
+ src.updateUsrDialog()
- else if(href_list["toggle_d_notice"])
- var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
- if(FC.is_admin_channel)
- alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
- return
- FC.censored = !FC.censored
- src.updateUsrDialog()
+ else if(href_list["censor_channel_story_body"])
+ var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"])
+ if(MSG.is_admin_message)
+ alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
+ return
+ if(MSG.img != null)
+ MSG.backup_img = MSG.img
+ MSG.img = null
+ else
+ MSG.img = MSG.backup_img
+ if(MSG.body != "\[REDACTED\]")
+ MSG.backup_body = MSG.body
+ MSG.body = "\[REDACTED\]"
+ else
+ MSG.body = MSG.backup_body
+ src.updateUsrDialog()
- else if(href_list["view"])
- src.screen=1
- src.updateUsrDialog()
+ else if(href_list["pick_d_notice"])
+ var/datum/feed_channel/FC = locate(href_list["pick_d_notice"])
+ src.viewing_channel = FC
+ src.screen=13
+ src.updateUsrDialog()
- else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~
- src.screen = text2num(href_list["setScreen"])
- if (src.screen == 0)
- src.scanned_user = "Unknown";
- msg = "";
- src.c_locked=0;
- channel_name="";
- src.viewing_channel = null
- src.updateUsrDialog()
+ else if(href_list["toggle_d_notice"])
+ var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
+ if(FC.is_admin_channel)
+ alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
+ return
+ FC.censored = !FC.censored
+ src.updateUsrDialog()
- else if(href_list["show_channel"])
- var/datum/feed_channel/FC = locate(href_list["show_channel"])
- src.viewing_channel = FC
- src.screen = 9
- src.updateUsrDialog()
+ else if(href_list["view"])
+ src.screen=1
+ src.updateUsrDialog()
- else if(href_list["pick_censor_channel"])
- var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"])
- src.viewing_channel = FC
- src.screen = 12
- src.updateUsrDialog()
+ else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~
+ src.screen = text2num(href_list["setScreen"])
+ if (src.screen == 0)
+ src.scanned_user = "Unknown";
+ msg = "";
+ src.c_locked=0;
+ channel_name="";
+ src.viewing_channel = null
+ src.updateUsrDialog()
- else if(href_list["refresh"])
- src.updateUsrDialog()
+ else if(href_list["show_channel"])
+ var/datum/feed_channel/FC = locate(href_list["show_channel"])
+ src.viewing_channel = FC
+ src.screen = 9
+ src.updateUsrDialog()
+ else if(href_list["pick_censor_channel"])
+ var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"])
+ src.viewing_channel = FC
+ src.screen = 12
+ src.updateUsrDialog()
+
+ else if(href_list["refresh"])
+ src.updateUsrDialog()
/obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params)
if(istype(I, /obj/item/weapon/wrench))
@@ -746,10 +742,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
user << "This does nothing."
src.update_icon()
-/obj/machinery/newscaster/attack_ai(mob/user as mob)
- return src.attack_hand(user) //or maybe it'll have some special functions? No idea.
-
-
/obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob)
if(photo)
if(!issilicon(user))
@@ -794,11 +786,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
var/scribble=""
var/scribble_page = null
-/*obj/item/weapon/newspaper/attack_hand(mob/user as mob)
- ..()
- world << "derp"*/
-
-obj/item/weapon/newspaper/attack_self(mob/user as mob)
+/obj/item/weapon/newspaper/attack_self(mob/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/dat
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 15f0b7e8aa9..33bbb110766 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -44,7 +44,7 @@
return 1
return
-/obj/item/mecha_parts/mecha_equipment/proc/destroy()//missiles detonating, teleporter creating singularity?
+/obj/item/mecha_parts/mecha_equipment/Destroy()//missiles detonating, teleporter creating singularity?
if(chassis)
chassis.equipment -= src
listclearnulls(chassis.equipment)
@@ -57,9 +57,8 @@
chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50)
else
chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50)
- spawn
- qdel(src)
- return
+ chassis = null
+ return ..()
/obj/item/mecha_parts/mecha_equipment/proc/critfail()
if(chassis)
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 685a65ad15e..bc7100347c5 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -29,7 +29,7 @@
allow_drop()
return 0
- destroy()
+ Destroy()
for(var/atom/movable/AM in src)
AM.forceMove(get_turf(src))
return ..()
@@ -263,7 +263,7 @@
chassis.events.clearEvent("onMove",event)
return ..()
- destroy()
+ Destroy()
chassis.events.clearEvent("onMove",event)
return ..()
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 9882151bb21..d9a7b7a2044 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -665,10 +665,9 @@
M.overlays += droid_overlay
return
- destroy()
+ Destroy()
chassis.overlays -= droid_overlay
- ..()
- return
+ return ..()
detach()
chassis.overlays -= droid_overlay
@@ -941,7 +940,7 @@
GM.toxins += 100
GM.temperature = 1500+T0C //should be enough to start a fire
T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.")
- destroy()
+ qdel(src)
else
GM.toxins += 5
GM.temperature = istype(T) ? T.air.temperature : T20C
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 70653c05826..1d581405393 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -309,6 +309,9 @@
/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran
return round(initial(D.construction_time)*time_coeff*time_coeff_tech, roundto)
+/obj/machinery/mecha_part_fabricator/attack_ghost(mob/user)
+ interact(user)
+
/obj/machinery/mecha_part_fabricator/attack_hand(mob/user)
if(!(..()))
return interact(user)
@@ -374,7 +377,7 @@
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
if(..())
- return
+ return 1
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
if(href_list["part_set"])
var/tpart_set = filter.getStr("part_set")
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 249e5fa93d8..7a9894ef151 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -363,7 +363,7 @@
if(src.throwing)//high velocity mechas in your face!
var/breakthrough = 0
if(istype(obstacle, /obj/structure/window/))
- obstacle.Destroy(brokenup = 1)
+ qdel(obstacle)
breakthrough = 1
else if(istype(obstacle, /obj/structure/grille/))
@@ -377,7 +377,7 @@
else if(istype(obstacle, /obj/structure/table))
var/obj/structure/table/T = obstacle
- T.destroy()
+ qdel(T)
breakthrough = 1
else if(istype(obstacle, /obj/structure/rack))
@@ -450,7 +450,7 @@
if(ignore_threshold || src.health*100/initial(src.health) 0)
src.spark_system.start()
else
- src.destroy()
+ qdel(src)
return
/obj/mecha/attack_hand(mob/living/user as mob)
@@ -609,7 +609,7 @@
Proj.on_hit(src)
return
-/obj/mecha/proc/destroy()
+/obj/mecha/Destroy()
go_out()
for(var/mob/M in src) //Let's just be ultra sure
if(isAI(M))
@@ -624,7 +624,7 @@
var/obj/mecha/working/ripley/R = src
if(R.cargo)
for(var/obj/O in R.cargo) //Dump contents of stored cargo
- O.loc = loc
+ O.forceMove(loc)
R.cargo -= O
loc.Entered(O)
@@ -638,7 +638,7 @@
E.reliability = round(rand(E.reliability/3,E.reliability))
else
E.forceMove(loc)
- E.destroy()
+ qdel(E)
if(cell)
WR.crowbar_salvage += cell
cell.forceMove(WR)
@@ -649,7 +649,7 @@
else
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
E.forceMove(loc)
- E.destroy()
+ qdel(E)
if(cell)
qdel(cell)
if(internal_tank)
@@ -677,16 +677,16 @@
src.log_append_to_last("Armor saved, changing severity to [severity].")
switch(severity)
if(1.0)
- src.destroy()
+ qdel(src)
if(2.0)
if (prob(30))
- src.destroy()
+ qdel(src)
else
src.take_damage(initial(src.health)/2)
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
if(3.0)
if (prob(5))
- src.destroy()
+ qdel(src)
else
src.take_damage(initial(src.health)/5)
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 3cbcde23f4a..b6bb39bd32b 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -37,12 +37,16 @@
/obj/item/device/radio/intercom/attack_ai(mob/user as mob)
add_hiddenprint(user)
add_fingerprint(user)
- spawn (0)
+ spawn(0)
+ attack_self(user)
+
+/obj/item/device/radio/intercom/attack_ghost(mob/user as mob)
+ spawn(0)
attack_self(user)
/obj/item/device/radio/intercom/attack_hand(mob/user as mob)
add_fingerprint(user)
- spawn (0)
+ spawn(0)
attack_self(user)
/obj/item/device/radio/intercom/receive_range(freq, level)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 62498009f0b..cf26aeca7c0 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -122,14 +122,9 @@
listening = !listening && !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL))
/obj/item/device/radio/Topic(href, href_list)
- //..()
- if (usr.stat || !on)
- return
+ if(..())
+ return 1
- if (!(issilicon(usr) || (usr.contents.Find(src) || ( in_range(src, usr) && istype(loc, /turf) ))))
- usr << browse(null, "window=radio")
- return
- usr.set_machine(src)
if (href_list["track"])
var/mob/target = locate(href_list["track"])
var/mob/living/silicon/ai/A = locate(href_list["track2"])
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index b0d483137b7..048d85e5495 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -41,6 +41,7 @@
R.jetpackoverlay = 0
R.update_icons()
R.update_headlamp()
+ R.magpulse = 0
R.add_language("Robot Talk", 1)
return 1
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index d73281a46ed..dab7a54de78 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -55,8 +55,8 @@
..()
/obj/item/weapon/shard/Crossed(AM as mob|obj)
- if(ismob(AM))
- var/mob/M = AM
+ if(isliving(AM))
+ var/mob/living/M = AM
M << "\red You step on \the [src]!"
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index f9bbd9f0c69..0dd85c270ab 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -31,6 +31,7 @@
else
src.icon_state = src.icon_closed
user << "\red You unlock the [src.name]!"
+ origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
return
else
user << "\red Access Denied"
@@ -58,6 +59,7 @@
desc = "It appears to be broken."
icon_state = src.icon_broken
user << "You unlock \the [src]."
+ origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
return
/obj/item/weapon/storage/lockbox/loyalty
@@ -89,7 +91,7 @@
item_state = "syringe_kit"
w_class = 3
max_w_class = 2
- max_combined_w_class = 20
+ max_combined_w_class = 20
storage_slots = 12
req_access = list(access_captain)
icon_locked = "medalbox+l"
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index a7175857ef9..9d7bbc96e1b 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -55,5 +55,8 @@
/obj/structure/curtain/open/shower/security
color = "#AA0000"
+/obj/structure/curtain/open/shower/centcom
+ color = "#000066"
+
#undef SHOWER_OPEN_LAYER
#undef SHOWER_CLOSED_LAYER
\ No newline at end of file
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index b103179d58b..303f5bd041b 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -6,11 +6,10 @@
name = "station tube station"
icon = 'icons/obj/pipes/transit_tube_station.dmi'
icon_state = "closed"
- exit_delay = 2
- enter_delay = 3
+ exit_delay = 1
+ enter_delay = 2
var/pod_moving = 0
- var/automatic_launch_time = 100
- var/cooldown_delay = 200
+ var/cooldown_delay = 50
var/launch_cooldown = 0
var/reverse_launch = 0
diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm
index 707dbb015df..5a0b7df79a3 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube.dm
@@ -10,8 +10,8 @@
layer = 3.1
anchored = 1.0
var/list/tube_dirs = null
- var/exit_delay = 2
- var/enter_delay = 1
+ var/exit_delay = 1
+ var/enter_delay = 0
// alldirs in global.dm is the same list of directions, but since
// the specific order matters to get a usable icon_state, it is
@@ -20,6 +20,11 @@
var/global/list/tube_dir_list = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
+/obj/structure/transit_tube/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ return !density
+
// When destroyed by explosions, properly handle contents.
obj/structure/transit_tube/ex_act(severity)
switch(severity)
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index d14767891fe..1574e440a23 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -3,6 +3,8 @@
#define SUPPLY_STATIONZ 1 //Z-level of the Station.
#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
+#define COMP_SCREEN_WIDTH 600 //width of supply computer interaction window
+#define COMP_SCREEN_HEIGHT 555 //height of supply computer interaction window
var/datum/controller/supply/supply_controller = new()
@@ -104,22 +106,23 @@ var/list/mechtoys = list(
icon = 'icons/obj/computer.dmi'
icon_screen = "supply"
req_access = list(access_cargo)
- circuit = "/obj/item/weapon/circuitboard/supplycomp"
+ circuit = /obj/item/weapon/circuitboard/supplycomp
var/temp = null
var/reqtime = 0 //Cooldown for requisitions - Quarxink
var/hacked = 0
var/can_order_contraband = 0
var/last_viewed_group = "categories"
+ var/datum/supply_packs/content_pack
/obj/machinery/computer/ordercomp
name = "Supply Ordering Console"
desc = "Used to order supplies from cargo staff."
icon = 'icons/obj/computer.dmi'
icon_screen = "request"
- circuit = "/obj/item/weapon/circuitboard/ordercomp"
- var/temp = null
+ circuit = /obj/item/weapon/circuitboard/ordercomp
var/reqtime = 0 //Cooldown for requisitions - Quarxink
var/last_viewed_group = "categories"
+ var/datum/supply_packs/content_pack
/*
/obj/effect/marker/supplymarker
@@ -155,253 +158,259 @@ var/list/mechtoys = list(
var/movetime = 1200
var/datum/shuttle/ferry/supply/shuttle
- New()
- ordernum = rand(1,9000)
+/datum/controller/supply/New()
+ ordernum = rand(1,9000)
- //Supply shuttle ticker - handles supply point regeneration and shuttle travelling between centcomm and the station
- proc/process()
- for(var/typepath in subtypesof(/datum/supply_packs))
- var/datum/supply_packs/P = new typepath()
- if(P.name == "HEADER")
- qdel(P)
- continue
- supply_packs[P.name] = P
+//Supply shuttle ticker - handles supply point regeneration and shuttle travelling between centcomm and the station
+/datum/controller/supply/proc/process()
+ for(var/typepath in subtypesof(/datum/supply_packs))
+ var/datum/supply_packs/P = new typepath()
+ if(P.name == "HEADER")
+ qdel(P)
+ continue
+ supply_packs[P.name] = P
- spawn(0)
- if(processing)
- iteration++
- points += points_per_process
+ spawn(0)
+ if(processing)
+ iteration++
+ points += points_per_process
- //sleep(processing_interval)
+ //sleep(processing_interval)
- //To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
- proc/forbidden_atoms_check(atom/A)
- if(istype(A,/mob/living))
- return 1
- if(istype(A,/obj/item/weapon/disk/nuclear))
- return 1
- if(istype(A,/obj/item/flag/nation))
- return 1
- if(istype(A,/obj/machinery/nuclearbomb))
- return 1
- if(istype(A,/obj/item/device/radio/beacon))
- return 1
+//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
+/datum/controller/supply/proc/forbidden_atoms_check(atom/A)
+ if(istype(A,/mob/living))
+ return 1
+ if(istype(A,/obj/item/weapon/disk/nuclear))
+ return 1
+ if(istype(A,/obj/item/flag/nation))
+ return 1
+ if(istype(A,/obj/machinery/nuclearbomb))
+ return 1
+ if(istype(A,/obj/item/device/radio/beacon))
+ return 1
- for(var/i=1, i<=A.contents.len, i++)
- var/atom/B = A.contents[i]
- if(.(B))
- return 1
+ for(var/i=1, i<=A.contents.len, i++)
+ var/atom/B = A.contents[i]
+ if(.(B))
+ return 1
//Sellin
- proc/sell()
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
+/datum/controller/supply/proc/sell()
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
- var/plasma_count = 0
+ var/plasma_count = 0
- for(var/atom/movable/MA in area_shuttle)
- if(MA.anchored) continue
+ for(var/atom/movable/MA in area_shuttle)
+ if(MA.anchored) continue
- // Must be in a crate!
- if(istype(MA,/obj/structure/closet/crate))
- callHook("sell_crate", list(MA, area_shuttle)) // check this
+ // Must be in a crate!
+ if(istype(MA,/obj/structure/closet/crate))
+ callHook("sell_crate", list(MA, area_shuttle)) // check this
- points += points_per_crate
- var/find_slip = 1
+ points += points_per_crate
+ var/find_slip = 1
- for(var/atom in MA)
- // Sell manifests
- var/atom/A = atom
- if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
- var/obj/item/weapon/paper/slip = A
- if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
- points += points_per_slip
- find_slip = 0
+ for(var/atom in MA)
+ // Sell manifests
+ var/atom/A = atom
+ if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
+ var/obj/item/weapon/paper/slip = A
+ if(slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
+ points += points_per_slip
+ find_slip = 0
- // Sell plasma
- else if(istype(A, /obj/item/stack/sheet/mineral/plasma))
- var/obj/item/stack/sheet/mineral/plasma/P = A
- plasma_count += P.amount
+ // Sell plasma
+ else if(istype(A, /obj/item/stack/sheet/mineral/plasma))
+ var/obj/item/stack/sheet/mineral/plasma/P = A
+ plasma_count += P.amount
- // If you send something in a crate, centcom's keeping it! - fixes secure crates being sent to centom to open them
- qdel(A)
- qdel(MA)
+ // If you send something in a crate, centcom's keeping it! - fixes secure crates being sent to centom to open them
+ qdel(A)
+ qdel(MA)
- if(plasma_count)
- points += plasma_count * points_per_plasma
+ if(plasma_count)
+ points += plasma_count * points_per_plasma
- //Buyin
- proc/buy()
- if(!shoppinglist.len) return
+//Buyin
+/datum/controller/supply/proc/buy()
+ if(!shoppinglist.len) return
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
- var/list/clear_turfs = list()
+ var/list/clear_turfs = list()
- for(var/turf/T in area_shuttle)
- if(T.density) continue
- var/contcount
- for(var/atom/A in T.contents)
- if(istype(A,/atom/movable/lighting_overlay))
- continue
- if(istype(A,/obj/machinery/light))
- continue
- contcount++
- if(contcount) continue
- clear_turfs += T
+ for(var/turf/T in area_shuttle)
+ if(T.density) continue
+ var/contcount
+ for(var/atom/A in T.contents)
+ if(istype(A,/atom/movable/lighting_overlay))
+ continue
+ if(!A.simulated)
+ continue
+ contcount++
+ if(contcount) continue
+ clear_turfs += T
- for(var/S in shoppinglist)
- if(!clear_turfs.len) break
- var/i = rand(1,clear_turfs.len)
- var/turf/pickedloc = clear_turfs[i]
- clear_turfs.Cut(i,i+1)
+ for(var/S in shoppinglist)
+ if(!clear_turfs.len) break
+ var/i = rand(1,clear_turfs.len)
+ var/turf/pickedloc = clear_turfs[i]
+ clear_turfs.Cut(i,i+1)
- var/datum/supply_order/SO = S
- var/datum/supply_packs/SP = SO.object
+ var/datum/supply_order/SO = S
+ var/datum/supply_packs/SP = SO.object
- var/atom/A = new SP.containertype(pickedloc)
- A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
+ var/atom/A = new SP.containertype(pickedloc)
+ A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]"
- //supply manifest generation begin
+ //supply manifest generation begin
- var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A)
- slip.info = "[command_name()] Shipping Manifest
"
- slip.info +="Order #[SO.ordernum]
"
- slip.info +="Destination: [station_name]
"
- slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
- slip.info +="CONTENTS:
"
+ var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A)
+ slip.info = "[command_name()] Shipping Manifest
"
+ slip.info +="Order #[SO.ordernum]
"
+ slip.info +="Destination: [station_name]
"
+ slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
+ slip.info +="CONTENTS:
"
- //spawn the stuff, finish generating the manifest while you're at it
- if(SP.access)
- A:req_access = list()
- A:req_access += text2num(SP.access)
+ //spawn the stuff, finish generating the manifest while you're at it
+ if(SP.access)
+ A:req_access = list()
+ A:req_access += text2num(SP.access)
- var/list/contains
- if(istype(SP,/datum/supply_packs/misc/randomised))
- var/datum/supply_packs/misc/randomised/SPR = SP
- contains = list()
- if(SPR.contains.len)
- for(var/j=1,j<=SPR.num_contained,j++)
- contains += pick(SPR.contains)
- else
- contains = SP.contains
+ var/list/contains
+ if(istype(SP,/datum/supply_packs/misc/randomised))
+ var/datum/supply_packs/misc/randomised/SPR = SP
+ contains = list()
+ if(SPR.contains.len)
+ for(var/j=1,j<=SPR.num_contained,j++)
+ contains += pick(SPR.contains)
+ else
+ contains = SP.contains
- for(var/typepath in contains)
- if(!typepath) continue
- var/atom/B2 = new typepath(A)
- if(SP.amount && B2:amount) B2:amount = SP.amount
- slip.info += "- [B2.name]
" //add the item to the manifest
+ for(var/typepath in contains)
+ if(!typepath) continue
+ var/atom/B2 = new typepath(A)
+ if(SP.amount && B2:amount) B2:amount = SP.amount
+ slip.info += "- [B2.name]
" //add the item to the manifest
- //manifest finalisation
- slip.info += "
"
- slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
- if(!SP.contraband)
- if(istype(A, /obj/structure/closet/crate))
- var/obj/structure/closet/crate/CR = A
- CR.manifest = slip
- CR.update_icon()
- if(istype(A, /obj/structure/largecrate))
- var/obj/structure/largecrate/LC = A
- LC.manifest = slip
- LC.update_icon()
- else slip.loc = null //we are out of blanks for Form #44-D Ordering Illicit Drugs.
- shoppinglist.Cut()
- return
+ //manifest finalisation
+ slip.info += "
"
+ slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
+ if(!SP.contraband)
+ if(istype(A, /obj/structure/closet/crate))
+ var/obj/structure/closet/crate/CR = A
+ CR.manifest = slip
+ CR.update_icon()
+ if(istype(A, /obj/structure/largecrate))
+ var/obj/structure/largecrate/LC = A
+ LC.manifest = slip
+ LC.update_icon()
+ else slip.loc = null //we are out of blanks for Form #44-D Ordering Illicit Drugs.
+ shoppinglist.Cut()
+ return
/obj/item/weapon/paper/manifest
name = "Supply Manifest"
-
/obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob)
return attack_hand(user)
-
-/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob)
- return attack_hand(user)
-
-
/obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob)
- if(..())
- return
- user.set_machine(src)
- var/dat
- if(temp)
- dat = temp
- else
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- if (shuttle)
- dat += {"
Supply shuttle
- Location: [shuttle.has_arrive_time() ? "Moving to station ([shuttle.eta_minutes()] Mins.)":shuttle.at_station() ? "Docked":"Away"]
-
Supply points: [supply_controller.points]
-
\nRequest items
- View approved orders
- View requests
- Close"}
-
- user << browse(dat, "window=computer;size=575x450")
- onclose(user, "computer")
+ ui_interact(usr)
return
+/obj/machinery/computer/ordercomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
+ // data to send to ui
+ var/data[0]
+ data["last_viewed_group"] = last_viewed_group
+
+ var/category_list[0]
+ for(var/category in all_supply_groups)
+ category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category)))
+ data["categories"] = category_list
+
+ var/cat = text2num(last_viewed_group)
+ var/packs_list[0]
+ for(var/set_name in supply_controller.supply_packs)
+ var/datum/supply_packs/pack = supply_controller.supply_packs[set_name]
+ if(!pack.contraband && !pack.hidden && pack.group == cat)
+ // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
+ packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
+
+ data["supply_packs"] = packs_list
+ if(content_pack)
+ var/pack_name = sanitize(content_pack.name)
+ data["contents_name"] = pack_name
+ data["contents"] = content_pack.manifest
+ data["contents_access"] = get_access_desc(content_pack.access)
+
+ var/requests_list[0]
+ for(var/set_name in supply_controller.requestlist)
+ var/datum/supply_order/SO = set_name
+ if(SO)
+ // Check if the usr owns the request, so they can cancel requests
+ var/obj/item/weapon/card/id/I = usr.get_id_card()
+ var/owned = 0
+ if(I && SO.orderedby == I.registered_name)
+ owned = 1
+ requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "owned" = owned, "command1" = list("rreq" = SO.ordernum))))
+ data["requests"] = requests_list
+
+ var/orders_list[0]
+ for(var/set_name in supply_controller.shoppinglist)
+ var/datum/supply_order/SO = set_name
+ if(SO)
+ orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby)))
+ data["orders"] = orders_list
+
+ data["points"] = supply_controller.points
+ data["send"] = list("send" = 1)
+
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
+ data["moving"] = shuttle.has_arrive_time()
+ data["at_station"] = shuttle.at_station()
+ data["timeleft"] = shuttle.eta_minutes()
+ if(shuttle.docking_controller)
+ data["docked"] = capitalize(shuttle.docking_controller.get_docking_status())
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
+ if(!ui)
+ ui = new(user, src, ui_key, "order_console.tmpl", name, COMP_SCREEN_WIDTH, COMP_SCREEN_HEIGHT)
+ ui.set_initial_data(data)
+ ui.open()
+
/obj/machinery/computer/ordercomp/Topic(href, href_list)
if(..())
- return
+ return 1
- if( isturf(loc) && (in_range(src, usr) || istype(usr, /mob/living/silicon)) )
- usr.set_machine(src)
-
- if(href_list["order"])
- if(href_list["order"] == "categories")
- //all_supply_groups
- //Request what?
- last_viewed_group = "categories"
- temp = "Supply points: [supply_controller.points]
"
- temp += "Main Menu
"
- temp += "Select a category
"
- for(var/cat in all_supply_groups )
- temp += "[get_supply_group_name(cat)]
"
- else
- last_viewed_group = href_list["order"]
- var/cat = text2num(last_viewed_group)
- temp = "Supply points: [supply_controller.points]
"
- temp += "Back to all categories
"
- temp += "Request from: [get_supply_group_name(cat)]
"
- for(var/supply_type in supply_controller.supply_packs )
- var/datum/supply_packs/N = supply_controller.supply_packs[supply_type]
- if(N.hidden || N.contraband || N.group != cat) continue
- temp += "[N.name]" //Have to send the type instead of a reference to the obj because it would get caught by the garbage
- temp += " (contents)"
- temp += " Cost: [N.cost]
"
-
- else if (href_list["see_contents"])
- //Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_controller.supply_packs[href_list["see_contents"]]
- if(!istype(P)) return
-
- var/cat = P.group
- var/tempaccess = get_access_desc(P.access)
-
- temp = "Supply points: [supply_controller.points]
"
- temp += "Back to [get_supply_group_name(cat)]
"
- temp += "Access restriction: [tempaccess ? tempaccess : "None"]
"
- temp += "Contents of [P.name]:
"
- temp += P.manifest
-
- else if (href_list["doorder"])
+ if (href_list["doorder"])
if(world.time < reqtime)
- for(var/mob/V in hearers(src))
- V.show_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
+ visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
+ nanomanager.update_uis(src)
return
-
- //Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]]
- if(!istype(P)) return
+
+ var/index = copytext(href_list["doorder"], 1, lentext(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1))
+ var/multi = text2num(copytext(href_list["doorder"], -1))
+ if(!isnum(multi))
+ return
+ var/datum/supply_packs/P = supply_controller.supply_packs[index]
+ if(!istype(P))
+ return
+ var/crates = 1
+ if(multi)
+ var/num_input = input(usr, "Amount:", "How many crates?", "") as num
+ crates = Clamp(round(text2num(num_input)), 1, 20)
+ if(..())
+ return
var/timeout = world.time + 600
var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN))
- if(world.time > timeout) return
- if(!reason) return
-
+ if(world.time > timeout || !reason || ..())
+ return
+
var/idname = "*None Provided*"
var/idrank = "*None Provided*"
if(ishuman(usr))
@@ -413,13 +422,14 @@ var/list/mechtoys = list(
supply_controller.ordernum++
var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
- reqform.name = "Requisition Form - [P.name]"
+ reqform.name = "Requisition Form - [crates] '[P.name]' for [idname]"
reqform.info += "[station_name] Supply Requisition Form
"
reqform.info += "INDEX: #[supply_controller.ordernum]
"
reqform.info += "REQUESTED BY: [idname]
"
reqform.info += "RANK: [idrank]
"
reqform.info += "REASON: [reason]
"
reqform.info += "SUPPLY CRATE TYPE: [P.name]
"
+ reqform.info += "NUMBER OF CRATES: [crates]
"
reqform.info += "ACCESS RESTRICTION: [replacetext(get_access_desc(P.access))]
"
reqform.info += "CONTENTS:
"
reqform.info += P.manifest
@@ -429,130 +439,153 @@ var/list/mechtoys = list(
reqform.update_icon() //Fix for appearing blank when printed.
reqtime = (world.time + 5) % 1e5
- //make our supply_order datum
- var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = supply_controller.ordernum
- O.object = P
- O.orderedby = idname
- supply_controller.requestlist += O
+ //make our supply_order datums
+ for(var/i = 1; i <= crates; i++)
+ supply_controller.ordernum++
+ var/datum/supply_order/O = new /datum/supply_order()
+ O.ordernum = supply_controller.ordernum
+ O.object = P
+ O.orderedby = idname
+ O.comment = reason
+ supply_controller.requestlist += O
- temp = "Thanks for your request. The cargo team will process it as soon as possible.
"
- temp += "
Back Main Menu"
+ else if (href_list["rreq"])
+ var/ordernum = text2num(href_list["rreq"])
+ var/obj/item/weapon/card/id/I = usr.get_id_card()
+ for(var/i=1, i<=supply_controller.requestlist.len, i++)
+ var/datum/supply_order/SO = supply_controller.requestlist[i]
+ if(SO.ordernum == ordernum && (I && SO.orderedby == I.registered_name))
+ supply_controller.requestlist.Cut(i,i+1)
+ break
- else if (href_list["vieworders"])
- temp = "Current approved orders:
"
- for(var/S in supply_controller.shoppinglist)
- var/datum/supply_order/SO = S
- temp += "[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
"
- temp += "
OK"
-
- else if (href_list["viewrequests"])
- temp = "Current requests:
"
- for(var/S in supply_controller.requestlist)
- var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby]
"
- temp += "
OK"
-
- else if (href_list["mainmenu"])
- temp = null
+ else if (href_list["last_viewed_group"])
+ content_pack = null
+ last_viewed_group = text2num(href_list["last_viewed_group"])
+
+ else if (href_list["contents"])
+ var/topic = href_list["contents"]
+ if(topic == 1)
+ content_pack = null
+ else
+ var/datum/supply_packs/P = supply_controller.supply_packs[topic]
+ content_pack = P
add_fingerprint(usr)
- updateUsrDialog()
+ nanomanager.update_uis(src)
return
+/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob)
+ return attack_hand(user)
+
/obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob)
if(!allowed(user) && !isobserver(user))
- user << "\red Access Denied."
+ user << "Access denied."
return
- if(..())
- return
- user.set_machine(src)
post_signal("supply")
- var/dat
- if (temp)
- dat = temp
- else
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- if (shuttle)
- dat += "
Supply shuttle
"
- dat += "\nLocation: "
- if (shuttle.has_arrive_time())
- dat += "In transit ([shuttle.eta_minutes()] Mins.)
"
- else
- if (shuttle.at_station())
- if (shuttle.docking_controller)
- switch(shuttle.docking_controller.get_docking_status())
- if ("docked") dat += "Docked at station
"
- if ("undocked") dat += "Undocked from station
"
- if ("docking") dat += "Docking with station [shuttle.can_force()? "Force Launch" : ""]
"
- if ("undocking") dat += "Undocking from station [shuttle.can_force()? "Force Launch" : ""]
"
- else
- dat += "Station
"
-
- if (shuttle.can_launch())
- dat += "Send away"
- else if (shuttle.can_cancel())
- dat += "Cancel launch"
- else
- dat += "*Shuttle is busy*"
- dat += "
\n
"
- else
- dat += "Away
"
- if (shuttle.can_launch())
- dat += "Request supply shuttle"
- else if (shuttle.can_cancel())
- dat += "Cancel request"
- else
- dat += "*Shuttle is busy*"
- dat += "
\n
"
-
-
- dat += {"
\nSupply points: [supply_controller.points]
\n
- \nOrder items
\n
- \nView requests
\n
- \nView orders
\n
- \nClose"}
-
-
- user << browse(dat, "window=computer;size=575x450")
- onclose(user, "computer")
+ ui_interact(user)
return
-/obj/machinery/computer/supplycomp/attackby(I as obj, user as mob, params)
- if(istype(I,/obj/item/weapon/card/emag) && !hacked)
- user << "\blue Special supplies unlocked."
+/obj/machinery/computer/supplycomp/emag_act(user as mob)
+ if(!hacked)
+ user << "Special supplies unlocked."
hacked = 1
return
- else
- ..()
- return
+
+/obj/machinery/computer/supplycomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
+ // data to send to ui
+ var/data[0]
+ data["last_viewed_group"] = last_viewed_group
+
+ var/category_list[0]
+ for(var/category in all_supply_groups)
+ category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category)))
+ data["categories"] = category_list
+
+ var/cat = text2num(last_viewed_group)
+ var/packs_list[0]
+ for(var/set_name in supply_controller.supply_packs)
+ var/datum/supply_packs/pack = supply_controller.supply_packs[set_name]
+ if((pack.hidden && src.hacked) || (pack.contraband && src.can_order_contraband) || (!pack.contraband && !pack.hidden))
+ if(pack.group == cat)
+ // 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
+ packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
+
+ data["supply_packs"] = packs_list
+ if(content_pack)
+ var/pack_name = sanitize(content_pack.name)
+ data["contents_name"] = pack_name
+ data["contents"] = content_pack.manifest
+ data["contents_access"] = get_access_desc(content_pack.access)
+
+ var/requests_list[0]
+ for(var/set_name in supply_controller.requestlist)
+ var/datum/supply_order/SO = set_name
+ if(SO)
+ if(!SO.comment)
+ SO.comment = "No comment."
+ requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment, "command1" = list("confirmorder" = SO.ordernum), "command2" = list("rreq" = SO.ordernum))))
+ data["requests"] = requests_list
+
+ var/orders_list[0]
+ for(var/set_name in supply_controller.shoppinglist)
+ var/datum/supply_order/SO = set_name
+ if(SO)
+ orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment)))
+ data["orders"] = orders_list
+
+ data["points"] = supply_controller.points
+ data["send"] = list("send" = 1)
+
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
+ data["moving"] = shuttle.has_arrive_time()
+ data["at_station"] = shuttle.at_station()
+ data["timeleft"] = shuttle.eta_minutes()
+ data["can_launch"] = shuttle.can_launch()
+ data["can_force"] = shuttle.can_force()
+ data["can_cancel"] = shuttle.can_cancel()
+ if(shuttle.docking_controller)
+ data["docked"] = capitalize(shuttle.docking_controller.get_docking_status())
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
+ if(!ui)
+ ui = new(user, src, ui_key, "supply_console.tmpl", name, COMP_SCREEN_WIDTH, COMP_SCREEN_HEIGHT)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/computer/supplycomp/proc/is_authorized(user)
+ if(allowed(user))
+ return 1
+
+ if(isobserver(user) && check_rights(R_ADMIN, 0))
+ return 1
+
+ return 0
/obj/machinery/computer/supplycomp/Topic(href, href_list)
- if(!supply_controller)
- log_to_dd("## ERROR: Eek. The supply_controller controller datum is missing somehow.")
- return
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- if (!shuttle)
- log_to_dd("## ERROR: Eek. The supply/shuttle datum is missing somehow.")
- return
if(..())
- return
-
- if(isturf(loc) && ( in_range(src, usr) || istype(usr, /mob/living/silicon) ) )
- usr.set_machine(src)
-
- //Calling the shuttle
+ return 1
+
+ if(!is_authorized(usr))
+ return 1
+
+ if(!supply_controller)
+ log_to_dd("## ERROR: The supply_controller controller datum is missing somehow.")
+ return 1
+
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
+ if(!shuttle)
+ log_to_dd("## ERROR: The supply or shuttle datum is missing somehow.")
+ return 1
+
if(href_list["send"])
if(shuttle.at_station())
if (shuttle.forbidden_atoms_check())
- temp = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.
OK"
+ usr = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons."
else
shuttle.launch(src)
- temp = "Initiating launch sequence. \[Force Launch\]
OK"
else
shuttle.launch(src)
- temp = "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.
OK"
post_signal("supply")
if (href_list["force_send"])
@@ -561,70 +594,34 @@ var/list/mechtoys = list(
if (href_list["cancel_send"])
shuttle.cancel_launch(src)
- else if (href_list["order"])
- //if(!shuttle.idle()) return //this shouldn't be necessary it seems
- if(href_list["order"] == "categories")
- //all_supply_groups
- //Request what?
- last_viewed_group = "categories"
- temp = "Supply points: [supply_controller.points]
"
- temp += "Main Menu
"
- temp += "Select a category
"
- for(var/cat in all_supply_groups )
- temp += "[get_supply_group_name(cat)]
"
- else
- last_viewed_group = href_list["order"]
- var/cat = text2num(last_viewed_group)
- temp = "Supply points: [supply_controller.points]
"
- temp += "Back to all categories
"
- temp += "Request from: [get_supply_group_name(cat)]
"
- for(var/supply_type in supply_controller.supply_packs )
- var/datum/supply_packs/N = supply_controller.supply_packs[supply_type]
- if((N.hidden && !hacked) || (N.contraband && !can_order_contraband) || N.group != cat) continue
- temp += "[N.name]" //Have to send the type instead of a reference to the obj because it would get caught by the garbage
- temp += " (contents)"
- temp += " Cost: [N.cost]
"
-
- /*temp = "Supply points: [supply_controller.points]
Request what?
"
-
- for(var/supply_name in supply_controller.supply_packs )
- var/datum/supply_packs/N = supply_controller.supply_packs[supply_name]
- if(N.hidden && !hacked) continue
- if(N.contraband && !can_order_contraband) continue
- temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage
- temp += "
OK"*/
-
- else if (href_list["see_contents"])
- //Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_controller.supply_packs[href_list["see_contents"]]
- if(!istype(P)) return
-
- var/cat = P.group
- var/tempaccess = get_access_desc(P.access)
-
- temp = "Supply points: [supply_controller.points]
"
- temp += "Back to [get_supply_group_name(cat)]
"
- temp += "Access restriction: [tempaccess ? tempaccess : "None"]
"
- temp += "Contents of [P.name]:
"
- temp += P.manifest
-
else if (href_list["doorder"])
if(world.time < reqtime)
- for(var/mob/V in hearers(src))
- V.show_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
+ visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
+ nanomanager.update_uis(src)
return
- //Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]]
- if(!istype(P)) return
-
+ var/index = copytext(href_list["doorder"], 1, lentext(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1))
+ var/multi = text2num(copytext(href_list["doorder"], -1))
+ if(!isnum(multi))
+ return
+ var/datum/supply_packs/P = supply_controller.supply_packs[index]
+ if(!istype(P))
+ return
+ var/crates = 1
+ if(multi)
+ var/num_input = input(usr, "Amount:", "How many crates?", "") as num
+ crates = Clamp(round(text2num(num_input)), 1, 20)
+ if(..())
+ return
+
var/timeout = world.time + 600
var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN))
- if(world.time > timeout) return
- if(!reason) return
-
+ if(world.time > timeout || !reason || ..())
+ return
+
var/idname = "*None Provided*"
var/idrank = "*None Provided*"
+
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
idname = H.get_authentification_name()
@@ -634,13 +631,14 @@ var/list/mechtoys = list(
supply_controller.ordernum++
var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
- reqform.name = "Requisition Form - [P.name]"
+ reqform.name = "Requisition Form - [crates] '[P.name]' for [idname]"
reqform.info += "[station_name] Supply Requisition Form
"
reqform.info += "INDEX: #[supply_controller.ordernum]
"
reqform.info += "REQUESTED BY: [idname]
"
reqform.info += "RANK: [idrank]
"
reqform.info += "REASON: [reason]
"
reqform.info += "SUPPLY CRATE TYPE: [P.name]
"
+ reqform.info += "NUMBER OF CRATES: [crates]
"
reqform.info += "ACCESS RESTRICTION: [replacetext(get_access_desc(P.access))]
"
reqform.info += "CONTENTS:
"
reqform.info += P.manifest
@@ -651,21 +649,20 @@ var/list/mechtoys = list(
reqtime = (world.time + 5) % 1e5
//make our supply_order datum
- var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = supply_controller.ordernum
- O.object = P
- O.orderedby = idname
- supply_controller.requestlist += O
-
- temp = "Order request placed.
"
- temp += "
Back | Main Menu | Authorize Order"
-
+ for(var/i = 1; i <= crates; i++)
+ supply_controller.ordernum++
+ var/datum/supply_order/O = new /datum/supply_order()
+ O.ordernum = supply_controller.ordernum
+ O.object = P
+ O.orderedby = idname
+ O.comment = reason
+ supply_controller.requestlist += O
+
else if(href_list["confirmorder"])
//Find the correct supply_order datum
var/ordernum = text2num(href_list["confirmorder"])
var/datum/supply_order/O
var/datum/supply_packs/P
- temp = "Invalid Request"
for(var/i=1, i<=supply_controller.requestlist.len, i++)
var/datum/supply_order/SO = supply_controller.requestlist[i]
if(SO.ordernum == ordernum)
@@ -675,64 +672,34 @@ var/list/mechtoys = list(
supply_controller.requestlist.Cut(i,i+1)
supply_controller.points -= P.cost
supply_controller.shoppinglist += O
- temp = "Thanks for your order.
"
else
- temp = "Not enough supply points.
"
+ usr << "There are insufficient supply points for this request."
break
- temp += "
Back Main Menu"
-
- else if (href_list["vieworders"])
- temp = "Current approved orders:
"
- for(var/S in supply_controller.shoppinglist)
- var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""]
"// (Cancel)
"
- temp += "
OK"
-/*
- else if (href_list["cancelorder"])
- var/datum/supply_order/remove_supply = href_list["cancelorder"]
- supply_shuttle_shoppinglist -= remove_supply
- supply_shuttle_points += remove_supply.object.cost
- temp += "Canceled: [remove_supply.object.name]
"
-
- for(var/S in supply_shuttle_shoppinglist)
- var/datum/supply_order/SO = S
- temp += "[SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""] (Cancel)
"
- temp += "
OK"
-*/
- else if (href_list["viewrequests"])
- temp = "Current requests:
"
- for(var/S in supply_controller.requestlist)
- var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] Approve Remove
"
-
- temp += "
Clear list"
- temp += "
OK"
-
+
else if (href_list["rreq"])
var/ordernum = text2num(href_list["rreq"])
- temp = "Invalid Request.
"
for(var/i=1, i<=supply_controller.requestlist.len, i++)
var/datum/supply_order/SO = supply_controller.requestlist[i]
if(SO.ordernum == ordernum)
supply_controller.requestlist.Cut(i,i+1)
- temp = "Request removed.
"
break
- temp += "
Back Main Menu"
- else if (href_list["clearreq"])
- supply_controller.requestlist.Cut()
- temp = "List cleared.
"
- temp += "
OK"
-
- else if (href_list["mainmenu"])
- temp = null
+ else if (href_list["last_viewed_group"])
+ content_pack = null
+ last_viewed_group = text2num(href_list["last_viewed_group"])
+
+ else if (href_list["contents"])
+ var/topic = href_list["contents"]
+ if(topic == 1)
+ content_pack = null
+ else
+ var/datum/supply_packs/P = supply_controller.supply_packs[topic]
+ content_pack = P
add_fingerprint(usr)
- updateUsrDialog()
- return
+ nanomanager.update_uis(src)
/obj/machinery/computer/supplycomp/proc/post_signal(var/command)
-
var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
if(!frequency) return
@@ -743,7 +710,3 @@ var/list/mechtoys = list(
status_signal.data["command"] = command
frequency.post_signal(src, status_signal)
-
-
-
-
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index afbb84847f5..2d62be62449 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -40,7 +40,7 @@ var/global/normal_ooc_colour = "#002eb8"
var/display_colour = normal_ooc_colour
if(holder && !holder.fakekey)
display_colour = "#0099cc" //light blue
- if(holder.rights & R_MOD && !(holder.rights & R_ADMIN))
+ if(check_rights(R_MOD,0) && !check_rights(R_ADMIN,0))
display_colour = "#184880" //dark blue
else if(holder.rights & R_ADMIN)
if(config.allow_admin_ooccolor)
@@ -59,22 +59,6 @@ var/global/normal_ooc_colour = "#002eb8"
display_name = holder.fakekey
C << "OOC: [display_name]: [msg]"
- /*
- if(holder)
- if(!holder.fakekey || C.holder)
- if(holder.rights & R_ADMIN)
- C << "OOC: [key][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]"
- else if(holder.rights & R_MOD)
- C << "OOC: [src.key][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]"
- else
- C << "OOC: [src.key]: [msg]"
-
- else
- C << "OOC: [holder.fakekey ? holder.fakekey : src.key]: [msg]"
- else
- C << "OOC: [src.key]: [msg]"
- */
-
/proc/toggle_ooc()
ooc_allowed = !( ooc_allowed )
if (ooc_allowed)
@@ -92,7 +76,6 @@ var/global/normal_ooc_colour = "#002eb8"
set category = "Server"
normal_ooc_colour = newColor
-
/client/verb/looc(msg as text)
set name = "LOOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
set desc = "Local OOC, seen only by those in view."
@@ -110,7 +93,7 @@ var/global/normal_ooc_colour = "#002eb8"
src << "\red You have LOOC muted."
return
- if(!(holder && holder.rights && (holder.rights & R_MOD)))
+ if(!check_rights(R_MOD,0))
if(!ooc_allowed)
src << "\red LOOC is globally muted"
return
@@ -141,7 +124,7 @@ var/global/normal_ooc_colour = "#002eb8"
if(!M.client)
continue
var/client/C = M.client
- if(check_rights(R_MENTOR,0))
+ if(check_rights(R_MOD,0))
continue //they are handled after that
if(C.prefs.toggles & CHAT_LOOC)
@@ -159,7 +142,7 @@ var/global/normal_ooc_colour = "#002eb8"
display_name = "[S.name]/([S.key])"
for(var/client/C in admins)
- if(check_rights(R_MENTOR,0))
+ if(check_rights(R_MOD,0))
if(C.prefs.toggles & CHAT_LOOC)
var/prefix = "(R)LOOC"
if (C.mob in heard)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 488eb2c50c5..b41dece52d7 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -846,10 +846,13 @@ var/list/admin_verbs_mentor = list(
set category = "Admin"
set name = "Man Up Global"
set desc = "Tells everyone to man up and deal with it."
+
+ var/confirm = alert("Are you sure you want to send the global message?", "Confirm Man Up Global", "Yes", "No")
- for (var/mob/T as mob in mob_list)
- T << "
Man up.
Deal with it.
Move on.
"
- T << 'sound/voice/ManUp1.ogg'
+ if(confirm == "Yes")
+ for (var/mob/T as mob in mob_list)
+ T << "
Man up.
Deal with it.
Move on.
"
+ T << 'sound/voice/ManUp1.ogg'
- log_admin("[key_name(usr)] told everyone to man up and deal with it.")
- message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1)
+ log_admin("[key_name(usr)] told everyone to man up and deal with it.")
+ message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1)
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 99385ee5ff6..a9a07026a5d 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -131,7 +131,7 @@
usr.loc = M.loc
feedback_add_details("admin_verb","GK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/sendmob(var/mob/M in sortmobs())
+/client/proc/sendmob(var/mob/M in mob_list)
set category = "Admin"
set name = "Send Mob"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index a351badfdb3..6224f0d5f9e 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -29,7 +29,7 @@
loose = 4
species_fit = list("Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/eyes.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi'
)
/obj/item/clothing/head/welding/attack_self()
@@ -191,4 +191,4 @@
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
- mob.Blend(earbit, ICON_OVERLAY)
\ No newline at end of file
+ mob.Blend(earbit, ICON_OVERLAY)
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 28045dfc1ab..925d9f1f036 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -49,6 +49,9 @@
_color = "grey"
flags = ONESIZEFITSALL
species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/uniform.dmi'
+ )
/obj/item/clothing/under/color/grey/greytide
flags = ONESIZEFITSALL | NODROP
diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm
index 3eab3f59269..10870c9973e 100644
--- a/code/modules/computer3/computers/message.dm
+++ b/code/modules/computer3/computers/message.dm
@@ -371,7 +371,7 @@
if(!P.owner || P.toff || P.hidden) continue
sendPDAs += P
if(PDAs && PDAs.len > 0)
- customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs)
+ customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sendPDAs
else
customrecepient = null
diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm
index 198b483ee10..2bafc9f3cc9 100644
--- a/code/modules/events/money_spam.dm
+++ b/code/modules/events/money_spam.dm
@@ -29,7 +29,7 @@
// /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
var/obj/item/device/pda/P
var/list/viables = list()
- for(var/obj/item/device/pda/check_pda in sortAtom(PDAs))
+ for(var/obj/item/device/pda/check_pda in PDAs)
if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden)
continue
viables.Add(check_pda)
diff --git a/code/modules/garbage collection/garbage_collector.dm b/code/modules/garbage collection/garbage_collector.dm
index 5b3a070f570..4ae68bf9952 100644
--- a/code/modules/garbage collection/garbage_collector.dm
+++ b/code/modules/garbage collection/garbage_collector.dm
@@ -140,6 +140,15 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
// world << "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!"
garbageCollector.addTrash(D)
+
+// Returns 1 if the object has been queued for deletion.
+/proc/qdeleted(var/datum/D)
+ if (!istype(D))
+ return 0
+ if (!isnull(D.gcDestroyed))
+ return 1
+ return 0
+
/*
* Like Del(), but for qdel.
* Called BEFORE qdel moves shit.
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 90c1574c7eb..04b8745c4ac 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -261,3 +261,11 @@
qdel(W)
return equipped
+/mob/proc/get_all_slots()
+ return list(wear_mask, back, l_hand, r_hand)
+
+/mob/proc/get_id_card()
+ for(var/obj/item/I in src.get_all_slots())
+ . = I.GetID()
+ if(.)
+ break
\ No newline at end of file
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index e1cae9e3c66..835e13f7104 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -246,13 +246,14 @@
key = "5"
flags = RESTRICTED | WHITELISTED
syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0")
-
+
/datum/language/machine/get_random_name()
+ var/new_name
if(prob(70))
- name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
else
- name = pick(ai_names)
- return name
+ new_name = pick(ai_names)
+ return new_name
/datum/language/kidan
name = "Chittin"
@@ -333,6 +334,8 @@
name = "Gutter"
desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements."
speech_verb = "growls"
+ ask_verb = "gnarls"
+ exclaim_verb = "snarls"
colour = "rough"
key = "3"
syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 018c37e4ad6..52fd9ad29fc 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -110,6 +110,7 @@
if(leaping)
leaping = 0
+ update_icons()
update_canmove()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
index d0f4cf86aad..c4ac448293e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
@@ -114,8 +114,12 @@
Paralyse(2)
message = text("[] collapses!", src)
m_type = 2
+ if ("flip")
+ m_type = 1
+ message = "[src] does a flip!"
+ src.SpinAnimation(5,1)
if("help")
- src << "burp, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
+ src << "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
@@ -132,4 +136,4 @@
for(var/mob/O in hearers(src, null))
O.show_message(message, m_type)
//Foreach goto(746)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 7d8ab9932df..b88004e4a2d 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -7,11 +7,14 @@
var/obj/item/weapon/r_store = null
var/obj/item/weapon/l_store = null
var/caste = ""
+ var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files.
var/next_attack = 0
var/pounce_cooldown = 0
var/pounce_cooldown_time = 30
update_icon = 1
var/leap_on_click = 0
+ var/custom_pixel_x_offset = 0 //for admin fuckery.
+ var/custom_pixel_y_offset = 0
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
@@ -336,4 +339,20 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/humanoid/canBeHandcuffed()
- return 1
\ No newline at end of file
+ return 1
+
+/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0)
+ if(leaping)
+ return -32
+ else if(custom_pixel_y_offset)
+ return custom_pixel_y_offset
+ else
+ return initial(pixel_y)
+
+/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0)
+ if(leaping)
+ return -32
+ else if(custom_pixel_x_offset)
+ return custom_pixel_x_offset
+ else
+ return initial(pixel_x)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 4c24b06bbe0..740c3e5ce25 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -41,14 +41,20 @@
icon_state = "alien[caste]_s"
if(leaping)
- icon = 'icons/mob/alienleap.dmi'
+ if(alt_icon == initial(alt_icon))
+ var/old_icon = icon
+ icon = alt_icon
+ alt_icon = old_icon
icon_state = "alien[caste]_leap"
pixel_x = -32
pixel_y = -32
- else if(icon == 'icons/mob/alienleap.dmi' && pixel_x == -32 && pixel_y == -32)
- icon = initial(icon)// ^ this looks odd, but in theory it will prevent the icon and pixel_xy from being reset unless it needs to be
- pixel_x = initial(pixel_x)
- pixel_y = initial(pixel_y)
+ else
+ if(alt_icon != initial(alt_icon))
+ var/old_icon = icon
+ icon = alt_icon
+ alt_icon = old_icon
+ pixel_x = get_standard_pixel_x_offset(lying)
+ pixel_y = get_standard_pixel_y_offset(lying)
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index b0b7d85e97e..b23874b399f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -683,4 +683,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(buckled) return initial(pixel_y)
return -6
else
- return initial(pixel_y)
\ No newline at end of file
+ return initial(pixel_y)
+
+/mob/living/carbon/get_all_slots()
+ return list(l_hand,
+ r_hand,
+ handcuffed,
+ legcuffed,
+ back,
+ wear_mask)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index d0969503796..63f9461e06b 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -38,7 +38,6 @@
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.take_damage(amount)
- sponge.damage = min(max(sponge.damage, 0),(maxHealth*2))
brainloss = sponge.damage
else
brainloss = 200
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 507c8dab0ca..4bea67b9ab3 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -884,3 +884,33 @@ It can still be worn/put on as normal.
if(slot_s_store)
return s_store
return null
+
+/mob/living/carbon/human/get_all_slots()
+ . = get_head_slots() | get_body_slots()
+
+/mob/living/carbon/human/proc/get_body_slots()
+ return list(
+ l_hand,
+ r_hand,
+ back,
+ s_store,
+ handcuffed,
+ legcuffed,
+ wear_suit,
+ gloves,
+ shoes,
+ belt,
+ wear_id,
+ l_store,
+ r_store,
+ w_uniform
+ )
+
+/mob/living/carbon/human/proc/get_head_slots()
+ return list(
+ head,
+ wear_mask,
+ glasses,
+ r_ear,
+ l_ear,
+ )
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 0a38453c5fd..729ce6c8cae 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -27,7 +27,7 @@
return emote(copytext(message,2))
if(name != GetVoice())
- alt_name = "(as [get_id_name("Unknown")])"
+ alt_name = " (as [get_id_name("Unknown")])"
//parse the radio code and consume it
if (message_mode)
@@ -214,17 +214,13 @@
continue
var/obj/item/voice_changer/changer = locate() in gear
if(changer && changer.active && changer.voice)
- return changer
+ return changer.voice
return 0
/mob/living/carbon/human/GetVoice()
-
- var/voice_sub
var/has_changer = HasVoiceChanger()
if(has_changer)
- voice_sub = has_changer
- if(voice_sub)
- return voice_sub
+ return has_changer
if(mind && mind.changeling && mind.changeling.mimicing)
return mind.changeling.mimicing
if(GetSpecialVoice())
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index fa834fa581b..416dc1626cd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -936,4 +936,5 @@
return initial(pixel_y)
/mob/living/proc/spawn_dust()
- new /obj/effect/decal/cleanable/ash(loc)
\ No newline at end of file
+ new /obj/effect/decal/cleanable/ash(loc)
+
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index 7de12627482..768b46c2283 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -231,7 +231,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
M << browse(dat, "window=paiRecruit;size=580x580;")
proc/findPAI(var/obj/item/device/paicard/p, var/mob/user)
- requestRecruits()
+ requestRecruits(p)
var/list/available = list()
for(var/datum/paiCandidate/c in paiController.pai_candidates)
if(c.ready)
@@ -346,12 +346,12 @@ var/datum/paiController/paiController // Global handler for pAI candidates
user << browse(dat, "window=findPai")
- proc/requestRecruits()
+ proc/requestRecruits(var/obj/item/device/paicard/P)
for(var/mob/dead/observer/O in player_list)
if(O.client && O.client.prefs.be_special & BE_PAI)
if(player_old_enough_antag(O.client,BE_PAI))
if(check_recruit(O))
- O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)"
+ O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)"
//question(O.client)
proc/check_recruit(var/mob/dead/observer/O)
if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept"))
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 9cba0094d4d..4e04e619c44 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -149,7 +149,7 @@
var/pdas[0]
if(!user.pda.toff)
- for(var/obj/item/device/pda/P in sortAtom(PDAs))
+ for(var/obj/item/device/pda/P in PDAs)
if(!P.owner || P.toff || P == user.pda || P.hidden) continue
var/pda[0]
pda["name"] = "[P]"
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index da2157f44bc..9c1d8b79f92 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -5,7 +5,8 @@
/mob/living/silicon/robot/get_active_hand()
return module_active
-
+/mob/living/silicon/robot/get_all_slots()
+ return list(module_state_1, module_state_2, module_state_3)
/*-------TODOOOOOOOOOO--------*/
/mob/living/silicon/robot/proc/uneq_module(obj/item/O)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c55cd5a7bbf..15168dfbfc6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -81,6 +81,7 @@ var/list/robot_verbs_default = list(
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
var/jetpackoverlay = 0
+ var/magpulse = 0
var/obj/item/borg/sight/hud/sec/sechud = null
var/obj/item/borg/sight/hud/med/healthhud = null
@@ -229,21 +230,12 @@ var/list/robot_verbs_default = list(
module_sprites["Bro"] = "Brobot"
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
-/*
- if("Clerical")
- module = new /obj/item/weapon/robot_module/clerical(src)
- module.channels = list("Service" = 1)
- module_sprites["Waitress"] = "Service"
- module_sprites["Kent"] = "toiletbot"
- module_sprites["Bro"] = "Brobot"
- module_sprites["Rich"] = "maximillion"
- module_sprites["Default"] = "Service2"
-*/
+
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
module.channels = list("Supply" = 1)
if(camera && "Robots" in camera.network)
- camera.network.Add("MINE")
+ camera.network.Add("Mining Outpost")
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
@@ -276,6 +268,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "Engineering"
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
+ magpulse = 1
if("Janitor")
module = new /obj/item/weapon/robot_module/janitor(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 4ff0c7f0425..035c199a521 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -226,7 +226,6 @@
fix_modules()
-
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index 37172cd045d..6f21dec6cb4 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -23,4 +23,14 @@
return tally+config.robot_delay
/mob/living/silicon/robot/Move()
- ..()
\ No newline at end of file
+ ..()
+
+/mob/living/silicon/robot/mob_negates_gravity()
+ return magpulse
+
+/mob/living/silicon/robot/mob_has_gravity()
+ return ..() || mob_negates_gravity()
+
+/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
+ if(!magpulse)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index e099f8b3e4d..be304fc4cd8 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -62,40 +62,6 @@
usr << msg
return
-/mob/living/simple_animal/construct/Bump(atom/movable/AM as mob|obj, yes)
- spawn( 0 )
- if ((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(5))
- src << "\red You fail to push [tmob]'s fat ass out of the way."
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
- now_pushing = 0
- ..()
- if (!( istype(AM, /atom/movable) ))
- return
- if (!( now_pushing ))
- now_pushing = 1
- if (!( AM.anchored ))
- var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
- return
- return
-
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/construct/builder))
health += 5
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index 85ac56eeedc..e70b4423705 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -17,6 +17,11 @@
else if (restrained() || lying || stat || stunned || weakened)
return STATUS_UPDATE // update only (orange visibility)
return STATUS_INTERACTIVE
+
+/mob/dead/observer/shared_nano_interaction()
+ if(check_rights(R_ADMIN, 0, src))
+ return STATUS_INTERACTIVE // Admins are more equal
+ return STATUS_UPDATE // Ghosts can view updates
/mob/living/silicon/ai/shared_nano_interaction()
if(lacks_power())
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 7d5ebc18868..150f45e9518 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -347,7 +347,7 @@ nanoui is used to open and update nano browser uis
template_data_json = list2json(templates)
var/list/send_data = get_send_data(initial_data)
- var/initial_data_json = replacetext(list2json_usecache(send_data), "'", "'")
+ var/initial_data_json = replacetext(replacetext(list2json_usecache(send_data), """, """), "'", "'")
var/url_parameters_json = list2json(list("src" = "\ref[src]"))
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 01b95c09ddf..7dff264aa53 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -178,16 +178,18 @@ var/list/organ_cache = list()
W.damage += damage
W.time_inflicted = world.time
+//Note: external organs have their own version of this proc
/obj/item/organ/proc/take_damage(amount, var/silent=0)
- if(src.robotic == 2)
- src.damage += (amount * 0.8)
+ if(src.status & ORGAN_ROBOT)
+ src.damage = between(0, src.damage + (amount * 0.8), max_damage)
else
- src.damage += amount
+ src.damage = between(0, src.damage + amount, max_damage)
- if(owner && parent_organ)
- var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
- if(parent && !silent)
- owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
+ //only show this if the organ is not robotic
+ if(owner && parent_organ && amount > 0)
+ var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
+ if(parent && !silent)
+ owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 07c0ea13e8d..32379a466d6 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -115,6 +115,8 @@
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
..()
+ apcs += src
+ apcs = sortAtom(apcs)
wires = new(src)
var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new
standard_max_charge = tmp_cell.maxcharge
@@ -143,6 +145,7 @@
src.update()
/obj/machinery/power/apc/Destroy()
+ apcs -= src
if(malfai && operating)
if (ticker.mode.config_tag == "malfunction")
if (src.z == ZLEVEL_STATION)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index de6fb00c621..ea9a92f3230 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -432,12 +432,15 @@ obj/structure/cable/proc/cableColor(var/colorC)
P.disconnect_from_network() //remove from current network (and delete powernet)
return
+ var/obj/O = P_list[1]
// remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
- var/datum/powernet/newPN = new()// creates a new powernet...
- propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable
+ spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
+ if(O && !qdeleted(O))
+ var/datum/powernet/newPN = new()// creates a new powernet...
+ propagate_network(O, newPN)//... and propagates it to the other side of the cable
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
@@ -501,9 +504,9 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
-
- if(!S)
- return
+
+ if(!S)
+ return
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help" || S.open == 2)
return ..()
@@ -892,4 +895,4 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/stack/cable_coil/cyborg/attack_self(mob/user)
var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
color = cablecolor
- update_icon()
\ No newline at end of file
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index 3790abca26b..ea2675034e7 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -702,14 +702,12 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)"
- message += " (VV)"
-
+ var/message = "A [reaction_name] reaction has occured in ([my_area.name])"
var/mob/M = get(A, /mob)
if(M)
- message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)"
+ message += " - carried by: [key_name_admin(M)]"
else
- message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
+ message += " - last fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
message_admins(message, 0, 1)
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 89f14c26358..0556eee6d18 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -366,6 +366,7 @@
New()
..()
reagents.add_reagent("nutriment", 3)
+ reagents.add_reagent("sodiumchloride", 1)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/cornchips
@@ -1228,6 +1229,7 @@
New()
..()
reagents.add_reagent("plantmatter", 6)
+ reagents.add_reagent("sodiumchloride", 1)
/obj/item/weapon/reagent_containers/food/snacks/no_raisin
name = "4no Raisins"
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 25914feb81d..dca34a6b9b6 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -442,6 +442,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
new_item.loc = L
L.name += " ([new_item.name])"
+ L.origin_tech = new_item.origin_tech
else
new_item.loc = linked_lathe.loc
linked_lathe.busy = 0
@@ -771,7 +772,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Disconnect from Research Network
"
dat += "Device Linkage Menu
"
dat += "Lock Console
"
- if(check_rights(R_ADMIN))
+ if(check_rights(R_ADMIN,0))
dat += "\[ADMIN\] Maximize Research Levels
"
dat += "Reset R&D Database"
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index 274f02f27fc..5d33c5982f2 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -223,7 +223,7 @@ datum/tech/magnets
name = "Electromagnetic Spectrum Research"
desc = "Research into the electromagnetic spectrum. No clue how they actually work, though."
id = "magnets"
- max_level = 5
+ max_level = 6
datum/tech/programming
name = "Data Theory Research"
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 64b854d3bc5..603e7e52055 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -85,7 +85,7 @@ h1.alert, h2.alert {color: #000000;}
.clown {color: #ff0000;}
.shadowling {color: #3b2769;}
.vulpkanin {color: #B97A57;}
-.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
+.rough {color: #7092BE; font-family: "Trebuchet MS", cursive, sans-serif;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
diff --git a/icons/mob/alienleap.dmi b/icons/mob/alienleap.dmi
index 3adf4ff7597..da092d4b9bd 100644
Binary files a/icons/mob/alienleap.dmi and b/icons/mob/alienleap.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index 67a90c9c4c5..d1cf1ef7b72 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/obj/pipes/transit_tube.dmi b/icons/obj/pipes/transit_tube.dmi
index 45b2abc3c3e..517a3b238cd 100644
Binary files a/icons/obj/pipes/transit_tube.dmi and b/icons/obj/pipes/transit_tube.dmi differ
diff --git a/nano/templates/order_console.tmpl b/nano/templates/order_console.tmpl
new file mode 100644
index 00000000000..43ae8f37a0d
--- /dev/null
+++ b/nano/templates/order_console.tmpl
@@ -0,0 +1,111 @@
+
+
+
+
+
+ Supply Points:
+
+
+ {{:data.points}}
+
+
+
+
+ Shuttle Status:
+
+
+ {{if !data.moving && !data.at_station}}
+ {{:data.docked}} off-station.
+ {{else !data.moving && data.at_station}}
+ {{:data.docked}} at the station.
+ {{else data.moving}}
+ Shuttle is en route (ETA: {{:data.timeleft}} minute{{if data.timeleft > 1}}s{{/if}}).
+ {{/if}}
+
+
+
+
+ Supply Crates
+
+
+
+
+ {{if !data.contents}}
+ {{for data.supply_packs}}
+
+
+
{{:helper.link(value.name, null, value.command1)}}
+ {{:helper.link('#', null, value.command2, null)}}{{:helper.link('C', null, value.command3, null)}}
{{:value.cost}} points
+
+
+ {{/for}}
+ {{else}}
+
+ Contents of {{:data.contents_name}}
+
+ {{:data.contents}}
+ {{:helper.link('Return', 'arrow-1-w', {'contents' : 1})}}
+ {{/if}}
+
+
+
+
+
+
+ Categories
+
+ {{for data.categories}}
+
+ {{:helper.link(value.name, 'gear', {'last_viewed_group':value.category}, (data.last_viewed_group==value.category) ? 'linkOn' : '', null, 'category')}}
+
+ {{/for}}
+
+
+
+ Supply Orders
+
+
+
+
+
Requests
+
+ {{for data.requests}}
+
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}}
+ {{if value.owned == 1}}
+ {{:helper.link('CANCEL', null, value.command1, null)}}
+ {{/if}}
+
+ {{empty}}
+ No active requests.
+ {{/for}}
+
+
Orders
+
+ {{for data.orders}}
+
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}}
+
+ {{empty}}
+ No confirmed orders.
+ {{/for}}
+
+
+
+
\ No newline at end of file
diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl
new file mode 100644
index 00000000000..05002413e83
--- /dev/null
+++ b/nano/templates/supply_console.tmpl
@@ -0,0 +1,125 @@
+
+
+
+
+
+ Supply Points:
+
+
+ {{:data.points}}
+
+
+
+
+ Shuttle Status:
+
+
+ {{if !data.moving && !data.at_station}}
+ {{:data.docked}} off-station.
+ {{else !data.moving && data.at_station}}
+ {{:data.docked}} at the station.
+ {{else data.moving}}
+
Shuttle is en route (ETA: {{:data.timeleft}} minute{{if data.timeleft > 1}}s{{/if}}).
+ {{/if}}
+
+
+
+
+ Shuttle Control:
+
+
+ {{:helper.link('Call Shuttle', 'circle-triangle-e', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}}
+ {{:helper.link('Return Shuttle', 'circle-triangle-w', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}}
+
+ {{:helper.link('Force Shuttle', 'alert', {'force_send' : 1}, !data.can_force ? 'disabled' : '')}}
+ {{:helper.link('Cancel Shuttle', 'cancel', {'cancel_send' : 1}, !data.can_force ? 'disabled' : '')}}
+
+
+
+
+ Supply Crates
+
+
+
+
+ {{if !data.contents}}
+ {{for data.supply_packs}}
+
+
+
{{:helper.link(value.name, null, value.command1)}}
+ {{:helper.link('#', null, value.command2, null)}}
+ {{:helper.link('C', null, value.command3, null)}}
{{:value.cost}} points
+
+
+ {{/for}}
+ {{else}}
+ {{:helper.link('Return', 'arrow-1-w', {'contents' : 1})}}
+
+ Contents of {{:data.contents_name}}
+
+ {{:data.contents}}
+ {{/if}}
+
+
+
+
+
+
+ Categories
+
+ {{for data.categories}}
+
+ {{:helper.link(value.name, 'gear', {'last_viewed_group':value.category}, (data.last_viewed_group==value.category) ? 'linkOn' : '', null, 'category')}}
+
+ {{/for}}
+
+
+
+ Supply Orders
+
+
+
+
+
Requests
+
+ {{for data.requests}}
+
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}}
+
+ {{:value.comment}}
+
+ {{:helper.link('APPROVE', null, value.command1, null)}} {{:helper.link('REJECT', null, value.command2, null)}}
+
+ {{empty}}
+ No active requests.
+ {{/for}}
+
+
Orders
+
+ {{for data.orders}}
+
+ #{{:value.ordernum}} - {{:value.supply_type}} for {{:value.orderedby}}
+
+ {{empty}}
+ No confirmed orders.
+ {{/for}}
+
+
+
+
\ No newline at end of file