diff --git a/.travis.yml b/.travis.yml index 5a6f9be8086..6eb8961a07f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,7 @@ env: cache: directories: - - nano/node_modules - - nano/bower_components + - tgui/node_modules - $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR} @@ -35,13 +34,12 @@ addons: install: - rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm install $NODE_VERSION - - npm install -g gulp bower + - npm install -g gulp-cli - pip install --user PyYaml -q - pip install --user beautifulsoup4 -q before_script: - - cd nano && npm install && cd .. - - cd nano && bower install && cd .. + - cd tgui && npm install && cd .. - chmod +x ./install-byond.sh - ./install-byond.sh @@ -50,7 +48,7 @@ script: - (! grep 'step_[xy]' _maps/**/*.dmm) - md5sum -c - <<< "49bc6b1b9ed56c83cceb6674bd97cb34 *html/changelogs/example.yml" - tools/check_filedirs.sh tgstation.dme - - cd nano && gulp && gulp --min && cd .. + - cd tgui && gulp && cd .. - python tools/ss13_genchangelog.py html/changelog.html html/changelogs - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - bash dm.sh -M${DM_MAPFILE} tgstation.dme diff --git a/_maps/RandomRuins/SpaceRuins/way_home.dmm b/_maps/RandomRuins/SpaceRuins/way_home.dmm new file mode 100644 index 00000000000..f5a194b42e1 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/way_home.dmm @@ -0,0 +1,37 @@ +"a" = (/turf/space,/area/space) +"b" = (/turf/simulated/mineral/random,/area/ruin/unpowered/no_grav/way_home) +"c" = (/turf/simulated/floor/plating/asteroid/airless,/area/ruin/unpowered/no_grav/way_home) +"d" = (/obj/structure/signpost{name = "salvation"},/turf/simulated/floor/plating/asteroid/airless,/area/ruin/unpowered/no_grav/way_home) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaabaaaaaaaaaaaaaaa +aaaaaaaaaaaaabbbaaaaaaaaaaaaaa +aaaaaaaaaabbbbbbbbbaaaaaaaaaaa +aaaaaaaaaaabbbbbbbbaaaaaaaaaaa +aaaaaaaaaabbbbbbbbaaaaaaaaaaaa +aaaaaaaaabbbbbbbbbaaaaaaaaaaaa +aaaaaaaaabbbbbbbbbbaaaaaaaaaaa +aaaaaaaabbbbbbbbbbbbaaaaaaaaaa +aaaaaaabbbbbbbbcbbbaaaaaaaaaaa +aaaaaaabbbbbbbcccaaaaaaaaaaaaa +aaaaaabbbbbbbbccaaaaaaaaaaaaaa +aaaaaabbbbbbcccaaaaaaaaaaaaaaa +aaaaaaabbbcccccaaaaaaaaaaaaaaa +aaaaaaabbaacccccaaaaaaaaaaaaaa +aaaaaaaaaaaaaccccaaaaaaaaaaaaa +aaaaaaaaaaaaaccdccaaaaaaaaaaaa +aaaaaaaaaaaaaccccccaaaaaaaaaaa +aaaaaaaaaaaaaaccccccaaaaaaaaaa +aaaaaaaaaaaaaacccbccaaaaaaaaaa +aaaaaaaaaaaaaaaccbbccaaaaaaaaa +aaaaaaaaaaaaaaacbbbbbaaaaaaaaa +aaaaaaaaaaaaaaacbbbbbbaaaaaaaa +aabbaaaaaaaaaaaabbbbbbbaaaaaaa +aabbbaaaaaaaaaabbbbbbbbbaaaaaa +aaabaaaaaaaaaabbaaabbbabaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm new file mode 100644 index 00000000000..11a292472f3 --- /dev/null +++ b/_maps/RandomZLevels/research.dmm @@ -0,0 +1,940 @@ +"aa" = (/turf/space,/area/space) +"ab" = (/turf/simulated/mineral,/area/space) +"ac" = (/turf/simulated/floor/plating/asteroid/airless,/area/space) +"ad" = (/turf/simulated/mineral,/area/awaymission/research/exterior) +"ae" = (/turf/simulated/floor/plating/asteroid/airless,/area/awaymission/research/exterior) +"af" = (/mob/living/simple_animal/hostile/syndicate/ranged/space,/turf/simulated/floor/plating/asteroid/airless,/area/awaymission/research/exterior) +"ag" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/wall/shuttle{dir = 8; icon_state = "diagonalWall3"},/area/awaymission/research/interior/engineering) +"ah" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area/awaymission/research/interior/engineering) +"ai" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aj" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area/awaymission/research/interior/engineering) +"ak" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/wall/shuttle{dir = 1; icon_state = "diagonalWall3"},/area/awaymission/research/interior/engineering) +"al" = (/turf/simulated/wall/shuttle{icon_state = "wall3"},/area/awaymission/research/interior/engineering) +"am" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/research/interior/engineering) +"an" = (/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"ao" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/research/interior/engineering) +"ap" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"aq" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"ar" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/engineering) +"as" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"at" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"au" = (/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"av" = (/obj/item/weapon/shard{icon_state = "small"},/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high/empty,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aw" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/whiteyellow/side,/area/awaymission/research/interior/engineering) +"ax" = (/obj/structure/flora/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel/whiteyellow/corner{tag = "icon-whiteyellowcorner (WEST)"; icon_state = "whiteyellowcorner"; dir = 8},/area/awaymission/research/interior/engineering) +"ay" = (/obj/structure/bed/chair{dir = 8},/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"az" = (/obj/effect/gibspawner/human,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aA" = (/obj/item/stack/sheet/plasteel,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aB" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior/engineering) +"aC" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aD" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aE" = (/obj/effect/gibspawner/human,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aF" = (/obj/item/stack/rods,/obj/item/stack/sheet/metal,/obj/item/weapon/stock_parts/cell/high/empty,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aG" = (/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aH" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/maint) +"aI" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aJ" = (/obj/machinery/computer/pod{id = "spacebattlepod2"; name = "Hull Door Control"},/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"aK" = (/obj/effect/landmark/corpse/syndicatesoldier{corpsebrute = 200},/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"aL" = (/obj/structure/table,/obj/item/weapon/c4,/obj/item/weapon/c4,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering) +"aM" = (/obj/item/weapon/stock_parts/cell/high/empty,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aN" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/cable_coil{amount = 1},/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"aO" = (/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"aP" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "12"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"aQ" = (/turf/simulated/floor/plasteel/whiteyellow/corner,/area/awaymission/research/interior/engineering) +"aR" = (/obj/item/stack/sheet/plasteel,/obj/item/stack/cable_coil{amount = 1},/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aS" = (/turf/simulated/floor/plasteel{icon_state = "damaged4"},/turf/simulated/wall/shuttle{icon_state = "diagonalWall3"},/area/awaymission/research/interior/engineering) +"aT" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"aU" = (/turf/simulated/floor/plasteel{icon_state = "damaged1"},/turf/simulated/wall/shuttle{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/research/interior/engineering) +"aV" = (/obj/item/stack/sheet/plasteel,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"aW" = (/obj/machinery/light{dir = 4},/obj/structure/dispenser,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior/engineering) +"aX" = (/obj/item/stack/sheet/mineral/bananium{amount = 50},/turf/simulated/floor/plating/asteroid/airless,/area/space) +"aY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"aZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -32; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior/engineering) +"ba" = (/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bb" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior/engineering) +"bc" = (/turf/simulated/floor/plasteel{icon_state = "damaged5"},/turf/simulated/wall/shuttle{icon_state = "diagonalWall3"},/area/awaymission/research/interior/engineering) +"bd" = (/turf/simulated/floor/plasteel{icon_state = "damaged3"},/area/awaymission/research/interior/engineering) +"be" = (/obj/item/stack/rods,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel{icon_state = "damaged5"},/area/awaymission/research/interior/engineering) +"bf" = (/turf/simulated/floor/plasteel{icon_state = "damaged3"},/turf/simulated/wall/shuttle{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/research/interior/engineering) +"bg" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "damaged5"},/area/awaymission/research/interior/engineering) +"bh" = (/obj/item/stack/sheet/metal,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bi" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior/engineering) +"bj" = (/obj/machinery/light/small,/turf/simulated/floor/plating/asteroid/airless,/area/awaymission/research/exterior) +"bk" = (/obj/item/weapon/bikehorn,/turf/simulated/floor/plating/asteroid/airless,/area/space) +"bl" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/gateway) +"bm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{auto_name = 1; cell_type = 9000; dir = 4; name = "Engineering APC"; pixel_x = 27; pixel_y = 2},/turf/simulated/floor/plating,/area/awaymission/research/interior/engineering) +"bn" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior/engineering) +"bo" = (/obj/item/weapon/screwdriver,/obj/item/stack/cable_coil{amount = 1},/obj/item/ammo_casing/c45,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bp" = (/obj/effect/landmark/corpse/engineer{corpsebrute = 200},/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bq" = (/obj/item/stack/rods,/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"br" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel{icon_state = "damaged5"},/area/awaymission/research/interior/engineering) +"bs" = (/obj/item/ammo_casing/c45,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel{icon_state = "damaged5"},/area/awaymission/research/interior/engineering) +"bt" = (/obj/effect/gibspawner/human,/obj/item/stack/cable_coil{amount = 1},/obj/item/ammo_casing/c45,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bu" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bv" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior/engineering) +"bx" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"by" = (/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plating/asteroid/airless,/area/space) +"bz" = (/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"bA" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel/darkwarning{tag = "icon-warndark (NORTHWEST)"; icon_state = "warndark"; dir = 9},/area/awaymission/research/interior/gateway) +"bB" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel/darkwarning{icon_state = "warndark"; dir = 1},/area/awaymission/research/interior/gateway) +"bC" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel/darkwarning{tag = "icon-warndark (NORTHEAST)"; icon_state = "warndark"; dir = 5},/area/awaymission/research/interior/gateway) +"bD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"bE" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel/whiteyellow/corner{tag = "icon-whiteyellowcorner (EAST)"; icon_state = "whiteyellowcorner"; dir = 4},/area/awaymission/research/interior/engineering) +"bF" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior/engineering) +"bG" = (/obj/item/stack/sheet/metal,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior/engineering) +"bH" = (/obj/item/ammo_casing/c9mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior/engineering) +"bI" = (/obj/effect/landmark/corpse/syndicatesoldier{corpsebrute = 200},/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTHEAST)"; icon_state = "whiteyellow"; dir = 5},/area/awaymission/research/interior/engineering) +"bJ" = (/obj/item/ammo_casing/c45,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bK" = (/obj/item/weapon/wrench,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTHWEST)"; icon_state = "whiteyellow"; dir = 9},/area/awaymission/research/interior/engineering) +"bL" = (/obj/item/stack/sheet/plasteel,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior/engineering) +"bM" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior/engineering) +"bN" = (/obj/effect/landmark/corpse/engineer{corpsebrute = 200},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior/engineering) +"bO" = (/obj/structure/extinguisher_cabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel/whiteyellow/corner{tag = "icon-whiteyellowcorner (NORTH)"; icon_state = "whiteyellowcorner"; dir = 1},/area/awaymission/research/interior/engineering) +"bP" = (/obj/structure/sign/vacuum{pixel_x = 32},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"bQ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"bR" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"bS" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel/darkwarning{dir = 8},/area/awaymission/research/interior/gateway) +"bT" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"bU" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel/darkwarning{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/awaymission/research/interior/gateway) +"bV" = (/obj/structure/sign/nosmoking_1{pixel_x = -32},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior/engineering) +"bW" = (/obj/item/ammo_casing/c45,/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior/engineering) +"bX" = (/obj/effect/landmark/corpse/engineer{corpsebrute = 200},/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c9mm,/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior/engineering) +"bY" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel/darkwarning{tag = "icon-warndark (SOUTHWEST)"; icon_state = "warndark"; dir = 10},/area/awaymission/research/interior/gateway) +"bZ" = (/obj/machinery/gateway,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/darkwarning,/area/awaymission/research/interior/gateway) +"ca" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel/darkwarning{tag = "icon-warndark (SOUTHEAST)"; icon_state = "warndark"; dir = 6},/area/awaymission/research/interior/gateway) +"cb" = (/obj/machinery/power/apc{cell_type = 12000; dir = 4; name = "Gateway APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ce" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cf" = (/obj/item/ammo_casing/c46x30mm,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior/engineering) +"cg" = (/obj/effect/landmark/corpse/syndicatesoldier{corpsebrute = 200},/turf/simulated/floor/plasteel{icon_state = "damaged3"},/area/awaymission/research/interior/engineering) +"ch" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ci" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cj" = (/obj/structure/window/reinforced,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"ck" = (/obj/machinery/door/window/eastright{tag = "icon-right"; icon_state = "right"; dir = 2},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cl" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cm" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"co" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cp" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior) +"cq" = (/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior/engineering) +"cr" = (/obj/effect/landmark/corpse/nanotrasensoldier{corpsebrute = 200},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior) +"cs" = (/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior/engineering) +"ct" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -32; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cx" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/genetics) +"cy" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Genetics Maintenance"; req_access_txt = "9"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cz" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cA" = (/obj/item/ammo_casing/c46x30mm,/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior) +"cB" = (/obj/item/ammo_casing/c46x30mm,/obj/item/ammo_casing/c9mm,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"cC" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior) +"cD" = (/obj/structure/table,/obj/item/device/radio,/obj/item/device/radio,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table,/obj/item/weapon/paper/pamphlet,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/gateway) +"cG" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = 32},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"cH" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/pepper,/obj/machinery/button/door{id = "cryopodg2"; name = "panic lockdown button"},/obj/machinery/alarm{pixel_y = 32},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"cI" = (/obj/machinery/computer/scan_consolenew,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"cJ" = (/obj/machinery/dna_scannernew,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"cK" = (/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"cL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cM" = (/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior) +"cN" = (/obj/item/ammo_casing/c9mm,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior) +"cO" = (/obj/item/ammo_casing/c46x30mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"cP" = (/obj/effect/landmark/corpse/nanotrasensoldier{corpsebrute = 200},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior) +"cQ" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/secure) +"cR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 1; name = "Gateway Access"; req_access_txt = "36"},/turf/simulated/floor/plating,/area/awaymission/research/interior/gateway) +"cS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Genetics APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/research/interior/genetics) +"cT" = (/mob/living/carbon/monkey,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"cU" = (/obj/machinery/door/window/eastright,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"cV" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"cW" = (/obj/machinery/door/window/westleft,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"cX" = (/mob/living/carbon/human,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"cY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/ammo_casing/c9mm,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"cZ" = (/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior) +"da" = (/obj/machinery/door/airlock/engineering{name = "Engine Room"; req_access_txt = "10"},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior) +"db" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dc" = (/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dd" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/device/firing_pin/dna,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"de" = (/obj/structure/filingcabinet,/obj/structure/filingcabinet,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"df" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off."; fields = list("label" = "Buffer1:Kr-$$@##", "UI" = "f8f603857000f930127c4", "SE" = "414401462231053131010241514651403453121613263463440351136366", "UE" = "340008485c321e542aed4df7032ac04d", "name" = "Krystal Symers", "blood_type" = "A+"); name = "dusty genetics data disk"; read_only = 1},/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/weapon/dnainjector/xraymut,/obj/item/weapon/dnainjector/xraymut,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior) +"dh" = (/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"di" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/mob/living/carbon/monkey,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"dj" = (/obj/item/weapon/disk/data{desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off."; fields = list("label" = "Buffer1:Krystal Symers", "UI" = "f8f603857000f930127c4", "SE" = "414401462231053131010241514651403453121613263463440351136366", "UE" = "340008485c321e542aed4df7032ac04d", "name" = "Krystal Symers", "blood_type" = "A+"); name = "dusty genetics data disk"; read_only = 1},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dk" = (/obj/item/weapon/disk/data{desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off with the words 'DO NOT CLONE' hastely written over it."; fields = list("label" = "Buffer1:George Melons", "UI" = "3c300f11b5421ca7014d8", "SE" = "430431205660551642142504334461413202111310233445620533134255", "UE" = "6893e6a0b0076a41897776b10cc2b324", "name" = "George Melons", "blood_type" = "B+"); name = "old genetics data disk"},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dl" = (/obj/effect/decal/cleanable/blood,/obj/item/stack/rods,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dn" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior) +"do" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"dp" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior) +"dq" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/security) +"dr" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/weapon/dnainjector/telemut,/obj/item/weapon/dnainjector/telemut,/obj/item/weapon/dnainjector/chavmut,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"ds" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"dt" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"du" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dv" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dw" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"dx" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"dy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/ammo_casing/c9mm,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dB" = (/obj/effect/landmark/corpse/nanotrasensoldier{corpsebrute = 200},/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)"; icon_state = "whiteyellow"; dir = 4},/area/awaymission/research/interior) +"dC" = (/obj/effect/decal/cleanable/blood,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"dD" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)"; icon_state = "whiteyellow"; dir = 8},/area/awaymission/research/interior) +"dE" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dF" = (/obj/structure/closet,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dG" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dH" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dI" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dJ" = (/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dK" = (/mob/living/simple_animal/hostile/nanotrasen/ranged,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dL" = (/obj/structure/rack,/obj/item/clothing/suit/armor/bulletproof,/obj/item/clothing/suit/armor/bulletproof,/obj/item/clothing/head/helmet/alt,/obj/item/clothing/head/helmet/alt,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dM" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dN" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off with the words 'DO NOT CLONE' hastely written over it."; fields = list("label" = "Buffer1:George Melons", "UI" = "3c300f11b5421ca7014d8", "SE" = "430431205660551642142504334461413202111310233445620533134255", "UE" = "6893e6a0b0076a41897776b10cc2b324", "name" = "George Melons", "blood_type" = "B+"); name = "old genetics data disk"},/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/device/firing_pin/dna,/obj/item/weapon/dnainjector/dwarf,/obj/item/weapon/dnainjector/dwarf,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dO" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/weapon/dnainjector/chameleonmut,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dP" = (/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dQ" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dR" = (/mob/living/carbon/human/interactive/greytide,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"dS" = (/obj/structure/window/reinforced{dir = 8},/mob/living/carbon/human,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"dT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/ammo_casing/c45,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"dV" = (/obj/structure/table,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dW" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/ammo_box/magazine/wt550m9,/obj/item/ammo_box/magazine/wt550m9,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dX" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet,/obj/item/clothing/head/helmet,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"dY" = (/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 1; locked = 1; name = "Secure Storage C"; req_access_txt = "36"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"dZ" = (/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 1; locked = 1; name = "Secure Storage D"; req_access_txt = "36"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"ea" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/research/interior) +"eb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ec" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/cryo) +"ed" = (/obj/machinery/door/poddoor{id = "cryopodg2"; name = "cryogenetic genetics blastdoor"},/turf/simulated/floor/plasteel/stairs,/area/awaymission/research/interior/genetics) +"ee" = (/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior/cryo) +"ef" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior/cryo) +"eg" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"eh" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ei" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ej" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/spawner/lootdrop/maintenance,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ek" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/decal/cleanable/blood/drip,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"el" = (/turf/simulated/floor/plasteel/white/corner,/area/awaymission/research/interior) +"em" = (/turf/simulated/floor/plasteel/whiteyellow/side,/area/awaymission/research/interior) +"en" = (/obj/machinery/alarm{pixel_y = 32},/turf/simulated/floor/plasteel/whiteyellow/side,/area/awaymission/research/interior) +"eo" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (SOUTHEAST)"; icon_state = "whiteyellow"; dir = 6},/area/awaymission/research/interior) +"ep" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"eq" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (SOUTHWEST)"; icon_state = "whiteyellow"; dir = 10},/area/awaymission/research/interior) +"er" = (/turf/simulated/floor/plasteel/white/corner{tag = "icon-whitecorner (WEST)"; icon_state = "whitecorner"; dir = 8},/area/awaymission/research/interior) +"es" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"et" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/pistol/m1911,/obj/item/weapon/gun/projectile/automatic/pistol/m1911,/obj/item/ammo_box/magazine/m45,/obj/item/ammo_box/magazine/m45,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"eu" = (/obj/structure/rack,/obj/item/clothing/suit/armor/laserproof,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"ev" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"ew" = (/turf/simulated/floor/plating,/area/awaymission/research/interior) +"ex" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ey" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/research/interior/cryo) +"ez" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior/cryo) +"eA" = (/obj/machinery/alarm{pixel_y = 32},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior/cryo) +"eB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/research/interior/cryo) +"eC" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/cryo) +"eD" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/research/interior/cryo) +"eE" = (/obj/structure/extinguisher_cabinet{pixel_y = 32},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior/cryo) +"eF" = (/mob/living/simple_animal/hostile/nanotrasen/ranged,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior/cryo) +"eG" = (/obj/item/ammo_casing/c9mm,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior/cryo) +"eH" = (/obj/structure/barricade/security,/turf/simulated/floor/plasteel{icon_state = "damaged4"},/area/awaymission/research/interior/cryo) +"eI" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"eJ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"eK" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"eL" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"eM" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/awaymission/research/interior) +"eN" = (/turf/simulated/floor/plasteel/white,/area/awaymission/research/interior) +"eO" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)"; icon_state = "whiteyellow"; dir = 1},/area/awaymission/research/interior) +"eP" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTHEAST)"; icon_state = "whiteyellow"; dir = 5},/area/awaymission/research/interior) +"eQ" = (/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"eR" = (/turf/simulated/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTHWEST)"; icon_state = "whiteyellow"; dir = 9},/area/awaymission/research/interior) +"eS" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior) +"eT" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"eU" = (/obj/machinery/door/window/northright{name = "Cell Door"; req_access_txt = "63"},/turf/simulated/floor/plasteel/red/side{dir = 1},/area/awaymission/research/interior/security) +"eV" = (/obj/effect/spawner/structure/window/reinforced,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/research/interior/security) +"eW" = (/obj/machinery/door/airlock/glass_security{id_tag = "outerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel/red/side{dir = 1},/area/awaymission/research/interior/security) +"eX" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -32; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"eY" = (/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"eZ" = (/obj/structure/barricade/security,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"fa" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/research/interior) +"fb" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior) +"fc" = (/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"fd" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Cryostatis APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"fe" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/awaymission/research/interior/cryo) +"ff" = (/obj/machinery/atmospherics/components/unary/cryo_cell,/turf/simulated/floor/plasteel/white,/area/awaymission/research/interior/cryo) +"fg" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -7; pixel_y = 1},/turf/simulated/floor/plasteel/white,/area/awaymission/research/interior/cryo) +"fh" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/turf/simulated/floor/plasteel/white,/area/awaymission/research/interior/cryo) +"fi" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/awaymission/research/interior/cryo) +"fj" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/awaymission/research/interior/cryo) +"fk" = (/obj/effect/decal/cleanable/blood/drip,/obj/machinery/atmospherics/components/unary/cryo_cell,/turf/simulated/floor/plasteel/white,/area/awaymission/research/interior/cryo) +"fl" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/awaymission/research/interior/cryo) +"fm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/awaymission/research/interior) +"fn" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/awaymission/research/interior) +"fo" = (/obj/effect/decal/cleanable/blood/drip,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/white,/area/awaymission/research/interior) +"fp" = (/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"fq" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (EAST)"; icon_state = "whitered"; dir = 4},/area/awaymission/research/interior) +"fr" = (/turf/simulated/floor/plasteel/whitered/corner,/area/awaymission/research/interior/security) +"fs" = (/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior/security) +"ft" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior/security) +"fu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior/security) +"fv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior/security) +"fw" = (/obj/machinery/alarm{pixel_y = 32},/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior/security) +"fx" = (/obj/structure/sign/goldenplaque{pixel_x = 32},/turf/simulated/floor/plasteel/whitered/corner{tag = "icon-whiteredcorner (WEST)"; icon_state = "whiteredcorner"; dir = 8},/area/awaymission/research/interior/security) +"fy" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"fz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"fA" = (/obj/machinery/power/apc{cell_type = 12000; dir = 4; name = "Vault APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"fB" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"fC" = (/obj/machinery/light/small{dir = 8},/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"fD" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"fE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"fF" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/awaymission/research/interior/cryo) +"fG" = (/turf/simulated/floor/plasteel/whitepurple/side,/area/awaymission/research/interior/cryo) +"fH" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/awaymission/research/interior/cryo) +"fI" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"fJ" = (/obj/effect/landmark/corpse/syndicatesoldier{corpsebrute = 200},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whitepurple/side,/area/awaymission/research/interior/cryo) +"fK" = (/obj/item/ammo_casing/c9mm,/turf/simulated/floor/plasteel/whitepurple/side,/area/awaymission/research/interior/cryo) +"fL" = (/obj/structure/barricade/security,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/awaymission/research/interior/cryo) +"fM" = (/obj/machinery/door/airlock/research{name = "Cryogenetics Research"; req_access_txt = "9"},/turf/simulated/floor/plasteel/whitepurple/side,/area/awaymission/research/interior/cryo) +"fN" = (/turf/simulated/floor/plasteel/whitepurple/side,/area/awaymission/research/interior) +"fO" = (/obj/machinery/door/airlock/research{name = "Cryogenetics Research"; req_access_txt = "9"},/turf/simulated/floor/plasteel/whitepurple/side,/area/awaymission/research/interior) +"fP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/awaymission/research/interior) +"fQ" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/awaymission/research/interior) +"fR" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteyellow,/area/awaymission/research/interior) +"fS" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (SOUTHEAST)"; icon_state = "whitered"; dir = 6},/area/awaymission/research/interior) +"fT" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (SOUTHWEST)"; icon_state = "whitered"; dir = 10},/area/awaymission/research/interior) +"fU" = (/obj/machinery/door/airlock/glass_security{id_tag = "outerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior) +"fV" = (/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior) +"fW" = (/obj/structure/barricade/security,/turf/simulated/floor/plasteel/whitered/side,/area/awaymission/research/interior/security) +"fX" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (SOUTHEAST)"; icon_state = "whitered"; dir = 6},/area/awaymission/research/interior/security) +"fY" = (/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"fZ" = (/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"ga" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gc" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gd" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"ge" = (/obj/structure/extinguisher_cabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior/security) +"gf" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{tag = "icon-0-4"; icon_state = "0-4"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gh" = (/obj/machinery/power/terminal,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{tag = "icon-0-4"; icon_state = "0-4"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gi" = (/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 1; name = "Power Storage"; req_access_txt = "36"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/barricade/security,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 0; name = "Vault Storage"; req_access_txt = "36"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"go" = (/obj/structure/barricade/security,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"gp" = (/obj/machinery/door/airlock/research{name = "Secure Storage"; req_access_txt = "9,63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/secure) +"gq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior) +"gr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/awaymission/research/interior) +"gs" = (/obj/machinery/door/airlock/research{name = "Cryogenetics Research"; req_access_txt = "9"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior) +"gt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"gu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"gv" = (/obj/machinery/door/airlock/research{name = "Cryogenetics Research"; req_access_txt = "9"},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gw" = (/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gx" = (/mob/living/simple_animal/hostile/nanotrasen/ranged,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gy" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 145; corpseidjob = "Geneticist"; corpseoxy = 55; corpsesuit = /obj/item/clothing/suit/toggle/labcoat/genetics; corpseuniform = /obj/item/clothing/under/rank/geneticist; name = "Geneticist"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gz" = (/obj/item/ammo_casing/c9mm,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gA" = (/obj/item/ammo_casing/c9mm,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gB" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"gC" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"gD" = (/obj/structure/sign/science,/turf/simulated/wall/r_wall,/area/awaymission/research/interior) +"gE" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"gF" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"gG" = (/turf/simulated/floor/plasteel,/area/awaymission/research/interior) +"gH" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior) +"gI" = (/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior) +"gJ" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior) +"gK" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior) +"gL" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior) +"gM" = (/obj/structure/barricade/security,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"gT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior/security) +"gU" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/research/interior/cryo) +"gV" = (/obj/item/weapon/melee/classic_baton/telescopic,/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior/cryo) +"gW" = (/obj/item/weapon/reagent_containers/spray/pepper,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/research/interior/cryo) +"gX" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior/cryo) +"gY" = (/obj/structure/barricade/security,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/research/interior/cryo) +"gZ" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/awaymission/research/interior) +"ha" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/whitepurple,/area/awaymission/research/interior) +"hb" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/research/interior) +"hc" = (/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whitegreen,/area/awaymission/research/interior) +"hd" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTHEAST)"; icon_state = "whitered"; dir = 5},/area/awaymission/research/interior) +"he" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTHWEST)"; icon_state = "whitered"; dir = 9},/area/awaymission/research/interior) +"hf" = (/obj/machinery/door/airlock/glass_security{id_tag = "outerbrig"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior) +"hg" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior) +"hh" = (/obj/structure/barricade/security,/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior/security) +"hi" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTHEAST)"; icon_state = "whitered"; dir = 5},/area/awaymission/research/interior/security) +"hj" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/folder,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"hk" = (/obj/structure/table,/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"hl" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel/whitered,/area/awaymission/research/interior/security) +"hm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior/security) +"hn" = (/mob/living/simple_animal/hostile/nanotrasen,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/cryo) +"ho" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/awaymission/research/interior) +"hp" = (/turf/simulated/floor/plasteel/whitegreen,/area/awaymission/research/interior) +"hq" = (/turf/simulated/floor/plasteel/whitered/corner{tag = "icon-whiteredcorner (EAST)"; icon_state = "whiteredcorner"; dir = 4},/area/awaymission/research/interior/security) +"hr" = (/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior/security) +"hs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior/security) +"ht" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior/security) +"hu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior/security) +"hv" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"hw" = (/obj/machinery/light,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/awaymission/research/interior/cryo) +"hx" = (/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/cryo) +"hy" = (/obj/machinery/light,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/awaymission/research/interior/cryo) +"hz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"hA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"hB" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/awaymission/research/interior) +"hC" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior) +"hD" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/awaymission/research/interior) +"hE" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/awaymission/research/interior) +"hF" = (/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior) +"hG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"hH" = (/obj/machinery/door/window/southright{name = "Cell Door"; req_access_txt = "63"},/turf/simulated/floor/plasteel/red/side,/area/awaymission/research/interior/security) +"hI" = (/obj/effect/spawner/structure/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/research/interior/security) +"hJ" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (EAST)"; icon_state = "whitered"; dir = 4},/area/awaymission/research/interior/security) +"hK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/security,/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior/security) +"hL" = (/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 1; locked = 1; name = "Secure Storage A"; req_access_txt = "36"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"hM" = (/obj/machinery/door/airlock/highsecurity{aiDisabledIdScanner = 1; locked = 1; name = "Secure Storage B"; req_access_txt = "36"},/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"hN" = (/obj/machinery/door/poddoor{id = "cryopodg1"; name = "cryogenetic genetics blastdoor"},/turf/simulated/floor/plasteel/stairs{tag = "icon-stairs (NORTH)"; icon_state = "stairs"; dir = 1},/area/awaymission/research/interior/genetics) +"hO" = (/turf/simulated/floor/plasteel/white/corner{tag = "icon-whitecorner (EAST)"; icon_state = "whitecorner"; dir = 4},/area/awaymission/research/interior) +"hP" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior) +"hQ" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 200},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior) +"hR" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/awaymission/research/interior) +"hS" = (/obj/structure/sign/directions/medical{pixel_x = 32; pixel_y = -32},/obj/structure/sign/directions/evac{pixel_x = 32; pixel_y = -24},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/awaymission/research/interior) +"hT" = (/turf/simulated/floor/plasteel/white/corner{tag = "icon-whitecorner (NORTH)"; icon_state = "whitecorner"; dir = 1},/area/awaymission/research/interior) +"hU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/table,/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (WEST)"; icon_state = "whitered"; dir = 8},/area/awaymission/research/interior/security) +"hV" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines. This one has the initials 'C.P' marked on the front. "; name = "encrypted genetic data disk"; read_only = 1},/obj/item/clothing/head/collectable/petehat{name = "dusty hat"},/obj/item/device/firing_pin/dna,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"hW" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/device/firing_pin/dna,/obj/item/weapon/dnainjector/hulkmut,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"hX" = (/obj/item/weapon/shard,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"hY" = (/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"hZ" = (/obj/structure/window/reinforced{dir = 8},/mob/living/carbon/monkey,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"ia" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ib" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ic" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior) +"id" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior) +"ie" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"if" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"ig" = (/turf/simulated/wall,/area/awaymission/research/interior/maint) +"ih" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ii" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ij" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel/red,/area/awaymission/research/interior/security) +"ik" = (/obj/structure/flora/kirbyplants/dead{desc = "A potted plant, it doesn't look very healthy.."; name = "dead potted plant"},/turf/simulated/floor/plasteel/whitered/corner{tag = "icon-whiteredcorner (EAST)"; icon_state = "whiteredcorner"; dir = 4},/area/awaymission/research/interior/security) +"il" = (/mob/living/simple_animal/bot/secbot/beepsky{desc = "A beefy variant of the standard securitron model."; emagged = 1; faction = list("nanotrasenprivate"); health = 50; maxHealth = 50; name = "Officer Genesky"},/turf/simulated/floor/plasteel/whitered/side{tag = "icon-whitered (NORTH)"; icon_state = "whitered"; dir = 1},/area/awaymission/research/interior/security) +"im" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel/whitered/corner{tag = "icon-whiteredcorner (NORTH)"; icon_state = "whiteredcorner"; dir = 1},/area/awaymission/research/interior/security) +"in" = (/obj/structure/closet/crate,/obj/item/weapon/disk/data{desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, infomation will turn up blank on most DNA machines."; name = "encrypted genetic data disk"; read_only = 1},/obj/item/device/firing_pin/dna/dredd,/obj/item/device/firing_pin/dna/dredd,/obj/item/weapon/dnainjector/lasereyesmut,/obj/item/weapon/dnainjector/lasereyesmut,/turf/simulated/floor/plasteel/black,/area/awaymission/research/interior/secure) +"io" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"ip" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 145; corpseidjob = "Geneticist"; corpseoxy = 55; corpsesuit = /obj/item/clothing/suit/toggle/labcoat/genetics; corpseuniform = /obj/item/clothing/under/rank/geneticist; name = "Geneticist"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"iq" = (/obj/structure/mirror{pixel_x = -32},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"ir" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"is" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"it" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior) +"iu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/whitegreen,/area/awaymission/research/interior) +"iv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior) +"iw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"ix" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Security Maintenance"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"iy" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Genetics APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/research/interior/genetics) +"iz" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"iA" = (/obj/structure/bed/chair/office/dark,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"iB" = (/obj/machinery/door/window/westright,/turf/simulated/floor/plasteel/purple,/area/awaymission/research/interior/genetics) +"iC" = (/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iD" = (/obj/machinery/door/airlock{name = "Stall"},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iE" = (/obj/structure/toilet{icon_state = "toilet00"; dir = 8},/obj/effect/landmark{name = "awaystart"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iF" = (/turf/simulated/wall,/area/awaymission/research/interior) +"iG" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior) +"iH" = (/obj/machinery/power/apc{dir = 1; name = "Security APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/security) +"iI" = (/obj/machinery/computer/scan_consolenew,/obj/machinery/light,/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"iJ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/pepper,/obj/machinery/button/door{id = "cryopodg1"; name = "panic lockdown button"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -32; tag = "icon-alarm0 (NORTH)"},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"iK" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = -32},/turf/simulated/floor/plasteel/darkpurple,/area/awaymission/research/interior/genetics) +"iL" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iM" = (/obj/structure/window/reinforced/tinted,/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iN" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iO" = (/turf/simulated/wall,/area/awaymission/research/interior/bathroom) +"iP" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iQ" = (/obj/structure/window/reinforced/tinted{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iR" = (/obj/machinery/door/airlock{name = "Unisex Bathroom"},/turf/simulated/floor/plasteel/freezer,/area/awaymission/research/interior/bathroom) +"iS" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior) +"iT" = (/turf/simulated/floor/plasteel,/area/awaymission/research/interior/maint) +"iU" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/research/interior/maint) +"iV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "12"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"iW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/awaymission/research/interior/maint) +"iX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"iY" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/medbay) +"iZ" = (/turf/simulated/wall,/area/awaymission/research/interior/dorm) +"ja" = (/obj/machinery/door/airlock{name = "Bathroom"},/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"jb" = (/obj/machinery/alarm{pixel_y = 32},/turf/simulated/floor/plasteel/whiteblue/corner,/area/awaymission/research/interior/medbay) +"jc" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"jd" = (/obj/structure/table,/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"je" = (/obj/structure/table,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"jf" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"jg" = (/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/awaymission/research/interior/medbay) +"jh" = (/turf/simulated/wall,/area/awaymission/research/interior/medbay) +"ji" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel/whiteblue/corner,/area/awaymission/research/interior/medbay) +"jj" = (/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"jk" = (/obj/structure/dresser,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jl" = (/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jm" = (/obj/structure/closet/secure_closet/personal/cabinet,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jn" = (/obj/structure/flora/kirbyplants{icon_state = "plant-14"; layer = 4.1},/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (NORTHWEST)"; icon_state = "yellowsiding"; dir = 9},/area/awaymission/research/interior/dorm) +"jo" = (/turf/simulated/floor/plasteel/yellowsiding{dir = 1},/area/awaymission/research/interior/dorm) +"jp" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/yellowsiding{dir = 1},/area/awaymission/research/interior/dorm) +"jq" = (/obj/structure/barricade/wooden{desc = "A wooden table hastely flipped over for cover."; health = 55; icon = 'icons/obj/smooth_structures/wood_table.dmi'; icon_state = "wood_table"; maxhealth = 55; name = "flipped table"},/turf/simulated/floor/plasteel/yellowsiding{dir = 1},/area/awaymission/research/interior/dorm) +"jr" = (/turf/simulated/floor/plasteel/green/side{dir = 5},/area/awaymission/research/interior) +"js" = (/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_x = 32; pixel_y = 40},/obj/structure/sign/directions/engineering{dir = 1; icon_state = "direction_eng"; pixel_x = 32; pixel_y = 33; tag = "icon-direction_eng (NORTH)"},/obj/structure/sign/directions/science{dir = 1; icon_state = "direction_sci"; pixel_x = 32; pixel_y = 26; tag = "icon-direction_sci (NORTH)"},/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel/whitegreen,/area/awaymission/research/interior) +"jt" = (/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior) +"ju" = (/obj/machinery/door/airlock/medical{name = "Medical"},/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior) +"jv" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"jw" = (/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/awaymission/research/interior/medbay) +"jx" = (/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jy" = (/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"jz" = (/obj/machinery/door/airlock/medical{name = "Medical Surgey"},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jA" = (/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"jB" = (/obj/structure/table/optable,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jC" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"jD" = (/obj/structure/table/wood,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jE" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jF" = (/turf/simulated/floor/plasteel/yellowsiding{dir = 8},/area/awaymission/research/interior/dorm) +"jG" = (/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"jH" = (/obj/structure/barricade/wooden{desc = "A wooden table hastely flipped over for cover."; health = 55; icon = 'icons/obj/smooth_structures/wood_table.dmi'; icon_state = "wood_table"; maxhealth = 55; name = "flipped table"},/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"jI" = (/turf/simulated/floor/plasteel/green/side{dir = 4},/area/awaymission/research/interior) +"jJ" = (/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior) +"jK" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior) +"jL" = (/obj/structure/sign/bluecross,/turf/simulated/wall/r_wall,/area/awaymission/research/interior) +"jM" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior) +"jN" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior) +"jO" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jP" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jQ" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jR" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"jS" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/research/interior/medbay) +"jT" = (/obj/structure/table,/obj/item/weapon/surgical_drapes,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"jU" = (/obj/machinery/button/door{id = "Dorm1"; name = "Privacy Button"; pixel_y = -28},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jV" = (/obj/structure/bed,/obj/item/weapon/bedsheet/blue,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jW" = (/obj/machinery/button/door{id = "Dorm2"; name = "Privacy Button"; pixel_y = -28},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jX" = (/obj/structure/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jY" = (/obj/machinery/button/door{id = "Dorm3"; name = "Privacy Button"; pixel_y = -28},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"jZ" = (/obj/structure/bed,/obj/item/weapon/bedsheet/clown,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"ka" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 200},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kb" = (/turf/simulated/floor/plasteel/yellowsiding/corner,/area/awaymission/research/interior/dorm) +"kc" = (/obj/structure/barricade/wooden{desc = "A wooden table hastely flipped over for cover."; health = 55; icon = 'icons/obj/smooth_structures/wood_table.dmi'; icon_state = "wood_table"; maxhealth = 55; name = "flipped table"},/turf/simulated/floor/plasteel/yellowsiding,/area/awaymission/research/interior/dorm) +"kd" = (/turf/simulated/floor/plasteel/yellowsiding,/area/awaymission/research/interior/dorm) +"ke" = (/turf/simulated/floor/plasteel/green/side{dir = 6},/area/awaymission/research/interior) +"kf" = (/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior) +"kg" = (/obj/machinery/door/airlock/medical{name = "Medical"},/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior) +"kh" = (/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"ki" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"kj" = (/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/awaymission/research/interior/medbay) +"kk" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 145; corpseidjob = "Geneticist"; corpseoxy = 55; corpsesuit = /obj/item/clothing/suit/toggle/labcoat/genetics; corpseuniform = /obj/item/clothing/under/rank/geneticist; name = "Geneticist"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"kl" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"km" = (/obj/structure/table,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/awaymission/research/interior/medbay) +"kn" = (/obj/structure/table,/obj/item/weapon/circular_saw,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"ko" = (/obj/structure/table,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"kp" = (/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/awaymission/research/interior/medbay) +"kq" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Dorms APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/research/interior/dorm) +"kr" = (/obj/machinery/door/airlock{id_tag = "Dorm1"; name = "Dorm 1"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"ks" = (/obj/machinery/door/airlock{id_tag = "Dorm2"; name = "Dorm 2"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"kt" = (/obj/machinery/door/airlock{id_tag = "Dorm3"; name = "Dorm 3"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"ku" = (/obj/item/weapon/gun/projectile/automatic/pistol/m1911,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kv" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"kw" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/awaymission/research/interior) +"kx" = (/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/awaymission/research/interior/medbay) +"ky" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"kz" = (/obj/structure/table,/obj/machinery/light,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"kA" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"kB" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"kC" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted/fulltile,/turf/simulated/floor/plating,/area/awaymission/research/interior/medbay) +"kD" = (/obj/structure/flora/kirbyplants{icon_state = "plant-22"},/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (NORTHWEST)"; icon_state = "yellowsiding"; dir = 9},/area/awaymission/research/interior/dorm) +"kE" = (/turf/simulated/floor/plasteel/yellowsiding/corner{dir = 1},/area/awaymission/research/interior/dorm) +"kF" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kG" = (/obj/structure/closet/wardrobe/green,/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"kH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "12"},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"kI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior) +"kJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel/whitegreen,/area/awaymission/research/interior) +"kK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior) +"kL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"kM" = (/turf/simulated/floor/plating,/area/awaymission/research/interior/medbay) +"kN" = (/obj/machinery/door/airlock/medical{name = "Medical Storage"},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"kO" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel/whiteblue/corner,/area/awaymission/research/interior/medbay) +"kP" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"kQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"kR" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel/yellowsiding{dir = 8},/area/awaymission/research/interior/dorm) +"kS" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kT" = (/obj/structure/table/wood,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kU" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/fourcolor,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kV" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"kW" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"kX" = (/turf/simulated/floor/plasteel/whiteblue/corner,/area/awaymission/research/interior/medbay) +"kY" = (/obj/item/stack/rods,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"kZ" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel/whiteblue/corner,/area/awaymission/research/interior/medbay) +"la" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/whiteblue/side,/area/awaymission/research/interior/medbay) +"lb" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/awaymission/research/interior/medbay) +"lc" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"ld" = (/obj/structure/window/reinforced,/obj/structure/closet/wardrobe/mixed,/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"le" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"lf" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"lg" = (/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"lh" = (/obj/effect/decal/cleanable/blood/drip,/obj/item/ammo_casing/c45,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"li" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"lj" = (/obj/effect/decal/cleanable/blood,/obj/item/stack/rods,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"lk" = (/obj/effect/decal/cleanable/blood/drip,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"ll" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"lm" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"ln" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/yellowsiding{dir = 8},/area/awaymission/research/interior/dorm) +"lo" = (/turf/simulated/floor/plasteel,/area/space) +"lp" = (/obj/structure/table/wood,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel,/area/awaymission/research/interior/dorm) +"lq" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"lr" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"ls" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"lt" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"lu" = (/obj/effect/decal/cleanable/blood,/obj/item/ammo_casing/c45,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"lv" = (/obj/item/ammo_casing/c45,/obj/item/ammo_casing/c45,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/awaymission/research/interior/medbay) +"lw" = (/obj/effect/decal/cleanable/blood/drip,/obj/item/ammo_casing/c45,/obj/item/stack/rods,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/awaymission/research/interior/medbay) +"lx" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 200},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteblue,/area/awaymission/research/interior/medbay) +"ly" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/awaymission/research/interior/medbay) +"lz" = (/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1},/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (SOUTHWEST)"; icon_state = "yellowsiding"; dir = 10},/area/awaymission/research/interior/dorm) +"lA" = (/obj/machinery/light,/turf/simulated/floor/plasteel/yellowsiding,/area/awaymission/research/interior/dorm) +"lB" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel/yellowsiding,/area/awaymission/research/interior/dorm) +"lC" = (/turf/simulated/floor/plasteel/yellowsiding/corner{dir = 8},/area/awaymission/research/interior/dorm) +"lD" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/awaymission/research/interior/medbay) +"lE" = (/obj/machinery/light,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"lF" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/awaymission/research/interior/medbay) +"lG" = (/obj/effect/landmark/corpse/doctor{corpsebrute = 200},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/awaymission/research/interior/medbay) +"lH" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/awaymission/research/interior/medbay) +"lI" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/awaymission/research/interior/medbay) +"lJ" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/awaymission/research/interior/medbay) +"lK" = (/obj/structure/closet/crate/bin,/obj/item/trash/can,/obj/item/trash/chips,/turf/simulated/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (NORTH)"; icon_state = "whitebluecorner"; dir = 1},/area/awaymission/research/interior/medbay) +"lL" = (/obj/machinery/door/airlock{id_tag = "Dorm6"; name = "Dorm 6"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lM" = (/obj/machinery/door/airlock{id_tag = "Dorm5"; name = "Dorm 5"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lN" = (/obj/machinery/door/airlock{id_tag = "Dorm4"; name = "Dorm 4"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lO" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 32; tag = "icon-alarm0 (WEST)"},/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"lP" = (/obj/machinery/button/door{id = "Dorm6"; name = "Privacy Button"; pixel_y = 28},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lQ" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rainbow,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lR" = (/obj/machinery/button/door{id = "Dorm5"; name = "Privacy Button"; pixel_y = 28},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lS" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lT" = (/obj/machinery/button/door{id = "Dorm4"; name = "Privacy Button"; pixel_y = 28},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lU" = (/obj/structure/bed,/obj/item/weapon/bedsheet/patriot,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/wood,/area/awaymission/research/interior/dorm) +"lV" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (EAST)"; icon_state = "yellowsiding"; dir = 4},/area/awaymission/research/interior/dorm) +"lW" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/awaymission/research/interior/maint) +"lX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Medbay APC"; pixel_y = 24},/turf/simulated/floor/plating,/area/awaymission/research/interior/medbay) +"lY" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (SOUTHWEST)"; icon_state = "yellowsiding"; dir = 10},/area/awaymission/research/interior/dorm) +"lZ" = (/turf/simulated/floor/plasteel/yellowsiding{tag = "icon-yellowsiding (SOUTHEAST)"; icon_state = "yellowsiding"; dir = 6},/area/awaymission/research/interior/dorm) +"ma" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/power/apc{dir = 1; name = "Escape APC"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"mb" = (/turf/simulated/wall/r_wall,/area/awaymission/research/interior/escapepods) +"mc" = (/turf/simulated/wall,/area/awaymission/research/interior/escapepods) +"md" = (/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/asteroid,/area/awaymission/research/exterior) +"me" = (/turf/simulated/floor/plating/asteroid,/area/awaymission/research/exterior) +"mf" = (/turf/simulated/wall/shuttle{icon_state = "swall12"; dir = 2},/area/awaymission/research/exterior) +"mg" = (/turf/simulated/floor/plating/asteroid/airless,/obj/structure/shuttle/engine/propulsion/burst{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/simulated/wall/shuttle{dir = 3; icon_state = "swall_f10"; layer = 2},/area/awaymission/research/exterior) +"mh" = (/obj/structure/closet/emcloset,/obj/structure/sign/vacuum{pixel_y = 32},/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"mi" = (/obj/structure/sign/pods{pixel_x = -32},/turf/simulated/floor/plasteel/whitegreen/corner,/area/awaymission/research/interior/escapepods) +"mj" = (/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior/escapepods) +"mk" = (/obj/structure/table,/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior/escapepods) +"ml" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior/escapepods) +"mm" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior/escapepods) +"mn" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/awaymission/research/interior/escapepods) +"mo" = (/turf/simulated/floor/plasteel/whitegreen,/area/awaymission/research/interior/escapepods) +"mp" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/awaymission/research/interior/escapepods) +"mq" = (/turf/simulated/floor/plasteel/whitegreen/corner{tag = "icon-whitegreencorner (WEST)"; icon_state = "whitegreencorner"; dir = 8},/area/awaymission/research/interior/escapepods) +"mr" = (/turf/simulated/floor/plating,/area/awaymission/research/exterior) +"ms" = (/obj/item/stack/rods,/obj/item/weapon/shard,/obj/effect/landmark/corpse/doctor{corpsebrute = 200},/turf/simulated/floor/plasteel/shuttle,/area/awaymission/research/exterior) +"mt" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/corpse/doctor{corpsebrute = 145; corpseidjob = "Geneticist"; corpseoxy = 55; corpsesuit = /obj/item/clothing/suit/toggle/labcoat/genetics; corpseuniform = /obj/item/clothing/under/rank/geneticist; name = "Geneticist"},/turf/simulated/floor/plasteel/shuttle,/area/awaymission/research/exterior) +"mu" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/floor/plasteel/shuttle,/area/awaymission/research/exterior) +"mv" = (/obj/machinery/door/airlock/external{name = "Escape Pod One"},/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"mw" = (/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"mx" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior/escapepods) +"my" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior/escapepods) +"mz" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/awaymission/research/exterior) +"mA" = (/turf/simulated/floor/plating/asteroid/airless,/obj/structure/shuttle/engine/propulsion/burst{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/awaymission/research/exterior) +"mB" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior/escapepods) +"mC" = (/turf/simulated/wall,/area/awaymission/research/exterior) +"mD" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior/escapepods) +"mE" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/awaymission/research/interior/escapepods) +"mF" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior/escapepods) +"mG" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior/escapepods) +"mH" = (/obj/structure/table,/obj/machinery/light,/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior/escapepods) +"mI" = (/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/awaymission/research/interior/escapepods) +"mJ" = (/obj/structure/sign/pods{pixel_x = -32},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior/escapepods) +"mK" = (/obj/structure/flora/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/awaymission/research/interior/escapepods) +"mL" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/grass,/area/awaymission/research/interior/escapepods) +"mM" = (/obj/structure/flora/ausbushes/fernybush,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/grass,/area/awaymission/research/interior/escapepods) +"mN" = (/obj/structure/flora/ausbushes/grassybush,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/grass,/area/awaymission/research/interior/escapepods) +"mO" = (/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior/escapepods) +"mP" = (/obj/machinery/door/airlock/external{name = "Escape Pod Two"},/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"mQ" = (/obj/structure/bed/chair,/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior/escapepods) +"mR" = (/obj/structure/table,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/whitegreen/side,/area/awaymission/research/interior/escapepods) +"mS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/awaymission/research/interior/escapepods) +"mT" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"; req_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"mU" = (/turf/simulated/floor/plasteel/whitegreen/corner{tag = "icon-whitegreencorner (EAST)"; icon_state = "whitegreencorner"; dir = 4},/area/awaymission/research/interior/escapepods) +"mV" = (/obj/structure/sign/vacuum{pixel_y = -32},/obj/machinery/light,/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior/escapepods) +"mW" = (/obj/machinery/light,/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior/escapepods) +"mX" = (/obj/structure/sign/vacuum{pixel_y = -32},/turf/simulated/floor/plasteel/whitegreen/side{tag = "icon-whitegreen (NORTH)"; icon_state = "whitegreen"; dir = 1},/area/awaymission/research/interior/escapepods) +"mY" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 32; tag = "icon-alarm0 (WEST)"},/turf/simulated/floor/plasteel/whitegreen/corner{tag = "icon-whitegreencorner (NORTH)"; icon_state = "whitegreencorner"; dir = 1},/area/awaymission/research/interior/escapepods) +"mZ" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"na" = (/obj/machinery/door/airlock/external{name = "Escape Airlock"},/turf/simulated/floor/plating,/area/awaymission/research/interior/escapepods) +"nb" = (/turf/simulated/wall/mineral/plasma,/area/space) +"nc" = (/obj/structure/table/wood,/obj/item/weapon/spellbook/oneuse/random,/turf/simulated/floor/mineral/plasma,/area/space) +"nd" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/mineral/plasma,/area/space) +"ne" = (/obj/structure/divine/healingfountain/anyone,/turf/simulated/floor/mineral/plasma,/area/space) +"nf" = (/turf/simulated/floor/mineral/plasma,/area/space) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababacacacacacabababababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababacacacacacacacacabababababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababacacacacacacacacacacacababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababacacacacacacacacacacacababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababacacacacacacacacacacababababababababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababacacacacacacacacacacacacacacacacababababababababababababababababababababaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacacacacacacababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacabababababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaacacacacacacacacacabababababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacabababababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacabababababababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacababababababababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacababababababababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafaeaeaeaeaeaeadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaadadadadaeaeaeaeaeaeaeaeafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaadadadadadaeaeaeaeaeaeaeaeaeaeaeaeagahaiaiajakaeaeaeaeaeaeaeaeaeaeadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaadadadadadaeaeaeaeaeaeaeaeaeaeaeaealamananaoalaeaeaeaeaeaeaeaeaeaeadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaealapananaqalaeaeaeaeaeaeaeaeaeaeadadadadaaaaaaaaaaaaaaaaaaaaadadadaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaealapananaqalaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaearararalapasanaqalararararaeaeaeaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacaaaaaaaaaaaaababacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaearataualapananaqalavawaxaraeaeaeaeaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacaaaaaaaaaaaaababacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeadadadadarataualapananayalazaAaBaCaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacaaaaaaaaaaaaababababacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeadadadadadadadaraDaEalananananalaFaGaBaCaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHaHararaIalaJanaKaLalaMaNaBaCaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHaOaPaQaRaSalaTaualaUauaVaWaraeaeaeaeaeadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaeaeadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacaXacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHaYaraZbabbbcbdbebfbgaNbhbiaraebjaeaeadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacbkacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeadadadadaaaaadadadadadadadadadadadadadadadadadadblblblblblblbladadadadadadadadadadadadadadadadadadadadadadadadaHbmarbnbhbobpbqbrbsbtbubvbwarbxaHaeadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacbyaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeadadadadadadadadadadadadadadadadadadadadadadadblblbzbAbBbCbzblbladadadadadadadadadadadadadadadadadadadadadadadaHbDarbEbFbGbHbIbJbKbLbMbNbOarbPaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacaaaaaaaaaaaaaaacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadadadadblbQbRbSbTbUbRbzbladadadadadadadadadadadadadadadadadadadadadadadaHbDarararararbVbWbXarararararbxaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacaaaaaaaaacacacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadadblbQbRbYbZcabRcbbladadadadadadadaHaHaHaHaHaHaHaHaHaHaHadadadadadaHcccdcdcdcearcfcgbdaraOaOaOaOchaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadadblcicjcjckcjcjclbladadadadadaHaHaHcmcdcdcdcdcdcdcnceaHaHaHadadadaHaHaHaHaHcocpcqcrcscpaOaHaHaHaHaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadadblctbzbzbzbzcucvbladadadadadaHcmcdcwcxcxcxcxcxcycxcccdczaHadadadadadadadaHcocpcAcBcCcpaOaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadadadblblcDbzcucEcFblbladadadadadaHcocxcxcxcGcHcIcJcKcxcxcxcoaHadadadadadadadaHcLcMcNcOcPcpaOaHadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeadadadadcQcQcQcQcQcQcQcQcQcQcQadadadadadadblblblcRblblbladadadadadadaHcScxcTcUcKcKcVcKcKcWcXcxcoaHadadadadadadadaHcYcpcZcpdacpaOaHadadadadadaHaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaeaeaeaeaeadadadadadcQdbdcdcddcQdedcdcdfcQadadadadadadadadcpdgcpadadadadadadadadaHcocxdhdicKdjdkcKdldhdhcxcoaHadadadadaHaHaHaHdmaPdndodpaPaOaHaHaHaHadadaHaOdqdqdqdqdqdqdqdqdqdqdqdqdqdqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaeaeaeaeaeadadadadadcQdbdcdcdrcQdbdcdcddcQadadadadadadaeaecpdgcpaeaeadadadaHaHaHaHcocxdsdtcKducKcKdvdwdxcxcoaHaHaHaHaHaHdycddzdAcpdBdCdDcpdEaOaOaOaHaHadaHaOdqdFdGdHdqdFdGdHdqdIdJdKdLdqaOaHadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadcQdMdcdcdNcQdMdcdcdOcQadadadadadaeaeaecpdgcpaeaeaeadadaHcmcdcdcwcxcTdtdPcKdQdRcKdSdhcxccdTdTdTcdcdcddUcpcpcpcpcZcpdacpcpcpcpaOaOaHadaHaOdqdJdJdVdqdJdJdVdqdWdJdJdXdqaOaHadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadcQcQdYcQcQcQcQdZcQcQcQcQcQcQcQaeaeaeeaeadgeaeaaeaeaeadaHebececececececececedececececececeeefegeheiejekcpelemeneoepeqememercpaHaOaHaHaHaOdqdJdJesdqdJdJesdqetdJdJeudqaOaHadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadcQevdcdcdcdcdcdcdcdccQdcdcdccQaeaeaeeaewdgeweaaeaeaeaHaHexeceyezezezeAezeBeCeDezeEeFeGezeHeceIeJeieKcceLeMeNeOePeQeReOeNeScpaHaOeTaOaOaOdqdqeUeVdqdqeUeVdqdqeWeWdqdqaOaHadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadcQcQcQcQcQeXdcdceYeZcQdcdcdccQaeaeaecpfadgfbcpaeaeaecpfcfdecfefffgfffhfffieCfjfffgfffhfkflcpcpcpcpcpcpcpfmfneNfofpeNeNfqeScpcpaPcpcpcpcpdqfrfsftfufsfsftfvfwfsfsfxdqaOaHadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadcQfyfzfAcQdMdcdceZfBcQfCdcdccQeaeaeaeaewdgeweaeaeaeacpfDfEecfFfGfGfGfGfGfHfIfFfGfGfJfKfKfLfMfNfNfOfNfNfOfPfQeNeNfReNeNfSfTfUfVfVfUfVfVfUfWfXfYfZgafZfZfZgbgcgdfZgedqaOaHadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadcQgfggghgigjgkglgmgkgngkgkgogpgqgqgqgqgqgrgqgqgqgqgqgsgtgugvgwgwgxgwgwgwgwgygwgwgwgzgwgxgAcpfcgBcpgCfcgDgEfcgFfcgGgHgIgJgKcpgIgKcpgLgIcpgMfZfZfZgNgOgOgOgPgQgRgSgTdqaOaHadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadcQdcdcfycQdMdcdceZfBcQfCdcdccQeaeaeaeaeacpeaeaeaeaeacpfDfEeceyezezezezezgUgVgWezezezgXezgYfMgZgZfOgZgZfOhahbeNeNhceNeNhdhehfhghghfhghghfhhhifYfZgafZfZfZgahjhkhlhmdqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadcQcQcQcQcQdcdcdceYeZcQdcdcdccQaeaeaeaeaeaeaeaeaeaeaecpfcfEecfefffgfffhfffihnfjfffgfffhffflcpcpcpcpcpcpcpfmhoeNeNhpeNeNfqeScpcpaPcpcpcpcpdqhqhrhshthrhrhshthifZfZhudqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadcQhvdcdcdcdcdcdcdcdccQdcdcdccQaeaeaeaeaeaeaeaeaeaeaeaHaHexecfFfGfGfGfGfGhwhxhyfGfGfGfGfGfHeccmhzhzhzhAeLhBeNhChDhphEhFeNeScpaHcmhGhzhzcedqdqhHhIdqdqhHhIdqhJfZfZhKdqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadcQcQhLcQcQcQcQhMcQcQcQcQcQcQcQaeaeadadadadaeaeaeaeaeadaHebecececececececechNececececececececbDeJeiaOaYcphOhPhQhRhphShPhPhTcpaHbDaHaHaHbDdqdJdJesdqdJdJesdqhJfZfZhUdqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadcQdbdcdchVcQdbdcdchWcQadadadadadadadadadadadadaeaeaeadaHcccdcdcecxhXdtcKcKcKcKhYhZdhcxcmhzhzcwiaeiibbDcpcpcpcpichpidcpcpcpcpcmcwaHadaHbDdqdJdJdVdqdJdJdVdqhJfZfZhUdqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadcQdbdcdcdOcQdbdcdchWcQadadadadadadadadadadadadadaeaeadaHaHaHaHcocxdsdwdRcKcKducKieifcxbDigigigigigigcchzhzihcpichpidcpiihzhzcwaHaHadaHbDdqdFijdHdqdFijdHdqikhrilimdqaOaHadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadcQdMdcdcincQdMdcdcddcQadadadadadadadadadadadadadaeaeadadadadaHcocxdhdhdviocKipcKiedhcxbDigiqiriririgigigigiseLitiuiveLiwaHaHaHaHadadaHbDdqdqdqdqdqdqdqdqdqdqdqdqixdqaOaHadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadcQcQcQcQcQcQcQcQcQcQcQadadadadadadadadadadadadadadaeaeadadadaHiycxdhizcKcKiAcKdRiBcTcxbDigiqiCiCiCiCiDiEigbDiFichpiGcpcoaHadadadadadaHcchzhzhzhzhzhzhzhzhziHhzhGcwaOaOaHadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeadaHcocxcxcxcKcJiIiJiKcxcxcxbDigiLiMiMiCiNiOiOigbDiFichpidcpcoaHadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeadaHcchzcecxcycxcxcxcxcxcmhzcwigiCiCiPiQiCiDiEigbDiFichpidcpcoaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeadaHaHaHcchzhzhGhzhzhzhzcwigigigiOiOiOiOiRiOiOigbDiFiShpidcpcoaHadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHaHigigigigigigigigigaOaOaOaOigiTiTiUiTigebiFichpidcpcoaHaHaHaHaHaHaHaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaHadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcmhzhzhzhzhzhzhzhzhzhzhzhziViWiWiWiWiVcwiFichpidcpcccdcdcdcdcdcdiXaOiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYaOaHadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZiZiZiZiZiZiZiZiZiZiZiZiZiZjaiZiZiZiZiFhDhpidcpcpcpcpcpcpcpcpiYiYiYjbjcjcjdjejfjcjcjgjhjijjjjjgiYaOaHadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZjkjljmiZjkjljmiZjkjljmiZjnjojpjojqjojrhphpjsjtjujtjtjujtjtjujjjjjvjwjxjxjxjxjxjxjxjyjzjAjxjBjCiYaOaHadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZjDjEjliZjDjEjliZjDjEjliZjFjGjGjGjHjGjIhphpjJjKjLjJjMcpjNjJcpjOjPjQjPjRjxjxjxjRjxjxjyjSjTjxjxjyiYaOaHadadadadadadadadadaeaeaeaeaeaeaeadadadaeaeaeaeadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZjUjljViZjWjljXiZjYjljZiZjFjGkakbkckdkehphphpkfkgkfkfkgkfkfkgkhkikikjjxjRkkkljxjxjxjyjSkmknkokpiYaOaHadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHkqiZiZkriZiZiZksiZiZiZktiZiZjFkujGkviZiZiFhRhpkwcpcpcpcpcpcpcpcpiYiYiYkxkykhkhkzkAkBkhkpjhjhkCkCjhiYaOaHadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZkDjojojojojojojojojojojokEkFjGkGiZcmkHkIkJkKkHcdcdcdcdcdcdcdkLceiYjhkMkNjSjhjSkNkMjhjhkOkPkPjgiYaOaHadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHkQiZkRkSkTkUkVjGjGjGjGjGkVjGjGjGjGkWiZcoiFichpidiFdEaHaHaHaHaHaHaHbDiYkXkYjjjgjSkZjjlalbkCjAjQjxlciYaOaHadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoaPjFkSkSkSjGjGjGjGjGjGkSkSjGjGjGldiZcoiFichpiGiFaOaHadadadadadaHbDiYlejxjxlfjSlglhlhlijzljlklllmiYaOaHadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZlnjGkVjGjGlojGjGjGkVjGjGlpkVjGlqiZcoiFichpidiFaOaHadadadadadaHbDiYlrjxlsltjSjAlulsjylvlwlxjxlyiYaOaHadadadadadadadadaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZlzkdkdkdkdkdkdkdlAkdkdlBlCjGjGlqiZcoiFichpidiFaOaHadadadadadaHbDiYlDlEkhlFjSlGkilElHjhlIlJkhlKiYaOaHadadadadadadadadaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZiZlLiZiZiZlMiZiZiZlNiZiZjFjGjGlOiZcoiFichpidiFaOaHadadadadadaHbDiYiYiYiYiYiYiYaPiYiYiYiYiYiYiYiYaOaHadadadadadadadadaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaHcoiZlPjllQiZlRjllSiZlTjllUiZjFjGkVlViZcoiFichpidiFaOaHadadadadadaHcckLkLkLkLkLkLlWkLlXaOaOaOaOaOaOaOaOaHadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaadadadadadadadadadaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadaeadadaHcoiZjDjEjliZjDjEjliZjDjEjliZjFjGkVlViZcoiFichpidiFaOaHadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaHcoiZjkjljmiZjkjljmiZjkjljmiZlYlAkdlZiZcoiFichpidiFaOaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaHcoiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZaPiZcoiFichpiGiFdEaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaHcchzhzhzhzhzhzhzhzhzhzhzhzhzmahzhGcdcdcwiFichpidaPaOaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaHaHaHaHaHaHaHmbmbmbmcmcmcmcmcmcmcmcmcaPmciFichpidiFigaHadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadmdmemfmgaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemcmhmcmimjmkmkmlmmmjmjmjmjmmmjmnmompmqmcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadmrmsmtmuaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemvmwmvmxmomomomomomomomomomomomomomomymcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadaemzmfmfmAaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemcmwmcmxmomomomomomomomomomomomomomomBmcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemCmcmcmcmDmomomEmFmGmGmHmHmGmGmFmImomomymcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemcmhmcmJmomomKmcmLmMmcmcmNmMmcmOmomomymcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemPmwmPmxmomompmjmQmQmRmRmQmQmjmnmomomymcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemcmwmcmxmomomomomomomomomomomomomomomymcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemCmcmcmcmSmomomomomomomomomomomomomomomBmcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaabababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaemcmhmcmJmomomomomomomomomomomomomomomymcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaemTmwmTmUmFmFmFmFmVmFmFmFmFmWmFmFmFmXmYmcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaemcmwmcmcmcmZnamZmcmZmZmZmZmcmZnamZmcmcmcadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaemCmcmcmcaaaamZmwmZaaaaaaaaaaaamZmwmZaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeadaaaamZmwmZaaaaaaaaaaaamZmwmZaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaaaaaamZnamZaaaaaaaaaaaamZnamZaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababnbnbnbnbnbabnbnbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababnbncndnenbnbnbnfnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababnbncnfnfnfnfnfnfnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababnbncndnenbnbnbnbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababnbnbnbnbnbababababaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +ababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacabababacacacacabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababacacabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaacacacacacabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaacacacacacacacacacabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababacacacacacacacacacababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababacacacacacacacacacababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababacacacacacacacacacababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababacacacacacacacacacacababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababacacacacacacacacacacababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababacacacacacacacacacacababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababacacacacacacacabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababacacacacacacacabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababacacacacacacacacababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababacacacacacacababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababacacacacababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababacacacacababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index 0b38e7c8fdb..69cf9c74098 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -13,7 +13,6 @@ "am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/hardsuit/syndi,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) "an" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) "ao" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) -"ap" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) "aq" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) "ar" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) "as" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/empgrenade,/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate2) @@ -513,14 +512,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahajajahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaoajajajaoahajajahaoajajajaoahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahajajajajajahajajahajajajajajahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaoajapajaoahajajahaoajajajaoahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaoajajajaoahajajahaoajajajaoahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahajajajajajahajajahajajaqajajahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaoajajajajarajajarajajajajaoahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahajajajajajarajajarajajaqajajahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahajajahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahasananananahajajahanatanananahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahanajajajatahaqajahatajajajanahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahanajaqajanahajajahanajapajanahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahanajaqajanahajajahanajajajanahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahanajajajanahajaqahanajajajanahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahauajaqajajarajajavajajajajanahababababababababababababababababababababababababababababababababababababawaxayayayayayayayayayayayayazaAabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahanajajajajarajajarajajajajaBahababababababababababababababababababababababababababababababababababababaCaDaDaDaDaDaDaDaDaDaDaDaDaDaDaCabababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm index d53e4a638f1..fc781964732 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm @@ -65,7 +65,7 @@ "abm" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/paper/hydroponics,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abn" = (/obj/structure/table,/obj/machinery/computer/libraryconsole/bookmanagement,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abo" = (/obj/machinery/computer/arcade,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"abp" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prison) +"abp" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel,/area/security/prison) "abq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abs" = (/obj/structure/holohoop{pixel_y = 29},/obj/item/toy/beach_ball{icon = 'icons/obj/basketball.dmi'; icon_state = "basketball"; item_state = "basketball"; name = "basket ball"},/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/security/prison) @@ -137,7 +137,7 @@ "acG" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/security/prison) "acH" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/security/prison) "acI" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/prison) -"acJ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"acJ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/item/device/radio/intercom{desc = "Talk through this. It looks like it has been modified to not broadcast."; dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = -28; prison_radio = 1},/obj/machinery/camera{c_tag = "Prison Chamber"; dir = 1; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison) @@ -476,9 +476,9 @@ "ajh" = (/turf/simulated/wall/r_wall,/area/engine/gravity_generator) "aji" = (/obj/machinery/conveyor{dir = 2; id = "garbage"; layer = 2.7},/obj/machinery/door/poddoor/preopen{id = "Disposal Exit"; layer = 3.1; name = "disposal exit vent"},/turf/simulated/floor/plating,/area/maintenance/disposal) "ajj" = (/obj/machinery/button/door{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/machinery/button/massdriver{id = "trash"; pixel_x = -26; pixel_y = -6},/obj/structure/bed/stool,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) -"ajk" = (/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/disposal) +"ajk" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fore) "ajl" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) -"ajm" = (/obj/effect/decal/cleanable/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) +"ajm" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/disposal) "ajn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/engineering{name = "Fore Port Solar Access"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "ajo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) "ajp" = (/obj/structure/table,/obj/item/stack/medical/ointment{pixel_x = 3; pixel_y = -2},/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/restraints/handcuffs/cable/pink,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -733,7 +733,7 @@ "aoe" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "aof" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler,/turf/simulated/floor/plating,/area/maintenance/disposal) "aog" = (/obj/machinery/door/window/eastright{dir = 4; name = "Danger: Conveyor Access"; req_access_txt = "12"},/obj/machinery/conveyor{dir = 10; icon_state = "conveyor0"; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"aoh" = (/obj/machinery/power/apc{dir = 2; name = "Disposal APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/disposal) +"aoh" = (/obj/effect/decal/cleanable/oil,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/obj/machinery/light/small{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/disposal) "aoi" = (/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aoj" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aok" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -774,7 +774,7 @@ "aoT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fore) "aoU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) "aoV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fore) -"aoW" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fore) +"aoW" = (/obj/machinery/power/apc{dir = 2; name = "Disposal APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable/yellow,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/disposal) "aoX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fore) "aoY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fore) "aoZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fore) @@ -1067,7 +1067,7 @@ "auA" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/starboard) "auB" = (/obj/structure/closet/crate/hydroponics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) "auC" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/starboard) -"auD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/starboard) +"auD" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fore) "auE" = (/obj/structure/closet,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plating,/area/maintenance/starboard) "auF" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboard) "auG" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/gravity_generator) @@ -1728,7 +1728,7 @@ "aHl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "aHm" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "aHn" = (/obj/machinery/door/airlock{id_tag = "Cabin7"; name = "Cabin 1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep) -"aHo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep) +"aHo" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aHp" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep) "aHq" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/item/clothing/under/assistantformal,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "aHr" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/obj/item/weapon/wrench,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) @@ -1968,7 +1968,7 @@ "aLR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aLS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aLT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"aLU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aLU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aLV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aLW" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/device/gps{gpstag = "AUX0"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/storage/primary) "aLX" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary) @@ -2092,7 +2092,7 @@ "aOl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aOm" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_x = -2; pixel_y = 3},/obj/machinery/button/door{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aOn" = (/obj/machinery/button/door{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engine/engineering) -"aOo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering) +"aOo" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/starboard) "aOp" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering) "aOq" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engine/engineering) "aOr" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) @@ -2787,7 +2787,7 @@ "bbE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bbF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "panelscorched"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bbG" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/under/assistantformal,/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/item/clothing/suit/hooded/wintercoat,/obj/item/clothing/shoes/winterboots,/turf/simulated/floor/plasteel{icon_state = "vault"},/area/crew_quarters/locker) -"bbH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bbH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/starboard) "bbI" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bbJ" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bbK" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage) @@ -3575,7 +3575,7 @@ "bqM" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqN" = (/obj/machinery/reagentgrinder,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqO" = (/obj/structure/table/wood,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/machinery/camera{c_tag = "Bar - Backroom"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bqP" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bqP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "bqQ" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Bar Delivery"; req_access_txt = "25"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/bar) "bqR" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=1"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/crew_quarters/bar) "bqS" = (/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -3897,7 +3897,7 @@ "bwW" = (/obj/machinery/computer/arcade,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bwX" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/starboard) "bwY" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/starboard) -"bwZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/starboard) +"bwZ" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering - Particle Accelerator"; dir = 2; network = list("Singulo","SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering) "bxa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/starboard) "bxb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;25;46"},/turf/simulated/floor/plating,/area/maintenance/starboard) "bxc" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/hallway/primary/starboard) @@ -4914,7 +4914,7 @@ "bQz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/hallway/primary/central) "bQA" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bQB" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) -"bQC" = (/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"bQC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bQD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bQE" = (/obj/machinery/door/window/northleft{dir = 8; name = "Jetpack Storage"; pixel_x = -1; pixel_y = 0; req_access_txt = "19"},/obj/structure/window/reinforced,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = 4; pixel_y = -1},/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = 0; pixel_y = 0},/obj/item/weapon/tank/jetpack/carbondioxide{pixel_x = -4; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) "bQF" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/teleporter{name = "\improper Teleporter Room"}) @@ -6345,7 +6345,7 @@ "csa" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "csb" = (/obj/structure/lattice/catwalk,/obj/item/weapon/wrench,/turf/space,/area/space) "csc" = (/obj/structure/bed/stool,/turf/simulated/floor/wood{icon_state = "wood-broken7"},/area/maintenance/aft{name = "Aft Maintenance"}) -"csd" = (/turf/simulated/floor/wood{icon_state = "wood-broken6"},/area/maintenance/aft{name = "Aft Maintenance"}) +"csd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/engine/engineering) "cse" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "csf" = (/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/medical/surgery) "csg" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) @@ -6985,7 +6985,7 @@ "cEq" = (/turf/simulated/wall,/area/medical/morgue) "cEr" = (/obj/structure/bodycontainer/morgue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cEs" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) -"cEt" = (/obj/machinery/camera{c_tag = "Morgue"; dir = 2; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"cEt" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/construction) "cEu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cEv" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cEw" = (/obj/machinery/alarm{pixel_y = 32},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) @@ -8371,17 +8371,30 @@ "deY" = (/obj/structure/cable{tag = "icon-0-4"; icon_state = "0-4"},/obj/machinery/power/tesla_coil,/turf/simulated/floor/plating/airless,/area/space) "deZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering) "dfa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering) -"dfb" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering - Particle Accelerator"; dir = 2; network = list("Singulo","SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering) +"dfb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "dfc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engine/engineering) "dfd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) "dfe" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering) "dff" = (/obj/item/weapon/wirecutters,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) "dfg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) +"dfh" = (/obj/structure/sink/kitchen{pixel_y = 28},/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/crew_quarters/bar) "dfi" = (/obj/machinery/camera/emp_proof{c_tag = "Aft Arm - Near"; dir = 4; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/space) "dfj" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tesla_coil,/turf/simulated/floor/plating/airless,/area/space) "dfk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating/airless,/area/space) "dfl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/space) "dfm" = (/obj/structure/cable{icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/space) +"dfn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/starboard) +"dfo" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/security/vacantoffice) +"dfp" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"dfq" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"}) +"dfr" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"dfs" = (/obj/structure/bed/stool,/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) +"dft" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) +"dfu" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood{icon_state = "wood-broken6"},/area/maintenance/aft{name = "Aft Maintenance"}) +"dfv" = (/obj/machinery/camera{c_tag = "Morgue"; dir = 2; network = list("SS13","Medbay")},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"dfw" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"dfx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"dfy" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8462,17 +8475,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaekaekafKaekaekaafaafabbabbabbabbaaxafLafMafNafOafPafQafRafMafSafTafUafVafWafXafMafYafZagaagbagcaafaewagfageaghaggagjagiagWaewaafagkaglagmagnagoagpagqagragsaafaeFagtaguagvaeFaaaagwagwagwacSagxagyagzagAagAagBagAagCagDagEagFagFagFafIafJafJafJafJafJafIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaagaafacoacoacoacoacoaafabUaafacoacoacoacoacoaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaafagGagHagIagJagGaafaaaaaaaaaaafaaaaaxaaxagKagLagMaaxagNagOagNabgabgabgabgagPagQagRagSagTagUagVaaxaafaewagXageagZagYahaagiahIaewaafahbahcahdaheahfahgahdahhahbaafaeEagtahiagvaeEagwagwahjahkacSacSacSahlahmahnahnahoahpahqahrahrahsahtafIafJafJafJafJafJahuacSacSacSaaaaafaaaaaaaaaaaaaaaaaiaaaaaaaaaaafaaaaaaaaaabUaaaaaaaafaaaaaaaafaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafahvahvahwahwahwahwahwagGahxahyahzagGaafaafaafaafaafaaaaaaaaxaaxagcaaxaaxaaxagcaaxaaxahAahBahCahDahEahFahGahHahHahHaecaecaewahKahJahMahLahNagiahOaewaafaedahPahQahRahSahTahUavjaedaafaeEagtahiagvaeEahWagwahXahYahZaiaacSaibahmahnaicaidaidaidaieahraifaigaihafJafJafJafJafJaiiaijaikacTaaaaafaafaafaafaafaafaagaafaafaafaafaafaaaaaaabUaaaaaaaaaaaaaaaaafaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaailaimahwainaioaipaiqagGairaisaitagGaiuaivaiuaiuaafaafaaaaaaaaaaafaaaaaaaaaaafaafaiwaixaiyaixaizaiAaiBaiCahHaOvaiEaiFaecaewaiGahVaiIaewaewajyaewaewaiJaedaedaiKaiLaiMaiNaiOaedaedaiJaiPaiQaiRaiSaeEagwagwaiTaiTaiUaiVacSaiWahmaiXaiYaiZaiZajaajbajcajdajeacTafJafJafJafJafJacTajfajgacTaaaaafaaaaafaaaajhajhajhajhajhajhajhaafaafaafabUaafaafaafaafaafaagaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafahvajiahvajjajkajlajmagGagGajnajoagGajpajqajraiuaiuaafaafaafaafaafaafaafaafaafaafajsahDahDahDahDajtajuajvahHajwajxajzaecbinakJajBajCajDajEajFajGaecajHajIajJajKajLajMajNajOajJajPajQaiPajRajSajTaeEajUaiTaiTajVaiTagwacSajAajXajYajZakaakaakbajbajgakcajeacTafJafJafJafJafJacTakdakeacTaafaafaafaafaafajhakfakgakhakiakfajhaafaaaakjakkakjaaaaaaaafaaaaaaaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaailaimahwainaioaipaiqagGairaisaitagGaiuaivaiuaiuaafaafaaaaaaaaaaafaaaaaaaaaaafaafaiwaixaiyaixaizaiAaiBaiCahHaOvaiEaiFaecaewaiGahVaiIaewaewajyaewaewaiJaedaedaiKaiLaiMaiNaiOaedaedaiJaiPaiQaiRaiSaeEagwagwajkaiTaiUaiVacSaiWahmaiXaiYaiZaiZajaajbajcajdajeacTafJafJafJafJafJacTajfajgacTaaaaafaaaaafaaaajhajhajhajhajhajhajhaafaafaafabUaafaafaafaafaafaagaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafahvajiahvajjajmajlaohagGagGajnajoagGajpajqajraiuaiuaafaafaafaafaafaafaafaafaafaafajsahDahDahDahDajtajuajvahHajwajxajzaecbinakJajBajCajDajEajFajGaecajHajIajJajKajLajMajNajOajJajPajQaiPajRajSajTaeEajUaiTaiTajVaiTagwacSajAajXajYajZakaakaakbajbajgakcajeacTafJafJafJafJafJacTakdakeacTaafaafaafaafaafajhakfakgakhakiakfajhaafaaaakjakkakjaaaaaaaafaaaaaaaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaahwaklbnhaknakoakpakqakraksaktakuaiuakvakwakxakyaiuaafaaaaaaaafaaaaaaaaaagwagwagwajsakzakAakBakCakDakEakFahHaiDajxakHaecakIakJakKakLakMakNakOakPakQakRakSakTakUakVakWakXakYakZalaalbalcaldalealfaeEalgalhalialjalkagwallalmahmalnaiYaloaiZalpajbalqajdalralsafJafJafJafJafJaltalualvalwalxalwaaaaafaaaajhalyalzakfalzalAajhaafaaaalBalCalBaaaaaaaafaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaahvalDahvalEalFalGalHahvalIalJalKalLalMalNalOalPaiuaafalQalQaivalQalQaaaagwalRalRajsalSalTalUalValWakmajWalXakGalZakGambamaamaamcamfamgamhamiamiamdamjameammamnamoampamqamramsamtamuamvamwamxamyaeEamzaiTaiTamAahYagwamBalmahmagFamCamDamEamFamGamHajdamIamJafJafJafJafJafJamKacSamLalwamMamNacnacnaafajhamOamPamQamRamSajhaafakjalBamTalBakjaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafahvamUamVamVamVamWamXahvamYamZanaaiuanbancandaneaiualQalQanfangakualQagwagwanhaniajsanjankanlanmannanoanpahHanqanransaecantanuanvanwanxanyanzanAahHanBanCanDamnanEanFboYanHanIanJanKaiPaiPanLaeEaeEagwagwagwanMagwagwagwanNanOagFagFanPanQanRanSanSanTamIamJafJafJafJafJafJamKanUanValwamNalwalwalxalwajhanWanXakfanYanZajhaafalBalBalCalBalBaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaobaaaaaaaoaaaaaoaaaaaaaaafaafaafaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaahvaocaodaoeaofaogaohahvaoiamZaojalQaokaojaojaojaolalQaomaonaooaopalQaoqaoraosaotaouaovaowaoxaoyaozaoAaoBaecajDaoCajDaecaecaoDaoEaoDaecamlamkaoHaoIaoJanCaoKaoLamnaoMaoNaoOaoPanJaoQaoRaoSaoTaoUaoVanGaoWaoXaoYaoZaoXapaapbapcapdapdapeapfapgaphaphaphapiamJafJafJafJafJafJamKapjapkalwanVaplapmapnapoajhappapqaprapsaptajhaafapuapvapwapxapuaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaoaaafaafaoaaoaaoaaafaaaaoaaoaapyaoaaoaaaaaafalQalQaivalQaafaaaaafaafaafaafaafalQaivahvahvapzapAapBahvahvahvalIapCalKapDalMapEapFaojapGalQalIapHapIalQalQapJapKaoFapLajsajsajsahDahDapMapNapOapPapQapRapSapTapUapVanyaoGaecajFapWapYahHapZanCaqaaqbaqcaqdaqeboZaqganJaqhaqiaqiajJajJajJajJaqjagwagwagwagwagwaqkaqlapXaqnaqoaqpaqqaqraqsaqtaquaqvaqwaqwaqwaqwaqwaqxaqfaqzalwapkapkapkapkaqAajhaqBaqCaqDaqEaqFajhaafapuaqGaqHaqIapuaaaaafaafaafacnaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaobaaaaaaaoaaaaaoaaaaaaaaafaafaafaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaahvaocaodaoeaofaogaoWahvaoiamZaojalQaokaojaojaojaolalQaomaonaooaopalQaoqaoraosaotaouaovaowaoxaoyaozaoAaoBaecajDaoCajDaecaecaoDaoEaoDaecamlamkaoHaoIaoJanCaoKaoLamnaoMaoNaoOaoPanJaoQaoRaoSaoTaoUaoVanGauDaoXaoYaoZaoXapaapbapcapdapdapeapfapgaphaphaphapiamJafJafJafJafJafJamKapjapkalwanVaplapmapnapoajhappapqaprapsaptajhaafapuapvapwapxapuaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaoaaafaafaoaaoaaoaaafaaaaoaaoaapyaoaaoaaaaaafalQalQaivalQaafaaaaafaafaafaafaafalQaivahvahvapzapAapBahvahvahvalIapCalKapDalMapEaHoaojapGalQalIapHaLUalQalQapJapKaoFapLajsajsajsahDahDapMapNapOapPapQapRapSapTapUapVanyaoGaecajFapWapYahHapZanCaqaaqbaqcaqdaqeboZaqganJaqhaqiaqiajJajJajJajJaqjagwagwagwagwagwaqkaqlapXaqnaqoaqpaqqaqraqsaqtaquaqvaqwaqwaqwaqwaqwaqxaqfaqzalwapkapkaOoapkaqAajhaqBaqCaqDaqEaqFajhaafapuaqGaqHaqIapuaaaaafaafaafacnaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaqJaafaoaaafaqJaafaoaaoaaafaoaaoaaoaaoaaoaaaaaaaaaaalQaqKaqLalQaqMaqNaqNaqNaqNaqNaqOalQaomaqPalQaqQaqRalIaqmaqTalQaqUaqVaqWalQaokapHaqXaqYaqZalQaraapFarbalQarcapKahjardareagwarfajsargarhannapNapOaecariarjarkarlarlarmarnaroarpajFarqarrarsartaruarvarwarxaryarzarAarzarBarCarDarEarEarFarGajJaqjagwarHarIarJarKarKarKarKarKarLarMarNarKarKarKarKarKarOalwarParQarRalwalwapkalwarSarTarUapkarVarWarXarYarZasaasbajhalxapuascasdaseapuaaaaafaaaaaaacnaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaafaoaaafaoaaoaaoaapyaafaafaafaoaaoaaafaaaaafaafaivasfasgashasiasjasjasjasjasjaskaslasmasnasoaspasqasjasrassasjastasuagwagwagwagwagwagwagwagwagwagwasvagwaswagwagwagwagwagwagwajsasxasyannapNapOapPaszasAasBasCasDasEasFasGaoIajFasHasJasKasIasMasNasOasPasQasRasSasTasUasVaqiasWasXasWasYajJasZataatbatcaiTarKatdateatfatgathatiatjarKatkatlatmarKalwalwasLaqyatnapjalwapkalwarRapkatoapkalwatpatqajhajhatratsajhattapuapuatuatvapuatwalxatwatwatxatwaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaoaaoaaoaaoaaafaoaaoaaafaqJaoaaoaaafaafaafaafalQalQatyalQalQatzatAatAatAatAatAatBalQalQalQalQatCatDatEatEatEatNatFatGagwatHatIatJatKatLatMatPatOaubatQatRatSagwatTatUatUatUatVajuatWatXannatYatZauaanxavmanxaecaecaucaudanxaecaueaiHahHahHajJaufaugauhaufajJauiaujajJaukaqiaqiaulaulaulajJajJaumagwaiTaunauoarKaupauqaurausautauuauvauwauxauyauzarKauAalwauBauCauDauEalwapnalwalwalwauFalwalwauGauHauIajhajhajhajhapnapjapkauJauKatwauLauMauNatwanVatwaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaafaoaaoaaoaaoaaoaaoaaoaaoaaoaaoaaoaauOaoaaafaqJalQalQalQauPauQalQaafaafaafaafaafaafaafaafaafaafaafalQanfauRaojalIauSalIauTauUauVauWauXauYagwagwagwauZavaavaavaavbagwagwavcavdaveavfavcajuajuahDavgavhalYaviaviayhavkaviaviavlazsaviavnaviavoavpavqavravkavsavtaviaviaviavkaviavuajsavvavwavwavwavwahDaqjagwauoaiTaiTarKarKarKarKarKavxavyavzavAavBarKarKarKavCalwapjavDatoapkalwapkalwavEalwavFavGavHavIavJavKavLavMavNavOavPavQavNavRapkapkavDapkavSatxavTatxacnacnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaoaaoaaoaaoaaafaoaaoaaafaqJaoaaoaaafaafaafaafalQalQatyalQalQatzatAatAatAatAatAatBalQalQalQalQatCatDatEatEatEatNatFatGagwatHatIatJatKatLatMatPatOaubatQatRatSagwatTatUatUatUatVajuatWatXannatYatZauaanxavmanxaecaecaucaudanxaecaueaiHahHahHajJaufaugauhaufajJauiaujajJaukaqiaqiaulaulaulajJajJaumagwaiTaunauoarKaupauqaurausautauuauvauwauxauyauzarKauAalwauBauCbbHauEalwapnalwalwalwauFalwalwauGauHauIajhajhajhajhapnapjapkauJauKatwauLauMauNatwanVatwaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaafaoaaoaaoaaoaaoaaoaaoaaoaaoaaoaaoaauOaoaaafaqJalQalQalQauPauQalQaafaafaafaafaafaafaafaafaafaafaafalQanfauRaojalIauSalIauTauUauVauWauXauYagwagwagwauZavaavaavaavbagwagwavcavdaveavfavcajuajuahDavgavhalYaviaviayhavkaviaviavlazsaviavnaviavoavpavqavravkavsavtaviaviaviavkaviavuajsavvavwavwavwavwahDaqjagwauoajkaiTarKarKarKarKarKavxavyavzavAavBarKarKarKavCalwapjavDatoapkalwapkalwavEalwavFavGavHavIavJavKavLavMavNavOavPavQavNavRapkapkavDapkavSatxavTatxacnacnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqJaafaoaapyaoaaoaaoaaoaavUaafaoaaoaaoaaoaaoaaoaavVavWavVavXavYalQalQaafaaaaaaaaaaaaaaaaaaaaaaaaaafalQalQalQapFalIavZalIawaawbawcawdaweawfagwaaaaafaaaaaaaaaaaaaaaaafaaaawgawhawiawjawkawlavwawmawnawoawpawqawqawrawpawqawqawsazHawtawuawvawwawxawyawqawzawAawBawCawCawDawEawFawGawHawIawJawKawLawMahDaqjagwawNahjawOarKawPawQawRatgathatiawSarKawTateawUarKawValwalwalwauFalwalwapkalwaqzalwawWatwatwatpawXajhatwatwatwatwatwatwatwatwatwanUatwatwatwatwatwawYatwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaoaaoaaoaaoaaoaaoaaoaaoaaoaaoaaafaoaaoaaoaaafalQalQalQawZawfaojalQaaaaxaaxbaxcaxbaxdaafaafaafaafalQaxealQaxfasjasjasjaxgaxhalQaxiaxjaxkagwaaaaxlaxlaxlaxlaxlaxlaxlaaaavcaxmaxnaxoavcajuajuahDaxpaxqaxraxsaxtaxuaxraxvaxtaxqaxwaxxaxyaxzaxAaxBaxCaxDaxEaxFaxGaxHaxIaxGaxJaxKaxLaxMaxNaxOaxPaxQaxRahDaqjaxSaxSaxSaxSaxSauzaxTaxUaxVaxWaxXauvaxYaxZayaauparKaybaycaydazIayfaADaygayeaBTayeayeayiayjaykaylaymaynayoaypayoayqayraysayraytatwatwatwayqayraytayuayuayoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaoaaoaaoaaoaaoaaoaaoaayvaoaaafaafaafaafalQalIawfaokaivaaaaywayxayyayxaywayzayzayzayAayAayAayAayBayAayAayCayCayCayCayDayCayEagwaafaxlayFayGayHayIayJaxlaaaavcayKayKayLavcaaaaaaayMayNayOayPahDayNayQayPahDayNayRayPahDaySajuayTahDajuayUayVajuajuayWayWayXayYayZayWayWazaahDahDahDahDahDaqjaxSazbazcazdaxSarKarKarKarKazeazfazgavAavBarKarKarKalwazhapjanUapkapkaziapkatwatwatwatwatwazjazkazlazmaznazoaznazpazqazrazqaZTayraztayrazuazqazrazqayuazvazwaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8481,14 +8494,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaoaaoaaoaaoaaoaaafaafaafaoaaoaaoaaaiaaaaafaafaafalQalQalIalIaJSaivaaaaaaaxcazzazzazzaxcayzaCjaCkaClaAVaATaCmaCnaCoayAaCpaCqaCraCsaCtayCayEagwaafaxlaCuaCvaCwaCxaCyaxlaaaavcaCzaCzaCzavcazTaCAabbaCBaCCaCDajsaCBaCCaCDajsaCBaCCaCDajsaCEaCFaCGajsajsayUaCHajsaCIayWaCJaCKaCLaCMaCNaCOazaaCPagwagwagwaCQagwaxSaCRaCSaxSaxSaCTaCUaCVaCWaCXaCYaCZavAaDaaDbatmarKaDcaDdatwaDeaDfaDgaDgaDhaDiazkaDjaDkaDlaDlaDlaDmaDnaDoaDpaDqaIKaIMaILaINaILaILaINaILaILaINaILaILaLwaoaayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaDraDsaDraagaaaaafaaaaafalQaDtaDuakuawfalQalQaaaaywaDvaDwaDxaywayzayzayzayAaDyaATaDzaCnaDAayAaDBaDCaDDaDEaDFayCayEagwaaaaxlaDGaDHaDIaDJaxlaxlaaaaDKaDLaDLaDLaDMaDNaDOaDNaDPaDQaDPaDRaDPaDQaDPaDSaDPaDQaDPaDTaDUaDVaDWaDXaDYaDZaEaajsavwazaaEbaEcaEdaEeaEfaEgazaaEhaxSaEiaEjaEkaElaElaEmaEnaEoaEpaEqaEraEsaEtaEuaEvauvaEwaExaEyaEzarKaMbavRatwaEAaEBaECaEDaEEaEFaEGaEHaEIaEJaEJaEJaEKaELaDoaDpaDqaoaaLyaoaaPUaoaaoaaPUaoaaoaaPUaoaaoaaSGaoaayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafaafaaaaDraEMaDraafaafaafaafaafalQaMzaojaojaEOaEPalQaaaaEQaxbaERaxbaESaafaafaafayzaETaEUaEVaEWaEXayAaEYaEZaMAaFbaFcayCayEagwaaaaafaaaaFdaFeaFfaaaaafaaaaDNazTazTazTaDNaDNaFgaFhaDVaFiaFjaFkaFlaFmaFmaFnaFmaFoaFlaFpaFqaFraFsaFtaFuaFvaFwajsavwazaazaaFxaFyazaaFzazaazaaCPaxSaxSaxSaFAaFBaFCaFDaFEaFFaFGaFHaFIaFJaFKaFKaFLaFMarKarKarKarKarKaIFaMBatwaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaFZaGaaDoaDpaDqaDqaLyaGbaaaaaaaaaaaaaGbaaaaaaaGbaoaaSGaafayoaGcaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaafaaaaDraDsaDraDraGdaGdaGdaDraDraDraDraDraGeaGfalQaaaaaaaaaaaaaaaaaaaaaaaaaafayzaGgaGhaGiaGjaGkayAaGlaGmayCayCayCayCaGnagwaGoaGpaGqaGraGsaGtaGuaGvaGoaDNaGwaGxaGxaGyaGzaGAaGBaGCaGDaGEaGFaGGaGHaGIaGJaGHaGKaGLaGMaGNaGOaGPaGQaGRaGSaGTajsavwaGUazaaGVaGWazaaGXaGYaoZaGZaxSaHaaHbaHcaHdaxSaHeaMEaHgaxSaHhaHiaHjaHkaHjaHlaHmaHnaHoaHpaHqarKaZxaOUatwaHraHsaHtaHuaHvaBZaHwaHxaFVaHyayoayoaHzaHAayoaDqaDqaDqaLyaaaaaaaaaaaaaaaaHBaaaaaaaaadeYaTNaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaDraDraHCaHDaHEaHFaHFaHGaHHaHIaHJaHKaDraDrawfalQaaacYLcYMcYMcYMcYMcYMcYNaafayAayAayAaHLaHMayAayAaHNaHOaHPaHQaHRaHSaHTaHUaHVaHWaHXaHYaHZaHXaIaaIbaIcaDNaIdaIeaIfaIgaIgaIhaIgaIgaIgaIgaIgaIgaIgaIgaIhaIgaIiaIjaIkaIlaImaImaInaInaInaInaInaImaIoaImaIpaIpaIpaIpaIqaIpaCPaxSaxSaxSaIraIsaxSaItaxSaIuaxSaIvaIwaIxavAaVHaWraIAavAaIBaICaIDarKaIEaIFatwayoayoayoayoayoaBZaIGaIHaFVaIIayoaIJdfadeZdfbdeZdfcaDqaLyaaaaaaaafaafaafaafaafaaaaaaaoaaSGaoaayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaobaobaobaobaobaobaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaafaaaaDraDsaDraDraGdaGdaGdaDraDraDraDraDraGeaGfalQaaaaaaaaaaaaaaaaaaaaaaaaaafayzaGgaGhaGiaGjaGkayAaGlaGmayCayCayCayCaGnagwaGoaGpaGqaGraGsaGtaGuaGvaGoaDNaGwaGxaGxaGyaGzaGAaGBaGCaGDaGEaGFaGGaGHaGIaGJaGHaGKaGLaGMaGNaGOaGPaGQaGRaGSaGTajsavwaGUazaaGVaGWazaaGXaGYaoZaGZaxSaHaaHbaHcaHdaxSaHeaMEaHgaxSaHhaHiaHjaHkaHjaHlaHmaHnbqPaHpaHqarKaZxaOUatwaHraHsaHtaHuaHvaBZaHwaHxaFVaHyayoayoaHzaHAayoaDqaDqaDqaLyaaaaaaaaaaaaaaaaHBaaaaaaaaadeYaTNaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaDraDraHCaHDaHEaHFaHFaHGaHHaHIaHJaHKaDraDrawfalQaaacYLcYMcYMcYMcYMcYMcYNaafayAayAayAaHLaHMayAayAaHNaHOaHPaHQaHRaHSaHTaHUaHVaHWaHXaHYaHZaHXaIaaIbaIcaDNaIdaIeaIfaIgaIgaIhaIgaIgaIgaIgaIgaIgaIgaIgaIhaIgaIiaIjaIkaIlaImaImaInaInaInaInaInaImaIoaImaIpaIpaIpaIpaIqaIpaCPaxSaxSaxSaIraIsaxSaItaxSaIuaxSaIvaIwaIxavAaVHaWraIAavAaIBaICaIDarKaIEaIFatwayoayoayoayoayoaBZaIGaIHaFVaIIayoaIJdfadeZbwZdeZdfcaDqaLyaaaaaaaafaafaafaafaafaaaaaaaoaaSGaoaayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaobaobaobaobaobaobaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaDraIOaIOaIOaHFaHFaHFaHFaHFaHFaIOaIOaIPaDrawfaivaaacYOcYPcYPcYPcYPcYPcYOaafaafaIQaIRaISaITaIUaIVaIWaIXaIYaIZaJaaJbaJcaJdaHSaJeaWIaJgaJhaJiaJjaJkaJlaJmaJnaJoaJpaJqaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaJraJsaJtaJuaImaJvaJwaJxaJyaJzaJAaJBaJCaJDaImaJEaJFaJGaJHaJIaIpaJJaxSaJKaJLaFBaIsaxSaJMaxSaJNaxSaJOaJPaJQaJRaJRaJRaJRaJRaJRaJRaJRaJRalwaXbatwaJTaJUaJVaJWayoaJXaEBaIHaJYaJZaKaaKbaKcaKdaKeaKfdfdaDqaLyaGbaafaafaKhaKiaKjaafaKkaaaaoaaSGapyayoazwaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaNiaNiaNiaNiaNiaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaDraKlaHFaHFaHFaHFaHFaHFaHFaHFaIOaIOaIOaKmaKnalQaaacYOcYPcYPcYPcYPcYPcYOaKoaIQaIQaKpaKqaKraKraKsaKtaKuaKvaKwaKxalQaKyalQalQalQalQaKzaKAaKBaKCaKDaKBaKAaKAaKAaKAaKEaaaaaaaKFaKFaKFaKFaKFaKFaKFaaaaaaaIgaKGaKHaKIaKJaKKaJBaKLaKMaKNaKOaKPaKQaKRaImaKSaKTaKUaKVaKWaIpaKXaxSaxSaxSaKYaKYaxSaxSaxSaxSaxSaKZaLaaLbaJRaLcaLdaLeaLfaLgaLhaLiaJRaLjaDdatwaJUaJUaLkaLlaLmaDfaLnaLoaLpaLqayoaLraLsaLtaLuaLvdffdfedfgaaaaaaaafcFGaLxaLzaafaaaaaadeYaTNaoaayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaobaobaobaobaobaobaOrbpcbpbaZAbpbbpdaQaaobaobaobaobaobaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaDraLAaHFaHFaHFaHFaLBaHFaLCaHFaHFaIOaLDaDraJSalQaaacYOcYPcYPcYPcYPcYPcYQaLEaLFaLEaLGaLHaLIaLJaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTaLUaLTaLVaKAaLWaLXaLYaLZaMabbsaMcaMdaMeaMfaMgaMgaMhaMiaMjaMkaMlaMmaMmaMnaMoaMpaGLaJuaImaMqaJBaMraJBaMsaJBaMtaJBaJBaImaMuaMvaKUaMwaMxaIpaMybbtbdkbbGaMCaMDbgcaMFaMGaMHaMIaMJaMKaMLaJRaMMaMNaMNaMNaMOaMPaMQaJRaMRaDdatwaMSaMSaMTaKeaLmaFOaMUaMVaMWaMXaMYaMZaNaaNbaNcaNdaKgaDqaLyaaaaNeaafaNfaNgaNhaafaafaGbaoaaSGaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaNiaNiaNiaNiaNjaTObrkbpebhBbpebrnbeuaNjaNiaNiaNiaNiaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacWlaaaaaaaGdaHFaHFaHFaHFaHFaHFaHFaHFaHFaHFaNkaDraDraNlalQaafcYOcYPcYPcYPcYPcYPcYRaNmaNnaNmaNoaLHaNpaNpaNqaNpaKuaNraNsaNtalQalQalQalQalQalQawfaKAaNuaNvaNwaNxaNyaNyaNyaNzaKEaaaaKFaNAaNBaNBaNBaNBaNBaNCaKFaaaaIgaNDaIjaIkaImaNEaNFaNGaJBaNHaJBaNIaNJaJBaNKaNLaNMaNNaNOaNPaIpaNQaNRaNSaNSaNSaNTaNUaNUaNVaNVaNWaNXaNYaNZaOaaObaOcaOcaOcaOdaOeaOfaJRaOgaDdatwaMSaOhaOiaOjayoaOkaEBaOlaFVaOmayoaOnaOoaOpaOpaOpaOqaDqaLyaaaaaaaafaafaafaafaafaaaaaaaoaaSGaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaVfaOsaOtaOtaOtaOtaOtbrobrobrpbrobroaOuaOuaOuaOuaOuaOwaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaDraLAaHFaHFaHFaHFaLBaHFaLCaHFaHFaIOaLDaDraJSalQaaacYOcYPcYPcYPcYPcYPcYQaLEaLFaLEaLGaLHaLIaLJaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTbQCaLTaLVaKAaLWaLXaLYaLZaMabbsaMcaMdaMeaMfaMgaMgaMhaMiaMjaMkaMlaMmaMmaMnaMoaMpaGLaJuaImaMqaJBaMraJBaMsaJBaMtaJBaJBaImaMuaMvaKUaMwaMxaIpaMybbtbdkbbGaMCaMDbgcaMFaMGaMHaMIaMJaMKaMLaJRaMMaMNaMNaMNaMOaMPaMQaJRaMRaDdatwaMSaMSaMTaKeaLmaFOaMUaMVaMWaMXaMYaMZaNaaNbaNcaNdaKgaDqaLyaaaaNeaafaNfaNgaNhaafaafaGbaoaaSGaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaNiaNiaNiaNiaNjaTObrkbpebhBbpebrnbeuaNjaNiaNiaNiaNiaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacWlaaaaaaaGdaHFaHFaHFaHFaHFaHFaHFaHFaHFaHFaNkaDraDraNlalQaafcYOcYPcYPcYPcYPcYPcYRaNmaNnaNmaNoaLHaNpaNpaNqaNpaKuaNraNsaNtalQalQalQalQalQalQawfaKAaNuaNvaNwaNxaNyaNyaNyaNzaKEaaaaKFaNAaNBaNBaNBaNBaNBaNCaKFaaaaIgaNDaIjaIkaImaNEaNFaNGaJBaNHaJBaNIaNJaJBaNKaNLaNMaNNaNOaNPaIpaNQaNRaNSaNSaNSaNTaNUaNUaNVaNVaNWaNXaNYaNZaOaaObaOcaOcaOcaOdaOeaOfaJRaOgaDdatwaMSaOhaOiaOjayoaOkaEBaOlaFVaOmayoaOncsdaOpaOpaOpaOqaDqaLyaaaaaaaafaafaafaafaafaaaaaaaoaaSGaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaVfaOsaOtaOtaOtaOtaOtbrobrobrpbrobroaOuaOuaOuaOuaOuaOwaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOyaOzaOAaaaaGdaHFaHFaHFaOBaHCaHFaOCaODaODaOEaOFaDranfawfalQaafcYOcYPcYPcYPcYPcYScYOaKoaIQaIQaOGaLHaOHaOIaOJaOKaOLaOMaONaOOaOPaOQaORaOSaOTalQbhDaKAaOVaNvaOWaOXaOYaOYaOZaPaaKEaaaaPbaPcaNBaPdaPeaPfaNBaPgaPbaaaaIgaIiaIjaIkaImaPhaPiaPjaPkaPlaPkaPmaPnaPoaImaPpaPqaPraPsaPtaIpaPuaPvaPwaPxaPyaPzaPAaPBaPCaPDaPEaPFaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaJRapjaDdatwayoayoayoayoayoaBZaPQaPRaPSaPTayoayoaHzaHAayoaDqaDqaDqaLyaaaaaaaaaaafaaaaaaaaaaaaaaadeYaTNaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOraPVaPWaPXaPXaPXaPXaPXaPXaPYaPXaPXaPXaPXaPXaPXaPZaPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaQbcWsaQbaaZaDraHFaHFaHFaHFaHFaHFaHFaHFaHFaQdaQeaDraqUaQfalQaaacYOcYPcYPcYPcYPcYPcYTaNmaQhaNmaNoaLHaNpaNpaNqaNpaKuaKvaQiaQjaQkaQlaQmaQnaQoalQaQpaQqaQraNvaNvaQsaQtaNvaQuaQvaKEaaaaQwaQxaQyaQzaQAaQzaQyaQBaQCaaaaIgaIiaQDaQEaImaQFaQFaQFaQFaQGaQFaQFaQHaQFaImaIpaQIaQJaQKaIpaIpaQLaPvaPxaPyaQMaQNaPvaPwaPyaPyaPxaQOaQPaQQaQRaQSaOcaOcaQTaOdaQUaQVaJRaQWaQXatwaQYaQZaRaaRbaRcaRdaEBaOlaFVaReaRfaRgaRhaRiaDoaDpaDqaDqaLyaGbaaaaaaaGbaaaaaaaaaaaaaGbaoaaSGaafayoaGcaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOraPVaQaaaaaaaaaaaaaaaaaaaaPYaaaaaaaaaaaaaaaaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaQbcWsaQbaaZaDraHFaHFaHFcEtaHFaHFaHFaHFaHFaQdaQeaDraqUaQfalQaaacYOcYPcYPcYPcYPcYPcYTaNmaQhaNmaNoaLHaNpaNpaNqaNpaKuaKvaQiaQjaQkaQlaQmaQnaQoalQaQpaQqaQraNvaNvaQsaQtaNvaQuaQvaKEaaaaQwaQxaQyaQzaQAaQzaQyaQBaQCaaaaIgaIiaQDaQEaImaQFaQFaQFaQFaQGaQFaQFaQHaQFaImaIpaQIaQJaQKaIpaIpaQLaPvaPxaPyaQMaQNaPvaPwaPyaPyaPxaQOaQPaQQaQRaQSaOcaOcaQTaOdaQUaQVaJRaQWaQXatwaQYaQZaRaaRbaRcaRdaEBaOlaFVaReaRfaRgaRhaRiaDoaDpaDqaDqaLyaGbaaaaaaaGbaaaaaaaaaaaaaGbaoaaSGaafayoaGcaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOraPVaQaaaaaaaaaaaaaaaaaaaaPYaaaaaaaaaaaaaaaaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnnaQbcWFaQbbnnaDraLAaIOaHFaHFaHFaHFaHFaRkaHFaRlaRmaDraRnaxgalQaaacYOcYPcYPcYPcYPcYPcWMaRoaRpaRoaRqaLHaNpaRraRsaRtaRuaRvaKuaRwaRxaRyaRzaRAaRBalQaRCaKAaRDaNvaNvaREaRFaRGaQuaRHaKEaaaaKFaRIaRJaQyaRKaNBaRLaRMaKFaaaaIgaRNaKHaKIaROaRPaRQaRQaRQaJDaRQaRQaRRaRSaImaRTaRUaRVaRWaRXaRYaRWaRZaSaaSaaSbaScaSdaSeaSfaSgaShaSeaSiaSjaJRaSkaSlaSmaSnaSoaSpaSqaJRasLaSratwaSsaStaSuaSvaSwaSxaSyaSzaSAaSBaSCaSCaSDaSEaDoaSFaDqdfiaLyaoadfjaoaaoadfjaoaaoadfjaoaaoaaSGaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaobaOraPVaQaaaaaaaaaaaaaaSHaSHaSIaSHaSHaaaaaaaaaaaaaOraPVaQaaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaSJaSKaSLaSMaSJaDraHGaIOaSNaSOaSPaHFaHFaHFaHFaRlaSQaDrawfaSRaivaaacYOcYPcYPcYPcYPcYPcYOaKoaIQaIQaSSaLHaNpaNpaNqaNpaKuaRvaSTaSUaRxaSVaSWaSXaSYalQavYaKAaSZaTaaTaaTbaTcaNvaQuaTdaKEaafaKFaKFaKFaTeaTfaTgaKFaKFaKFaafaIgaKGaThaIkaTiaTjaRQaRQaRQaTkaRQaRQaTlaJDaTiaMCaTmaTnaToaPwaTpaPwaPvaPxaPwaTqaPwaTraPxaPyaPwaPyaPxaTsaTtaJRaTuaTvaTwaTxaTyaLhaMQaJRaTzaDdatwaTAaTBaTCaTDaTEaTFaTGaTHaTIaTJaTKaTKaTLaTMaDoaDpaDqaIKdfkaILdflaILaILdflaILaILdflaILaILdfmaafayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaTOaPVaQaaaaaaaaSHaSHaSHaSHaTPaTQaSHaSHaSHaaaaaaaOraPVaTRaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaSJaTSaTTaTUaTVaDraTWaIOaTXaTYaTZaIOaIOaIOaUaaUbaUcaDraUdaUealQaafcYVcYWcYPcYPcYPcYYcYXaafaafaIQaSSaUfaLIaLJaUgaUhaUiaUjaUkaUlaUmaUmaUmaUmaUmalQaUnaUoaUpaUqaUqaUraUsaUtaUuaUvaUwaaaaaaaaaaKFaKFaUxaKFaKFaaaaaaaaaaJraJsaUyaIkaUzaUAaJDaUBaUCaJDaJDaUDaUEaJDaUzaMCaUFaUGaUHaUIaUJaUIaUKaULaUMaUNaUIaUIaUIaUIaUIaUIaUOaUPaUQaJRaJRaJRaJRaURaJRaJRaJRaJRalwaDdatwaUSaUTaUTaRbaUUaUVaUWaUXaUYaUZaVaaVbaVcaVdaCfaVeayoaaaaafaafaaaaaaaaaaaaaafaaaaaaaafaafaoaazqayoazwaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaVfaVgaVhaViaVjaSHaSHaVkaVkaVlaVmaVnaVkaVkaSHaSHaVjaVoaVpaVqaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8496,7 +8509,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaWMaWNaWOaWPaWQaWRaWOaWSaWTaWUaWTaWVaWWaWTaWXaWYaWZaXabpaalQaaaaaacZecZdcZdcZdcZfaaaaafaVyaXcaSSaLHaNpaNpaXdaXeaKuaXfaXgaXhaXiaXjaXkaXlaXmalQawfaKAaKAaKAaKBaKBaXnaKEaXoaXpaKEaXqaXraXsaVRaXtaXuaXvaVRaXwaXxaXyaXzaXAaXBaXCaXDaXEaXFaXGaImaImaUzaXHaUzaImaImaTpaXIaXJaTpaXKaXLaXMaXNaXOaXPalwalwalwalwaXQalwalwalwalwalwalwaDdapjapkaXRaXRaXRaXRaXRaXRaXRaXSaXTaXUaXVaXSaXWaXXaXSaXYaXZaBZaBZaYaaYbaYcaznaYdaznaYeazqaYfazqayqayraYgayraytazqaYfazqayuazvaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOraPVaQaaaaaSHaSHaVkaYhaYiaYjaYkaYlaYmaYnaVkaSHaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaYoaYpaYqaYqaYraYqaYqaYqaYsaYtaYuaYvaYwaYwaYwaYxaYyaYzaYAalQaaaaaaaafaafaaaaaaaafaafaafaVyaYBaSSaLHaYCaNpaYDaYEaYFaYGaYHaYIaYJaYKaYLaYMaYNalQaYOaYPaYQaYRaYSaYTaYUaYVaYWaYXaYYaYZaZaaYZaZbaZcaZdaZeaZfaYZaZgaZhaZiaZjaZkaZlaZmaZnaZoaZpaZpaZpaZqaZraZpaZpaZsaZpaZtaZuaZpaZpaZpaZvaZwalwaZxaZyaZzbqTaZBaZCaZBaZDaZBaZEbrlbkcavRaqyapkaXRaZFaZGaZHaZIaZJaZKaXSaZLaZMaZMaZNaZMaZOaXSaZPaWwaZQaZRaZRaZRaZRaZRaZSayoaZTayraZUayrazuayoayoayoaZTayrazuayuayuayoaafaaaaaaaaiaagaaiaafaaiaagaagaaiaaiaagaagaagaaiaobaobaobaobaobaOraPVaQaaaaaSHaVkaVkaZVaZWaVkaZXaVkaZYaZZaVkaVkaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaYoaYobaaaYoaSJaYobabaYoaYpaYqbacbadaYobabaYobaebafbagbahalQalQalQalQaivaivaivalQalQalQaVybaibajbakbalbalbamaNpbanbaobapbaqaUmaUmaUmaUmbaralQalQbasalQalQbatbaubavbawbaxbaybazbawbaAbaBbaCbaybaDbawbawbawbaEbaFbaGbaHbaIbaJbaKbaLbawbawbawbawbaMbaNbawbawbazbaObaPbawbawbawbawbaQbaRbaSbaSbaSbaTbaSbaSbaSalwbaUalwaDdalwalwbaVbaVbaVbaVbaWbaXbaXbaYbaZbbaaXSbbbbbcbbdbbebbfbbgaXSbbhbbibbjaZRbbkbblbbmaZRbbnayoayoayoayoayoayoayobboayoayoayoayoayoaHAayoaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaobaOraPVaQaaaaaSHaVkbbpbbqbbrbskbtwbbubbvbbwbbxaVkaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaafaaaaafaaaaYobbyaYobbzbbzbbAbbBaYobbyaYoaYoaSJbbCbbDbbEasiasjbbFasjassasjbbHbbIaskbbJbbKbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbSbbVbbWbbXbbYbbZbcabcbbccbcdbcebcfbcgbchbchbcibcjbckbclbcmbcnbcobcpbcpbcpbcpbcpbcpbcpbcqbcrbcsbcsbcsbcsbcsbcsbcsbcsbctbcubcvbcwbcsbcxbctbcsbcsbcybczbcAbaSbcBbcCbcDbcEbcFbaSbcGbcHalwbcIalwaaabaVbcJbcKbaVbcLbcMbcNbcObcPbcQaXSbcRbcSbcTbcUbcVbcWaXSbcXbcYbcZaZRbdabdbbdcaZRbddaKeaKebdeaKebdfaKeaKeaKebdgaKebdhbdibdhbdiacnacnaafaaiaaiaobaobaobaobaaiaobaobaobaobaaiaobaobaobaqJaobaobaobaOraPVaQaaaaaSHaVkaVkbdjaZWaVkbxiaVkaZYbdlaVkaVkaSHaaaaOraPVaQaaobaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaafaaaaafaaaaYobbyaYobbzbbzbbAbbBaYobbyaYoaYoaSJbbCbbDbbEasiasjbbFasjassasjdfbbbIaskbbJbbKbbLbbMbbNbbObbPbbQbbRbbSbbTbbUbbSbbVbbWbbXbbYbbZbcabcbbccbcdbcebcfbcgbchbchbcibcjbckbclbcmbcnbcobcpbcpbcpbcpbcpbcpbcpbcqbcrbcsbcsbcsbcsbcsbcsbcsbcsbctbcubcvbcwbcsbcxbctbcsbcsbcybczbcAbaSbcBbcCbcDbcEbcFbaSbcGbcHalwbcIalwaaabaVbcJbcKbaVbcLbcMbcNbcObcPbcQaXSbcRbcSbcTbcUbcVbcWaXSbcXbcYbcZaZRbdabdbbdcaZRbddaKeaKebdeaKebdfaKeaKeaKebdgaKebdhbdibdhbdiacnacnaafaaiaaiaobaobaobaobaaiaobaobaobaobaaiaobaobaobaqJaobaobaobaOraPVaQaaaaaSHaVkaVkbdjaZWaVkbxiaVkaZYbdlaVkaVkaSHaaaaOraPVaQaaobaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaaaaYobabaYoaYoaYoaYoaYoaYobabaYoaaaaSJbdmbdnbdobdobdobdobdobdobdobdobzVbdqbbSbbSbdrbdsbdrbbSbbSbbSbdtbbSbdubdvbdwbdxbdybdzbdAbdBbdCbdDbdEbcdbdFbcfbdGbdHbdHbdIbdHbdJbdHbdKbdLbdKbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdMbdNbdNbdObdNbdNbdNbdNbdNbdNbdPbcfbdQbaSbdRbdSbdTbdUbdVbaSbdWbdXalwaDdalxaaabdYbdZbeabebbecbedbeebefbegbehaXSbeibejbekbekbelbemaXSbenbeobenaZRbepbeqberaZRbesayoayoayoayoayoayoayoayoayoaDqayoayoaZSayoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaobaaaaTOaPVaQaaaaaSHaSHaVkbetaZWaVkaVkaVkaZYaYnaVkaSHaSHaaaaOraPVbeuaNiaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabevbewbexbewbeybewbewbeybewbexbezbeAaSJbdmbeBbeCbeDbeEbeFbeGbeHbeIbdobeJbeKbeLbeMbeNbeObeNbeObePbeObeQbbSbeRbeSbeTbeUbeVbeWbeXbeYbeZbfabfbbfcbfdbfebffbdHbfgbfhbfibfjbdHbfkbflbfmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbdNbfnbfobfpbfqbfrbfsbftbdNbfubfvbfwbaSbfxbfybfzbfAbfBbaSalwalwalwbfCalwaaabaVbfDbfEbaVbfFbfGbfHbfIbfJbfKaXSbfLbfMbfNbfObfPbfQaXSaBZbfRaBZaZRbfSbfTbfUaZRbfVbfVbfVbnnbnnaafaafaafaafaafaafaafayobdiayoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaNiaNibfWbfXbfYbfZaViaVjaSHaSHaVkaWFbgabgbbABbgdbgeaWLaVkaSHaSHaVjaVobgfbggbghaOxaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabevbewbewbgibgjbgkbglbgmbgnbgobgpbgqbgkbgrbgsaYobdmbdnbgtbgubgvbgwbgxbgybgzbgAbgBbgCbgDbAMbAMbgEbgFbgGbbSbbSbbSbbSbgHbgIbgJbgKbgLbdrbgMbdBbdCbgNbgObgPbgQbcfbgRbdHbgSbgTbgUbgVbgWbgXbgYbgZaafaafbhabhbbhcbhdbhebhfbhbbhdbhebhfbhcbhcbhgaafaafbdNbhhbhibhjbhkbhjbhlbhmbdNbhnbcfbhobhpbaSbhqbhrbhsbaSbaSbhtbhualwbhvalwbhwbaVbaVbaVbaVaXRaXRaXRbhxbhyaXRaXSaXSaXSaXSaXSbhzbhAaXSbAObhCbAOaZRbhEbhFbhGaZRbhHbhIbhJbhKbhKbhLaaaaafaaaaaaaaaaafaafacnaafaafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaafaafaafacnbhMbhNbhObhPbhQaWEaaaaaaaSHaSHaVkbhRbhSbhTbhUbhVbhWbhXaVkaSHaSHaaaaaabhYbhZaPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8504,22 +8517,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeybgkbgkbexbgkbidbiebidbkfbidbiebidbgkbifbigaYobkgbkhbkibkjbkkbklbkmbklbeCbeCbknbkobdtbbSbkpbkqbkrbksbktbkubkvbbSbkwbkxbktbgKbkybbSbkzbkAbkBbkCbkDbfcbgQbcfbgRbdHbkEbkFbkGbkHbdHbkIbkJbfmbhebkKbhebkLbkMbkNbkObkNbkPbkNbkObkNbkQbkRbhebkKbhebdNbkSbkSbkSbkTbkUbkVbkWbdNbkXbkYbkZblablbblcblbbldblbbleblbblbblbblfblbblgblhblibljblbblbblkbllblmblfblnblfbloblpblqbjFblrblsblsbltblublsblsblvblwblxblybjRbjRblzbhKbhKblAaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaPXaPXbfWblBblCaQaaaaaSHaSHblDblDblEblFblFbnyblEblEblEblHblHaSHaSHaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabicblIblIbicbgkbidbiebidbiebidbiebidbgkbifbigaYoblJblKblLblMblNblOblOblPblQbCAblRblSblTbbSblUblVblWblXblYblZbmabbSbmbbmcbmdbmebmfbbSbmgbmhbmibmjbmkbcdbmlbfvbmmbmnbmnbmnbmnbmnbdKbmobmpbdKbhebmqbmrbmsbkObkObkObkObmtbkObkObkObkObmubmvbmwbhebmxbmybmzbmAbmBbmCbmCbmDbdNbmEbmFbmGbmHbmIbmJbmIbmKbmIbmLbmIbmIbmMbmIbmIbmNbmObmIbmPbmMbmQbmRbmNbmKbmIbmSbmTbmUbmVbmWbmXbmYbmZbnabnbblxbncbncbndbnebnfbngbjFbjFbjFbjFbrraafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbnibnjbnkbnlbnmbnnbnobnpaTRbnqaSHbnrbnsbntblEbtZbnvbnwbnxbugblEbnzbnAbnBbnCaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnDbewbewbgibnEbgkbnFbgkbnGbnHbgkbnIbgkbgrbnJaYoblJbnKbnLbnMbnNbnObnPbnQbnRbnMbnSbnTbnUbbSbnVbdrbnWbnXbbSbbSbbSbbSbbSbdrbnYbnZbbSboabfcbobbocbfcbfcbodbatbcfboebmnbofbogbohbmnboibojbokbolbombonboobopboqborbosbotboubosbosbovboqbowboxboybhebdNbkSbkSbkSbozbkSbkSbkSbdNboAaXBboBboCboDboEboDboFboGboGboGboGboGboGalwalwboHalwalwalwboIboJalwalwalwboKboLboMboNboOboPboQboRboSboTbncboUboVboWbneboXbfVbjFbsDbrsbtIbsEaafaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaabpgbphbpiaafbpjbpkbplbpmbpnbpobppbpqbprbpsbptbpubpvbpwbpxbpybpzbpubpAbpBbpCbpDaSHaNiaTOaPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnDbewbpEbewbeybewbewbeybewbexbpFbpGaSJbpHbpIbpJbcdbpKbpLbpMbpLbpNbcdbpObpPbpQbpRbpSbpTbpUbpVbpWbpTbpXbpYbpTbpSbpSbpZbpSbqabqbbqcbqdbqebpSbqfbqgbqhbgRbqibqjbqkbqlbmnbfmbfmbfmbfmbhebqmbqnbqobqpbqqbqrbkObqsbqtbqubqvbqpbqwbqxbqybqzbdNbqAbqBbqCbqDbqEbkSbqFbdNbqGaXBbqHbqIbqJbqKbqLboFbqMbqNbqObqPbqQbqRbqSbDnbqUalwbqVbdWbqWbqXbqYalwattbqZalwbrabrbbrcbjQbrdbrdbrdbrebrfbncbncbrgbrhbribrjbtJbrmbtKbtMbtLbrtbrtbrtbrtbrubrtbrtbrubrtbrtbrtbrtbtNbrtbrubrtbrtbrtbrtbrtbrtbrubrvbrvbrwbrxbrybrybrzbrAbrBbrCbrDbrEbrFbrGbrHbrIbrJbrKbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbrVbrWbrXbrYaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnDbewbpEbewbeybewbewbeybewbexbpFbpGaSJbpHbpIbpJbcdbpKbpLbpMbpLbpNbcdbpObpPbpQbpRbpSbpTbpUbpVbpWbpTbpXbpYbpTbpSbpSbpZbpSbqabqbbqcbqdbqebpSbqfbqgbqhbgRbqibqjbqkbqlbmnbfmbfmbfmbfmbhebqmbqnbqobqpbqqbqrbkObqsbqtbqubqvbqpbqwbqxbqybqzbdNbqAbqBbqCbqDbqEbkSbqFbdNbqGaXBbqHbqIbqJbqKbqLboFbqMbqNbqOdfhbqQbqRbqSbDnbqUalwbqVbdWbqWbqXbqYalwattbqZalwbrabrbbrcbjQbrdbrdbrdbrebrfbncbncbrgbrhbribrjbtJbrmbtKbtMbtLbrtbrtbrtbrtbrubrtbrtbrubrtbrtbrtbrtbtNbrtbrubrtbrtbrtbrtbrtbrtbrubrvbrvbrwbrxbrybrybrzbrAbrBbrCbrDbrEbrFbrGbrHbrIbrJbrKbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbrVbrWbrXbrYaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaYobabaYoaYoaYoaYoaYoaYobabaYoaaaaSJbrZbsabsbbcdbscbsdbsebsdbsfbcdbsgbshbsibsjbDLbslbsmbsjbsjbsnbsobspbsqbsjbsjbsrbsjbsjbsjbssbstbsubsubsvbswbsxbsybmnbszbsAbsBbmnbsCbvEbuRbsFbsGbqvbsHbqqbsIbsJbsKbsLbsMbsLbsNbsObsPbsQbsRbsSbsTbdNbsUbsVbsWbsXbsYbdNbdNbdNbsZbtabtbboFbtcbtdbteboFbtfbtgbthbtibtjbtkbtlbtmbtnbtobtpbtqbtrbtsbttbtubtvbEbalwboMbtxbtybjFbtzbtAbtBbtCbtDbtEbtFbtGbtHbvFbjFbjFbvHbvGbvIaOxaafaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaabtObtPbpfaafbtQbtRbtSbtTbtUbtVbtWbtXbtYbuhbuabubbucbudbuebufbAQbubbASbuibujbukaSHbhYbulaPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaYoaafaaaaafaaaaYobumaYobunbuobbzbupaYobumaYoaYoaSJbdmbuqburbcdbusbsdbutbsdbuubcdbuvbuwbuxbuybuzbuAbuBbuCbuDbuEbuFbuGbuzbuzbuzbuHbuzbuIbuJbuBbuKbuzbuzbuLbuMbuNbsybmnbuObuPbuQbvJbuSbuTbuSbuSbsGbuUbuVbuWbuWbuWbuXbuYbuZbvabvbbuWbuWbuWbvcbvdbhebdNbvebvfbvgbvhbvibdNbvjbvkbvlbvmbtbboDbvnbvobvpboFbvqbvrbvsbvtboGboGalwalwbvualwalwalwbvvbvwalwalwbvxbvyalwbvzbtxbvAbjFbfVbfVbfVbfVbvBbfVbfVbvCbvDbxqbjFbxrbxsbjFbxtbjFaafaafaaaaaaaafaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbvKbvLbnkbvMbvNbnnaPZbnpaPWaPXaSHaSHaSHbvObvObvObvPbvQbvObvObvObvOaSHaSHaSHaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaYobaaaYoaSJaYobabaYobvRaWObvSbvTaYobabaYobvUbvVbvWbpIbpJbcdbvXbvYbpMbvYbvZbcdbwabwbbwcbcdbwdbwebwfbcdalQbwgalQbwhbwhbwibwjbwkbwibwhbwhbwhbwhbwhbwhbwlbwmbwnbwobwpbwqbwrbwsbwtbwsbwubwvbwwbwxbwybwzbwAbwBbwAbwAbwCbwDbwEbuWbuWbwFbuWbwGbwHbdNbwIbwJbwKbhjbwLbwMbdNbwNbdKbwOaXBbwPboFboFboFboFboFbwQbwRboGboGboGbwSbwTboGbwUbwVbwWalwavEbwXalwbwYbwZbxabxbbxcbxdbxebxfbxgbxhbEPbxjbxkbxlbfVbxmbxnbxobxpbxubxybxvbzpbyoacnaafaafaafaafaafaafaafaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaobaOrbnpaQaaaaaaabxwaSHbvObxxbDabxzbxAbxBbxCbxDbvOaSHbxwaaaaaaaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaYobaaaYoaSJaYobabaYobvRaWObvSbvTaYobabaYobvUbvVbvWbpIbpJbcdbvXbvYbpMbvYbvZbcdbwabwbbwcbcdbwdbwebwfbcdalQbwgalQbwhbwhbwibwjbwkbwibwhbwhbwhbwhbwhbwhbwlbwmbwnbwobwpbwqbwrbwsbwtbwsbwubwvbwwbwxbwybwzbwAbwBbwAbwAbwCbwDbwEbuWbuWbwFbuWbwGbwHbdNbwIbwJbwKbhjbwLbwMbdNbwNbdKbwOaXBbwPboFboFboFboFboFbwQbwRboGboGboGbwSbwTboGbwUbwVbwWalwavEbwXalwbwYdfnbxabxbbxcbxdbxebxfbxgbxhbEPbxjbxkbxlbfVbxmbxnbxobxpbxubxybxvbzpbyoacnaafaafaafaafaafaafaafaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaobaOrbnpaQaaaaaaabxwaSHbvObxxbDabxzbxAbxBbxCbxDbvOaSHbxwaaaaaaaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYobxEaWOaWQbxFbxGaWOaWObxHbxIaYtbxJbxKbxKbxKbxLbxMbxNbxObxPbxQbxRbxSbxTbxUbxVbxQbxWbxXbxYbxZbxZbyabxZbxZaombybbycbwhbydbyebyfbygbyhbwhbyibyjbwhbyibyjbwhbykbcfbgRbmnbylbymbynbDdbypbyqbyrbysbsGbytbyubuWbyvbywbyxbkObkObwHbyybyzbyAbuWbyBbyCbdNbyDbyEbyFbyGbyHbyIbyJbyKbdKbfubyLbyMboGbyNbyObyPbyQbyRbySbyTboGbyUbyVbyWbyXbyYbyZbzaalwalwalwalwalwalwbzbalwbzcbzdbzebzfbzgbzgbzgbzgbzgbzfbzfbzgbzhbzibzjbzkbzlbzmbznbzobzfbzfbzfaafaaaaaaaaaaafaaaaafaaaaafaaaaaiaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaobaOrbnpbeuaNiaaaaaaaSHbvObIobzqbzrbzsbztbzubzvbvOaSHaaaaaaaNiaNibnoaPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaYpaYqaYqbzwaYqbzxbzybzzbzzbzAbzzbzBbzCbzDbzEbzFbzGbzHbzIblMbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzTbzUbETbxZbzWbzXaoibwhbzYbzZbyfbygbyhbwhbAabAbbwhbAabAbbwhbAcbfvbmmbmnbmnbAdbmnbmnbmnbAebAfbmnbmnbAgbAhbAibkObsLbsLbAjbAkbAlbAmbAnbAobApbAqbArbAsbhjbAtbAubAvbAwbAxbdNbAybdKbAzaXBbAAbFQbyRbACbyRbADbyRbAEbyRbAFbAGbzabAHbAIbAJbAKbALbIpbInbIubAPbIvbARbIwalwbATbtxbAUbzfbAVbAWbAXbAYbAZbzfbBabBbbBcbBdbBebBfbBgbBhbBibBjbBkbBlbzfaafaafaafaafaafaafaafaaaaaiaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaobaVfbBobBpbBqaViaVjaSHbvObBrbBsbBtbBubBvbBwbBxbvOaSHaVjaVobBybggbggbBzaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaYoaYoaSJaYobaaaYoaSJaYoaYoaYoaSJaYoaSJaSJaSJbkgbkhalQbBAalQalQbBBbBCbBBbBDbBBbBBbBBbBBbxZbxZbBEbBFbxZbxZbxZbBGalIbwhbBHbBIbyfbBJbwhbwhbBKbwhbwhbBLbwhbwhbBMbcfbgRbBNbBObBPbBQbBRbBSbBPbBTbBUbBVbwHbBWbwAbBXbsLbBYbBZbCabCbbCcbsLbCdbuWbCebCfbdNbCgbChbhjbCibCjbCkbdNbClbdKbdPaXBbAAboGbCmbCnbCobCnbCpbCqbCrbCsbAGbzabCtbCubzabAGbCvbCwbCxbCybCzbJrbARbvyalwbCBbCCbCDbCEbCFbCGbCHbCIbCJbzfbCKbCLbCMbCNbBebCObCPbCQbCRbCSbCTbCUbzfaafbCVbCVbCVbCVbCVaafaaabBnaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaobaaabCWbCXaPVaQaaaaaSHbvObCYbCZbLpbDbbDcbLqbDebvOaSHaaaaOraPVaWEbhYbDfaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacZgcZhcZhcZicZhcZhcZhcZjcZhcZhcZkaafaYobDgbdmbDhalQbybauRbDibBBbDjbDkbDlbDmbKHbDobBBbKLbDpbDqbDrbDsbDtbxZbBGbDubwhbDvbDwbyfbygbDxbDybBIbDzbDAbDBbDCbwibwmbcfbgRbDDbDEbDFbDGbDGbDGbDGbDHbBVbDIbDJbDKbhebhebOfbDMbDNbDObDPbDQbOfbhebhebDRbDJbDSbdNbAsbdNbdNbdNbdObdNbDTbDUbDVbDWbAAbDXbDYbDYbDYbDZbDYbEabDYbFQbAGbAGbEcbAGbAGbzabEdbEebEfbEgbEhbEibARbzbalwbEjbCCbEkbElbEmbEnbEobEpbEqbErbEsbEtbEubEvbBebEwbExbEybEzbEAbEBbECbEDbEEbEFbEGbEHbEHbCVaafaaabBnaaabBmaaaaaiaaiaafaaiaagaagaaiaaiaagaagaagaagaagaaiaagaagaobaobaOraPVaQaaaaaSHbEIbEIbEIbEJbEKbEJbEIbEIbEIaSHaaaaOraPVaQaaobaobaobaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZgcZlcZncZmcZocZocZocZocZocZocZocZibELaYoaYobdmbEMalQbENbEObPpbBBbEQbDkbDlbERbESbPtbBBbEUbEVbEWbEXbxZbxZbxZbBGapHbwhbEYbEZbyfbygbyfbyfbyfbyfbyfbFabyfbwjbFbbFcbFdbFebFfbFgbFfbFhbFfbFgbFibFfbFjbFkbFlbFmbFnbFobFpbFpbFqbFrbFpbFsbFtbFubFvbFwbFxbFobFybFzbFobFAbFBbFobFCbFDbFEbFFbFGbFHbyRbFIbyRbFJbyRbFKbyRbFLbAGbAGbFMbAGbAGbFNbFObEebFPbANbEhbPTbARbzbalwbFRbFSbvAbCEbFTbEnbFUbEnbFVbFWbFXbFYbFZbGabBebGbbGcbGdbGebGfbGgbGhbBeaafbBebGibEHbGjbCVaafaaabBnaaabBmaaabBnaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaobaOraPVaQaaaaaSHbGkbGlbGmbEJbGnbEJbGobGlbGpaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZqcZpcZpcZpcZpcZpcZpcZpcZpcZpcZpcZrbGrbGsbGrbdmbGtalQbGubGvakubBBbGwbDkbDlbGxbDkbPWbBBbxZbGzbxZbDrbGAbGBbxZbQHbQrbwhbGCbDwbGDbGEbGFbGFbGFbGFbGFbGGbGFbGHbuMbGIbGJbGKbGLbGMbGLbGNbGObGPbGQbGLbGRbGSbGTbGUbGVbGUbGWbGWbGXbGYbGWbGZbHabHbbHcbHdbHebHfbHgbHhbHibHjbHkbHdbHlbHmbHnbHobHpbHqbHrbHsbHtbHtbHubHvbHrbHwbHxbHybHzbzabHAbzabHBbHCbHDbHEbHFbHGbHHbHIalwbHJbHKbHLbHMbHNbHObHPbHQbHRbBebHSbHTbHUbHVbHWbHXbHYbHZbIabIbbIcbIdbIebIfbIgbIhbEHbIibCVaafaaabBnaaabBmaaaaobaobaobaobaobaaiaobaobaobaobaaiaobaobaobaaiaobaagaobaOraPVaQaaaaaSHbIjbIkbIlbEJbEKbEJbIlbIkbImaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZqcZpcZpcZpcZpcZpcZpcZpcZpcZpcZpcZrbGrbGsbGrbdmbGtalQbGubGvakubBBbGwdfobDlbGxbDkbPWbBBbxZbGzbxZbDrbGAbGBbxZbQHbQrbwhbGCbDwbGDbGEbGFbGFbGFbGFbGFbGGbGFbGHbuMbGIbGJbGKbGLbGMbGLbGNbGObGPbGQbGLbGRbGSbGTbGUbGVbGUbGWbGWbGXbGYbGWbGZbHabHbbHcbHdbHebHfbHgbHhbHibHjbHkbHdbHlbHmbHnbHobHpbHqbHrbHsbHtbHtbHubHvbHrbHwbHxbHybHzbzabHAbzabHBbHCbHDbHEbHFbHGbHHbHIalwbHJbHKbHLbHMbHNbHObHPbHQbHRbBebHSbHTbHUbHVbHWbHXbHYbHZbIabIbbIcbIdbIebIfbIgbIhbEHbIibCVaafaaabBnaaabBmaaaaobaobaobaobaobaaiaobaobaobaobaaiaobaobaobaaiaobaagaobaOraPVaQaaaaaSHbIjbIkbIlbEJbEKbEJbIlbIkbImaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZtcZscZucZucZvcZvcZvcZvcZvcZvcZvcZiaYoaYoaYobdmbSXalQbLralQalQbBBbSYbIqbIrbDkbDkbDkbBBbIsbItbxZbSZbxZbxZbxZalIbBGbIxbBIbBIbFabIybIzbBIbBIbBIbBIbIAbIBbwibwmbICbIDbIEbIFbIGbIHbIIbIFbIFbIJbIJbIKbILbIJbIMbBVbINbIObIPbIQbIRbIObISbBVbIMbITbIUbIVbIWbITbITbIXbIYbIZbITbJabJbbJcbJdbJebJfbJgbJhbJgbJibJjbyRbyRbFQbEcbAGbJkbJlbJmbJlbHybJnbJobJpbJqbTabARbJsalwbJtbJubJvbznbJwbJxbJybJzbznbzobJAbJBbCSbJCbBebJDbJEbJFbJGbJFbJHbJIbBeaafbCVbCVbCVbCVbCVaafaaabBnaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobbLtbOFaQaaaaaSHbJJbIkbIkbJKbJLbJMbIkbIkbJNaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacZtcZhcZhcZicZhcZhcZhcZjcZhcZhcZwaafaYobJObdmbJPalQbBGapHbJQbBBbJRbDlbJSbJTbGybTbbBBbJUbJVbxZbUnbJWbJXbxZbUIbUBbwhbJYbJYbFabygbJZbJZbKabKbbKcbKdbwhbwhbFbbKebKfbIFbKgbKhbKibKjbKkbKlbKmbKnbKobKpbIJaafbDEbKqbIObIObKrbIObIObKsbKtaafbITbKubKvbKwbKxbITbITbITbITbITbKybdKbJcbKzbKAboGbKBbKCbDYbKDbKEbDYbKFboGbEcbKGbAGbAGbAGbAGbAGbUVbKIbKJbKKbUXbARbKMalwbKNbKObKPbzjbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebLfbLgbLhbLibLjbEFbLkbLlbLlbCVaafaafbLmaafbLnaafbBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbOFaQaaaaaSHbLobLubMVbIkbMWbLsbMZbMXbLvaSHaaaaOraPVaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaYoaYoaSJaYobaaaYoaSJaYoaYoaYoaSJaYoaSJaSJaSJblJbLwbLxbLybLzbLAbBBbLBbLCbJSbLDbLEbLFbBBbxZbxZbxZbxZbxZbxZbxZbBGaoibwhbLGbLHbFabygbBIbBIbLIbBIbLJbLKbwhbLLbwmbcfbLMbIFbLNbLObLPbLQbLRbKlbLSbLTbLUbLVbLWaafbDEbLXbLYbLZbMabLYbLZbMbbKtaafbMcbMdbMebMfbMgbMhbMibMjbMkbITbMlbdKbMmbyLbMnbUZbMobMobMpbMqbMrbMsbMtbMobMubMobMvbMwbMxbMybMzbARbARbMAbARbARbARbJsbMBbMCbMDbMBbzfbzfbzfbzfbzfbMEbzjbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbBeaafbBebMRbMSbMTbCVaafaaabBnaaabBmaaabMUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbQibNaaVjaSHaSHbQjbQkbIkbMYbLsbQnbQmaSHaSHaVjaVobNbaOxaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYobNcbvVaWQbNdaWQaWOaWObNeaWObvVaWObNfbvVaWObvWbNgalQbNhalIapIbBBbNibNjbDkbDkbDkbNkbBBbNlbNmbNnbNobNpbNqalQbBGaqWbwhbNrbNsbFabNtbNubNubNvbBIbBIbNwbwhbNxbwmbcfbKfbIFbNybNzbNAbNBbNCbKlbNDbNEbNFbNGbIJbNHbNIbNHbNIbNIbNJbNIbNIbNHbNIbNHbITbNKbNLbNMbNNbNObNPbNQbNRbITbNSbdKbNTaXBbKAbMobNUbNVbNWbNXbNYbNZbNZbOabObbMobMobMobMobMobMobMobARbOcbOdbOebARbVpbMBbOgbOhbOibMBbOjbOkcXnbOlbzfbOmbOnbOobOpbOqbOrbOsbOtbOubOvbMObOwbOxbIebIfbIgbOybLlbOzbCVaafaaabBnaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbOFaQaaaabxwaSHbOAbIkbIkbOBbOCbODbOEaSHbxwaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaYpaYqaYqaYqaYqaYqbOGbOHbOIbzzbzzbOJbOKbOLbOMbONalQbdpaqSapIbBBbDmbOObDkbDkbOObOPbBBbOQaolaonbORbLAbNpalQbBGbOSbwhbOTbOUbOVbOWbBIbOXbOYbOZbPabPbbwhbPcbwmbcfbPdbIFbPebPfbPgbPhbKlbKlbPibPjbPkbPlbIJbPmbPnbPobWlbPqbPrbPsbWlbPubPvbPwbPxbPybNLbPzbPAbITbPBbPCbPDbITbPEbdKbPFaXBbPGbPHbPIbPJbPKbPLbPMbNWbNWbPNbPObMobPPbPQbPRbPQbPSbMobXPbPUbPVbYkbARbJsbMBbPXbPYbPZbMBatnapkapkbQabzfbOmbQbbQcbzgbQdbzgbQebQfbQgbEnbMObQhbMQbBeaafbCVbCVbCVbCVbCVaafaaaaaiaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbOFaQaaaabxwaSHbQocgObWXbQlciKcjAcjzaSHbxwaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaYoaYobQpbQpaYoaYoaYoaSJaYoaSJaYoaSJaSJalQbQqalQalQalQbdpaqWapIbBBbOPbZibQsbDkbQsbQtbBBbQuapFaojapHbQvanaalQbBGalIbwhbwhbwibQwbQxbwibwhbwhbwhbwhbQybwhbwhbAcbfvbQzbIFbQAbQBbQCbQDbQEbKlbQFbQGbPkcaCbQIbQJbQKbQLbQMbQNbQLbQObQLbQPbQQbQRbPxbQSbNLbQTbQUbQVbQWbQXbQYbITbQZbdKbRaaXBbKAbRbbRcbRdbRebRfbRgbRhbRdbPNbRibMobRjbRkbRlbRmbPSbMobRnbRobRpbRqbRrbRsbMBbRtbRubRvbMBbRwbRxbRybRzbzfbRAbRBbRCbRDbQdbREbRFbEnbOsbRGbRHbRIbLhbLibLjbEFbRJbRKbRLbCVaafaaabBnaaabBmaaabBnaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobbLtbOFaQaaaaaaaaSHaSHaSHaSHaSIaSHaSHaSHaSHaaaaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYobNcbvVaWQbNdaWQaWOaWObNeaWObvVaWObNfbvVaWObvWbNgalQbNhalIapIbBBbNibNjbDkdfobDkbNkbBBbNlbNmbNnbNobNpbNqalQbBGaqWbwhbNrbNsbFabNtbNubNubNvbBIbBIbNwbwhbNxbwmbcfbKfbIFbNybNzbNAbNBbNCbKlbNDbNEbNFbNGbIJbNHbNIbNHbNIbNIbNJbNIbNIbNHbNIbNHbITbNKbNLbNMbNNbNObNPbNQbNRbITbNSbdKbNTaXBbKAbMobNUbNVbNWbNXbNYbNZbNZbOabObbMobMobMobMobMobMobMobARbOcbOdbOebARbVpbMBbOgbOhbOibMBbOjbOkcXnbOlbzfbOmbOnbOobOpbOqbOrbOsbOtbOubOvbMObOwbOxbIebIfbIgbOybLlbOzbCVaafaaabBnaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbOFaQaaaabxwaSHbOAbIkbIkbOBbOCbODbOEaSHbxwaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaYoaYpaYqaYqaYqaYqaYqbOGbOHbOIbzzbzzbOJbOKbOLbOMbONalQbdpaqSapIbBBbDmbOObDkbDkbOObOPbBBbOQaolaonbORbLAbNpalQbBGbOSbwhbOTbOUbOVbOWbBIbOXbOYbOZbPabPbbwhbPcbwmbcfbPdbIFbPebPfbPgbPhbKlbKlbPibPjbPkbPlbIJbPmbPnbPobWlbPqbPrbPsbWlbPubPvbPwbPxbPybNLbPzbPAbITbPBbPCbPDbITbPEbdKbPFaXBbPGbPHbPIbPJbPKbPLbPMdfpbNWbPNbPObMobPPbPQbPRbPQbPSbMobXPbPUbPVbYkbARbJsbMBbPXbPYbPZbMBatnapkapkbQabzfbOmbQbbQcbzgbQdbzgbQebQfbQgbEnbMObQhbMQbBeaafbCVbCVbCVbCVbCVaafaaaaaiaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbOFaQaaaabxwaSHbQocgObWXbQlciKcjAcjzaSHbxwaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaYoaYobQpbQpaYoaYoaYoaSJaYoaSJaYoaSJaSJalQbQqalQalQalQbdpaqWapIbBBbOPbZibQsbDkbQsbQtbBBbQuapFaojapHbQvanaalQbBGalIbwhbwhbwibQwbQxbwibwhbwhbwhbwhbQybwhbwhbAcbfvbQzbIFbQAbQBdfqbQDbQEbKlbQFbQGbPkcaCbQIbQJbQKbQLbQMbQNbQLbQObQLbQPbQQbQRbPxbQSbNLbQTbQUbQVbQWbQXbQYbITbQZbdKbRaaXBbKAbRbbRcbRdbRebRfbRgbRhbRdbPNbRibMobRjdfrbRlbRmbPSbMobRnbRobRpbRqbRrbRsbMBbRtbRubRvbMBbRwbRxbRybRzbzfbRAbRBbRCbRDbQdbREbRFbEnbOsbRGbRHbRIbLhbLibLjbEFbRJbRKbRLbCVaafaaabBnaaabBmaaabBnaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobbLtbOFaQaaaaaaaaSHaSHaSHaSHaSIaSHaSHaSHaSHaaaaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaYobRMbbyaYoaaaaafaaaaaaaaaaafaaaaaaalQbRObRPbRQbRRbRSbRRbRTbBBbBBbBBbBBbRUbBBbBBbBBbRVaqSalIaojbRWbRXalQbRYbRZbwhbSabSbbScbSdbSebSfbSgbwhbShbSibSjbwhbwmbcfbSkbIFbLNbPfbSlbSmbLNbKlbSnbSobSpbSqbQIbSrbSsbStbSubSvbSwbSxbSsbSybSzbSAbPxbSBbSCbSDbSEbSFbSGbSHbSIbSJbSKbdKbSLaXBbKAbRbbSMbSNbSNbSObSPbSQbSRbSSbSTbMobSUbRkbSVbSWcbJbMoccRcgFceAchqbARbJsbMBbMBbMBbMBbMBbTcapkapkbTdbzfbRAbRBbRCbTebTfbREbTgbMNbThbRGbMObTibMQbBeaafbBebTjbTkbTlbCVaafaaabBnaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOrbOFaQaaaaaaaaaaaaabxwbxwbTmbxwbxwaaaaaaaaaaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaYobQpbQpaYoaafaafaafaafaafaafaafaafalQbToasjasjasjbzXapFapIalIanfauRaoibTpbTqaqWalQalQalQalQalQbTralQalQbBGapHbwhbTsbTtbTubTubSdbTvbTwbwhbTxbTybTzbwhbykbcfbTAbIFbLNbTBbTCbTDbLNbKlbTEbTFbTGbTHbQIbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbPxbTTbTUbTVbTWbNObTXbTXbTYbITbTZbdKbUaaXBbKAbMobUbbUcbUdbNWbUebUfbPLbUgbUhbUibUjbUkbUlbUmciRbMobARbARbARbARbARbUoalwbUpbQaaqzapkbUqaqybUrapkbzfbzfbUsbJBbRDbQdbUtbUubEnbOsbRGbMObUvbOxbIebIfbIgbUwbRKbUxbCVaafaaabBnaaabBmaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOraPVaQaaaaaaaaaaaaaaaaaaaaPYaaaaaaaaaaaaaaaaaaaOrbOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZxcZzcZycZAcZzcZAcZycZzcZycZAcZAcZycZBcZDcZCcZEcZycZAcZAcZycZFaaaaaaaaaalQalQalQalQbRXbUzasjbUAciTbUCbUDbUDbUDbUEbUFbUDciTciWbUGbUDbUHbQralIbBGbVFbwhbUJbUKbULbUMbDwbUNbUObwhbwhbwhbwhbwhbUPbcfbKfbIFbIFbUQbUQbURbIFbIHbIJbUSbUTbIJbIJbUUcjIbUWbNIbUUbUUbUUbNIbUYcjIbUUbITbITbITbITbITbITbVabVabVabIUbVbbdKbVcaXBbVdbVebVfbVfbVfbVgbVfbVfbVhbVibVfbVfbVfbVfbMobVjbVkbVlbVmbVnbVoapkclDbVqalwbRybVrbVsapkbVtapkapkanUbzfbVubFXbVvbzgbQdbzgbVwbEnbOsbVxbMObQhbMQbBeaafbCVbCVbCVbCVbCVaafaafbMUaafbLnaafaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaOraPVbeuaNiaNiaNiaNiaNiaNibVyaNiaNiaNiaNiaNiaNibnobOFaQaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8537,10 +8550,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZZcZYcZKdb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZZcZYcZKdbXcZSdaidbZdbYdcacZSdccdcbcZKdcddcfdcecZKdcgdcidchdcjcZAaaaaaaaaaaaaaafaafaobaaackkaaaaafaaaaaaaafaaabVEbVEbVEbVEbVEbVEbVEbVEbVEcklckmckmcknckockockockockpckockockockqckrckscktckuckvckwckxckyckzckAckBckCckDckEckFckGckHckIckJckKckLckMcimcjscgXcjtcipckNckOckPckQckRckScipckTckUckVckWciAcfyckXckYcceciAckZclaclbclccldciCcjJcleclfclgcOgclhcliciCcljbVEbVEbVEbVEbVEalwalwalwcbQcbQcbQclkciLcllclmclnciLaafbCVcloclpclqbCVclrclscltbCVcluclvclwbCVaafaafaafaaabzfclxclyclzclAaaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadckcZzcZJdcldcldcmdclcZKdcodcndcqdcpcZKdcrdctdcscZKdcudcwdcvdcxcZKaaaaaaaaaaaaaafaaaaaiaaacgvaafaafaafaafaafaaabVEclBclCcyxclEcBecAcclHbVEcklckmclIclJclKclLclMckmclNclOclPckmclQclRclSclTclUclVclWclXclYclZcmacmbcmaclZcmacmccmdcikcmecmfcmgcmhcmicijcjscgXcjtciqcmjcmkcmlcmmcmncmocmpcmqcmrcmscmtciAcmucmvcmwcmxciAcmycmzcmAcmBcmCciCcjJcjJcmDcjJcjJcmEcmFciCciDbVEcmGcmHbVEcmIcmJcmKcmLcmMcmNalwcmOciLcmPcmQcmRciLaafbCVclocmSclobCVclrcmTclrbCVcmUcmVcmUbCVaafaaaaafaafclAcmWbEHcmXcmYaafaaiaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbycZGcZycZAcZAcZycZGcZycZAcZAcZycZGcZycZAcZycZGcZycZAcZAcZydbLaaaaaaaaaaaaaafaaaaobaaacgvaafaaaaaaaaaaafaaacmZcnacnbcnccndclFcnecBYbVEcklckmcngcnhcnicnjcnkcnlcnmcnncnockmcnpcnqcnrcnscntcnucnvcnwcnxcnycnzcnAcnAcnAcnBcnCcnDcnEcnFcmfcnGcnHcnIcimcnJcgXcnKcipcnLcnMcnNcnOcnPcnQcipcnRcnScnTcnUciAcnVcnWcnXcDdciAcnZcoacobcoccodciCciCcoecofcogcogciCcohciCcoicojcokcolbVEcomapkapkapkbZNconbVEcoociLcllcopclnciLaafbCVbCVbCVbCVbCVbCVbCVbCVbCVbCVbCVbCVbCVaafaafaafaaacmYbEHcoqbEHcoraaabBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaiaafcgvaafaaaaaaaaaaafaaacmZcoscnecnbcotclFcoubVEbVEcDDckmcowcoxcowcoycowckmcowcozcowckmcgHcoAcoBcoCcgHcgHcoDcoEcoFcoGcoGcoHcoIcoJcoGcoGcoKcimcoLcoMcoNcoOcimcimcoPcgXcoQcipcipcoRcoScoTcoUcoVcipcCYcFtcbzcbzciAcoXciAcoYciAciAcbzcoZcpacbzcbzcpbcpccpdcpecpfcpgcphcpiciCcKwbVEcpkcplbVEcpmbZNcdGbYmcpncpobVEcoociLcppcpqcprcpsaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaafaafcorbEHbEHbEHcmYaafbBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaobaaachLaaaaaaaaaaaaaafaaacmZcptcnbcpucpvclFcpwcpxbZRcklckmcpycpzcpAcpBcpCckmcpDcpEcpFckmcpGcpHcpIcpJcpKcpLcpMccxcpNcoGcpOcpPcpQcpRcpScoGcvCcimcpTcpUcpVcpWcpXcpYcpZcqacqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncqocepcqpcqqcqrcepcqscqtcqucepcqvcpbcqwcqxcqycqzcqAcqBcqCciCciDbVEbVEcqDbVEcqEcqFbZQbZQcqGcqHbVEcoociLciLcPIciLciLaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafaaaaafaaacorcmYclAbzfclAaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaiaafcgvaafaaaaaaaaaaafaaacmZcoscnecnbcotdfscoubVEbVEcDDckmcowcoxcowcoycowckmcowcozcowckmcgHcoAcoBcoCcgHcgHcoDcoEcoFcoGcoGcoHcoIcoJcoGcoGcoKcimcoLcoMcoNcoOcimcimcoPcgXcoQcipcipcoRcoScoTcoUcoVcipcCYcFtcbzcbzciAcoXciAcoYciAciAcbzcoZcpacbzcbzcpbcpccpdcpecpfcpgcphcpiciCcKwbVEcpkcplbVEcpmbZNcdGbYmcpncpobVEcoociLcppcpqcprcpsaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaafaafcorbEHbEHbEHcmYaafbBnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaobaaachLaaaaaaaaaaaaaafaaacmZcptcnbcpucpvdfscpwcpxbZRcklckmcpycpzcpAcpBcpCckmcpDcpEcpFckmcpGcpHcpIcpJcpKcpLcpMccxcpNcoGcpOcpPcpQcpRcpScoGcvCcimcpTcpUcpVcpWcpXcpYcpZcqacqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncqocepcqpcqqcqrcepcqscqtcqucepcqvcpbcqwcqxcqycqzcqAcqBcqCciCciDbVEbVEcqDbVEcqEcqFbZQbZQcqGcqHbVEcoociLciLcPIciLciLaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafaaaaafaaacorcmYclAbzfclAaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaaaaaaaaiaaacGPaafaaaaaaaaaaafaaacmZcmZcnbclFclFcnbcnbcqJbZRcklckmcqKcqLcqMcqNcqOckmcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqZccxccycoHcracrbcrccrdcrecoGcdGcimcrfcrgcrhcricrjcrkcrlcgXcrmcrncrocrpcrqcrrcrscrtcKycrvcrwcrxcrycrzcrAcrBcrCcrDcrEcrDcrFcrGcrHcrIcrJcrKcrLcrMcrNcrOcrPcrQcrRcrSbVEcrTcrUcrVbXicpnbZQbZQcrWcrXcmZcrYcrZciLcQociLcsbaafaaibBmbBmbBmbBmbBmbBmaaibBmbBnbBmbLnaafbBnaaaaafaaaaaaaafaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaafaaaaaaaobaaacfmaaaaaaaaaaaaaafaaacmZcsccnbcsdcnbcnbcoubVEbVEcsecsfcsgcqLcYBcqNcsicsjcskcslcsmcsncsocspcsqcsrcsscstcsucsvcfLcswcsxcsycszcsAcszcsBcsCcimcsDcsEcsFcsGcpXcrkcrlcgXcrmcsHcsIcsJcsKcsLcsMcsNcqjcsOcsPcsQcsRcsScsTcsUcsVceuceucsWcsXcsYcsZctactbctcctdctectfctgcthcticiCciDbVEctjctkctlcokctmcqGciEbZQctnbVEctoctpctqctrctqacnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaabBnaafaafaaibMUbMUbMUaaiaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaafaaaaaaaobaaacfmaaaaaaaaaaaaaafaaacmZcsccnbdfudftcnbcoubVEbVEcsecsfcsgcqLcYBcqNcsicsjcskcslcsmcsncsocspcsqcsrcsscstcsucsvcfLcswcsxcsycszcsAcszcsBcsCcimcsDcsEcsFcsGcpXcrkcrlcgXcrmcsHcsIcsJcsKcsLcsMcsNcqjcsOcsPcsQcsRcsScsTcsUcsVceuceucsWcsXcsYcsZctactbctcctdctectfctgcthcticiCciDbVEctjctkctlcokctmcqGciEbZQctnbVEctoctpctqctrctqacnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaabBnaafaafaaibMUbMUbMUaaiaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaobaaacgvaaaaaaaafaafaafaaacmZctsclFcncclFcttcdGcKAbVEcklckmctvctwctxctyctzckmctActBctCckmctDctEctFctGctHcpLctIccxctJcoGctKctLctMctNctOcoGctPcimcimctQcimcimcimcimctRctSctTcipcipcipcipcipctUcLycipciAciActWctXctYctZcuacubcuccuccuccuccudcuecufcudciCciCciCcugcuhcuicujciCciDbVEcrTcukbVEculcumcuncuocuocupbVEaafacnaaaaaaaaaacnaafaafaaibBnbBnbBnaaibBnbBnbBnaaibBnbMUbBnbBnaaaaaaaafaaaaaaaafaaaaafaafaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaobaafaaiaobaaaaaiaobaobaafaafaafcgvaafaafaafaaaaafaafcmZclFcttclFcMpcpncurcMFcutcuuckmcuvcuwcuxcuycuzckmcuAcuBcuCckmcuDcuEcuEcuEcuEcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcoGcuOcuPcuQcuRcMVcuTcdOcuUcuVcuWcuXcuYcuZcNtcvacvbcvccvdcvecNNcvgcvhcvicvjcvkcvlcvmcvncvocvpcvqcudcvrcvscvtcvucvvciCciCciCciCciCciCcvwbVEbVEbVEbVEbVEcmZbVEcmZbVEcmZbVEcvxacnacnacnacnacnaaaaaaaaaaafaaaaafaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvyaaaaaaaaaaafaaaaaaaaaaafaaaaaaaafaaachLaaaaaaaafaaaaafaaacmZcmZcmZcmZbVEcvzcvAbVEbVEcklckmckmckmckmckmckmckmckmcvBckmckmcvCbVEcvDcvEcvFcvGcsucvHcvIcoGcvJcvKcvLcvMcvMcvMcvMcvMcvMcvMcvNcvOcvNcvPcvQcvRcvScvTcNPcvVcOobVEcvXcvXcvYcvXcvXcvZcwacwbcvkcwccwdcwecwfcwgcwhcudcwicwjcwkcwlcwmcnWccechRbVEcwnciYcwobVEcwpccebVEaaaaafaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8552,11 +8565,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaafcxpcxqcxqcxqcxqcxrcgvcxscxtcxtcxtcxtcxuaafaqJaafaafaafaobaafaafaafaafaafaaabVEbVEbVEbVEbVEbVEbVEbVEbVEbVEbVEcyyccfcAgcAZcBacBbcBccBdcAgcPtcBfcBgcxFcBhcBicBjcvMcBkcBlcBlcBlcBmcvMcBncBocBpcBqcBrcBscBtcxTcBucyTcBvcBwcvXcBxcBycBzcxXcBAcBBcBCcBDcBEcBFcBGcBHcBIcBJcBKcBLcBJcBMcBNcAWbVEcBObVEcBPcBPcSLcBRcBScSUcBUaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcBVcBWcBVaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaafcyqcyqcyqcyqcyqaaacBXaafcyqcyqcyqcyqcyqaaaaobaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaafaaaaaabVEcFWcPycBZcCacCbcCccCdcCecCfcCgcChcCicxFcCjcCkcClcvMcCmcCncCocCpcCqcvMcCrcCscCscvNcCtcCucCvcCwcCxcCycCzcCAcvXcCBcCCcCDcCEcCFcCGcCHcCIcCJcCKcCLcCMcCMcCNcCOcCPcCQcCRcCScCTcCUcCVcCWcCXcSVcCZcCZcCZcDacDbaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcBWcBVcDccBVcBWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqJaaaaafaaaaafaaaaafaaacGPaaaaafaaaaafaafaafaafaqJaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaabVEcgGcQgcAgcDecDfcDgcDhcDicDjcDkcDlcDmcxFcxFcDncxFcvMcvMcvMcvMcvMcvMcvMcDocvNcvNcDpcDqcvRcvScDrcDscDscDtcDucvXcDvcDwcDxcDycDzcDAcDBcDCcHDcDEcDFcDGcDHcDIcDJcDKcDLcDMcDNcDOcDPcDQcDRcDScDTcDUcDVcDWcDXcDbaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcDYcBWcDZcEacEbcBWcDYaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaacwqcwqcwqcwqcwqaafcEcaafcwqcwqcwqcwqcwqaafaobaaaaaaaaaaaiaafcEdcEdcEdcEecEdcEdcEdaaaaafaaaaaaaaaaafaaaaaabVEcEfcyycAgcEgcEhcQhcEicEjcAgcEkcElcEmcAgcEncEocEpcEqcErcEscErcEtcErcEucEvcEwcEqcExcjsccDcEycxTcEzcEAcEBcEzcECcECcECcECcECcEDctXcEEcAKcEFcEFcEGcEHcEIcEJcEKcELcEMcENcEOcAWcEPcEQcERcAKcEScDbcDbcBPcDbcBPaoaaafaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaafcBWcBWcETcEUcEUcEUcEVcBWcBWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaacwqcwqcwqcwqcwqaafcEcaafcwqcwqcwqcwqcwqaafaobaaaaaaaaaaaiaafcEdcEdcEdcEecEdcEdcEdaaaaafaaaaaaaaaaafaaaaaabVEcEfcyycAgcEgcEhcQhcEicEjcAgcEkcElcEmcAgcEncEocEpcEqcErcEscErdfvcErcEucEvcEwcEqcExcjsccDcEycxTcEzcEAcEBcEzcECcECcECcECcECcEDctXcEEcAKcEFcEFcEGcEHcEIcEJcEKcELcEMcENcEOcAWcEPcEQcERcAKcEScDbcDbcBPcDbcBPaoaaafaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaafcBWcBWcETcEUcEUcEUcEVcBWcBWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaafcxpcxqcxqcxqcxqcxrcgvcxscxtcxtcxtcxtcxuaafaobaaaaafaafaobaaacEdcEWcEXcEWcEYcEWcEdcEdcEecEdcEecEdcEdaafaafbVEchRcyycAgcAgcAgcAgcAgcAgcAgcEZcFacFbcFccFdcFecFfcEqcFgcFhcErcEvcErcFicFjcFkcEqcFlcjsccDcrmcsHcFmcFncFocFpcFqcFrcFscSWcFucFvcyZcwbcAWcAWcAWcAWcAWcAWcFwcFxcFycFzcFAcFBcAWbVEcBObVEcBPcFCcFDcFEcFFcFGaoaaoaaafaafaafaafaafaafaafaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafcFHcFIcFHcEUcFJcEUcFKcFLcBVaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaafcyqcyqcyqcyqcyqaaacBXaaacyqcyqcyqcyqcyqaaaaqJaafaafaaaaobaafcEdcFMcFNcFOcFPcFMcFQcFRcFScFTcFUcFVcEdaaaaaabVEbVEcFWcFXcFXcFYcFXcFZcGacGbcGccGdcGecGfcGgcGhcGicGjcGkcGlcGkcGkcGmcGncGocGpcGqcGrcGscBscGtcGucGvcGwcGxcGycGycGycGzcGAcFuccIcyZcGBcAWcGCcGDcGEcGFcGGcGHcGGcGIcGJcGKcAWcnWcGLbYhccecBPcBPcBPcBPcBPcGMbnnaoaaafaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafcBWcBWcGNcEUcEUcEUcGOcBWcBWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaaaaafaafaafaaaaaacGPaafaaaaaaaafaafaaaaaaaobaaaaaaaaaaaiaaacEdcGQcGRcGScGTcGQcGQcGUcGVcGWcGXcGYcEdaaaaaaaaacnWcnWcnWcnWcnWbVEcGZcAgcAgcHacHbcHccAgcHdcHecHfcEqcHgcEvcErcEvcErcHhcHicHjcHkcHlcHmcHncHocECcECcHpcHqcHrcHscHtcHucHvcFucHwcHxcHycDbcGCcGDcHzcHzcHAcHBcHCcHDcFzcHEcAWcfxcHFcaQbZQcHGbVEaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcDYcBWcHHcHIcHJcBWcDYaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqJaaaaaaaaaaaaaaaaaaaaacGPaaaaaaaaaaaaaafaaaaaaaqJaaaaaaaaaaobaafcEdcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHWcHWcHVcHXcHYcHZcEdcIacIbcAgcIccIdcIecIfbVEbVEbVEbVEcEqcErcEvcErcIgcErcIhcIicIjcEqcIkcIlccDcjtcECcImcIncIocHscHscIpcIqcIrcFucIscItcIucAWcGCcGDcHzcIvcGGcIwcGGcIxcIycIzcAWcgGcgGcJvcgGcgGbVEaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcBWcBVcIBcBVcBWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqJaaaaaaaaaaaaaaaaaaaaacGPaaaaaaaaaaaaaafaaaaaaaqJaaaaaaaaaaobaafcEdcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHWcHWcHVcHXcHYcHZcEdcIacIbcAgcIccIdcIecIfbVEbVEbVEbVEcEqcErdfwcErcIgcErcIhcIicIjcEqcIkcIlccDcjtcECcImcIncIocHscHscIpcIqcIrcFucIscItcIucAWcGCcGDcHzcIvcGGcIwcGGcIxcIycIzcAWcgGcgGcJvcgGcgGbVEaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcBWcBVcIBcBVcBWaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaiaobaobaobaaaaaaaaacGPaaaaaaaaaaobaobaobaqJaobaafaafaaaaobaaacEecICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScIEcITcIUcIVcIWcIXcIVcIYcIZcJacJbcJccJdcJecEqcEqcEqcEqcEqcEqcEqcJfcEqcEqbVEcJgccDcjtcECcJhcIncHscHtcHscJicJjcJkcJlcJmcJncJocJpcJqcJqcJqcJqcJqcJrcJqcJscJtcJucAWcwnciYcKxcKzcQObVEbVEaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcBVcBWcBVaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaobaafcJwaafaobaaaaaaaafaaaaaaaafaaaaafaafaafaaacEdcJxcJycJzcJAcJBcJCcJDcJEcJFcJGcJHcEdcEecEecEecEdcJIcJJcJKcEdcJLcJMcAgcJNcJOcJPcJQbVEcJRcJScJTbVEcJUciVcJVcvWcvUcJWcJXczXciZcJYcJZcKacxScECcKbcKccKdcKdcKdcKecKfcKgcKhcKicKjcKkcKlcKmcKncKocKpcKqcKrcKscKtcKucKvcRtcRLcgGbZQcRMcKzcIAbVEbVEbVEacnaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaobaaaaafaaaaobaaaaaaaafaafaafaafaaaaaaaaaaafaafcEdcKBcKCcGQcKDcKBcKEcKFcKGcKHcKIcKJcEdcKKaaaaaacnWcnWcnWcnWcnWbVEcKLcAgcAgcAgcAgcAgbVEcKMcKNcKObVEcKPbVEbVEbVEbVEbVEbVEbVEbVEcvTcKQcKRcKScKTcKUcKVcKWcKXcKYcKZcHtcLacLbcLccLdcLecLfcLgcLhcLicLjcLkcLlcKschPcLmbVEbVEbVEbVEbVEcLncLocLpchMcLqchMcLraafaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8565,8 +8578,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaacEdcNecNfcGQcNfcNecNgcNhcNicNjcNkcNlcEeaaaaaacNmbVEcNnbVEbVEbVEcNobVEbVEbVEbVEcNpcNqcNrcNscSocNrcNucNvcNwcNxcNycNzcNAcNBcNCcNDcNDcNEcNFcNGcNHcNIcNJciYciYcNKciYcNLciZcNMcSHcSJcSIcNMcNQciYcSKcNRcRtciYciYciYcNSbVEcNTcNUcNVcNbcNWcNXcNYcNbaafaafaafaafaafaafaafaafaafaafaafaafaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcEdcEdcEecEdcEecEdcNZcOacObcOccOdcOecEdaafaafcNmcOfcUBcNmcOhcOicOjcOkcOlcOmbVEbVEbVEbVEcOnbVEbVEbVEbVEbVEcTjcNycOpcNycOqcOrcOscNycOtcOucOvbVEbVEbVEbVEbVEbVEcyocOwcOxbVEcTkcTtcTlbVEcfyccfcOBbVEbVEbVEbVEbVEbVEbVEbVEbVEcqDcNbcOCcODcOEcNbaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaaaafaafaafcOFcOGcOHcOIcOJcOKcOLcOMcONcEdaaaaaacNmcOOcOPcNmcOQcORcOScOTcNmcNmcOUcOVcOWcOXcOYcOZcPacPbcPccPdcPecNycOpcNycPfcPgcPhcNycPicPjcPkcPlcPmcPncPocPpbVEcPqbVEbVEbVEcTucTwcTvbVEbVEbVEcmZbVEcPucPvcPwbVEcPxcTxcPzbVEcplcNbcPAcPBcPCcNbaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaafaaaaaacPDaafcPEcEdcEdcEdcEdcEdcEdcEdaaaaaacNmcPFcPGcNmcPHcWAcPJcPKcNmcPLcPMcPNcPOcPPcPQcPRcPScPScPTcPUcPVcPWcPXcPYcPfcPZcPhcNycOtcQacPfcQbcQccNycQdcQebVEcQfbVEaafaaacTycTzcTyaaaaaaaafaaabVEciEbZQbZQcQicfscQjcfscQkcQlcNbcQmcQncQmcNbaaaaafaaaaafaafaaaaaaaafaqJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaafaafaafaaaaaaaaaaafaafaafaaaaaaaaaaafaaaaaaaaacNmcWIcQpcQqcQrcQscQtcQucNmcQvcNmcQwcQxcQycQzcQAcPOcPOcQBcQCcQDcQEcQEcQFcPfcQGcPhcNycOtcQHcQIcQJcQKcQLcQMcQNbVEcPqbVEaafaafcTycTAcTyaafaafaafaaabVEcQPbZQbZQcQQcQRbYicQSbVEcmZcNbcQmcQTcQmaafaaaaafaaaaaaaafaafaafaafaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaobaaaaafaaaaaacPDaafcPEcEdcEdcEdcEdcEdcEdcEdaaaaaacNmcPFcPGcNmcPHcWAcPJcPKcNmcPLcPMcPNcPOcPPcPQcPRcPScPScPTcPUcPVcPWcPXcPYcPfcPZcPhcNycOtcQacPfcQbcQccNycQdcQebVEcQfbVEaafaaacTycTzcTyaaaaaaaafaaabVEciEbZQbZQcQidfxcQjcfscQkcQlcNbcQmcQncQmcNbaaaaafaaaaafaafaaaaaaaafaqJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaafaafaafaaaaaaaaaaafaafaafaaaaaaaaaaafaaaaaaaaacNmcWIcQpcQqcQrcQscQtcQucNmcQvcNmcQwcQxcQycQzcQAcPOcPOcQBcQCcQDcQEcQEcQFcPfcQGcPhcNycOtcQHcQIcQJcQKcQLcQMcQNbVEcPqbVEaafaafcTycTAcTyaafaafaafaaabVEcQPdfybZQcQQcQRbYicQSbVEcmZcNbcQmcQTcQmaafaaaaafaaaaaaaafaafaafaafaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaacNmcPFcQUcNmcQVcQWcQXcQYcQZcRacNmcRbcRccRdcRecRfcRgcRhcPccPdcPhcNycRicRjcRkcRlcRmcQEcRncRocRpcRqcRqcRrcRscRqbVEacnaafaaaaaacTycTBcTyaaaaaaaafaafbVEcRucRvcRwbVEcRxcRycRwbVEaaaaafcQmcQncQmaafaaaaafaaaaaaaafaafaaaaaaaobaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaiaaaaaaaafaaiaagaaiaafaaiaaiaaiaafcOUcOUcOUcNmcNmcNmcNmcRzcRAcNmcNmcNmcRBcRCcRDcRecREcRFcRGcOUcOUcPhcNycNycNycPfcPgcPhcNycRHcRIcRJcRKaafaafaaaaaaaafacnaafaaacTOcTCcTPcTCcTQaaaaafaaabVEbVEbVEbVEbVEbVEbVEbVEbVEaaaaafaaacRPaaaaafaafaafaafaafaafaaaaaaaafaobaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacRQcRRcRScOUcRTcRUcRVcRWcRXcRYcOUcRZcSacSbcSccRecRfcRgcRhcSdcOUcSecNycSfcSgcShcSicSjcSgcSkcNycSlcRqaaaaafaafaafaafaafaafaafcTCcTRcTTcTScTCaafaafaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaafaaacRPaaaaafaafaaaaaaaaaaafaaaaaaaaaaqJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index e65e552ae3a..1d29e8e7877 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -649,7 +649,7 @@ "amy" = (/obj/structure/bed/stool{pixel_y = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "amz" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "amA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"amB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"amB" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/security/prison) "amC" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "amD" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "amE" = (/obj/structure/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bedsheet,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -1181,7 +1181,7 @@ "awK" = (/obj/structure/table/glass,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "awL" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "awM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"awN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"awN" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "awO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/electrical) "awP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical) "awQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/engineering{name = "Electrical Maintenance"; req_access_txt = "11"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/electrical) @@ -1920,7 +1920,7 @@ "aKV" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/kitchen) "aKW" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aKX" = (/obj/machinery/door/window/eastright{name = "Hydroponics Delivery"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hydroponics) -"aKY" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) +"aKY" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "aKZ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Chapel Crematorium"; dir = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "aLa" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "aLb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock{name = "Crematorium"; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) @@ -3269,7 +3269,7 @@ "bkS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central) "bkT" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bkU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) -"bkV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/power/apc{dir = 2; name = "Head of Personnel APC"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads) +"bkV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "bkW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bkX" = (/obj/machinery/power/apc{dir = 4; name = "Conference Room APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/bridge/meeting_room) "bkY" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/maintcentral) @@ -3319,8 +3319,8 @@ "blQ" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "blR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "blS" = (/obj/machinery/light/small{dir = 8},/obj/machinery/mass_driver{id = "trash"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/disposal) -"blT" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"blU" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/disposal) +"blT" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"blU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "blV" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/disposal) "blW" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/quartermaster/storage) "blX" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -6212,7 +6212,7 @@ "cpx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering) "cpy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/engine/engineering) "cpz" = (/obj/structure/particle_accelerator/end_cap,/turf/simulated/floor/plating,/area/engine/engineering) -"cpA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/engine/engineering) +"cpA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "cpB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) "cpC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engine/engineering) "cpD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -6276,7 +6276,7 @@ "cqJ" = (/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard) "cqK" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft) "cqL" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) -"cqM" = (/obj/structure/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft) +"cqM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "cqN" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel,/area/engine/engineering) "cqO" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil,/obj/item/weapon/electronics/airlock,/obj/item/weapon/electronics/airlock,/turf/simulated/floor/plasteel,/area/engine/engineering) "cqP" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -6782,6 +6782,25 @@ "cAv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating/airless,/area/space/nearstation) "cAw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space/nearstation) "cAx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating/airless,/area/space/nearstation) +"cAy" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/electrical) +"cAz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) +"cAA" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"cAB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"cAC" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) +"cAD" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/disposal) +"cAE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"cAF" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/disposal) +"cAG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/power/apc{dir = 2; name = "Head of Personnel APC"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/crew_quarters/heads) +"cAH" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) +"cAI" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/disposal) +"cAJ" = (/obj/structure/closet,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/disposal) +"cAK" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cAL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/simple_animal/lizard{name = "Wags-His-Tail"; real_name = "Wags-His-Tail"},/turf/simulated/floor/plasteel,/area/janitor) +"cAM" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft) +"cAN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft) +"cAO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/engine/engineering) +"cAP" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) +"cAQ" = (/obj/structure/bed/chair,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6849,12 +6868,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcpwavTcpFaadaaaaadcpHcpHcpHaadaaaaadbsBcdPbJSaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaafaaaaafaaaaafaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcpHcpHcpHaadaaaclOcqIcrgcrfcmEaaaaadcpHcpHcpHaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaiaaiaakaajaalaajaalaajaamaaiaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclOcqIcrgcrfcmEaaaaaaaaaaaaaaaaaaaaaclOcqIcrgcrfcmEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaiaanaapaaoaaraaqaataasaavaauaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaiaawaayaaxaayaayaayaazaavaaAaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaiaawaayaaxaayamBaayaazaavaaAaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaiaaiaaBaaDaaCaaFaaEaataataavaaGaaiaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaiaaIaataataataataaJaataataaLaaKaaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaMaaJaataataaOaaNaaJaataaQaaPaaiaafaaRaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaUaataataataaJaaWaaVaataataaYaaXaaiaaiaaZaafaafaafaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcabbabeabdabgabfaatabhaataataataataataataavaatabjabiaaZaaTaaTabYaaTaaTabYabYaaTadRabpaboabpaboabpabqabqabrabrabrabqabqaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcabbabeabdabgabfaatabhawNaataataataataataavaatabjabiaaZaaTaaTabYaaTaaTabYabYaaTadRabpaboabpaboabpabqabqabrabrabrabqabqaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafabsaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuabtabwabvabyabxaataatabAabzabBaatabDabCabEaatabGabFaaZaafaaaaaaaaaaaaaaaaaaaafaboabPabOabOabOabRabqabTabSabVabUabWabqaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafabXaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSabYabYabYabYaafaafaaaabZaaaaafaafaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuacaaccacbabyacdaceacdacdacdacfacdacdacdacgacdacdachaaZaaZaaZaaZaaZaaZaaZaaZaaZaaZacoabOacqacpabPabqacsacracuactabkabqaaaaafacwaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaafaafaaaacxaaaacyaafaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaafaaaaafaaaaaaabZaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuaczacBacAabyacCaatabKacdacEabMabLacdacHacJacDacdacKaaZabmabHabnabJabIabQabNaciaaZacOabOacqacPabPabracRacQacSacuacjabqaaaaafabpacUabpaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaafaaaaafaaaaaaacxaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6873,39 +6892,39 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaafaafaafajVajWajVaafaafaafaafaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajYajXajXajXajZaaaaafaiVakbakaakdakcakfakeakhakgakjakiaklajFajGakmaklajFakoakmaklakkakqakpakpakpakrahYaktaksakvakuakxakwakyakwakwakwajHajnajnajoahTaifaiAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaafaafaafaafadUaafaafaafaafaafaaSaaSaaSaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafaaaajVakBajVaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakDakCakFakEakDaiUaiUakGakIakHakKakJaiXagjafKagjagjakMakOakNakQakPakRakNakQakPakTakSakQakUakVakQakXakWakQakYalaakZaiXalbalcajnaldajnaknajTajnajoahTaifaiAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaalgaaaaaaaafaaaaaaaafaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafajVajValhajVajVaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaealialialialialiaaaalkaljalmallaloalnalpalnakIalqalsalraiXafLafMafLagjalvalxalwagjalyalxalwagjalyalxalwagjalzalBalAalCaiGagjalxakzalEaiXalGalIalHalJalHaleakAajnajoahTaifaiAaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaaaaaalNaaaaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaalPalOalPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafalRalQalTalSalRalUalUalUalUalUalUalUalUalUaaaaaaaaaaaaalialValXalWaliaaaakDalYamaalZakDaiUaiUaiUamcambameamdaiXafLafMafLagjamfalxamgagjamhalxamiagjamjalxamkagjamlamnammalCamoagjampalfamqaiXamramsamramtamralDamramrajoahTaifahnahnaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaamwamvamwaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaalPamxalPaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaafalRalQalTalSalRalUalUalUalUalUalUalUalUalUaaaaaaaaaaaaalialVaKYalWaliaaaakDalYamaalZakDaiUaiUaiUamcambameamdaiXafLafMafLagjamfalxamgagjamhalxamiagjamjalxamkagjamlamnammalCamoagjampalfamqaiXamramsamramtamralDamramrajoahTaifahnahnaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaamwamvamwaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaalPamxalPaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalRamyamAamzalRalFalFalUamDamCamEalUamFalUaaaaaaaaaaafalUamGamCamHalUaaaakDamIamIamJakDaaaaaaamKaiTaiUamMamLaiXafLafNafLaiXamQamRamRamSamRamRamRamSamRamRamRamSamTamVamUamXamWaiXaiXaiXaiXaiXamYamZamYajpamYanaamYajpajoalLalKandahnahnahnaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaamwaneamwaaaaafaafaafaafaaaaafaaaaaaaaaaafaafaaaaaaaaaalPanfalPaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalRanganianhalRanjanlankanmamCannalUalUalUalialUalialialUanoanpanoalUaaaalkanqamIanrakDaiUaiUaiUantansanvanuaiVaiXaiXaiXaiXanwanwanwanxanwanwanwanyanwanwanwanxanwanwanwanzanzanBanAanAanAanCamYamZamYajpamYanaamYajpajoahTalManFanEanGanEaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaafamwamwamvamwamwaafaaaaaaaafaaaaafaaaaaaaaaaaaaafaafaaaaaaalPanfalPaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaalRalRanIanHalRanJamCalUamCamCamCankamCamCanKamCalXamCamCamCamCanLaliaaaakDanMamIamIanOanNalpanNakIalqalsalqanPanzanzanzanQanzanzanRanzanzanzanzanzanzanzanSanzanzanzanTanzanzanzanzanzanzanUajpanWanVanYanXamuanVajpaoaanbamBaodaodaoeahnaagaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafaofaohaogaoiaofaafaaaaaaaafaaaaafaaaaafaaaaaaaaaaafalPalPalPanfalPalPalPalPalPalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaalRalRanIanHalRanJamCalUamCamCamCankamCamCanKamCalXamCamCamCamCanLaliaaaakDanMamIamIanOanNalpanNakIalqalsalqanPanzanzanzanQanzanzanRanzanzanzanzanzanzanzanSanzanzanzanTanzanzanzanzanzanzanUajpanWanVanYanXamuanVajpaoaanbbkVaodaodaoeahnaagaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafaofaohaogaoiaofaafaaaaaaaafaaaaafaaaaafaaaaaaaaaaafalPalPalPanfalPalPalPalPalPalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalUalUalUalUalUaafaafalUaojaolaokaomanlalUalUalialialUalUalUalUalialUalialialUaonamCaooalUaaaakDaopaopaopakDaiUaiUaoqaosaoraouaotaiTaovaovaovaovaovaoxaowaovaovaovaovaovaovaovaoyaozaozaozaoAaoBaozaoDaoCaoFaoEanCaoGaoHajoajoajoajoajoajoajoahTancahnaoKaoLahnaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaafaofaoNaoMaoOaofaafaaaaaaaafaaaaafaaaaafalPalOalPalOalPaoPanfanfanfanfanfanfaoQalPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaqIaaaaaaaaaarCaaaaafaaaaaaaaaaaaaaaaaaaaaalUalUalUalUaoSaoRaoTalUaaaaaaalUamCaolanJamCaoUalUaoVaoVapQaoVaoVapQapQaaHaaHasCasCalUaoWamCaoXalUaaaaoZaoYaoYaoYapaaaaaafaiVaiUapbaiTapcapdapdapfapeapfapdapdapgaphaphaphapiaphaphapkapjapmaplaodapnaodaodaodaodapoaodaodaodaodaodapqappapsapraptaptanZanDapxapwapyahnaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaagaagaagaaaaafaofapAapzapBaofapCapCapCapCapCalOalOalOalPapDanfaoQalPalPanfalPalPalPalPapEalPalPaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafapFapHapGaaaapIapKapJaafaaaaagaagaagaaaaaaaafalUapLapNapMamCapOamCalUalialialUapPaolanJapPalUalUalUalialialialUalUaaHatRapQapQaaHalUalUankalUalUaaaaaaaaaaaaaaaaaaaaaaafaiTapRalpaiTapSapdairapUapUapUapVapdaqZaphaobaocataaqbaphanwanzaqdaqcaqfaqeaqeaqeaqeaqeaqhaqgaqeaqeaqeaqeaqeaqiaqkaqjaqmaqlapuaoIahnaqpaqqahnaafaqraqsaqsaqtaqsaqsaquaafaafaaaaaaaaaaafalOaqvalOaaaapCaofaofaqwaqxaofaqyanfanfanfalPaqzanfaqAalPanfanfanfaqBalPanfalPaqDaqCalPanfaqEalPaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafapFapHapGaaaapIapKapJaafaaaaagaagaagaaaaaaaafalUapLapNapMamCapOamCalUalialialUapPaolanJapPalUalUalUalialialialUalUaaHatRapQapQaaHalUalUankalUalUaaaaaaaaaaaaaaaaaaaaaaafaiTapRalpaiTapSapdairapUapUapUapVapdaqZaphaobaocataaqbaphanwanzaqdaqcaqfaqeaqeaqeaqeaqeaqhaqgaqeaqeaqeaqeaqeaqiaqkaqjaqmaqlapuaoIahnaqpaqqahnaafaqraqsaqsaqtaqsaqsaquaafaafaaaaaaaaaaafalOaqvalOaaaapCaofaofaqwaqxaofaqyanfanfanfalPaqzanfaqAalPanfanfanfaqBalPanfalPaqDaqCalPblTaqEalPaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaqFarDaqFaaaaqHcpKaqHaafaafaliaqJaliaaaaaaaafalUaqKaqLaomaqNaqMaqOalUaoXamCaqPamCaolanJamCamCamCamCamCamCamCamCalUalUalUapQaaHapQaaHaqQaqRaqQaaaaaaaaaaaaaaaaaaaaaaaaaafaiTapRaqSaiTaqTapdaqUaqWaqVaqYaqXapdaqZapharaarcarbareardanwanzanAaqcahTarfarfarfarfarfarhargarfarfarfarfarfarfarfarfarjapvahnapXarjarjarjarjarjarmaroaroaroaroaroarmarjaafaaaaaaaaaaafarpanfalOaaaapCarqarsarrartanfanfanfalPanfalParuanfanfalPanfarwarvarxapEanfalParzaryalPanfarAalPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaqFcpLaqFarBaqHczKaqHarBaafarEamCaliaaaaaaalUalUalUalUalUankarFarGarGarIarHarJarHarLarKarNarMalUamCalUalUalUamCalUarOalUaaHapQaoVapQaqQaqRaqQaaaaaaaaaaaaaaaarParParParParParParParParQapdarRaqWarSarUarTapdaqZarWarVarYarXarZardanwanzasaaqcahTarfaqaapYaqnasdasgasfarfaqoasmariarfaskasmarkarjarlasbarnasrasqastassarjarmaroaroaroaroaroarmarjaafaafaafaafalOalOaqvalOalOapCasvanfaswanfaoPanfalPalPasxalPalPasyalPalParxasAaszanfalPanfasBasBasBasBasBasBasBasBasBatSatSatSatSaaHatSatSapQapQaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasEasDasGasFasEasHasJasIasEalUaliaqJalialialialUaseascascascascascascashasiatPalUalUalUalUamCalUalUamCasOalUarNamCalUalUalUalUaoVaoVaoVaqQaqRaqQaaaaaaaaaaafaafarPasQasParPasRasTasSarParQapdasUasWasjasnaslapdapWasoapZataatcataardanwanzatdaqcahTarfatfateathatgatjatiarfaspatoasuarfatmatoasLarjasMasVasNasNasNasNasXasZasYaroaroaroaroaroarmarjarjarjaaaaaaalOanfanfanfaqyapCatvarxaswanfatwatyatxapEanfanfanfanfatzanfanfasAatAanfatBanfasBatDatCatEasBatGatFatHasBapQaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasEasDasGasFasEasHasJasIasEalUaliaqJalialialialUaseascascascascascascashasiatPalUalUalUalUamCalUalUamCasOalUarNamCalUalUalUalUaoVaoVaoVaqQaqRaqQaaaaaaaaaaafaafarPasQasParPasRasTasSarParQapdasUasWasjasnaslapdapWasoapZataatcataardanwanzatdaqcahTarfatfateathatgatjatiarfaspblUasuarfatmatoasLarjasMasVasNasNasNasNasXasZasYaroaroaroaroaroarmarjarjarjaaaaaaalOanfanfanfaqyapCatvarxcpAanfatwatyatxapEanfanfanfanfatzanfanfasAatAanfatBanfasBatDatCatEasBatGatFatHasBapQaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasEasEatIasEasEasEatIasEasEatJaxkaAYatbatbatlatkatpatnatqatqatqatqatqatqatrauVavbaaHavUalUamCatTapParNatLalUatUamCamCamCatWaliaoVaoVapQaqQaqRaqQaaaaaaaaaarParParPaqRaqRarPaqRaqRaqRarPatXapdatYapUatsatKatuapdaqZaufaphauhaugauiaphaujanzanAaqcahTarfarfarfarfarfaulaukarfarfatQaunarfarfaupaunarjatVausaurautautauvauuauaatZaroaroaroaroaroauyauAauzauBaaaaaaalOanfanfauCanfapCauDanfauEauFauFauFauFauGauFauHanfanfanfanfanfanfanfanfalPatyasBauJauIauIasBauLauKauMasBaoVaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasEauNauPauOasEauQauPauOasEaqOaucaubascascascaudaumaueaonauXauZauYavaalUatNauVaaHbNbavbaliamCasOalUalUalUalUalUalUalUavcatWaliapQaoVapQaqQaqRaqQaagaagaagavdaveavdaqRaqRarParPavfarParPatXapdapdapdauoauqapdapdavhaviaphaphaphaphaphavjanzavkaqcahTarfaqaapYauwasdauRauxauUauSavgauWavmavlavnavuavxavwausavyavzavzavAattavBauBaroaroaroaroaroauBavDavCauBaafaafalPanfanfalPalPapCapCapCapCapCapCapCapCapCalPavFavEalPalPalPalPalPalPalPalPanfavoasBauIauIavLavNauJavOasBaoVaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafarBasEatIavParBasEavQavParBalUavpauValUalUalUalUavqaueamCavSbsUamCamCalUatNauVbOiapQbOialUamCavValUavWavXalUatUaqOatMatOatOatOavYavYavYavZawbawaavYavYavYavZawaavZavZawbavZawcawbawdawfaweawgawgawgavravsawgawgawhawiawgawgawgawgawjawlawkawkawmawnarfatfathathawoatjavtavGavvawpavRawsawqawvawtawzawyawAavyavzavzavAattawBauBaroaroaroaroaroauBawCavCarjaaaaaaalPawDanfanfawEalPawFaoQawGawHaoPalPauDaoPalPawIanfalPawJanfalPawLawKawMawxawxawxawQawPawTawRaxaawSawUasBatSatSaaHaaHatSatSatSatSapQapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWawVawVawVawXawVawVaxcaxGaxhaxIaxHawZawZaxbalUaxJaueaxeaxdaxfamCaxgalUatNaxKatOatOatOatOaxiatOatPamCaxfaxjamCamCaxlaxkaxnaxmaxoaxoaxoaxpaxoaxqaxoaxoaxsaxraxuaxtaxtaxtaxtaxtaxtaxvaxxaxwaxyaxyaxyaxyaxzaxyaxyaxzaxyaxAaxAaxAaxAaxAaxCaxBaxEaxDaxFarfarfarfarfarfaulaxLawrawuaxNaxMaxPaxOaxXaxVaxRaxQaxTaxSaxUaxUaxWattaxYatZaroaroaroaroaroaxZaybayaarjaaaaaaalPanfanfanfanfanfanfawNauFauFauFauFauFauFauFaycanfanfanfanfatBanfanfaygayeavIavHavKavJavMauIauIauIayjasBapQaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWawVawVawVawXawVawVaxcaxGaxhaxIaxHawZawZaxbalUaxJaueaxeaxdaxfamCaxgalUatNaxKatOatOatOatOaxiatOatPamCaxfaxjamCamCaxlaxkaxnaxmaxoaxoaxoaxpaxoaxqaxoaxoaxsaxraxuaxtaxtaxtaxtaxtaxtaxvaxxaxwaxyaxyaxyaxyaxzaxyaxyaxzaxyaxAaxAaxAaxAaxAaxCaxBaxEaxDaxFarfarfarfarfarfaulaxLawrawuaxNaxMaxPaxOaxXaxVaxRaxQaxTaxSaxUaxUaxWattaxYatZaroaroaroaroaroaxZaybayaarjaaaaaaalPanfanfanfanfanfanfcqMauFauFauFauFauFauFauFaycanfanfanfanfatBanfanfaygayeavIavHavKavJavMcAyauIauIayjasBapQaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWaykaylaykaymaylaylaynaykaylaypayoayqayqayralUaxJaueaysamCamCaytayualUayiayhasKasKasKasKasKaywauVayxamCalUatJatJauVayyalUayzayBayAayAayCayAayDayAayAayFayEayHayGayGayGayGayGayGayGayJayIayLayKayNayMayPayvayQayOaySayRayTazWayXayWayYanzayZahnanFarfaqaapYayVasdazcawwawrawrawrawuazbazaazeazdavxazjazlazkaznazmazoazfazhazgaroaroaroaroaroazparjarjarjalPalPalPaoPalPalPapEalPalPaswalPalPazralPalPapEalPaswawDalPalPapEalPanfawDaygaydasAasBaztawOazvazuazwawOazxasBapQaoVaoVaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasEawWazyawWazzaylaylazAawWazyawWazBazCaymazDalUaxJauealUalUalUalUazFazFazqaziazFazFazFazFazFatNaxKatOatOatOatOatOazGayyaoXayzaaaaafaaaazHaaaazIaaaaafaaaayEayHayGazKazJazMazLazNayGayJazOazQazPazPazsazUazEazEazEazSazRazRayUazYayWazZanzaAaahnanFarfatfathathaAbatjazTazVaAdaAgaAfaAiaAhaAhazXaAharjaAlaAkaAnaAmaApaAoarjazparoaroaroaroaroazpalParAanfayfaAqalPalPalParAanfalParAaswalPaAranfalPaAsanfalPaAuaAtalPaAvanfalPapEapEaygaAcapEasBaAyawOaAAaAzaAAawOaABasBapQapQapQaoVaoVaoVaoVaoVaoVaoVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaACarBaADauPawWaAFaAEaAHaAGawWauPaADawWarBaAIaAJalUaAjaAeaAMaAMauTaAwazFaAPaAKaAxaATaASaAUaAPazFaAVaANaALaAYaAYaAYaAYaAYaAOatJayzaafaBaaBaaBbaBaaBcaBaaBaaafayEayHayGaBeaBdaBgaBfaBeayGaBiaBhaBkaBjaAWaARaBoaBnaBqaBpaBsaBrazWazWazWaBtazZanzaBuahnanFarfarfarfarfarfaAXaukaAhaAhaAhaAhaAhaAhaBzaAZaBAaAharjarjarjarjaBCaBBarjazparoaroaroaroaroazpalPalPanfaBDaAqalPaBEalPanfanfalPanfaswalPanfanfalPanfanfalPaswatyalPanfanfalPaBFanfaygaydarxasBasBasBasBasBasBasBasBasBatSatSatSatSatSapQaoVaoVaoVaoVaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaACarBaADauPawWaAFaAEaAHaAGawWauPaADawWarBaAIaAJalUaAjaAeaAMaAMauTaAwazFaAPaAKaAxaATaASaAUaAPazFaAVaANaALaAYaAYaAYaAYaAYaAOatJayzaafaBaaBaaBbaBaaBcaBaaBaaafayEayHayGaBeaBdaBgaBfaBeayGaBiaBhaBkaBjaAWaARaBoaBnaBqaBpaBsaBrazWazWazWaBtazZanzaBuahnanFarfarfarfarfarfaAXaukaAhaAhaAhaAhaAhaAhaBzaAZaBAaAharjarjarjarjaBCaBBarjazparoaroaroaroaroazpalPalPanfaBDaAqalPaBEalPblTanfalPanfaswalPblTanfalPanfanfalPaswatyalPanfanfalPaBFanfaygaydarxasBasBasBasBasBasBasBasBasBatSatSatSatSatSapQaoVaoVaoVaoVaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWazyawWawWawWawWawWawWazyawWaaaarBaBHazDaBIaBKaBJaBIaBIaBIaBlazFaAPaBvaBmaBwaFPaBGaAPazFalUaBLaBQaBQaBQaBQaBQaBQaBNaBQaBRaaaaBaaBTaBSaBVaBUaBWaBaaaaayEayHayGaBeaBXaBZaBYaBeayGaqRakLayLaBOaCaaBPaCgaCbaBraCcaCiazWazWaCjazWaBtazZanzaAaahnanFarfaqaapYaCdasdazcaukaAhaCmaDOaCnaCnaAhaBzaCeaBAaAhaCqaCfaChaCraCtaBBaafaCuaCvaCvaCvaCvaCvaCwaaaalPanfaCxaCyalPalPalPalPalPalPaCzaCAalPalPalPalPalPalPaCBaCDaCCaCEaCEaCEaCFaCHaCkaClaCIaCoaCKaCNaCMaCEaCOaCQaCPaCRaCRaCRaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaCTaCSaCUaCSaCVaCVaCVaCVaCSaCUaCXaCWarBazzaCpaBIaCLaCsaCYaDcaDfaCZazFaAPaDaaAQaDgaAQaAQaAPazFaDhaDdaDbaDlaDkaDnaDmaDpaDeaDqaBRaafaBaaDsaDraluaDtaDvaBaaafayEayHayGaDjaDiaDxaDwaDyayGaqRaDzayLaDCaDBaDAazWaDDaDEaDFaDIafOaBtayWafPayWazZanzaAaahnanFarfatfateathaDKatjaDGaFgaDLaDQaDMaDMaDSaDUaDTaDPaAhaDRaDYaEcaEbaEAaBBaaaaafaaaaafaaaaafaaaaafaaaalPawDaDVaCGaDWaDXalPatwanfawDaswanfalPaaaalPayfaCGaCGaEBaEaaDZaDZaDZaDZaDZaEDaECaEeaEdaEfaEfaEfaEgaEiaEhaEkaEjaEmaElaEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCTaCSaCSaEpaEoaEraEqaEtaEsaEvaEuaEwaEraEyaExawWazzaEzaBIaEGaEEaEIaEHaEKaEJazFaEFaAQaAQaAQaAQaAQaAQaELaDoaDdaDoaDoaDoaDoaDoaDoaDeaDoaBRaaaaBaaENaEMaEMaEOaEPaBaaaaayEayHayGaERaEQaETaESaEUayGaqRaEVayLayLaDIaEWaEXaEYaFcayLayLazWazWayWaFbayWazZanzaAaahnanFarfarfarfarfarfaFeaFdaFhaFfaFiaGxaGxaGxaGxaGxaBxaAhaFlaFjaFkaCraCtaBBalPalPalPalPalPalPalPalPalPalPalPalPalPaFnalPalPalPalPayfaCJaFpaFoaFqaFoaFmaFraFtaFsaFvaFuaFuaFuaFuaFwaFyaFxaFwaFwaFwaFwaFwaFwaFwaFzaFBaFAaCRaCRaCRaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCVaFCaFCaFDaEraFEaEraFEaEraFEaEraFEaEraEyaFFawWazzaFGaBIaFIaFHaFKaFJaFMaFLazFaFNaAQaAQaAQaAQaAQaFOazFaFQaFRaFYaFSaDoaDoaDoaFUaFTaFZaBRaafaBaaGbaGaaGdaGcaGeaBaaafayEaFVayGaFXaFWaETaJhaGfayGaGhaGgayWaGoazWaGiaEZaGjazWaGqayWagmaioayWaEZayWaGtapjaGuahnanFanFanFanFanFaoaaulaukaAhaGkaGlaAhaGmaAhaGnaAhaGpaAhaGDaGraGwaGvaGzaGyaGIaGHaGKaGJaGAaGLaGLaGLaGLaGNaGBaGLaGLaGPaGRaGQaGSaCEaGCaGTaGWaGVaGXaGVaGFaGEaFubbEaGGaFuaHcaHbaHdaFwaGOaGMaFwaHfaGUaHgaGYaHiaHlaHkaHnaHmaHpaHoaHqaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacrycrxcrxcrxcrxcrxcrzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCVaEraEraHsaEraFEaEraFEaHtaFEaEraFEaEraEyaFFawWazzaHuaBIaBIaGZaHyaHaaHyaBIazFazFazFazFaHzaAQaBMaHAazFaHeaDdaDoaDoaDoaHDaDoaDoaDeaHEaBRaaaaBaaBaaHFaHGaHFaBaaBaaaaayEayHayGaHjaHhaHwaHvaHLayGaqRaHxayWaHNazWaHBaEZaHCazWaHOayWaBtaBtayWafPayWaHQaHPaHRahnaoaahnahnahnahnahnaHTaHHaAhaHUaByaAhaHVaAhaHWaAhaHXaAhaHZaHIaHKaCraIbaIaaIdaIcaIeaIeaHSaHMaIeaIgaIiaIhaIfaHYavIavIavIaIkaImaIjaIlaInanfaIpaIpaIpaIqaIoaFuaIraIuaIsaIwaIvaIxaFwaIBaIyaFwaIzaICaIAaIIaHiaIDaFzaFBaEjaIFaIEaHqaaaaaaaaaaaaaaaaafaaaaaaaaaaaacrycrOcrNcwFcrQcwFcwGcwHcrzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCVaIGaIGaIHaEraFEaEraFEaEraFEaEraFEaEraEyaFFawWazzaylaNhaIMaIJaIMaILaylaIOaIQaIPaIRazFaISaAQaAQaITazFaINaDdaDoaIXaIWaIZaIYaJbaIUaJcaBRaaaaafaaaaJdaJeaJdaaaaafaaaayEayHayGaJaaIVaHJaJhaJiayGaqRaqZayWaJjazWaEZaEZaEZaJfaJlayWaaaaaaaJnaJpaJoaJraJqaJtaJsaJuaJnaaaaaaaJwaJvaJyaJgaAhaJzaByaByaByaDNaByaByaByaAhaCraJkaCraCraCraBBaJDaJCaJCaJEaJxaJmaJCaJHaJIaJIaJAaQjaJKaJIaJLaIpaIpaJBaIqaIpaIpaIpaJOaJNaIqaIoaFubavaJQaJPaJSaJRaJFaFwaJJaJGaLoaJMaJUaJTaJWaJVaIDaFzaFBaEjaHpaKeaHqaaaaaaaaaaaaaaaaafaaaaaaaaaaaacwIcwKcwJcwLcwLcwLcwMcwNcwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKfaCSaCSaEpaKgaEraEraEraEraEraEraKhaEraEyaKiawWazzaylaKjaKkaJXaKkaJYaKkaKkaKkaKlaylazFaKnaKmaKnazFazFaKpaJZaKpaBQaBQaBQaBQaKpaKaaKsaBRaKuaKtaKtaKvaKwaKbaKtaKtaKxayEaKyayGaKcayGaKdaKAaKBayGarPapgayWayWayWaBtaEXaBtayWayWayWaJnaJnaJnaKEaJqaJqaJqaJqaJqaKFaJnaJnaJnaJwaKGaJyaKoaAhaAhaAhaAhaAhaAhaAhaAhaAhaAhaKJaMraKraKqaKNaKMaKPaKOaJCaKQaJxaKzaKSaKRaJIaKTaKCaQjaKVaJIaKXaKWaKHaKDaKKaKIaKIaKLaKUaLdaIqaIoaFuaLfaJQaLgaJSaJRaLhaFwaKZaKYaLbaLaaLeaLcaMXaFwaFwaTeaFBaEjaIFaIEaHqaaaaafaafaafaafaafaafaafaaaaaacwIcwPcwOcwRcwQcwLcwMcwScwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKfaCSaLsaCSaCVaCVaCVaCVaCSaCUaLuaLtarBaLvaylaLwaLyaLiaLzaLjaLAasEaLCaLBaylaLDaLFaLEaLEaLGaLEaLEaLkaLEaLEaLEaLEaLEaLEaLHaLKaLJaLMaLLaLNaLNaLPaLNaLNaLNaLNaLlaLnaLmaLpaLNaLqaLNaLTaHPaLIaLxaLWaLVaLXaJsaJsaJsaJraJqaJqaLYaJqaJqaMaaLZaMcaMbaMeaMdaMfaJqaJqaLYaMhaMgaMjaLOaLRaLQaMnaMmaJqaMoaJqaCraMqaMpaMraMraMraLSaMvaMuaMxaMwaJCaLUaMiaKRaMCaMBaJIaMDaKCaMkaMlaJIaJIaMGaMIaMsaMyaMtaMAaMzaMEaMNaIqaIoaFuaItaItaMHaMJaItaItaFwaMWaMKaFwaMXaMXaMXaMXaFwaMMaMLaLraEjaCRaCRaCRaMZaMZaMZaNaaNaaNaaafaafaaacrycwTcwUcwUcwVcwUcwXcwWcwUcwTcrzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWazyawWawWawWawWawWawWazyawWaaaarBaBHaNbaLwaNdaMOaNeaMPaNfasEaNgaLBaNiaNhaLFaNjaNlaNkaNnaNmaNoaLEaLEaLEaLEaLEaLEaLEaLKaLEaLFaLEaLEaLEaMRaMQaMSaMSaMSaMTaMUaMSaMVaMSaMYaMSaNpaNcaNraNqaNsaJqaJqaJqaJqaJqaJqaJqaJqaLYaJqaJqaNwaNvaNyaNxaNAaNzaNBaJqaJqaLYaJqaJqaJqaJqaJqaJqaJqaJqaJqaNCaJqaCraMraMraMraNtaNFaNFaNHaNGaNJaNIaJCaNuaNEaNDaJCaJCaJIaNMaKCaNKaMFaNOaJIaIpaIpaNLaIpaIpaIpaNQaNNaNQaIqaIoaFuaNSaItaItaNPaItaNVaFwaFwaFwaFwaFwaFwaFwaNWaFwaFzaFzbxmaEjaNYaNXaCRaNZaObaOaaOdaOcaNaaafaaaaaacwIcwYcwYcwYcrxcwZcwLcxacxccxbcrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKfaCSaCSaEpaKgaEraEraEraEraEraEraKhaEraEyaKiawWazzaylaKjaKkaJXaKkaJYaKkaKkaKkaKlaylazFaKnaKmaKnazFazFaKpaJZaKpaBQaBQaBQaBQaKpaKaaKsaBRaKuaKtaKtaKvaKwaKbaKtaKtaKxayEaKyayGaKcayGaKdaKAaKBayGarPapgayWayWayWaBtaEXaBtayWayWayWaJnaJnaJnaKEaJqaJqaJqaJqaJqaKFaJnaJnaJnaJwaKGaJyaKoaAhaAhaAhaAhaAhaAhaAhaAhaAhaAhaKJaMraKraKqaKNaKMaKPaKOaJCaKQaJxaKzaKSaKRaJIaKTaKCaQjaKVaJIaKXaKWaKHaKDaKKaKIaKIaKLaKUaLdaIqaIoaFuaLfaJQaLgaJSaJRaLhaFwaKZcAzaLbaLaaLeaLcaMXaFwaFwaTeaFBaEjaIFaIEaHqaaaaafaafaafaafaafaafaafaaaaaacwIcwPcwOcwRcwQcwLcwMcwScwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKfaCSaLsaCSaCVaCVaCVaCVaCSaCUaLuaLtarBaLvaylaLwaLyaLiaLzaLjaLAasEaLCaLBaylaLDaLFaLEaLEaLGaLEaLEaLkaLEaLEaLEaLEaLEaLEaLHaLKaLJaLMaLLaLNaLNaLPaLNaLNaLNaLNaLlaLnaLmaLpaLNaLqaLNaLTaHPaLIaLxaLWaLVaLXaJsaJsaJsaJraJqaJqaLYaJqaJqaMaaLZaMcaMbaMeaMdaMfaJqaJqaLYaMhaMgaMjaLOaLRaLQaMnaMmaJqaMoaJqaCraMqaMpaMraMraMraLSaMvaMuaMxaMwaJCaLUaMicAAaMCaMBaJIaMDaKCaMkaMlaJIaJIaMGaMIaMsaMyaMtaMAaMzaMEaMNaIqaIoaFuaItaItaMHaMJaItaItaFwaMWaMKaFwaMXaMXaMXaMXaFwaMMaMLaLraEjaCRaCRaCRaMZaMZaMZaNaaNaaNaaafaafaaacrycwTcwUcwUcwVcwUcwXcwWcwUcwTcrzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWazyawWawWawWawWawWawWazyawWaaaarBaBHaNbaLwaNdaMOaNeaMPaNfasEaNgaLBaNiaNhaLFaNjaNlaNkaNnaNmaNoaLEaLEaLEaLEaLEaLEaLEaLKaLEaLFaLEaLEaLEaMRaMQaMSaMSaMSaMTaMUaMSaMVaMSaMYaMSaNpaNcaNraNqaNsaJqaJqaJqaJqaJqaJqaJqaJqaLYaJqaJqaNwaNvaNyaNxaNAaNzaNBaJqaJqaLYaJqaJqaJqaJqaJqaJqaJqaJqaJqaNCaJqaCraMraMraMraNtaNFaNFaNHaNGaNJaNIaJCaNuaNEaNDaJCaJCaJIaNMcABaNKaMFaNOaJIaIpaIpaNLaIpaIpaIpaNQaNNaNQaIqaIoaFuaNSaItaItaNPaItaNVaFwaFwaFwaFwaFwaFwaFwaNWaFwaFzaFzbxmaEjaNYaNXaCRaNZaObaOaaOdaOcaNaaafaaaaaacwIcwYcwYcwYcrxcwZcwLcxacxccxbcrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaACarBawWauPawWaOfaOeaOhaOgawWauPawWawWarBazzaylaLwaOjaNRaNeaMPaNfasEaOkaLBaylaNhaLFaLEaOmaOlaOlaOlaOoaOnaOpaOlaOqaOlaOlaOlaOraOlaOsaOlaOlaOlaNUaNTaOtaOiaOiaOuaOwaOvaOyaOxaOAaOzaOCaOBbBoaODaJqaOEaOEaOEaOEaOEaOEaOEaOEaOFaOEaOEaOEaOEaOEaOEaOEaOEaOEaOEaOEaOGaOEaOEaOEaOEaOEaOEaOEaOEaJqaJqaJqaCraOHaOHaOHaOHaOHaOHaOJaKMaOLaOKaJCaJCaOOaJCaJCaOPaJIaOIaONaOMaMFaOTaJIaIpaOVaOQaOXaOWaOXaOXaORaOZaIqaIoaFuaPbaPbaYWaOSaPdaPdaPfaFuaPgaPiaPhaCRaPjaPlaPkaFzaFzaPnaPmaCRaPoaCRaPpaPraVXaOUaPsaNaaNaaNaaNacwIcxdcxecxecxfcwLcwLcwLcwLcxacwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafasEawWazyawWazzaylaylazAawWazyawWaPtaPvaPuaylaLwaPxaOYaLzaPaaLAasEaPyaLBaylaPzaPzaPzaPBaPAaPAaPAaPAaPAaPAaPCaPDaPAaPEaPAaPAaPAaPGaPFaPHaPFaPJaPIaPKaLEaLEaPLaPNaPMaLEaPcaPOaLEaPQaPQaJqaPeaLXaJnaJnaJnaJnaJnaJnaJnaJnaPRaPTaPSaPUaPSaPSaPSaPVaPSaPWaPSaPXaPRaJnaJnaJnaJnaJnaJnaJnaJnaJraJqaJqaJCaPZaPYaQbaQaaQbaQbaQcaKMaQeaQdaQgaPwaQiaPPaJIaJIaJIaJIaQkaQjaJIaJIaJIaJIaOXaQfaQmaQmaQmaQmaQhaOXaIqaIoaFuaQpaItaYWaOSaItaItaQqaFuaQraQtaQsaCRaFzaQvaQuaQwaQwaQyaQxaQAaQzaCRaQBaQCaTmaPqaPqaQFaQEaQEaQFcxgcxecxhcxhcrxcxicxkcxjcwLcxacrxaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawWaQGaylawVaPuaylaylaQHawVaylaQGaPuaylaylaylaQIaQJaQlaQoaQnaQDaQDaRdaQKaylaPzaQLaPzaQMaPAaQOaQNaQQaQPaQRaQNaQTaQSaQVaQUaQXaQWaPGaQYaRaaQZaPJaRbaPKaPKaRcaPKaPKaPQaPQaReaRfaPQaPQaPQaRhaJqaLXaJnaaaaaaaaaaaaaaaaaaaaaaPRaRjaRiaRlaRkaRnaRmaRpaRoaRraRqaRsaPRaaaaaaaaaaaaaaaaaaaaaaJnaJraJqaRtaJCaRuaQcaRwaRvaRvaRvaQcaKMaQeaRxaPYaQcaRzaRgaJIaRAaRCaRyaRDaRBaRGaRFaRHaJIaOXaREaRJaRJaRJaRJaRIaOXaIqaRKaFuaRNaRNaYWaOSaROaROaRPaFuaFuaRQaFuaCRaRRaPlaPkaRSaRSaPnaPmaCRaCRaCRaNaaRUaRLaNaaNaaNaaNaaNaaRWcxlcwUcwUcwUcxmcxjcxjcxjcwLcxacwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaawWaRXaRYaRYaRYaRYaRYaRYaRYaRYaRXaRYaRZaylaylaNhaylbcDaSbaylaSdaylaRMaSeaSfaPzaSgaPzaQMaPAaShaQNaQNaQNaQNaQNaQTaSjaQNaQNaQNaQWaPGaSkaRaaRaaPJaRbaPKaSlaSmaSmaSnaPQaRVaRTaScaSaaStaSsaJqaJqaLXaJnaaaaaaaaaaaaaPRaPRaPRaPRaSvaSuaSxaSwaSzaSyaSBaSAaSDaSCaSEaPRaPRaPRaPRaaaaaaaaaaaaaJnaJraJqaJqaOKaQcaQcaQcaQcaSoaSHaSGaSpaQeaQdaSqaQcaSFaQcaSIaVzaSKaSJaSMaSLaSOaSNaVzaSPaSRaSQaRJaSSaSTaRJaSUaOXaIqaIoaFuaItaItaYWaOSaItaItaItaTcaTbaItaTdaCRaTeaTgaTfaRSaRSaTiaThaTjaCRaTlaTkaQCaTmaPqaPqaTnaQEaQEaTocxncwLcxocwLcwLcwLcwLcwLcwLcxpcwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafarBarBawWawWawWawWawWawWawWawWarBarBasEaNhaTraTqaTqaTsaTqaTqaTqaTqaTtaTqaTqaPzaSgaTuaTvaPAaTwaQNaSVaTxaTAaTzaTCaTBaSiaQNaQNaTDaPGaTEaTGaTFaPJaRbaPKaTHaTJaTIaTKaPQaSWaTLaSXaSraTPaSsaJqaJqaLXaJnaJnaJwaTQaPRaPRaTRaTTaTSaTVaTUaTXaTWaTYaTXaTZaTXaTXaUaaUcaUbaUeaUdaPRaPRaTQaJwaJnaJnaJraJqaJqaJCaUfaQcaQcaQcaUgaUgaQcaQcaMxaSYaQcaSZaQcaTaaJIaVzaVzaTMaVGaTNaTOaVFaVzaUhaUiaVIaRJaUjaUkaRJaXoaUzaIqaIoaFuaUBaUBaYWaOSaUCaItaItaUDaItaUFaUEaCRaUGaUIaUHaRSaRSaUKaUJaFzaCRaULaPqaQCaTmaPqaPsaNaaNaaNaaNacwIcxkcwLcxqcxrcwLcxqcxrcwLcxscwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxucxucxvcxucxucxucxwcxucxucxxaaaawWaAFaymaUMaTqaUOaUNaUQaUPaUQaUlaUmaUQaTqaSgaSgaUSaUTaPAaUUaUnaUoaUVaUqaUpaUsaUraUuaUtaUvaQWaPGaPGaPGaPGaPJaRbaPKaPKaPKaPKaPKaPQaVaaSraUwaSraSraSsaJqaJqaLXaJsaJsaVbaVdaVcaPRaVeaVgaVfaViaVhaViaVjaVlaVkaVnaVmaVpaVoaVmaVqaVsaVraPRaVtaVdaVuaVvaJsaJraJqaJqaOKaQbaQcczOaQcaVxaVwaQcaQcaQeaVyaQcaQcaQcaQcaVAaVzaVzaVBaVEaVDaVGaVFaVHaJIaVJaVIaVKaRJaRJaRJaXoaVMaIqaUxaFuaFuaFuaYWaOSaVPaVQaItaVSaVRaLgaVTaCRaFzaTgaTfaRSaRSaVUaThaVVaCRaVWaPqaQCaTmaPqaPsaNaaaaaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxycxAcxzcxBcxBcxBcxBcxBcxBcxBcxvaWaawWawWazzaylaTqaUybaHaUAaUOaUWaURaUmaUQaTqaWjaWlaWkaPzaPAaWnaTyaUXaWoaWqaWqaUYaWqaWqaWqaWpaUZaPAaWuaWwaWvaVCaWxaWAaWzaWBaPzaWCaPQaWEaWDaWGaWFaWFaSsaJqaJqaJqaJqaJqaWHaWJaWIaWLaWKaWNaWMaWPaWOaWRaWQaWTaWSaWVaWUaWXaWWaWYaWMaXaaWZaXcaXbaXeaXdaXgaXfaXhaJqaJqaJCaXiaQcaQcaQcaRwaRvaQcaQcaQeaVyaXjaVyaXlaXkaJIaVzaVzaVzaXmaVzaVzaVFaXnaJIaOXaVIaRJaRJaRJaRJaXoaOXaIqaVLaVOaVNaVZaVYaWbaXuaXuaWdaYWaYWaYWaYWaWeaRSaRSaRSaRSaRSaWgaXzaXBaXyaXDaXCaXFaWhaOUaXGaNaaafaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxtcxycxAcxzcxBcxBcxBcxBcxBcxBcxBcxvaWaawWawWazzaylaTqaUybaHaUAaUOaUWaURaUmaUQaTqaWjaWlaWkaPzaPAaWnaTyaUXaWoaWqaWqaUYaWqaWqaWqaWpaUZaPAaWuaWwaWvaVCaWxaWAaWzaWBaPzaWCaPQaWEaWDaWGaWFaWFaSsaJqaJqaJqaJqaJqaWHaWJaWIaWLaWKaWNaWMaWPaWOaWRaWQaWTaWSaWVaWUaWXaWWaWYaWMaXaaWZaXcaXbaXeaXdaXgaXfaXhaJqaJqaJCaXiaQcaQcaQcaRwaRvaQcaQcaQeaVyaXjaVyaXlaXkaJIaVzcACaVzaXmaVzaVzaVFaXnaJIaOXaVIaRJaRJaRJaRJaXoaOXaIqaVLaVOaVNaVZaVYaWbaXuaXuaWdaYWaYWaYWaYWaWeaRSaRSaRSaRSaRSaWgaXzaXBaXyaXDaXCaXFaWhaOUaXGaNaaafaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxDcxCcxCcxCcxCcxCcxCcxCcxCcxCcxCcxEaXIauPaXIaylaylaTqaWmaWiaWraXLaXLaWsaWtaXNaTqaXPaSgaWkaXQaXQaXQaWyaXpaXQaXsaXraXvaXtaXwaXwaXAaXxaPAaYaaYcaYbaXJaXEaXMaXKaYhaYgaYgaYiaYiaYiaYiaYiaYjaPQaJqaJqaYlaYkaYnaYmaYpaYoaPRaYqaYsaYraYuaYtaYvaYvaYxaYwaYzaYyaYBaYAaYCaYraYDaYqaPRaYoaYpaYEaYFaYkaYGaJqaJqaOKaQcaQcaQcaQcaQcaQcaQcaQcaXOaPYaYIaPYaQcaQcaYKaYJaYLaVzaVzaVzaVzaYMaYNaJIaYPaYOaRJaYQaYQaYRaYOaYTaXSaXRbdpbdpaXTaYYaXUaYWaYWaXVaYWaYWaYWaYWaWeaXWaZfaZfaZfaZfaZfaZgaZhaZeaZjaZiaZlaZkaPqaZmaNaaaaaafaaacrxcxkcwLcxqcxrcwLcxqcxrcwLcxscrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxGcxFcxHcxHcxIcxIcxIcxIcxIcxIcxIcxvawWawWawWazzaWcaXXaWfaXYaXZaXZaXZaXZaYdaUOaTqaZraZsaWkaXQaZtaZvaYebaOaXQaYHaZxaYSaPAaZBaZAaYXaYUaPAaZDaZFaZEaYZaZEaZEaZaaZEaZEaZIaZHaZHaZHaZJaZHaZLaZKaLYaLYaZNaZMaZMaZMaZMaZMaZMaZOaZQaZPaYtaYxaZSaZRaZRaZTaZRaZRaZUaYzaYAaZVaZXaZWaZVaZVaZVaZVaZVaZVaZYaLYaLYaJCbaaaZZbacbabaQcaQcaQcbadaZbbaeaQcbagbaibahaJIaJIaJIbajbakbakbakaJIaJIaJIbalaRJaRJbambambanbapbamaIqaZcaYVbaraFubasbaubataVQaItbaxaUDaVQaZdaCRbazaFzbaAaRSaRSbaAaFzbaBaCRbaDbaCbaEaTmaPqaPsaNaaNaaNaaNacwIcxkcwLcxqcxrcwLcxqcxrcwLcxscwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxGcxucxucxvcxucxucxucxwcxucxucxJaaaawWbaFaPubaGaTqaUQbaHaUQaUObaJaUQaZnaUQaTqbaLbaNbaMaXQaXQaXQaZwaZoaXQaZxaZxaZxaPAaZBaZAaYXaYUaPAaZDaZFaZEaZpbaSbaSbfibaUaZEbaWbaVbaYbaXaZKaZKaZKaZKaJqaJqaYlaZMaZuaZqaZzaZybbXaZCbbibbhbbkbbjaZRaZRbbmbblbbmaZRaZRbbnbbpbbobafaZGbaqbaobbvbbubbwaZVaYGaJqaJqaJCaJCaJCaJCaJCbbxaOKbbxbbyaJCaJCaJCaJCaJCaJCaJIbbzbbzbbzbbzbbzbbzbbAbbzaJIbambbBbbBbamaYVaYVaYVaYVaIqaZcaYVbaraFuaFuaFubbDaFubbDaFubbDaFuaFuaCRaCRbbFbbFbbFbbFbbFbbFaCRaCRbbGaPqbbHaTmaPqaPqaToaQEaQEaTocxKcwLcxLcwLcwLcwLcwLcwLcwLcxpcwIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6915,13 +6934,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasEawWbeKawWazzaylaylazAawWbeLawWazBbeNbeMbeMbeObeQbePbeSbeRbeUbeTbdubdtbdBbdBbdDbdCaXQaXQaXQbfabfbaXQaPzaPzaPzaPzbfcaWvbfdbfeaWvbffaZFaZEbfgbaSbaSbdEbaSaZEbfjaZKbfkbbRbcUbbRbfnbfmbfoaJqaYlaZMbbXbfpbcabdFbdKbdIbcdbfrbfsaYvbfubftbfvbfvbfvbfwbfxaYBbfzbfybfBbfAbfCbbwbfDbbwbfEaZVaYGaJqaJqbfFbfFbfFbfFbfFbfFbfFbfHbfGbfGbfGbvkbfJbfHbfKbfKbfKbfKbfKbfLbfLbfLbdNbfLbfLbfLbfLbfOaYVbeEbfPbfSbdObdPaYVaYVaYVbfUbfUbfVbfVbfVbfVbfVbfWbfXbfXbfXbfYbfXbfZbgabfXbfXbgbbgcbgcbgcbgcbgebgdbggbgfaNaaafaaaaaacwIcxUcxUcxVcxVcwIcxccxacxacxScrxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaACarBaADauPawWaAFaAEbgibghawWauPaADawWarBaACasEbeObgkbgjbgjbgjbglbdQbdTbdRaWvaWvbeabdZaXQaZtbgrbfabgsaXQbgtbgtaSgbelbewaYbbgwbgxbgxbgxbgyaZEbgAbexbeDbeAckQbgBbgCaZKbgDbbRbeFbkMbeWbeVbkSbeXbgGaZMbgHaZPbgJbgIbgLbgKbcdbgMaZMaafbgObgNbgNbgNbgNbgNbijaafaZVbgSbgUbgTbgVbbwbgWbbwbgXaZVaYGaJqbgYbfFbhabgZbhcbhbbhdbfFbhfbhebhebhebiubhhbhhbhibhkbhjbhlbfKbhnbhmbeYblrbhmbhpbhqbfLbfSbhrbfSbfSbfSbPvbdPbfTbhtbfTbhubhubfVbhvbhxbhwbfVbhybhzbhybfVbhAbhBbhAbgcbhCbhDbhCbgcbhEbhFbgcbhHbhGaNaaNaaNaaafaafaaacxWcwVcxXcxXcxXcxXcxXcxXcxXcwVcxYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaafaafaafaafawWbeKawWawWawWawWawWawWbeLawWaafaafaafaaabeObhIbeObhJbgjbhLbeZbeOaSgaTubfhbfqbhObhQbhQbhQbhQbhQbhQbhSbhRbhTbfIbfMaZEaZEaZEaZEaZEaZEaZEbhWbhYaZEaZEaZEbhXbiabhZbfNboUbmiboUbfRbfQbgnbgmbidaZMbieaZPaZPaZPaZPbgKbcdbifaZMaafbgObgNbihbigbiibgNbijaafaZVbikbdkbilbimbbwbfDbbwbbwaZVaYGaJqaJqbfFbiobinbipbipbisbirbhhbitbhhbhhbiubhhbhhbhibixbiwbiybfKbizbhmbizbhobizbiBbhmbfLbiCbiCbiEbiDbfSbgobdPbiGbiIbiHbiJbiJbfVbiKbiMbiLbiObiNbiQbiPbfVbiRbgpbiSbgcbiUbiVbiUbiXbiWbiWbgcbiYbhGaaaaafaaaaafaaaaaaaaacxWcxZcxZcxZcxZcxZcxZcxZcxYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacybaaaaaaaaaaafaaaaaacyacydcyccyccyccyccyccyccyecybaaaaafaafaaabeObjbbjabjdbjcbjcbjebjfaYfbjgaPzbjibjhbjjbjjbjjbjkbjkbjkbjkbjkbjkbgqbjlaZEbjnbjmbjpbjobjrbjqbjtbguaZEbjubgzbgvaZKaZKbgEbbRbflbbRbbRaZKbfoaLxaYlbjzbjBbjAbjDbjCaZPbjEbcdaZMaZMaafbgObgNbigbgNbigbgNbijaafaZVaZVbjFbejbjGbbwbjIbjHbjJaZVaYGaJqaJqbfFbgFbinbgPbjObjRbjQbhhbjSbjUbjVbjTbgQbhgbhibjXbhsbjYbfKbizbhmbizbhobizbiBbkbbfLbkdbkcbkfbkebfSbPvbdPbkgbkhbkhbhMbhKbklbkkbkmbhPbiLbiLbiLbkobfVbkqbhUbkrbgcbksbiWbiWbhVbkvbibbgcbiYbhGbkybkybkybkyaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyfcygcybaaaaaaaafaafcyacyhcyicyicykcyjcyicyicyicyicylaaaaafaafaaabeObkzbeObkBbkAbkAbkCbeObkDbkDaPzbkFbkEbkFbkFbkFbkEbkFaPzaPzaZEaZEbhYbkGaZEbjrbjrbjrbjrbjrbjrbiqbicbiAbivbiTbiFbjsbkMbjvbkMbjwbbRbqsaZKbfobjxbBibkTbkWbkVbkYbkXaZPbgKbcdaZMaafaafbmubmvbiibkZbihbjybgRaafaafaZVblcblbaZVaZVaZVaZVbldaZVbleaJqaJqbfFblfbjKbjLbipbisblhbhhbliblkbljblmbllblnbfKblpbjMbjNbfKbizbhmbizbhobizbiBbhmbfLbfSbfSbfSbfSbfSbPvbdPblublwblvbjWbjPblAblzblCblBblBbnibiLblEbfVbjZbhUblHbgcblIblKblJbkablLbkibgcbiYblOblQblPblRblPaaaaaaaafaaaaafaaaaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyncybaaaaafcyacypcyhcyicyicyicyicyicyicyicyqcyrcyccybaafaaabeOblSbjablTbkAblVblUbeOaaaaaaaaacytcyscyscyscyscyscyuaaaaaablWblYbkjbkpbknbktbjrbjrbjrbjrbjrbjrbkubmgbmfboUbkwbkxbfQbkHbfmbmkaZKbmlaZKbmnbmmaLYbjzbmpbmobmobmobmobmqbmsbmraafaaabgObkIbgNbgNbgNbmwbijaaaaafbmxbmzbmybmBbmAbmCbmxbmDbmxbmEaJqbAibfFbmFbkKbkLbmGbmIbfFbmJbliblkbmKbmLbhhbmMbfKbmObmNbkObfKbmRbkPbkRbkQblabkUblablgbKHblobKHbKHbKHblqbdPbnbbiIblsblxbltblDblyblGblFblFblMblNbnjbfVbvxblXbnmbgcbnnbnpbnoblZbiWbmabgcbmdbmcbmebnsbnsbnsbnsbnsbnsbnuaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacybaaaaaaaaaaafaaaaaacyacydcyccyccyccyccyccyccyecybaaaaafaafaaabeObjbbjabjdbjccADbjebjfaYfbjgaPzbjibjhbjjbjjbjjbjkbjkbjkbjkbjkbjkbgqbjlaZEbjnbjmbjpbjobjrbjqbjtbguaZEbjubgzbgvaZKaZKbgEbbRbflbbRbbRaZKbfoaLxaYlbjzbjBbjAbjDbjCaZPbjEbcdaZMaZMaafbgObgNbigbgNbigbgNbijaafaZVaZVbjFbejbjGbbwbjIbjHbjJaZVaYGaJqaJqbfFbgFbinbgPbjObjRbjQbhhbjSbjUbjVbjTbgQbhgbhibjXbhsbjYbfKbizbhmbizbhobizcAEbkbbfLbkdbkcbkfbkebfSbPvbdPbkgbkhbkhbhMbhKbklbkkbkmbhPbiLbiLbiLbkobfVbkqbhUbkrbgcbksbiWbiWbhVbkvbibbgcbiYbhGbkybkybkybkyaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyfcygcybaaaaaaaafaafcyacyhcyicyicykcyjcyicyicyicyicylaaaaafaafaaabeObkzbeObkBcAFbkAbkCbeObkDbkDaPzbkFbkEbkFbkFbkFbkEbkFaPzaPzaZEaZEbhYbkGaZEbjrbjrbjrbjrbjrbjrbiqbicbiAbivbiTbiFbjsbkMbjvbkMbjwbbRbqsaZKbfobjxbBibkTbkWcAGbkYbkXaZPbgKbcdaZMaafaafbmubmvbiibkZbihbjybgRaafaafaZVblcblbaZVaZVaZVaZVbldaZVbleaJqaJqbfFblfbjKbjLbipbisblhbhhbliblkbljblmbllblnbfKblpbjMbjNbfKbizcAHbizbhobizbiBbhmbfLbfSbfSbfSbfSbfSbPvbdPblublwblvbjWbjPblAblzblCblBblBbnibiLblEbfVbjZbhUblHbgcblIblKblJbkablLbkibgcbiYblOblQblPblRblPaaaaaaaafaaaaafaaaaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyncybaaaaafcyacypcyhcyicyicyicyicyicyicyicyqcyrcyccybaafaaabeOblSbjacAIbkAblVcAJbeOaaaaaaaaacytcyscyscyscyscyscyuaaaaaablWblYbkjbkpbknbktbjrbjrbjrbjrbjrbjrbkubmgbmfboUbkwbkxbfQbkHbfmbmkaZKbmlaZKbmnbmmaLYbjzbmpbmobmobmobmobmqbmsbmraafaaabgObkIbgNbgNbgNbmwbijaaaaafbmxbmzbmybmBbmAbmCbmxbmDbmxbmEaJqbAibfFbmFbkKbkLbmGbmIbfFbmJbliblkbmKbmLbhhbmMbfKbmObmNbkObfKbmRbkPbkRbkQblabkUblablgbKHblobKHbKHbKHblqbdPbnbbiIblsblxbltblDblyblGblFblFblMblNbnjbfVbvxblXbnmbgcbnnbnpbnoblZbiWbmabgcbmdbmcbmebnsbnsbnsbnsbnsbnsbnuaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvcyncybcyacypcywcylcyxcyicyicyicyicyicyicyicyzcyycyAaafaaabeObnvbjabjabjabeObeObeOaaaaaaaaacyCcyBcyBcyBcyBcyBcyCaaaaaablWbnwbqmbmjbmhbmhbmhbmhbmhbmhbmhbmhbmhbmHbmtbmPbnEbmQbnGbfmbnIbbRbnJbnLbnKbfobnMbnNbjzbjzbmrbnPbnObnRbnQbnSbmraaaaaabgObnTbnVbnUbnVbnWbijaaaaaabmxbnYbnXbnZbmxboabmxbmDbmxbmEaJqbmSbfFbobbkKbmTbipbodbfFbofboebohbogboibhhbojbfKbhibokbmUbfKbfLbmVbfLbmWbmYbmXbmZbmZbmZbmZbmZbmZbmZbnabncbopblwblvbnebndbotbosboubouboubnibiLbovboxbozbowboyboBboAbngbnfbnkbnhbnlbgcbnrbnqbnxboFboFboFboFboFboHbhGbkybkybkyaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvcyvcyrcygcywcyicylcyxcyicyicyicyicyicyDcypcyccygcyEcybaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyCboIblWblWboJbqmbjrbjrboKboKboKboKbjrbjrbjrbjrbkJboNbuFbnybnAbnzboSboRboTbbRbbRbnKboWboVboYboXbpaboZbpcbpbbpebpdbpfbmraafaaabgObpgbphbphbphbpibijaaaaafbmxbpkbpjbplbmxbpmbmxbmDbmxbpnaJqbmSbfFbnBbkKbnDbnCbptbfFbpublibiubogbpwbpvbofbofbpybpxbnHbnFbolbocboobomboqbpEbpHbpGbpJbpIbpLbpKbonbPvboCborboEboDboLboGbfVbpRbouboubpTbnibiLbpUbpWboMboObpXboBbpZboQboPbpobiWbpqbppbprbgcbqebqebqebqebqebqebiYbhGbqhbqgbkybkyaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyccyGcyvcyHcyicyIcyicyrcyKcyJcyicyicyicyDcypcywcyLcyLcyMcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyNbqibqjbqibqlbpsbmbbmbbpzbjrbjrbjrbjrbjrbqnaZEaZEbqobbRbtvbpBbpAbfmbqsbbRbqtbbRbqubmEbnMbqwbqvbqybqxbqAbqzbqBbpdbqCbmraaaaaabgObqDbqFbqEbqFbqGbijaaaaaabqHbqJbqIbqHbqHbqHbqHbqKbqHbqLaLYbpCbfFbfFbpDbpMbpFbfFbfFbqPbpNbpObhhbhhbhhbhhbhhbwzbpPbqQbqQbqQbqWbqQbIqboqbpEbrabqZbrcbrbbrebrdbonbpQbpVbpSbpYbpYbqbbqabfVbqcbiLbiLbqdbnibiLbrqbrsbzEbhUbrtboBboBbrxbqfbqkbrxboBbgcbgcbgcbrAbrzbrCbrBbrDbqebrFbrEbrHbrGbrIbkyaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacypcyccyhcyicyicyicyMcygcyccyccyecyEcypcywcyicyOcyOcyPcylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyQbrJbrKbrJbrLbjrbjrbjrboKboKboKboKbjrbjrbrNbrMaZEbrObbRbtvbpBbqpbfmbqsbbRbbRbbRbqubmEbrTaJqbqvbqybrUbrWbqqbqqbqrbrZbmraafaafbsbbsabsdbscbsfbsebsgaafaafbshbsjbsibslbskbsnbsmbsobqHbspaJqbqNbqMbqRbqObqTbqSbqVbqUbsybqXbqYbsxbsxbsxbsxbsxbrgbrfbsxbsxbsxbrhbhgbribrjbpEbsKbrkbsLbsLbsNbpKbonbPvbdPbsObsQbsPbsRbsRbfVbsSbCIbsTboxbrlbiLbsWboxbsXbsZbrmbtbbtabrobrnbrpbtebthbrrbtjbrubrwbrvbrvbrvbrPbrybrQbhGbtqbtpbtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacypcyccyhcyicyicyicyMcygcyccyccyecyEcypcywcyicyOcyOcyPcylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyQbrJbrKbrJbrLbjrbjrbjrboKboKboKboKbjrbjrbrNbrMaZEbrObbRbtvbpBbqpbfmbqsbbRbbRbbRbqubmEbrTaJqbqvbqybrUbrWbqqbqqbqrbrZbmraafaafbsbbsabsdbscbsfbsebsgaafaafbshbsjbsibslbskbsnbsmbsobqHbspaJqbqNbqMbqRbqObqTbqSbqVbqUbsybqXbqYbsxbsxbsxbsxbsxbrgbrfbsxbsxbsxbrhbhgbribrjbpEbsKbrkbsLbsLbsNbpKbonbPvbdPbsObsQbsPbsRbsRbfVbsSbCIbsTboxbrlbiLbsWboxbsXbsZbrmbtbbtabrobrnbrpbtebthbrrbtjbrubrwbrvbrvbrvbrPbrybrQbhGbtqbtpcAKbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyEcygcywcyicylcyicyicyicyicyicyicyicyicyMcyhcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyScyCboIblWblWbtrbjrbjrbjrbjrbjrbjrbjrbjrbjrbrNbtsaZEbttbtubjvbrRbkMbkNbkMbuIbbRbtybnKbtzbrTaJqbqvbqybmrbtBbrSbtDbtCbtEbmraaaaaaaafbgObtGbtFbtGbijaafaaaaaabshbtIbtHbtKbtJbtLbtLbtNbtMbtObAkaNrbrVbrXbLXbFDbrYbEebsqbEebEebssbsrbtXbtVbtVbtVbtZbhhbhhbhhbstbuabuabsubpEbpEbpEbsvbugbufbrebpKbonbdObdPbuhbuhbuhbuhbuhbfVboxboxboxboxbujbswbujboxbszcdXbsAbuobuobuobsCbsDbupbusbsEbuubsFbuwbuvbuvbsGbsIbsHbsMbsJbtqbtpbtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyEcyccyccyccyccyccyccyccyEcybaaacyacypcywcyicyicyicylcyicyicyDcyccyccyecyKcyicyicylcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyTbrJbrKbrJbnwbuBbjrbjrbuCbjrbuBbjrbjrbjrbrNbuDaZEbuEbbRbtvbsVbbRbfmbbRbbRbbRbuJbnKbtzbrTaYlbqvbuKbmrbuMbsYbuObuNbnSbmraaaaaaaafbuPbuQbphbuSbuRaafaaaaaabshbtdbtcbuWbuVbuYbuXbuZbqHbvaaJqaJqbofbofbtfbJGbwzbBLbvjbvhbtgbtgbvhbvjbvhbvjbvhbvjbvhbvjbfJbfJbuabvnbsLbtkbtibpEbsvbtlbvsbvvbvubonbtmbtobtnbtxbtwbuobuobtAbuobuobtPbtSbtQbtUbvEbuobtWceXbvHbvJbvJbvJbvKbvKbvKbvKbvKbvMbtYbvObvNbvObvPbvObqebuzbhGbvQbrGbvRbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacypcywcyicyicyicyicyicyicyicyMcypcyccypcywcyicyicyicyicyUcyicyicylcyVcyWcyicylcyicyicyRcyicyicyicyXcyYcyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyZbvSbvTbvSbvVbvUbvVbvVbvVbvVbvVbubbvXbjrbrNbvYaZEbvZbbRbucbwcbudbwebwdbwdbwdbwebwebwfbrTaKFbwgbqybmrbwibuebwkbwjbwlbmraaaaaaaafbwmbwnbscbwpbwoaafaaaaaabshbwrbwqbwtbwsbuYbuXbuZbqHbwuaJqaJqbwvbwxbuibJGbwybwAbvjbwCbDRbukbwDbwGbwFbwIbwHbwIbwJbvjbhhbhhbuabwLbsLbumbulbuqbunbutburburbuxbuGbuybuLbuHbuUbuTbxdbvbbxdbxdbvcbxdbxdbvebxebxdbxdbxfbvgbvfbvJbCkbxjbxibxlbxkczPbvKbxobxnbxqbxpbxrbxnbxsbqebuzbhGbxtbtpbtpbkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6931,7 +6950,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczjcygcyccyccyccyccyccyccyccygczkaaacz aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczjcygcyEcyKczrcylcyicyicyMcyecyccyccywcyicyicylcyXcyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczscztcztcztczuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxubASbydbycbylbygbynbymbGmbyybyGbGmbyJbyHbyTbyObBfbwebBhbBgbBibBibBibBjbBibBibBkbBibBlaJqbyVbyUaJqaMhbBqbBpbBsbBrbBubBtaXfaXfbBvaXfbBxbyWaXfbBybBAbBzbBBaJqaJqbvjbyZbyYbzbbvhbvhbvjbvhbzcbvhbvjbvjbvjbvjbvjbvjbvjbvjbhhbhhbhhbBJbzdbBLbBKbBNaFabBPbBObBQbBNbzgbnabzkbyfbBTbBSbBVbBUbBXbBWbyfbBYbCabBZbCcbCbbykbzEbzBbzAbvKbCfbChbCgbCjbCiaGsbytbzObzObzObClbzObzObzObqebuzbrEbCmbrGbrIbkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczjcypcyccyhcyicyicyicyicyicyicyicyicyicylcyXcyicyicyicyicylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxubxubxxbxxbxxbxxbxubxubCobBabvIbzFbwebwebwebwebwebwebCrbCqaJwaJwaJwaJwbCsbCsbCsbCsbCsbCsbCsbCsbCsbCsbCuaHPbzGbCvbCvbCvbCvbCvbCxbCvbCvbCvbCvbzsbCzbzsaJvaKGbCAbvjbzIbzHbzKbCDbzSbvjbCGbDRbzUbCQbzWbzVbCMbCLbCObCNbCQbzXbhhbhhbhhbhhbhhbwzbEibCYbCZbCYbDabBNbLSbPvbDbbDbbDbbDbbDbbDbbDbbDbbDbbDcbDcbDcbDcbDcbDcbDdbAabzZbvKbvKbvKbvKbvKbvKbvKbytbqebqebqebqebqebqebqebqebuzbhGbDhbDgbkybkyaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyfcycczvcyvcyHcyicyicyicyicyicyicyIcyiczwcylcyXcyiczxcyicyDcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDiaaaaaaaaaaafaaaaaabxybDkbAbbAmbAcbAcbAnbAxbAobAJbAIbAKbCqaaaaaaaafaaabCsbDvbDxbDwbDzbDybAMbALbFabCsbAObANbAPbCvbATbDHbDKbDJbDMbAUbDLbAVbDPbDObDQbzsbzsbzsbzsbvjbAXbAWbBbbAYbBcbvdbBdbDZbBebDWbDZbDZbDZbxObDRbEabEdbBmbtVbtVbBnbtTbBCbBwbEibEhbEkbEjbElbBNbLSbPvbDbbEmbEmbEmbEnbEmbEmbEmbDbbEobEobEpbEobEobDcbEqbBEbBDbEtbEsbEvbEubExbEwbBFbEybEBbEAbEDbECbEFbEEbEGbEGbEIbEHbEsbEsbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvcyvcyrcyEcyEcyEcyecyccyccyRcyRcyRcygcyccyKczycyDcypczkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajYbEJajXbEJajZaaaaafaaabxybxybEKbzYbBGbGmbBIbBHbTEbTEbCebCdbCnbDtaafbEUbEWbEVbEYbEXbFabEZbFabFbbFabFabFabCsbFdbQgbCpbCvbDLbFfbFibCtbCwbFgbFkbCvbCvbFlbFnbFmbFpbFobCCbCBbCFbCEcpGbCHbCJbFubFwbCKbCSbCPbCTbzfbDRbDRbDRbFAbofbofbofbofbofbCUbCVbJGbEibCWbFGbCYbFHbBNbLSbPvbDbbEmbEmbEmbEmbEmbEmbEmbDbbFIbDebCXbDjbDfbJRbDlbDmbBDbDnbGcbFUbFUbFUbFUbFUbFUbFWbFVbFXbECbkybFYbGabFZbFZbGbbGdbGcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbGebGfbGeaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvcyvcyrcyEcyEcyEcyecyccyccyRcyRcyRcygcyccyKczycyDcypczkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajYbEJajXbEJajZaaaaafaaabxybxybEKbzYbBGbGmbBIbBHbTEbTEbCebCdbCnbDtaafbEUbEWbEVbEYbEXbFabEZbFabFbbFabFabFabCsbFdbQgbCpbCvbDLbFfbFibCtbCwcALbFkbCvbCvbFlbFnbFmbFpbFobCCbCBbCFbCEcpGbCHbCJbFubFwbCKbCSbCPbCTbzfbDRbDRbDRbFAbofbofbofbofbofbCUbCVbJGbEibCWbFGbCYbFHbBNbLSbPvbDbbEmbEmbEmbEmbEmbEmbEmbDbbFIbDebCXbDjbDfbJRbDlbDmbBDbDnbGcbFUbFUbFUbFUbFUbFUbFWbFVbFXbECbkybFYbGabFZbFZbGbbGdbGcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbGebGfbGeaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvczzczkczjcypcyhcyicyicyiczAcyicyicyicyicyMcyEcypczkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakDbGgbGhbGgakDbGibGibGibxybGjbyEbBabDobyEbGnbxybCqbGobCqbCqbGqbGpaaabGrbGtbGsbGubFabFabGvbFabGwbGybGxbFabCsbFdbQgbDpbCvbDqbGBbGEbGDbDrbFgbDsbCvbAwbGHbGJbGIbGJbDubDAbCPbDBbFvbDCbDRbukbvjbDDbFybDEbvjbGRbDRbDRbDRbDRbGSbofbGTbGVbGUbDFbCRbDNbDIbDUbDSbCYbGZbHbbHacbQbDVbDbbEmbEmbEmbEmbEmbEmbEmbDbbHebDYbDXbEcbEbbEgbEfbErbBDbEzbHmbFUbFUbFUbFUbELbFTbFTbFTbFTbEMbEObENbHsbHrbHubHtbHvbGcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbGfbGebHwbGebGfaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyoczzczkaaaaaaczjcypcyKczBcyicyicyicyicyicyiczycyrczkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajXamIbHxamIajXbGibHzbHybxybHAbyEbEQbyEbyEbGnbxybHDbHCbHEbCqbGqbGpaafbGrbHGbHFbHIbHHbHJbHHbHHbERbFcbETbETbFebFjbFhbFqbCvbCvbCvbCvbCvbCybFsbCvbCvbHVbHUbHXbHWbHZbFtbFxbvjbFBbFzbIdbIcbFCbvjbFJbFFbFKbvjbIjbIibIlbIkbInbImbofbIobIpbqQbIrbqQbFMbFLbFObFNbFPbFEbIwbBNbLSbPvbDbbDbbIxbEmbEmbIybIxbDbbDbbIzbIBbIAbIAbICbDcbFQbFRbBDbFSbGcbFUbFUbGlbGkbGzbFUbFUbGAbGFbGCbGKbGGbGLbISbIVbIUbIWbGcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbIXbGfbIYbJabIZbGfbIXaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyEczkaaaaaaaaaaaaczjcygcyEcyKcyiczCcyicyicyDcycczkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakDamIamIamIbJcbJbbyEbyEbJdbHAbyEbGMbyEbyEbGnbxybJebHEbJfbCqbGqbGpaaabGrbJhbJgbJibFabFabJjbFabJkbJmbJlbJnbCsbJpbGNbGObJqbJsbJsbJsbJsbGPbJtbJsbJsbJwbJvbJybJxbJAbGQbGWbvdbvdbvdbvdbvdbvdbvdbvdbvdbvdbJCbJCbJCbJCbJCbJCbJDbJEbofbofbofbofbGXbtRblibBNbBNbBNbBNbBNbBNbLSbPvbDbbJHbJJbJIbJLbJKbJMbJHbJNbIzbIBbIAbIAbGYbDcbHcbHfbBDbJTbEsbJVbJUbJXbJWbJZbJYbFUbHgbKabECbKcbKbbKdbEsbKfbKebKebEsaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbGfbGfbKhbKgbKgbKgbKibGfbGfaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6947,30 +6966,30 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVaoVbVwapQapQbVxaoVbCqbCqbCqbCqbCqbCqbCqbCqbCqbCqbHEbHEbHEbHEbHEbHEbHEbUtbUsbUvbUubUxbUwbUwbUwbUwbNgbUzbUzbUzbUAbUzbUBbEPbEPbUDbCqbSAbLZbQgbUEbUGbUFbUHbTPbTPbUIbUJbTPbTPbUKbUMbULbOdbUNbUPbUObUQbOdbUSbURbUTbQyapQbQAbUVbUUbUWbOhbVubPnbUYbUXbUXbUXbUZbNcbVabOrbNibNhbNkbNjbWjbWjbWjbNlbNcbLTbDbbJNbJNbJNbJNbVibVjbTcbVkbVibJNbJNbJNbJNbJNbVlbVnbWrbQXbNmbXrbXrbXrbXrbNqbPKbUpbUpbVsbQZbVtbTqbTrbkybkybkyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZmbVzbVzbVzbVzcafcbjcbjcbkbVybVBbVAbVDbVCbVFbVEbCqbVGbLvbLvbLvbLvbLvbLvbLvbLvbESbVHbVIbVIbVIbVIbVIbVIbVIbVIbVJbVJbVJbVJbVJbVLbVMbCqbSAbLZbQgbUEbVObVNbVQbVPbRAbVRbVSbRAbRAbVTbVVbVUbVXbVWbVZbVYbWabOdbUSbWbbWcbRIbVvbPjbWdbTWbTWbOhbVubPnbWebzsbzsbzsbPvbNcbWfbOrbOrbWgbNUbNsbWkbWjbWkbNWbNcbLTbDbbRTbRUbRUbWlbRVbMibRXbRZbWmbWnbEmbEmbEmbJNbWobWqbWpbWrbNXbWrbQXbQXbNZbOkbPNbUpbUpbUpbQZbVtbTqbTrbtpbtpbkyaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVapQbVwaoVapQaoVaoVbLvbLvbLvbHEbWwbWybWxbWAbWzbCqbHEbLvaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBbWDbWCbWFbWEbWGbWBbWIbWHbOobOlbVJbVJbVMbCqbWLbLZbQgbWMbWObWNbWNbWPbWQbWQbWQbWQbWQbWRbWSbMKbMKbMKbWTbOdbUObOdbUSbURbWUbQyapQbOhbOhbOhbOhbOhbVubPnbWebWVbAwbAwbPvbOjbWXbWWbWZbWYbXbbXabXcbWjbXcbXdbNcbLTbDbbEmbXebEmbXfbTabMibTcbMibTdbXgbEmbXebEmbJNbXhbXjbXibXlbTfbOwbOvbOvbOybOBbPKbXsbXrbXtbQZbUpbTqbXubkybtpbkybkybkyaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVapQbVwbVwbVwbVwbVwbXvbHEbXvbHEbXwbXxbWybXybHEbCqbHEbLvaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBbXAbXzbXCbXBbXDbWBbXFbXEbODbOCbOMbVJbVMbCqbSAbLZbQgbXJbXKbLKbXMbXLbWQbOObXPbXObWQbXQbSIbXRbMKbXSbWabOdbVZbXTbXUbTTbXVbPhbRKbPjbXXbXWbXYbOhbVubzsbWebzsbBRbXZbPvbNcbOPbYabYdbYcbWibYabYebWjbYebPubPwbLTbDbbEmbEmbEmbYgbYfbRZbUfbMibUgbYhbRUbRUbUibDbbQZbYjbYicaZbQZbQZbYkbYmbZdbPsbPbbPLbPFbPMbUpbUpbTqbTrbkybYrbkybYsbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVapQbVwbVwbVwbVwbVwbXvbHEbXvbHEbXwbXxcAMbXybHEbCqbHEbLvaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBbXAbXzbXCbXBbXDbWBbXFbXEbODbOCbOMbVJbVMbCqbSAbLZbQgbXJbXKbLKbXMbXLbWQbOObXPbXObWQbXQbSIbXRbMKbXSbWabOdbVZbXTbXUbTTbXVbPhbRKbPjbXXbXWbXYbOhbVubzsbWebzsbBRbXZbPvbNcbOPbYabYdbYcbWibYabYebWjbYebPubPwbLTbDbbEmbEmbEmbYgbYfbRZbUfbMibUgbYhbRUbRUbUibDbbQZbYjbYicaZbQZbQZbYkbYmbZdbPsbPbbPLbPFbPMbUpbUpbTqbTrbkybYrbkybYsbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVaoVaoVaoVaoVapQapQbLvbLvbLvbYubYtbYwbYvbYxbHEbYybHEbLvaoVaoVaoVaoVaoVaoVaoVbESbVHbVIbYzbYBbYAbXCbYCbYzbYzbXFbYDbQbbPQbQdbVJbVMbCqbSAbLZbYIbYHbYHbYJbYLbYKbYNbQebYPbQqbWQbOdbSIbYQbYRbXSbYSbOdbVZbXTbUSbURbYTbQyapQbQAbYVbYUbYWbOhbVubzsbWebzsbHZbHZbPvbNcbNdbYXbYYbNdbYZbNdbNdbNdbNdbNdbNcbLTbDbbJNbJNbJNbJNbVibZabTcbZbbVibJNbJNbJNbJNbDbbTlbZcbTlcbabTlbQZbYkbYmbYlbYobQGbQIbWrbZhbQZbUpbTqbTrbkybtpbtpbtpbZiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaafaafbLvbZkbZjbZjbZlbWzbLubCqbLvbLvaoVcceaoVaoVaoVaoVaoVbGpbVHbVIbYzbYzbZnbZpbZobYzbZqbZsbZrbZvbQKbQPbVJbVMbCqbZxbQQbDGbYHbZzbRicewbRjbRmbRkbRSbRobWQbZFbZGbXRbMKbXSbZHbOdbZIbXTbUSbZJbZKbRIbVvbPjbZLbXWbXWbOhbVubPnbWebZMbzsbZNbPvbZObTZbTZbZPbNdbZRbZQbZSbzsbZUbZTbLSbLTbDbbRTbRUbRUbZVbRVbMibRXbRZbZWbZXbEmbEmbEmbDbbZYbTlbTlbTlbTlbQZbZZbZZcaacabbPNbPNbWrbPNbQZbPNbTqbTrbkycadcaccaebZiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaSaaSaaSaaSabaaaSaaSaaSaaSaaSaaaaaabCqbCqbCqbCqbCqbCqbYybCqbCqbCqbCqapQaoVaoVapQaaHcjnaoVaoVaoVbGpbVHbVIcagcaicahcakcajcamcalcaocanbSdbYFbStbVJcatcasbSRbSwbHPbYHcawbZybThbTgbTjbTibTHbTGcaDbPccaEbMKbMKbMKcaFbOdcaHcaGbUSbURbOdbQyapQbOhbOhbOhbOhbOhbVubPncaJcaIbzscaKcaMcaLbUXcaNcaObzscaQcaPcaRbzscaSbMbcaUcaTbDbbEmbSZbEmcaVbTabMibTcbMibTdcaWbEmbSZbEmbDbcaXbTlcaYcbccbbckacjWckNckMcbdbPNbWrbWrcbebQZbDhcbfcbgbkycbicbhbtpbZiaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaafaaaaafaaaacyaaaaafaaaaafaaaaaSaafaafbCqbHEbHEbHEbHEbHEbHEbHEbHEbLubLvaoVaoVaoVaaHcjocmXaaHaaHapQbGpbVHbVIcblbYzbWBbWBbWBbYzcbmcbocbnbXGbTIbUcbVJbCqbCqbUlcbrcbtbYHbYHcbucdtbUmcaAcaAcaAcaAbWQbOdcbAcbzcbCcbBbQtcbDcbFcbEbXUbTTcbGbPhbRKbPjcbIcbHcbHbOhbVubPnbAwcbJbzsbzscbLcbKbzscbMcbNbzsbzscbObzsbzscbNbFrcbQcbPbDbbEmbEmbEmcbScbRbRZcbTbMibUgcbUbRUbRUbUibDbbTlbTlcbVbTlbTlbQZbZZbZZcbWcbXbPNcbZcbYcbYbQZbqgcbfbTrbkybkybkybtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacccccbaaaccacccccbaaaccacccccbaaaaaSaaaaaabLvccdbHEbCqbCqbCqbTzbCqbCqbCqbCqaoVaoVaoVcnBaaHaaHapQaoVaoVbGpbVHbVIbYzccgccfbWBcchbYzbYzbXFccibOCbUybVbbUCbVdbVcbVfbVebVhbVgbVobVmbVqbVpcerbVrbWhbVKccwccvccyccxbRAbRAbRDbTOcczbTUbRFbURccAbQyapQbQAccCccBccDbOhbVubzsbzsbWeccFccEcbLccGbzscbMccIccHccKccJccLccHccNccMbhGccObDbbDbbDbbDbbDbbDbbMiccPcfybDbbDbbDbbDbbDbbDbbQZbQZbQZbQZbQZbQZccRccRccSccTbQZbQZbQZbQZbQZbkyccUbTrbkyccWccVbtpbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaabLvccYccZbCqbSqbHEbHEcdabQacdbbCqaoVaoVaoVaoVapQaoVaoVaoVaoVbESbVHbVIbWBcddcdcbWBcdecdfbWBbXFcdgbWtbWsbWvbWubWKbWJbXmbXkbXobXnbXqbXpbXIbXHccsbXNcdtbYbccwcdwbOdcbAbTObTPcdycdxcdAcdzbMWcdBcdCbRIbVvbPjcdDcbHcbHbOhbVubzsbAwcdEcdGcdFcdIcdHbzscdJcdLcdKccMcdMccMbFrbHdcdNbhGcdObDbcfrcgicgicglcgkbMiccPcgnbDbaafaafaafaafbkycdQbNBblQcdRcdRbQZcdScdSccSbScbQZcmobtpbtpbtpbDhccUbXubkycdVbtpbtpbkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaabLvccYccZbCqbSqbHEbHEcdabQacdbbCqaoVaoVaoVaoVapQaoVaoVaoVaoVbESbVHbVIbWBcddcdcbWBcdecdfbWBbXFcdgbWtbWsbWvbWubWKbWJbXmbXkbXobXnbXqbXpbXIbXHccsbXNcdtbYbccwcdwbOdcbAbTObTPcdycdxcdAcdzbMWcdBcdCbRIbVvbPjcdDcbHcbHbOhbVubzsbAwcdEcdGcdFcdIcdHbzscdJcdLcdKccMcdMccMbFrbHdcdNbhGcdObDbcfrcgicgicglcgkbMiccPcgnbDbaafaafaafaafbkycdQbNBblQcdRcdRbQZcdScdSccSbScbQZcmobtpcAKbtpbDhccUbXubkycdVbtpbtpbkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccaccXccbaafccaccXccbaafccaccXccbaaaaafaafaafbCqbLvbCqbCqbCqcdWcdYcgFcpYbSsbCqaoVaoVaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBceacdZceccebcedbWBcefceecehcegceibVJbYpbYnbYEbYqbYMbYGbZebYObZgbZfbZubZtbZAbZwceycexbOdcbAcezbOdbOdbOdcezcezcezbURceBceAapQbOhbOhbOhbOhbOhbVubzscaKceCceEceDceGceFbzsbzsceIceHceJbLSceLceKbzsbzsbhGcdObDbchochqchqchschrchuchtcjBbDbaafaaaaaaaafbkybtpceMbrGceOceNbQZcePcePceQbScbQZbkybkyceSceRbDhccUbTrbtpbtpbtpceTblPceUblPaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaaaafaafbCqceVbCqceWceYbCqbTzbCqbCqaoVapQaoVaoVapQaoVaoVapQaoVbESbVHbVIbVIbVIbVIbVIbVIbVIbVIbVJbVJbVJbVJbVJbVJbCqbZBbCqccwcfbcfbcfbcfcbZDbZCcfbbZEcfhcapccwbOdbQucficezbOdbOdbOdbOebULcezbURcezbLKapQapQapQapQapQapQbVucfjcfjcfjcflcfkcfjcfjcfjcfmcfocfnceJcfpceJceJbzscfqcbKcdObDbbDbccQccQbDbbDbccQcknccQbDbaaaaaaaaaaaabkybkyccUcfsbkybkybQZbQZbQZcftcfubQZbDhbkycaebtpckSccUcbgbkybkycfvbkybkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccaccXccbaaaccaccXccbaaaccaccXccbaaaaafaaaaaacfxcfwcfwcfwcfwbCqbCqcqncqybCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqcarcaqbTAcaxcazcaycaycaycaycaycaycaycaycaycaBcaBcaycaCceWccwcfFcfEcfHcgOcbqcbpcfbcbscfMctRccwcfNcfObRHcfQcfPcfRcfPcfQcfScfQcfTcezbLKbLKbLKaoVaoVapQaoVcfVcfUcfXcfWcfZcfYcgbcgacfjcgcbAwcgdcgfcgecghcggbKTbKTcgjcnHbkyaaaaaaaaaaaaaaaaafcskaafaaaaaaaaaaaaaaabkyczGcgocgmcgmcgpcgrcgqcgtcgscgubkybkybkybkycbvbkyccUbTrbkycgybtpbtpbkyaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaacgzaaaaaaaaacgzaaaaaaaaacgzaaaaaaaafcfxcfxcfxcgAcgCcgBcgEcgDbHEcAhcAicgGcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcbwbEPcbxcbyccwccwccwccwccwccwccwccwccwccwccwccwccwccwccwcfbcgMcgOccjcclcckcgSccmccoccnccwcfNcgWcgVcgYcgXchacgZchbbOdchdchcchfchechgcheaoVaoVapQaoVcfjchhchjchichlchkchnchmcfjbAwbAwceJceJcbKceJccMbAwbAwcbKczHbkybkybZibZibkybkybZiczQbZibkybkybZibZibZibkyczRczSbnschwchvchxchxchxchychAchzchCccpccqccqccqccrcctbkyccVbtpchHbkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafchJchIchIchKchLchLchLchLchLchLchLchLchLchLchLchMchOchNchOchPchRchQchScgHchUchTbQabCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqccucdicdhcdjccwchYchYchZccwcibciacidciccifciecihcigcijcdkcfbcikcimcdlcdmcinciqcdncdpcdoccwbLKcitbMQciubMQcivbMQciubMQciwbMQcixbLKbLKbLKapQapQapQaoVcfjciyciAcizciCciBciEciDcfjciFbAwccMccMciGceJccMbAwciHcbKczTbUwbUwbUwbUwbUwbUwbUwczUczVczVczVczVczVczVczXczWblObkyciKciJbkybkybZibZibkybkyciLcbfcdqbnscdscdrcdubkybkybkybkybkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafchJchIchIchKchLchLchLchLchLchLchLchLchLchLchLchMchOchNchOchPchRchQchScgHchUchTbQabCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqccucdicdhcdjccwchYchYchZccwcibciacidciccifciecihcigcijcdkcfbcikcimcdlcdmcinciqcdncdpcdoccwbLKcitbMQciubMQcivbMQciubMQciwbMQcixbLKbLKbLKapQapQapQaoVcfjciyciAcizciCciBciEciDcfjciFbAwccMccMciGceJccMbAwciHcbKczTbUwbUwbUwbUwbUwbUwbUwczUcANczVczVczVczVczVczXczWblObkyciKciJbkybkybZibZibkybkyciLcbfcdqbnscdscdrcdubkybkybkybkybkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaaciPaaaaaaaaaciPaaaaaaaaaciPaaaaaaaafcfxcfxcfxciQciSciRcfwbHEbHEbHEbHEbCqaaaaaaaafaaaaaaaafaaaaaaaafaaabCqciTbCqciUcdvccwciXciWciZciYcjbcjacgRcgRcgRcdTcjecjdcjfcjacfbcjgcgOcdUciocjjcfbcejcelcekccwapQcphapQbVuapQcphapQbVuapQcpPapQcpPapQapQaoVaoVaoVapQapQcfjcjpcjrcjqcjtcjscjvcjucjxcjwcjzcjyccMbLSccMcjAbFrbHdchpczYczYczYczYczYczYczYcAaczZczYczYczYczYczYczYcAccAbcAdbkycjCcbfbkyaaaaaaaaaaaabkybtpcbfcjEcjDcjDcjFcjGcjDaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccacjHccbaaaccacjHccbaaaccacjHccbaaaaafaaaaaacfxcfwcfwcfwcfwcjIbLubHEbHEbCqbCqbLvcAjcjJcjJcjJcjJcjJcjJaafbCqbCqbCqcjKcemccwcjMciZciZciYckHcgRcencjNcjPcnAcgRcgRcgRcgRcfbcjUceoceocjYcjXcfbcepcfMcsFccwbOhckbbQAckbbOhckbbQAckbbOhckcbQAckdbOhaoVaoVaoVaoVaoVapQckfckecjrckgckickhckkckjcfjcklceJceJceJckmceJceJceJbzsbCqbCqbCqbLvbLvbLvbCqbCqbLvbLvbLvbCqbCqbLvbLvbLvbCqckobkybkyckpcbfbkybkybZibZibkybkybtpckqckrcjDcktcksckucjDaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccacjHccbaaaccacjHccbaaaccacjHccbaafaafaafaaaaaaaaaaaaaagbCqbCqbCqckvbHEbCqckvbJfcjJckwckyckxckyckzcjJaaabCqbSsbHEckAcemccwckBckBckCccwckEckDckGcgRckFcnAckJckIckKckKcfbckLceqceqckPckOckRcesckTcetccwbOhckVckUckWbOhckYckXckZbOhclbclaclcbOhaoVaoVaoVaoVaoVaoVcfjcldclfcleclhclgcljclicfjclkclmcllcloclncAeccMccMbAwclpbHEbLvaaaaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaabkyclqbDhbkyclsclrcltcgrcltcltcltcltclvcluclwcjDclyclxclzcjDaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacjHccbaafccacjHccbaafccacjHccbaaaaafaafaafaaaaaaaaaaagclBclAclBbHEbHEbTzbHEccdcjJclCclEclDclGclFcjJaaabCqceYbHEckAcemccwckBckBckCccwclHcigclJceuceZcevclJcigclJclJcigclMcfaclQckHclPclRclNcgUcfdccwbOhclUclTclUbOhclWclVclWbOhclYclXclZbOhapQapQapQapQapQapQcfjcfjcfjcmbcmdcmccmfcmecmdclkcmgccMcmicmhcmjcdNccMcmkbCqbHEbLvaafaafaafaafaaaaafaaaaafaaaaaaaaaaaaaaabkycmqbtpbkycmrbntbntcmsbntbnsbnsbnscmtcmtcmucjDcmwcmvcmxcjDaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccacjHccbaaaccacjHccbaaaccacjHccbaafaafaaaaafaafaaaaaaaagbCqbCqbCqbCqbHEbCqbCqbCqcjJcmycmAcmzcmBcmycjJaafbCqccwcmDcmCcfeccwckBckCckCccwcmGcmFcmIcffckFcfgcmLcmKcmLcmLcmNcfzcmQcmQcmRcmQcmQcfAcfCcfBccwbOhclUcmUclUbOhclWcmVclWbOhclZcmWclZbOhaoVaoVapQapQaoVaoVaoVaoVaoVcpOcmdcmYcnacmZcmdbAwcnccnbcbQcndcnebFrcngcnfbCqclpbLvaaaaaaaaaaafaaabZibZibZibkybkybkybkybkybkyciIbtpbkybkybkybkybkybtpbkyaafaaaaaaaaaaafcnjcnjcnkcnjcnjaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaccacnlccbaaaccacnlccbaaaccacnlccbaaaaaSaaaaaaaafaafaaaaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnmcnocnncnqcnpcjJcjJcjJccwcnrcmCcfDccwccwccwccwccwcntcfGcgRcgRckFcgUcgRcgRcnwcnvcnxcgRcgRcgRcgRcnycgRckFcnAcfIccwbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhaoVapQapQaoVaoVaoVaoVaoVaoVcpQcmdcmccnCcmecmdbzscnDbHdcnFcnEbHdcnGbzsbzsbCqaagaagaaaaaaaaaaafaaabZicmlcmmbkycmpcmocnibtpbYrcnJbtpbtpbtpbtpbtpbtpbtpbkyaafaaaaaaaaaaafaaacnjcnKcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaccacnlccbaaaccacnlccbaaaccacnlccbaaaaaSaaaaaaaafaafaaaaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnmcnocnncnqcnpcjJcjJcjJccwcnrcmCcfDccwccwccwccwccwcntcfGcgRcgRckFcgUcgRcgRcnwcnvcnxcgRcgRcgRcgRcnycgRckFcnAcfIccwbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhaoVapQapQaoVaoVaoVaoVaoVaoVcpQcmdcmccnCcmecmdbzscnDbHdcnFcnEbHdcnGbzsbzsbCqaagaagaaaaaaaaaaafaaabZicmlcmmbkycmpcmocnibtpbYrcnJbtpcAKbtpbtpbtpbtpbtpbkyaafaaaaaaaaaaafaaacnjcnKcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaSaaaaaaaaaaafaafaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnLcnNcnMcnPcnOcnRcnQcnScnRcnUcfJcgvcfLcnYcnXcoacnZcobcgwcgIcgxcgKcgJcsFccwcgLccwcgLccwcsFcgNcgRcgRcgPckFcnAcgQccwccwccwccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVaoVaoVaoVcpQcmdcopcorcoqcosapQbzsceIcotbPnbPnbzsbzsaaaaafaaaaaaaaaaaaaaaaafaaabZicnhcnibYrbtpceRcnibkybkyckobkycnIcmocoubMBbNAbkybkyaafaaaaaaaaaaafaaacnjcnkcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSabaaaSaaSaaSaaSaaSaaSaaSaaSaaSaaaaaaaaaaaaaafaafaaaaaaaafbLvbHEbLvaafaafcjJcovcoxcowcozcoycoBcoAcoCcgTchDchBchEcoHcoHcoHcoJcoHcoLcoKchFcoMcjSchGccwchVchXchWchXciiccwcilcgRcipcirckFciscjScjScjScoZcpaccwcpbcigcpccpdcpdcpeaaaaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVcpQcmdcmdciMcmdcmdaaaapQaaacscaoVaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaabLvcAfcAgbCqbVLbtpcnicpgbkycskbkybkybkybZibZibkybkyaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabLvbHEbLvaaaaaacjJcpjcplcpkcpncpmcjJcpocppcjJcpqcpWciNcgRcgRcpsclJcptckHcpuciOcpvcpvcpvcpycpxcpAcpzcpCcpBcpycpDcpDcnxcencocciVcjNcjNcjPcgUcjccpIciZcpIcpJczMczLcpMczNaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVcpQbVwcmdcpNcmdczIapQapQaaacsmaoVaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaabLvbLvbLvbCqbCqbkycnicmnbkycsyaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabLvbHEbLvaaaaaacjJcpjcplcpkcpncpmcjJcpocppcjJcpqcpWciNcgRcgRcpsclJcptckHcpuciOcpvcpvcpvcpycpxcAOcpzcpCcpBcpycpDcpDcnxcencocciVcjNcjNcjPcgUcjccpIciZcpIcpJczMczLcpMczNaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVcpQbVwcmdcpNcmdczIapQapQaaacsmaoVaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaabLvbLvbLvbCqbCqbkycnicmnbkycsyaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbCqbCqcpRbCqbCqaaacjJcpScpUcpTcjJcjJcjJcjJcjJccwcpVcgRciNcgRcgRcpXclJcpZckHcqacqccqbcqecqdccwcqfcqhcqgcqjcqiccwcqkcqlcqlcqccqackHcqmcjhckFcgUcqoccwcqpcigcqqcpdcpdcqraaaaaaaaaaoVaoVaoVaoVcszaoVaoVaoVaoVczJbVwcqscqtcqsbVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaabZicqubZibZiaafaafaaaaafaaaaaaaafaaaaaSaaSaaSabaaafaafaafaafcpiaafaafaafaafaafabaaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbCqciTbHEcqvbCqaafcjJcjJcjJcjJcjJaafaaaaaaaafccwcqwcgRcjicqxcqxcqzcigcigcqAccwcqCcqBcqBcqBccwcqDcqFcqEcqHcqGccwcqBcqBcqBcqCccwcqAcigcigckFcgUccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVaoVaoVaoVapQbVwaaaaaaaaabVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaafaaaaaabZibtpbZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaaaaaaaafaaaaafaaaaaacqJaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcqKcqMcqLbCqaafaaaaaaaafaaaaaaaafaaaaaaaafccwcqOcqNckHcqPcqRcqQcigcqScqTccwcqVcqUcqWcqUcqYcqXcracqZcrbcqGcqYcqUcqUcqUcrcccwcrecrdccwckFcrwcjkcjlcjTcrhcqYaaaaaaaaaaaaaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVaoVbVwbVwbVwbVwbVwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaabZicribZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaafcrjcrjcrjcrjcrjaaacrkaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbCqciTbHEcqvbCqaafcjJcjJcjJcjJcjJaafaaaaaaaafccwcqwcgRcjicqxcqxcqzcigcigcqAccwcqCcqBcqBcqBccwcqDcqFcqEcqHcAPccwcqBcqBcqBcqCccwcqAcigcigckFcgUccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVaoVaoVaoVapQbVwaaaaaaaaabVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaafaaaaaabZibtpbZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaaaaaaaafaaaaafaaaaaacqJaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcqKcAQcqLbCqaafaaaaaaaafaaaaaaaafaaaaaaaafccwcqOcqNckHcqPcqRcqQcigcqScqTccwcqVcqUcqWcqUcqYcqXcracqZcrbcqGcqYcqUcqUcqUcrcccwcrecrdccwckFcrwcjkcjlcjTcrhcqYaaaaaaaaaaaaaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVaoVbVwbVwbVwbVwbVwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaabZicribZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaafcrjcrjcrjcrjcrjaaacrkaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcrlcrmbJebCqcigcrncrncrncrncrncrncrncrncigccwcrpcrocrrcrqcrpccwccwccwcqAccwccwcqYcqYcqYcqYcrscrIcrtcrucrvcqYcqYcqYcqYccwccwcqAccwccwcpEcjOcjmcjQcgRcrAcqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaagaagaaaaaaaaaaaaaaaaaaaaaaafaaaaaSaaacrBcrCcrCcrCcrCcrDcrkcrFcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvbLvbLvbLvbCqaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrHcrJcrKaoVaaHcsPcqYcqYcqYcqYczEcqYcqYcqYcqYcsPaaHaoVczFcrMcrLccwcjRccwccwcjVcrPcrRcqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaSacycrScrScrScrScrSaaacrkaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcrUaoVcAkcAlcAlcAlcAlcAlcAmcAlcAlcAlcAlcAlcAnaoVcrUcrVcrTccwcrWcrXccwcigcigcrYcigaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaSaaaaaaaaaaafaaaaaaaaacrkaaaaaaaaaaafaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index d135e8dc0c8..0f563d7cce7 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -550,7 +550,6 @@ "kJ" = (/obj/machinery/button/door{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "151"},/turf/simulated/floor/plasteel/bar{dir = 2},/area/syndicate_mothership) "kK" = (/obj/machinery/computer/telecrystals/uplinker,/turf/simulated/floor/plasteel/podhatch{dir = 10},/area/syndicate_mothership) "kL" = (/turf/indestructible/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/syndicate_mothership) -"kM" = (/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"; luminosity = 2; nitrogen = 0.01; oxygen = 0.01},/area/syndicate_mothership) "kN" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/wall/shuttle{tag = "icon-wall3 (SOUTHWEST)"; icon_state = "wall3"; dir = 10},/area/shuttle/assault_pod) "kO" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/wall/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/shuttle/assault_pod) "kP" = (/turf/simulated/wall/shuttle{icon_state = "swall0"; dir = 2},/area/wizard_station) @@ -971,20 +970,20 @@ ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshshshshshshshshshthshshshshshshshvhshuhvhshuhshiababababababababababababababababababababababababababababababababababababababhThyhzhzhzhzhbgShcgTgCgCgChRhcgSgrabababfNhUgKgKgKgKhVhVhVhWgKgKgLgRababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshshshshshshshshshshshshvhshshshuhshshMhvhshshshiababababababababababababababababababababababababababababababababababababababhYhyhzhzhzhzhbgSgBhZhOgChdiagBgSgrabababfNhUgKgKgKgKibicidgJgKgKgLieababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshshshMhshshthshthshuhshuhiababababababababababababababababababababababababababababababababababababababiihyhzhzhzhzhbijijikilimikilijijijabababfNhUgKgKgKgKgKiniogJgKgKgLipababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshshshihiirishihihshvhuhshiabhihihihihihihihihihihiababababababababababababababababababababababababababhbiviwixhzhzhbiyiziAiBiCiDiEiFiGijabababfNiHiIiIiIiJiKiLiMgJgKgKgLiNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshshihiiPiQiQiPhihihihihihihihiiRiRiSiSiSiSiSiRiRhiababababababababababababababababababababababababababhbhbhbhbiThbhbiUiCiViBiCiDiViCiWijabababfNfNfNfNfNfNfNfNiXgxgyiYgAfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiZjajbjcaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshMhshshshijdjejejejejfjgjhhijijjjkhiiRjljmjnjojnjpjqiRhiababababababababababababababababababababababababababababhbjrjrjrhbjsiCiViBiCiDiViCjtijabababababababababababfNgKgKgKgKfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajuaajvjwjxjcjcaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshthijzjejAjAjBjejejejCjDjDjEhijFjmjnjGjHjIjnjpjJhiababababababababababababababababababababababababababababhbjrjrjrhbjKiCiViBiCiDiViCjLijabababababababababababfNgKjMicibfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajujNjOjPjxjQjcaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshXhXhXhXhXhshshshshshshshijejAjTjUjAjejVjWhijDjYhihijFjnjGjHjZjHjIjnjJhiababababababababababababababababababababababababababababhbjrjrjrhbkakbkbkciCkdkekekfijabababababababababababfNgKkginkhfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajckikjjQkkkljcaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshXhXhXhXhXkmknknknknknishijejAkokpjAjejVkqhihihihiiRjFifjHjIkrjGjHifjJhiababababababababababababababababababababababababababababhbhbhbhbhbikksilijiCijikksilijabababababababababababktgKgKgKgKfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajcjckukvkujcjcaaaaaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXkwkxkxkxkxkxkxkyjejejejejejejVkqhihihihiiRjFjnjGjHkzjHjIjnjJhiababababababababababababababababababababababababababababababababijkAkAkAkBiCkBkAkAkAijabababababababababababfNkCiJiJkDfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajujujckEkFkGjcaaaaaaaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXkHkIirknknknishikJjAjAjAjejejVkKkLkxkMkLiRjFkNjnjGjHjIjnkOjJhiabababababababababababababababababababababababababababababijijijijijijijijimijijijijijijijijababababababababfNfNfNfNfNfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaakPkQkRkSkTkUkGkVjuaaaaaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXhXiqhXhXhshshshikZlalblalcjejejekIkxkMkIiRiRldkNjnitjnkOlfiRhiabababababababababababababababababababababababababababababijlglhlhlhlhlhlglglglhlhlhlhlhlgijababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaliljlklllmkTkGlnlolpjujuaaaaaaaaaaaaaaaaababababababhiighshXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshthilrlslrlrltjejejekLkxkMkLiRiRiRlululululuiRiRhiababababababababababababababababababababababababababababablvlglglglwlglglglglglglglwlglglglvababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaajuaakRlxlxlykTkGlzlnlpaalAlBaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXhXhXhXhXhshMhshihijWlClDlEhilFhihihihihihihihihihihihihihihihiabababababababababababababababababababababababababababababijlglhlhlhlhlhlglglglhlhlhlhlhlgijababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaakVjuaaaajulGlHlIlJlIkVjujuaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshihihihihihilLlLlMlNlOlPhiabababababababababababababababababababababababababababababababababababababababijikksksksksksksksksksksksksksilijababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaajcjclQjcjcjcjcjcjclRjcjcjcjcjcjcaajuaaaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshMhshilLlLlLlLlLlLhiababababababababababababababababababababababababababababababablTlTlTlTlTlTlTlTlTlUlVlVlVlVlVlVlVlVlVlVlVlVlVlUlTlTlTlTlTlTlTlTlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaajclWkGkGlWjclXlYkGkGkGlZmajcmbmcmdmejujuaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshthshshvkLlLlLlLlLlLmfhiababababababababababababababababababababababababababababababablTmgmhmimimimimimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmmmmmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshshshihiirishihihshvhuhshiababababababababababababababababababababababababababababababababababababababhbiviwixhzhzhbiyiziAiBiCiDiEiFiGijabababfNiHiIiIiIiJiKiLiMgJgKgKgLiNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshshihiiPiQiQiPhihihihihihihihiababababababababababababababababababababababababababababababababababababhbhbhbhbiThbhbiUiCiViBiCiDiViCiWijabababfNfNfNfNfNfNfNfNiXgxgyiYgAfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiZjajbjcaaaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshMhshshshijdjejejejejfjgjhhijijjjkhiababababababababababababababababababababababababababababababababababababababhbjrjrjrhbjsiCiViBiCiDiViCjtijabababababababababababfNgKgKgKgKfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajuaajvjwjxjcjcaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshXhXhXhXhXhXhXhXhXhshshshshthijzjejAjAjBjejejejCjDjDjEhihihihihihihihihihihihiabababababababababababababababababababababababababababhbjrjrjrhbjKiCiViBiCiDiViCjLijabababababababababababfNgKjMicibfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajujNjOjPjxjQjcaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshXhXhXhXhXhshshshshshshshijejAjTjUjAjejVjWhijDjYhihiiRiRiRiSiSiSiSiSiRiRhiabababababababababababababababababababababababababababhbjrjrjrhbkakbkbkciCkdkekekfijabababababababababababfNgKkginkhfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajckikjjQkkkljcaaaaaaaaaaaaaaaaaaaaababababababhihshshshshshshshXhXhXhXhXkmknknknknknishijejAkokpjAjejVkqhihihihihiiRiRjljmjnjojnjpjqiRhiabababababababababababababababababababababababababababhbhbhbhbhbikksilijiCijikksilijabababababababababababktgKgKgKgKfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajcjckukvkujcjcaaaaaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXkwkxkxkxkxkxkxkyjejejejejejejVkqhihihihihiiRjFjmjnjGjHjIjnjpjJhiabababababababababababababababababababababababababababababababijkAkAkAkBiCkBkAkAkAijabababababababababababfNkCiJiJkDfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajujujckEkFkGjcaaaaaaaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXkHkIirknknknishikJjAjAjAjejejVkKirknknknknknknjnjGjHjZjHjIjnjJhiababababababababababababababababababababababababababababijijijijijijijijimijijijijijijijijababababababababfNfNfNfNfNfNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaakPkQkRkSkTkUkGkVjuaaaaaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXhXiqhXhXhshshshikZlalblalcjejejekIkxkxkxkxkxkIifjHjIkrjGjHifjJhiababababababababababababababababababababababababababababijlglhlhlhlhlhlglglglhlhlhlhlhlgijababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaliljlklllmkTkGlnlolpjujuaaaaaaaaaaaaaaaaababababababhiighshXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshthilrlslrlrltjejejeirknknknknknknjnjGjHkzjHjIjnjJhiabababababababababababababababababababababababababababablvlglglglwlglglglglglglglwlglglglvababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaajuaakRlxlxlykTkGlzlnlpaalAlBaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXhXhXhXhXhshMhshihijWlClDlEhilFhihihihihihiiRjFkNjnjGjHjIjnkOjJhiababababababababababababababababababababababababababababijlglhlhlhlhlhlglglglhlhlhlhlhlgijababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaakVjuaaaajulGlHlIlJlIkVjujuaaaaaaaaaaaaaaaaababababababhihshshXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshihihihihihilLlLlMlNlOlPhiiRiRldkNjnitjnkOlfiRhiababababababababababababababababababababababababababababijikksksksksksksksksksksksksksilijababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaajcjclQjcjcjcjcjcjclRjcjcjcjcjcjcaajuaaaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshMhshilLlLlLlLlLlLhiiRiRiRlululululuiRiRhiabababababababababababababababababababablTlTlTlTlTlTlTlTlTlUlVlVlVlVlVlVlVlVlVlVlVlVlVlUlTlTlTlTlTlTlTlTlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaajclWkGkGlWjclXlYkGkGkGlZmajcmbmcmdmejujuaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshthshshvkLlLlLlLlLlLmfhihihihihihihihihihihihiabababababababababababababababababababablTmgmhmimimimimimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmmmmmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaamompkGkGmpmomqmqkGkGkGkGmrmomsmtlxlxmuaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshMhuhthMhimvmvmvmvmvmwhiababababababababababababababababababababababababababababababablTmgmhmimxmimxmimjmklVlVlVlVlVlVlVlVlVlVlVlVlVmlmjmmmymmmymmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaamzmAkGlnkGmBlzlnkGmCkGkGmDmzmEmFmGmHmImJaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshshshuhshihihihihihihihiababababababababababababababababababababababababababababababablTmgmhmimimKmimimjmklVlVlVlVlVmLmMmLlVlVlVlVlVmlmjmmmmmNmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaamOmpkGlIlzmPlIkGkGmQkGkGkGmOmRmSmumTkPaaaaaaaaababababababhihshXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhshshshuhshMhshiabababababababababababababababababababababababababababababababababababababablTmgmhmimimimimimjmklVlVlVlVlVmLmUmLlVlVlVlVlVmlmjmmmmmmmmmmmhmnlTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm index 6975718c7f0..fdbda6a1447 100644 --- a/_maps/map_files/generic/z5.dmm +++ b/_maps/map_files/generic/z5.dmm @@ -44,11 +44,10 @@ "aR" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/mine/abandoned) "aS" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/mine/abandoned) "aT" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/mine/abandoned) -"aU" = (/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/space) -"aV" = (/turf/simulated/mineral/random/labormineral,/area/space) -"aW" = (/obj/item/clothing/under/soviet,/obj/item/clothing/head/ushanka,/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/space) -"aX" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/space) -"aY" = (/turf/simulated/floor/plating/asteroid/airless,/area/space) +"aU" = (/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/mine/unexplored) +"aV" = (/obj/item/clothing/under/soviet,/obj/item/clothing/head/ushanka,/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/mine/unexplored) +"aW" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{icon_plating = "asteroid"; icon_state = "asteroid"; name = "Asteroid"},/area/mine/unexplored) +"aX" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_z5"; name = "south of asteroid"; turf_type = /turf/space; width = 18},/turf/space,/area/space) "aZ" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/mine/laborcamp) "ba" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/mine/abandoned) "bb" = (/obj/machinery/light,/turf/simulated/floor/plating/asteroid/airless,/area/mine/north_outpost) @@ -90,7 +89,6 @@ "bL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/abandoned) "bM" = (/obj/structure/table,/obj/item/weapon/paper/crumpled,/obj/item/seeds/cherryseed,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/abandoned) "bN" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/asteroid/airless,/area/mine/north_outpost) -"bO" = (/turf/simulated/mineral/random,/area/space) "bP" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel/airless,/area/mine/abandoned) "bQ" = (/obj/structure/table,/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel,/area/mine/north_outpost) "bR" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/mine/north_outpost) @@ -770,31 +768,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacaxbJcccdccceaJcfbPaJhegSaOhgaJgSaObaaxakdtaJaJaxacacababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaeacacacacacacacacacacacacacacacacacacacaxbJcccrcrcedtaJaJaOaCaJaJaJbPaJaJaJaxaJgSheaJaxacacababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacaxbJcFcrcGaxhmhlhchchldthlhchchcaJaJaxhnbPaJdtaxacacababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababdedeabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacaxaxaxaxaxaxcPhlaJaJaJaJbPaJhohchegSaxhDhOhJcUaxacacababaaaaaadcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababdededeababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacaxhmhlaJdtkSkRaCgSaJhcaJaJaxakdadaljaxacacababaaaadcdcdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededeaUaVdedeabababaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacaxhmhlaJgSaJaJhoaJdthlhmaxaxbqakdanMnIacacababaaaadcababdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededeaWaXdeabababaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacaxdrhlhlhlhlhlhlhlhlhlhmaxbqakdsakljnNacacababaaaadcababdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababdedededededeabababaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacaxdrhmhmhmdDdEhmhmhmdrdraxbqdsdsdsbraxacacababaaaadcabababdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaafafafafaaaaaaaaaaaaafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababdedededededeababaaaaaaaaaaaaaaaaababdedeabababababaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacaxaxaxaxaxaxaxaxaxaxaxaxaxaxcUdSdTaxaxacacabababaaaYabababdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaafafafafafaaaaaaaaaaafafafafaaaaafafafafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdededededeabababababaaaaaaaaaaaaaaababdededededeababdcdcaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcaxlNdadsaxdcacacabababaaaYababababdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafaaaaaaafafafafafaaaaafafafafaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdededededeabababababaaaaaaaaaaaaabababdedededededeababdcdcaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcaxeueveuaxdcacacacababaYaYabababababdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiafafafafafafafafafafafaaaaafafafafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdedededeababababababaaaaaaaaaaabababdededededededeabababdcdcdcaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcaxeFdSeGaxdcacacacabababaYabababababdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafafafaaaaafafafafafaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdedededeababababababababababababababdededededededeabababdcdcdcdcdcaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcePeQeRdcdcacacacabababaYababababababdcdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaafafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededededededededededeababababababdedededededededededeababdcdcdcdcaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcdcdcfadcdcacacacacababdcdcabababababdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiafafafafafaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaafafaiafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededededededededededeababababdedededededededededededeababdcababdcdcaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacdcdcdcdcdcdcdcfadcacacacacabababaYdcababababdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededededededededededededededededededededededededededeababdcabababdcaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaYdcababababdcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdedqdqdqdqdqdqdedededededededededededededededededededeababdcdcababdcdcdcaaaaaaababacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababdcdcdcdcdcdcaaaaaaaaaaaaaaaaaaaaaaalalalalalalalalalafafafaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaababaaaaaaaaaaaaaaaaaaaaaZaZdqdqdqdqdAdAdAdBdqdedededCdCdededededededededededededededeabababdcababababdcaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababdcdcdcdcdcaaaaaaaaaaaaaaaaaaaaalalbGbGbGbGbGbbbGalaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacababababababaaaaaaaaaaaaaaaaaaaaaZdJdKdLdMdNdOdPdPdPdqdQdQdQdQdRdCdededededededededededededededeabababababababababaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcdcbdbcdjdjdjdjdjdjdjdjdjdjdkbkbGafafafafbkblbGbGbGaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacabababababaaaaaaaaaaaaaaaaaaaaaZeaebeceddNaddPefboeheiejejdQdRekdCdedededededededededededededeababacacacacacababaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacababdcdcbGhfhfhfhfbpbybxhfhfhfhfhfbGbGafafafafafafafafbGbGaaaaaaaaafafaiaiaiaiaiaiaiaiafafafbGbGbGbGbGbGbGbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacabababaaaaaaaaaaaaaaaaaadqdqdqdNemeneodNepeqdNdNdqdqdqeresetdCdCdededededededededededededededeabacacacacacabababaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcbGbGbzbzbzbzbzbEbzbzbzbzbzbzbGbGafafafaiafafafafafbGbGaaaaafafafaiaiaiaiaiaiaiafafafafbGbGbGbGbGbGbGbGbGbGbGbGbGbGafafafafafaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacabababaaaaaaaaaaaaaaaaaadqexeydNezdPdOeAeBdPeCdNeDeDeDdRejejdCdCdededededededededededededededeabacacacacacacababaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcdcbGbkdFdGdGdGdGdGdGdGdGdGdGbFbkbGafafafaiaiaiafafafafbbbGaaaaafafafaiaiaiaiaiaiafafbGbGbGbGbGbibibjbibibibGbGbGbGbGbGafafafafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacamacacacacabababalalalalalalalalaldqeHeIeJeKeLeMdPezdPdPeNeDeDejejejejeOdCdededededededededededededededeabacacacacacacababababaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabdcdcaYaaaaaaaaaaaaaaaaaaaaaaaaaaaabGbGafafaiaiaiaiaiafafafbkblbGaaafafafaiaiaiaiaiaiafafbGbGbGbGbGbibsbtbubvbibGbGbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacababaaaaaaaaaaaaaaaaaaaadqeSeTeUeVeLeWdPezeXdPdNeYeZeZejejdRdRdCdCdedededededededededededededeabacacacacacacacacacabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGafafafaiaiaiaiaiafafafafbGbGbGafafafaiaiaiaiaiafafbGbGbGbGbGbibAbBbCbDbibGbGbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacababaaaaaaaaaaaaaaaaaaaadqdNdNdNfbdPfceLfdeofefffgfgfhfiejdRdRfjdCdedededededededededededededeabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababdcaYaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiafafafafbGbGafafafafafafafafafbGbGbGbibibibibibHbIbibibibibibibibibibGbGafafaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaafmfnfmfofpdPezdPdPfqfrdNfsftfuejejdRdRfvdCdededededededededededededeababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaYaYabababababaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafafafbGbGbkafafafafafafbkbGbGbGbTbQbRbSbTbUbVbWbXbXbXbYbZcacbbibGbGafafaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaadqdqdqdqdPdPezeofwdNfxdNeDeDeDdRdRdRdRfydNdededededededededededededeabdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababdcaYaYabababababababaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiafafafafbGbNbGbGbGbGbGbGbNbGbGbGbTcibXcjbTckclcmbibicncocpcpcqbibGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaadqfzdPdPezfAfBfCfDdNfEfFdRdRdRdReOdCdCdededededededededededededeabdcacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcaYdcababababacabababaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafafbGbGbGbGbGbGbGbGbGbGbGbGbictcucvcwcvcxcyczcAcBcCcDcEbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababdedeabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacaxaxaxaxaxaxcPhlaJaJaJaJbPaJhohchegSaxhDhOhJcUaxacacababaaaaaabGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababdededeababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacaxhmhlaJdtkSkRaCgSaJhcaJaJaxakdadaljaxacacababaaaabGbGbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededeaUdededeabababaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacaxhmhlaJgSaJaJhoaJdthlhmaxaxbqakdanMnIacacababaaaabGababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededeaVaWdeabababaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacaxdrhlhlhlhlhlhlhlhlhlhmaxbqakdsakljnNacacababaaaabGababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababdedededededeabababaaaaaaaaaaabababababababababaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacaxdrhmhmhmdDdEhmhmhmdrdraxbqdsdsdsbraxacacababaaaabGabababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaafafafafaaaaaaaaaaaaafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababdedededededeababaaaaaaaaaaaaaaaaababdedeabababababaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacaxaxaxaxaxaxaxaxaxaxaxaxaxaxcUdSdTaxaxacacabababaabGabababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaafafafafafaaaaaaaaaaafafafafaaaaafafafafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdededededeabababababaaaaaaaaaaaaaaababdededededeababbGbGaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcaxlNdadsaxdcacacabababaabGababababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafaaaaaaafafafafafaaaaafafafafaaaaaaaaaaaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdededededeabababababaaaaaaaaaaaaabababdedededededeababbGbGaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcaxeueveuaxdcacacacababbGbGabababababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiafafafafafafafafafafafaaaaafafafafaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdedededeababababababaaaaaaaaaaabababdededededededeabababbGbGbGaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcaxeFdSeGaxdcacacacabababbGabababababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafafafaaaaafafafafafaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdedededeababababababababababababababdededededededeabababbGbGbGbGbGaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcePeQeRdcdcacacacabababbGababababababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaafafafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededededededededededeababababababdedededededededededeababbGbGbGbGaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacdcdcdcdcdcfadcdcacacacacababbGbGabababababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiafafafafafaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaafafaiafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededededededededededeababababdedededededededededededeababbGababbGbGaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacdcdcdcdcdcdcdcfadcacacacacabababbGbGababababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdededededededededededededededededededededededededededeababbGabababbGaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGababababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdedqdqdqdqdqdqdedededededededededededededededededededeababbGbGababbGbGbGaaaaaaababacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababbGbGbGbGbGbGaaaaaaaaaaaaaaaaaaaaaaalalalalalalalalalafafafaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaababaaaaaaaaaaaaaaaaaaaaaZaZdqdqdqdqdAdAdAdBdqdedededCdCdededededededededededededededeabababbGababababbGaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababbGbGbGbGbGaaaaaaaaaaaaaaaaaaaaalalbGbGbGbGbGbbbGalaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacababababababaaaaaaaaaaaaaaaaaaaaaZdJdKdLdMdNdOdPdPdPdqdQdQdQdQdRdCdededededededededededededededeabababababababababaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbdbcdjdjdjdjdjdjdjdjdjdjdkbkbGafafafafbkblbGbGbGaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacabababababaaaaaaaaaaaaaaaaaaaaaZeaebeceddNaddPefboeheiejejdQdRekdCdedededededededededededededeababacacacacacababaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacababbGbGbGhfhfhfhfbpbybxhfhfhfhfhfbGbGafafafafafafafafbGbGaaaaaaaaafafaiaiaiaiaiaiaiaiafafafbGbGbGbGbGbGbGbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacabababaaaaaaaaaaaaaaaaaadqdqdqdNemeneodNepeqdNdNdqdqdqeresetdCdCdededededededededededededededeabacacacacacabababaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGbzbzbzbzbzbEbzbzbzbzbzbzbGbGafafafaiafafafafafbGbGaaaaafafafaiaiaiaiaiaiaiafafafafbGbGbGbGbGbGbGbGbGbGbGbGbGbGafafafafafaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacabababaaaaaaaaaaaaaaaaaadqexeydNezdPdOeAeBdPeCdNeDeDeDdRejejdCdCdededededededededededededededeabacacacacacacababaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGbkdFdGdGdGdGdGdGdGdGdGdGbFbkbGafafafaiaiaiafafafafbbbGaaaaafafafaiaiaiaiaiaiafafbGbGbGbGbGbibibjbibibibGbGbGbGbGbGafafafafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacamacacacacabababalalalalalalalalaldqeHeIeJeKeLeMdPezdPdPeNeDeDejejejejeOdCdededededededededededededededeabacacacacacacababababaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabbGbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaabGbGafafaiaiaiaiaiafafafbkblbGaaafafafaiaiaiaiaiaiafafbGbGbGbGbGbibsbtbubvbibGbGbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacababaaaaaaaaaaaaaaaaaaaadqeSeTeUeVeLeWdPezeXdPdNeYeZeZejejdRdRdCdCdedededededededededededededeabacacacacacacacacacabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGafafafaiaiaiaiaiafafafafbGbGbGafafafaiaiaiaiaiafafbGbGbGbGbGbibAbBbCbDbibGbGbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacababaaaaaaaaaaaaaaaaaaaadqdNdNdNfbdPfceLfdeofefffgfgfhfiejdRdRfjdCdedededededededededededededeabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababbGbGaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiafafafafbGbGafafafafafafafafafbGbGbGbibibibibibHbIbibibibibibibibibibGbGafafaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaafmfnfmfofpdPezdPdPfqfrdNfsftfuejejdRdRfvdCdededededededededededededeababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababbGbGabababababaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafafafbGbGbkafafafafafafbkbGbGbGbTbQbRbSbTbUbVbWbXbXbXbYbZcacbbibGbGafafaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaadqdqdqdqdPdPezeofwdNfxdNeDeDeDdRdRdRdRfydNdededededededededededededeabdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababbGbGbGabababababababaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiafafafafbGbNbGbGbGbGbGbGbNbGbGbGbTcibXcjbTckclcmbibicncocpcpcqbibGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaaadqfzdPdPezfAfBfCfDdNfEfFdRdRdRdReOdCdCdededededededededededededeabdcacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGababababacabababaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafafbGbGbGbGbGbGbGbGbGbGbGbGbictcucvcwcvcxcyczcAcBcCcDcEbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaabababaeaeaeaeacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaafGfGfGfHfHfIfJfKfLfLdNfLfLfMdRejdRdReOdCdedededededededededededededeabdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababababacacacabababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiafafafbGbGbGbGbGbGbGbGbGbGbGbTcKbXcLbTbXcMcycNcOcBbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacacacacababaaaaaaaaaaaaaaaafNfOfHfPfHfHfQfRfSfTfUfVfWfXeDeDdRdRdRdCdCdedededededededededededededeabdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacabababababacacacacacababababaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafbkafafafafafafbkbGbGbGbTcVbXcWbTcXbXcycNcOcBbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacacababaaaaaaaaaaaaaaaaaafGfLfLfLfYfJfLfLfZgagbfLfLgceDdRdRdCdCdedededededededededededededeababdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafafafafafafafafbGbGbGbibibTbTbibibTddbTcOcBbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -811,14 +809,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacabdededededededededededededededededededededededededededededeabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababacacacacacacacacacacacacacacacdcabdededededededededededededededededededededededededededededeabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewfkflbGafafaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacdcabdedededededededededededededededededededededededededededeababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaiaiaiaiaiaiaiaiaiaiafafbGfkflewbGafafaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacdcabdededededededededededededededededededededededeababababababacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiaiaiaiaiaiaiaiafafbGbGewewbGbGafaiaiaiaiaiaiaiaiaiaiaiafafafafafaYaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacababababababacacacacacacacdcababdedededededededededededededededededeabababababdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacacabababaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafafaaafafaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafaYaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacabababababababababacacacacacacdcdcabdedededededededededededededededeabababdcdcdcdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababacacacacacacacacacacacabababaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafaaaaafafaiaiaiaiaiaiaiaiaiaiaiafafbGewfkflbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaYaYaYafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacababababababaaaaabababababacacacacacdcabdededededededededededededededeababdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabdcaYabababababacacacacacacacacacabababaaaaaaaaaaafafafaiaiaiaiaiaiaiaiafafafaaaaafafafaiaiaiaiaiaiaiaiaiaiaiafafbGfkflewbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaYaYafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacababababababaaaaaaaYababababacacacacacacababdedededededededededededededeabdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcaYabababababacacacacacacacacacababaaaaaaaaaaafafafafafafaiaiaiaiafafafafaaaaafafafaiaiaiaiaiaiaiaiaiaiaiafafbGbGewewbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaYaYafafafaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaaaYaYaYababacacacacacacacabababdededededededededededeababacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababdcaYaYababababacacacacacacacacabababaaaaaaaaaaafafafafafafafafafafafafaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafgOdYdYdZbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaabaaaaaaaaaaaYabaYababacacacacacacacacacabababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaYaYabababababacacacacacacabababaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafdUeleldWbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaYababababacacacacacacacacacacacdcdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaYaaaaabababababacaeaeacababababaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacdcabdededededededededededededededededededededededeababababababacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiaiaiaiaiaiaiaiafafbGbGewewbGbGafaiaiaiaiaiaiaiaiaiaiaiafafafafafbGaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacababababababacacacacacacacdcababdedededededededededededededededededeabababababdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacacabababaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafafaaafafaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafbGaaaaaaafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacabababababababababacacacacacacdcdcabdedededededededededededededededeabababdcdcdcdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababacacacacacacacacacacacabababaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafaaaaafafaiaiaiaiaiaiaiaiaiaiaiafafbGewfkflbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGbGafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacababababababaaaaabababababacacacacacdcabdededededededededededededededeababdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabbGbGabababababacacacacacacacacacabababaaaaaaaaaaafafafaiaiaiaiaiaiaiaiafafafaaaaafafafaiaiaiaiaiaiaiaiaiaiaiafafbGfkflewbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacababababababaaaaaabGababababacacacacacacababdedededededededededededededeabdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGabababababacacacacacacacacacababaaaaaaaaaaafafafafafafaiaiaiaiafafafafaaaaafafafaiaiaiaiaiaiaiaiaiaiaiafafbGbGewewbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGafafafaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaaaaaaaabGbGbGababacacacacacacacabababdededededededededededeababacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababbGbGbGababababacacacacacacacacabababaaaaaaaaaaafafafafafafafafafafafafaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafgOdYdYdZbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaabaaaaaaaaaabGabbGababacacacacacacacacacabababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababbGbGabababababacacacacacacabababaaaaaaaaaaaaaaaaafafafafafafafafaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafdUeleldWbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaabGababababacacacacacacacacacacacdcdcdcdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababbGaaaaabababababacaeaeacababababaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacdcdcacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGbGbGafaiaiafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGbGbGafaiaiafafbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGewewbGbGbGafafafafafbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -831,7 +829,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafaaafafaiaiaiaiaiaiafafbGbGewewbGbGafafafafbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiafafafafafafafafaiaiaiaiaiafafbGbGbGewewbGbGafaiaiafafbGafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaiaiaiaiaiaiaiafafafafafaiaiaiaiaiafafbGbGbGewewbGafafaiaiaiafafafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbOacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGgPgQewbGafafaiaiaiafaiafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGgPgQewbGafafaiaiaiafaiafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGewgPgQbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaabababaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGbGewewbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaababababababaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGbGewewbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -863,22 +861,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafafaaaaaaaaaaaaafafafaiaiaiaiaiaiafafbGewfkflbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafafafafaaaaaaaaafafafafaiaiaiaiaiafafbGfkflewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaafafafafafafaaaaaaaaafafafaiaiaiaiaiafafbGbGewewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaafafafaaafafafafaaaaaaaaafafafaiaiaiaiaiafafbGewewbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaafafafaiafafafafaaaaaaaaafafafaiaiaiaiaiafafbGewewbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafafaiaiafafafafaaaaaaafafafafaiaiaiaiafafbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiafafafafafaYaYafafafaiaiaiaiafafbGewfkflbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiaiafafafafafaYaYafafafaiaiaiafafbGfkflewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafafafaYafafafafaiaiafafbGbGewewbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiafafafbGaYafafafaiaiaiafafbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafbGaYafafaiaiaiafafbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiafafafafafbGbGafafafaiaiaiaiafafbGewfkflbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiaiafafafafafbGbGafafafaiaiaiafafbGfkflewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafafafbGafafafafaiaiafafbGbGewewbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiafafafbGbGafafafaiaiaiafafbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiafafafbGbGafafaiaiaiafafbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafafafafaiaiaiafafbGewfkflbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacabababaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaiaiaiafafbGfkflewbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacabababababacababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafbGbGewewbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacababaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafgOdYdYdZbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafafafafafdUeleldWbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaYababababababaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafbGbGbGbGbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacabababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababdcaYaYabababaaaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafbGbGbGbGbGbGbGbGbGgPgsgsgsgQewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafababaaababababaYaYababaaaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafbGgPgsgsgsgsgsgsgsgQgPgsgsgsgQbGbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacababababbGbGcscsababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacacacacacacacacacacacacafhdhdhdhdhdhdhdafafabababacabababaYaaaaaaaaaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiafafafbGewgPgsgsgsgsgsgsgsgQbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGababababababaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafafafafafafafafafbGbGbGbGbGewewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacabababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGabababaaaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafbGbGbGbGbGbGbGbGbGgPgsgsgsgQewbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafabababababababbGbGababaaaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiafafbGgPgsgsgsgsgsgsgsgQgPgsgsgsgQbGbGbGbGafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacababababbGbGcscsababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacacacacacacacacacacacacafhdhdhdhdhdhdhdafafabababacabababbGaaaaaaaaaaabababababaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiafafafbGewgPgsgsgsgsgsgsgsgQbGbGbGbGbGbGbGafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacabababbGbGbGbGbGbGbGbGabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacacacacacacacacacacacafafhdhhhihjhkhhhdafafabababacacabababaaaaaaaaaaabababababaaaaaaaaaaaaaaafafaiaiaiafafafafafafbGbGbGewewbGbGbGbGbGbGbGbGbGafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaababbGbGabababababbGbGbGbGbGbGbGbGbGbGbGbGabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGababacacacacacacacacacacacacacacacacafafafafafafhdhhhphqhrhshdafafabababacacababababaaaaaaaaabababababaaaaaaaaaaaaafafafaiaiafafafafafafafbGbGbGewewbGbGbGbGafafafafafafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaabbGbGbGbGababbGbGbGbGbGhMhMhMbGbGbGbGbGbGbGababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababbGababacacacacacacacacacacacacacacacacafhthuhvafhwhdhdhdhxhdhdhdafafabababacacacababababaaaaaaababababaaaaaaaaaaaaafafafafafafafbGbGbGbGbGbGbGbGgPgQewbGbGbGafafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -914,23 +912,23 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaababaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacababababbGbGabababababababababacacacacababababaaaaaaaaaaaaaaaaafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacabababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacabababbGbGbGababababacacacacacacacacababababaaaaaaaaaaaaaaaaafafafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGabababacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacabababababababaYaYaYabababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGabababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacababababababaYaYaYaYaYaYaYaYaYaYabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababbGbGababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababacababababaYaYaYaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababbGababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababacababaYaYaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaababacababaYaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacabababaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafafafafafafaiaiaiaiaiaiafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababbOabababaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiafafafafafafafafafafafafaiaiaiafafafafafaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababbObOabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafafafafaaaaaaaaafafafaiaiaiafafafafaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababbObOabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababbOababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiafafafaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacabababababababbGbGbGabababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababbGbGbGabababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacababababababbGbGbGbGbGbGbGbGbGbGabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababbGbGababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababacababababbGbGbGaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababbGababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababacababbGbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaababacababbGbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacabababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiaiaiaiafafafafafafafafaiaiaiaiaiaiafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacabababbGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababaaaaaaaaaaaaaaaaafafafaiaiaiaiaiaiaiafafafafafafafafafafafafaiaiaiafafafafafaaafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacamacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafafafafaaaaaaaaafafafaiaiaiafafafafaaaaafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiaiafafaaaaaaaaaaaaaaaaafafafafafafafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababaaaaaaaaaaaaaaaaaaafafaiaiaiaiaiaiafafafaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababababaaaaaaaaaaaaaaaaaaaaafafafaiaiaiaiafafafafaaaaaaaaaaaaaaaaafaaafafafaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaaaafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbOababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbOacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababacacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababacabababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababaaababababababababaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaababacacacacacacacacacacacacacacacacacabababababacabababababababaaaaaaabaaaaaaaaababababaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -938,7 +936,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacacacababaaabababababaaaaaaababaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacababababababaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacacacacacacacacacacacacacacacababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacacacacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacacacacacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacacababaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacacacacababaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/bot/minibot.py b/bot/minibot.py index b3ff6cb5b55..f181704ebb2 100755 --- a/bot/minibot.py +++ b/bot/minibot.py @@ -7,9 +7,14 @@ import collections import time import pickle import socket +import sys import threading +def print_err(*msg): + print(*msg, file=sys.stderr) + + def setup_irc_socket(): s = socket.socket() s.settimeout(240) @@ -18,14 +23,15 @@ def setup_irc_socket(): try: s.connect((server, port)) except socket.error: - print("Unable to connect to server {0}:{1}, attempting to reconnect in 20 seconds.".format(server, port)) + print_err("Unable to connect to server {0}:{1}, attempting to reconnect in 20 seconds.".format(server, port)) time.sleep(20) else: - print("Connection established to server {0}:{1}.".format(server, port)) + print_err("Connection established to server {0}:{1}.".format(server, port)) break s.send(bytes("NICK {0}\r\n".format(nick), "UTF-8")) s.send(bytes("USER {0} {1} {2} :{3}\r\n".format(ident, server, name, realname), "UTF-8")) + time.sleep(5) s.send(bytes("PRIVMSG NickServ :IDENTIFY {0}\r\n".format(password), "UTF-8")) time.sleep(5) for channel in channels: @@ -50,12 +56,13 @@ def nudge_handler(irc): try: s, ip = nudge.accept() except: - print("Nudge socket lost, attempting to reopen.") + print_err("Nudge socket lost, attempting to reopen.") nudge = setup_nudge_socket() continue rawdata = s.recv(1024) s.close() data = pickle.loads(rawdata) + print(data) if data["ip"][0] == "#": message = "{0} :AUTOMATIC ANNOUNCEMENT : {1}\r\n".format(data["ip"], str(" ".join(data["data"]))) else: @@ -63,8 +70,8 @@ def nudge_handler(irc): try: irc.send(bytes("PRIVMSG {0}".format(message), "UTF-8")) except: - print("Nudge received without IRC socket, appending to queue.") - print("Message: {0}".format(message)) + print_err("Nudge received without IRC socket, appending to queue.") + print_err("Message: {0}".format(message)) message_queue.append(message) @@ -73,6 +80,7 @@ def irc_handler(irc): try: buf = irc.recv(1024).decode("UTF-8").split("\n") for i in buf: + print(i) if i[0:4] == "PING": irc.send(bytes("PONG {0}\r\n".format(i[5:]), "UTF-8")) else: @@ -80,12 +88,12 @@ def irc_handler(irc): if len(l) < 2: continue elif l[1] == "477": - print("Error: Nickname was not registered when joining {0}. Reauthing and retrying...".format(l[3])) + print_err("Error: Nickname was not registered when joining {0}. Reauthing and retrying...".format(l[3])) irc.send(bytes("PRIVMSG NickServ :IDENTIFY {0}\r\n".format(password), "UTF-8")) time.sleep(5) s.send(bytes("JOIN {0}\r\n".format(l[3]), "UTF-8")) elif l[1] == "433": - print("Error: Nickname already in use. Attempting to use alt nickname if available, sleeping 60s otherwise...") + print_err("Error: Nickname already in use. Attempting to use alt nickname if available, sleeping 60s otherwise...") if(altnick): s.send(bytes("NICK {0}\r\n".format(altnick), "UTF-8")) else: diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 35bc1270beb..207c7d435cb 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -97,10 +97,10 @@ Passive gate is similar to the regular pump except: if(stat & (BROKEN|NOPOWER)) return ui_interact(user) -/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 400, 115) + ui = new(user, src, ui_key, "atmos_pump", name, 335, 115) ui.open() /obj/machinery/atmospherics/components/binary/passive_gate/get_ui_data() @@ -158,7 +158,7 @@ Passive gate is similar to the regular pump except: on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if("pressure") - switch(params["set"]) + switch(params["pressure"]) if ("max") target_pressure = MAX_OUTPUT_PRESSURE if ("custom") diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 5b2241598e8..90d7fff5d92 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -105,10 +105,10 @@ Thus, the two variables affect pump operation are set in New(): return ui_interact(user) -/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 400, 115) + ui = new(user, src, ui_key, "atmos_pump", name, 335, 115) ui.open() /obj/machinery/atmospherics/components/binary/pump/get_ui_data() @@ -166,7 +166,7 @@ Thus, the two variables affect pump operation are set in New(): on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if("pressure") - switch(params["set"]) + switch(params["pressure"]) if ("max") target_pressure = MAX_OUTPUT_PRESSURE if ("custom") diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 35a904c8163..0d5dfd6d139 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -102,10 +102,10 @@ Thus, the two variables affect pump operation are set in New(): return ui_interact(user) -/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 400, 115) + ui = new(user, src, ui_key, "atmos_pump", name, 310, 115) ui.open() /obj/machinery/atmospherics/components/binary/volume_pump/get_ui_data() @@ -164,7 +164,7 @@ Thus, the two variables affect pump operation are set in New(): on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if("transfer") - switch(params) + switch(params["rate"]) if ("max") transfer_rate = MAX_TRANSFER_RATE if ("custom") diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index d1c0dafc97b..db33cde75e0 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -166,10 +166,10 @@ Filter types: return ui_interact(user) -/obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_filter", name, 450, 145) + ui = new(user, src, ui_key, "atmos_filter", name, 430, 140) ui.open() /obj/machinery/atmospherics/components/trinary/filter/get_ui_data() @@ -189,7 +189,7 @@ Filter types: on=!on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if("pressure") - switch(params["set"]) + switch(params["pressure"]) if("max") target_pressure = MAX_OUTPUT_PRESSURE if("custom") diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index fe603aac976..d20cd9c2109 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -129,10 +129,10 @@ return ui_interact(user) -/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_mixer", name, 450, 175) + ui = new(user, src, ui_key, "atmos_mixer", name, 330, 165) ui.open() /obj/machinery/atmospherics/components/trinary/mixer/get_ui_data() @@ -153,7 +153,7 @@ on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if("pressure") - switch(params["set"]) + switch(params["pressure"]) if("max") target_pressure = MAX_OUTPUT_PRESSURE if("custom") diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm index 9674aa921e1..a3697d2ac3c 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm @@ -110,10 +110,10 @@ return ui_interact(user) -/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "cryo", name, 410, 550, state = notcontained_state) + ui = new(user, src, ui_key, "cryo", name, 400, 550, state = notcontained_state) ui.open() /obj/machinery/atmospherics/components/unary/cryo_cell/get_ui_data() @@ -152,11 +152,6 @@ data["isOpen"] = state_open data["cellTemperature"] = round(air_contents.temperature) - data["cellTemperatureStatus"] = "good" - if(air_contents.temperature > T0C) // if greater than 273.15 kelvin (0 celcius) - data["cellTemperatureStatus"] = "bad" - else if(air_contents.temperature > 225) - data["cellTemperatureStatus"] = "average" data["isBeakerLoaded"] = beaker ? 1 : 0 var beakerContents[0] @@ -171,17 +166,18 @@ return switch(action) - if("open") - open_machine() - if("close") - close_machine() + if("power") + if(on) + on = FALSE + else if(!state_open) + on = TRUE + if("door") + if(state_open) + close_machine() + else + open_machine() if("autoeject") autoEject = !autoEject - if("on") - if(!state_open) - on = 1 - if("off") - on = 0 if("ejectbeaker") if(beaker) beaker.loc = get_step(loc, SOUTH) diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 2aa4dc062fd..809f9da7a0f 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -277,7 +277,7 @@ welded = 0 update_icon() pipe_vision_img = image(src, loc, layer = 20, dir = dir) - return 1 + return 0 else return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 65bdcf2c5e8..4aaae1ba502 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -309,7 +309,7 @@ welded = 0 update_icon() pipe_vision_img = image(src, loc, layer = 20, dir = dir) - return 1 + return 0 if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) @@ -321,4 +321,4 @@ return !welded #undef SIPHONING -#undef SCRUBBING \ No newline at end of file +#undef SCRUBBING diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index b4547824db6..6bbc0924dbe 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -24,8 +24,7 @@ if(update) update = 0 reconcile_air() - - return + update = air.react() var/pipenetwarnings = 10 diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index fa7c5902d8e..00d16589414 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -80,7 +80,8 @@ volume = affected.fuel_burnt*FIRE_GROWTH_RATE location.assume_air(affected) - for(var/atom/item in loc) + for(var/A in loc) + var/atom/item = A if(item && item != src) // It's possible that the item is deleted in temperature_expose item.fire_act(null, temperature, volume) return 0 diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2701a64da59..3937282472f 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -152,3 +152,8 @@ #define PARENT2 parents[2] #define PARENT3 parents[3] #define PARENT_I parents[I] + +//Tanks +#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) +#define TANK_MIN_RELEASE_PRESSURE 0 +#define TANK_DEFAULT_RELEASE_PRESSURE 16 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6e49c476ac4..0f61f0d4235 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -181,6 +181,8 @@ #define ZLEVEL_ABANDONNEDTSAT 3 #define ZLEVEL_CENTCOM 2 #define ZLEVEL_STATION 1 +#define ZLEVEL_LAVALAND 5 +#define ZLEVEL_UNDERGROUND 6 //ticker.current_state values #define GAME_STATE_STARTUP 0 diff --git a/code/__DEFINES/nano.dm b/code/__DEFINES/nano.dm deleted file mode 100644 index 96bc05691a6..00000000000 --- a/code/__DEFINES/nano.dm +++ /dev/null @@ -1,15 +0,0 @@ - /** - * NanoUI Defines - * - * Contains all NanoUI state definitions. - * - * /tg/station user interface library - * thanks to baystation12 - * - * modified by neersighted - **/ - -#define NANO_INTERACTIVE 2 // Green/Interactive -#define NANO_UPDATE 1 // Orange/Updates Only -#define NANO_DISABLED 0 // Red/Disabled -#define NANO_CLOSE -1 // Closed \ No newline at end of file diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm new file mode 100644 index 00000000000..5ba0096d1be --- /dev/null +++ b/code/__DEFINES/tgui.dm @@ -0,0 +1,4 @@ +#define UI_INTERACTIVE 2 // Green/Interactive +#define UI_UPDATE 1 // Orange/Updates Only +#define UI_DISABLED 0 // Red/Disabled +#define UI_CLOSE -1 // Closed \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 90c7b7ff039..b098af53541 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -389,22 +389,19 @@ continue spawn(0) G << 'sound/misc/notice2.ogg' //Alerting them to their consideration - switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No")) - if("Yes") + switch(askuser(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time)) + if(1) G << "Choice registered: Yes." - if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed. + if((world.time-time_passed)>poll_time) G << "Sorry, you were too late for the consideration!" G << 'sound/machines/buzz-sigh.ogg' - return - candidates += G - if("No") + else + candidates += G + if(2) G << "Choice registered: No." - return - else - return sleep(poll_time) - //Check all our candidates, to make sure they didn't log off during the 30 second wait period. + //Check all our candidates, to make sure they didn't log off during the wait period. for(var/mob/dead/observer/G in candidates) if(!G.key || !G.client) candidates.Remove(G) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index c7f57434960..31a40ca978f 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -12,7 +12,7 @@ //undershirt init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f) //socks - init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) + init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list) //lizard bodyparts (blizzard intensifies) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, tails_list_lizard) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 72ab4f9bdf3..0116232841a 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -28,13 +28,10 @@ if(FEMALE) return pick(undershirt_f) else return pick(undershirt_list) -/proc/random_socks(gender) +/proc/random_socks() if(!socks_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) - switch(gender) - if(MALE) return pick(socks_m) - if(FEMALE) return pick(socks_f) - else return pick(socks_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list) + return pick(socks_list) /proc/random_features() if(!tails_list_human.len) @@ -139,4 +136,102 @@ Proc for attack log creation, because really why not user.attack_log += text("\[[time_stamp()]\] Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") if(target && ismob(target)) target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") - log_attack("[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") \ No newline at end of file + log_attack("[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") + + + +/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1) + if(!user || !target) + return 0 + var/user_loc = user.loc + + var/drifting = 0 + if(!user.Process_Spacemove(0) && user.inertia_dir) + drifting = 1 + + var/target_loc = target.loc + + var/holding = user.get_active_hand() + var/datum/progressbar/progbar + if (progress) + progbar = new(user, time, target) + + var/endtime = world.time+time + var/starttime = world.time + . = 1 + while (world.time < endtime) + sleep(1) + if (progress) + progbar.update(world.time - starttime) + if(!user || !target) + . = 0 + break + if(uninterruptible) + continue + + if(drifting && !user.inertia_dir) + drifting = 0 + user_loc = user.loc + + if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying ) + . = 0 + break + if (progress) + qdel(progbar) + + +/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1) + if(!user) + return 0 + var/atom/Tloc = null + if(target) + Tloc = target.loc + + var/atom/Uloc = user.loc + + var/drifting = 0 + if(!user.Process_Spacemove(0) && user.inertia_dir) + drifting = 1 + + var/holding = user.get_active_hand() + + var/holdingnull = 1 //User's hand started out empty, check for an empty hand + if(holding) + holdingnull = 0 //Users hand started holding something, check to see if it's still holding that + + var/datum/progressbar/progbar + if (progress) + progbar = new(user, delay, target) + + var/endtime = world.time + delay + var/starttime = world.time + . = 1 + while (world.time < endtime) + sleep(1) + if (progress) + progbar.update(world.time - starttime) + + if(drifting && !user.inertia_dir) + drifting = 0 + Uloc = user.loc + + if(!user || user.stat || user.weakened || user.stunned || (!drifting && user.loc != Uloc)) + . = 0 + break + + if(Tloc && (!target || Tloc != target.loc)) + . = 0 + break + + if(needhand) + //This might seem like an odd check, but you can still need a hand even when it's empty + //i.e the hand is used to pull some item/tool out of the construction + if(!holdingnull) + if(!holding) + . = 0 + break + if(user.get_active_hand() != holding) + . = 0 + break + if (progress) + qdel(progbar) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index fb24ac24859..a9c35aee9b4 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -162,15 +162,19 @@ //Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator) /proc/text2list(text, delimiter="\n") var/delim_len = length(delimiter) - if(delim_len < 1) return list(text) . = list() var/last_found = 1 - var/found - do - found = findtext(text, delimiter, last_found, 0) - . += copytext(text, last_found, found) - last_found = found + delim_len - while(found) + var/found = 1 + if(delim_len < 1) + var/text_len = length(text) + while(found++ <= text_len) + . += copytext(text,found-1, found) + else + do + found = findtext(text, delimiter, last_found, 0) + . += copytext(text, last_found, found) + last_found = found + delim_len + while(found) //Case Sensitive! /proc/text2listEx(text, delimiter="\n") diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a1b0b22f1dc..76623d41e30 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -379,6 +379,8 @@ Turf and target are seperate in case you want to teleport some distance from a t if(skip_mindless && (!M.mind && !M.ckey)) if(!isbot(M) && !istype(M, /mob/camera/)) continue + if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins + continue var/name = M.name if (name in names) namecounts[name]++ @@ -666,108 +668,6 @@ Turf and target are seperate in case you want to teleport some distance from a t else return get_step(ref, base_dir) -/proc/do_mob(mob/user , mob/target, time = 30, numticks = 5, uninterruptible = 0, progress = 1) - //This is quite an ugly solution but i refuse to use the old request system. - if(!user || !target) - return 0 - if(numticks == 0) - return 0 - var/user_loc = user.loc - user.last_move = null - var/target_loc = target.loc - target.last_move = null - var/holding = user.get_active_hand() - var/timefraction = round(time/numticks) - var/image/progbar - var/continue_looping = 1 - for(var/i = 1 to numticks) - if(user.client && progress) - progbar = make_progress_bar(i, numticks, target) - assign_progress_bar(user, progbar) - sleep(timefraction) - if(!user || !target) - continue_looping = 0 - - if (continue_looping && !uninterruptible && (user.loc != user_loc || user.last_move != null || target.loc != target_loc || target.last_move != null || user.get_active_hand() != holding || user.incapacitated() || user.lying )) - continue_looping = 0 - - cancel_progress_bar(user, progbar)//Clear the way for the next progbar image - if(!continue_looping) - return 0 - - cancel_progress_bar(user, progbar) - return 1 - -/proc/make_progress_bar(current_number, goal_number, atom/target) - if(current_number && goal_number && target) - var/image/progbar - progbar = image("icon" = 'icons/effects/doafter_icon.dmi', "loc" = target, "icon_state" = "prog_bar_0") - progbar.icon_state = "prog_bar_[round(((current_number / goal_number) * 100), 10)]" - progbar.pixel_y = 32 - return progbar - -/proc/cancel_progress_bar(mob/user, image/progbar) - if(user && user.client && progbar) - user.client.images -= progbar - -/proc/assign_progress_bar(mob/user, image/progbar) - if(user && user.client && progbar) - user.client.images |= progbar - -/proc/do_after(mob/user, delay, numticks = 5, needhand = 1, atom/target = null, progress = 1) - if(!user) - return 0 - - if(numticks == 0) - return 0 - - var/atom/Tloc = null - if(target) - Tloc = target.loc - var/atom/movable/AMtarget - if(istype(target,/atom/movable)) - AMtarget = target - AMtarget.last_move = null - var/delayfraction = round(delay/numticks) - - var/atom/Uloc = user.loc - user.last_move = null - var/holding = user.get_active_hand() - var/holdingnull = 1 //User is not holding anything - if(holding) - holdingnull = 0 //User is holding a tool of some kind - - var/image/progbar - - var/continue_looping = 1 - for (var/i = 1 to numticks) - if(user.client && progress) - progbar = make_progress_bar(i, numticks, target) - assign_progress_bar(user, progbar) - - sleep(delayfraction) - if(!user || user.stat || user.weakened || user.stunned || !(user.loc == Uloc) || (user.last_move != null)) - continue_looping = 0 - - if(continue_looping && Tloc && (!target || Tloc != target.loc || (AMtarget && AMtarget.last_move != null))) //Tloc not set when we don't want to track target - continue_looping = 0 - - if(continue_looping && needhand) - //This might seem like an odd check, but you can still need a hand even when it's empty - //i.e the hand is used to insert some item/tool into the construction - if(!holdingnull) - if(!holding) - continue_looping = 0 - if(continue_looping && user.get_active_hand() != holding) - continue_looping = 0 - - cancel_progress_bar(user, progbar)//Clear the way for the next progbar image - if(!continue_looping) - return 0 - - cancel_progress_bar(user,progbar) - return 1 - //Takes: Anything that could possibly have variables and a varname to check. //Returns: 1 if found, 0 if not. /proc/hasvar(datum/A, varname) @@ -802,8 +702,9 @@ Turf and target are seperate in case you want to teleport some distance from a t //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all turfs in areas of that type of that type in the world. -/proc/get_area_turfs(areatype) - if(!areatype) return null +/proc/get_area_turfs(areatype, target_z = 0) + if(!areatype) + return null if(istext(areatype)) areatype = text2path(areatype) if(isarea(areatype)) var/area/areatemp = areatype @@ -812,7 +713,9 @@ Turf and target are seperate in case you want to teleport some distance from a t var/list/turfs = new/list() for(var/area/N in world) if(istype(N, areatype)) - for(var/turf/T in N) turfs += T + for(var/turf/T in N) + if(target_z == 0 || target_z == T.z) + turfs += T return turfs //Takes: Area type as text string or as typepath OR an instance of the area. @@ -831,8 +734,6 @@ Turf and target are seperate in case you want to teleport some distance from a t atoms += A return atoms - - /proc/get_cardinal_dir(atom/A, atom/B) var/dx = abs(B.x - A.x) var/dy = abs(B.y - A.y) @@ -1217,7 +1118,7 @@ B --><-- A transform = shift SpinAnimation(rotation_speed, -1, clockwise, rotation_segments) - + //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit transform = initial_transform while(orbiting && orbiting == A && A.loc) @@ -1227,7 +1128,7 @@ B --><-- A loc = targetloc lastloc = loc sleep(0.6) - + if (orbiting == A) //make sure we haven't started orbiting something else. orbiting = null SpinAnimation(0,0) diff --git a/code/__PATH_COMPATIBILITY/path_compatibility.dm b/code/__PATH_COMPATIBILITY/path_compatibility.dm new file mode 100644 index 00000000000..f3ff37e2bbc --- /dev/null +++ b/code/__PATH_COMPATIBILITY/path_compatibility.dm @@ -0,0 +1,28 @@ +/* + + This is a smart+stupid method of maintaining paths during refactors. + At this point in time we have more maps than ever, and our tools just aren't that great. + So instead of repathing all the maps... + + Keep the old path defined, just as an empty type with that path, and then define it's + parent_type as the new path, effectively maintaining the object/mob w/e without having + to touch all the maps, avoiding all those nasty conflicts! + + Ideally the old paths would be cleaned out as mappers go about their usual routine of + updating old maps. + + tl;dr TYPEFUCKERY, because fuck updating all these maps + +*/ + + + +//Vehicle Refactor - 2015 +/obj/structure/bed/chair/janicart/secway + parent_type = /obj/vehicle/secway + +/obj/structure/bed/chair/janicart + parent_type = /obj/vehicle/janicart + +/obj/structure/bed/chair/janicart/atv + parent_type = /obj/vehicle/atv \ No newline at end of file diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index df39c500d7f..033d5af6152 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -16,8 +16,6 @@ var/global/list/undershirt_m = list() //stores only undershirt name var/global/list/undershirt_f = list() //stores only undershirt name //Socks var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name -var/global/list/socks_m = list() //stores only socks name -var/global/list/socks_f = list() //stores only socks name //Lizard Bits (all datum lists indexed by name) var/global/list/body_markings_list = list() var/global/list/tails_list_lizard = list() diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 8ef1b37a686..411f562888b 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -43,7 +43,7 @@ // Oh by the way this didn't work with old click code which is why clicking shit didn't spam you /atom/proc/attack_ghost(mob/dead/observer/user) if(user.client) - if(check_rights(R_ADMIN, 0)) + if(IsAdminGhost(user)) attack_ai(user) if(user.client.prefs.inquisitive_ghost) user.examinate(src) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index ff3ebace2ce..4a32ac96510 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -114,6 +114,9 @@ var/const/tk_maxrange = 15 focus_object(target, user) return + if(focus.anchored) + qdel(src) + if(target == focus) target.attack_self_tk(user) return // todo: something like attack_self not laden with assumptions inherent to attack_self @@ -124,12 +127,11 @@ var/const/tk_maxrange = 15 var/resolved = target.attackby(I, user, params) if(!resolved && target && I) I.afterattack(target,user,1) // for splashing with beakers - - else apply_focus_overlay() focus.throw_at(target, 10, 1,user) last_throw = world.time + user.changeNext_move(CLICK_CD_MELEE) return /proc/tkMaxRangeCheck(mob/user, atom/target, atom/focus) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 7b711c76125..1632b5f318f 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -8,7 +8,6 @@ * All core systems are subsystems. * They are process()'d by this Master Controller. **/ - var/global/datum/controller/master/Master = new() /datum/controller/master @@ -196,3 +195,4 @@ var/global/datum/controller/master/Master = new() statclick = new/obj/effect/statclick/debug("Initializing...", src) stat("Master Controller:", statclick.update("[round(Master.cost, 0.001)]ds (Interval: [Master.processing_interval] | Iteration:[Master.iteration])")) + diff --git a/code/controllers/subsystem/nano.dm b/code/controllers/subsystem/nano.dm deleted file mode 100644 index e7ccd7f66dd..00000000000 --- a/code/controllers/subsystem/nano.dm +++ /dev/null @@ -1,30 +0,0 @@ -var/datum/subsystem/nano/SSnano - -/datum/subsystem/nano - name = "NanoUI" - wait = 10 - priority = 16 - display = 6 - - can_fire = 1 // This needs to fire before round start. - - var/list/open_uis = list() // A list of open NanoUIs, grouped by src_object and ui_key. - var/list/processing_uis = list() // A list of processing NanoUIs, not grouped. - var/html // The HTML template used by new UIs; minus initial data. - - -/datum/subsystem/nano/New() - html = file2text('nano/assets/nanoui.html') // Read the HTML from disk. - - NEW_SS_GLOBAL(SSnano) - -/datum/subsystem/nano/stat_entry() - ..("O:[open_uis.len]|P:[processing_uis.len]") // Show how many interfaces we have open/are processing. - -/datum/subsystem/nano/fire() // Process UIs. - for(var/thing in processing_uis) - var/datum/nanoui/ui = thing - if(ui && ui.user && ui.src_object) - ui.process() - continue - processing_uis.Remove(ui) diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 3549b64f1e5..7c6678e5c36 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -201,7 +201,7 @@ var/datum/subsystem/pai/SSpai if(!C) return asked.Add(C.key) asked[C.key] = world.time - var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round") + var/response = tgalert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round", StealFocus=0, Timeout=askDelay) if(!C) return //handle logouts that happen whilst the alert is waiting for a response. if(response == "Yes") recruitWindow(C.mob) diff --git a/code/controllers/subsystem/shuttles/emergency.dm b/code/controllers/subsystem/shuttles/emergency.dm index ed73d3bfdd9..09cddb6daef 100644 --- a/code/controllers/subsystem/shuttles/emergency.dm +++ b/code/controllers/subsystem/shuttles/emergency.dm @@ -102,18 +102,21 @@ G.dom_attempts = min(1,G.dom_attempts) if(SHUTTLE_DOCKED) - if(time_left <= 0 && SSshuttle.emergencyNoEscape) - priority_announce("Hostile environment detected. Departure has been postponed indefinitely pending conflict resolution.", null, 'sound/misc/notice1.ogg', "Priority") - sound_played = 0 - mode = SHUTTLE_STRANDED - if(time_left <= 50 && !sound_played) //4 seconds left - should sync up with the launch - sound_played = 1 + + if(time_left <= 50 && !sound_played) //4 seconds left:REV UP THOSE ENGINES BOYS. - should sync up with the launch + sound_played = 1 //Only rev them up once. for(var/area/shuttle/escape/E in world) E << 'sound/effects/hyperspace_begin.ogg' + + if(time_left <= 0 && SSshuttle.emergencyNoEscape) + priority_announce("Hostile environment detected. Departure has been postponed indefinitely pending conflict resolution.", null, 'sound/misc/notice1.ogg', "Priority") + sound_played = 0 //Since we didn't launch, we will need to rev up the engines again next pass. + mode = SHUTTLE_STRANDED + if(time_left <= 0 && !SSshuttle.emergencyNoEscape) //move each escape pod to its corresponding transit dock for(var/obj/docking_port/mobile/pod/M in SSshuttle.mobile) - if(M.z == ZLEVEL_STATION) //Will not launch from the mine/planet + if(M.z == ZLEVEL_STATION) //Will not launch from the mine/planet(for some reason) M.enterTransit() //now move the actual emergency shuttle to its transit dock for(var/area/shuttle/escape/E in world) diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm new file mode 100644 index 00000000000..e9aca112ca8 --- /dev/null +++ b/code/controllers/subsystem/tgui.dm @@ -0,0 +1,30 @@ +var/datum/subsystem/tgui/SStgui + +/datum/subsystem/tgui + name = "tgui" + wait = 10 + priority = 16 + display = 6 + + can_fire = 1 // This needs to fire before round start. + + var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key. + var/list/processing_uis = list() // A list of processing UIs, not grouped. + var/html // The HTML template used by new UIs; minus initial data. + + +/datum/subsystem/tgui/New() + html = file2text('tgui/tgui.html') // Read the HTML from disk. + + NEW_SS_GLOBAL(SStgui) + +/datum/subsystem/tgui/stat_entry() + ..("O:[open_uis.len]|P:[processing_uis.len]") // Show how many interfaces we have open/are processing. + +/datum/subsystem/tgui/fire() // Process UIs. + for(var/thing in processing_uis) + var/datum/tgui/ui = thing + if(ui && ui.user && ui.src_object) + ui.process() + continue + processing_uis.Remove(ui) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 7a464ca860c..7291fe5e2bd 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -36,9 +36,9 @@ /datum/ai_laws/robocop name = "Prime Directives" - inherent = list("Uphold the law.",\ + inherent = list("Serve the public trust.",\ "Protect the innocent.",\ - "Serve the public trust.") + "Uphold the law.") /datum/ai_laws/malfunction name = "*ERROR*" diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 042882c0b22..6153e052217 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -19,13 +19,9 @@ /datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam) endtime = world.time+time origin = beam_origin - origin_oldloc = origin.loc - if(isarea(origin_oldloc)) - origin_oldloc = origin + origin_oldloc = get_turf(origin) target = beam_target - target_oldloc = target.loc - if(isarea(target_oldloc)) - target_oldloc = target + target_oldloc = get_turf(target) if(origin_oldloc == origin && target_oldloc == target) static_beam = 1 max_distance = maxdistance @@ -38,9 +34,11 @@ /datum/beam/proc/Start() Draw() while(!finished && origin && target && world.time < endtime && get_dist(origin,target)[Message]
+
+ [Button1]"} + + if (Button2) + output += {"[Button2]"} + + if (Button3) + output += {"[Button3]"} + + output += {"
"} + + ..(User, ckey("[User]-[Message]-[Title]-[world.time]-[rand(1,10000)]"), Title, 350, 150, src) + set_content(output) + stealfocus = StealFocus + if (!StealFocus) + window_options += "focus=false;" + timeout = Timeout + +/datum/browser/alert/open() + set waitfor = 0 + opentime = world.time + + if (stealfocus) + . = ..(use_onclose = 1) + else + var/focusedwindow = winget(user, null, "focus") + . = ..(use_onclose = 1) + + //waits for the window to show up client side before attempting to un-focus it + //winexists sleeps until it gets a reply from the client, so we don't need to bother sleeping + for (var/i in 1 to 10) + if (user && winexists(user, window_id)) + if (focusedwindow) + winset(user, focusedwindow, "focus=true") + else + winset(user, "mapwindow", "focus=true") + break + if (timeout) + spawn(timeout) + close() + +/datum/browser/alert/close() + .=..() + opentime = 0 + +/datum/browser/alert/proc/wait() + while (opentime && selectedbutton <= 0 && (!timeout || opentime+timeout >= world.time)) + sleep (1) + +/datum/browser/alert/Topic(href,href_list) + if (href_list["close"] || !user || !user.client) + opentime = 0 + return + if (href_list["button"]) + var/button = text2num(href_list["button"]) + if (button <= 3 && button >= 1) + selectedbutton = button + opentime = 0 + close() + +//designed as a drop in replacement for alert(); functions the same. (outside of needing User specified) +/proc/tgalert(var/mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000) + if (!User) + User = usr + switch(askuser(User, Message, Title, Button1, Button2, Button3, StealFocus, Timeout)) + if (1) + return Button1 + if (2) + return Button2 + if (3) + return Button3 + +//Same shit, but it returns the button number, could at some point support unlimited button amounts. +/proc/askuser(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000) + if (!istype(User)) + if (istype(User, /client/)) + var/client/C = User + User = C.mob + else + return + var/datum/browser/alert/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus, Timeout) + A.open() + A.wait() + if (A.selectedbutton) + return A.selectedbutton + // This will allow you to show an icon in the browse window // This is added to mob so that it can be used without a reference to the browser object // There is probably a better place for this... diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 095b53dd585..89d3e04808f 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -266,161 +266,6 @@ var/record_id_num = 1001 return /datum/datacore/proc/get_id_photo(mob/living/carbon/human/H) - var/icon/photo = null - var/g = (H.gender == FEMALE) ? "f" : "m" - if(!config.mutant_races || H.dna.species.use_skintones) - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s") - else - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s") - photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY) - - var/icon/eyes_s - if(EYECOLOR in H.dna.species.specflags) - eyes_s = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]_s") - eyes_s.Blend("#[H.eye_color]", ICON_MULTIPLY) - - var/datum/sprite_accessory/S - S = hair_styles_list[H.hair_style] - if(S && (HAIR in H.dna.species.specflags)) - var/icon/hair_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") - hair_s.Blend("#[H.hair_color]", ICON_MULTIPLY) - eyes_s.Blend(hair_s, ICON_OVERLAY) - - S = facial_hair_styles_list[H.facial_hair_style] - if(S && (FACEHAIR in H.dna.species.specflags)) - var/icon/facial_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") - facial_s.Blend("#[H.facial_hair_color]", ICON_MULTIPLY) - eyes_s.Blend(facial_s, ICON_OVERLAY) - - if(eyes_s) - photo.Blend(eyes_s, ICON_OVERLAY) - - var/icon/clothes_s = null - switch(H.mind.assigned_role) - if("Assistant") - clothes_s = icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Scientist") - clothes_s = icon('icons/mob/uniform.dmi', "toxinswhite_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_tox"), ICON_OVERLAY) - if("Station Engineer") - clothes_s = icon('icons/mob/uniform.dmi', "engine_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Security Officer") - clothes_s = icon('icons/mob/uniform.dmi', "security_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) - if("Medical Doctor") - clothes_s = icon('icons/mob/uniform.dmi', "medical_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) - if("Cargo Technician") - clothes_s = icon('icons/mob/uniform.dmi', "cargo_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Shaft Miner") - clothes_s = icon('icons/mob/uniform.dmi', "miner_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Atmospheric Technician") - clothes_s = icon('icons/mob/uniform.dmi', "atmos_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Botanist") - clothes_s = icon('icons/mob/uniform.dmi', "hydroponics_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY) - if("Chemist") - clothes_s = icon('icons/mob/uniform.dmi', "chemistrywhite_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_chem"), ICON_OVERLAY) - if("Cook") - clothes_s = icon('icons/mob/uniform.dmi', "chef_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "chef"), ICON_OVERLAY) - if("Janitor") - clothes_s = icon('icons/mob/uniform.dmi', "janitor_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Geneticist") - clothes_s = icon('icons/mob/uniform.dmi', "geneticswhite_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_gen"), ICON_OVERLAY) - if("Virologist") - clothes_s = icon('icons/mob/uniform.dmi', "virologywhite_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_vir"), ICON_OVERLAY) - if("Roboticist") - clothes_s = icon('icons/mob/uniform.dmi', "robotics_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) - if("Lawyer") - clothes_s = icon('icons/mob/uniform.dmi', "bluesuit_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY) - if("Clown") - clothes_s = icon('icons/mob/uniform.dmi', "clown_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY) - if("Mime") - clothes_s = icon('icons/mob/uniform.dmi', "mime_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY) - if("Bartender") - clothes_s = icon('icons/mob/uniform.dmi', "barman_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) - if("Quartermaster") - clothes_s = icon('icons/mob/uniform.dmi', "qm_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if("Chaplain") - clothes_s = icon('icons/mob/uniform.dmi', "chapblack_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Research Director") - clothes_s = icon('icons/mob/uniform.dmi', "director_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) - if("Chief Medical Officer") - clothes_s = icon('icons/mob/uniform.dmi', "cmo_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_cmo"), ICON_OVERLAY) - if("Captain") - clothes_s = icon('icons/mob/uniform.dmi', "captain_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "capcarapace"), ICON_OVERLAY) - if("Head of Security") - clothes_s = icon('icons/mob/uniform.dmi', "hos_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "hostrench"), ICON_OVERLAY) - if("Warden") - clothes_s = icon('icons/mob/uniform.dmi', "warden_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "warden_jacket"), ICON_OVERLAY) - if("Detective") - clothes_s = icon('icons/mob/uniform.dmi', "detective_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) - clothes_s.Blend(icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY) - clothes_s.Blend(icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) - if("Chief Engineer") - clothes_s = icon('icons/mob/uniform.dmi', "chief_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Head of Personnel") - clothes_s = icon('icons/mob/uniform.dmi', "hop_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if("Librarian") - clothes_s = icon('icons/mob/uniform.dmi', "red_suit_s") - clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - - if(clothes_s) - photo.Blend(clothes_s, ICON_OVERLAY) - - return photo + var/datum/job/J = SSjob.GetJob(H.mind.assigned_role) + var/datum/preferences/P = H.client.prefs + return get_flat_human_icon(null,J.outfit,P) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 911035c8b04..413764f7345 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -612,7 +612,12 @@ body M << "Control of your mob has been offered to dead players." log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts") - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", "pAI", null, FALSE, 100) + var/poll_message = "Do you want to play as [M.real_name]?" + if(M.mind && M.mind.assigned_role) + poll_message = "[poll_message] Job:[M.mind.assigned_role]." + if(M.mind && M.mind.special_role) + poll_message = "[poll_message] Status:[M.mind.special_role]." + var/list/mob/dead/observer/candidates = pollCandidates(poll_message, "pAI", null, FALSE, 100) var/mob/dead/observer/theghost = null if(candidates.len) diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm new file mode 100644 index 00000000000..19fed9d99db --- /dev/null +++ b/code/datums/diseases/tuberculosis.dm @@ -0,0 +1,62 @@ +/datum/disease/tuberculosis + name = "Fungal tuberculosis" + max_stages = 4 + spread_text = "Airborne" + cure_text = "Spaceacillin & salbutamol" + cures = list("spaceacillin", "salbutamol") + agent = "Fungal Tubercle bacillus Cosmosis" + viable_mobtypes = list(/mob/living/carbon/human) + cure_chance = 5//like hell are you getting out of hell + desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." + required_organs = list(/obj/item/organ/limb/head) + severity = DANGEROUS + +/datum/disease/tuberculosis/stage_act() //it begins + ..() + + switch(stage) + if(2) + if(prob(2)) + affected_mob.emote("cough") + affected_mob << "Your chest hurts." + if(prob(2)) + affected_mob << "Your stomach violently rumbles!" + if(prob(2)) + affected_mob << "You feel a sharp pain from your lower chest!" + affected_mob.adjustOxyLoss(5) + affected_mob.emote("gasp") + if(prob(5)) + affected_mob.vomit(20) + if(3) + if(prob(2)) + affected_mob << "You see four of everything" + affected_mob.Dizzy(5) + if(prob(2)) + affected_mob << "You feel a cold sweat form." + if(prob(10)) + affected_mob << "You feel air escape from your lungs painfully." + affected_mob.adjustOxyLoss(25) + affected_mob.emote("gasp") + + if(4) + if(prob(2)) + affected_mob << "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]" + affected_mob.adjustStaminaLoss(70) + if(prob(10)) + affected_mob.adjustStaminaLoss(100) + affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace...") + affected_mob.sleeping += 5 + if(prob(2)) + affected_mob << "You feel your mind relax and your thoughts drift!" + affected_mob.confused = min(100, affected_mob.confused + 8) + if(prob(15)) + affected_mob.vomit(0, 1) + if(prob(3)) + affected_mob << "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]" + affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) + affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) + if(prob(15)) + affected_mob << "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]" + affected_mob.bodytemperature += 40 + return + diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 19a108e1fcd..794c8f6fe4c 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -503,7 +503,8 @@ What are the archived variables for? trace_types_considered += trace_gas.type - for(var/datum/gas/trace_gas in sharer.trace_gases) + for(var/gas in sharer.trace_gases) + var/datum/gas/trace_gas = gas if(trace_gas.type in trace_types_considered) continue var/datum/gas/corresponding @@ -582,7 +583,8 @@ What are the archived variables for? last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) + for(var/gas in trace_gases) + var/datum/gas/trace_gas = gas var/delta = 0 delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1) diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 71dca89f54f..64ffea2115c 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -6,6 +6,7 @@ var/temporary = 0 var/datum/martial_art/base = null // The permanent style var/deflection_chance = 0 //Chance to deflect projectiles + var/help_verb = null /datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return 0 @@ -61,6 +62,8 @@ return 1 /datum/martial_art/proc/teach(mob/living/carbon/human/H,make_temporary=0) + if(help_verb) + H.verbs += help_verb if(make_temporary) temporary = 1 if(H.martial_art && H.martial_art.temporary) @@ -75,6 +78,8 @@ if(H.martial_art != src) return H.martial_art = base + if(help_verb) + H.verbs -= help_verb /datum/martial_art/boxing name = "Boxing" @@ -125,6 +130,12 @@ /datum/martial_art/wrestling name = "Wrestling" + help_verb = /mob/living/carbon/human/proc/wrestling_help + +// combo refence since wrestling uses a different format to sleeping carp and plasma fist. +// Clinch "G" +// Suplex "GD" +// Advanced grab "G" /datum/martial_art/wrestling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) D.grabbedby(A,1) @@ -175,12 +186,24 @@ D.apply_damage(10, STAMINA, affecting, armor_block) return 1 +/mob/living/carbon/human/proc/wrestling_help() + set name = "Recall Teachings" + set desc = "Remember how to wrestle." + set category = "Wrestling" + + usr << "You flex your muscles and have a revelation..." + usr << "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful." + usr << "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor." + usr << "Advanced grab: Grab. Passively causes stamina damage when grabbing someone." + #define TORNADO_COMBO "HHD" #define THROWBACK_COMBO "DHD" #define PLASMA_COMBO "HDDDH" /datum/martial_art/plasma_fist name = "Plasma Fist" + help_verb = /mob/living/carbon/human/proc/plasma_fist_help + /datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,TORNADO_COMBO)) @@ -235,26 +258,35 @@ return /datum/martial_art/plasma_fist/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("H") + add_to_streak("H",D) if(check_streak(A,D)) return 1 basic_hit(A,D) return 1 /datum/martial_art/plasma_fist/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("D") + add_to_streak("D",D) if(check_streak(A,D)) return 1 basic_hit(A,D) return 1 /datum/martial_art/plasma_fist/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("G") + add_to_streak("G",D) if(check_streak(A,D)) return 1 basic_hit(A,D) return 1 +/mob/living/carbon/human/proc/plasma_fist_help() + set name = "Recall Teachings" + set desc = "Remember the martial techniques of the Plasma Fist." + set category = "Plasma Fist" + + usr << "You clench your fists and have a flashback of knowledge..." + usr << "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back." + usr << "Throwback: Disarm Harm Disarm. Throws the target and an item at them." + usr << "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body." //Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss #define WRIST_WRENCH_COMBO "DD" @@ -265,6 +297,7 @@ /datum/martial_art/the_sleeping_carp name = "The Sleeping Carp" deflection_chance = 100 + help_verb = /mob/living/carbon/human/proc/sleeping_carp_help /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,WRIST_WRENCH_COMBO)) @@ -345,7 +378,7 @@ return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("G") + add_to_streak("G",D) if(check_streak(A,D)) return 1 ..() @@ -354,7 +387,7 @@ G.state = GRAB_AGGRESSIVE //Instant aggressive grab /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("H") + add_to_streak("H",D) if(check_streak(A,D)) return 1 var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams") @@ -369,7 +402,7 @@ /datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - add_to_streak("D") + add_to_streak("D",D) if(check_streak(A,D)) return 1 return ..() @@ -380,6 +413,7 @@ set category = "Sleeping Carp" usr << "You retreat inward and recall the teachings of the Sleeping Carp..." + usr << "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand." usr << "Back Kick: Harm Grab. Opponent must be facing away. Knocks down." usr << "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns." @@ -417,6 +451,7 @@ if(slot == slot_belt) var/mob/living/carbon/human/H = user style.teach(H,1) + user << "You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab." return /obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) @@ -425,6 +460,7 @@ var/mob/living/carbon/human/H = user if(H.get_item_by_slot(slot_belt) == src) style.remove(H) + user << "You no longer have an urge to flex your muscles." return /obj/item/weapon/plasma_fist_scroll @@ -461,7 +497,6 @@ return 0 user << "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." - user.verbs += /mob/living/carbon/human/proc/sleeping_carp_help var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) theSleepingCarp.teach(user) user.drop_item() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 4dbe7141aac..1ee1a3d01ea 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1,1686 +1,1579 @@ -/* Note from Carnie: - The way datum/mind stuff works has been changed a lot. - Minds now represent IC characters rather than following a client around constantly. - - Guidelines for using minds properly: - - - Never mind.transfer_to(ghost). The var/current and var/original of a mind must always be of type mob/living! - ghost.mind is however used as a reference to the ghost's corpse - - - When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human) - the existing mind of the old mob should be transfered to the new mob like so: - - mind.transfer_to(new_mob) - - - You must not assign key= or ckey= after transfer_to() since the transfer_to transfers the client for you. - By setting key or ckey explicitly after transfering the mind with transfer_to you will cause bugs like DCing - the player. - - - IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you. - - - When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting - a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done. - - new_mob.key = key - - The Login proc will handle making a new mob for that mobtype (including setting up stuff like mind.name). Simple! - However if you want that mind to have any special properties like being a traitor etc you will have to do that - yourself. - -*/ - -/datum/mind - var/key - var/name //replaces mob/var/original_name - var/mob/living/current - var/active = 0 - - var/memory - - var/assigned_role - var/special_role - var/list/restricted_roles = list() - - var/datum/job/assigned_job - - var/list/datum/objective/objectives = list() - var/list/datum/objective/special_verbs = list() - - var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. - - var/datum/faction/faction //associated faction - var/datum/changeling/changeling //changeling holder - - var/miming = 0 // Mime's vow of silence - var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state - var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD - var/datum/gang/gang_datum //Which gang this mind belongs to, if any - -/datum/mind/New(var/key) - src.key = key - - -/datum/mind/proc/transfer_to(mob/new_character) - if(current) // remove ourself from our old body's mind variable - current.mind = null - SSnano.on_transfer(current, new_character) - - if(key) - if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours - new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. - else - key = new_character.key - - if(new_character.mind) //disassociate any mind currently in our new body's mind variable - new_character.mind.current = null - - var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list - leave_all_huds() //leave all the huds in the old body, so it won't get huds if somebody else enters it - current = new_character //associate ourself with our new body - new_character.mind = src //and associate our new body with ourself - transfer_antag_huds(hud_to_transfer) //inherit the antag HUD - transfer_actions(new_character) - - if(active) - new_character.key = key //now transfer the key to link the client to our new body - -/datum/mind/proc/store_memory(new_text) - memory += "[new_text]
" - -/datum/mind/proc/wipe_memory() - memory = null - - -/* - Removes antag type's references from a mind. - objectives, uplinks, powers etc are all handled. -*/ - -/datum/mind/proc/remove_objectives() - if(objectives.len) - for(var/datum/objective/O in objectives) - objectives -= O - qdel(O) - -/datum/mind/proc/remove_changeling() - if(src in ticker.mode.changelings) - ticker.mode.changelings -= src - current.remove_changeling_powers() - if(changeling) - qdel(changeling) - changeling = null - special_role = null - remove_antag_equip() - -/datum/mind/proc/remove_traitor() - if(src in ticker.mode.traitors) - ticker.mode.traitors -= src - if(isAI(current)) - var/mob/living/silicon/ai/A = current - A.set_zeroth_law("") - A.show_laws() - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - A.malf_picker.remove_verbs(A) - qdel(A.malf_picker) - special_role = null - remove_antag_equip() - -/datum/mind/proc/remove_nukeop() - if(src in ticker.mode.syndicates) - ticker.mode.syndicates -= src - ticker.mode.update_synd_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() - -/datum/mind/proc/remove_wizard() - if(src in ticker.mode.wizards) - ticker.mode.wizards -= src - current.spellremove(current) - special_role = null - remove_antag_equip() - -/datum/mind/proc/remove_cultist() - if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) - special_role = null - -/datum/mind/proc/remove_rev() - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() - - -/datum/mind/proc/remove_gang() - ticker.mode.remove_gangster(src,0,1,1) - remove_objectives() - -/datum/mind/proc/remove_hog_follower_prophet() - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - ticker.mode.blue_deity_prophets -= src - ticker.mode.blue_deity_followers -= src - ticker.mode.update_hog_icons_removed(src, "red") - ticker.mode.update_hog_icons_removed(src, "blue") - - - -/datum/mind/proc/remove_antag_equip() - var/list/Mob_Contents = current.get_contents() - for(var/obj/item/I in Mob_Contents) - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/P = I - P.lock_code = "" - - else if(istype(I, /obj/item/device/radio)) - var/obj/item/device/radio/R = I - R.traitor_frequency = 0 - -/datum/mind/proc/remove_all_antag() //For the Lazy amongst us. - remove_changeling() - remove_traitor() - remove_nukeop() - remove_wizard() - remove_cultist() - remove_rev() - remove_gang() - -/datum/mind/proc/show_memory(mob/recipient, window=1) - if(!recipient) - recipient = current - var/output = "[current.real_name]'s Memories:
" - output += memory - - if(objectives.len) - output += "Objectives:" - var/obj_count = 1 - for(var/datum/objective/objective in objectives) - output += "
Objective #[obj_count++]: [objective.explanation_text]" - - if(window) recipient << browse(output,"window=memory") - else recipient << "[output]" - -/datum/mind/proc/edit_memory() - if(!ticker || !ticker.mode) - alert("Not before round-start!", "Alert") - return - - var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
" - out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" - out += "Assigned role: [assigned_role]. Edit
" - out += "Faction and special role: [special_role]
" - - var/list/sections = list( - "revolution", - "gang", - "cult", - "wizard", - "changeling", - "nuclear", - "traitor", // "traitorchan", - "monkey", - ) - var/text = "" - - if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) - /** REVOLUTION ***/ - text = "revolution" - if (ticker.mode.config_tag=="revolution") - text = uppertext(text) - text = "[text]: " - if (assigned_role in command_positions) - text += "HEAD|loyal|employee|headrev|rev" - else if (src in ticker.mode.head_revolutionaries) - text += "head|loyal|employee|HEADREV|rev" - text += "
Flash: give" - - var/list/L = current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (flash) - if(!flash.crit_fail) - text += "|take." - else - text += "|take|repair." - else - text += "." - - text += " Reequip (gives traitor uplink)." - if (objectives.len==0) - text += "
Objectives are empty! Set to kill all heads." - else if(isloyal(current)) - text += "head|LOYAL|employee|headrev|rev" - else if (src in ticker.mode.revolutionaries) - text += "head|loyal|employee|headrev|REV" - else - text += "head|loyal|EMPLOYEE|headrev|rev" - - if(current && current.client && (ROLE_REV in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["revolution"] = text - - /** GANG ***/ - text = "gang" - if (ticker.mode.config_tag=="gang") - text = uppertext(text) - text = "[text]: " - text += "[isloyal(current) ? "LOYAL" : "loyal"]|" - if(src in ticker.mode.get_all_gangsters()) - text += "none" - else - text += "NONE" - - if(current && current.client && (ROLE_GANG in current.client.prefs.be_special)) - text += "|Enabled in Prefs
" - else - text += "|Disabled in Prefs
" - - for(var/datum/gang/G in ticker.mode.gangs) - text += "[G.name]: " - if(src in (G.gangsters)) - text += "GANGSTER" - else - text += "gangster" - text += "|" - if(src in (G.bosses)) - text += "GANG LEADER" - text += "|Equipment: give" - var/list/L = current.get_contents() - var/obj/item/device/gangtool/gangtool = locate() in L - if (gangtool) - text += "|take" - - else - text += "gang leader" - text += "
" - - if(gang_colors_pool.len) - text += "Create New Gang" - - sections["gang"] = text - - - /** CULT ***/ - text = "cult" - if (ticker.mode.config_tag=="cult") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.cult) - text += "loyal|employee|CULTIST" - text += "
Equip" - - else if(isloyal(current)) - text += "LOYAL|employee|cultist" - else - text += "loyal|EMPLOYEE|cultist" - - if(current && current.client && (ROLE_CULTIST in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["cult"] = text - - /** WIZARD ***/ - text = "wizard" - if (ticker.mode.config_tag=="wizard") - text = uppertext(text) - text = "[text]: " - if ((src in ticker.mode.wizards) || (src in ticker.mode.apprentices)) - text += "YES|no" - text += "
To lair, undress, dress up, let choose name." - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - else - text += "yes|NO" - - if(current && current.client && (ROLE_WIZARD in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["wizard"] = text - - /** CHANGELING ***/ - text = "changeling" - if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan") - text = uppertext(text) - text = "[text]: " - if ((src in ticker.mode.changelings) && special_role) - text += "YES|no" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) ) - text += "
Transform to initial appearance." - else if(src in ticker.mode.changelings) //Station Aligned Changeling - text += "YES (but not an antag)|no" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) ) - text += "
Transform to initial appearance." - else - text += "yes|NO" -// var/datum/game_mode/changeling/changeling = ticker.mode -// if (istype(changeling) && changeling.changelingdeath) -// text += "
All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds." - - if(current && current.client && (ROLE_CHANGELING in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["changeling"] = text - - /** NUCLEAR ***/ - text = "nuclear" - if (ticker.mode.config_tag=="nuclear") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.syndicates) - text += "OPERATIVE|nanotrasen" - text += "
To shuttle, undress, dress up." - var/code - for (var/obj/machinery/nuclearbomb/bombue in machines) - if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") - code = bombue.r_code - break - if (code) - text += " Code is [code]. tell the code." - else - text += "operative|NANOTRASEN" - - if(current && current.client && (ROLE_OPERATIVE in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["nuclear"] = text - - /** TRAITOR ***/ - text = "traitor" - if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.traitors) - text += "TRAITOR|loyal" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - else - text += "traitor|LOYAL" - - if(current && current.client && (ROLE_TRAITOR in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["traitor"] = text - - /** SHADOWLING **/ - text = "shadowling" - if(ticker.mode.config_tag == "shadowling") - text = uppertext(text) - text = "[text]: " - if(src in ticker.mode.shadows) - text += "SHADOWLING|thrall|human" - else if(src in ticker.mode.thralls) - text += "shadowling|THRALL|human" - else - text += "shadowling|thrall|HUMAN" - - if(current && current.client && (ROLE_SHADOWLING in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["shadowling"] = text - - /** Abductors **/ - - text = "Abductor" - if(ticker.mode.config_tag == "abductor") - text = uppertext(text) - text = "[text]: " - if(src in ticker.mode.abductors) - text += "Abductor|human" - text += "|undress|equip" - else - text += "Abductor|human" - - if(current && current.client && (ROLE_ABDUCTOR in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["abductor"] = text - - /** HAND OF GOD **/ - text = "hand of god" - if(ticker.mode.config_tag == "handofgod") - text = uppertext(text) - text = "[text]: " - if(src in ticker.mode.red_deity_prophets) - text += "RED PROPHET|red follower|employee|blue follower|blue prophet|red god|blue god" - else if (src in ticker.mode.red_deity_followers) - text += "red prophet|RED FOLLOWER|employee|blue follower|blue prophet|red god|blue god" - else if (src in ticker.mode.blue_deity_followers) - text += "red prophet|red follower|employee|BLUE FOLLOWER|blue prophet|red god|blue god" - else if (src in ticker.mode.blue_deity_prophets) - text += "red prophet|red follower|employee|blue follower|BLUE PROPHET|red god|blue god" - else if (src in ticker.mode.red_deities) - text += "red prophet|red follower|employee|blue follower|blue prophet|RED GOD|blue god" - else if (src in ticker.mode.blue_deities) - text += "red prophet|red follower|employee|blue follower|blue prophet|red god|BLUE GOD" - else - text += "red prophet|red follower|EMPLOYEE|blue follower|blue prophet|red god|blue god" - - if(current && current.client && (ROLE_HOG_GOD in current.client.prefs.be_special)) - text += "|HOG God Enabled in Prefs" - else - text += "|HOG God Disabled in Prefs" - - if(current && current.client && (ROLE_HOG_CULTIST in current.client.prefs.be_special)) - text += "|HOG Cultist Enabled in Prefs" - else - text += "|HOG Disabled in Prefs" - - sections["follower"] = text - - /** MONKEY ***/ - if (istype(current, /mob/living/carbon)) - text = "monkey" - if (ticker.mode.config_tag=="monkey") - text = uppertext(text) - text = "[text]: " - if (istype(current, /mob/living/carbon/human)) - text += "healthy|infected|HUMAN|other" - else if (istype(current, /mob/living/carbon/monkey)) - var/found = 0 - for(var/datum/disease/D in current.viruses) - if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 - - if(found) - text += "healthy|INFECTED|human|other" - else - text += "HEALTHY|infected|human|other" - - else - text += "healthy|infected|human|OTHER" - - if(current && current.client && (ROLE_MONKEY in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["monkey"] = text - - - /** SILICON ***/ - - if (istype(current, /mob/living/silicon)) - text = "silicon" - var/mob/living/silicon/robot/robot = current - if (istype(robot) && robot.emagged) - text += "
Cyborg: Is emagged! Unemag!
0th law: [robot.laws.zeroth]" - var/mob/living/silicon/ai/ai = current - if (istype(ai) && ai.connected_robots.len) - var/n_e_robots = 0 - for (var/mob/living/silicon/robot/R in ai.connected_robots) - if (R.emagged) - n_e_robots++ - text += "
[n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" - if (ticker.mode.config_tag == "traitorchan") - if (sections["traitor"]) - out += sections["traitor"]+"
" - if (sections["changeling"]) - out += sections["changeling"]+"

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

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

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

" - - out += "Announce objectives

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

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

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

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

" + + out += "Announce objectives

" + + usr << browse(out, "window=edit_memory[src];size=500x600") + + + +/datum/mind/Topic(href, href_list) + if(!check_rights(R_ADMIN)) + return + + if (href_list["role_edit"]) + var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() + if (!new_role) + return + assigned_role = new_role + + else if (href_list["memory_edit"]) + var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) + if (isnull(new_memo)) + return + memory = new_memo + + else if (href_list["obj_edit"] || href_list["obj_add"]) + var/datum/objective/objective + var/objective_pos + var/def_value + + if (href_list["obj_edit"]) + objective = locate(href_list["obj_edit"]) + if (!objective) + return //sanity + def_value = objective.type + + var/datum/objective/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in (typesof(/datum/objective) - list(/datum/objective, /datum/objective/default, /datum/objective/escape_obj, /datum/objective/changeling_team_objective)) //keep out the abstract ones + if (!new_obj_type) + return + if (initial(new_obj_type.required_role) != special_role && initial(new_obj_type.required_role) != null) + if(alert("The objective requires a special_role that this mind does not have. The player may not be able to complete the objective. Are you sure you want to continue?","uh oh" ,"Yes", "No") == "No") + return + + var/datum/objective/new_objective = add_objective(src, new_obj_type) + + if (istype(new_objective, /datum/objective/custom)) //it's lame I know but this type is snowflaky by its very nature + var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") + if (!expl) + expl = "Free objective" + new_objective.explanation_text = expl + + if (!new_objective) + usr << initial(new_obj_type.error_text) + return + + if (objective) + objectives -= objective + objectives.Insert(objective_pos, new_objective) + message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") + log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") + else + message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") + log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") + + else if (href_list["obj_delete"]) + var/datum/objective/objective = locate(href_list["obj_delete"]) + if(!istype(objective)) + return + objectives -= objective + message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") + log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") + + else if(href_list["obj_completed"]) + var/datum/objective/objective = locate(href_list["obj_completed"]) + if(!istype(objective)) + return + objective.completed = !objective.completed + log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + else if (href_list["handofgod"]) + switch(href_list["handofgod"]) + if("clear") //wipe handofgod status + if((src in ticker.mode.red_deity_followers) || (src in ticker.mode.blue_deity_followers) || (src in ticker.mode.red_deity_prophets) || (src in ticker.mode.blue_deity_prophets)) + remove_hog_follower_prophet() + current << "You have been brainwashed... again! Your faith is no more!" + message_admins("[key_name_admin(usr)] has de-hand of god'ed [current].") + log_admin("[key_name(usr)] has de-hand of god'ed [current].") + + if("red follower") + make_Handofgod_follower("red") + message_admins("[key_name_admin(usr)] has red follower'ed [current].") + log_admin("[key_name(usr)] has red follower'ed [current].") + + if("red prophet") + make_Handofgod_prophet("red") + message_admins("[key_name_admin(usr)] has red prophet'ed [current].") + log_admin("[key_name(usr)] has red prophet'ed [current].") + + if("blue follower") + make_Handofgod_follower("blue") + message_admins("[key_name_admin(usr)] has blue follower'ed [current].") + log_admin("[key_name(usr)] has blue follower'ed [current].") + + if("blue prophet") + make_Handofgod_prophet("blue") + message_admins("[key_name_admin(usr)] has blue prophet'ed [current].") + log_admin("[key_name(usr)] has blue prophet'ed [current].") + + if("red god") + make_Handofgod_god("red") + message_admins("[key_name_admin(usr)] has red god'ed [current].") + log_admin("[key_name(usr)] has red god'ed [current].") + + if("blue god") + make_Handofgod_god("blue") + message_admins("[key_name_admin(usr)] has blue god'ed [current].") + log_admin("[key_name(usr)] has blue god'ed [current].") + + else if (href_list["revolution"]) + switch(href_list["revolution"]) + if("clear") + remove_rev() + current << "You have been brainwashed! You are no longer a revolutionary!" + message_admins("[key_name_admin(usr)] has de-rev'ed [current].") + log_admin("[key_name(usr)] has de-rev'ed [current].") + if("rev") + if(src in ticker.mode.head_revolutionaries) + ticker.mode.head_revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + current << "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" + else if(!(src in ticker.mode.revolutionaries)) + current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" + else + return + ticker.mode.revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Revolutionary" + message_admins("[key_name_admin(usr)] has rev'ed [current].") + log_admin("[key_name(usr)] has rev'ed [current].") + + if("headrev") + if(src in ticker.mode.revolutionaries) + ticker.mode.revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + current << "You have proved your devotion to revoltion! Yea are a head revolutionary now!" + else if(!(src in ticker.mode.head_revolutionaries)) + current << "You are a member of the revolutionaries' leadership now!" + else + return + if (ticker.mode.head_revolutionaries.len>0) + // copy targets + var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + if (valid_head) + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new + rev_obj.owner = src + rev_obj.target = O.target + rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." + objectives += rev_obj + ticker.mode.greet_revolutionary(src,0) + ticker.mode.head_revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Head Revolutionary" + message_admins("[key_name_admin(usr)] has head-rev'ed [current].") + log_admin("[key_name(usr)] has head-rev'ed [current].") + + if("autoobjectives") + ticker.mode.forge_revolutionary_objectives(src) + ticker.mode.greet_revolutionary(src,0) + usr << "The objectives for revolution have been generated and shown to [key]" + + if("flash") + if (!ticker.mode.equip_revolutionary(current)) + usr << "Spawning flash failed!" + + if("takeflash") + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + if (!flash) + usr << "Deleting flash failed!" + qdel(flash) + + if("repairflash") + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + if (!flash) + usr << "Repairing flash failed!" + else + flash.crit_fail = 0 + flash.update_icon() + + + +//////////////////// GANG MODE + + else if (href_list["gang"]) + switch(href_list["gang"]) + if("clear") + remove_gang() + message_admins("[key_name_admin(usr)] has de-gang'ed [current].") + log_admin("[key_name(usr)] has de-gang'ed [current].") + + if("equip") + switch(ticker.mode.equip_gang(current,gang_datum)) + if(1) + usr << "Unable to equip territory spraycan!" + if(2) + usr << "Unable to equip recruitment pen and spraycan!" + if(3) + usr << "Unable to equip gangtool, pen, and spraycan!" + + if("takeequip") + var/list/L = current.get_contents() + for(var/obj/item/weapon/pen/gang/pen in L) + qdel(pen) + for(var/obj/item/device/gangtool/gangtool in L) + qdel(gangtool) + for(var/obj/item/toy/crayon/spraycan/gang/SC in L) + qdel(SC) + + if("new") + if(gang_colors_pool.len) + var/list/names = list("Random") + gang_name_pool + var/gangname = input("Pick a gang name.","Select Name") as null|anything in names + if(gangname && gang_colors_pool.len) //Check again just in case another admin made max gangs at the same time + if(!(gangname in gang_name_pool)) + gangname = null + var/datum/gang/newgang = new(null,gangname) + ticker.mode.gangs += newgang + message_admins("[key_name_admin(usr)] has created the [newgang.name] Gang.") + log_admin("[key_name(usr)] has created the [newgang.name] Gang.") + + else if (href_list["gangboss"]) + var/datum/gang/G = locate(href_list["gangboss"]) in ticker.mode.gangs + if(!G || (src in G.bosses)) + return + ticker.mode.remove_gangster(src,0,2,1) + G.bosses += src + gang_datum = G + special_role = "[G.name] Gang Boss" + G.add_gang_hud(src) + current << "You are a [G.name] Gang Boss!" + message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang leadership.") + log_admin("[key_name(usr)] has added [current] to the [G.name] Gang leadership.") + ticker.mode.forge_gang_objectives(src) + ticker.mode.greet_gang(src,0) + + else if (href_list["gangster"]) + var/datum/gang/G = locate(href_list["gangster"]) in ticker.mode.gangs + if(!G || (src in G.gangsters)) + return + ticker.mode.remove_gangster(src,0,2,1) + ticker.mode.add_gangster(src,G,0) + message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang (A).") + log_admin("[key_name(usr)] has added [current] to the [G.name] Gang (A).") + +///////////////////////////////// + + + + else if (href_list["cult"]) + switch(href_list["cult"]) + if("clear") + remove_cultist() + current << "You have been brainwashed! You are no longer a cultist!" + message_admins("[key_name_admin(usr)] has de-cult'ed [current].") + log_admin("[key_name(usr)] has de-cult'ed [current].") + if("cultist") + if(!(src in ticker.mode.cult)) + ticker.mode.add_cultist(src) + message_admins("[key_name_admin(usr)] has cult'ed [current].") + log_admin("[key_name(usr)] has cult'ed [current].") + + if("equip") + if (!ticker.mode.equip_cultist(current)) + usr << "equip_cultist() failed! [current]'s starting equipment will be incomplete." + + else if (href_list["wizard"]) + switch(href_list["wizard"]) + if("clear") + remove_wizard() + current << "You have been brainwashed! You are no longer a wizard!" + log_admin("[key_name(usr)] has de-wizard'ed [current].") + if("wizard") + if(!(src in ticker.mode.wizards)) + ticker.mode.wizards += src + special_role = "Wizard" + //ticker.mode.learn_basic_spells(current) + current << "You are the Space Wizard!" + message_admins("[key_name_admin(usr)] has wizard'ed [current].") + log_admin("[key_name(usr)] has wizard'ed [current].") + if("lair") + current.loc = pick(wizardstart) + if("dressup") + ticker.mode.equip_wizard(current) + if("name") + ticker.mode.name_wizard(current) + if("autoobjectives") + ticker.mode.forge_wizard_objectives(src) + usr << "The objectives for wizard [key] have been generated. You can edit them and anounce manually." + + else if (href_list["changeling"]) + switch(href_list["changeling"]) + if("clear") + remove_changeling() + current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" + message_admins("[key_name_admin(usr)] has de-changeling'ed [current].") + log_admin("[key_name(usr)] has de-changeling'ed [current].") + if("changeling") + if(!(src in ticker.mode.changelings)) + ticker.mode.changelings += src + current.make_changeling() + special_role = "Changeling" + current << "Your powers are awoken. A flash of memory returns to us...we are [changeling.changelingID], a changeling!" + message_admins("[key_name_admin(usr)] has changeling'ed [current].") + log_admin("[key_name(usr)] has changeling'ed [current].") + if("autoobjectives") + ticker.mode.forge_changeling_objectives(src) + usr << "The objectives for changeling [key] have been generated. You can edit them and anounce manually." + + if("initialdna") + if( !changeling || !changeling.stored_profiles.len || !istype(current, /mob/living/carbon)) + usr << "Resetting DNA failed!" + else + var/mob/living/carbon/C = current + changeling.first_prof.dna.transfer_identity(C, transfer_SE=1) + C.real_name = changeling.first_prof.name + C.updateappearance(mutcolor_update=1) + C.domutcheck() + + else if (href_list["nuclear"]) + switch(href_list["nuclear"]) + if("clear") + remove_nukeop() + current << "You have been brainwashed! You are no longer a syndicate operative!" + message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") + log_admin("[key_name(usr)] has de-nuke op'ed [current].") + if("nuclear") + if(!(src in ticker.mode.syndicates)) + ticker.mode.syndicates += src + ticker.mode.update_synd_icons_added(src) + if (ticker.mode.syndicates.len==1) + ticker.mode.prepare_syndicate_leader(src) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + special_role = "Syndicate" + assigned_role = "Syndicate" + current << "You are a [syndicate_name()] agent!" + ticker.mode.forge_syndicate_objectives(src) + ticker.mode.greet_syndicate(src) + message_admins("[key_name_admin(usr)] has nuke op'ed [current].") + log_admin("[key_name(usr)] has nuke op'ed [current].") + if("lair") + current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + if("dressup") + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + if (!ticker.mode.equip_syndicate(current)) + usr << "Equipping a syndicate failed!" + if("tellcode") + var/code + for (var/obj/machinery/nuclearbomb/bombue in machines) + if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") + code = bombue.r_code + break + if (code) + store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) + current << "The nuclear authorization code is: [code]" + else + usr << "No valid nuke found!" + + else if (href_list["traitor"]) + switch(href_list["traitor"]) + if("clear") + remove_traitor() + current << "You have been brainwashed! You are no longer a traitor!" + message_admins("[key_name_admin(usr)] has de-traitor'ed [current].") + log_admin("[key_name(usr)] has de-traitor'ed [current].") + + if("traitor") + if(!(src in ticker.mode.traitors)) + ticker.mode.traitors += src + special_role = "traitor" + current << "You are a traitor!" + message_admins("[key_name_admin(usr)] has traitor'ed [current].") + log_admin("[key_name(usr)] has traitor'ed [current].") + if(isAI(current)) + var/mob/living/silicon/ai/A = current + ticker.mode.add_law_zero(A) + A.show_laws() + + if("autoobjectives") + ticker.mode.forge_traitor_objectives(src) + usr << "The objectives for traitor [key] have been generated. You can edit them and anounce manually." + + else if(href_list["shadowling"]) + switch(href_list["shadowling"]) + if("clear") + ticker.mode.update_shadow_icons_removed(src) + if(src in ticker.mode.shadows) + ticker.mode.shadows -= src + special_role = null + current << "Your powers have been quenched! You are no longer a shadowling!" + remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hatch) + remove_spell(/obj/effect/proc_holder/spell/self/shadowling_ascend) + remove_spell(/obj/effect/proc_holder/spell/targeted/enthrall) + remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hivemind) + message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") + log_admin("[key_name(usr)] has de-shadowling'ed [current].") + else if(src in ticker.mode.thralls) + ticker.mode.remove_thrall(src,0) + message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") + log_admin("[key_name(usr)] has de-thrall'ed [current].") + if("shadowling") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.shadows += src + special_role = "shadowling" + current << "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ + time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ + " + ticker.mode.finalize_shadowling(src) + ticker.mode.update_shadow_icons_added(src) + if("thrall") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.add_thrall(src) + message_admins("[key_name_admin(usr)] has thrall'ed [current].") + log_admin("[key_name(usr)] has thrall'ed [current].") + + else if(href_list["abductor"]) + switch(href_list["abductor"]) + if("clear") + usr << "Not implemented yet. Sorry!" + if("abductor") + if(!ishuman(current)) + usr << "This only works on humans!" + return + make_Abductor() + log_admin("[key_name(usr)] turned [current] into abductor.") + if("equip") + var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") + if(gear) + var/datum/game_mode/abduction/temp = new + temp.equip_common(current) + if(gear=="Agent") + temp.equip_agent(current) + else + temp.equip_scientist(current) + + else if (href_list["monkey"]) + var/mob/living/L = current + if (L.notransform) + return + switch(href_list["monkey"]) + if("healthy") + if (check_rights(R_ADMIN)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(H)) + log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") + src = null + M = H.monkeyize() + src = M.mind + //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!" + else if (istype(M) && length(M.viruses)) + for(var/datum/disease/D in M.viruses) + D.cure(0) + sleep(0) //because deleting of virus is done through spawn(0) + if("infected") + if (check_rights(R_ADMIN, 0)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(H)) + log_admin("[key_name(usr)] attempting to monkeyize and infect [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to monkeyize and infect [key_name_admin(current)]") + src = null + M = H.monkeyize() + src = M.mind + current.ForceContractDisease(new /datum/disease/transformation/jungle_fever) + else if (istype(M)) + current.ForceContractDisease(new /datum/disease/transformation/jungle_fever) + if("human") + if (check_rights(R_ADMIN, 0)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(M)) + for(var/datum/disease/D in M.viruses) + if (istype(D,/datum/disease/transformation/jungle_fever)) + D.cure(0) + sleep(0) //because deleting of virus is doing throught spawn(0) + log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") + H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + if(H) + src = H.mind + + else if (href_list["silicon"]) + switch(href_list["silicon"]) + + if("unemag") + var/mob/living/silicon/robot/R = current + if (istype(R)) + R.SetEmagged(0) + message_admins("[key_name_admin(usr)] has unemag'ed [R].") + log_admin("[key_name(usr)] has unemag'ed [R].") + + if("unemagcyborgs") + if (istype(current, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = current + for (var/mob/living/silicon/robot/R in ai.connected_robots) + R.SetEmagged(0) + message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.") + log_admin("[key_name(usr)] has unemag'ed [ai]'s Cyborgs.") + + else if (href_list["common"]) + switch(href_list["common"]) + if("undress") + for(var/obj/item/W in current) + current.unEquip(W, 1) //The 1 forces all items to drop, since this is an admin undress. + if("takeuplink") + take_uplink() + memory = null//Remove any memory they may have had. + log_admin("[key_name(usr)] removed [current]'s uplink.") + if("crystals") + if (check_rights(R_FUN, 0)) + var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() + var/crystals + if (suplink) + crystals = suplink.uses + crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num + if (!isnull(crystals)) + if (suplink) + suplink.uses = crystals + message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].") + log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") + if("uplink") + if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) + usr << "Equipping a syndicate failed!" + log_admin("[key_name(usr)] attempted to give [current] an uplink.") + + else if (href_list["obj_announce"]) + var/obj_count = 1 + current << "Your current objectives:" + for(var/datum/objective/objective in objectives) + current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + edit_memory() + +/datum/mind/proc/find_syndicate_uplink() + var/list/L = current.get_contents() + for (var/obj/item/I in L) + if (I.hidden_uplink) + return I.hidden_uplink + return null + +/datum/mind/proc/take_uplink() + var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() + if(H) + qdel(H) + +/datum/mind/proc/make_Traitor() + if(!(src in ticker.mode.traitors)) + ticker.mode.traitors += src + special_role = "traitor" + ticker.mode.forge_traitor_objectives(src) + ticker.mode.finalize_traitor(src) + ticker.mode.greet_traitor(src) + +/datum/mind/proc/make_Nuke(turf/spawnloc,nuke_code,leader=0, telecrystals = TRUE) + if(!(src in ticker.mode.syndicates)) + ticker.mode.syndicates += src + ticker.mode.update_synd_icons_added(src) + special_role = "Syndicate" + ticker.mode.forge_syndicate_objectives(src) + ticker.mode.greet_syndicate(src) + + current.loc = spawnloc + + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + ticker.mode.equip_syndicate(current, telecrystals) + + if (nuke_code) + store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + current << "The nuclear authorization code is: [nuke_code]" + + if (leader) + ticker.mode.prepare_syndicate_leader(src,nuke_code) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + +/datum/mind/proc/make_Changling() + if(!(src in ticker.mode.changelings)) + ticker.mode.changelings += src + current.make_changeling() + special_role = "Changeling" + ticker.mode.forge_changeling_objectives(src) + ticker.mode.greet_changeling(src) + +/datum/mind/proc/make_Wizard() + if(!(src in ticker.mode.wizards)) + ticker.mode.wizards += src + special_role = "Wizard" + assigned_role = "Wizard" + //ticker.mode.learn_basic_spells(current) + if(!wizardstart.len) + current.loc = pick(latejoin) + current << "HOT INSERTION, GO GO GO" + else + current.loc = pick(wizardstart) + + ticker.mode.equip_wizard(current) + for(var/obj/item/weapon/spellbook/S in current.contents) + S.op = 0 + ticker.mode.name_wizard(current) + ticker.mode.forge_wizard_objectives(src) + ticker.mode.greet_wizard(src) + + +/datum/mind/proc/make_Cultist() + if(!(src in ticker.mode.cult)) + ticker.mode.cult += src + ticker.mode.update_cult_icons_added(src) + special_role = "Cultist" + current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." + current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices." + ticker.mode.equip_cultist(current) + +/datum/mind/proc/make_Rev() + if (ticker.mode.head_revolutionaries.len>0) + // copy targets + var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + if (valid_head) + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new + rev_obj.owner = src + rev_obj.target = O.target + rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." + objectives += rev_obj + ticker.mode.greet_revolutionary(src,0) + ticker.mode.head_revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Head Revolutionary" + + ticker.mode.forge_revolutionary_objectives(src) + ticker.mode.greet_revolutionary(src,0) + + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + qdel(flash) + take_uplink() + var/fail = 0 +// fail |= !ticker.mode.equip_traitor(current, 1) + fail |= !ticker.mode.equip_revolutionary(current) + + +/datum/mind/proc/make_Gang(datum/gang/G) + special_role = "[G.name] Gang Boss" + G.bosses += src + gang_datum = G + G.add_gang_hud(src) + ticker.mode.forge_gang_objectives(src) + ticker.mode.greet_gang(src) + ticker.mode.equip_gang(current,G) + +/datum/mind/proc/make_Abductor() + var/role = alert("Abductor Role ?","Role","Agent","Scientist") + var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) + var/teleport = alert("Teleport to ship ?","Teleport","Yes","No") + + if(!role || !team || !teleport) + return + + if(!ishuman(current)) + return + + ticker.mode.abductors |= src + + var/datum/objective/experiment/O = new + O.owner = src + objectives += O + + var/mob/living/carbon/human/H = current + + H.set_species(/datum/species/abductor) + var/datum/species/abductor/S = H.dna.species + + switch(role) + if("Agent") + S.agent = 1 + if("Scientist") + S.scientist = 1 + S.team = team + + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = 4 + scientist_landmarks.len = 4 + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/obj/effect/landmark/L + if(teleport=="Yes") + switch(role) + if("Agent") + S.agent = 1 + L = agent_landmarks[team] + H.loc = L.loc + if("Scientist") + S.scientist = 1 + L = agent_landmarks[team] + H.loc = L.loc + + +/datum/mind/proc/make_Handofgod_follower(colour) + . = 0 + switch(colour) + if("red") + //Remove old allegiances + if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) + current << "You are no longer a member of the Blue cult!" + + ticker.mode.blue_deity_followers -= src + ticker.mode.blue_deity_prophets -= src + current.faction |= "red god" + current.faction -= "blue god" + + if(src in ticker.mode.red_deity_prophets) + current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" + ticker.mode.red_deity_prophets -= src + + ticker.mode.red_deity_followers |= src + current << "You are now a follower of the red cult's god!" + + special_role = "Hand of God: Red Follower" + . = 1 + if("blue") + //Remove old allegiances + if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) + current << "You are no longer a member of the Red cult!" + + ticker.mode.red_deity_followers -= src + ticker.mode.red_deity_prophets -= src + current.faction -= "red god" + current.faction |= "blue god" + + if(src in ticker.mode.blue_deity_prophets) + current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" + ticker.mode.blue_deity_prophets -= src + + ticker.mode.blue_deity_followers |= src + current << "You are now a follower of the blue cult's god!" + + special_role = "Hand of God: Blue Follower" + . = 1 + else + return 0 + + ticker.mode.update_hog_icons_removed(src,"red") + ticker.mode.update_hog_icons_removed(src,"blue") + //ticker.mode.greet_hog_follower(src,colour) + ticker.mode.update_hog_icons_added(src, colour) + +/datum/mind/proc/make_Handofgod_prophet(colour) + . = 0 + switch(colour) + if("red") + //Remove old allegiances + + if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) + current << "You are no longer a member of the Blue cult!" + current.faction -= "blue god" + current.faction |= "red god" + + ticker.mode.blue_deity_followers -= src + ticker.mode.blue_deity_prophets -= src + ticker.mode.red_deity_followers -= src + + ticker.mode.red_deity_prophets |= src + current << "You are now a prophet of the red cult's god!" + + special_role = "Hand of God: Red Prophet" + . = 1 + if("blue") + //Remove old allegiances + + if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) + current << "You are no longer a member of the Red cult!" + current.faction -= "red god" + current.faction |= "blue god" + + ticker.mode.red_deity_followers -= src + ticker.mode.red_deity_prophets -= src + ticker.mode.blue_deity_followers -= src + + ticker.mode.blue_deity_prophets |= src + current << "You are now a prophet of the blue cult's god!" + + special_role = "Hand of God: Blue Prophet" + . = 1 + + else + return 0 + + ticker.mode.update_hog_icons_removed(src,"red") + ticker.mode.update_hog_icons_removed(src,"blue") + ticker.mode.greet_hog_follower(src,colour) + ticker.mode.update_hog_icons_added(src, colour) + + +/datum/mind/proc/make_Handofgod_god(colour) + switch(colour) + if("red") + current.become_god("red") + ticker.mode.add_god(src,"red") + if("blue") + current.become_god("blue") + ticker.mode.add_god(src,"blue") + else + return 0 + ticker.mode.forge_deity_objectives(src) + ticker.mode.remove_hog_follower(src,0) + ticker.mode.update_hog_icons_added(src, colour) +// ticker.mode.greet_hog_follower(src,colour) + return 1 + + +/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/spell) + spell_list += spell + if(!spell.action) + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + spell.action.Grant(current) + return +/datum/mind/proc/transfer_actions(mob/living/new_character) + if(current && current.actions) + for(var/datum/action/A in current.actions) + A.Grant(new_character) + transfer_mindbound_actions(new_character) + +/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) + for(var/obj/effect/proc_holder/spell/spell in spell_list) + if(!spell.action) // Unlikely but whatever + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + spell.action.Grant(new_character) + return + +/mob/proc/sync_mind() + mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) + mind.active = 1 //indicates that the mind is currently synced with a client + +/mob/new_player/sync_mind() + return + +/mob/dead/observer/sync_mind() + return + +//Initialisation procs +/mob/proc/mind_initialize() + if(mind) + mind.key = key + + else + mind = new /datum/mind(key) + if(ticker) + ticker.minds += mind + else + spawn(0) + throw EXCEPTION("mind_initialize(): No ticker ready") + if(!mind.name) mind.name = real_name + mind.current = src + +//HUMAN +/mob/living/carbon/human/mind_initialize() + ..() + if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt + +//MONKEY +/mob/living/carbon/monkey/mind_initialize() + ..() + +//slime +/mob/living/simple_animal/slime/mind_initialize() + ..() + mind.special_role = "slime" + mind.assigned_role = "slime" + +//XENO +/mob/living/carbon/alien/mind_initialize() + ..() + mind.special_role = "Alien" + mind.assigned_role = "Alien" + //XENO HUMANOID +/mob/living/carbon/alien/humanoid/royal/queen/mind_initialize() + ..() + mind.special_role = "Queen" + +/mob/living/carbon/alien/humanoid/royal/praetorian/mind_initialize() + ..() + mind.special_role = "Praetorian" + +/mob/living/carbon/alien/humanoid/hunter/mind_initialize() + ..() + mind.special_role = "Hunter" + +/mob/living/carbon/alien/humanoid/drone/mind_initialize() + ..() + mind.special_role = "Drone" + +/mob/living/carbon/alien/humanoid/sentinel/mind_initialize() + ..() + mind.special_role = "Sentinel" + //XENO LARVA +/mob/living/carbon/alien/larva/mind_initialize() + ..() + mind.special_role = "Larva" + +//AI +/mob/living/silicon/ai/mind_initialize() + ..() + mind.assigned_role = "AI" + +//BORG +/mob/living/silicon/robot/mind_initialize() + ..() + mind.assigned_role = "Cyborg" + +//PAI +/mob/living/silicon/pai/mind_initialize() + ..() + mind.assigned_role = "pAI" + mind.special_role = "" + +//BLOB +/mob/camera/blob/mind_initialize() + ..() + mind.special_role = "Blob" + +//Animals +/mob/living/simple_animal/mind_initialize() + ..() + mind.assigned_role = "Animal" + mind.special_role = "Animal" + +/mob/living/simple_animal/pet/dog/corgi/mind_initialize() + ..() + mind.assigned_role = "Corgi" + mind.special_role = "Corgi" + +/mob/living/simple_animal/shade/mind_initialize() + ..() + mind.assigned_role = "Shade" + mind.special_role = "Shade" + +/mob/living/simple_animal/hostile/construct/mind_initialize() + ..() + mind.assigned_role = "[initial(name)]" mind.special_role = "Cultist" - diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm new file mode 100644 index 00000000000..5a4fd485527 --- /dev/null +++ b/code/datums/progressbar.dm @@ -0,0 +1,41 @@ +/datum/progressbar + var/goal = 1 + var/image/bar + var/shown = 0 + var/mob/user + var/client/client + +/datum/progressbar/New(mob/User, goal_number, atom/target) + . = ..() + if (!istype(target)) + EXCEPTION("Invalid target given") + if (goal_number) + goal = goal_number + bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0") + bar.pixel_y = 32 + user = User + if (user) + client = user.client + +/datum/progressbar/proc/update(progress) + //world << "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]" + if (!user || !user.client) + shown = 0 + return + if (user.client != client) + if (client) + client.images -= bar + if (user.client) + user.client.images += bar + + progress = Clamp(progress, 0, goal) + bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" + if (!shown) + user.client.images += bar + shown = 1 + +/datum/progressbar/Destroy() + if (client) + client.images -= bar + qdel(bar) + . = ..() diff --git a/code/datums/spells/infinite_guns.dm b/code/datums/spells/infinite_guns.dm new file mode 100644 index 00000000000..e74ac7af043 --- /dev/null +++ b/code/datums/spells/infinite_guns.dm @@ -0,0 +1,22 @@ +/obj/effect/proc_holder/spell/targeted/infinite_guns + name = "Lesser Summon Guns" + desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use." + invocation_type = "none" + include_user = 1 + range = -1 + + school = "conjuration" + charge_max = 300 + clothes_req = 1 + cooldown_min = 10 //Gun wizard + action_icon_state = "bolt_action" + + + +/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) + for(var/mob/living/carbon/C in targets) + C.drop_item() + C.swap_hand() + C.drop_item() + var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new + C.put_in_hands(GUN) diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index 233016531cc..1bc6b2429f8 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -28,7 +28,7 @@ halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) playsound(get_turf(user), Snd, 50, 0) - if(do_mob(user,user,100,uninterruptible=1)) + if(do_mob(user,user,100,1)) if(ready && cast_check(skipcharge=1)) choose_targets() else diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 7b708036cfb..057753ab04e 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -285,6 +285,21 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 15 containername = "tactical armor crate" +/datum/supply_packs/security/armory/swat + name = "SWAT gear crate" + contains = list(/obj/item/clothing/head/helmet/swat/nanotrasen, + /obj/item/clothing/head/helmet/swat/nanotrasen, + /obj/item/clothing/suit/space/swat, + /obj/item/clothing/suit/space/swat, + /obj/item/weapon/kitchen/knife/combat, + /obj/item/weapon/kitchen/knife/combat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/weapon/storage/belt/military/assault, + /obj/item/weapon/storage/belt/military/assault) + cost = 60 + containername = "assault armor crate" + /datum/supply_packs/security/armory/laserarmor name = "Reflector Vest Crate" contains = list(/obj/item/clothing/suit/armor/laserproof, @@ -547,9 +562,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/engineering/engine/spacesuit name = "Space Suit Crate" contains = list(/obj/item/clothing/suit/space, + /obj/item/clothing/suit/space, /obj/item/clothing/head/helmet/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath,) - cost = 80 + cost = 30 containertype = /obj/structure/closet/crate/secure containername = "space suit crate" access = access_eva diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 42fa4018f68..b79afa72ee4 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -81,7 +81,7 @@ var/list/uplink_items = list() return 0 // If the uplink's holder is in the user's contents - if ((U.loc in user.contents || (in_range(U.loc, user) && istype(U.loc.loc, /turf)))) + if ((U.loc in user.contents) || (in_range(U.loc, user) && istype(U.loc.loc, /turf))) user.set_machine(U) if(cost > U.uses) return 0 @@ -292,6 +292,14 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) surplus = 0 +/datum/uplink_item/stealthy_weapons/operator_virus_grenade + name = "Fungal Tuberculosis grenade" + desc = "A primed bio-grenade packed into a compact box. Comes with five Bio Virus Antidote Kit (BVAK) autoinjectors for rapid application on up to two targets each, a syringe, and a bottle containing the BVAK solution." + item = /obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade + cost = 12 + surplus = 35 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/dangerous/gygax name = "Gygax Exosuit" desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \ @@ -549,6 +557,14 @@ var/list/uplink_items = list() cost = 1 surplus = 50 +/datum/uplink_item/stealthy_weapons/traitor_virus_kit + name = "Virus Kit" + desc = "An active fungal pathogen in a sterile, compact box. Comes with one Bio Virus Antidote Kit (BVAK) autoinjector for rapid application on up to two targets each, a syringe, and a bottle containing the BVAK solution." + item = /obj/item/weapon/storage/box/syndie_kit/tuberculosiskit + cost = 20 //because nobody knows jack shit about virology + surplus = 50 + excludefrom = list(/datum/game_mode/nuclear) + /datum/uplink_item/stealthy_weapons/traitor_chem_bottle name = "Poison Kit" desc = "An assortment of deadly chemicals packed into a compact box. Comes with a syringe for more precise application." @@ -760,7 +776,7 @@ var/list/uplink_items = list() They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. \ Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." //THEN WHY CANT THEY SEE PLASMA FIRES???? item = /obj/item/clothing/glasses/thermal/syndi - cost = 6 + cost = 4 /datum/uplink_item/device_tools/binary name = "Binary Translator Key" diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 6cce1a297a7..d61bb3607e1 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -92,14 +92,13 @@ M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." equip_antag(M) + var/mob/living/carbon/human/H = usr var/wizard_name_first = pick(wizard_first) var/wizard_name_second = pick(wizard_second) var/randomname = "[wizard_name_first] [wizard_name_second]" - var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.owner = M:mind - new_objective:target = usr:mind - new_objective.explanation_text = "Protect [usr.real_name], the wizard." - M.mind.objectives += new_objective + var/datum/objective/default/protect/new_objective = add_objective(M.mind, /datum/objective/default/protect) + new_objective.target = H.mind + new_objective.explanation_text = "Protect [H.real_name], the wizard." ticker.mode.apprentices += M.mind M.mind.special_role = "apprentice" ticker.mode.update_wiz_icons_added(M.mind) @@ -252,11 +251,9 @@ S.mind.assigned_role = "Slaughter Demon" S.mind.special_role = "Slaughter Demon" ticker.mode.traitors += S.mind - var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate - new_objective.owner = S.mind + var/datum/objective/default/assassinate/new_objective = add_objective(S.mind, /datum/objective/default/assassinate) new_objective.target = usr.mind new_objective.explanation_text = "Kill [usr.real_name], the one who summoned you." - S.mind.objectives += new_objective var/datum/objective/new_objective2 = new /datum/objective new_objective2.owner = S.mind new_objective2.explanation_text = "Kill everyone else while you're at it." @@ -264,4 +261,4 @@ S << S.playstyle_string S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest." S << "Objective #[1]: [new_objective.explanation_text]" - S << "Objective #[2]: [new_objective2.explanation_text]" + S << "Objective #[2]: [new_objective2.explanation_text]" \ No newline at end of file diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index a25cd4e108c..73e6b8849b7 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -147,7 +147,7 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b for(var/datum/mind/blob in infected_crew) greet_blob(blob) - var/datum/action/innate/blob_burst/B = new + var/datum/action/innate/blob_earlyhelp/B = new B.Grant(blob.current) SSshuttle.emergencyNoEscape = 1 diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index ee153eb2289..5d0e61a3b11 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -157,7 +157,6 @@ minbodytemp = 0 maxbodytemp = 360 force_threshold = 10 - environment_smash = 3 mob_size = MOB_SIZE_LARGE gold_core_spawnable = 1 diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm deleted file mode 100644 index 968101b6b14..00000000000 --- a/code/game/gamemodes/blob/blobs/storage.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/effect/blob/storage - name = "storage blob" - icon = 'icons/mob/blob.dmi' - icon_state = "blob_factory" - desc = "A huge, smooth mass supported by tendrils." - health = 60 - maxhealth = 60 - point_return = -1 - var/point_bonus = 50 //How much the overmind's point cap increases from storage blobs - - -/obj/effect/blob/storage/creation_action() - if(overmind) - overmind.max_blob_points += point_bonus - overmind.storage_blobs++ - -/obj/effect/blob/storage/Destroy() - if(overmind && overmind.storage_blobs) //if the overmind doesn't have any recorded storage blobs, don't TAKE ALL THE POINTS THEY HAVE - overmind.max_blob_points -= point_bonus - overmind.storage_blobs-- - return ..() diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index fb7219f28f2..2a0b8ea8575 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -14,7 +14,6 @@ var/obj/effect/blob/core/blob_core = null // The blob overmind's core var/blob_points = 0 var/max_blob_points = 100 - var/storage_blobs = 0 var/last_attack = 0 var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob() var/list/blob_mobs = list() @@ -91,10 +90,10 @@ return var/message_a = say_quote(message, get_spans()) - var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [message_a]" + var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [message_a]" - for (var/mob/M in mob_list) - if(isovermind(M) || isobserver(M)) + for(var/mob/M in mob_list) + if(isovermind(M) || isobserver(M) || istype(M, /mob/living/simple_animal/hostile/blob)) M.show_message(rendered, 2) /mob/camera/blob/emote(act,m_type=1,message = null) @@ -154,15 +153,15 @@ var/mob/camera/blob/B = usr B.transport_core() -/obj/screen/blob/StorageBlob - icon_state = "ui_factory" - name = "Produce Storage Blob (20)" - desc = "Produces a storage blob for 20 points." +/obj/screen/blob/Blobbernaut + icon_state = "ui_blobbernaut" + name = "Produce Blobbernaut (20)" + desc = "Produces a blobbernaut for 20 points." -/obj/screen/blob/StorageBlob/Click() +/obj/screen/blob/Blobbernaut/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr - B.create_storage() + B.create_blobbernaut() /obj/screen/blob/ResourceBlob icon_state = "ui_resource" @@ -247,7 +246,7 @@ using.screen_loc = ui_zonesel adding += using - using = new /obj/screen/blob/StorageBlob() + using = new /obj/screen/blob/Blobbernaut() using.screen_loc = ui_belt adding += using diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 2e46052a8f2..ab7a3569d28 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -10,14 +10,14 @@ /mob/camera/blob/verb/transport_core() set category = "Blob" set name = "Jump to Core" - set desc = "Transport back to your core." + set desc = "Move your camera to your core." if(blob_core) src.loc = blob_core.loc /mob/camera/blob/verb/jump_to_node() set category = "Blob" set name = "Jump to Node" - set desc = "Transport back to a selected node." + set desc = "Move your camera to a selected node." if(blob_nodes.len) var/list/nodes = list() for(var/i = 1; i <= blob_nodes.len; i++) @@ -50,7 +50,7 @@ /mob/camera/blob/verb/create_shield_power() set category = "Blob" set name = "Create Shield Blob (10)" - set desc = "Create a shield blob." + set desc = "Create a shield blob, which will block fire and is hard to kill." create_shield() /mob/camera/blob/proc/create_shield(turf/T) @@ -74,51 +74,45 @@ set desc = "Create a spore tower that will spawn spores to harass your enemies." createSpecial(60, /obj/effect/blob/factory, 7) -/mob/camera/blob/verb/create_storage() - set category = "Blob" - set name = "Create Storage Blob (20)" - set desc = "Create a storage tower which will store extra resources for you. This increases your max resource cap by 50." - createSpecial(20, /obj/effect/blob/storage, 3) - /mob/camera/blob/verb/create_blobbernaut() set category = "Blob" set name = "Create Blobbernaut (20)" - set desc = "Create a powerful blob-being, a Blobbernaut" + set desc = "Create a powerful blobbernaut which is mildly smart and will attack enemies." var/turf/T = get_turf(src) - var/obj/effect/blob/B = locate(/obj/effect/blob) in T + var/obj/effect/blob/factory/B = locate(/obj/effect/blob/factory) in T if(!B) - src << "You must be on a blob!" - return - if(!istype(B, /obj/effect/blob/factory)) - src << "Unable to use this blob, find a factory blob." + src << "You must be on a factory blob!" return if(B.health < B.maxhealth*0.6) //if it's at less than 60% of its health, you can't blobbernaut it src << "This factory blob is too damaged to produce a blobbernaut." return if(!can_buy(20)) return - var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B)) - var/obj/effect/blob/factory/F = B - F.take_damage(F.maxhealth*0.6, CLONE, null, 0) //take a bunch of damage, so you can't produce tons of blobbernauts from a single factory - F.visible_message("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!") - F.spore_delay = world.time + 600 //one minute before it can spawn spores again + var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut(get_turf(B)) + B.take_damage(B.maxhealth*0.6, CLONE, null, 0) //take a bunch of damage, so you can't produce tons of blobbernauts from a single factory + B.visible_message("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!") + B.spore_delay = world.time + 600 //one minute before it can spawn spores again blobber.overmind = src blobber.update_icons() + blobber.AIStatus = AI_OFF blob_mobs.Add(blobber) - var/list/candidates = get_candidates(ROLE_BLOB, ALIEN_AFK_BRACKET) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly var/client/C = null - if(candidates.len) //if we got a candidate, they're a blobbernaut now. + if(candidates.len) //if we got at least one candidate, they're a blobbernaut now. C = pick(candidates) blobber.key = C.key blobber << 'sound/effects/blobattack.ogg' + blobber << 'sound/effects/attackblob.ogg' blobber << "You are a blobbernaut!" blobber << "Your overmind's blob reagent is: [blob_reagent_datum.name]!" - blobber << "The [blob_reagent_datum.name] reagent [blob_reagent_datum.description]" + blobber << "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]" + else + blobber.AIStatus = AI_ON //otherwise, they reactivate AI and continue /mob/camera/blob/verb/relocate_core() set category = "Blob" set name = "Relocate Core (80)" - set desc = "Relocates your core to the node you are on, your old core will be turned into a node." + set desc = "Swaps the locations of your core and the selected node." var/turf/T = get_turf(src) var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T if(!B) @@ -156,7 +150,7 @@ /mob/camera/blob/verb/expand_blob_power() set category = "Blob" set name = "Expand/Attack Blob (5)" - set desc = "Attempts to create a new blob in this tile. If the tile isn't clear we will attack it, which might clear it." + set desc = "Attempts to create a new blob in this tile. If the tile isn't clear, instead attacks it, damaging mobs and objects." var/turf/T = get_turf(src) expand_blob(T) @@ -185,7 +179,7 @@ /mob/camera/blob/verb/rally_spores_power() set category = "Blob" set name = "Rally Spores" - set desc = "Rally the spores to move to your location." + set desc = "Rally your spores to move to a target location." var/turf/T = get_turf(src) rally_spores(T) @@ -195,14 +189,14 @@ if(!surrounding_turfs.len) return for(var/mob/living/simple_animal/hostile/blob/blobspore/BS in living_mob_list) - if(isturf(BS.loc) && get_dist(BS, T) <= 35) + if(BS.overmind == src && isturf(BS.loc) && get_dist(BS, T) <= 35) BS.LoseTarget() BS.Goto(pick(surrounding_turfs), BS.move_to_delay) /mob/camera/blob/verb/blob_broadcast() set category = "Blob" set name = "Blob Broadcast" - set desc = "Speak with your blob spores and blobbernauts as your mouthpieces. This action is free." + set desc = "Speak with your blob spores and blobbernauts as your mouthpieces." var/speak_text = input(src, "What would you like to say with your minions?", "Blob Broadcast", null) as text if(!speak_text) return @@ -215,7 +209,7 @@ /mob/camera/blob/verb/chemical_reroll() set category = "Blob" set name = "Reactive Chemical Adaptation (40)" - set desc = "Replaces your chemical with a different one" + set desc = "Replaces your chemical with a random, different one." if(!can_buy(40)) return var/datum/reagent/blob/B = pick((subtypesof(/datum/reagent/blob) - blob_reagent_datum.type)) @@ -238,19 +232,20 @@ src << "Normal Blobs will expand your reach and can be upgraded into special blobs that perform certain functions." src << "You can upgrade normal blobs into the following types of blob:" src << "Shield Blobs are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires." - src << "Storage Blobs are blobs which allow you to store 50 more resources. These blobs do not need to be near nodes to function." src << "Resource Blobs are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work." src << "Factory Blobs are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work." + src << "Blobbernauts can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become briefly fragile and unable to produce spores." src << "Node Blobs are blobs which grow, like the core. Like the core it can activate resource and factory blobs." src << "In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense." src << "Shortcuts: Click = Expand Blob | Middle Mouse Click = Rally Spores | Ctrl Click = Create Shield Blob | Alt Click = Remove Blob" + src << "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them." -/datum/action/innate/blob_burst - name = "Burst" +/datum/action/innate/blob_earlyhelp + name = "Blob Help" button_icon_state = "blob" background_icon_state = "bg_alien" -/datum/action/innate/blob_burst/CheckRemoval() +/datum/action/innate/blob_earlyhelp/CheckRemoval() if(ticker.mode.name != "blob" || !ishuman(owner)) return 1 var/datum/game_mode/blob/B = ticker.mode @@ -258,7 +253,8 @@ return 1 return 0 -/datum/action/innate/blob_burst/Activate() - var/datum/game_mode/blob/B = ticker.mode - B.burst_blob(owner.mind) - Remove(owner) \ No newline at end of file +/datum/action/innate/blob_earlyhelp/Activate() + owner << "You are a blob!" + owner << "You will shortly burst, and should find a quiet place to do so, out of sight of the station." + owner << "Alternatively, you could burst near a place that would hinder the station, such as telecomms or science." + owner << "Once you burst, you can get additional information by pressing this button again." \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index bd417180b6d..2506052b8f2 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -113,9 +113,6 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas /datum/game_mode/proc/forge_changeling_objectives(datum/mind/changeling, var/team_mode = 0) //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". - //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting - //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone - var/escape_objective_possible = TRUE //if there's a team objective, check if it's compatible with escape objectives @@ -124,63 +121,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas escape_objective_possible = FALSE break - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = changeling - absorb_objective.gen_amount_goal(6, 8) - changeling.objectives += absorb_objective - - if(prob(60)) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = changeling - steal_objective.find_target() - changeling.objectives += steal_objective - - var/list/active_ais = active_ais() - if(active_ais.len && prob(100/joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = changeling - destroy_objective.find_target() - changeling.objectives += destroy_objective - else - if(prob(70)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = changeling - if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) - else - kill_objective.find_target() - changeling.objectives += kill_objective - else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = changeling - if(team_mode) - maroon_objective.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) - else - maroon_objective.find_target() - changeling.objectives += maroon_objective - - if (!(locate(/datum/objective/escape) in changeling.objectives) && escape_objective_possible) - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = changeling - identity_theft.target = maroon_objective.target - identity_theft.update_explanation_text() - changeling.objectives += identity_theft - escape_objective_possible = FALSE - - if (!(locate(/datum/objective/escape) in changeling.objectives) && escape_objective_possible) - if(prob(50)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = changeling - changeling.objectives += escape_objective - else - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = changeling - if(team_mode) - identity_theft.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) - else - identity_theft.find_target() - changeling.objectives += identity_theft - escape_objective_possible = FALSE + generate_objectives(changeling, 4, escape_objective_possible) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 36ee079bd01..e43ab6f22e1 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -159,7 +159,9 @@ if(!cult.attempts_left) user << "You attempt to call out to the Geometer, but there is no answer..." return - + if(cult.eldergod) + user << "OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online." + verbs -= /mob/living/silicon/ai/proc/surveillance \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index cceb0c6a622..ea081ecbb8c 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -21,7 +21,7 @@ /datum/game_mode/meteor/process() if(nometeors) return - spawn() spawn_meteors(6, meteors_normal) + spawn() spawn_meteors(1, meteors_normal) /datum/game_mode/meteor/declare_completion() diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 3ee6cdb9bd5..ed153281399 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -169,7 +169,7 @@ draining = 1 essence_drained += rand(15, 20) src << "You search for the soul of [target]." - if(do_after(src, 10, 3, 0, target)) //did they get deleted in that second? + if(do_after(src, 10, 0, target)) //did they get deleted in that second? if(target.ckey) src << "Their soul burns with intelligence." essence_drained += rand(20, 30) @@ -178,7 +178,7 @@ essence_drained += rand(40, 50) else src << "Their soul is weak and faltering." - if(do_after(src, 20, 6, 0, target)) //did they get deleted NOW? + if(do_after(src, 20, 0, target)) //did they get deleted NOW? switch(essence_drained) if(1 to 30) src << "[target] will not yield much essence. Still, every bit counts." @@ -188,7 +188,7 @@ src << "Such a feast! [target] will yield much essence to you." if(90 to INFINITY) src << "Ah, the perfect soul. [target] will yield massive amounts of essence to you." - if(do_after(src, 20, 6, 0, target)) //how about now + if(do_after(src, 20, 0, target)) //how about now if(!target.stat) src << "They are now powerful enough to fight off your draining." target << "You feel something tugging across your body before subsiding." @@ -202,7 +202,7 @@ stun(46) target.visible_message("[target] suddenly rises slightly into the air, their skin turning an ashy gray.") Beam(target,icon_state="drain_life",icon='icons/effects/effects.dmi',time=44) - if(do_after(src, 50, 15, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. + if(do_after(src, 50, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. change_essence_amount(essence_drained, 0, target) if(essence_drained <= 90 && target.stat != DEAD) essence_regen_cap += 5 diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index c6bbd6bf636..6049556edc0 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -1,5 +1,6 @@ #define CHALLENGE_TIME_LIMIT 3000 #define MIN_CHALLENGE_PLAYERS 50 +#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable. /obj/item/device/nuclear_challenge name = "Declaration of War (Challenge Mode)" @@ -39,8 +40,10 @@ U.hidden_uplink.uplink_owner= "[user.key]" U.hidden_uplink.uses = 280 U.hidden_uplink.mode_override = /datum/game_mode/nuclear //Maybe we can have a special set of items for the challenge uplink eventually + config.shuttle_refuel_delay = min(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY) qdel(src) #undef CHALLENGE_TIME_LIMIT #undef MIN_CHALLENGE_PLAYERS +#undef CHALLENGE_SHUTTLE_DELAY diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 3490b4c750b..073d828dc81 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,838 +1,927 @@ -/datum/objective - var/datum/mind/owner = null //Who owns the objective. - var/explanation_text = "Nothing" //What that person is supposed to do. - var/datum/mind/target = null //If they are focused on a particular person. - var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. - var/completed = 0 //currently only used for custom objectives. - var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory. - var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. - -/datum/objective/New(var/text) - if(text) - explanation_text = text - -/datum/objective/proc/check_completion() - return completed - -/datum/objective/proc/is_unique_objective(possible_target) - for(var/datum/objective/O in owner.objectives) - if(istype(O, type) && O.get_target() == possible_target) - return 0 - return 1 - -/datum/objective/proc/get_target() - return target - -/datum/objective/proc/find_target() - var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) - possible_targets += possible_target - if(possible_targets.len > 0) - target = pick(possible_targets) - update_explanation_text() - return target - -/datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling" - for(var/datum/mind/possible_target in ticker.minds) - if((possible_target != owner) && ishuman(possible_target.current)) - var/is_role = 0 - if(role_type) - if(possible_target.special_role == role) - is_role++ - else - if(possible_target.assigned_role == role) - is_role++ - - if(invert) - if(is_role) - continue - target = possible_target - break - else if(is_role) - target = possible_target - break - - update_explanation_text() - -/datum/objective/proc/update_explanation_text() - //Default does nothing, override where needed - -/datum/objective/proc/give_special_equipment() - -/datum/objective/assassinate - var/target_role_type=0 - dangerrating = 10 - martyr_compatible = 1 - -/datum/objective/assassinate/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/assassinate/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 - -/datum/objective/assassinate/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - -/datum/objective/mutiny - var/target_role_type=0 - martyr_compatible = 1 - -/datum/objective/mutiny/find_target_by_role(role, role_type=0,invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/mutiny/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client) - return 1 - var/turf/T = get_turf(target.current) - if(T && (T.z > ZLEVEL_STATION) || target.current.client.is_afk()) //If they leave the station or go afk they count as dead for this - return 2 - return 0 - return 1 - -/datum/objective/mutiny/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Assassinate or exile [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - - -/datum/objective/maroon - var/target_role_type=0 - dangerrating = 5 - martyr_compatible = 1 - -/datum/objective/maroon/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/maroon/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - if(target.current.onCentcom() || target.current.onSyndieBase()) - return 0 - return 1 - -/datum/objective/maroon/update_explanation_text() - if(target && target.current) - explanation_text = "Prevent [target.name], the [!target_role_type ? target.assigned_role : target.special_role], from escaping alive." - else - explanation_text = "Free Objective" - - - -/datum/objective/debrain//I want braaaainssss - var/target_role_type=0 - dangerrating = 20 - -/datum/objective/debrain/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/debrain/check_completion() - if(!target)//If it's a free objective. - return 1 - if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. - return 0 - if( !target.current || !isbrain(target.current) ) - return 0 - var/atom/A = target.current - while(A.loc) //check to see if the brainmob is on our person - A = A.loc - if(A == owner.current) - return 1 - return 0 - -/datum/objective/debrain/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Steal the brain of [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - - -/datum/objective/protect//The opposite of killing a dude. - var/target_role_type=0 - dangerrating = 10 - martyr_compatible = 1 - -/datum/objective/protect/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/protect/check_completion() - if(!target) //If it's a free objective. - return 1 - if(target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) - return 0 - return 1 - return 0 - -/datum/objective/protect/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Protect [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - - -/datum/objective/hijack - explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." - dangerrating = 25 - martyr_compatible = 0 //Technically you won't get both anyway. - -/datum/objective/hijack/check_completion() - if(!owner.current || owner.current.stat) - return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - if(issilicon(owner.current)) - return 0 - - var/area/A = get_area(owner.current) - if(SSshuttle.emergency.areaInstance != A) - return 0 - - for(var/mob/living/player in player_list) - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) //Borgs are technically dead anyways - continue - if(get_area(player) == A) - if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) - return 0 - return 1 - -/datum/objective/hijackclone - explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape." - dangerrating = 25 - martyr_compatible = 0 - -/datum/objective/hijackclone/check_completion() - if(!owner.current) - return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - - var/area/A = SSshuttle.emergency.areaInstance - - for(var/mob/living/player in player_list) //Make sure nobody else is onboard - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) - continue - if(get_area(player) == A) - if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) - return 0 - - for(var/mob/living/player in player_list) //Make sure at least one of you is onboard - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) - continue - if(get_area(player) == A) - if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) - return 1 - return 0 - -/datum/objective/block - explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." - dangerrating = 25 - martyr_compatible = 1 - -/datum/objective/block/check_completion() - if(!istype(owner.current, /mob/living/silicon)) - return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 1 - - var/area/A = SSshuttle.emergency.areaInstance - - for(var/mob/living/player in player_list) - if(istype(player, /mob/living/silicon)) - continue - if(player.mind) - if(player.stat != DEAD) - if(get_area(player) == A) - return 0 - - return 1 - - -/datum/objective/escape - explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." - dangerrating = 5 - -/datum/objective/escape/check_completion() - if(issilicon(owner.current)) - return 0 - if(isbrain(owner.current)) - return 0 - if(!owner.current || owner.current.stat == DEAD) - return 0 - if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith - return 1 - if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win - return 1 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - var/turf/location = get_turf(owner.current) - if(!location) - return 0 - - if(istype(location, /turf/simulated/floor/plasteel/shuttle/red)) // Fails traitors if they are in the shuttle brig -- Polymorph - return 0 - - if(location.onCentcom() || location.onSyndieBase()) - return 1 - - return 0 - -/datum/objective/escape/escape_with_identity - dangerrating = 10 - var/target_real_name // Has to be stored because the target's real_name can change over the course of the round - var/target_missing_id - -/datum/objective/escape/escape_with_identity/find_target() - target = ..() - update_explanation_text() - -/datum/objective/escape/escape_with_identity/update_explanation_text() - if(target && target.current) - target_real_name = target.current.real_name - explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role]" - var/mob/living/carbon/human/H - if(ishuman(target.current)) - H = target.current - if(H && H.get_id_name() != target_real_name) - target_missing_id = 1 - else - explanation_text += " while wearing their identification card" - explanation_text += "." //Proper punctuation is important! - - else - explanation_text = "Free Objective." - -/datum/objective/escape/escape_with_identity/check_completion() - if(!target_real_name) - return 1 - if(!ishuman(owner.current)) - return 0 - var/mob/living/carbon/human/H = owner.current - if(..()) - if(H.dna.real_name == target_real_name) - if(H.get_id_name()== target_real_name || target_missing_id) - return 1 - return 0 - - -/datum/objective/survive - explanation_text = "Stay alive until the end." - dangerrating = 3 - -/datum/objective/survive/check_completion() - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) - return 0 //Brains no longer win survive objectives. --NEO - if(!is_special_character(owner.current)) //This fails borg'd traitors - return 0 - return 1 - - -/datum/objective/martyr - explanation_text = "Die a glorious death." - dangerrating = 1 - -/datum/objective/martyr/check_completion() - if(!owner.current) //Gibbed, etc. - return 1 - if(owner.current && owner.current.stat == DEAD) //You're dead! Yay! - return 1 - return 0 - - -/datum/objective/nuclear - explanation_text = "Destroy the station with a nuclear device." - martyr_compatible = 1 - -/datum/objective/nuclear/check_completion() - if(ticker && ticker.mode && ticker.mode.station_was_nuked) - return 1 - return 0 - - -var/global/list/possible_items = list() -/datum/objective/steal - var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. - var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). - dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives. - martyr_compatible = 0 - -/datum/objective/steal/get_target() - return steal_target - -/datum/objective/steal/New() - ..() - if(!possible_items.len)//Only need to fill the list when it's needed. - init_subtypes(/datum/objective_item/steal,possible_items) - -/datum/objective/steal/find_target() - var/approved_targets = list() - for(var/datum/objective_item/possible_item in possible_items) - if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) - approved_targets += possible_item - return set_target(safepick(approved_targets)) - -/datum/objective/steal/proc/set_target(datum/objective_item/item) - if(item) - targetinfo = item - - steal_target = targetinfo.targetitem - explanation_text = "Steal [targetinfo.name]." - dangerrating = targetinfo.difficulty - give_special_equipment() - return steal_target - else - explanation_text = "Free objective" - return - -/datum/objective/steal/proc/select_target() //For admins setting objectives manually. - var/list/possible_items_all = possible_items+"custom" - var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all - if (!new_target) return - - if (new_target == "custom") //Can set custom items. - var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) - if (!custom_target) return - var/tmp_obj = new custom_target - var/custom_name = tmp_obj:name - qdel(tmp_obj) - custom_name = stripped_input("Enter target name:", "Objective target", custom_name) - if (!custom_name) return - steal_target = custom_target - explanation_text = "Steal [custom_name]." - - else - set_target(new_target) - return steal_target - -/datum/objective/steal/check_completion() - if(!steal_target) return 1 - if(!isliving(owner.current)) return 0 - var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. - - for(var/obj/I in all_items) //Check for items - if(istype(I, steal_target)) - if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. - return 1 - else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. - return 1 - - if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? - if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! - return 1 - return 0 - -/datum/objective/steal/give_special_equipment() - if(owner && owner.current && targetinfo) - if(istype(owner.current, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = owner.current - var/list/slots = list ("backpack" = slot_in_backpack) - for(var/eq_path in targetinfo.special_equipment) - var/obj/O = new eq_path - H.equip_in_one_of_slots(O, slots) - H.update_icons() - -var/global/list/possible_items_special = list() -/datum/objective/steal/special //ninjas are so special they get their own subtype good for them - -/datum/objective/steal/special/New() - ..() - if(!possible_items_special.len) - init_subtypes(/datum/objective_item/special,possible_items) - init_subtypes(/datum/objective_item/stack,possible_items) - -/datum/objective/steal/special/find_target() - return set_target(pick(possible_items_special)) - - - -/datum/objective/steal/exchange - dangerrating = 10 - martyr_compatible = 0 - -/datum/objective/steal/exchange/proc/set_faction(faction,otheragent) - target = otheragent - if(faction == "red") - targetinfo = new/datum/objective_item/unique/docs_blue - else if(faction == "blue") - targetinfo = new/datum/objective_item/unique/docs_red - explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent" - steal_target = targetinfo.targetitem - - -/datum/objective/steal/exchange/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Acquire [targetinfo.name] held by [target.name], the [target.assigned_role] and syndicate agent" - else - explanation_text = "Free Objective" - - -/datum/objective/steal/exchange/backstab - dangerrating = 3 - -/datum/objective/steal/exchange/backstab/set_faction(faction) - if(faction == "red") - targetinfo = new/datum/objective_item/unique/docs_red - else if(faction == "blue") - targetinfo = new/datum/objective_item/unique/docs_blue - explanation_text = "Do not give up or lose [targetinfo.name]." - steal_target = targetinfo.targetitem - - -/datum/objective/download - dangerrating = 10 - -/datum/objective/download/proc/gen_amount_goal() - target_amount = rand(10,20) - explanation_text = "Download [target_amount] research level\s." - return target_amount - -/datum/objective/download/check_completion()//NINJACODE - if(!ishuman(owner.current)) - return 0 - - var/mob/living/carbon/human/H = owner.current - if(!H || H.stat == DEAD) - return 0 - - if(!istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) - return 0 - - var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit - if(!SN.s_initialized) - return 0 - - var/current_amount - if(!SN.stored_research.len) - return 0 - else - for(var/datum/tech/current_data in SN.stored_research) - if(current_data.level) - current_amount += (current_data.level-1) - if(current_amount= target_amount)) - return 1 - else - return 0 - - - -/datum/objective/destroy - dangerrating = 10 - martyr_compatible = 1 - -/datum/objective/destroy/find_target() - var/list/possible_targets = active_ais(1) - var/mob/living/silicon/ai/target_ai = pick(possible_targets) - target = target_ai.mind - update_explanation_text() - return target - -/datum/objective/destroy/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 - -/datum/objective/destroy/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Destroy [target.name], the experimental AI." - else - explanation_text = "Free Objective" - -/datum/objective/summon_guns - explanation_text = "Steal at least five guns!" - -/datum/objective/summon_guns/check_completion() - if(!isliving(owner.current)) return 0 - var/guncount = 0 - var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for guns - if(istype(I, /obj/item/weapon/gun)) - guncount++ - if(guncount >= 5) - return 1 - else - return 0 - return 0 - - - -//////////////////////////////// -// Changeling team objectives // -//////////////////////////////// - -/datum/objective/changeling_team_objective //Abstract type - martyr_compatible = 0 //Suicide is not teamwork! - explanation_text = "Changeling Friendship!" - var/min_lings = 3 //Minimum amount of lings for this team objective to be possible - var/escape_objective_compatible = FALSE - - -//Impersonate department -//Picks as many people as it can from a department (Security,Engineer,Medical,Science) -//and tasks the lings with killing and replacing them -/datum/objective/changeling_team_objective/impersonate_department - explanation_text = "Ensure X derpartment are killed, impersonated, and replaced by Changelings" - var/command_staff_only = FALSE //if this is true, it picks command staff instead - var/list/department_minds = list() - var/list/department_real_names = list() - var/department_string = "" - - -/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff() - department_minds = list() - department_real_names = list() - - var/list/departments = list("Head of Security","Research Director","Chief Engineer","Chief Medical Officer") - var/department_head = pick(departments) - switch(department_head) - if("Head of Security") - department_string = "security" - if("Research Director") - department_string = "science" - if("Chief Engineer") - department_string = "engineering" - if("Chief Medical Officer") - department_string = "medical" - - var/ling_count = ticker.mode.changelings - - for(var/datum/mind/M in ticker.minds) - if(M in ticker.mode.changelings) - continue - if(department_head in get_department_heads(M.assigned_role)) - if(ling_count) - ling_count-- - department_minds += M - department_real_names += M.current.real_name - else - break - - if(!department_minds.len) - log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally") - owner.objectives -= src - qdel(src) - return - - -/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads() - department_minds = list() - department_real_names = list() - - //Needed heads is between min_lings and the maximum possible amount of command roles - //So at the time of writing, rand(3,6), it's also capped by the amount of lings there are - //Because you can't fill 6 head roles with 3 lings - - var/needed_heads = rand(min_lings,command_positions.len) - needed_heads = min(ticker.mode.changelings.len,needed_heads) - - var/list/heads = ticker.mode.get_living_heads() - for(var/datum/mind/head in heads) - if(head in ticker.mode.changelings) //Looking at you HoP. - continue - if(needed_heads) - department_minds += head - department_real_names += head.current.real_name - needed_heads-- - else - break - - if(!department_minds.len) - log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally") - owner.objectives -= src - qdel(src) - return - - -/datum/objective/changeling_team_objective/impersonate_department/New(var/text) - ..() - if(command_staff_only) - get_heads() - else - get_department_staff() - - update_explanation_text() - - -/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text() - ..() - if(!department_real_names.len || !department_minds.len) - explanation_text = "Free Objective" - return //Something fucked up, give them a win - - if(command_staff_only) - explanation_text = "Ensure changelings impersonate and escape as the following heads of staff: " - else - explanation_text = "Ensure changelings impersonate and escape as the following members of \the [department_string] department: " - - var/first = 1 - for(var/datum/mind/M in department_minds) - var/string = "[M.name] the [M.assigned_role]" - if(!first) - string = ", [M.name] the [M.assigned_role]" - else - first-- - explanation_text += string - - if(command_staff_only) - explanation_text += ", while the real heads are dead. This is a team objective." - else - explanation_text += ", while the real members are dead. This is a team objective." - - -/datum/objective/changeling_team_objective/impersonate_department/check_completion() - if(!department_real_names.len || !department_minds.len) - return 1 //Something fucked up, give them a win - - var/list/check_names = department_real_names.Copy() - - //Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail - for(var/datum/mind/M in department_minds) - if(M in ticker.mode.changelings) //Lings aren't picked for this, but let's be safe - continue - - if(M.current) - var/turf/mloc = get_turf(M.current) - if(mloc.onCentcom() && (M.current.stat != DEAD)) - return 0 //A Non-ling living target got to centcomm, fail - - //Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names - var/success = 0 - changelings: - for(var/datum/mind/changeling in ticker.mode.changelings) - if(success >= department_minds.len) //We did it, stop here! - return 1 - if(ishuman(changeling.current)) - var/mob/living/carbon/human/H = changeling.current - var/turf/cloc = get_turf(changeling.current) - if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm.... - for(var/name in check_names) //Is he (disguised as) one of the staff? - if(H.dna.real_name == name) - check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer - success++ //A living changeling staff member made it to centcomm - continue changelings - - if(success >= department_minds.len) - return 1 - return 0 - - - - -//A subtype of impersonate_derpartment -//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD) -//and tasks the lings with killing and replacing them -/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads - explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead" - command_staff_only = TRUE - - - +/datum/objective + var/datum/mind/owner = null //Who owns the objective. + var/explanation_text = "Nothing" //What that person is supposed to do. + var/datum/mind/target = null //If they are focused on a particular person. + var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. + var/completed = 0 //currently only used for custom objectives. + var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory. + var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. + var/required_role = null //If the objective can only be done by a certain role, such as absorb for changelings. + var/randomgen = 1 //Whether the objective can be generated randomly. + var/error_text = "" //Displayed to admins if the objective fails to initialize properly when editing or adding + +/proc/generate_objectives(var/datum/mind/M, var/objectives_made = 2, var/has_escape = TRUE) + var/list/objective_types = (typesof(/datum/objective/default) - /datum/objective/default) + var/list/escape_objective_types = (typesof(/datum/objective/escape_obj) - /datum/objective/escape_obj) + for(var/O in objective_types) // this is fucking hacky as shit but + var/datum/objective/obj = new O + if(M.special_role != obj.required_role && obj.required_role != null) + objective_types -= O + if(!obj.randomgen) + objective_types -= O + for(var/E in escape_objective_types) + var/datum/objective/obj = new E + if(M.special_role != obj.required_role && obj.required_role != null) + objective_types -= E + if(!obj.randomgen) + objective_types -= E + for(var/i = 1, i <= objectives_made, i++) + if(i == objectives_made && has_escape) + var/datum/objective/holder_obj = pick(escape_objective_types) + add_objective(M, holder_obj) + return + else + var/datum/objective/holder_obj = pick(objective_types) + objective_types -= holder_obj + var/datum/objective/O = new holder_obj + if(!O.martyr_compatible) + escape_objective_types -= list(/datum/objective/escape_obj/martyr) + add_objective(M, holder_obj) + + +/proc/add_objective(var/datum/mind/M, var/obj_path, var/announce_new_objectives = 0, var/replace_if_impossible = 1, var/admin=0) + var/datum/objective/objective = new obj_path() + objective.owner = M + M.objectives += objective + if(admin && check_rights(R_ADMIN)) + objective.find_target_admin() + else + objective.find_target() + + if(!objective.extra_prep()) + if(replace_if_impossible) + generate_objectives(objective.owner, 1, FALSE) // Generate another objective to replace this one. + objective.owner.objectives -= src + qdel(src) + return null + + objective.update_explanation_text() + if(announce_new_objectives) + if(M.special_role) + M.current << "You are the [M.special_role]." + var/obj_count = 1 + for(var/datum/objective/OBJ in M.objectives) + M.current << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ + return objective + +/datum/objective/New(var/text) + if(text) + explanation_text = text + +/datum/objective/proc/check_completion() + return completed + +/datum/objective/proc/extra_prep() + return 1 + +/datum/objective/proc/is_unique_objective(possible_target) + for(var/datum/objective/O in owner.objectives) + if(istype(O, type) && O.get_target() == possible_target) + return 0 + return 1 + +/datum/objective/proc/get_target() + return target + +/datum/objective/proc/find_possible_targets() + var/list/possible_targets = list() + for(var/datum/mind/possible_target in ticker.minds) + if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) + possible_targets += possible_target + return possible_targets + +/datum/objective/proc/find_target() + var/list/possible_targets = find_possible_targets() + if(possible_targets.len > 0) + target = pick(possible_targets) + update_explanation_text() + return target + +/datum/objective/proc/find_target_admin() + target = input("Select target:", "Objective target") as null|anything in find_possible_targets() + return target + +/datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling" + for(var/datum/mind/possible_target in ticker.minds) + if((possible_target != owner) && ishuman(possible_target.current)) + var/is_role = 0 + if(role_type) + if(possible_target.special_role == role) + is_role++ + else + if(possible_target.assigned_role == role) + is_role++ + + if(invert) + if(is_role) + continue + target = possible_target + break + else if(is_role) + target = possible_target + break + + update_explanation_text() + +/datum/objective/proc/update_explanation_text() + //Default does nothing, override where needed + +/datum/objective/proc/give_special_equipment() + +// Default objectives are ones you can put on any antag type and they should be able to complete it. + +/datum/objective/default/assassinate + var/target_role_type=0 + dangerrating = 10 + martyr_compatible = 1 + +/datum/objective/default/assassinate/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/default/assassinate/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + return 0 + return 1 + +/datum/objective/default/assassinate/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + +/datum/objective/mutiny + var/target_role_type=0 + martyr_compatible = 1 + +/datum/objective/mutiny/find_target_by_role(role, role_type=0,invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/mutiny/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client) + return 1 + var/turf/T = get_turf(target.current) + if(T && (T.z > ZLEVEL_STATION) || target.current.client.is_afk()) //If they leave the station or go afk they count as dead for this + return 2 + return 0 + return 1 + +/datum/objective/mutiny/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Assassinate or exile [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + + +/datum/objective/default/maroon + var/target_role_type=0 + dangerrating = 5 + martyr_compatible = 1 + +/datum/objective/default/maroon/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/default/maroon/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + if(target.current.onCentcom() || target.current.onSyndieBase()) + return 0 + return 1 + +/datum/objective/default/maroon/update_explanation_text() + if(target && target.current) + explanation_text = "Prevent [target.name], the [!target_role_type ? target.assigned_role : target.special_role], from escaping alive." + else + explanation_text = "Free Objective" + + + +/datum/objective/default/debrain//I want braaaainssss + var/target_role_type=0 + dangerrating = 20 + randomgen = 0 + +/datum/objective/default/debrain/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/default/debrain/check_completion() + if(!target)//If it's a free objective. + return 1 + if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. + return 0 + if( !target.current || !isbrain(target.current) ) + return 0 + var/atom/A = target.current + while(A.loc) //check to see if the brainmob is on our person + A = A.loc + if(A == owner.current) + return 1 + return 0 + +/datum/objective/default/debrain/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Steal the brain of [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + + +/datum/objective/default/protect//The opposite of killing a dude. + var/target_role_type=0 + dangerrating = 10 + martyr_compatible = 1 + +/datum/objective/default/protect/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/default/protect/check_completion() + if(!target) //If it's a free objective. + return 1 + if(target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) + return 0 + return 1 + return 0 + +/datum/objective/default/protect/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Protect [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + + +/datum/objective/escape_obj/hijack + explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." + dangerrating = 25 + martyr_compatible = 0 //Technically you won't get both anyway. + +/datum/objective/escape_obj/hijack/check_completion() + if(!owner.current || owner.current.stat) + return 0 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + if(issilicon(owner.current)) + return 0 + + var/area/A = get_area(owner.current) + if(SSshuttle.emergency.areaInstance != A) + return 0 + + for(var/mob/living/player in player_list) + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) //Borgs are technically dead anyways + continue + if(get_area(player) == A) + if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) + return 0 + return 1 + +/datum/objective/hijackclone + explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape." + dangerrating = 25 + martyr_compatible = 0 + +/datum/objective/hijackclone/check_completion() + if(!owner.current) + return 0 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + + var/area/A = SSshuttle.emergency.areaInstance + + for(var/mob/living/player in player_list) //Make sure nobody else is onboard + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) + continue + if(get_area(player) == A) + if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) + return 0 + + for(var/mob/living/player in player_list) //Make sure at least one of you is onboard + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) + continue + if(get_area(player) == A) + if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) + return 1 + return 0 + +/datum/objective/escape_obj/block + explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." + dangerrating = 25 + martyr_compatible = 1 + randomgen = 0 + +/datum/objective/escape_obj/block/check_completion() + if(!istype(owner.current, /mob/living/silicon)) + return 0 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 1 + + var/area/A = SSshuttle.emergency.areaInstance + + for(var/mob/living/player in player_list) + if(istype(player, /mob/living/silicon)) + continue + if(player.mind) + if(player.stat != DEAD) + if(get_area(player) == A) + return 0 + + return 1 + + +/datum/objective/escape_obj/escape + explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." + dangerrating = 5 + +/datum/objective/escape_obj/escape/check_completion() + if(issilicon(owner.current)) + return 0 + if(isbrain(owner.current)) + return 0 + if(!owner.current || owner.current.stat == DEAD) + return 0 + if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + return 1 + if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win + return 1 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + var/turf/location = get_turf(owner.current) + if(!location) + return 0 + + if(istype(location, /turf/simulated/floor/plasteel/shuttle/red)) // Fails traitors if they are in the shuttle brig -- Polymorph + return 0 + + if(location.onCentcom() || location.onSyndieBase()) + return 1 + + return 0 + +/datum/objective/escape_obj/escape/escape_with_identity + dangerrating = 10 + var/target_real_name // Has to be stored because the target's real_name can change over the course of the round + var/target_missing_id + required_role = "changeling" + +/datum/objective/escape_obj/escape/escape_with_identity/find_target() + target = ..() + update_explanation_text() + +/datum/objective/escape_obj/escape/escape_with_identity/update_explanation_text() + if(target && target.current) + target_real_name = target.current.real_name + explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role]" + var/mob/living/carbon/human/H + if(ishuman(target.current)) + H = target.current + if(H && H.get_id_name() != target_real_name) + target_missing_id = 1 + else + explanation_text += " while wearing their identification card" + explanation_text += "." //Proper punctuation is important! + + else + explanation_text = "Free Objective." + +/datum/objective/escape_obj/escape/escape_with_identity/check_completion() + if(!target_real_name) + return 1 + if(!ishuman(owner.current)) + return 0 + var/mob/living/carbon/human/H = owner.current + if(..()) + if(H.dna.real_name == target_real_name) + if(H.get_id_name()== target_real_name || target_missing_id) + return 1 + return 0 + + +/datum/objective/escape_obj/survive + explanation_text = "Stay alive until the end." + dangerrating = 3 + +/datum/objective/survive/check_completion() + if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) + return 0 //Brains no longer win survive objectives. --NEO + if(!is_special_character(owner.current)) //This fails borg'd traitors + return 0 + return 1 + + +/datum/objective/escape_obj/martyr + explanation_text = "Die a glorious death." + dangerrating = 1 + +/datum/objective/escape_obj/martyr/check_completion() + if(!owner.current) //Gibbed, etc. + return 1 + if(owner.current && owner.current.stat == DEAD) //You're dead! Yay! + return 1 + return 0 + + +/datum/objective/nuclear + explanation_text = "Destroy the station with a nuclear device." + martyr_compatible = 1 + +/datum/objective/nuclear/check_completion() + if(ticker && ticker.mode && ticker.mode.station_was_nuked) + return 1 + return 0 + +var/global/list/possible_items = list() +/datum/objective/default/steal + var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. + var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). + dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives. + martyr_compatible = 0 + +/datum/objective/default/steal/get_target() + return steal_target + +/datum/objective/default/steal/New() + ..() + if(!possible_items.len)//Only need to fill the list when it's needed. + init_subtypes(/datum/objective_item/steal,possible_items) + +/datum/objective/default/steal/find_possible_targets() + var/list/approved_targets = list() + if(check_rights(R_ADMIN)) + approved_targets += select_target() + else + for(var/datum/objective_item/possible_item in possible_items) + if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) + approved_targets += possible_item + return approved_targets + +/datum/objective/default/steal/find_target() + return set_target(safepick(find_possible_targets())) + +/datum/objective/default/steal/proc/set_target(datum/objective_item/item) + if(item) + targetinfo = item + + steal_target = targetinfo.targetitem + explanation_text = "Steal [targetinfo.name]." + dangerrating = targetinfo.difficulty + give_special_equipment() + return steal_target + else + explanation_text = "Free objective" + return + +/datum/objective/default/steal/proc/select_target() //For admins setting objectives manually. + var/list/possible_items_all = possible_items+"custom" + var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all + if (!new_target) + return + + if (new_target == "custom") //Can set custom items. + var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) + if (!custom_target) + return + var/custom_name = initial(custom_target.name) + custom_name = stripped_input("Enter target name:", "Objective target", custom_name) + if (!custom_name) + return + steal_target = custom_target + explanation_text = "Steal [custom_name]." + + return steal_target + +/datum/objective/default/steal/check_completion() + if(!steal_target) + return 1 + if(!isliving(owner.current)) + return 0 + var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + + for(var/obj/I in all_items) //Check for items + if(istype(I, steal_target)) + if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. + return 1 + else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. + return 1 + + if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? + if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! + return 1 + return 0 + +/datum/objective/default/steal/give_special_equipment() + if(owner && owner.current && targetinfo) + if(istype(owner.current, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner.current + var/list/slots = list ("backpack" = slot_in_backpack) + for(var/eq_path in targetinfo.special_equipment) + var/obj/O = new eq_path + H.equip_in_one_of_slots(O, slots) + H.update_icons() + +var/global/list/possible_items_special = list() +/datum/objective/default/steal/special //ninjas are so special they get their own subtype good for them + randomgen = 0 +/datum/objective/default/steal/special/New() + ..() + if(!possible_items_special.len) + init_subtypes(/datum/objective_item/special,possible_items) + init_subtypes(/datum/objective_item/stack,possible_items) + +/datum/objective/default/steal/special/find_target() + return set_target(pick(possible_items_special)) + + + +/datum/objective/default/steal/exchange + dangerrating = 10 + martyr_compatible = 0 + randomgen = 0 + +/datum/objective/default/steal/exchange/proc/set_faction(faction,otheragent) + target = otheragent + if(faction == "red") + targetinfo = new/datum/objective_item/unique/docs_blue + else if(faction == "blue") + targetinfo = new/datum/objective_item/unique/docs_red + explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent" + steal_target = targetinfo.targetitem + + +/datum/objective/default/steal/exchange/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Acquire [targetinfo.name] held by [target.name], the [target.assigned_role] and syndicate agent" + else + explanation_text = "Free Objective" + + +/datum/objective/default/steal/exchange/backstab + dangerrating = 3 + randomgen = 0 + +/datum/objective/default/steal/exchange/backstab/set_faction(faction) + if(faction == "red") + targetinfo = new/datum/objective_item/unique/docs_red + else if(faction == "blue") + targetinfo = new/datum/objective_item/unique/docs_blue + explanation_text = "Do not give up or lose [targetinfo.name]." + steal_target = targetinfo.targetitem + + +/datum/objective/download + dangerrating = 10 + +/datum/objective/download/proc/gen_amount_goal() + target_amount = rand(10,20) + explanation_text = "Download [target_amount] research level\s." + return target_amount + +/datum/objective/download/check_completion()//NINJACODE + if(!ishuman(owner.current)) + return 0 + + var/mob/living/carbon/human/H = owner.current + if(!H || H.stat == DEAD) + return 0 + + if(!istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) + return 0 + + var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit + if(!SN.s_initialized) + return 0 + + var/current_amount + if(!SN.stored_research.len) + return 0 + else + for(var/datum/tech/current_data in SN.stored_research) + if(current_data.level) + current_amount += (current_data.level-1) + if(current_amount= target_amount)) + return 1 + else + return 0 + + + +/datum/objective/default/destroy + dangerrating = 10 + martyr_compatible = 1 + error_text = "No active AIs with minds." + +/datum/objective/default/destroy/find_target() + var/list/possible_targets = active_ais(1) + var/mob/living/silicon/ai/target_ai = pick(possible_targets) + target = target_ai.mind + update_explanation_text() + return target + +/datum/objective/default/destroy/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + return 0 + return 1 + +/datum/objective/default/destroy/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Destroy [target.name], the experimental AI." + else + explanation_text = "Free Objective" + +/datum/objective/default/destroy/extra_prep() + if(!target) + return 0 + return 1 + +/datum/objective/summon_guns + explanation_text = "Steal at least five guns!" + +/datum/objective/summon_guns/check_completion() + if(!isliving(owner.current)) return 0 + var/guncount = 0 + var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for guns + if(istype(I, /obj/item/weapon/gun)) + guncount++ + if(guncount >= 5) + return 1 + else + return 0 + return 0 + + + +//////////////////////////////// +// Changeling team objectives // +//////////////////////////////// + +/datum/objective/changeling_team_objective //Abstract type + martyr_compatible = 0 //Suicide is not teamwork! + explanation_text = "Changeling Friendship!" + var/min_lings = 3 //Minimum amount of lings for this team objective to be possible + var/escape_objective_compatible = FALSE + + +//Impersonate department +//Picks as many people as it can from a department (Security,Engineer,Medical,Science) +//and tasks the lings with killing and replacing them +/datum/objective/changeling_team_objective/impersonate_department + explanation_text = "Ensure X derpartment are killed, impersonated, and replaced by Changelings" + var/command_staff_only = FALSE //if this is true, it picks command staff instead + var/list/department_minds = list() + var/list/department_real_names = list() + var/department_string = "" + + +/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff() + department_minds = list() + department_real_names = list() + + var/list/departments = list("Head of Security","Research Director","Chief Engineer","Chief Medical Officer") + var/department_head = pick(departments) + switch(department_head) + if("Head of Security") + department_string = "security" + if("Research Director") + department_string = "science" + if("Chief Engineer") + department_string = "engineering" + if("Chief Medical Officer") + department_string = "medical" + + var/ling_count = ticker.mode.changelings + + for(var/datum/mind/M in ticker.minds) + if(M in ticker.mode.changelings) + continue + if(department_head in get_department_heads(M.assigned_role)) + if(ling_count) + ling_count-- + department_minds += M + department_real_names += M.current.real_name + else + break + + if(!department_minds.len) + log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally") + owner.objectives -= src + qdel(src) + return + + +/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads() + department_minds = list() + department_real_names = list() + + //Needed heads is between min_lings and the maximum possible amount of command roles + //So at the time of writing, rand(3,6), it's also capped by the amount of lings there are + //Because you can't fill 6 head roles with 3 lings + + var/needed_heads = rand(min_lings,command_positions.len) + needed_heads = min(ticker.mode.changelings.len,needed_heads) + + var/list/heads = ticker.mode.get_living_heads() + for(var/datum/mind/head in heads) + if(head in ticker.mode.changelings) //Looking at you HoP. + continue + if(needed_heads) + department_minds += head + department_real_names += head.current.real_name + needed_heads-- + else + break + + if(!department_minds.len) + log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally") + owner.objectives -= src + qdel(src) + return + + +/datum/objective/changeling_team_objective/impersonate_department/New(var/text) + ..() + if(command_staff_only) + get_heads() + else + get_department_staff() + + update_explanation_text() + + +/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text() + ..() + if(!department_real_names.len || !department_minds.len) + explanation_text = "Free Objective" + return //Something fucked up, give them a win + + if(command_staff_only) + explanation_text = "Ensure changelings impersonate and escape as the following heads of staff: " + else + explanation_text = "Ensure changelings impersonate and escape as the following members of \the [department_string] department: " + + var/first = 1 + for(var/datum/mind/M in department_minds) + var/string = "[M.name] the [M.assigned_role]" + if(!first) + string = ", [M.name] the [M.assigned_role]" + else + first-- + explanation_text += string + + if(command_staff_only) + explanation_text += ", while the real heads are dead. This is a team objective." + else + explanation_text += ", while the real members are dead. This is a team objective." + + +/datum/objective/changeling_team_objective/impersonate_department/check_completion() + if(!department_real_names.len || !department_minds.len) + return 1 //Something fucked up, give them a win + + var/list/check_names = department_real_names.Copy() + + //Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail + for(var/datum/mind/M in department_minds) + if(M in ticker.mode.changelings) //Lings aren't picked for this, but let's be safe + continue + + if(M.current) + var/turf/mloc = get_turf(M.current) + if(mloc.onCentcom() && (M.current.stat != DEAD)) + return 0 //A Non-ling living target got to centcomm, fail + + //Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names + var/success = 0 + changelings: + for(var/datum/mind/changeling in ticker.mode.changelings) + if(success >= department_minds.len) //We did it, stop here! + return 1 + if(ishuman(changeling.current)) + var/mob/living/carbon/human/H = changeling.current + var/turf/cloc = get_turf(changeling.current) + if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm.... + for(var/name in check_names) //Is he (disguised as) one of the staff? + if(H.dna.real_name == name) + check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer + success++ //A living changeling staff member made it to centcomm + continue changelings + + if(success >= department_minds.len) + return 1 + return 0 + + + + +//A subtype of impersonate_derpartment +//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD) +//and tasks the lings with killing and replacing them +/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads + explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead" + command_staff_only = TRUE + +/datum/objective/custom + explanation_text = "Free Objective" \ No newline at end of file diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index af284603f6a..76bcc67c856 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -32,27 +32,19 @@ // Assassinate var/datum/mind/target_mind = target_list[traitor] if(issilicon(target_mind.current)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = traitor + var/datum/objective/default/destroy/destroy_objective = add_objective(traitor, /datum/objective/default/destroy) destroy_objective.target = target_mind destroy_objective.update_explanation_text() - traitor.objectives += destroy_objective else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor + var/datum/objective/default/assassinate/kill_objective = add_objective(traitor, /datum/objective/default/assassinate) kill_objective.target = target_mind kill_objective.update_explanation_text() - traitor.objectives += kill_objective // Escape if(issilicon(traitor.current)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = traitor - traitor.objectives += survive_objective + add_objective(traitor, /datum/objective/escape_obj/survive) else - var/datum/objective/escape/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective + add_objective(traitor, /datum/objective/escape_obj/escape) else ..() // Give them standard objectives. diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 8e1466ef7f8..1efb4626f09 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -89,25 +89,14 @@ var/objective_count = 0 if(prob(10)) - var/datum/objective/block/block_objective = new - block_objective.owner = traitor - traitor.objectives += block_objective - objective_count++ + add_objective(traitor, /datum/objective/escape_obj/block) for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - - var/datum/objective/survive/survive_objective = new - survive_objective.owner = traitor - traitor.objectives += survive_objective + add_objective(traitor, /datum/objective/default/assassinate) + add_objective(traitor, /datum/objective/escape_obj/survive) else - var/is_hijacker = prob(10) - var/martyr_chance = prob(20) - var/objective_count = is_hijacker //Hijacking counts towards number of objectives + var/objective_count = 0 if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors if(!exchange_red) exchange_red = traitor @@ -116,56 +105,7 @@ assign_exchange_role(exchange_red) assign_exchange_role(exchange_blue) objective_count += 1 //Exchange counts towards number of objectives - var/list/active_ais = active_ais() - for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - if(prob(50)) - if(active_ais.len && prob(100/joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = traitor - destroy_objective.find_target() - traitor.objectives += destroy_objective - else if(prob(30)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = traitor - maroon_objective.find_target() - traitor.objectives += maroon_objective - else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective - - if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount - if (!(locate(/datum/objective/hijack) in traitor.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = traitor - traitor.objectives += hijack_objective - return - - - var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. - for(var/datum/objective/O in traitor.objectives) - if(!O.martyr_compatible) - martyr_compatibility = 0 - break - - if(martyr_compatibility && martyr_chance) - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = traitor - traitor.objectives += martyr_objective - return - - else - if(!(locate(/datum/objective/escape) in traitor.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective - return + generate_objectives(traitor, config.traitor_objectives_amount - objective_count, TRUE) @@ -333,13 +273,13 @@ faction = "blue" //Assign objectives - var/datum/objective/steal/exchange/exchange_objective = new + var/datum/objective/default/steal/exchange/exchange_objective = new exchange_objective.set_faction(faction,((faction == "red") ? exchange_blue : exchange_red)) exchange_objective.owner = owner owner.objectives += exchange_objective if(prob(20)) - var/datum/objective/steal/exchange/backstab/backstab_objective = new + var/datum/objective/default/steal/exchange/backstab/backstab_objective = new backstab_objective.set_faction(faction) backstab_objective.owner = owner owner.objectives += backstab_objective diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index e8a862d7aa4..9ba6d74ce4a 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -254,7 +254,7 @@ var/global/list/multiverse = list() evil = TRUE else user << "With your new found power you could easily defend the station!" - var/datum/objective/survive/new_objective = new /datum/objective/survive + var/datum/objective/escape_obj/survive/new_objective = new /datum/objective/escape_obj/survive new_objective.owner = usr.mind new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." usr << "Objective #[1]: [new_objective.explanation_text]" @@ -302,15 +302,15 @@ var/global/list/multiverse = list() equip_copy(M) if(evil) - var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone - hijack_objective.owner = M.mind - M.mind.objectives += hijack_objective - hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" - M << "Objective #[1]: [hijack_objective.explanation_text]" + var/datum/objective/hijackclone/new_objective = add_objective(M.mind, /datum/objective/hijackclone) + new_objective.owner = M.mind + M.mind.objectives += new_objective + new_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" + M << "Objective #[1]: [new_objective.explanation_text]" M.mind.special_role = "multiverse traveller" log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") else - var/datum/objective/protect/new_objective = new /datum/objective/protect + var/datum/objective/default/protect/new_objective = add_objective(M.mind, /datum/objective/default/protect) new_objective.owner = M.mind new_objective.target = usr.mind new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index c8acec3b497..b55db26e1e1 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,7 +1,7 @@ //In this file: Summon Magic/Summon Guns/Summon Events /proc/rightandwrong(summon_type, mob/user, survivor_probability) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi") + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi","alienpistol","dragnet","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","bulldog","grenadelauncher","goldenrevolver","sniper","medibeam","scatterbeam") var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor","voodoo", "special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic") @@ -32,66 +32,92 @@ var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) if(!summon_type) + var/obj/item/weapon/gun/G switch (randomizeguns) if("taser") - new /obj/item/weapon/gun/energy/gun/advtaser(get_turf(H)) + G = new /obj/item/weapon/gun/energy/gun/advtaser(get_turf(H)) if("egun") - new /obj/item/weapon/gun/energy/gun(get_turf(H)) + G = new /obj/item/weapon/gun/energy/gun(get_turf(H)) if("laser") - new /obj/item/weapon/gun/energy/laser(get_turf(H)) + G = new /obj/item/weapon/gun/energy/laser(get_turf(H)) if("revolver") - new /obj/item/weapon/gun/projectile/revolver(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/revolver(get_turf(H)) if("detective") - new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H)) if("deagle") - new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) if("gyrojet") - new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H)) if("pulse") - new /obj/item/weapon/gun/energy/pulse(get_turf(H)) + G = new /obj/item/weapon/gun/energy/pulse(get_turf(H)) if("suppressed") - new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H)) new /obj/item/weapon/suppressor(get_turf(H)) if("doublebarrel") - new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H)) if("shotgun") - new /obj/item/weapon/gun/projectile/shotgun(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/shotgun(get_turf(H)) if("combatshotgun") - new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H)) if("arg") - new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) if("mateba") - new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) if("boltaction") - new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) if("speargun") - new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H)) if("uzi") - new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H)) + G = new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H)) if("cannon") - var/obj/item/weapon/gun/energy/lasercannon/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin //no authentication pins for spawned guns. fun allowed. + G = new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) if("crossbow") - var/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H)) if("nuclear") - var/obj/item/weapon/gun/energy/gun/nuclear/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("sabr") - var/obj/item/weapon/gun/projectile/automatic/proto/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H)) if("bulldog") - var/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) if("c20r") - var/obj/item/weapon/gun/projectile/automatic/c20r/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) if("saw") - var/obj/item/weapon/gun/projectile/automatic/l6_saw/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H)) if("car") - var/obj/item/weapon/gun/projectile/automatic/m90/gat = new(get_turf(H)) - gat.pin = new /obj/item/device/firing_pin + G = new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H)) + if("alienpistol") + G = new /obj/item/weapon/gun/energy/alien(get_turf(H)) + if("dragnet") + G = new /obj/item/weapon/gun/energy/gun/dragnet(get_turf(H)) + if("turret") + G = new /obj/item/weapon/gun/energy/gun/turret(get_turf(H)) + if("pulsecarbine") + G = new /obj/item/weapon/gun/energy/pulse/carbine(get_turf(H)) + if("decloner") + G = new /obj/item/weapon/gun/energy/decloner(get_turf(H)) + if("mindflayer") + G = new /obj/item/weapon/gun/energy/mindflayer(get_turf(H)) + if("hyperkinetic") + G = new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H)) + if("advplasmacutter") + G = new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H)) + if("wormhole") + G = new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H)) + if("wt550") + G = new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H)) + if("bulldog") + G = new /obj/item/weapon/gun/projectile/automatic/shotgun(get_turf(H)) + if("grenadelauncher") + G = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H)) + if("goldenrevolver") + G = new /obj/item/weapon/gun/projectile/revolver/golden(get_turf(H)) + if("sniper") + G = new /obj/item/weapon/gun/projectile/sniper_rifle(get_turf(H)) + if("medibeam") + G = new /obj/item/weapon/gun/medbeam(get_turf(H)) + if("scatterbeam") + G = new /obj/item/weapon/gun/energy/laser/scatter(get_turf(H)) + G.unlock() playsound(get_turf(H),'sound/magic/Summon_guns.ogg', 50, 1) else diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index ce031d5d4d2..84b9e6da663 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -238,27 +238,11 @@ /obj/item/device/soulstone/proc/getCultGhost(obj/item/device/soulstone/C, mob/living/carbon/human/T, mob/U) - var/list/candidates = get_candidates(ROLE_CULTIST) - shuffle(candidates) - - var/time_passed = world.time - var/list/consenting_candidates = list() - - for(var/candidate in candidates) - - spawn(0) - switch(alert(candidate, "Would you like to play as a Shade? Please choose quickly!","Confirmation","Yes","No")) - if("Yes") - if((world.time-time_passed)>=50 || !src) - return - consenting_candidates += candidate - - sleep(50) + var/list/consenting_candidates = pollCandidates("Would you like to play as a Shade?", be_special_flag = ROLE_CULTIST, poll_time = 100) if(!T) //target mob got soulstoned or gibbed during sleep(50) return 0 - listclearnulls(consenting_candidates) //some candidates might have left during sleep(50) if(consenting_candidates.len) var/client/ghost = null diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index cb04b9085df..9d09dbdd948 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -207,6 +207,11 @@ spell_type = /obj/effect/proc_holder/spell/targeted/lightning log_name = "LB" +/datum/spellbook_entry/infinite_guns + name = "Lesser Summon Guns" + spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns + log_name = "IG" + /datum/spellbook_entry/barnyard name = "Barnyard Curse" spell_type = /obj/effect/proc_holder/spell/targeted/barnyardcurse diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 1dac752b967..e8aa52cf4a4 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -48,51 +48,7 @@ /datum/game_mode/proc/forge_wizard_objectives(datum/mind/wizard) - switch(rand(1,100)) - if(1 to 30) - - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives += kill_objective - - if (!(locate(/datum/objective/escape) in wizard.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = wizard - wizard.objectives += escape_objective - if(31 to 60) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives += steal_objective - - if (!(locate(/datum/objective/escape) in wizard.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = wizard - wizard.objectives += escape_objective - - if(61 to 85) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives += kill_objective - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives += steal_objective - - if (!(locate(/datum/objective/survive) in wizard.objectives)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = wizard - wizard.objectives += survive_objective - - else - if (!(locate(/datum/objective/hijack) in wizard.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = wizard - wizard.objectives += hijack_objective - return + generate_objectives(wizard, 2) /datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob) diff --git a/code/game/jobs/job/cargo_service.dm b/code/game/jobs/job/cargo_service.dm index 496aa1d9a38..cd512286c10 100644 --- a/code/game/jobs/job/cargo_service.dm +++ b/code/game/jobs/job/cargo_service.dm @@ -117,7 +117,8 @@ Bartender uniform = /obj/item/clothing/under/rank/bartender suit = /obj/item/clothing/suit/armor/vest backpack_contents = list(/obj/item/ammo_casing/shotgun/beanbag=4) - + shoes = /obj/item/clothing/shoes/laceup + /* Cook */ @@ -211,4 +212,4 @@ Janitor belt = /obj/item/device/pda/janitor ears = /obj/item/device/radio/headset/headset_srv - uniform = /obj/item/clothing/under/rank/janitor \ No newline at end of file + uniform = /obj/item/clothing/under/rank/janitor diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 1756bb2945a..0289a76ace8 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -153,7 +153,7 @@ Lawyer uniform = /obj/item/clothing/under/lawyer/bluesuit suit = /obj/item/clothing/suit/toggle/lawyer shoes = /obj/item/clothing/shoes/laceup - l_hand = /obj/item/weapon/storage/briefcase + l_hand = /obj/item/weapon/storage/briefcase/lawyer l_pocket = /obj/item/device/laser_pointer /datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -166,4 +166,4 @@ Lawyer J.lawyers++ if(J.lawyers>1) uniform = /obj/item/clothing/under/lawyer/purpsuit - suit = /obj/item/clothing/suit/toggle/lawyer/purple \ No newline at end of file + suit = /obj/item/clothing/suit/toggle/lawyer/purple diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index c27fb9ecb99..9bcf2624df8 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -187,8 +187,8 @@ else if (!shorted) ui_interact(user) -/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) ui = new(user, src, ui_key, "air_alarm", name, 480, 660) ui.open() @@ -358,9 +358,9 @@ var/list/thresholds = list() var/list/gas_names = list( - "oxygen" = "O2", - "nitrogen" = "N2", - "carbon dioxide" = "CO2", + "oxygen" = "Oxygen", + "nitrogen" = "Nitrogen", + "carbon dioxide" = "Carbon Dioxide", "plasma" = "Toxin", "other" = "Other") for (var/g in gas_names) @@ -401,51 +401,50 @@ if (usr.has_unlimited_silicon_privilege && src.aidisabled) return + var/device_id = params["id_tag"] switch(action) - if("toggleaccess") + if("lock") if(usr.has_unlimited_silicon_privilege && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked - if("adjust") - var/device_id = params["id_tag"] - switch(params["command"]) - if("set_external_pressure") + if( + "power", + "co2_scrub", + "tox_scrub", + "n2o_scrub", + "widenet", + "scrubbing" + ) + send_signal(device_id, list("[action]" = text2num(params["val"]))) + if("excheck") + send_signal(device_id, list("checks" = text2num(params["val"])^1)) + if("incheck") + send_signal(device_id, list("checks" = text2num(params["val"])^2)) + if("external_pressure") + switch(params["pressure"]) + if("reset") + send_signal(device_id, list("set_external_pressure" = ONE_ATMOSPHERE)) + else if("custom") var/input_pressure = input("Enter target pressure:", "Pressure Controls") as num|null if(isnum(input_pressure)) - send_signal(device_id, list(params["command"] = input_pressure)) - if("reset_external_pressure") - send_signal(device_id, list("set_external_pressure" = ONE_ATMOSPHERE)) - if( - "power", - "adjust_external_pressure", - "co2_scrub", - "tox_scrub", - "n2o_scrub", - "widenet", - "scrubbing" - ) - send_signal(device_id, list (params["command"] = text2num(params["val"]))) - if ("excheck") - send_signal(device_id, list ("checks" = text2num(params["val"])^1)) - if ("incheck") - send_signal(device_id, list ("checks" = text2num(params["val"])^2)) - if("set_threshold") - var/env = params["env"] - var/varname = params["var"] - var/datum/tlv/tlv = TLV[env] - var/newval = input("Enter [varname] for [env]:", "Alarm Triggers", tlv.vars[varname]) as num|null - if (isnull(newval)) - return - if (newval<0) - tlv.vars[varname] = -1 - else if (env=="temperature" && newval>5000) - tlv.vars[varname] = 5000 - else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) - tlv.vars[varname] = 50*ONE_ATMOSPHERE - else if (env!="temperature" && env!="pressure" && newval>200) - tlv.vars[varname] = 200 - else - newval = round(newval,0.01) - tlv.vars[varname] = newval + send_signal(device_id, list("set_external_pressure" = input_pressure)) + if("threshold") + var/env = params["env"] + var/varname = params["var"] + var/datum/tlv/tlv = TLV[env] + var/newval = input("Enter [varname] for [env]:", "Alarm Triggers", tlv.vars[varname]) as num|null + if (isnull(newval)) + return + if (newval<0) + tlv.vars[varname] = -1 + else if (env=="temperature" && newval>5000) + tlv.vars[varname] = 5000 + else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) + tlv.vars[varname] = 50*ONE_ATMOSPHERE + else if (env!="temperature" && env!="pressure" && newval>200) + tlv.vars[varname] = 200 + else + newval = round(newval,0.01) + tlv.vars[varname] = newval if("screen") screen = text2num(params["screen"]) if("mode") diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3d0cb1bd520..20eac90dae2 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -273,10 +273,10 @@ update_flag return ui_interact(user) -/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "canister", name, 470, 470, state = physical_state) + ui = new(user, src, ui_key, "canister", name, 405, 405, state = physical_state) ui.open() /obj/machinery/portable_atmospherics/canister/get_ui_data() @@ -304,7 +304,7 @@ update_flag switch(action) if("relabel") - if (can_label) + if(can_label) var/list/colors = list(\ "\[N2O\]" = "redws", \ "\[N2\]" = "red", \ @@ -320,7 +320,7 @@ update_flag src.icon_state = colors[label] src.name = "canister: [label]" if("pressure") - switch(params["set"]) + switch(params["pressure"]) if("custom") var/custom = input(usr, "What rate do you set the regulator to? The dial reads from [CAN_MIN_RELEASE_PRESSURE] to [CAN_MAX_RELEASE_PRESSURE].") as null|num if(custom) @@ -334,13 +334,13 @@ update_flag release_pressure = Clamp(round(release_pressure), CAN_MIN_RELEASE_PRESSURE, CAN_MAX_RELEASE_PRESSURE) if("valve") var/logmsg - if (valve_open) - if (holding) + if(valve_open) + if(holding) logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the [holding]
" else logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the air
" else - if (holding) + if(holding) logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the [holding]
" else logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air
" @@ -356,7 +356,7 @@ update_flag valve_open = !valve_open if("eject") if(holding) - if (valve_open) + if(valve_open) investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the air
", "atmos") holding.loc = loc holding = null diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 8ae89897c73..cae5d5e445d 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -68,8 +68,10 @@ if(C) if ((get_dist(user, src) > 1 || user.machine != src || user.eye_blind || !( C.can_use() )) && (!istype(user, /mob/living/silicon/ai))) + user.unset_machine() if(!C.can_use() && !isAI(user)) src.current = null + return 0 else if(isAI(user)) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 9ac4e207cc3..a5b90751f49 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -59,7 +59,7 @@ dat += " Slaved to [R.connected_ai.name] |" else dat += " Independent from AI |" - if (istype(user, /mob/living/silicon)) + if (istype(user, /mob/living/silicon) || IsAdminGhost(usr)) if(((issilicon(user) && is_special_character(user)) || IsAdminGhost(usr)) && !R.emagged) dat += "(Hack) " dat += "([R.canmove ? "Lockdown" : "Release"]) " diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 25e30d87906..74869fafb76 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -818,7 +818,7 @@ About the new airlock wires panel: "You begin [welded ? "unwelding":"welding"] the airlock...", \ "You hear welding.") playsound(loc, 'sound/items/Welder.ogg', 40, 1) - if(do_after(user,40/C.toolspeed,5,1, target = src)) + if(do_after(user,40/C.toolspeed, 1, target = src)) if(density && !operating)//Door must be closed to weld. if( !istype(src, /obj/machinery/door/airlock) || !user || !W || !W.isOn() || !user.loc ) return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 8282a682489..55bfc93bc04 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -13,10 +13,10 @@ add_fingerprint(user) ui_interact(user) -/obj/item/weapon/electronics/airlock/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0) - SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/item/weapon/electronics/airlock/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0) + SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "airlock_electronics", name, 975, 415, state = hands_state) + ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, state = hands_state) ui.open() /obj/item/weapon/electronics/airlock/get_ui_data() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 2ea8377d817..d2c0ddf35ed 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -327,7 +327,7 @@ ae.loc = src.loc qdel(src) - return + return //If windoor is unpowered, crowbar, fireaxe and armblade can force it. diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 0e2495feaa5..366c3f56479 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,6 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED name = "\improper AI holopad" desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." icon_state = "holopad0" + layer = 2.1 flags = HEAR languages = ROBOT | HUMAN var/list/masters = list()//List of AIs that use the holopad @@ -145,10 +146,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(speaker && masters.len && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios. for(var/mob/living/silicon/ai/master in masters) if(masters[master] && speaker != master) - raw_message = master.lang_treat(speaker, message_langs, raw_message, spans) - var/name_used = speaker.GetVoice() - var/rendered = "Holopad received, [name_used] [raw_message]" - master.show_message(rendered, 2) + master.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans) /obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 698983bc823..c8471e64002 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -132,7 +132,7 @@ C.add_fingerprint(usr) user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") - SSnano.update_uis(src) + SStgui.update_uis(src) else user << "The hatch must be open to insert a power cell!" return @@ -150,16 +150,13 @@ /obj/machinery/space_heater/attack_hand(mob/user) interact(user) -/obj/machinery/space_heater/attack_paw(mob/user) - interact(user) - /obj/machinery/space_heater/interact(mob/user) ui_interact(user) -/obj/machinery/space_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/space_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "space_heater", name, 490, 340, state = physical_state) + ui = new(user, src, ui_key, "space_heater", name, 400, 305, state = physical_state) ui.open() /obj/machinery/space_heater/ui_act(action, params) @@ -174,41 +171,24 @@ update_icon() if("mode") setMode = params["mode"] - if("temp") + if("target") if(panel_open) var/value - if(params["set"] == "custom") + if(params["target"] == "custom") value = input("Please input the target temperature", name) as num|null if(isnull(value)) return value += T0C else - value = targetTemperature + text2num(params["set"]) + value = targetTemperature + text2num(params["target"]) var/minTemp = max(settableTemperatureMedian - settableTemperatureRange, TCMB) var/maxTemp = settableTemperatureMedian + settableTemperatureRange targetTemperature = dd_range(minTemp, maxTemp, round(value, 1)) - if("ejectcell") - if(panel_open && cell) - if(usr.get_active_hand()) - usr << "You need an empty hand to remove \the [cell]!" - return - cell.updateicon() - usr.put_in_hands(cell) - cell.add_fingerprint(usr) - usr.visible_message("\The [usr] removes \the [cell] from \the [src].", "You remove \the [cell] from \the [src].") + if("eject") + if(cell) + cell.loc = get_turf(src) cell = null - if("installcell") - if(panel_open && !cell) - var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand() - if(istype(C)) - if(!usr.drop_item()) - return - cell = C - C.loc = src - C.add_fingerprint(usr) - usr.visible_message("\The [usr] inserts \a [C] into \the [src].", "You insert \the [C] into \the [src].") - add_fingerprint(usr) return 1 /obj/machinery/space_heater/process() diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index d8fce89f1ea..a97f4cc6bc0 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -80,18 +80,11 @@ custom_objective.owner = N.mind N.mind.objectives += custom_objective - var/datum/objective/escape/escape_objective = new - escape_objective.owner = N.mind - N.mind.objectives += escape_objective + add_objective(N.mind, /datum/objective/escape_obj/escape, 1) M << "You have joined the ranks of the Syndicate and become a traitor to the station!" - var/obj_count = 1 - for(var/datum/objective/OBJ in M.mind.objectives) - M << "Objective #[obj_count]: [OBJ.explanation_text]" - obj_count++ - src.updateUsrDialog() return diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index c78f4e9133a..756a72bb043 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -206,7 +206,7 @@ var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(newnet && ((usr in range(1, src)) || issilicon(usr))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index aad74e3e6eb..efdbdaa4c9c 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -109,7 +109,7 @@ if(href_list["network"]) var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(newnet && ((usr in range(1, src)) || issilicon(usr))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index ef9962cf0b4..4748c08ad48 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -45,14 +45,7 @@ ticker.mode.traitors += user.mind user.mind.special_role = "Avatar of the Wish Granter" - var/datum/objective/hijack/hijack = new - hijack.owner = user.mind - user.mind.objectives += hijack - - var/obj_count = 1 - for(var/datum/objective/OBJ in user.mind.objectives) - user << "Objective #[obj_count]: [OBJ.explanation_text]" - obj_count++ + add_objective(user.mind, /datum/objective/escape_obj/hijack, 1) user << "You have a very bad feeling about this." diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 5e63ba97c0c..fe31b39395a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -89,3 +89,84 @@ /obj/effect/mine/sound/bwoink name = "bwoink mine" sound = 'sound/effects/adminhelp.ogg' + +/obj/effect/mine/pickup + name = "pickup" + desc = "pick me up" + icon = 'icons/effects/effects.dmi' + icon_state = "electricity2" + density = 0 + var/duration = 0 + +/obj/effect/mine/pickup/New() + ..() + animate(src, pixel_y = 4, time = 20, loop = -1) + +/obj/effect/mine/pickup/triggermine(mob/victim) + if(triggered) + return + triggered = 1 + invisibility = 101 + mineEffect(victim) + qdel(src) + + +/obj/effect/mine/pickup/bloodbath + name = "Red Orb" + desc = "You feel angry just looking at it." + duration = 1200 //2min + color = "red" + +/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim) + if(!victim.client || !istype(victim)) + return + victim << "KILL EM ALL" + var/old_color = victim.client.color + var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0) + var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) + + spawn(0) + new /obj/effect/hallucination/delusion(victim.loc,victim,force_kind="demon",duration=duration,skip_nearby=0) + + var/obj/item/weapon/twohanded/required/chainsaw/chainsaw = new(victim.loc) + chainsaw.flags |= NODROP + victim.drop_r_hand() + victim.drop_l_hand() + victim.put_in_hands(chainsaw) + + victim.reagents.add_reagent("adminordrazine",25) + + victim.client.color = pure_red + animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT) + sleep(10) + animate(victim.client,color = old_color, time = duration)//, easing = SINE_EASING|EASE_OUT) + sleep(duration) + victim << "You feel calm again." + qdel(chainsaw) + qdel(src) + +/obj/effect/mine/pickup/healing + name = "Blue Orb" + desc = "You feel better just looking at it." + color = "blue" + +/obj/effect/mine/pickup/healing/mineEffect(mob/living/carbon/victim) + if(!victim.client || !istype(victim)) + return + victim << "You feel great!" + victim.revive() + +/obj/effect/mine/pickup/speed + name = "Yellow Orb" + desc = "You feel faster just looking at it." + color = "yellow" + duration = 300 + +/obj/effect/mine/pickup/speed/mineEffect(mob/living/carbon/victim) + if(!victim.client || !istype(victim)) + return + victim << "You feel fast!" + victim.status_flags |= GOTTAGOREALLYFAST + sleep(duration) + victim.status_flags &= ~GOTTAGOREALLYFAST + victim << "You slow down." \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c80c0e8634c..58138a2999d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -102,6 +102,25 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s var/block_chance = 0 var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom + //The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. + var/list/slot_equipment_priority = list( \ + slot_back,\ + slot_wear_id,\ + slot_w_uniform,\ + slot_wear_suit,\ + slot_wear_mask,\ + slot_head,\ + slot_shoes,\ + slot_gloves,\ + slot_ears,\ + slot_glasses,\ + slot_belt,\ + slot_s_store,\ + slot_l_store,\ + slot_r_store,\ + slot_drone_storage\ + ) + /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) if(((src in target) && !target_self) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside)) || is_type_in_list(target, can_be_placed_into)) return 0 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 590dcb2731c..e49f4b19ace 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -719,7 +719,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!message || !targets.len) return - + if(last_text && world.time < last_text + 5) return @@ -739,17 +739,17 @@ var/global/list/obj/item/device/pda/PDAs = list() show_to_sender(msg) P.show_recieved_message(msg,src) if(!multiple) - show_to_ghosts(msg) + show_to_ghosts(user,msg) log_pda("[user] (PDA: [src.name]) sent \"[message]\" to [P.name]") else if(!multiple) user << "ERROR: Server isn't responding." return photo = null - + if(multiple) show_to_sender(last_sucessful_msg,1) - show_to_ghosts(last_sucessful_msg,1) + show_to_ghosts(user,last_sucessful_msg,1) log_pda("[user] (PDA: [src.name]) sent \"[message]\" to Everyone") /obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0) @@ -769,16 +769,16 @@ var/global/list/obj/item/device/pda/PDAs = list() else L = get(src, /mob/living/silicon) - if(L) + if(L && L.stat != UNCONSCIOUS) L << "\icon[src] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)" overlays.Cut() overlays += image(icon, icon_alert) -/obj/item/device/pda/proc/show_to_ghosts(datum/data_pda_msg/msg,multiple = 0) +/obj/item/device/pda/proc/show_to_ghosts(mob/living/user, datum/data_pda_msg/msg,multiple = 0) for(var/mob/M in player_list) if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA)) - M.show_message("PDA Message - [msg.sender] -> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]") + M.show_message("(F) [msg.sender] PDA Message --> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]") /obj/item/device/pda/proc/can_send(obj/item/device/pda/P) if(!P || qdeleted(P) || P.toff) @@ -808,7 +808,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(useTC == 2) return useMS else - return null + return null /obj/item/device/pda/proc/send_to_all(mob/living/U = usr) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 5e6a85914ed..f0c0e0c01b4 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -11,11 +11,14 @@ origin_tech = "syndicate=4;magnets=4" var/can_use = 1 var/obj/effect/dummy/chameleon/active_dummy = null + var/saved_appearance = null + /* var/saved_item = /obj/item/weapon/cigbutt var/saved_icon = 'icons/obj/clothing/masks.dmi' var/saved_icon_state = "cigbutt" var/saved_overlays = null var/saved_underlays = null + */ /obj/item/device/chameleon/dropped() disrupt() @@ -32,14 +35,13 @@ if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear)) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) user << "Scanned [target]." - saved_item = target.type - saved_icon = target.icon - saved_icon_state = target.icon_state - saved_overlays = target.overlays - saved_underlays = target.underlays + var/obj/temp = new/obj() + temp.appearance = target.appearance + temp.layer = initial(target.layer) // scanning things in your inventory + saved_appearance = temp.appearance /obj/item/device/chameleon/proc/toggle() - if(!can_use || !saved_item) return + if(!can_use || !saved_appearance) return if(active_dummy) eject_all() playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) @@ -53,11 +55,8 @@ qdel(T) else playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) - var/obj/O = new saved_item(src) - if(!O) return var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) - C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, saved_underlays, src) - qdel(O) + C.activate(usr, saved_appearance, src) usr << "You activate \the [src]." var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' @@ -89,18 +88,11 @@ name = "" desc = "" density = 0 - anchored = 1 var/can_move = 1 var/obj/item/device/chameleon/master = null -/obj/effect/dummy/chameleon/proc/activate(obj/O, mob/M, new_icon, new_iconstate, new_overlays, new_underlays, obj/item/device/chameleon/C) - name = O.name - desc = O.desc - icon = new_icon - icon_state = new_iconstate - overlays = new_overlays - underlays = new_underlays - dir = O.dir +/obj/effect/dummy/chameleon/proc/activate(mob/M, saved_appearance, obj/item/device/chameleon/C) + appearance = saved_appearance M.loc = src master = C master.active_dummy = src diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 725924a7617..954302bf055 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -158,7 +158,7 @@ dat+=text_sec_channel(ch_name, channels[ch_name]) dat+= text_wires() if (command) - dat+= "High Volume Mode: [use_command ? "Engaged" : "Disengaged"]
" + dat+= "High Volume Mode: [use_command ? "Engaged" : "Disengaged"]
" var/datum/browser/popup = new(user, "radio", "[src]") popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index a8d2dc4a249..483f8d6cc1a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -105,6 +105,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("wooden buckler", /obj/item/weapon/shield/riot/buckler, 20, time = 40), \ ) /obj/item/stack/sheet/mineral/wood diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 46aebec6018..c1c8fef41a7 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -17,11 +17,14 @@ var/is_cyborg = 0 // It's 1 if module is used by a cyborg, and uses its storage var/datum/robot_energy_storage/source var/cost = 1 // How much energy from storage it costs + var/merge_type = null // This path and its children should merge with this stack, defaults to src.type /obj/item/stack/New(var/loc, var/amount=null) ..() if (amount) src.amount = amount + if(!merge_type) + merge_type = src.type return /obj/item/stack/Destroy() @@ -208,19 +211,19 @@ S.add(transfer) /obj/item/stack/Crossed(obj/o) - if(istype(o, src.type) && !o.throwing) + if(istype(o, merge_type) && !o.throwing) merge(o) return ..() /obj/item/stack/hitby(atom/movable/AM, skip, hitpush) - if(istype(AM, src.type)) + if(istype(AM, merge_type)) merge(AM) return ..() /obj/item/stack/attack_hand(mob/user) if (user.get_inactive_hand() == src) if(zero_amount()) return - var/obj/item/stack/F = new src.type( user, 1) + var/obj/item/stack/F = new src.type(user, 1) . = F F.copy_evidences(src) user.put_in_hands(F) @@ -234,7 +237,7 @@ return /obj/item/stack/attackby(obj/item/W, mob/user, params) - if(istype(W, src.type)) + if(istype(W, merge_type)) var/obj/item/stack/S = W merge(S) user << "Your [S.name] stack now contains [S.get_amount()] [S.singular_name]\s." @@ -268,4 +271,4 @@ src.max_res_amount = max_res_amount src.time = time src.one_per_turf = one_per_turf - src.on_floor = on_floor \ No newline at end of file + src.on_floor = on_floor diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 3424af801f5..309bea1a0de 100755 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -321,6 +321,7 @@ attack_verb = list("attacked", "coloured") var/paint_color = "#FF0000" //RGB var/drawtype = "rune" + var/text_buffer = "" var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag") var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") var/list/numerals = list("0","1","2","3","4","5","6","7","8","9") @@ -357,6 +358,7 @@ /obj/item/toy/crayon/proc/update_window(mob/living/user) dat += "

Currently selected: [drawtype]


" dat += "Random letterPick letter/number" + dat += "Write" dat += "
" dat += "

Runes:


" dat += "Random rune" @@ -381,19 +383,30 @@ popup.open() dat = "" +/obj/item/toy/crayon/proc/crayon_text_strip(text) + var/list/base = text2list(lowertext(text),"") + var/list/out = list() + for(var/a in base) + if(a in (letters|numerals)) + out += a + return list2text(out) + /obj/item/toy/crayon/Topic(href, href_list, hsrc) var/temp = "a" - switch(href_list["type"]) - if("random_letter") - temp = pick(letters) - if("letter") - temp = input("Choose what to write.", "Scribbles") in (letters|numerals) - if("random_rune") - temp = "rune[rand(1,6)]" - if("random_graffiti") - temp = pick(graffiti) - else - temp = href_list["type"] + if(href_list["buffer"]) + text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer)) + if(href_list["type"]) + switch(href_list["type"]) + if("random_letter") + temp = pick(letters) + if("letter") + temp = input("Choose what to write.", "Scribbles") in (letters|numerals) + if("random_rune") + temp = "rune[rand(1,6)]" + if("random_graffiti") + temp = pick(graffiti) + else + temp = href_list["type"] if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) return drawtype = temp @@ -409,6 +422,7 @@ if(istype(target, /obj/effect/decal/cleanable)) target = target.loc if(is_type_in_list(target,validSurfaces)) + var/temp = "rune" if(letters.Find(drawtype)) temp = "letter" @@ -457,6 +471,10 @@ playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) if((instant>0) || do_after(user, 50, target = target)) + if(length(text_buffer)) + drawtype = copytext(text_buffer,1,2) + text_buffer = copytext(text_buffer,2) + //Gang functions if(gangID) //Delete any old markings on this tile, including other gang tags diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index d0891d42d8d..3eb2d6aa3b7 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -60,13 +60,6 @@ AI MODULES user << "Upload complete. [reciever]'s laws have been modified." reciever.show_laws() reciever.law_change_counter++ - if(isAI(reciever)) - var/mob/living/silicon/ai/A = reciever - for(var/mob/living/silicon/robot/R in A.connected_robots) - if(R.lawupdate) - R << "From now on, these are your laws:" - R.show_laws() - R.law_change_counter++ var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [reciever.name]([reciever.key]).[law2log ? " The law specified [law2log]" : ""]") @@ -360,9 +353,9 @@ AI MODULES /obj/item/weapon/aiModule/core/full/robocop name = "'Robo-Officer' Core AI Module" origin_tech = "programming=4" - laws = list("Uphold the law.",\ - "Protect the innocent.",\ - "Serve the public trust.") + laws = list("Serve the public trust.",\ + "Protect the innocent",\ + "Uphold the law.") /******************** Antimov ********************/ diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index a69655548ca..2fe704d5760 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -89,7 +89,7 @@ else user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ "You begin to wipe off [H]'s lipstick...") - if(do_after(user, 10, target = H) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not. + if(do_after(user, 10, target = H)) user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ "You wipe off [H]'s lipstick.") H.lip_style = null diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 9d09a3b0cf8..21eed445b28 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -145,15 +145,9 @@ step_towards(W,my_target) if(!W || !W.reagents) return W.reagents.reaction(get_turf(W)) - for(var/atom/atm in get_turf(W)) + for(var/A in get_turf(W)) if(!W) return - W.reagents.reaction(atm) - if(isliving(atm)) //For extinguishing mobs on fire - var/mob/living/M = atm - M.ExtinguishMob() - if(istype(atm,/obj/item)) - var/obj/item/Item = atm - Item.extinguish() + W.reagents.reaction(A) if(W.loc == my_target) break sleep(2) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index bdb527ff358..723725e46f5 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -19,6 +19,7 @@ var/obj/item/weapon/weldingtool/weldtool = null var/obj/item/device/assembly/igniter/igniter = null var/obj/item/weapon/tank/internals/plasma/ptank = null + var/warned_admins = 0 //for the message_admins() when lit /obj/item/weapon/flamethrower/Destroy() @@ -144,6 +145,9 @@ lit = !lit if(lit) SSobj.processing |= src + if(!warned_admins) + message_admins("[key_name_admin(usr)]? (FLW) has lit a flamethrower.") + warned_admins = 1 if(href_list["amount"]) throw_amount = throw_amount + text2num(href_list["amount"]) throw_amount = max(50, min(5000, throw_amount)) @@ -226,4 +230,4 @@ var/target_turf = get_turf(owner) ignite_turf(target_turf, 100) qdel(ptank) - return 1 //It hit the flamethrower, not them \ No newline at end of file + return 1 //It hit the flamethrower, not them diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index a6a525541d5..f7037ee5516 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -441,6 +441,25 @@ beakers += B1 beakers += B2 +/obj/item/weapon/grenade/chem_grenade/tuberculosis + name = "Fungal tuberculosis grenade" + desc = "WARNING: GRENADE WILL RELEASE DEADLY SPORES CONTAINING ACTIVE AGENTS. SEAL SUIT AND AIRFLOW BEFORE USE." + stage = READY + +/obj/item/weapon/grenade/chem_grenade/tuberculosis/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src) + + B1.reagents.add_reagent("potassium", 50) + B1.reagents.add_reagent("phosphorus", 50) + B1.reagents.add_reagent("fungalspores", 200) + B2.reagents.add_reagent("blood", 250) + B2.reagents.add_reagent("sugar", 50) + + beakers += B1 + beakers += B2 + #undef EMPTY #undef WIRED #undef READY diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index 93e09950eb3..4feac56d880 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -15,4 +15,9 @@ name = "HE Grenade" desc = "A compact shrapnel grenade meant to devestate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction." icon_state = "concussion" - origin_tech = "materials=3;magnets=4;syndicate=2" \ No newline at end of file + origin_tech = "materials=3;magnets=4;syndicate=2" + +/obj/item/weapon/grenade/syndieminibomb/concussion/prime() + update_mob() + explosion(src.loc,0,2,3,flame_range = 3) + qdel(src) diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 15893990d48..e5b7b2df05f 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -2,7 +2,9 @@ * Contains: * Fork * Kitchen knives + * Ritual Knife * Butcher's cleaver + * Combat Knife * Rolling Pins */ @@ -86,6 +88,17 @@ attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") w_class = 3 +/obj/item/weapon/kitchen/knife/combat + name = "combat knife" + icon_state = "buckknife" + item_state = "knife" + desc = "A military combat utility survival knife." + force = 20 + throwforce = 20 + origin_tech = "materials=2;combat=4" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") + + /obj/item/weapon/kitchen/rollingpin name = "rolling pin" desc = "Used to knock out the Bartender." diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index d27084d1b23..d884853d8df 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "riot" slot_flags = SLOT_BACK - force = 8 + force = 10 throwforce = 5 throw_speed = 2 throw_range = 3 @@ -39,6 +39,15 @@ icon_state = "roman_shield" item_state = "roman_shield" +/obj/item/weapon/shield/riot/buckler + name = "wooden buckler" + desc = "A medieval wooden buckler." + icon_state = "buckler" + item_state = "buckler" + materials = list() + burn_state = FLAMMABLE + block_chance = 30 + /obj/item/weapon/shield/energy name = "energy combat shield" desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere." diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index deabe13233d..e36882889e3 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -439,7 +439,7 @@ return /obj/item/weapon/storage/backpack/dufflebag/syndie/m90glbundle - desc = "A large dufflebag containing a M90gl, a magazine, and a stimpack." + desc = "A large dufflebag containing an M90gl, a magazine, four additional grenades, and a pack of Syndicate cigarettes." /obj/item/weapon/storage/backpack/dufflebag/syndie/m90glbundle/New() ..() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 5ef8feef8d0..7e53d4a443d 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -100,6 +100,7 @@ /obj/item/ammo_box, /obj/item/weapon/reagent_containers/food/snacks/donut, /obj/item/weapon/reagent_containers/food/snacks/donut/jelly, + /obj/item/weapon/kitchen/knife/combat, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic ) @@ -145,6 +146,14 @@ icon_state = "militarybelt" item_state = "military" +/obj/item/weapon/storage/belt/military/assault + name = "assault belt" + desc = "A tactical assault belt." + icon_state = "assaultbelt" + item_state = "security" + storage_slots = 6 + + /obj/item/weapon/storage/belt/wands name = "wand belt" desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic." @@ -189,7 +198,7 @@ desc = "A bandolier for holding shotgun ammunition." icon_state = "bandolier" item_state = "bandolier" - storage_slots = 6 + storage_slots = 8 can_hold = list( /obj/item/ammo_casing/shotgun ) diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 728d2a99ea1..af55712f0ae 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -13,17 +13,22 @@ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") burn_state = FLAMMABLE burntime = 20 + var/folder_path = /obj/item/weapon/folder //this is the path of the folder that gets spawned in New() /obj/item/weapon/storage/briefcase/New() ..() - new /obj/item/weapon/paper(src) - new /obj/item/weapon/paper(src) - new /obj/item/weapon/paper(src) - new /obj/item/weapon/paper(src) - new /obj/item/weapon/paper(src) - new /obj/item/weapon/paper(src) new /obj/item/weapon/pen(src) + var/obj/item/weapon/folder/folder = new folder_path(src) + for(var/i in 1 to 6) + new /obj/item/weapon/paper(folder) +/obj/item/weapon/storage/briefcase/lawyer + folder_path = /obj/item/weapon/folder/blue + +/obj/item/weapon/storage/briefcase/lawyer/New() + new /obj/item/weapon/stamp/law(src) + ..() + /obj/item/weapon/storage/briefcase/sniperbundle name = "briefcase" desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps." diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 2ccaa9071f0..6b2d688e5dd 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -240,3 +240,31 @@ new /obj/item/weapon/screwdriver/nuke(src) new /obj/item/nuke_core_container(src) new /obj/item/weapon/paper/nuke_instructions(src) + + +/obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade + name = "boxed virus grenade kit" + +/obj/item/weapon/storage/box/virus_kit/tuberculosisgrenade/New() + ..() + new /obj/item/weapon/grenade/chem_grenade/tuberculosis(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/syringe(src) + new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) + return + +/obj/item/weapon/storage/box/syndie_kit/tuberculosiskit + name = "boxed virus kit" + +/obj/item/weapon/storage/box/virus_kit/tuberculosiskit/New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosis(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/syringe(src) + new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) + return + diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 586e3a47ddc..aa55051c783 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -14,7 +14,7 @@ name = "oxygen tank" desc = "A tank of oxygen." icon_state = "oxygen" - distribute_pressure = 16 + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE force = 10 @@ -156,7 +156,7 @@ slot_flags = SLOT_BELT w_class = 2 force = 4 - distribute_pressure = ONE_ATMOSPHERE*O2STANDARD + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index f3d5ead1b88..11770f8fcf1 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,7 +1,3 @@ -#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) -#define TANK_MIN_RELEASE_PRESSURE 0 -#define TANK_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE*O2STANDARD) - /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' @@ -119,10 +115,10 @@ add_fingerprint(user) ui_interact(user) -/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "tanks", name, 525, 210, state = inventory_state) + ui = new(user, src, ui_key, "tanks", name, 400, 200, state = inventory_state) ui.open() /obj/item/weapon/tank/get_ui_data() @@ -144,14 +140,12 @@ if(istype(location)) var/mask_check = 0 - if(location.internal == src) // if tank is current internal mask_check = 1 data["valveOpen"] = 1 else if(src in location) // or if tank is in the mobs possession if(!location.internal) // and they do not have any active internals mask_check = 1 - if(mask_check) if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS)) data["maskConnected"] = 1 @@ -163,7 +157,7 @@ switch(action) if("pressure") - switch(params["set"]) + switch(params["pressure"]) if("custom") var/custom = input(usr, "What rate do you set the regulator to? The dial reads from 0 to [TANK_MAX_RELEASE_PRESSURE].") as null|num if(isnum(custom)) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 1ab5437d9db..38a348bbfcb 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -214,7 +214,7 @@ return user << "You begin cutting \the [src] apart..." playsound(loc, cutting_sound, 40, 1) - if(do_after(user,40/W.toolspeed,5,1, target = src)) + if(do_after(user,40/W.toolspeed,1, target = src)) if( !opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc ) return playsound(loc, cutting_sound, 50, 1) @@ -234,7 +234,7 @@ if(WT.remove_fuel(0,user)) user << "You begin [welded ? "unwelding":"welding"] \the [src]..." playsound(loc, 'sound/items/Welder2.ogg', 40, 1) - if(do_after(user,40,5,1, target = src)) + if(do_after(user,40,1, target = src)) if(opened || !istype(src, /obj/structure/closet) || !user || !WT || !WT.isOn() || !user.loc ) return playsound(loc, 'sound/items/welder.ogg', 50, 1) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index b1802b6f7a6..019e596c5db 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -48,10 +48,10 @@ s.set_up(12, 1, src) s.start() if(buckled_mob) - buckled_mob.burn_skin(85) + buckled_mob.electrocute_act(85, src, 1) buckled_mob << "You feel a deep shock course through your body!" sleep(1) - buckled_mob.burn_skin(85) + buckled_mob.electrocute_act(85, src, 1) visible_message("The electric chair went off!", "You hear a deep sharp shock!") A.power_light = light diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index d9333d6e123..521d01bfbec 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -157,217 +157,3 @@ if(signs) overlays += "cart_sign[signs]" - -//old style PIMP-CART -/obj/structure/bed/chair/janicart - name = "janicart" - desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." - icon = 'icons/obj/vehicles.dmi' - icon_state = "pussywagon" - anchored = 0 - density = 1 - var/obj/item/weapon/storage/bag/trash/mybag = null - var/callme = "pimpin' ride" //how do people refer to it? - var/move_delay = 0 - var/floorbuffer = 0 - var/keytype = /obj/item/key/janitor - -/obj/structure/bed/chair/janicart/New() - handle_rotation() - -/obj/structure/bed/chair/janicart/Move(a, b, flag) - ..() - if(floorbuffer) - var/turf/tile = loc - if(isturf(tile)) - tile.clean_blood() - for(var/A in tile) - if(istype(A, /obj/effect)) - if(is_cleanable(A)) - qdel(A) - -/obj/structure/bed/chair/janicart/examine(mob/user) - ..() - if(floorbuffer) - user << "It has been upgraded with a floor buffer." - - -/obj/structure/bed/chair/janicart/attackby(obj/item/I, mob/user, params) - if(istype(I, keytype)) - user << "Hold [I] in one of your hands while you drive this [callme]." - else if(istype(I, /obj/item/weapon/storage/bag/trash)) - if(keytype == /obj/item/key/janitor) - if(!user.drop_item()) - return - user << "You hook the trashbag onto the [callme]." - I.loc = src - mybag = I - else if(istype(I, /obj/item/janiupgrade)) - if(keytype == /obj/item/key/janitor) - floorbuffer = 1 - qdel(I) - user << "You upgrade the [callme] with the floor buffer." - update_icon() - -/obj/structure/bed/chair/janicart/update_icon() - overlays.Cut() - if(mybag) - overlays += "cart_garbage" - if(floorbuffer) - overlays += "cart_buffer" - -/obj/structure/bed/chair/janicart/attack_hand(mob/user) - if(..()) - return 1 - else if(mybag) - mybag.loc = get_turf(user) - user.put_in_hands(mybag) - mybag = null - update_icon() - - -/obj/structure/bed/chair/janicart/relaymove(mob/user, direction) - if(user.stat || user.stunned || user.weakened || user.paralysis) - unbuckle_mob() - if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) - if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc)) - return - step(src, direction) - update_mob() - handle_rotation() - move_delay = 1 - spawn(2) - move_delay = 0 - else - user << "You'll need the keys in one of your hands to drive this [callme]." - -/obj/structure/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user) - if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated - return - for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. - if(A.density) - if(A != src && A != M) - return - M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. - ..() - update_mob() - -/obj/structure/bed/chair/janicart/unbuckle_mob(force = 0) - if(buckled_mob) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 - . = ..() - -/obj/structure/bed/chair/janicart/handle_rotation() - if((dir == SOUTH) || (dir == WEST) || (dir == EAST)) - layer = FLY_LAYER - else - layer = OBJ_LAYER - - if(buckled_mob) - if(buckled_mob.loc != loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - buckled_mob.buckled = src //Restoring - - update_mob() - -/obj/structure/bed/chair/janicart/Bump(atom/movable/M) - . = ..() - if(istype(M, /obj/machinery/door) && buckled_mob) - M.Bumped(buckled_mob) - -/obj/structure/bed/chair/janicart/proc/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - switch(dir) - if(SOUTH) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 7 - if(WEST) - buckled_mob.pixel_x = 12 - buckled_mob.pixel_y = 7 - if(NORTH) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 4 - if(EAST) - buckled_mob.pixel_x = -12 - buckled_mob.pixel_y = 7 - -//keys+attachables// - -/obj/item/key - name = "key" - desc = "A small grey key." - icon = 'icons/obj/vehicles.dmi' - icon_state = "key" - w_class = 1 - -/obj/item/key/janitor - desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." - icon_state = "keyjanitor" - -/obj/item/key/security - desc = "A keyring with a small steel key, and a rubber stun baton accessory." - icon_state = "keysec" - -/obj/item/janiupgrade - name = "floor buffer upgrade" - desc = "An upgrade for mobile janicarts." - icon = 'icons/obj/vehicles.dmi' - icon_state = "upgrade" - -//secway// - -/obj/structure/bed/chair/janicart/secway - name = "secway" - desc = "A brave security cyborg gave its life to help you look like a complete tool." - icon = 'icons/obj/vehicles.dmi' - icon_state = "secway" - callme = "secway" - keytype = /obj/item/key/security - -/obj/structure/bed/chair/janicart/secway/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - buckled_mob.pixel_y = 4 - -//atv// - -/obj/structure/bed/chair/janicart/atv - name = "atv" - desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts." - icon = 'icons/obj/vehicles.dmi' - icon_state = "atv" - callme = "All-terrain vehicle" - keytype = /obj/item/key - var/image/atvcover = null - -/obj/structure/bed/chair/janicart/atv/New() - atvcover = image("icons/obj/vehicles.dmi", "atvcover") - atvcover.layer = MOB_LAYER + 0.1 - return ..() - -obj/structure/bed/chair/janicart/atv/post_buckle_mob(mob/living/M) - if(buckled_mob) - overlays += atvcover - else - overlays -= atvcover - -/obj/structure/bed/chair/janicart/atv/update_mob() - if(buckled_mob) - buckled_mob.dir = dir - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 4 - -/obj/structure/bed/chair/janicart/atv/handle_rotation() - if(dir == SOUTH) - layer = FLY_LAYER - else - layer = OBJ_LAYER - - if(buckled_mob) - if(buckled_mob.loc != loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - buckled_mob.buckled = src //Restoring - - update_mob() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 14ad3320de6..a79e01c5011 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -74,6 +74,7 @@ m180.Turn(180) animate(H, transform = m180, time = 3) H.pixel_y = H.get_standard_pixel_y_offset(180) + qdel(G) return user << "You can't use that on the spike!" return diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 010200185ee..d10ffe89303 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -35,8 +35,11 @@ //for junctions, just swap the diagonals with each other if(split_text.len == 3 && split_text[3] != "Pass") split_text.Swap(2,3) + else if(length(split_text[1]) == 2 && length(split_text[2]) == 2) //diagonals + split_text[1] = copytext(split_text[1],1,2) + copytext(split_text[2],2,3) + split_text[2] = copytext(split_text[2],1,2) + ((copytext(split_text[2],2,3) == "E") ? "W" : "E") //for curves, swap the diagonal direction that is not in the same axis as the cardinal direction - else + else if(split_text[1] == "N" || split_text[1] == "S") split_text[2] = copytext(split_text[2],1,2) + ((copytext(split_text[2],2,3) == "E") ? "W" : "E") else diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 365acba4a54..431057335d7 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -79,7 +79,7 @@ if(open) GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give [GM] a swirlie...") swirlie = GM - if(do_after(user, 30, 5, 0, target = src)) + if(do_after(user, 30, 0, target = src)) GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives [GM] a swirlie!", "You hear a toilet flushing.") if(iscarbon(GM)) var/mob/living/carbon/C = GM diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index c39d15e7249..3a5e694d904 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -25,7 +25,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," thermal_conductivity = 0.040 heat_capacity = 10000 intact = 1 - var/lava = 0 var/broken = 0 var/burnt = 0 var/floor_tile = null //tile that this floor drops @@ -82,8 +81,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," return /turf/simulated/floor/proc/update_icon() - if(lava) - return 0 if(air) update_visuals() return 1 @@ -172,4 +169,4 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," ChangeTurf(/turf/simulated/floor/engine/cult) /turf/simulated/floor/can_have_cabling() - return !burnt & !broken & !lava + return !burnt & !broken diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 34c8ce714e0..af2e3206eac 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -27,7 +27,6 @@ flags = 0 var/image/obscured //camerachunks - /turf/New() ..() for(var/atom/movable/AM in src) diff --git a/code/hub.dm b/code/hub.dm index 69b90bd6782..f0005818f18 100644 --- a/code/hub.dm +++ b/code/hub.dm @@ -1,7 +1,11 @@ /world hub = "Exadv1.spacestation13" +#ifdef PUTONHUB + hub_password = "kMZy3U5jJHSiBQjr" +#else hub_password = "SORRYNOPASSWORD" +#endif name = "/tg/ Station 13" /* @@ -13,4 +17,4 @@ If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstatio hub_password = "kMZy3U5jJHSiBQjr" name = "Space Station 13" -*/ \ No newline at end of file +*/ diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 5549ea52383..d5c56e5e5b0 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,7 +1,5 @@ var/global/BSACooldown = 0 -var/global/floorIsLava = 0 - //////////////////////////////// /proc/message_admins(msg) @@ -147,8 +145,8 @@ var/global/floorIsLava = 0 body += "Coffee | " //body += "Parrot | " //body += "Poly | " - body += "\[ Construct: Armored , " - body += "Builder , " + body += "\[ Construct: Juggernaut , " + body += "Artificer , " body += "Wraith \] " body += "Shade" body += "
" @@ -398,7 +396,10 @@ var/global/floorIsLava = 0 Create Mob
"} - usr << browse(dat, "window=admin2;size=210x180") + if(marked_datum && istype(marked_datum, /atom)) + dat += "Duplicate Marked Datum
" + + usr << browse(dat, "window=admin2;size=210x200") return /////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 654c04c8ffa..7c9dbc23474 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -60,7 +60,8 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ /client/proc/cmd_admin_local_narrate, /*sends text to all mobs within view of atom*/ /client/proc/cmd_admin_create_centcom_report, - /client/proc/toggle_antag_hud /*toggle display of the admin antag hud*/ + /client/proc/toggle_antag_hud, /*toggle display of the admin antag hud*/ + /client/proc/toggle_AI_interact /*toggle admin ability to interact with machines as an AI*/ ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -366,6 +367,8 @@ var/list/admin_verbs_hideable = list( if(holder) holder.check_antagonists() log_admin("[key_name(usr)] checked antagonists.") //for tsar~ + if(!isobserver(usr)) + message_admins("[key_name_admin(usr)] checked antagonists.") feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -422,6 +425,9 @@ var/list/admin_verbs_hideable = list( if(holder) if(holder.fakekey) holder.fakekey = null + mob.invisibility = initial(mob.invisibility) + mob.alpha = initial(mob.alpha) + mob.name = initial(mob.name) else var/new_key = ckeyEx(input("Enter your desired display name.", "Fake Key", key) as text|null) if(!new_key) return @@ -429,6 +435,9 @@ var/list/admin_verbs_hideable = list( new_key = copytext(new_key, 1, 26) holder.fakekey = new_key createStealthKey() + mob.invisibility = INVISIBILITY_MAXIMUM + 1 //JUST IN CASE + mob.alpha = 0 //JUUUUST IN CASE + mob.name = " " log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -638,3 +647,12 @@ var/list/admin_verbs_hideable = list( testing("Spawned test mob with name \"[mob.name]\" at [tile.x],[tile.y],[tile.z]") while (!area && --j > 0) + +/client/proc/toggle_AI_interact() + set name = "Toggle Admin AI Interact" + set category = "Admin" + set desc = "Allows you to interact with most machines as an AI would as a ghost" + + AI_Interact = !AI_Interact + log_admin("[key_name(usr)] has [AI_Interact ? "activated" : "deactivated"] Admin AI Interact") + message_admins("[key_name_admin(usr)] has [AI_Interact ? "activated" : "deactivated"] their AI interaction") diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index d6408f0f6ad..a513fb346d9 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -389,62 +389,8 @@ L.fix() if("floorlava") - if(!check_rights(R_FUN)) - return - if(floorIsLava) - usr << "The floor is lava already." - return - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","LF") - - //Options - var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num - length = min(abs(length), 1200) - - var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num - damage = min(abs(damage), 100) - - var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah") - if(sure == "Nah") - return - floorIsLava = 1 - - message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.") - - for(var/turf/simulated/floor/F in world) - if(F.z == ZLEVEL_STATION) - F.name = "lava" - F.desc = "The floor is LAVA!" - F.overlays += "lava" - F.lava = 1 - - spawn(0) - for(var/i = i, i < length, i++) // 180 = 3 minutes - if(damage) - for(var/mob/living/carbon/L in living_mob_list) - if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?! - var/turf/simulated/floor/F = L.loc - if(F.lava) - var/safe = 0 - for(var/obj/structure/O in F.contents) - if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! - safe = 1 - break - if(!safe) - L.adjustFireLoss(damage) - - - sleep(10) - - for(var/turf/simulated/floor/F in world) // Reset everything. - if(F.z == ZLEVEL_STATION) - F.name = initial(F.name) - F.desc = initial(F.desc) - F.overlays.Cut() - F.lava = 0 - F.update_icon() - floorIsLava = 0 - return + var/datum/weather/floor_is_lava/storm = new /datum/weather/floor_is_lava + storm.weather_start_up() if("virus") if(!check_rights(R_FUN)) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b0d4ec4622c..8c42eb8261b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -46,7 +46,7 @@ message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunately, there were no candidates available.") log_admin("[key_name(usr)] failed to create changelings.") if("3") - if(!src.makeRevs()) + if(src.makeRevs()) message_admins("[key_name(usr)] started a revolution.") log_admin("[key_name(usr)] started a revolution.") else @@ -239,6 +239,7 @@ message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob") DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid ) + add_note(banckey, banreason, null, usr.ckey, 0) else if(href_list["editrights"]) edit_rights_topic(href_list) @@ -1714,6 +1715,10 @@ if(!check_rights(R_SPAWN)) return return create_mob(usr) + else if(href_list["dupe_marked_datum"]) + if(!check_rights(R_SPAWN)) return + return DuplicateObject(marked_datum, perfectcopy=1, newloc=get_turf(usr)) + else if(href_list["object_list"]) //this is the laggiest thing ever if(!check_rights(R_SPAWN)) return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 18c0b2a4b8d..aabbbf8f3f0 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -114,12 +114,14 @@ for(var/mob/living/carbon/human/applicant in player_list) if(ROLE_REV in applicant.client.prefs.be_special) if(applicant.stat == CONSCIOUS) - if(applicant.mind) - if(!applicant.mind.special_role) - if(!jobban_isbanned(applicant, ROLE_REV) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + var/turf/T = get_turf(applicant) + if(T.z == ZLEVEL_STATION) + if(applicant.mind) + if(!applicant.mind.special_role) + if(!jobban_isbanned(applicant, ROLE_REV) && !jobban_isbanned(applicant, "Syndicate")) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numRevs = min(candidates.len, 3) diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index d856e5b8577..88cd7f16394 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -10,20 +10,8 @@ ticker.mode.traitors += H.mind H.mind.special_role = "traitor" - var/datum/objective/steal/steal_objective = new - steal_objective.owner = H.mind - steal_objective.set_target(new /datum/objective_item/steal/nukedisc) - H.mind.objectives += steal_objective - - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = H.mind - H.mind.objectives += hijack_objective - - H << "You are the traitor." - var/obj_count = 1 - for(var/datum/objective/OBJ in H.mind.objectives) - H << "Objective #[obj_count]: [OBJ.explanation_text]" - obj_count++ + add_objective(H.mind, /datum/objective/default/steal) + add_objective(H.mind, /datum/objective/escape_obj/hijack, 1) for (var/obj/item/I in H) if (istype(I, /obj/item/weapon/implant)) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index bf87018e786..c7a1bb0ebc5 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -32,6 +32,7 @@ var/death = TRUE var/flavour_text = "The mapper forgot to set this!" var/faction = null + var/list/implants = list() density = 1 /obj/effect/landmark/corpse/initialize() @@ -105,6 +106,11 @@ W.registered_name = M.real_name W.update_label() M.equip_to_slot_or_del(W, slot_wear_id) + + for(var/I in implants) + var/obj/item/weapon/implant/X = new I + X.implant(M) + if(ckey) M.ckey = ckey M << "[flavour_text]" @@ -270,7 +276,7 @@ -/////////////////Officers////////////////////// +/////////////////Officers+Nanotrasen Security////////////////////// /obj/effect/landmark/corpse/bridgeofficer name = "Bridge Officer" @@ -298,6 +304,21 @@ corpseidjob = "Commander" corpseidaccess = "Captain" +/obj/effect/landmark/corpse/nanotrasensoldier + name = "Nanotrasen Private Security Officer" + corpseuniform = /obj/item/clothing/under/rank/security + corpsesuit = /obj/item/clothing/suit/armor/vest + corpseshoes = /obj/item/clothing/shoes/combat + corpsegloves = /obj/item/clothing/gloves/combat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/gas/sechailer/swat + corpsehelmet = /obj/item/clothing/head/helmet/swat/nanotrasen + corpseback = /obj/item/weapon/storage/backpack/security + corpseid = 1 + corpseidjob = "Private Security Force" + corpseidaccess = "Security Officer" + + /obj/effect/landmark/corpse/commander/alive death = FALSE roundstart = FALSE @@ -343,3 +364,11 @@ icon = 'icons/effects/blood.dmi' icon_state = "remains" flavour_text = "By unknown powers, your rotting remains have been resurrected! Walk this mortal plain and terrorize all living adventurers who dare cross your path." + + +/obj/effect/landmark/corpse/abductor + name = "abductor" + mobname = "???" + mob_species = /datum/species/abductor + corpseuniform = /obj/item/clothing/under/color/grey + corpseshoes = /obj/item/clothing/shoes/combat diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 5b43288d109..d6d72ba061f 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -1,31 +1,31 @@ //Academy Areas /area/awaymission/academy - name = "\improper Academy Asteroids" + name = "Academy Asteroids" icon_state = "away" /area/awaymission/academy/headmaster - name = "\improper Academy Fore Block" + name = "Academy Fore Block" icon_state = "away1" /area/awaymission/academy/classrooms - name = "\improper Academy Classroom Block" + name = "Academy Classroom Block" icon_state = "away2" /area/awaymission/academy/academyaft - name = "\improper Academy Ship Aft Block" + name = "Academy Ship Aft Block" icon_state = "away3" /area/awaymission/academy/academygate - name = "\improper Academy Gateway" + name = "Academy Gateway" icon_state = "away4" /area/awaymission/academy/academycellar - name = "\improper Academy Cellar" + name = "Academy Cellar" icon_state = "away4" /area/awaymission/academy/academyengine - name = "\improper Academy Engine" + name = "Academy Engine" icon_state = "away4" //Academy Items @@ -102,7 +102,7 @@ /obj/structure/academy_wizard_spawner/proc/summon_wizard() var/turf/T = src.loc - + var/mob/living/carbon/human/wizbody = new(T) wizbody.equipOutfit(/datum/outfit/wizard/academy) var/obj/item/weapon/implant/exile/Implant = new/obj/item/weapon/implant/exile(wizbody) @@ -110,7 +110,7 @@ wizbody.faction |= "wizard" wizbody.real_name = "Academy Teacher" wizbody.name = "Academy Teacher" - + var/datum/mind/wizmind = new /datum/mind() wizmind.name = "Wizard Defender" wizmind.special_role = "Academy Defender" @@ -118,13 +118,13 @@ wizmind.objectives += O wizmind.transfer_to(wizbody) ticker.mode.wizards |= wizmind - + wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt) wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile) wizmind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball) current_wizard = wizbody - + give_control() /obj/structure/academy_wizard_spawner/proc/update_status() diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index b6496fe4718..1b6ffd1d0bf 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -1,22 +1,22 @@ //Packer Ship Areas /area/awaymission/BMPship - name = "\improper BMP Asteroids" + name = "BMP Asteroids" icon_state = "away" luminosity = 0 /area/awaymission/BMPship/Aft - name = "\improper Aft Block" + name = "Aft Block" icon_state = "away1" requires_power = 1 /area/awaymission/BMPship/Midship - name = "\improper Midship Block" + name = "Midship Block" icon_state = "away2" requires_power = 1 /area/awaymission/BMPship/Fore - name = "\improper Fore Block" + name = "Fore Block" icon_state = "away3" requires_power = 1 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 1625b3da847..724dcf434e3 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -5,7 +5,7 @@ icon_state = "away" /area/awaymission/challenge/main - name = "\improper Danger Room" + name = "Danger Room" icon_state = "away1" requires_power = 0 diff --git a/code/modules/awaymissions/mission_code/researchbase.dm b/code/modules/awaymissions/mission_code/researchbase.dm new file mode 100644 index 00000000000..0149a5cdf08 --- /dev/null +++ b/code/modules/awaymissions/mission_code/researchbase.dm @@ -0,0 +1,64 @@ +//Research Base Areas//-- + +/area/awaymission/research + name = "Research Outpost" + icon_state = "away" + luminosity = 0 + lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED + +/area/awaymission/research/interior + name = "Research Inside" + requires_power = 1 + icon_state = "away2" + +/area/awaymission/research/interior/cryo + name = "Research Cryostasis Room" + icon_state = "medbay" + +/area/awaymission/research/interior/clonestorage + name = "Research Clone Storage" + icon_state = "cloning" + +/area/awaymission/research/interior/genetics + name = "Research Genetics Research" + icon_state = "genetics" + +/area/awaymission/research/interior/engineering + name = "Research Engineering" + icon_state = "engine" + +/area/awaymission/research/interior/security + name = "Research Security" + icon_state = "security" + +/area/awaymission/research/interior/secure + name = "Research Secure Vault" + +/area/awaymission/research/interior/maint + name = "Research Maintenance" + icon_state = "maintcentral" + +/area/awaymission/research/interior/dorm + name = "Research Dorms" + icon_state = "Sleep" + +/area/awaymission/research/interior/escapepods + name = "Research Escape Wing" + icon_state = "exit" + +/area/awaymission/research/interior/gateway + name = "Research Gateway" + icon_state = "start" + +/area/awaymission/research/interior/bathroom + name = "Research Bathrooms" + icon_state = "restrooms" + +/area/awaymission/research/interior/medbay + name = "Research Medbay" + icon_state = "medbay" + +/area/awaymission/research/exterior + name = "Research Exterior" + icon_state = "unknown" + diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index bbf5856959f..eeca2c33add 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -1,37 +1,37 @@ //Snow Valley Areas//-- /area/awaymission/snowdin - name = "\improper Snowdin Tundra Plains" + name = "Snowdin Tundra Plains" icon_state = "away" requires_power = 0 luminosity = 1 lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED /area/awaymission/snowdin/post - name = "\improper Snowdin Outpost" + name = "Snowdin Outpost" requires_power = 1 /area/awaymission/snowdin/igloo - name = "\improper Snowdin Igloos" + name = "Snowdin Igloos" icon_state = "away2" /area/awaymission/snowdin/cave - name = "\improper Snowdin Caves" + name = "Snowdin Caves" icon_state = "away2" luminosity = 0 /area/awaymission/snowdin/base - name = "\improper Snowdin Main Base" + name = "Snowdin Main Base" icon_state = "away3" requires_power = 1 /area/awaymission/snowdin/dungeon1 - name = "\improper Snowdin Depths" + name = "Snowdin Depths" icon_state = "away2" luminosity = 0 /area/awaymission/snowdin/sekret - name = "\improper Snowdin Operations" + name = "Snowdin Operations" icon_state = "away3" requires_power = 1 @@ -237,6 +237,7 @@ obj/item/weapon/paper/crumpled/snowdin/shovel icon_state = "sleeper" roundstart = FALSE death = FALSE + implants = list(/obj/item/weapon/implant/exile) faction = "syndicate" flavour_text = {"You are a syndicate operative recently awoken from cyrostatis in an underground outpost. Monitor Nanotrasen communications and record infomation. All intruders should be disposed of swirfly to assure no gathered infomation is stolen or lost. Try not to wander too far from the outpost as the caves can be a deadly place even for a trained operative such as yourself."} diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index 9b9a70d220a..b8906c8011d 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -1,33 +1,33 @@ //Spacebattle Areas /area/awaymission/spacebattle - name = "\improper Space Battle" + name = "Space Battle" icon_state = "away" requires_power = 0 /area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" + name = "Nanotrasen Cruiser" /area/awaymission/spacebattle/syndicate1 - name = "\improper Syndicate Assault Ship 1" + name = "Syndicate Assault Ship 1" /area/awaymission/spacebattle/syndicate2 - name = "\improper Syndicate Assault Ship 2" + name = "Syndicate Assault Ship 2" /area/awaymission/spacebattle/syndicate3 - name = "\improper Syndicate Assault Ship 3" + name = "Syndicate Assault Ship 3" /area/awaymission/spacebattle/syndicate4 - name = "\improper Syndicate War Sphere 1" + name = "Syndicate War Sphere 1" /area/awaymission/spacebattle/syndicate5 - name = "\improper Syndicate War Sphere 2" + name = "Syndicate War Sphere 2" /area/awaymission/spacebattle/syndicate6 - name = "\improper Syndicate War Sphere 3" + name = "Syndicate War Sphere 3" /area/awaymission/spacebattle/syndicate7 - name = "\improper Syndicate Fighter" + name = "Syndicate Fighter" /area/awaymission/spacebattle/secret - name = "\improper Hidden Chamber" \ No newline at end of file + name = "Hidden Chamber" \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 6b87a8c3beb..7a4bcc86671 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -7,30 +7,30 @@ //Wild West Areas /area/awaymission/wwmines - name = "\improper Wild West Mines" + name = "Wild West Mines" icon_state = "away1" luminosity = 1 requires_power = 0 /area/awaymission/wwgov - name = "\improper Wild West Mansion" + name = "Wild West Mansion" icon_state = "away2" luminosity = 1 requires_power = 0 /area/awaymission/wwrefine - name = "\improper Wild West Refinery" + name = "Wild West Refinery" icon_state = "away3" luminosity = 1 requires_power = 0 /area/awaymission/wwvault - name = "\improper Wild West Vault" + name = "Wild West Vault" icon_state = "away3" luminosity = 0 /area/awaymission/wwvaultdoors - name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power + name = "Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power icon_state = "away2" requires_power = 0 luminosity = 0 @@ -96,14 +96,8 @@ user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart." ticker.mode.traitors += user.mind user.mind.special_role = "traitor" - var/datum/objective/hijack/hijack = new - hijack.owner = user.mind - user.mind.objectives += hijack + add_objective(user.mind, /datum/objective/escape_obj/hijack, 1) user << "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!" - var/obj_count = 1 - for(var/datum/objective/OBJ in user.mind.objectives) - user << "Objective #[obj_count]: [OBJ.explanation_text]" - obj_count++ user.set_species(/datum/species/shadow) if("Peace") user << "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence." diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 807c8f1a291..4219bafe595 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -1,38 +1,21 @@ +#define RANDOM_UPPER_X 220 +#define RANDOM_UPPER_Y 220 + +#define RANDOM_LOWER_X 30 +#define RANDOM_LOWER_Y 30 + + +var/global/list/potentialRandomZlevels = generateMapList(filename = "config/awaymissionconfig.txt") + +var/global/list/potentialLavaRuins = generateMapList(filename = "config/lavaRuinConfig.txt") + +var/global/list/potentialSpaceRuins = generateMapList(filename = "config/spaceRuinConfig.txt") + /proc/createRandomZlevel() if(awaydestinations.len) //crude, but it saves another var! return - var/list/potentialRandomZlevels = list() - world << "Searching for away missions..." - var/list/Lines = file2list("config/awaymissionconfig.txt") - if(!Lines.len) return - for (var/t in Lines) - if (!t) - continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - // var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - // value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - potentialRandomZlevels.Add(t) - - - if(potentialRandomZlevels.len) + if(potentialRandomZlevels && potentialRandomZlevels.len) world << "Loading away mission..." var/map = pick(potentialRandomZlevels) @@ -53,4 +36,98 @@ else world << "No away missions found." - return \ No newline at end of file + return + + +/proc/generateMapList(filename) + var/list/potentialMaps = list() + var/list/Lines = file2list(filename) + if(!Lines.len) return + for (var/t in Lines) + if (!t) + continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + + else + name = lowertext(t) + + if (!name) + continue + + potentialMaps.Add(t) + + return potentialMaps + + +/proc/seedRuins(z_level = 1, ruin_number = 0, whitelist = /area/space, list/potentialRuins = potentialSpaceRuins) + ruin_number = min(ruin_number, potentialRuins.len) + + while(ruin_number) + var/sanity = 0 + var/valid = FALSE + while(!valid) + valid = TRUE + sanity++ + if(sanity > 100) + ruin_number-- + break + var/turf/T = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), z_level) + + for(var/turf/check in range(T, 15)) + var/area/new_area = get_area(check) + if(!(istype(new_area, whitelist))) + valid = FALSE + break + + + if(valid) + world.log << "Ruins marker placed at [T.x][T.y][T.z]" + var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T) + R.Load(potentialRuins, -15, -15) + ruin_number -- + + return + + +/obj/effect/ruin_loader + name = "random ruin" + icon = 'icons/obj/weapons.dmi' + icon_state = "syndballoon" + invisibility = 0 + +/obj/effect/ruin_loader/proc/Load(list/potentialRuins = potentialSpaceRuins, x_offset = 0, y_offset = 0) + if(potentialRuins.len) + world << "Loading ruins..." + + var/map = pick(potentialRuins) + var/file = file(map) + if(isfile(file)) + maploader.load_map(file, src.x + x_offset, src.y + y_offset, src.z) + world.log << "[map] loaded at at [src.x + x_offset],[src.y + y_offset],[src.z]" + potentialRuins -= map //Don't want to load the same one twice + world << "Ruins loaded." + + else + world << "No ruins found." + return + + qdel(src) + + + +#undef RANDOM_UPPER_X +#undef RANDOM_UPPER_Y + +#undef RANDOM_LOWER_X +#undef RANDOM_LOWER_Y diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 66384199db2..6e73a0bfd97 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -173,10 +173,10 @@ You can set verify to TRUE if you want send() to sleep until the client has the //DEFINITIONS FOR ASSET DATUMS START HERE. -/datum/asset/simple/nanoui +/datum/asset/simple/tgui assets = list( - "nanoui.css" = 'nano/assets/nanoui.css', - "nanoui.js" = 'nano/assets/nanoui.js' + "tgui.css" = 'tgui/assets/tgui.css', + "tgui.js" = 'tgui/assets/tgui.js' ) /datum/asset/simple/pda diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index e5b4a1d2895..ad9ea063694 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -5,6 +5,7 @@ //////////////// var/datum/admins/holder = null var/buildmode = 0 + var/AI_Interact = 0 var/jobbancache = null //Used to cache this client's jobbans to save on DB queries var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ca7deaef336..b26f8fd1cfc 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -27,7 +27,7 @@ var/list/preferences_datums = list() var/UI_style = "Midnight" - var/nanoui_fancy = TRUE + var/tgui_fancy = TRUE var/toggles = TOGGLES_DEFAULT var/chat_toggles = TOGGLES_DEFAULT_CHAT var/ghost_form = "ghost" @@ -325,7 +325,7 @@ var/list/preferences_datums = list() dat += "
" dat += "

General Settings

" dat += "UI Style: [UI_style]
" - dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" + dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Ghost ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" @@ -721,7 +721,7 @@ var/list/preferences_datums = list() if("undershirt") undershirt = random_undershirt(gender) if("socks") - socks = random_socks(gender) + socks = random_socks() if("eyes") eye_color = random_eye_color() if("s_tone") @@ -834,10 +834,7 @@ var/list/preferences_datums = list() if("socks") var/new_socks - if(gender == MALE) - new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_m - else - new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_f + new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in socks_list if(new_socks) socks = new_socks @@ -1001,7 +998,7 @@ var/list/preferences_datums = list() gender = MALE underwear = random_underwear(gender) undershirt = random_undershirt(gender) - socks = random_socks(gender) + socks = random_socks() facial_hair_style = random_facial_hair_style(gender) hair_style = random_hair_style(gender) @@ -1018,8 +1015,8 @@ var/list/preferences_datums = list() else UI_style = "Midnight" - if("nanoui") - nanoui_fancy = !nanoui_fancy + if("tgui_fancy") + tgui_fancy = !tgui_fancy if("hear_adminhelps") toggles ^= SOUND_ADMINHELP diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 53c66f1f520..b53b52e06e1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -102,7 +102,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(current_version < 12) ignoring = list() - //should this proc get fairly long (say 3 versions long), //just increase SAVEFILE_VERSION_MIN so it's not as far behind //SAVEFILE_VERSION_MAX and then delete any obsolete if clauses @@ -165,14 +164,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["ooccolor"] >> ooccolor S["lastchangelog"] >> lastchangelog S["UI_style"] >> UI_style - S["nanoui_fancy"] >> nanoui_fancy - S["be_special"] >> be_special + S["tgui_fancy"] >> tgui_fancy if(islist(S["be_special"])) - S["be_special"] >> be_special + S["be_special"] >> be_special else //force update and store the old bitflag version of be_special needs_update = 11 - S["be_special"] >> old_be_special + S["be_special"] >> old_be_special S["default_slot"] >> default_slot S["chat_toggles"] >> chat_toggles @@ -193,7 +191,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative"), initial(UI_style)) - nanoui_fancy = sanitize_integer(nanoui_fancy, 0, 1, initial(nanoui_fancy)) + tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) ghost_form = sanitize_inlist(ghost_form, ghost_forms, initial(ghost_form)) @@ -213,7 +211,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["ooccolor"] << ooccolor S["lastchangelog"] << lastchangelog S["UI_style"] << UI_style - S["nanoui_fancy"] << nanoui_fancy + S["tgui_fancy"] << tgui_fancy S["be_special"] << be_special S["default_slot"] << default_slot S["toggles"] << toggles @@ -323,14 +321,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car facial_hair_style = sanitize_inlist(facial_hair_style, facial_hair_styles_male_list) underwear = sanitize_inlist(underwear, underwear_m) undershirt = sanitize_inlist(undershirt, undershirt_m) - socks = sanitize_inlist(socks, socks_m) else hair_style = sanitize_inlist(hair_style, hair_styles_female_list) facial_hair_style = sanitize_inlist(facial_hair_style, facial_hair_styles_female_list) underwear = sanitize_inlist(underwear, underwear_f) undershirt = sanitize_inlist(undershirt, undershirt_f) - socks = sanitize_inlist(socks, socks_f) - + socks = sanitize_inlist(socks, socks_list) age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) hair_color = sanitize_hexcolor(hair_color, 3, 0) facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 1fe7e79d754..d2fd8ff78c2 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -93,7 +93,7 @@ desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern." icon_state = "swatsyndie" item_state = "swatsyndie" - armor = list(melee = 40, bullet = 30, laser = 25,energy = 25, bomb = 50, bio = 10, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 66729755e1e..bf565cd3664 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -3,6 +3,7 @@ Contains: - Captain's spacesuit - Death squad's hardsuit + - SWAT suit - Officer's beret/spacesuit - NASA Voidsuit - Father Christmas' magical clothes @@ -53,13 +54,23 @@ Contains: desc = "A heavily armored, advanced space suit that protects against most forms of damage." icon_state = "deathsquad" item_state = "swat_suit" - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat) armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT unacidable = 1 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad + //NEW SWAT suit +/obj/item/clothing/suit/space/swat + name = "SWAT armor" + desc = "Space-proof tactical SWAT armor." + icon_state = "heavy" + item_state = "swat_suit" + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/kitchen/knife/combat) + armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20) + strip_delay = 120 + /obj/item/clothing/head/helmet/space/beret name = "officer's beret" desc = "An armored beret commonly used by special operations officers. Uses advanced force field technology to protect the head from space." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 40d77f12752..89c27f94d13 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,5 +1,5 @@ /obj/item/clothing/suit/armor - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat) body_parts_covered = CHEST cold_protection = CHEST|GROIN min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -118,7 +118,7 @@ name = "armor" desc = "An armored vest with a detective's badge on it." icon_state = "detective-armor" - allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder) + allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton/telescopic) burn_state = FLAMMABLE @@ -304,4 +304,4 @@ name = "crusader armour" desc = "God wills it!" icon_state = "knight_templar" - item_state = "knight_templar" \ No newline at end of file + item_state = "knight_templar" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index d63c5c43a70..dd112de5f44 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -81,7 +81,7 @@ item_state = "det_suit" blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|LEGS|ARMS - allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder) + allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton/telescopic) armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 5e03c3db4e4..1b242b34cfa 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -283,9 +283,11 @@ result = /obj/item/clothing/head/lizard time = 20 reqs = list(/obj/item/organ/severedtail = 1) + category = CAT_MISC /datum/table_recipe/lizardhat_alternate name = "Lizard Cloche Hat" result = /obj/item/clothing/head/lizard time = 20 reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) + category = CAT_MISC diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 499306b617a..3eaf7e3c0c7 100644 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -4,7 +4,7 @@ weight = 5 max_occurrences = 1 - earliest_start = 180000 // 30 min + earliest_start = 18000 // 30 min gamemode_blacklist = list("nuclear","wizard","revolution","abduction") diff --git a/code/modules/events/wizard/advanced_darkness.dm b/code/modules/events/wizard/advanced_darkness.dm new file mode 100644 index 00000000000..8e60fce2208 --- /dev/null +++ b/code/modules/events/wizard/advanced_darkness.dm @@ -0,0 +1,14 @@ +/datum/round_event_control/wizard/darkness + name = "Advanced Darkness" + weight = 2 + typepath = /datum/round_event/wizard/darkness + max_occurrences = 2 + earliest_start = 0 + +/datum/round_event/wizard/darkness + endWhen = 0 + +/datum/round_event/wizard/darkness/start() + var/datum/weather/advanced_darkness/darkness = new + darkness.weather_start_up() + return diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index ec6f4fa06c5..c260a51251c 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -38,11 +38,9 @@ ticker.mode.apprentices += I.mind I.mind.special_role = "imposter" - var/datum/objective/protect/protect_objective = new /datum/objective/protect - protect_objective.owner = I.mind + var/datum/objective/protect_objective = add_objective(I.mind, /datum/objective/default/protect) protect_objective.target = W.mind protect_objective.explanation_text = "Protect [W.real_name], the wizard." - I.mind.objectives += protect_objective ticker.mode.update_wiz_icons_added(I.mind) I.attack_log += "\[[time_stamp()]\] Is an imposter!" diff --git a/code/modules/events/wizard/lava.dm b/code/modules/events/wizard/lava.dm index 23d9afeeff3..fe6044182dd 100644 --- a/code/modules/events/wizard/lava.dm +++ b/code/modules/events/wizard/lava.dm @@ -6,37 +6,9 @@ earliest_start = 0 /datum/round_event/wizard/lava/ - - endWhen = 30 //half a minutes + endWhen = 0 /datum/round_event/wizard/lava/start() - - for(var/turf/simulated/floor/F in world) - if(F.z == ZLEVEL_STATION) - F.name = "lava" - F.desc = "The floor is LAVA!" - F.overlays += "lava" - F.lava = 1 - -/datum/round_event/wizard/lava/tick() - - for(var/mob/living/carbon/L in living_mob_list) - if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?! - var/turf/simulated/floor/F = L.loc - if(F.lava) - var/safe = 0 - for(var/obj/structure/O in F.contents) - if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! - safe = 1 - if(!safe) - L.adjustFireLoss(3) - -/datum/round_event/wizard/lava/end() - - for(var/turf/simulated/floor/F in world) // Reset everything. - if(F.z == ZLEVEL_STATION) - F.name = initial(F.name) - F.desc = initial(F.desc) - F.overlays.Cut() - F.lava = 0 - F.update_icon() \ No newline at end of file + var/datum/weather/floor_is_lava/LAVA = new /datum/weather/floor_is_lava + LAVA.weather_start_up() + return diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 49027281407..1c3365cd59a 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -281,29 +281,31 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/delusion var/list/image/delusions = list() -/obj/effect/hallucination/delusion/New(loc,var/mob/living/carbon/T) +/obj/effect/hallucination/delusion/New(loc,mob/living/carbon/T,force_kind = null , duration = 300,skip_nearby = 1) target = T var/image/A = null - var/kind = rand(1,3) + var/kind = force_kind ? force_kind : pick("clown","corgi","carp","skeleton","demon") for(var/mob/living/carbon/human/H in living_mob_list) if(H == target) continue - if(H in view(target)) + if(skip_nearby && (H in view(target))) continue switch(kind) - if(1)//Clown + if("clown")//Clown A = image('icons/mob/animal.dmi',H,"clown") - if(2)//Carp + if("carp")//Carp A = image('icons/mob/animal.dmi',H,"carp") - if(3)//Corgi + if("corgi")//Corgi A = image('icons/mob/pets.dmi',H,"corgi") - if(4)//Skeletons + if("skeleton")//Skeletons A = image('icons/mob/human.dmi',H,"skeleton_s") + if("demon")//Demon + A = image('icons/mob/mob.dmi',H,"daemon") A.override = 1 if(target.client) delusions |= A target.client.images |= A - sleep(300) + sleep(duration) for(var/image/I in delusions) if(target.client) target.client.images.Remove(I) diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 69cbccb4d99..b9f6cc3fbd3 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -8,7 +8,7 @@ icon_state = null flags = OPENCONTAINER var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it. - possible_transfer_amounts = list(5,10,25) + possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 burn_state = FIRE_PROOF diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index e97d65fdea7..9b9bccc986e 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -7,6 +7,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle amount_per_transfer_from_this = 10 volume = 100 + throwforce = 15 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it diff --git a/code/modules/html_interface/html_interface.dm b/code/modules/html_interface/html_interface.dm index 38fb620fddb..66ced5276c6 100644 --- a/code/modules/html_interface/html_interface.dm +++ b/code/modules/html_interface/html_interface.dm @@ -221,7 +221,7 @@ mob/verb/test() hclient = getClient(hclient, TRUE) if (istype(hclient)) - if (type in asset_list && islist(asset_list[type])) + if ((type in asset_list) && islist(asset_list[type])) send_asset_list(hclient.client, asset_list[type], TRUE) if (!winexists(hclient.client, "browser_\ref[src]")) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index a14996e18b9..aa59022f094 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -174,7 +174,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums var/checkoutperiod = 5 // In minutes var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive var/list/libcomp_menu - var/page = 1 //current page of the external archives + var/page = 1 //current page of the external archives var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl /obj/machinery/computer/libraryconsole/bookmanagement/proc/build_library_menu() @@ -184,7 +184,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums if(!cachedbooks) return libcomp_menu = list("") - + for(var/i in 1 to cachedbooks.len) var/datum/cachedbook/C = cachedbooks[i] var/page = round(i/250)+1 @@ -434,7 +434,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums B.title = title B.author = author B.dat = content - B.icon_state = "book[rand(1,7)]" + B.icon_state = "book[rand(1,8)]" src.visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") break src.add_fingerprint(usr) diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm index 16c3dee6ac9..56514b6113d 100644 --- a/code/modules/library/random_books.dm +++ b/code/modules/library/random_books.dm @@ -39,7 +39,7 @@ B.title = query.item[3] B.dat = query.item[4] B.name = "Book: [B.title]" - B.icon_state= "book[rand(1,7)]" + B.icon_state= "book[rand(1,8)]" else log_game("SQL ERROR populating library bookshelf. Category: \[[category]\], Count: [book_count], Error: \[[query.ErrorMsg()]\]\n") update_icon() diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm index 9b67f630def..7367f760a0b 100644 --- a/code/modules/lighting/lighting_system.dm +++ b/code/modules/lighting/lighting_system.dm @@ -131,7 +131,7 @@ if(AM.opacity) range = 0 break - + owner.luminosity = range if (!range) return 0 diff --git a/code/modules/mining/lavaland/lavaland_areas.dm b/code/modules/mining/lavaland/lavaland_areas.dm new file mode 100644 index 00000000000..e3fa70aa43d --- /dev/null +++ b/code/modules/mining/lavaland/lavaland_areas.dm @@ -0,0 +1,28 @@ +/**********************Lavaland Areas**************************/ + +/area/lavaland + icon_state = "mining" + has_gravity = 1 + +/area/lavaland/surface + name = "Lavaland" + icon_state = "explored" + music = null + requires_power = 1 + ambientsounds = list('sound/ambience/ambimine.ogg') + +/area/lavaland/underground + name = "Lavaland Caves" + icon_state = "unexplored" + music = null + always_unpowered = 1 + requires_power = 1 + poweralm = 0 + power_environ = 0 + power_equip = 0 + power_light = 0 + ambientsounds = list('sound/ambience/ambimine.ogg') + + +/area/lavaland/surface/outdoors + name = "Lavaland Wastes" diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm new file mode 100644 index 00000000000..2d24616df50 --- /dev/null +++ b/code/modules/mining/lavaland/weather.dm @@ -0,0 +1,100 @@ +#define STARTUP_STAGE 1 +#define MAIN_STAGE 2 +#define WIND_DOWN_STAGE 3 +#define END_STAGE 4 + +/datum/weather + var/name = "storm" + var/start_up_time = 300 //30 seconds + var/start_up_message = "The wind begins to pick up." + var/duration = 120 //2 minutes + var/duration_lower = 120 + var/duration_upper = 120 + var/duration_message = "A storm has started!" + var/wind_down = 300 // 30 seconds + var/wind_down_message = "The storm is passing." + + var/target_z = 1 + var/exclude_walls = TRUE + var/area_type = /area/space + var/stage = STARTUP_STAGE + + + var/start_up_overlay = "lava" + var/duration_overlay = "lava" + var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs. + var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people + var/list/impacted_areas = list() + +/datum/weather/proc/weather_start_up() + for(var/area/N in get_areas(area_type)) + if(N.z == target_z) + impacted_areas += N + duration = rand(duration_lower,duration_upper) + update_areas() + for(var/mob/M in player_list) + if(M.z == target_z) + M << start_up_message + + spawn(start_up_time) + stage = MAIN_STAGE + weather_main() + + +/datum/weather/proc/weather_main() + update_areas() + for(var/mob/M in player_list) + if(M.z == target_z) + M << "[duration_message]" + if(purely_aesthetic) + sleep(duration*10) + else //Storm effects + for(var/i in 1 to duration-1) + for(var/mob/living/L in living_mob_list) + var/area/storm_area = get_area(L) + if(storm_area in impacted_areas) + storm_act(L) + sleep(10) + + stage = WIND_DOWN_STAGE + weather_wind_down() + + +/datum/weather/proc/weather_wind_down() + update_areas() + for(var/mob/M in player_list) + if(M.z == target_z) + M << wind_down_message + + sleep(wind_down) + + stage = END_STAGE + update_areas() + + +/datum/weather/proc/storm_act(mob/living/L) + if(prob(30)) //Dont want it spammed very tick + L << "You're buffeted by the storm!" + L.adjustBruteLoss(1) + +/datum/weather/proc/update_areas() + for(var/area/N in impacted_areas) + N.layer = overlay_layer + N.icon = 'icons/effects/weather_effects.dmi' + N.invisibility = 0 + switch(stage) + if(STARTUP_STAGE) + N.icon_state = start_up_overlay + + if(MAIN_STAGE) + N.icon_state = duration_overlay + + if(WIND_DOWN_STAGE) + N.icon_state = start_up_overlay + + if(END_STAGE) + N.icon_state = initial(N.icon_state) + N.icon = 'icons/turf/areas.dmi' + N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial + N.invisibility = 100 + N.opacity = 0 \ No newline at end of file diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm new file mode 100644 index 00000000000..89308d4437c --- /dev/null +++ b/code/modules/mining/lavaland/weather_types.dm @@ -0,0 +1,90 @@ +///The floor is lava + +/datum/weather/floor_is_lava + name = "floor is lava" + start_up_time = 30 //3 seconds + start_up_message = "The ground begins to bubble." + duration_lower = 45 + duration_upper = 60 //1 minute + duration_message = "The floor is lava!" + wind_down = 30// 3 seconds + wind_down_message = "The ground begins to cool." + + target_z = 1 + exclude_walls = TRUE + area_type = /area + + start_up_overlay = "lava" + duration_overlay = "lava" + overlay_layer = 2 //Covers floors only + + +/datum/weather/floor_is_lava/storm_act(mob/living/L) + var/turf/F = get_turf(L) + for(var/obj/structure/O in F.contents) + if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! + return + L.adjustFireLoss(3) + + + +/datum/weather/advanced_darkness + name = "advanced darkness" + start_up_time = 100 //10 seconds + start_up_message = "The lights begin to dim... is power going out?" + duration_lower = 45 + duration_upper = 60 //1 minute + duration_message = "This isn't average everyday darkness... this is advanced darkness!" + wind_down = 100 // 10 seconds + wind_down_message = "The darkness is receding. Thank god." + purely_aesthetic = TRUE + + target_z = 1 + exclude_walls = TRUE + area_type = /area + + start_up_overlay = "" + duration_overlay = "" + overlay_layer = 10 + +/datum/weather/advanced_darkness/update_areas() + for(var/area/A in impacted_areas) + if(stage == MAIN_STAGE) + A.invisibility = 0 + A.opacity = 1 + else + A.invisibility = 100 + A.opacity = 0 +//Ash storms + +/datum/weather/ash_storm + name = "ash storm" + start_up_time = 300 //30 seconds + start_up_message = "The wind begins to pick up. Seek shelter." + duration_lower = 90 //1.5 minutes + duration_upper = 360 //3 minutes + duration_message = "An ash storm has started! Get inside!" + wind_down = 300 // 30 seconds + wind_down_message = "The storm begins to fade. Should be safe to go outside again." + + target_z = ZLEVEL_LAVALAND + area_type = /area/lavaland/surface/outdoors + + start_up_overlay = "light_ash" + duration_overlay = "ash_storm" + overlay_layer = 10 + + +/datum/weather/ash_storm/false_alarm //No storm, just light ember fall + purely_aesthetic = TRUE + duration_overlay = "light_ash" + duration_message = "Looks like the storm just missed the mining area. False alarm." + wind_down_message = "The ash fall starts to trail off." + +/datum/weather/ash_storm/storm_act(mob/living/L) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/thermal_protection = H.get_thermal_protection() + if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + return + L.adjustFireLoss(4) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 5958d0275ad..f15c5a5c37e 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -191,6 +191,7 @@ qdel(src) /obj/item/weapon/survivalcapsule/proc/load() + var/list/blacklist = list(/area/shuttle) //Shuttles move based on area, and we'd like not to break them var/turf/start_turf = get_turf(src.loc) var/turf/cur_turf var/x_size = 5 @@ -243,7 +244,9 @@ threshhold.nitrogen = 82 threshhold.carbon_dioxide = 0 threshhold.toxins = 0 - L.contents += threshhold + var/area/ZZ = get_area(threshhold) + if(!is_type_in_list(ZZ, blacklist)) + L.contents += threshhold threshhold.overlays.Cut() var/list/turfs = room["floors"] @@ -261,5 +264,6 @@ A.air.temperature = 293.15 SSair.add_to_active(A) A.overlays.Cut() - - L.contents += A + var/area/Z = get_area(A) + if(!is_type_in_list(Z, blacklist)) + L.contents += A diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 1d3e6ed3a72..641fa9446f5 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -86,7 +86,7 @@ Works together with spawning an observer, noted above. if(key) if(!cmptext(copytext(key,1,2),"@")) // Skip aghosts. var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. - SSnano.on_transfer(src, ghost) // Transfer NanoUIs. + SStgui.on_transfer(src, ghost) // Transfer NanoUIs. ghost.can_reenter_corpse = can_reenter_corpse ghost.key = key return ghost @@ -156,7 +156,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients usr << "Another consciousness is in your body...It is resisting you." return - SSnano.on_transfer(src, mind.current) // Transfer NanoUIs. + SStgui.on_transfer(src, mind.current) // Transfer NanoUIs. mind.current.key = key return 1 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index fa00df2f7db..753b66235b6 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -173,3 +173,52 @@ //if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand return items + + +/obj/item/proc/equip_to_best_slot(var/mob/M) + if(src != M.get_active_hand()) + M << "You are not holding anything to equip!" + return 0 + + if(M.equip_to_appropriate_slot(src)) + if(M.hand) + M.update_inv_l_hand() + else + M.update_inv_r_hand() + return 1 + + if(M.s_active && M.s_active.can_be_inserted(src,1)) //if storage active insert there + M.s_active.handle_item_insertion(src) + return 1 + + var/obj/item/weapon/storage/S = M.get_inactive_hand() + if(istype(S) && S.can_be_inserted(src,1)) //see if we have box in other hand + S.handle_item_insertion(src) + return 1 + + S = M.get_item_by_slot(slot_belt) + if(istype(S) && S.can_be_inserted(src,1)) //else we put in belt + S.handle_item_insertion(src) + return 1 + + S = M.get_item_by_slot(slot_drone_storage) //else we put in whatever is in drone storage + if(istype(S) && S.can_be_inserted(src,1)) + S.handle_item_insertion(src) + + S = M.get_item_by_slot(slot_back) //else we put in backpack + if(istype(S) && S.can_be_inserted(src,1)) + S.handle_item_insertion(src) + playsound(src.loc, "rustle", 50, 1, -5) + return 1 + + M << "You are unable to equip that!" + return 0 + + +/mob/verb/quick_equip() + set name = "quick-equip" + set hidden = 1 + + var/obj/item/I = get_active_hand() + if (I) + I.equip_to_best_slot(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 27d29ef4e50..40727647cd7 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -39,7 +39,10 @@ var/global/posibrain_notif_cooldown = 0 spawn(askDelay) //Seperate from the global cooldown. notified = 0 update_icon() - visible_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + if(brainmob.stat == CONSCIOUS && brainmob.client) + visible_message("The positronic brain pings, and its lights start flashing. Success!") + else + visible_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") return //Code for deleting personalities recommended here. @@ -127,7 +130,6 @@ var/global/posibrain_notif_cooldown = 0 return /obj/item/device/mmi/posibrain/New() - brainmob = new(src) brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","ANNS","KOS","TKRG","XAL","STLP","CBOS","DNCN","FXMC","DRSD"))]-[rand(100, 999)]" brainmob.real_name = brainmob.name @@ -137,7 +139,6 @@ var/global/posibrain_notif_cooldown = 0 brainmob.silent = 0 dead_mob_list -= brainmob ping_ghosts("created") - ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d1f2c2c10b2..36184591213 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -87,8 +87,7 @@ if(reagents.has_reagent("teslium")) shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging! take_overall_damage(0,shock_damage) - //src.burn_skin(shock_damage) - //src.adjustFireLoss(shock_damage) //burn_skin will do this for us + //src.adjustFireLoss(shock_damage) //src.updatehealth() visible_message( "[src] was shocked by \the [source]!", \ @@ -388,7 +387,7 @@ var/const/GALOSHES_DONT_HELP = 4 last_special = world.time + CLICK_CD_BREAKOUT visible_message("[src] attempts to unbuckle themself!", \ "You attempt to unbuckle yourself... (This will take around one minute and you need to stay still.)") - if(do_after(src, 600, needhand = 0, target = src)) + if(do_after(src, 600, 0, target = src)) if(!buckled) return buckled.user_unbuckle_mob(src,src) @@ -431,7 +430,7 @@ var/const/GALOSHES_DONT_HELP = 4 if(!cuff_break) visible_message("[src] attempts to remove [I]!") src << "You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)" - if(do_after(src, breakouttime, 10, 0, target = src)) + if(do_after(src, breakouttime, 0, target = src)) if(I.loc != src || buckled) return visible_message("[src] manages to remove [I]!") @@ -457,7 +456,7 @@ var/const/GALOSHES_DONT_HELP = 4 breakouttime = 50 visible_message("[src] is trying to break [I]!") src << "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)" - if(do_after(src, breakouttime, needhand = 0, target = src)) + if(do_after(src, breakouttime, 0, target = src)) if(!I.loc || buckled) return visible_message("[src] manages to break [I]!") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 752e796573f..5cfa976e679 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -21,8 +21,6 @@ t_has = "have" t_is = "are" else - if(icon) - msg += "\icon[src] " //note, should we ever go back to runtime-generated icons (please don't), you will need to change this to \icon[icon] to prevent crashes. switch(gender) if(MALE) t_He = "He" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 5c866d142fb..36978456f8a 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,38 +1,6 @@ /mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0) return dna.species.can_equip(I, slot, disable_warning, src) -/mob/living/carbon/human/verb/quick_equip() - set name = "quick-equip" - set hidden = 1 - - if(ishuman(src)) - var/mob/living/carbon/human/H = src - var/obj/item/I = H.get_active_hand() - var/obj/item/weapon/storage/S = H.get_inactive_hand() - if(!I) - H << "You are not holding anything to equip!" - return - if(H.equip_to_appropriate_slot(I)) - if(hand) - update_inv_l_hand() - else - update_inv_r_hand() - else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there - s_active.handle_item_insertion(I) - else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand - S.handle_item_insertion(I) - else - S = H.get_item_by_slot(slot_belt) - if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //else we put in belt - S.handle_item_insertion(I) - else - S = H.get_item_by_slot(slot_back) //else we put in backpack - if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) - S.handle_item_insertion(I) - playsound(src.loc, "rustle", 50, 1, -5) - else - H << "You are unable to equip that!" - /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) for(var/slot in slots) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 34803e4bff7..27a76f7eec2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -106,14 +106,8 @@ if(!dna || !dna.species.handle_fire(src)) ..() if(on_fire) - var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures - if(wear_suit) - if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) - thermal_protection += (wear_suit.max_heat_protection_temperature*0.7) - if(head) - if(head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT) - thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD) - thermal_protection = round(thermal_protection) + var/thermal_protection = get_thermal_protection() + if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) return if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) @@ -121,6 +115,16 @@ else bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 12)) +/mob/living/carbon/human/proc/get_thermal_protection() + var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures + if(wear_suit) + if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) + thermal_protection += (wear_suit.max_heat_protection_temperature*0.7) + if(head) + if(head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT) + thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD) + thermal_protection = round(thermal_protection) + return thermal_protection /mob/living/carbon/human/IgniteMob() if(!dna || !dna.species.IgniteMob(src)) @@ -302,6 +306,8 @@ if(head) if(head.flags & BLOCK_GAS_SMOKE_EFFECT) . = 1 + if(NOBREATH in dna.species.specflags) + . = 1 return . /mob/living/carbon/human/proc/handle_embedded_objects() for(var/obj/item/organ/limb/L in organs) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 98eb3b5f3a8..c46d0f1cfde 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -208,27 +208,6 @@ Sorry Giacom. Please don't be mad :( return pressure -//sort of a legacy burn method for /electrocute, /shock, and the e_chair -/mob/living/proc/burn_skin(burn_amount) - if(istype(src, /mob/living/carbon/human)) - //world << "DEBUG: burn_skin(), mutations=[mutations]" - var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part - var/divided_damage = (burn_amount)/(H.organs.len) - var/extradam = 0 //added to when organ is at max dam - for(var/obj/item/organ/limb/affecting in H.organs) - if(!affecting) continue - if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn - H.update_damage_overlays(0) - H.updatehealth() - return 1 - else if(istype(src, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/M = src - M.adjustFireLoss(burn_amount) - M.updatehealth() - return 1 - else if(istype(src, /mob/living/silicon/ai)) - return 0 - /mob/living/proc/adjustBodyTemp(actual, desired, incrementboost) var/temperature = actual var/difference = abs(actual-desired) //get difference diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 462c2912e93..1af50b500f1 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -187,6 +187,7 @@ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) if(buckled) user << "You cannot grab [src], \he is buckled in!" + return 0 if(!G) //the grab will delete itself in New if src is anchored return 0 user.put_in_active_hand(G) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 45525ee11a0..9a4875bfe9a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -842,4 +842,10 @@ var/list/ai_list = list() //get_turf_pixel() is because APCs in maint aren't actually in view of the inner camera if(M && cameranet && !cameranet.checkTurfVis(get_turf_pixel(M)) && !apc_override) return - return 1 \ No newline at end of file + return 1 + +/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) + raw_message = lang_treat(speaker, message_langs, raw_message, spans) + var/name_used = speaker.GetVoice() + var/rendered = "Relayed Speech: [name_used] [raw_message]" + show_message(rendered, 2) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index f3569d4c503..d03587fd26d 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -6,9 +6,10 @@ /mob/camera/aiEye name = "Inactive AI Eye" + invisibility = 100 var/list/visibleCameraChunks = list() var/mob/living/silicon/ai/ai = null - + var/relay_speech = FALSE // Use this when setting the aiEye's location. // It will also stream the chunk that the new loc is in. @@ -78,7 +79,6 @@ if (user.camera_light_on) user.light_cameras() - // Return to the Core. /mob/living/silicon/ai/proc/view_core() @@ -104,3 +104,7 @@ return //won't work if dead acceleration = !acceleration usr << "Camera acceleration has been toggled [acceleration ? "on" : "off"]." + +/mob/camera/aiEye/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) + if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) + ai.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index 50c188ca629..9f11d34359b 100644 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -17,3 +17,10 @@ src.laws_sanity_check() src.laws.show_laws(who) + if(!everyone) + for(var/mob/living/silicon/robot/R in connected_robots) + if(R.lawupdate) + R.lawsync() + R.show_laws() + R.law_change_counter++ + diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index ff680cf7131..97a5c7174a3 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -152,6 +152,7 @@ target_types += /obj/effect/decal/cleanable/ash target_types += /obj/effect/decal/cleanable/greenglow target_types += /obj/effect/decal/cleanable/dirt + target_types += /obj/effect/decal/cleanable/deadcockroach if(blood) target_types += /obj/effect/decal/cleanable/xenoblood/ diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index d84a6d112df..a0d0ef6b331 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -110,7 +110,7 @@ Auto Patrol: []"}, "[arrest_type ? "Detain" : "Arrest"]", "[declare_arrests ? "Yes" : "No"]", "[auto_patrol ? "On" : "Off"]" ) - + return dat /mob/living/simple_animal/bot/secbot/Topic(href, href_list) @@ -402,101 +402,5 @@ Auto Patrol: []"}, return ..() -//Secbot Construction - -/obj/item/clothing/head/helmet/attackby(obj/item/device/assembly/signaler/S, mob/user, params) - ..() - if(!issignaler(S)) - ..() - return - - if(type != /obj/item/clothing/head/helmet/sec) //Eh, but we don't want people making secbots out of space helmets. - return - - if(F) //Has a flashlight. Player must remove it, else it will be lost forever. - user << "The mounted flashlight is in the way, remove it first!" - return - - if(S.secured) - qdel(S) - var/obj/item/weapon/secbot_assembly/A = new /obj/item/weapon/secbot_assembly - user.put_in_hands(A) - user << "You add the signaler to the helmet." - user.unEquip(src, 1) - qdel(src) - else - return - -/obj/item/weapon/secbot_assembly/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/weapon/weldingtool)) - if(!build_step) - var/obj/item/weapon/weldingtool/WT = I - if(WT.remove_fuel(0, user)) - build_step++ - overlays += "hs_hole" - user << "You weld a hole in [src]!" - else if(build_step == 1) - var/obj/item/weapon/weldingtool/WT = I - if(WT.remove_fuel(0, user)) - build_step-- - overlays -= "hs_hole" - user << "You weld the hole in [src] shut!" - - else if(isprox(I) && (build_step == 1)) - if(!user.unEquip(I)) - return - build_step++ - user << "You add the prox sensor to [src]!" - overlays += "hs_eye" - name = "helmet/signaler/prox sensor assembly" - qdel(I) - - else if(((istype(I, /obj/item/robot_parts/l_arm)) || (istype(I, /obj/item/robot_parts/r_arm))) && (build_step == 2)) - if(!user.unEquip(I)) - return - build_step++ - user << "You add the robot arm to [src]!" - name = "helmet/signaler/prox sensor/robot arm assembly" - overlays += "hs_arm" - qdel(I) - - else if((istype(I, /obj/item/weapon/melee/baton)) && (build_step >= 3)) - if(!user.unEquip(I)) - return - build_step++ - user << "You complete the Securitron! Beep boop." - var/mob/living/simple_animal/bot/secbot/S = new/mob/living/simple_animal/bot/secbot(get_turf(src)) - S.name = created_name - qdel(I) - qdel(src) - - else if(istype(I, /obj/item/weapon/pen)) - var/t = stripped_input(user, "Enter new robot name", name, created_name,MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t - - else if(istype(I, /obj/item/weapon/screwdriver)) - if(!build_step) - new /obj/item/device/assembly/signaler(get_turf(src)) - new /obj/item/clothing/head/helmet/sec(get_turf(src)) - user << "You disconnect the signaler from the helmet." - qdel(src) - - else if(build_step == 2) - overlays -= "hs_eye" - new /obj/item/device/assembly/prox_sensor(get_turf(src)) - user << "You detach the proximity sensor from [src]." - build_step-- - - else if(build_step == 3) - overlays -= "hs_arm" - new /obj/item/robot_parts/l_arm(get_turf(src)) - user << "You remove the robot arm from [src]." - build_step-- - /obj/machinery/bot_core/secbot req_access = list(access_security) diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 75e71a6ed77..fa0f4d29a38 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -161,4 +161,19 @@ corpseuniform = /obj/item/clothing/under/color/lightpurple corpsesuit = /obj/item/clothing/suit/wizrobe corpseshoes = /obj/item/clothing/shoes/sandal - corpsehelmet = /obj/item/clothing/head/wizard \ No newline at end of file + corpsehelmet = /obj/item/clothing/head/wizard + + +/obj/effect/landmark/mobcorpse/nanotrasensoldier + name = "Nanotrasen Private Security Officer" + corpseuniform = /obj/item/clothing/under/rank/security + corpsesuit = /obj/item/clothing/suit/armor/vest + corpseshoes = /obj/item/clothing/shoes/combat + corpsegloves = /obj/item/clothing/gloves/combat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/gas/sechailer/swat + corpsehelmet = /obj/item/clothing/head/helmet/swat/nanotrasen + corpseback = /obj/item/weapon/storage/backpack/security + corpseid = 1 + corpseidjob = "Private Security Force" + corpseidaccess = "Security Officer" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 9e4eac0075c..f863d12faa1 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -33,7 +33,7 @@ D << "You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)]." return D.visible_message("[D] begins to reactivate [src].", "You begin to reactivate [src]...") - if(do_after(user,30,needhand = 1, target = src)) + if(do_after(user,30, 1, target = src)) adjustBruteLoss(-getBruteLoss()) //Heal all brute damage stat = CONSCIOUS icon_state = icon_living @@ -49,7 +49,7 @@ if("Cannibalize") if(D.health < D.maxHealth) D.visible_message("[D] begins to cannibalize parts from [src].", "You begin to cannibalize parts from [src]...") - if(do_after(D, 60,5,0, target = src)) + if(do_after(D, 60, 0, target = src)) D.visible_message("[D] repairs itself using [src]'s remains!", "You repair yourself using [src]'s remains.") D.adjustBruteLoss(-src.maxHealth) new /obj/effect/decal/cleanable/oil/streak(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 8c057a49d3c..b717b0ac252 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -113,28 +113,3 @@ /mob/living/simple_animal/drone/stripPanelEquip(obj/item/what, mob/who, where) ..(what, who, where, 1) - -/mob/living/simple_animal/drone/verb/quick_equip() - set name = "quick-equip" - set hidden = 1 - var/obj/item/I = get_active_hand() - var/obj/item/weapon/storage/S = get_inactive_hand() - var/obj/item/weapon/storage/T = internal_storage - if (!I) - usr << "You are not holding anything to equip!" - return - if(equip_to_appropriate_slot(I)) - if(hand) - update_inv_l_hand() - else - update_inv_r_hand() - else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there - s_active.handle_item_insertion(I) - else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand - S.handle_item_insertion(I) - else if (istype(T) && T.can_be_inserted(I,1)) // If carrying storage item like toolbox - T.handle_item_insertion(I) - else if(!internal_storage) - equip_to_slot(I, slot_drone_storage) - else - usr << "You are unable to equip that!" diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index c4e5c7efb8c..9fabb8f858a 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -2,13 +2,13 @@ name = "Guardian Spirit" real_name = "Guardian Spirit" desc = "A mysterious being that stands by it's charge, ever vigilant." - speak_emote = list("intones") + speak_emote = list("hisses") response_help = "passes through" response_disarm = "flails at" response_harm = "punches" - icon = 'icons/mob/mob.dmi' - icon_state = "stand" - icon_living = "stand" + icon = 'icons/mob/guardian.dmi' + icon_state = "guardianorange" + icon_living = "guardianorange" icon_dead = "stand" speed = 0 a_intent = "harm" @@ -26,7 +26,6 @@ melee_damage_upper = 15 butcher_results = list(/obj/item/weapon/ectoplasm = 1) AIStatus = AI_OFF - var/animated_manifest = FALSE var/cooldown = 0 var/damage_transfer = 1 //how much damage from each attack we transfer to the owner var/mob/living/summoner @@ -34,7 +33,6 @@ var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" var/magic_fluff_string = " You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" - var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!" /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies ..() @@ -119,11 +117,6 @@ if(loc == summoner) loc = get_turf(summoner) cooldown = world.time + 30 - if(animated_manifest) - var/end_icon = icon_state - icon_state = "parasite_forming" - spawn(6) - icon_state = end_icon /mob/living/simple_animal/hostile/guardian/proc/Recall() if(cooldown > world.time) @@ -217,7 +210,6 @@ environment_smash = 1 magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random." /mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies ..() @@ -265,7 +257,6 @@ environment_smash = 2 magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies." var/battlecry = "AT" /mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() @@ -299,7 +290,6 @@ playstyle_string = "As a Support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay." magic_fluff_string = "..And draw the CMO, a potent force of life...and death." tech_fluff_string = "Boot sequence complete. Medical modules active. Bluespace modules activated. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace." var/turf/simulated/floor/beacon var/beacon_cooldown = 0 var/toggle = FALSE @@ -424,7 +414,6 @@ playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal." var/list/snares = list() var/toggle = FALSE @@ -502,7 +491,6 @@ playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click." magic_fluff_string = "..And draw the Scientist, master of explosive death." tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items." var/bomb_cooldown = 0 /mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) @@ -609,7 +597,6 @@ else gaurdiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in possible_guardians var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch - var/picked_color = randomColor(0) switch(gaurdiantype) if("Chaos") @@ -638,26 +625,20 @@ user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall user.verbs += /mob/living/proc/guardian_reset + + var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") + var/colour = pick("orange", "pink", "red", "blue", "green") + G.name = "[picked_name] [capitalize(colour)]" + G.real_name = "[picked_name] [capitalize(colour)]" + G.icon_living = "guardian[colour]" + G.icon_state = "guardian[colour]" + G.icon_dead = "guardian[colour]" + switch (theme) if("magic") - G.name = "[mob_name] [capitalize(picked_color)]" - G.color = color2hex(picked_color) - G.real_name = "[mob_name] [capitalize(picked_color)]" user << "[G.magic_fluff_string]." if("tech") - var/colour = pick("orange", "neon", "pink", "red", "blue", "green") - G.name = "[mob_name] [capitalize(colour)]" - G.real_name = "[mob_name] [capitalize(colour)]" - G.icon_living = "parasite[colour]" - G.icon_state = "parasite[colour]" - G.icon_dead = "parasite[colour]" - G.animated_manifest = TRUE user << "[G.tech_fluff_string]." - G.speak_emote = list("states") - if("bio") - user << "[G.bio_fluff_string]." - G.attacktext = "swarms" - G.speak_emote = list("chitters") G.mind.name = "[G.real_name]" /obj/item/weapon/guardiancreator/choose @@ -678,21 +659,6 @@ /obj/item/weapon/guardiancreator/tech/choose random = FALSE -/obj/item/weapon/guardiancreator/biological - name = "scarab egg cluster" - desc = "A parasitic species that will nest in the closest living creature upon birth. While not great for your health, they'll defend their new 'hive' to the death." - icon = 'icons/obj/syringe.dmi' - icon_state = "combat_hypo" - theme = "bio" - mob_name = "Scarab Swarm" - use_message = "The eggs begin to twitch..." - used_message = "The cluster already hatched." - failure_message = "...but soon settles again. Guess they weren't ready to hatch after all." - -/obj/item/weapon/guardiancreator/biological/choose - random = FALSE - - /obj/item/weapon/paper/guardian name = "Holoparasite Guide" icon_state = "alienpaper_words" @@ -724,11 +690,6 @@ return - - - - - ///HUD /datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen_midnight.dmi') @@ -761,8 +722,6 @@ mymob.client.screen += adding - - //HUD BUTTONS /obj/screen/guardian diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index b2f13828c02..7d8e73e889b 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -31,6 +31,7 @@ faction = list("carp") flying = 1 + pressure_resistance = 200 gold_core_spawnable = 1 /mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 65a603ddb9e..a7c6dff1d42 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -24,7 +24,7 @@ speak_emote = list("states") gold_core_spawnable = 1 del_on_death = 1 - loot = (/obj/effect/decal/cleanable/robot_debris) + loot = list(/obj/effect/decal/cleanable/robot_debris) /mob/living/simple_animal/hostile/hivebot/New() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 31ae1247d0a..f1774d355f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -155,6 +155,9 @@ if(ranged)//We ranged? Shoot at em if(target_distance >= 2 && ranged_cooldown <= 0)//But make sure they're a tile away at least, and our range attack is off cooldown OpenFire(target) + if(!Process_Spacemove()) // Drifting + walk(src,0) + return 1 if(retreat_distance != null)//If we have a retreat distance, check if we need to run from our target if(target_distance <= retreat_distance)//If target's closer than our retreat distance, run walk_away(src,target,retreat_distance,move_to_delay) @@ -320,4 +323,4 @@ . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) - return !FindTarget(possible_targets, 1) + return !FindTarget(possible_targets, 1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 257967c8712..c0474b51e44 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -58,7 +58,7 @@ return var/mob/living/simple_animal/hostile/illusion/M = new(loc) M.faction = faction.Copy() - M.Copy_Parent(parent_mob, life_span, health/2, melee_damage_upper, multiply_chance) + M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2) M.GiveTarget(L) ///////Actual Types///////// diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 95e12f3ba7c..bfd17bc69db 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -136,7 +136,6 @@ wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, /obj/item/weapon/ore/uranium) - var/alerted = 0 var/chase_time = 100 /mob/living/simple_animal/hostile/asteroid/goldgrub/New() @@ -157,7 +156,8 @@ visible_message("The [src.name] tries to flee from [target.name]!") retreat_distance = 10 minimum_distance = 10 - Burrow() + spawn(chase_time) + Burrow() /mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget() if(istype(target, /obj/item/weapon/ore)) @@ -173,12 +173,9 @@ visible_message("The ore was swallowed whole!") /mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time - if(!alerted) - alerted = 1 - spawn(chase_time) - if(alerted) - visible_message("The [src.name] buries into the ground, vanishing from sight!") - qdel(src) + if(!stat) + visible_message("The [src.name] buries into the ground, vanishing from sight!") + qdel(src) /mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P) visible_message("The [P.name] was repelled by [src.name]'s girth!") @@ -220,12 +217,16 @@ minimum_distance = 3 pass_flags = PASSTABLE loot = list(/obj/item/organ/internal/hivelord_core) + var/next_brood = 0 + var/brood_cooldown = 20 /mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood(src.loc) - A.GiveTarget(target) - A.friends = friends - A.faction = faction + if(world.time >= next_brood) + var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood(src.loc) + A.GiveTarget(target) + A.friends = friends + A.faction = faction + next_brood = world.time + brood_cooldown return /mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() @@ -373,6 +374,8 @@ /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() var/tturf = get_turf(target) + if(!(istype(tturf, /turf/simulated))) + return if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen visible_message("The [src.name] digs its tentacles under [target.name]!") new /obj/effect/goliath_tentacle/original(tturf) diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm new file mode 100644 index 00000000000..7d75f4a747e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -0,0 +1,58 @@ +/mob/living/simple_animal/hostile/nanotrasen + name = "Nanotrasen Private Security Officer" + desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." + icon_state = "nanotrasen" + icon_living = "nanotrasen" + icon_dead = null + icon_gib = "syndicate_gib" + speak_chance = 25 + turns_per_move = 5 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + speed = 0 + stat_attack = 1 + robust_searching = 1 + maxHealth = 100 + health = 100 + harm_intent_damage = 5 + melee_damage_lower = 10 + melee_damage_upper = 15 + attacktext = "punches" + attack_sound = 'sound/weapons/punch1.ogg' + a_intent = "harm" + loot = list(/obj/effect/landmark/mobcorpse/nanotrasensoldier) + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("nanotrasenprivate") + status_flags = CANPUSH + speak = list("Stop resisting!", "I AM THE LAW!", "Face the wrath of the golden bolt!", "Stop breaking the law, asshole!") + search_objects = 1 + + +/mob/living/simple_animal/hostile/nanotrasen/Aggro() + ..() + summon_backup(15) + say("411 in progress, requesting backup!") + + +/mob/living/simple_animal/hostile/nanotrasen/ranged + icon_state = "nanotrasenranged" + icon_living = "nanotrasenranged" + ranged = 1 + retreat_distance = 3 + minimum_distance = 5 + casingtype = /obj/item/ammo_casing/c45 + projectilesound = 'sound/weapons/Gunshot.ogg' + loot = list(/obj/item/weapon/gun/projectile/automatic/pistol/m1911, + /obj/effect/landmark/mobcorpse/nanotrasensoldier) + + +/mob/living/simple_animal/hostile/nanotrasen/ranged/smg + icon_state = "nanotrasenrangedsmg" + icon_living = "nanotrasenrangedsmg" + rapid = 1 + casingtype = /obj/item/ammo_casing/c46x30mm + projectilesound = 'sound/weapons/Gunshot_smg.ogg' + loot = list(/obj/item/weapon/gun/projectile/automatic/wt550, + /obj/effect/landmark/mobcorpse/nanotrasensoldier) \ No newline at end of file diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 082296dcaf2..ed176d9aa3c 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -27,7 +27,7 @@ player_list |= src update_Login_details() world.update_status() - + client.images = null //remove the images such as AIs being unable to see runes client.screen = list() //remove hud items just in case if(hud_used) qdel(hud_used) //remove the hud objects @@ -37,7 +37,8 @@ sight |= SEE_SELF ..() - + if (key != client.key) + key = client.key if(loc && !isturf(loc)) client.eye = loc client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index f1bc6dcabcc..968b4f0c16c 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -1,5 +1,5 @@ /mob/Logout() - SSnano.on_logout(src) + SStgui.on_logout(src) player_list -= src log_access("Logout: [key_name(src)]") if(admin_datums[src.ckey]) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 585d7ddb96c..82362afc3c1 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -278,30 +278,12 @@ var/next_mob_id = 0 /mob/proc/equip_to_slot_or_del(obj/item/W, slot) equip_to_slot_if_possible(W, slot, 1, 1, 0) -//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. -var/list/slot_equipment_priority = list( \ - slot_back,\ - slot_wear_id,\ - slot_w_uniform,\ - slot_wear_suit,\ - slot_wear_mask,\ - slot_head,\ - slot_shoes,\ - slot_gloves,\ - slot_ears,\ - slot_glasses,\ - slot_belt,\ - slot_s_store,\ - slot_l_store,\ - slot_r_store\ - ) - //puts the item "W" into an appropriate slot in a human's inventory //returns 0 if it cannot, 1 if successful /mob/proc/equip_to_appropriate_slot(obj/item/W) if(!istype(W)) return 0 - for(var/slot in slot_equipment_priority) + for(var/slot in W.slot_equipment_priority) if(equip_to_slot_if_possible(W, slot, 0, 1, 1)) //qdel_on_fail = 0; disable_warning = 0; redraw_mob = 1 return 1 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 2792e69b0f1..0b51dc021d1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -373,7 +373,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return /proc/IsAdminGhost(var/mob/user) - if(check_rights(R_ADMIN, 0) && istype(user, /mob/dead/observer)) + if(check_rights(R_ADMIN, 0) && istype(user, /mob/dead/observer) && user.client.AI_Interact) return 1 else return 0 \ No newline at end of file diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 4e55cef28f9..7f622559c7d 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -7,7 +7,7 @@ gender = pick(MALE,FEMALE) underwear = random_underwear(gender) undershirt = random_undershirt(gender) - socks = random_socks(gender) + socks = random_socks() skin_tone = random_skin_tone() hair_style = random_hair_style(gender) facial_hair_style = random_facial_hair_style(gender) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 689058e6aea..97fec9be03e 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -993,112 +993,90 @@ /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null - gender = NEUTER /datum/sprite_accessory/socks/white_norm name = "Normal White" icon_state = "white_norm" - gender = NEUTER /datum/sprite_accessory/socks/black_norm name = "Normal Black" icon_state = "black_norm" - gender = NEUTER /datum/sprite_accessory/socks/white_short name = "Short White" icon_state = "white_short" - gender = NEUTER /datum/sprite_accessory/socks/black_short name = "Short Black" icon_state = "black_short" - gender = NEUTER /datum/sprite_accessory/socks/white_knee name = "Knee-high White" icon_state = "white_knee" - gender = NEUTER /datum/sprite_accessory/socks/black_knee name = "Knee-high Black" icon_state = "black_knee" - gender = NEUTER /datum/sprite_accessory/socks/thin_knee name = "Knee-high Thin" icon_state = "thin_knee" - gender = FEMALE /datum/sprite_accessory/socks/striped_knee name = "Knee-high Striped" icon_state = "striped_knee" - gender = NEUTER /datum/sprite_accessory/socks/rainbow_knee name = "Knee-high Rainbow" icon_state = "rainbow_knee" - gender = NEUTER /datum/sprite_accessory/socks/white_thigh name = "Thigh-high White" icon_state = "white_thigh" - gender = NEUTER /datum/sprite_accessory/socks/black_thigh name = "Thigh-high Black" icon_state = "black_thigh" - gender = NEUTER /datum/sprite_accessory/socks/thin_thigh name = "Thigh-high Thin" icon_state = "thin_thigh" - gender = FEMALE /datum/sprite_accessory/socks/striped_thigh name = "Thigh-high Striped" icon_state = "striped_thigh" - gender = NEUTER /datum/sprite_accessory/socks/rainbow_thigh name = "Thigh-high Rainbow" icon_state = "rainbow_thigh" - gender = NEUTER /datum/sprite_accessory/socks/usa_knee name = "Knee-High Freedom Stripes" icon_state = "assblastusa_knee" - gender = NEUTER /datum/sprite_accessory/socks/usa_thigh name = "Thigh-high Freedom Stripes" icon_state = "assblastusa_thigh" - gender = NEUTER /datum/sprite_accessory/socks/uk_knee name = "Knee-High UK Stripes" icon_state = "uk_knee" - gender = NEUTER /datum/sprite_accessory/socks/uk_thigh name = "Thigh-high UK Stripes" icon_state = "uk_thigh" - gender = NEUTER /datum/sprite_accessory/socks/commie_knee name = "Knee-High Commie Stripes" icon_state = "commie_knee" - gender = NEUTER /datum/sprite_accessory/socks/commie_thigh name = "Thigh-high Commie Stripes" icon_state = "commie_thigh" - gender = NEUTER /datum/sprite_accessory/socks/pantyhose name = "Pantyhose" icon_state = "pantyhose" - gender = FEMALE //////////.////////////////// // MutantParts Definitions // diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm deleted file mode 100644 index c713e14bb45..00000000000 --- a/code/modules/nano/nanoui.dm +++ /dev/null @@ -1,365 +0,0 @@ - /** - * NanoUI - * - * Contains the NanoUI datum, and its procs. - * - * /tg/station user interface library - * thanks to baystation12 - * - * modified by neersighted - **/ - - /** - * NanoUI datum: - * - * Represents a NanoUI. - **/ -/datum/nanoui - var/mob/user // The mob who opened/is using the NanoUI. - var/atom/movable/src_object // The object which owns the NanoUI. - var/title // The title of te NanoUI. - var/ui_key // The ui_key of the NanoUI. This allows multiple UIs for one src_object. - var/window_id // The window_id for browse() and onclose(). - var/width = 0 // The window width. - var/height = 0 // The window height - var/window_options = list( // Extra options to winset(). - "focus" = 0, - "titlebar" = 1, - "can_resize" = 1, - "can_minimize" = 1, - "can_maximize" = 0, - "can_close" = 1, - "auto_format" = 0 - ) - var/atom/ref = null // An extra ref to call when the window is closed. - var/layout = "nanotrasen" // The layout to be used for this UI. - var/template // The template to be used for this UI. - var/auto_update = 1 // Update the NanoUI every MC tick. - var/list/initial_data // The data (and datastructure) used to initialize the NanoUI - var/status = NANO_INTERACTIVE // The status/visibility of the NanoUI. - var/datum/nano_state/state = null // Topic state used to determine status. Topic states are in interactions/. - var/datum/nanoui/master_ui // The parent NanoUI. - var/list/datum/nanoui/children = list() // Children of this NanoUI. - - /** - * public - * - * Create a new NanoUI. - * - * required user mob The mob who opened/is using the NanoUI. - * required src_object atom/movable The object which owns the NanoUI. - * required ui_key string The ui_key of the NanoUI. - * required template string The template to render the NanoUI content with. - * optional title string The title of the NanoUI. - * optional width int The window width. - * optional height int The window height. - * optional ref atom An extra ref to use when the window is closed. - * optional master_ui datum/nanoui The parent NanoUI. - * optional state datum/nano_state The state used to determine status. - * - * return datum/nanoui The requested NanoUI. - **/ -/datum/nanoui/New(mob/user, atom/movable/src_object, ui_key, template, \ - title = 0, width = 0, height = 0, \ - atom/ref = null, datum/nanoui/master_ui = null, \ - datum/nano_state/state = default_state) - src.user = user - src.src_object = src_object - src.ui_key = ui_key - src.window_id = "\ref[src_object]-[ui_key]" - - set_template(template) - - if(title) - src.title = sanitize(title) - if(width) - src.width = width - if(height) - src.height = height - - if(ref) - src.ref = ref - - src.master_ui = master_ui - if(master_ui) - master_ui.children += src - src.state = state - - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/nanoui) - assets.send(user) - - /** - * public - * - * Open this NanoUI (and initialize it with data). - * - * optional data list The data to intialize the UI with. - **/ -/datum/nanoui/proc/open(list/data = null) - if(!user.client) - return // Bail if there is no client. - - update_status(push = 0) // Update the window status. - if(status == NANO_CLOSE) - return // Bail if we should close. - - if(!initial_data) - if(!data) // If we don't have initial_data and data was not passed, get data from the src_object. - data = src_object.get_ui_data(user) - set_initial_data(data) // Otherwise use the passed data. - - var/window_size = "" - if(width && height) // If we have a width and height, use them. - window_size = "size=[width]x[height];" - - user << browse(get_html(), "window=[window_id];[window_size][list2params(window_options)]") // Open the window. - winset(user, window_id, "on-close=\"nanoclose \ref[src]\"") // Instruct the client to signal NanoUI when the window is closed. - SSnano.on_open(src) - - /** - * public - * - * Reinitialize the NanoUI. - * (Possibly with a new template and/or data). - * - * optional template string The filename of the new template. - * optional data list The new initial data. - **/ -/datum/nanoui/proc/reinitialize(template, list/data) - if(template) - set_template(template) // Set a new template. - if(data) - set_initial_data(data) // Replace the initial_data. - open() - - /** - * public - * - * Close the NanoUI, and all its children. - **/ -/datum/nanoui/proc/close() - user << browse(null, "window=[window_id]") // Close the window. - SSnano.on_close(src) - for(var/datum/nanoui/child in children) // Loop through and close all children. - child.close() - - /** - * public - * - * Sets the browse() window options for this NanoUI. - * - * required window_options list The window options to set. - **/ -/datum/nanoui/proc/set_window_options(list/window_options) - src.window_options = window_options - - /** - * public - * - * Set the layout for this NanoUI. - * This loads custom layout styles and templates for this NanoUI. - * - * required layout string The new UI layout. - **/ -/datum/nanoui/proc/set_layout(layout) - src.layout = lowertext(layout) - - /** - * public - * - * Set the template for this NanoUI. - * - * required template string The new UI template. - **/ -/datum/nanoui/proc/set_template(template) - src.template = lowertext(template) - - /** - * public - * - * Enable/disable auto-updating of the NanoUI. - * - * required state bool Enable/disable auto-updating. - **/ -/datum/nanoui/proc/set_auto_update(state = 1) - auto_update = state - - /** - * private - * - * Set the data to initialize the NanoUI with. - * The datastructure cannot be changed by subsequent updates. - * - * optional data list The data/datastructure to initialize the NanoUI with. - **/ -/datum/nanoui/proc/set_initial_data(list/data) - initial_data = data - - /** - * private - * - * Generate HTML for this NanoUI. - * - * return string NanoUI HTML output. - **/ -/datum/nanoui/proc/get_html() - // Generate JSON. - var/list/send_data = get_send_data(initial_data) - var/send_data_json = JSON.stringify(send_data) - // Strip junk. - send_data_json = replacetext(send_data_json, "'", "'") - send_data_json = replacetext(send_data_json, "ÿ", "") - - // Populate it. - var/send_html = replacetext(SSnano.html, "!!data!!", send_data_json) - return send_html - - /** - * private - * - * Get the config data/datastructure to initialize the NanoUI with. - * - * return list The config data. - **/ -/datum/nanoui/proc/get_config_data() - var/list/config_data = list( - "title" = title, - "status" = status, - "layout" = layout, - "window" = window_id, - "ref" = "\ref[src]", - "user" = list( - "name" = user.name, - "fancy" = user.client.prefs.nanoui_fancy, - "ref" = "\ref[user]" - ), - "srcObject" = list( - "name" = src_object.name, - "ref" = "\ref[src_object]" - ), - "templates" = list( - "layout" = "_[layout]", - "content" = "[template]" - ) - ) - return config_data - - /** - * private - * - * Package the data to send to the UI. - * This is the (regular) data and config data, bundled together. - * - * return list The packaged data. - **/ -/datum/nanoui/proc/get_send_data(list/data) - var/list/send_data = list() - - send_data["config"] = get_config_data() - if(!isnull(data)) - send_data["data"] = data - - return send_data - - /** - * private - * - * Handle clicks from the NanoUI. - * Call the src_object's ui_act() if status is NANO_INTERACTIVE. - * If the src_object's ui_act() returns 1, update all UIs attacked to it. - **/ -/datum/nanoui/Topic(href, href_list) - update_status(push = 0) // Update the window state. - if(status != NANO_INTERACTIVE || user != usr) - return // If UI is not interactive or usr calling Topic is not the UI user. - - var/action = href_list["nano"] // Pull the action out. - href_list -= "nano" - - var/update = src_object.ui_act(action, href_list, state) // Call ui_act() on the src_object. - if(src_object && update) - SSnano.update_uis(src_object) // If we have a src_object and its ui_act() told us to update. - - /** - * private - * - * Update the NanoUI. Only updates the contents/layout if update is true, - * otherwise only updates the status. - * - * optional force bool If the UI should be forced to update. - **/ -/datum/nanoui/process(force = 0) - if(!src_object || !user) // If the object or user died (or something else), abort. - close() - return - - if(status && (force || auto_update)) - update() // Update the UI if the status and update settings allow it. - else - update_status(push = 1) // Otherwise only update status. - - /** - * private - * - * Push data to an already open NanoUI. - * - * required data list The data to send. - * optional force bool If the update should be sent regardless of state. - **/ -/datum/nanoui/proc/push_data(data, force = 0) - update_status(push = 0) // Update the window state. - if(status <= NANO_DISABLED && !force) - return // Cannot update UI, we have no visibility. - - var/list/send_data = get_send_data(data) // Get the data to send. - - // Send the new data to the recieveUpdate() Javascript function. - user << output(JSON.stringify(send_data), "[window_id].browser:receiveUpdate") - - - /** - * private - * - * Updates the UI by interacting with the src_object again, which will hopefully - * call try_ui_update on it. - * - * optional force_open bool If force_open should be passed to ui_interact. - **/ -/datum/nanoui/proc/update(force_open = 0) - src_object.ui_interact(user, ui_key, src, force_open, master_ui, state) - - /** - * private - * - * Update the status/visibility of the NanoUI for its user. - * - * optional push bool Push an update to the UI (an update is always sent for NANO_DISABLED). - **/ -/datum/nanoui/proc/update_status(push = 0) - var/new_status = src_object.nano_state(user, state) - if(master_ui) - new_status = min(new_status, master_ui.status) - - if(new_status == NANO_CLOSE) - close() - else - set_status(new_status, push) - - /** - * private - * - * Set the status/visibility of the NanoUI. - * - * required status int The status to set (NANO_CLOSE/NANO_DISABLED/NANO_UPDATE/NANO_INTERACTIVE). - * optional push bool Push an update to the UI (an update is always sent for NANO_DISABLED). - **/ -/datum/nanoui/proc/set_status(status, push = 0) - if(src.status != status) // Only update if status has changed. - if(src.status == NANO_DISABLED) - src.status = status - if(push) - update() - else - src.status = status - if(status == NANO_DISABLED || push) // Update if the UI just because disabled, or a push is requested. - push_data(null, force = 1) \ No newline at end of file diff --git a/code/modules/nano/states/admin.dm b/code/modules/nano/states/admin.dm deleted file mode 100644 index d4048b9e11d..00000000000 --- a/code/modules/nano/states/admin.dm +++ /dev/null @@ -1,12 +0,0 @@ - /** - * NanoUI State: admin_state - * - * Checks that the user is an admin, end-of-story. - **/ - -/var/global/datum/nano_state/admin_state/admin_state = new() - -/datum/nano_state/admin_state/can_use_topic(atom/movable/src_object, mob/user) - if(check_rights_for(user.client, R_ADMIN)) - return NANO_INTERACTIVE - return NANO_CLOSE diff --git a/code/modules/nano/states/conscious.dm b/code/modules/nano/states/conscious.dm deleted file mode 100644 index 07574e91da7..00000000000 --- a/code/modules/nano/states/conscious.dm +++ /dev/null @@ -1,12 +0,0 @@ - /** - * NanoUI State: conscious_state - * - * Only checks if the user is conscious. - **/ - -/var/global/datum/nano_state/conscious_state/conscious_state = new() - -/datum/nano_state/conscious_state/can_use_topic(atom/movable/src_object, mob/user) - if(user.stat == CONSCIOUS) - return NANO_INTERACTIVE - return NANO_CLOSE diff --git a/code/modules/nano/states/contained.dm b/code/modules/nano/states/contained.dm deleted file mode 100644 index 89b18d0b136..00000000000 --- a/code/modules/nano/states/contained.dm +++ /dev/null @@ -1,12 +0,0 @@ - /** - * NanoUI State: contained_state - * - * Checks that the user is inside the src_object. - **/ - -/var/global/datum/nano_state/contained_state/contained_state = new() - -/datum/nano_state/contained_state/can_use_topic(atom/movable/src_object, mob/user) - if(!src_object.contains(user)) - return NANO_CLOSE - return user.shared_nano_interaction(src_object) diff --git a/code/modules/nano/states/deep_inventory.dm b/code/modules/nano/states/deep_inventory.dm deleted file mode 100644 index d01f43bb2f4..00000000000 --- a/code/modules/nano/states/deep_inventory.dm +++ /dev/null @@ -1,12 +0,0 @@ - /** - * NanoUI State: deep_inventory_state - * - * Checks that the src_object is in the user's fist-level (backpack, webbing, etc) inventory. - **/ - -/var/global/datum/nano_state/deep_inventory_state/deep_inventory_state = new() - -/datum/nano_state/deep_inventory_state/can_use_topic(atom/movable/src_object, mob/user) - if(!user.contains(src_object)) - return NANO_CLOSE - return user.shared_nano_interaction(src_object) diff --git a/code/modules/nano/states/hands.dm b/code/modules/nano/states/hands.dm deleted file mode 100644 index 32807335433..00000000000 --- a/code/modules/nano/states/hands.dm +++ /dev/null @@ -1,20 +0,0 @@ - /** - * NanoUI State: hands_state - * - * Checks that the src_object is in the user's hands. - **/ - -/var/global/datum/nano_state/hands_state/hands_state = new() - -/datum/nano_state/hands_state/can_use_topic(atom/movable/src_object, mob/user) - . = user.shared_nano_interaction(src_object) - if(. > NANO_CLOSE) - return min(., user.hands_can_use_topic(src_object)) - -/mob/proc/hands_can_use_topic(atom/movable/src_object) - return NANO_CLOSE - -/mob/living/hands_can_use_topic(atom/movable/src_object) - if(src_object in get_both_hands(src)) - return NANO_INTERACTIVE - return NANO_CLOSE \ No newline at end of file diff --git a/code/modules/nano/states/inventory.dm b/code/modules/nano/states/inventory.dm deleted file mode 100644 index e1160339e8a..00000000000 --- a/code/modules/nano/states/inventory.dm +++ /dev/null @@ -1,12 +0,0 @@ - /** - * NanoUI State: inventory_state - * - * Checks that the src_object is in the user's top-level (hand, ear, pocket, belt, etc) inventory. - **/ - -/var/global/datum/nano_state/inventory_state/inventory_state = new() - -/datum/nano_state/inventory_state/can_use_topic(atom/movable/src_object, mob/user) - if(!(src_object in user)) - return NANO_CLOSE - return user.shared_nano_interaction(src_object) diff --git a/code/modules/nano/states/physical.dm b/code/modules/nano/states/physical.dm deleted file mode 100644 index 569e284e447..00000000000 --- a/code/modules/nano/states/physical.dm +++ /dev/null @@ -1,21 +0,0 @@ - /** - * NanoUI State: physical_state - * - * Short-circuits the default state to only check physical distance. - **/ - -/var/global/datum/nano_state/physical/physical_state = new() - -/datum/nano_state/physical/can_use_topic(atom/movable/src_object, mob/user) - . = user.shared_nano_interaction(src_object) - if(. > NANO_CLOSE) - return min(., user.physical_can_use_topic(src_object)) - -/mob/proc/physical_can_use_topic(atom/movable/src_object) - return NANO_CLOSE - -/mob/living/physical_can_use_topic(atom/movable/src_object) - return shared_living_nano_distance(src_object) - -/mob/living/silicon/physical_can_use_topic(atom/movable/src_object) - return max(NANO_UPDATE, shared_living_nano_distance(src_object)) // Silicons can always see. diff --git a/code/modules/nano/states/self.dm b/code/modules/nano/states/self.dm deleted file mode 100644 index 9817c68ac0e..00000000000 --- a/code/modules/nano/states/self.dm +++ /dev/null @@ -1,12 +0,0 @@ - /** - * NanoUI State: self_state - * - * Only checks that the user and src_object are the same. - **/ - -/var/global/datum/nano_state/self_state/self_state = new() - -/datum/nano_state/self_state/can_use_topic(atom/movable/src_object, mob/user) - if(src_object != user) - return NANO_CLOSE - return user.shared_nano_interaction(src_object) diff --git a/code/modules/nano/states/states.dm b/code/modules/nano/states/states.dm deleted file mode 100644 index 532f7e4dfb9..00000000000 --- a/code/modules/nano/states/states.dm +++ /dev/null @@ -1,112 +0,0 @@ - /** - * NanoUI States - * - * Base state and helpers for states. Just does some sanity checks, implement a state for in-depth checks. - **/ - - /** - * public - * - * Checks if a user can use src_object's NanoUI, under the given state. - * - * required user mob The mob who opened/is using the NanoUI. - * required state datum/nano_state The state to check. - * - * return NANO_state The state of the UI. - **/ -/atom/proc/nano_state(mob/user, datum/nano_state/state) - var/src_object = nano_host() - - if(istype(user, /mob/dead/observer)) // Special-case ghosts. - if(check_rights_for(user.client, R_ADMIN)) - return NANO_INTERACTIVE // Admins can interact anyway. - if(get_dist(src_object, src) > user.client.view) - return NANO_CLOSE // Keep ghosts from opening too many NanoUIs. - return NANO_UPDATE // Ghosts can only view. - return state.can_use_topic(src_object, user) // Check if the state allows interaction. - - /** - * private - * - * Checks if a user can use src_object's NanoUI, and returns the state. - * Can call a mob proc, which allows overrides for each mob. - * - * required src_object atom/movable The object which owns the NanoUI. - * required user mob The mob who opened/is using the NanoUI. - * - * return NANO_state The state of the UI. - **/ -/datum/nano_state/proc/can_use_topic(atom/movable/src_object, mob/user) - return NANO_CLOSE // Don't allow interaction by default. - - - /** - * public - * - * Standard interaction/sanity checks. Different mob types may have overrides. - * - * return NANO_state The state of the UI. - **/ -/mob/proc/shared_nano_interaction(atom/movable/src_object) - if(!client || stat) // Close NanoUIs if mindless or dead/unconcious. - return NANO_CLOSE - // Update NanoUIs if incapicitated but concious. - else if(incapacitated() || lying) - return NANO_UPDATE - return NANO_INTERACTIVE - -/mob/living/carbon/human/shared_nano_interaction(atom/movable/src_object) - // If we have telekinesis and remain close enough, allow interaction. - if(dna.check_mutation(TK)) - if(tkMaxRangeCheck(src, src_object)) - return NANO_INTERACTIVE - return ..() - -/mob/living/silicon/ai/shared_nano_interaction(atom/movable/src_object) - if(lacks_power()) // Close NanoUIs if the AI is unpowered. - return NANO_CLOSE - return ..() - -/mob/living/silicon/robot/shared_nano_interaction(atom/movable/src_object) - if(cell.charge <= 0) // Close NanoUIs if the Borg is unpowered. - return NANO_CLOSE - if(lockcharge) // Disable NanoUIs if the Borg is locked. - return NANO_DISABLED - return ..() - -/** - * public - * - * Check the distance for a living mob. - * Really only used for checks outside the context of a mob. - * Otherwise, use shared_living_nano_distance(). - * - * required src_object atom/movable The object which owns the NanoUI. - * required user mob The mob who opened/is using the NanoUI. - * - * return NANO_state The state of the UI. - **/ -/atom/proc/contents_nano_distance(atom/movable/src_object, mob/living/user) - return user.shared_living_nano_distance(src_object) // Just call this mob's check. - - /** - * public - * - * Distance versus interaction check. - * - * required src_object atom/movable The object which owns the NanoUI. - * - * return NANO_state The state of the UI. - **/ -/mob/living/proc/shared_living_nano_distance(atom/movable/src_object) - if(!(src_object in view(4, src))) // If the object is out of view, close it. - return NANO_CLOSE - - var/dist = get_dist(src_object, src) - if(dist <= 1) // Open and interact if 1-0 tiles away. - return NANO_INTERACTIVE - else if(dist <= 2) // View only if 2-3 tiles away. - return NANO_UPDATE - else if(dist <= 5) // Disable if 5 tiles away. - return NANO_DISABLED - return NANO_CLOSE // Otherwise, we got nothing. \ No newline at end of file diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index fda579af7ef..e4b60e7d420 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -76,64 +76,37 @@ Contents: else if(M.assigned_role in command_positions) possible_targets[M] = 1 //good-guy +/* + Alright, so, if I had my way I'd axe all this retarded bullshit entirely, but I know some people would complain because + porting ninja specifics to the random gen system would go horribly. I can at the very least axe 99% of the autism + and make ninja code slightly more bearable. + - Iamgoofball +*/ var/list/objectives = list(1,2,3,4) - while(Mind.objectives.len < 6) //still not enough objectives! - switch(pick_n_take(objectives)) + while(Mind.objectives.len < 6) //still not enough objectives! // WHY DOES THIS CALL FOR 6 OBJECTIVES + switch(pick_n_take(objectives)) // BUT THEN PREVENT YOU FROM GETTING 4 IN THE END if(1) //research - var/datum/objective/download/O = new /datum/objective/download() - O.owner = Mind - O.gen_amount_goal() - Mind.objectives += O + add_objective(Mind, /datum/objective/download) if(2) //steal - var/datum/objective/steal/special/O = new /datum/objective/steal/special() - O.owner = Mind - Mind.objectives += O + add_objective(Mind, /datum/objective/default/steal/special) if(3) //protect/kill - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/assassinate/O = new /datum/objective/assassinate() - O.owner = Mind - O.target = M - O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." - Mind.objectives += O - else //protect - var/datum/objective/protect/O = new /datum/objective/protect() - O.owner = Mind - O.target = M - O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." - Mind.objectives += O + if(prob(50)) + add_objective(Mind, /datum/objective/default/assassinate) + else + add_objective(Mind, /datum/objective/default/protect) if(4) //debrain/capture - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/debrain/O = new /datum/objective/debrain() - O.owner = Mind - O.target = M - O.explanation_text = "Steal the brain of [M.current.real_name]." - Mind.objectives += O - else //capture - var/datum/objective/capture/O = new /datum/objective/capture() - O.owner = Mind - O.gen_amount_goal() - Mind.objectives += O + if(prob(50)) + add_objective(Mind, /datum/objective/default/debrain) + else + add_objective(Mind, /datum/objective/capture) else break //Add a survival objective since it's usually broad enough for any round type. - var/datum/objective/O = new /datum/objective/survive() - O.owner = Mind - Mind.objectives += O + add_objective(Mind, /datum/objective/escape_obj/survive) + //add some RP-fluff Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 240c534e634..a53171e4621 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -626,10 +626,10 @@ else ui_interact(user) -/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "apc", name, 550, 550) + ui = new(user, src, ui_key, "apc", name, 460, 515) ui.open() /obj/machinery/power/apc/get_ui_data(mob/user) @@ -747,12 +747,22 @@ if(!can_use(usr, 1)) return + if(locked && !usr.has_unlimited_silicon_privilege) + return + switch(action) if("lock") + if(usr.has_unlimited_silicon_privilege) + if(emagged || (stat & (BROKEN|MAINT))) + usr << "The APC does not respond to the command." + else + locked = !locked + update_icon() + if("cover") coverlocked = !coverlocked - if ("breaker") + if("breaker") toggle_breaker() - if("chargemode") + if("charge") chargemode = !chargemode if(!chargemode) charging = 0 @@ -773,19 +783,12 @@ environ = setsubsystem(val) update_icon() update() - if("toggleaccess") - if(usr.has_unlimited_silicon_privilege) - if(emagged || (stat & (BROKEN|MAINT))) - usr << "The APC does not respond to the command." - else - locked = !locked - update_icon() if("overload") if(usr.has_unlimited_silicon_privilege) src.overload_lighting() if("hack") var/mob/living/silicon/ai/malfai = usr - if(get_malf_status(malfai)==1) + if(get_malf_status(malfai) == 1) if (malfai.malfhacking) malfai << "You are already hacking an APC." return 1 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index b2ca9ae4a1b..9a021cd1b4e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -468,6 +468,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \ item_state = "coil_red" max_amount = MAXCOIL amount = MAXCOIL + merge_type = /obj/item/stack/cable_coil // This is here to let its children merge between themselves item_color = "red" desc = "A coil of power cable." throwforce = 0 diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index cc65f704968..aa748fbbf03 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -92,7 +92,7 @@ var/stun = min(shock_damage, 15) user.Stun(stun) user.Weaken(10) - user.burn_skin(shock_damage) + user.electrocute_act(shock_damage, src, 1) user.visible_message("[user.name] was shocked by the [src.name]!", \ "You feel a powerful shock course through your body, sending you flying!", \ "You hear a heavy electrical crack.") diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index a51b1f0c7bd..9d0238fba71 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -256,22 +256,27 @@ else if(input_attempt && input_available > 0 && input_available >= input_level) inputting = 1 + else + inputting = 0 //outputting - if(outputting) - output_used = min( charge/SMESRATE, output_level) //limit output to that stored + if(output_attempt) + if(outputting) + output_used = min( charge/SMESRATE, output_level) //limit output to that stored - charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) - add_avail(output_used) // add output to powernet (smes side) + add_avail(output_used) // add output to powernet (smes side) - if(output_used < 0.0001) // either from no charge or set to 0 - outputting = 0 - investigate_log("lost power and turned off","singulo") - else if(output_attempt && charge > output_level && output_level > 0) - outputting = 1 + if(output_used < 0.0001) // either from no charge or set to 0 + outputting = 0 + investigate_log("lost power and turned off","singulo") + else if(output_attempt && charge > output_level && output_level > 0) + outputting = 1 + else + output_used = 0 else - output_used = 0 + outputting = 0 // only update icon if state changed if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != outputting) @@ -324,10 +329,10 @@ return ui_interact(user) -/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "smes", name, 500, 455) + ui = new(user, src, ui_key, "smes", name, 340, 440) ui.open() /obj/machinery/power/smes/get_ui_data() @@ -364,7 +369,7 @@ log_smes(usr.ckey) update_icon() if("input") - switch(params["set"]) + switch(params["input"]) if("custom") var/custom = input(usr, "What rate would you like this SMES to attempt to charge at? Max is [input_level_max].") as null|num if(custom) @@ -380,7 +385,7 @@ input_level = Clamp(input_level, 0, input_level_max) log_smes(usr.ckey) if("output") - switch(params["set"]) + switch(params["output"]) if("custom") var/custom = input(usr, "What rate would you like this SMES to attempt to output at? Max is [output_level_max].") as null|num if(custom) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 58f62ad9f8f..f138b106657 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -369,10 +369,10 @@ return ui_interact(user) -/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "solar_control", name, 515, 425) + ui = new(user, src, ui_key, "solar_control", name, 465, 400) ui.open() /obj/machinery/power/solar_control/get_ui_data() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index f1af4c5f66f..e1e2018779e 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -73,6 +73,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, spawn(100) var/obj/singularity/energy_ball/EB = new(loc) orbiting_balls.Add(EB) + poi_list.Remove(EB) EB.transform *= pick(0.3,0.4,0.5,0.6,0.7) EB.is_orbiting = 1 var/icon/I = icon(icon,icon_state,dir) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 818601f831d..ea35c457cb9 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -176,7 +176,7 @@ name = "wt550 magazine (4.6x30mm)" icon_state = "46x30mmt-20" ammo_type = /obj/item/ammo_casing/c46x30mm - caliber = "4x6x30mm" + caliber = "4.6x30mm" max_ammo = 20 /obj/item/ammo_box/magazine/wt550m9/update_icon() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ac922b9637a..51e0a7822be 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -428,6 +428,10 @@ obj/item/weapon/gun/proc/newshot() process_fire(target, user, 1, params) +/obj/item/weapon/gun/proc/unlock() //used in summon guns and as a convience for admins + if(pin) + qdel(pin) + pin = new /obj/item/device/firing_pin ///////////// // ZOOMING // diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index e2659248250..ea52cf11f12 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -39,7 +39,7 @@ item_state = "laser" desc = "An industrial-grade heavy-duty laser rifle with a modified laser lense to scatter its shot into multiple smaller lasers. The inner-core can self-charge for theorically infinite use." origin_tech = "combat=5;materials=4;powerstorage=4" - ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/scatter) + ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter, /obj/item/ammo_casing/energy/laser) /obj/item/weapon/gun/energy/laser/cyborg can_charge = 0 @@ -55,7 +55,7 @@ /obj/item/weapon/gun/energy/laser/scatter name = "scatter laser gun" desc = "A laser gun equipped with a refraction kit that spreads bolts." - ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/scatter) + ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter, /obj/item/ammo_casing/energy/laser) /obj/item/weapon/gun/energy/lasercannon name = "laser cannon" diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm new file mode 100644 index 00000000000..d6a54ffa0ea --- /dev/null +++ b/code/modules/projectiles/guns/mounted.dm @@ -0,0 +1,28 @@ +/obj/item/weapon/gun/energy/gun/advtaser/mounted + name = "mounted taser" + desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." + icon_state = "armcannon" + force = 5 + selfcharge = 1 + flags = NODROP + slot_flags = null + w_class = 5 + can_flashlight = 0 + +/obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... + src.loc = null//send it to nullspace to get retrieved by the implant later on. gotta cover those edge cases. + +/obj/item/weapon/gun/energy/laser/mounted + name = "mounted laser" + desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam." + icon_state = "armcannon" + item_state = "armcannonlase" + force = 5 + selfcharge = 1 + flags = NODROP + slot_flags = null + w_class = 5 + materials = null + +/obj/item/weapon/gun/energy/laser/mounted/dropped() + src.loc = null diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 80f135be1ba..681db297fc3 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -37,7 +37,6 @@ if(istype(AM, mag_type)) if(magazine) user << "You perform a tactical reload on \the [src], replacing the magazine." - user.say(pick("I'M RELOADING!!!", "NEW MAG IN!!!", "CHANGING MAG!!!", "COVER ME! I'M RELOADING!!!", "RELOADING!!!")) magazine.loc = get_turf(src.loc) magazine.update_icon() magazine = null @@ -233,4 +232,4 @@ fire_sound = 'sound/weapons/Gunshot_smg.ogg' can_suppress = 0 burst_size = 3 - fire_delay = 1 + fire_delay = 1 \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index ff5927f326c..ee8f3198a85 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -113,6 +113,40 @@ ..() user << "The bolt is [bolt_open ? "open" : "closed"]." + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted + name = "enchanted bolt action rifle" + desc = "Careful not to lose your head." + var/guns_left = 30 + mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/New() + ..() + bolt_open = 1 + pump() + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/dropped() + guns_left = 0 + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) + ..() + if(guns_left) + var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new + GUN.guns_left = src.guns_left - 1 + user.drop_item() + user.swap_hand() + user.put_in_hands(GUN) + else + user.drop_item() + src.throw_at_fast(pick(oview(7,get_turf(user))),1,1) + user.visible_message("[user] tosses aside the spent rifle!") + + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted + max_ammo =1 + + + ///////////////////////////// // DOUBLE BARRELED SHOTGUN // ///////////////////////////// diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index 06fd47933ba..2555a8ac16a 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -16,6 +16,9 @@ /obj/item/weapon/gun/projectile/automatic/toy/process_chamber(eject_casing = 0, empty_chamber = 1) ..() +/obj/item/weapon/gun/projectile/automatic/toy/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/automatic/toy/pistol name = "foam force pistol" desc = "A small, easily concealable toy handgun. Ages 8 and up." @@ -39,6 +42,12 @@ magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) ..() +/obj/item/weapon/gun/projectile/automatic/toy/pistol/unrestricted + pin = /obj/item/device/firing_pin + +/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/shotgun/toy name = "foam force shotgun" desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up." @@ -55,6 +64,9 @@ if(chambered && !chambered.BB) qdel(chambered) +/obj/item/weapon/gun/projectile/shotgun/toy/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/shotgun/toy/crossbow name = "foam force crossbow" desc = "A weapon favored by many overactive children. Ages 8 and up." @@ -77,6 +89,10 @@ /obj/item/weapon/gun/projectile/automatic/c20r/toy/process_chamber(eject_casing = 0, empty_chamber = 1) ..() + +/obj/item/weapon/gun/projectile/automatic/c20r/toy/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/automatic/l6_saw/toy name = "donksoft LMG" desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up." @@ -86,4 +102,7 @@ mag_type = /obj/item/ammo_box/magazine/toy/m762 /obj/item/weapon/gun/projectile/automatic/l6_saw/toy/process_chamber(eject_casing = 0, empty_chamber = 1) - ..() \ No newline at end of file + ..() + +/obj/item/weapon/gun/projectile/automatic/l6_saw/toy/unrestricted + pin = /obj/item/device/firing_pin \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index e29f2604fe5..cb9f8e0894e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -85,10 +85,10 @@ return ui_interact(user) -/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "chem_dispenser", name, 530, 700) + ui = new(user, src, ui_key, "chem_dispenser", name, 412, 600) ui.open() /obj/machinery/chem_dispenser/get_ui_data() @@ -119,7 +119,7 @@ for(var/re in dispensable_reagents) var/datum/reagent/temp = chemical_reagents_list[re] if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("reagent" = temp.id)))) + chemicals.Add(list(list("title" = temp.name, "id" = temp.id))) data["chemicals"] = chemicals return data @@ -129,7 +129,7 @@ switch(action) if("amount") - amount = round(text2num(params["set"]), 5) // round to nearest 5 + amount = round(text2num(params["amount"]), 5) // round to nearest 5 if (amount < 0) // Since the user can actually type the commands himself, some sanity checking amount = 0 if (amount > 100) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 2e19186075b..eacd2fba7e9 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -87,6 +87,7 @@ if("temperature") desired_temp = Clamp(input("Please input the target temperature", name) as num, 0, 1000) if("eject") + on = FALSE eject_beaker() return 1 @@ -95,10 +96,10 @@ return ui_interact(user) -/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) if (!ui) - ui = new(user, src, ui_key, "chem_heater", name, 350, 400) + ui = new(user, src, ui_key, "chem_heater", name, 275, 400) ui.open() /obj/machinery/chem_heater/get_ui_data() diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 3ec9c3c9a0d..4704c01e251 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -2,6 +2,7 @@ /datum/reagent/blob name = "Unknown" description = "shouldn't exist and you should adminhelp immediately." + var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects var/blobbernaut_message = "slams" //blobbernaut attack verb var/message = "The blob strikes you" //message sent to any mob hit by the blob var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt @@ -41,6 +42,7 @@ name = "Sporing Pods" id = "sporing_pods" description = "will do low toxin damage and produce fragile spores when killed or on expanding." + shortdesc = "will do low toxin damage." color = "#E88D5D" message_living = ", and you feel sick" @@ -70,6 +72,7 @@ name = "Replicating Foam" id = "replicating_foam" description = "will do medium brute damage and replicate when damaged." + shortdesc = "will do medium brute damage." color = "#7B5A57" /datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -93,7 +96,8 @@ /datum/reagent/blob/energized_fibers name = "Energized Fibers" id = "energized_fibers" - description = "will do low burn, high stamina damage, and react to stamina damage." + description = "will do low burn and high stamina damage, and react to stamina damage." + shortdesc = "will do low burn and high stamina damage." color = "#FFDC73" blobbernaut_message = "shocks" message_living = ", and you feel a strong tingling sensation" @@ -153,7 +157,7 @@ /datum/reagent/blob/envenomed_filaments name = "Envenomed Filaments" id = "envenomed_filaments" - description = "will cause medium toxin damage, stamina damage, and inject targets with toxins." + description = "will cause medium toxin and stamina damage, and inject targets with toxins." color = "#9ACD32" message_living = ", and you feel sick and nauseated" @@ -170,7 +174,7 @@ /datum/reagent/blob/lexorin_jelly name = "Lexorin Jelly" id = "lexorin_jelly" - description = "will cause low brute damage, high oxygen damage, and cause targets to be unable to breathe." + description = "will cause low brute and high oxygen damage, and cause targets to be unable to breathe." color = "#00E5B1" message_living = ", and your lungs feel heavy and weak" @@ -208,7 +212,7 @@ /datum/reagent/blob/cryogenic_liquid name = "Cryogenic Liquid" id = "cryogenic_liquid" - description = "will do low burn damage, stamina damage, and cause targets to freeze." + description = "will do low burn and stamina damage, and cause targets to freeze." color = "#8BA6E9" blobbernaut_message = "splashes" message = "The blob splashes you with an icy liquid" @@ -229,6 +233,7 @@ name = "Synchronous Mesh" id = "synchronous_mesh" description = "will do brute damage for each nearby blob and spread damage between nearby blobs." + shortdesc = "will do brute damage for each nearby blob." color = "#65ADA2" blobbernaut_message = "synchronously strikes" message = "The blobs strike you" @@ -259,7 +264,8 @@ /datum/reagent/blob/pressurized_slime name = "Pressurized Slime" id = "pressurized_slime" - description = "will do low brute damage, oxygen damage, stamina damage, and wet tiles when damaged or killed." + description = "will do low brute, oxygen, and stamina damage, and wet tiles when damaged or killed." + shortdesc = "will do low brute, oxygen, and stamina damage, and wet tiles under targets." color = "#AAAABB" blobbernaut_message = "emits slime at" message = "The blob splashes into you" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 11d169070d1..39986a13f8f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -141,9 +141,8 @@ */ /datum/reagent/water/reaction_obj(obj/O, reac_volume) - if(istype(O,/obj/item)) - var/obj/item/Item = O - Item.extinguish() + if(istype(O)) + O.extinguish() // Monkey cube if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) @@ -163,10 +162,11 @@ */ /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with water can help put them out! - if(!istype(M, /mob/living)) + if(!istype(M)) return if(method == TOUCH) M.adjust_fire_stacks(-(reac_volume / 10)) + M.ExtinguishMob() ..() /datum/reagent/water/holywater @@ -763,6 +763,16 @@ if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) M.ContractDisease(new /datum/disease/transformation/xeno(0)) +/datum/reagent/fungalspores + name = "Tubercle bacillus Cosmosis microbes" + id = "fungalspores" + description = "Active fungal spores." + color = "#92D17D" // rgb: 146, 209, 125 + +/datum/reagent/fungalspores/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) + if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) + M.ForceContractDisease(new /datum/disease/tuberculosis(0)) + /datum/reagent/fluorosurfactant//foam precursor name = "Fluorosurfactant" id = "fluorosurfactant" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 100c6e85271..47d9191bcfd 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -5,7 +5,7 @@ icon_state = null w_class = 1 var/amount_per_transfer_from_this = 5 - var/list/possible_transfer_amounts = list(5,10,15,25,30) + var/list/possible_transfer_amounts = list(5,10,15,20,25,30) var/volume = 30 var/list/list_reagents = null var/spawned_disease = null diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 1ac7629b5bd..36b9eb2ed21 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -296,4 +296,16 @@ name = "Spanish flu culture bottle" desc = "A small bottle. Contains a sample of Inquisitius." icon_state = "bottle3" - spawned_disease = /datum/disease/fluspanish \ No newline at end of file + spawned_disease = /datum/disease/fluspanish + +/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis + name = "Fungal Tuberculosis culture bottle" + desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus." + icon_state = "bottle3" + spawned_disease = /datum/disease/tuberculosis + +/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure + name = "BVAK bottle" + desc = "A small bottle containing Bio Virus Antidote Kit." + icon_state = "bottle5" + list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index e9275ebd71c..11ad8afc028 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -1,7 +1,7 @@ /obj/item/weapon/reagent_containers/glass name = "glass" amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5, 10, 15, 25, 30, 50) + possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) volume = 50 flags = OPENCONTAINER spillable = 1 @@ -197,7 +197,7 @@ materials = list(MAT_GLASS=2500) volume = 100 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,25,30,50,100) + possible_transfer_amounts = list(5,10,15,20,25,30,50,100) flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/noreact @@ -216,7 +216,7 @@ materials = list(MAT_GLASS=5000) volume = 300 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,25,30,50,100,300) + possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) flags = OPENCONTAINER /obj/item/weapon/reagent_containers/glass/beaker/cryoxadone @@ -253,7 +253,7 @@ materials = list(MAT_METAL=200) w_class = 3 amount_per_transfer_from_this = 20 - possible_transfer_amounts = list(10,20,30,50,70) + possible_transfer_amounts = list(10,15,20,25,30,50,70) volume = 70 flags = OPENCONTAINER | BLOCKHAIR slot_flags = SLOT_HEAD @@ -282,3 +282,12 @@ user << "[src]'s contents spill all over you!" reagents.reaction(user, TOUCH) reagents.clear_reagents() + +/obj/item/weapon/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) + if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head + var/index = slot_equipment_priority.Find(slot_head) + slot_equipment_priority.Remove(slot_head) + . = ..() + slot_equipment_priority.Insert(index, slot_head) + return + return ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index df207b0b3cf..090942bf0e6 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -112,3 +112,11 @@ name = "morphine medipen" desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though." list_reagents = list("morphine" = 10) + +/obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure + name = "BVAK autoinjector" + desc = "Bio Virus Antidote Kit autoinjector. Has a two use system for yourself, and someone else. Inject when infected." + icon_state = "stimpen" + volume = 60 + amount_per_transfer_from_this = 30 + list_reagents = list("atropine" = 10, "epinephrine" = 10, "salbutamol" = 20, "spaceacillin" = 20) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 135b716506b..f35a8196405 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -114,7 +114,7 @@ /obj/item/weapon/stock_parts/matter_bin name = "matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container designed to hold compressed matter awaiting reconstruction." icon_state = "matter_bin" origin_tech = "materials=1" materials = list(MAT_METAL=80) @@ -155,7 +155,7 @@ /obj/item/weapon/stock_parts/matter_bin/adv name = "advanced matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container designed to hold compressed matter awaiting reconstruction." icon_state = "advanced_matter_bin" origin_tech = "materials=3" rating = 2 @@ -197,7 +197,7 @@ /obj/item/weapon/stock_parts/matter_bin/super name = "super matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container designed to hold compressed matter awaiting reconstruction." icon_state = "super_matter_bin" origin_tech = "materials=5" rating = 3 @@ -239,7 +239,7 @@ /obj/item/weapon/stock_parts/matter_bin/bluespace name = "bluespace matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container designed to hold compressed matter awaiting reconstruction." icon_state = "bluespace_matter_bin" origin_tech = "materials=6" rating = 4 @@ -301,4 +301,4 @@ icon = 'icons/obj/stock_parts.dmi' icon_state = "capacitor" desc = "A debug item for research." - origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;engineering=8;plasmatech=8" \ No newline at end of file + origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;engineering=8;plasmatech=8" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 8ddda4e49f7..3097d3f8b1b 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -460,6 +460,7 @@ unacidable = 1 mouse_opacity = 0 var/mob/living/immune = list() // the one who creates the timestop is immune + var/list/stopped_atoms = list() var/freezerange = 2 var/duration = 140 alpha = 125 @@ -474,9 +475,10 @@ /obj/effect/timestop/proc/timestop() playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1) - while(loc) - if(duration) - for(var/mob/living/M in orange (freezerange, src.loc)) + for(var/i in 1 to duration-1) + for(var/atom/A in orange (freezerange, src.loc)) + if(istype(A, /mob/living)) + var/mob/living/M = A if(M in immune) continue M.stunned = 10 @@ -485,24 +487,36 @@ var/mob/living/simple_animal/hostile/H = M H.AIStatus = AI_OFF H.LoseTarget() - continue - for(var/obj/item/projectile/P in orange (freezerange, src.loc)) + stopped_atoms |= M + else if(istype(A, /obj/item/projectile)) + var/obj/item/projectile/P = A P.paused = TRUE - duration -- - else - for(var/mob/living/M in orange (freezerange+2, src.loc)) //longer range incase they lag out of it or something - M.stunned = 0 - M.anchored = 0 - if(istype(M, /mob/living/simple_animal/hostile)) - var/mob/living/simple_animal/hostile/H = M - H.AIStatus = initial(H.AIStatus) - continue - for(var/obj/item/projectile/P in orange(freezerange+2, src.loc)) - P.paused = FALSE - qdel(src) - return + stopped_atoms |= P + + for(var/mob/living/M in stopped_atoms) + if(get_dist(get_turf(M),get_turf(src)) > freezerange) //If they lagged/ran past the timestop somehow, just ignore them + unfreeze_mob(M) + stopped_atoms -= M sleep(1) + //End + for(var/mob/living/M in stopped_atoms) + unfreeze_mob(M) + + for(var/obj/item/projectile/P in stopped_atoms) + P.paused = FALSE + qdel(src) + return + + + +/obj/effect/timestop/proc/unfreeze_mob(mob/living/M) + M.stunned = 0 + M.anchored = 0 + if(istype(M, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/H = M + H.AIStatus = initial(H.AIStatus) + /obj/effect/timestop/wizard duration = 100 diff --git a/code/modules/ruins/ruin_areas.dm b/code/modules/ruins/ruin_areas.dm new file mode 100644 index 00000000000..f0c8cade312 --- /dev/null +++ b/code/modules/ruins/ruin_areas.dm @@ -0,0 +1,23 @@ +//Parent types + +/area/ruin/ + name = "\improper Unexplored Location" + icon_state = "away" + + +/area/ruin/unpowered + always_unpowered = 0 + +/area/ruin/unpowered/no_grav + has_gravity = 0 + +/area/ruin/powered + requires_power = 0 + + + +//Areas + +/area/ruin/unpowered/no_grav/way_home + name = "\improper Salvation" + icon_state = "away" \ No newline at end of file diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index c32bca635a4..c56b673a067 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -25,7 +25,7 @@ /datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(tool) - if(IC || tool.w_class > 3 || NODROP in tool.flags || istype(tool, /obj/item/organ)) + if(IC || tool.w_class > 3 || (NODROP in tool.flags) || istype(tool, /obj/item/organ)) user << "You can't seem to fit [tool] in [target]'s [target_zone]!" return 0 else diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index b904d93f9e3..e6314c5b040 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -253,6 +253,73 @@ if(H.stat == CONSCIOUS) H << "You feel your heart beating again!" +/obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped. + name = "Arm-mounted item implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + icon_state = "chest_implant" + implant_color = "#007ACC" + slot = "shoulders" + origin_tech = "materials=5;biotech=4;powerstorage=4" + organ_action_name = "Toggle Arm Mod" + var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! + var/out = 0//determines if the item is in the owner's hand or not + var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. + +/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() + if(overloaded)//ensure the implant isn't broken + owner.visible_message("The implant doesn't respond. It seems to be broken...") + return + if(out)//check if the owner has the item out already + owner.unEquip(holder, 1)//if he does, take it away. then, + holder.loc = null//stash it in nullspace + out = 0//and set this to clarify the item isn't out. + owner.visible_message("You retract [holder].") + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + else//if he doesn't have the item out + if(owner.put_in_hands(holder))//put it in his hands. + out = 1 + owner.visible_message("You extend [holder]!") + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + else//if this fails to put the item in his hands, + holder.loc = null//keep it in nullspace + owner.visible_message("You can't extend [holder] if you can't use your hands!") + +/obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed... + if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then... + return + if(out)//check if he has the item out... + owner.unEquip(holder, 1)//if he does, take it away. + holder.loc = null + out = 0 + owner.visible_message("[holder] forcibly retracts into your arm.") + owner.visible_message("A loud bang comes from [owner]...") + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) + owner << "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?" + owner.adjust_fire_stacks(20) + owner.IgniteMob()//ignite the owner, as well as + owner.say("AUUUUUUUUUUUUUUUUUUGH!!") + owner.adjustFireLoss(25)//severely injure him! + overloaded = 1//then make sure this can't happen again by breaking the implant. + +/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser! + name = "Arm-cannon taser implant" + desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." + icon_state = "armcannon_tase_implant" + origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" + organ_action_name = "Toggle Arm Cannon Taser" + +/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... + holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) + +/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser! + name = "Arm-cannon laser implant" + desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." + icon_state = "armcannon_lase_implant" + origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it + organ_action_name = "Toggle Arm Cannon Laser" + +/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() + holder = new /obj/item/weapon/gun/energy/laser/mounted(src) //BOX O' IMPLANTS diff --git a/code/modules/nano/external.dm b/code/modules/tgui/external.dm similarity index 50% rename from code/modules/nano/external.dm rename to code/modules/tgui/external.dm index 7a15197eedc..1efa5cee8fe 100644 --- a/code/modules/nano/external.dm +++ b/code/modules/tgui/external.dm @@ -1,41 +1,36 @@ /** - * NanoUI External + * tgui external * - * Contains all external NanoUI declarations. - * - * /tg/station user interface library - * thanks to baystation12 - * - * modified by neersighted + * Contains all external tgui declarations. **/ /** * public * - * Used to open and update NanoUIs. - * If this proc is not implemented properly, the NanoUI will not update correctly. + * Used to open and update UIs. + * If this proc is not implemented properly, the UI will not update correctly. * - * required user mob The mob who opened/is using the NanoUI. - * optional ui_key string The ui_key of the NanoUI. - * optional ui datum/nanoui The UI to be updated, if it exists. + * required user mob The mob who opened/is using the UI. + * optional ui_key string The ui_key of the UI. + * optional ui datum/tgui The UI to be updated, if it exists. * optional force_open bool If the UI should be re-opened instead of updated. - * optional master_ui datum/nanoui The parent NanoUI. - * optional state datum/nano_state The state used to determine status. + * optional master_ui datum/tgui The parent UI. + * optional state datum/ui_state The state used to determine status. **/ -/atom/movable/proc/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, \ - force_open = 0, datum/nano_ui/master_ui = null, \ - datum/nano_state/state = default_state) +/atom/movable/proc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, \ + force_open = 0, datum/tgui/master_ui = null, \ + datum/ui_state/state = default_state) return -1 // Sorta implemented. /** * public * - * Data to be sent to the NanoUI. - * This must be implemented for a NanoUI to work. + * Data to be sent to the UI. + * This must be implemented for a UI to work. * - * required user mob The mob interacting with the NanoUI. + * required user mob The mob interacting with the UI. * - * return list Data to be sent to the NanoUI. + * return list Data to be sent to the UI. **/ /atom/movable/proc/get_ui_data(mob/user) return list() // Not implemented. @@ -44,7 +39,7 @@ /** * public * - * Called on a NanoUI when the UI receieves a href. + * Called on a UI when the UI receieves a href. * Think of this as Topic(). * * required action string The action/button that has been invoked by the user. @@ -59,34 +54,34 @@ /** * private * - * The NanoUI's host object (usually src_object). - * Used internally by nano_state(s). + * The UI's host object (usually src_object). + * Used internally by ui_state(s). **/ -/atom/proc/nano_host() +/atom/proc/ui_host() return src /** * global * - * Used to track NanoUIs for a mob. + * Used to track UIs for a mob. **/ /mob/var/list/open_uis = list() /** * verb * - * Called by NanoUIs when they are closed. + * Called by UIs when they are closed. * Must be a verb so winset() can call it. * * required uiref ref The UI that was closed. **/ -/client/verb/nanoclose(uiref as text) +/client/verb/uiclose(uiref as text) // Name the verb, and hide it from the user panel. - set name = "nanoclose" + set name = "uiclose" set hidden = 1 // Get the UI based on the ref. - var/datum/nanoui/ui = locate(uiref) + var/datum/tgui/ui = locate(uiref) // If we found the UI, close it. if(istype(ui)) diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm new file mode 100644 index 00000000000..c9a3bb467c4 --- /dev/null +++ b/code/modules/tgui/states/admin.dm @@ -0,0 +1,12 @@ + /** + * tgui state: admin_state + * + * Checks that the user is an admin, end-of-story. + **/ + +/var/global/datum/ui_state/admin_state/admin_state = new() + +/datum/ui_state/admin_state/can_use_topic(atom/movable/src_object, mob/user) + if(check_rights_for(user.client, R_ADMIN)) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm new file mode 100644 index 00000000000..1b781a458d7 --- /dev/null +++ b/code/modules/tgui/states/conscious.dm @@ -0,0 +1,12 @@ + /** + * tgui state: conscious_state + * + * Only checks if the user is conscious. + **/ + +/var/global/datum/ui_state/conscious_state/conscious_state = new() + +/datum/ui_state/conscious_state/can_use_topic(atom/movable/src_object, mob/user) + if(user.stat == CONSCIOUS) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm new file mode 100644 index 00000000000..20cda3241e0 --- /dev/null +++ b/code/modules/tgui/states/contained.dm @@ -0,0 +1,12 @@ + /** + * tgui state: contained_state + * + * Checks that the user is inside the src_object. + **/ + +/var/global/datum/ui_state/contained_state/contained_state = new() + +/datum/ui_state/contained_state/can_use_topic(atom/movable/src_object, mob/user) + if(!src_object.contains(user)) + return UI_CLOSE + return user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm new file mode 100644 index 00000000000..4fef9ad5b3c --- /dev/null +++ b/code/modules/tgui/states/deep_inventory.dm @@ -0,0 +1,12 @@ + /** + * tgui state: deep_inventory_state + * + * Checks that the src_object is in the user's fist-level (backpack, webbing, etc) inventory. + **/ + +/var/global/datum/ui_state/deep_inventory_state/deep_inventory_state = new() + +/datum/ui_state/deep_inventory_state/can_use_topic(atom/movable/src_object, mob/user) + if(!user.contains(src_object)) + return UI_CLOSE + return user.shared_ui_interaction(src_object) diff --git a/code/modules/nano/states/default.dm b/code/modules/tgui/states/default.dm similarity index 52% rename from code/modules/nano/states/default.dm rename to code/modules/tgui/states/default.dm index cd5155b9c05..8e1c3e8dec9 100644 --- a/code/modules/nano/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -1,60 +1,60 @@ /** - * NanoUI State: default_state + * tgui state: default_state * * Checks a number of things -- mostly physical distance for humans and view for robots. **/ -/var/global/datum/nano_state/default/default_state = new() +/var/global/datum/ui_state/default/default_state = new() -/datum/nano_state/default/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/default/can_use_topic(atom/movable/src_object, mob/user) return user.default_can_use_topic(src_object) // Call the individual mob-overriden procs. /mob/proc/default_can_use_topic(atom/movable/src_object) - return NANO_CLOSE // Don't allow interaction by default. + return UI_CLOSE // Don't allow interaction by default. /mob/living/default_can_use_topic(atom/movable/src_object) - . = shared_nano_interaction(src_object) - if(. > NANO_CLOSE) - . = min(., shared_living_nano_distance(src_object)) // Check the distance... - if(. == NANO_INTERACTIVE) // Non-human living mobs can only look, not touch. - return NANO_UPDATE + . = shared_ui_interaction(src_object) + if(. > UI_CLOSE) + . = min(., shared_living_ui_distance(src_object)) // Check the distance... + if(. == UI_INTERACTIVE) // Non-human living mobs can only look, not touch. + return UI_UPDATE /mob/living/carbon/human/default_can_use_topic(atom/movable/src_object) - . = shared_nano_interaction(src_object) - if(. > NANO_CLOSE) - . = min(., shared_living_nano_distance(src_object)) // Check the distance... + . = shared_ui_interaction(src_object) + if(. > UI_CLOSE) + . = min(., shared_living_ui_distance(src_object)) // Check the distance... // Derp a bit if we have brain loss. if(prob(getBrainLoss())) - return NANO_UPDATE + return UI_UPDATE /mob/living/silicon/robot/default_can_use_topic(atom/movable/src_object) - . = shared_nano_interaction(src_object) - if(. <= NANO_DISABLED) + . = shared_ui_interaction(src_object) + if(. <= UI_DISABLED) return // Robots can interact with anything they can see. if(get_dist(src, src_object) <= src.client.view) - return NANO_INTERACTIVE - return NANO_DISABLED // Otherwise they can keep the UI open. + return UI_INTERACTIVE + return UI_DISABLED // Otherwise they can keep the UI open. /mob/living/silicon/ai/default_can_use_topic(atom/movable/src_object) - . = shared_nano_interaction(src_object) - if(. < NANO_INTERACTIVE) + . = shared_ui_interaction(src_object) + if(. < UI_INTERACTIVE) return // The AI can interact with anything it can see nearby, or with cameras. if((get_dist(src, src_object) <= src.client.view) || cameranet.checkTurfVis(get_turf_pixel(src_object))) - return NANO_INTERACTIVE - return NANO_CLOSE + return UI_INTERACTIVE + return UI_CLOSE /mob/living/simple_animal/drone/default_can_use_topic(atom/movable/src_object) - . = shared_nano_interaction(src_object) - if(. > NANO_CLOSE) - . = min(., shared_living_nano_distance(src_object)) // Drones can only use things they're near. + . = shared_ui_interaction(src_object) + if(. > UI_CLOSE) + . = min(., shared_living_ui_distance(src_object)) // Drones can only use things they're near. /mob/living/silicon/pai/default_can_use_topic(atom/movable/src_object) // pAIs can only use themselves and the owner's radio. if((src_object == src || src_object == radio) && !stat) - return NANO_INTERACTIVE + return UI_INTERACTIVE else return ..() diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm new file mode 100644 index 00000000000..536a90597e4 --- /dev/null +++ b/code/modules/tgui/states/hands.dm @@ -0,0 +1,20 @@ + /** + * tgui state: hands_state + * + * Checks that the src_object is in the user's hands. + **/ + +/var/global/datum/ui_state/hands_state/hands_state = new() + +/datum/ui_state/hands_state/can_use_topic(atom/movable/src_object, mob/user) + . = user.shared_ui_interaction(src_object) + if(. > UI_CLOSE) + return min(., user.hands_can_use_topic(src_object)) + +/mob/proc/hands_can_use_topic(atom/movable/src_object) + return UI_CLOSE + +/mob/living/hands_can_use_topic(atom/movable/src_object) + if(src_object in get_both_hands(src)) + return UI_INTERACTIVE + return UI_CLOSE \ No newline at end of file diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm new file mode 100644 index 00000000000..a5f7233f00d --- /dev/null +++ b/code/modules/tgui/states/inventory.dm @@ -0,0 +1,12 @@ + /** + * tgui state: inventory_state + * + * Checks that the src_object is in the user's top-level (hand, ear, pocket, belt, etc) inventory. + **/ + +/var/global/datum/ui_state/inventory_state/inventory_state = new() + +/datum/ui_state/inventory_state/can_use_topic(atom/movable/src_object, mob/user) + if(!(src_object in user)) + return UI_CLOSE + return user.shared_ui_interaction(src_object) diff --git a/code/modules/nano/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm similarity index 66% rename from code/modules/nano/states/notcontained.dm rename to code/modules/tgui/states/notcontained.dm index 11dfe67025c..8df75b57626 100644 --- a/code/modules/nano/states/notcontained.dm +++ b/code/modules/tgui/states/notcontained.dm @@ -1,22 +1,22 @@ /** - * NanoUI State: notcontained_state + * tgui state: notcontained_state * * Checks that the user is not inside src_object, and then makes the default checks. **/ -/var/global/datum/nano_state/notcontained_state/notcontained_state = new() +/var/global/datum/ui_state/notcontained_state/notcontained_state = new() -/datum/nano_state/notcontained_state/can_use_topic(atom/movable/src_object, mob/user) - . = user.shared_nano_interaction(src_object) - if(. > NANO_CLOSE) +/datum/ui_state/notcontained_state/can_use_topic(atom/movable/src_object, mob/user) + . = user.shared_ui_interaction(src_object) + if(. > UI_CLOSE) return min(., user.notcontained_can_use_topic(src_object)) /mob/proc/notcontained_can_use_topic(atom/movable/src_object) - return NANO_CLOSE + return UI_CLOSE /mob/living/notcontained_can_use_topic(atom/movable/src_object) if(src_object.contains(src)) - return NANO_CLOSE // Close if we're inside it. + return UI_CLOSE // Close if we're inside it. return default_can_use_topic(src_object) /mob/living/silicon/notcontained_can_use_topic(atom/movable/src_object) diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm new file mode 100644 index 00000000000..a3fae3b276e --- /dev/null +++ b/code/modules/tgui/states/physical.dm @@ -0,0 +1,21 @@ + /** + * tgui state: physical_state + * + * Short-circuits the default state to only check physical distance. + **/ + +/var/global/datum/ui_state/physical/physical_state = new() + +/datum/ui_state/physical/can_use_topic(atom/movable/src_object, mob/user) + . = user.shared_ui_interaction(src_object) + if(. > UI_CLOSE) + return min(., user.physical_can_use_topic(src_object)) + +/mob/proc/physical_can_use_topic(atom/movable/src_object) + return UI_CLOSE + +/mob/living/physical_can_use_topic(atom/movable/src_object) + return shared_living_ui_distance(src_object) + +/mob/living/silicon/physical_can_use_topic(atom/movable/src_object) + return max(UI_UPDATE, shared_living_ui_distance(src_object)) // Silicons can always see. diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm new file mode 100644 index 00000000000..edb7c3ef300 --- /dev/null +++ b/code/modules/tgui/states/self.dm @@ -0,0 +1,12 @@ + /** + * tgui state: self_state + * + * Only checks that the user and src_object are the same. + **/ + +/var/global/datum/ui_state/self_state/self_state = new() + +/datum/ui_state/self_state/can_use_topic(atom/movable/src_object, mob/user) + if(src_object != user) + return UI_CLOSE + return user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/states.dm b/code/modules/tgui/states/states.dm new file mode 100644 index 00000000000..195d9394e3e --- /dev/null +++ b/code/modules/tgui/states/states.dm @@ -0,0 +1,112 @@ + /** + * tgui states + * + * Base state and helpers for states. Just does some sanity checks, implement a state for in-depth checks. + **/ + + /** + * public + * + * Checks if a user can use src_object's UI, under the given state. + * + * required user mob The mob who opened/is using the UI. + * required state datum/ui_state The state to check. + * + * return UI_state The state of the UI. + **/ +/atom/proc/ui_state(mob/user, datum/ui_state/state) + var/src_object = ui_host() + + if(istype(user, /mob/dead/observer)) // Special-case ghosts. + if(check_rights_for(user.client, R_ADMIN)) + return UI_INTERACTIVE // Admins can interact anyway. + if(get_dist(src_object, src) > user.client.view) + return UI_CLOSE // Keep ghosts from opening too many UIs. + return UI_UPDATE // Ghosts can only view. + return state.can_use_topic(src_object, user) // Check if the state allows interaction. + + /** + * private + * + * Checks if a user can use src_object's UI, and returns the state. + * Can call a mob proc, which allows overrides for each mob. + * + * required src_object atom/movable The object which owns the UI. + * required user mob The mob who opened/is using the UI. + * + * return UI_state The state of the UI. + **/ +/datum/ui_state/proc/can_use_topic(atom/movable/src_object, mob/user) + return UI_CLOSE // Don't allow interaction by default. + + + /** + * public + * + * Standard interaction/sanity checks. Different mob types may have overrides. + * + * return UI_state The state of the UI. + **/ +/mob/proc/shared_ui_interaction(atom/movable/src_object) + if(!client || stat) // Close UIs if mindless or dead/unconcious. + return UI_CLOSE + // Update UIs if incapicitated but concious. + else if(incapacitated() || lying) + return UI_UPDATE + return UI_INTERACTIVE + +/mob/living/carbon/human/shared_ui_interaction(atom/movable/src_object) + // If we have telekinesis and remain close enough, allow interaction. + if(dna.check_mutation(TK)) + if(tkMaxRangeCheck(src, src_object)) + return UI_INTERACTIVE + return ..() + +/mob/living/silicon/ai/shared_ui_interaction(atom/movable/src_object) + if(lacks_power()) // Close UIs if the AI is unpowered. + return UI_CLOSE + return ..() + +/mob/living/silicon/robot/shared_ui_interaction(atom/movable/src_object) + if(cell.charge <= 0) // Close UIs if the Borg is unpowered. + return UI_CLOSE + if(lockcharge) // Disable UIs if the Borg is locked. + return UI_DISABLED + return ..() + +/** + * public + * + * Check the distance for a living mob. + * Really only used for checks outside the context of a mob. + * Otherwise, use shared_living_ui_distance(). + * + * required src_object atom/movable The object which owns the UI. + * required user mob The mob who opened/is using the UI. + * + * return UI_state The state of the UI. + **/ +/atom/proc/contents_ui_distance(atom/movable/src_object, mob/living/user) + return user.shared_living_ui_distance(src_object) // Just call this mob's check. + + /** + * public + * + * Distance versus interaction check. + * + * required src_object atom/movable The object which owns the UI. + * + * return UI_state The state of the UI. + **/ +/mob/living/proc/shared_living_ui_distance(atom/movable/src_object) + if(!(src_object in view(4, src))) // If the object is out of view, close it. + return UI_CLOSE + + var/dist = get_dist(src_object, src) + if(dist <= 1) // Open and interact if 1-0 tiles away. + return UI_INTERACTIVE + else if(dist <= 2) // View only if 2-3 tiles away. + return UI_UPDATE + else if(dist <= 5) // Disable if 5 tiles away. + return UI_DISABLED + return UI_CLOSE // Otherwise, we got nothing. \ No newline at end of file diff --git a/code/modules/nano/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm similarity index 53% rename from code/modules/nano/states/zlevel.dm rename to code/modules/tgui/states/zlevel.dm index 199c22e22c0..2f06f36c8f8 100644 --- a/code/modules/nano/states/zlevel.dm +++ b/code/modules/tgui/states/zlevel.dm @@ -1,14 +1,14 @@ /** - * NanoUI State: z_state + * tgui state: z_state * * Only checks that the Z-level of the user and src_object are the same. **/ -/var/global/datum/nano_state/z_state/z_state = new() +/var/global/datum/ui_state/z_state/z_state = new() -/datum/nano_state/z_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/z_state/can_use_topic(atom/movable/src_object, mob/user) var/turf/turf_obj = get_turf(src_object) var/turf/turf_usr = get_turf(user) if(!turf_obj || !turf_usr || !(turf_obj.z == turf_usr.z)) - return NANO_CLOSE - return NANO_INTERACTIVE + return UI_CLOSE + return UI_INTERACTIVE diff --git a/code/modules/nano/subsystem.dm b/code/modules/tgui/subsystem.dm similarity index 60% rename from code/modules/nano/subsystem.dm rename to code/modules/tgui/subsystem.dm index b539566bd45..14b4dd5f7e5 100644 --- a/code/modules/nano/subsystem.dm +++ b/code/modules/tgui/subsystem.dm @@ -1,34 +1,29 @@ /** - * NanoUI Subsystem + * tgui subsystem * - * Contains all NanoUI state and subsystem code. - * - * /tg/station user interface library - * thanks to baystation12 - * - * modified by neersighted + * Contains all tgui state and subsystem code. **/ /** * public * - * Get a open NanoUI given a user, src_object, and ui_key and try to update it with data. + * Get a open UI given a user, src_object, and ui_key and try to update it with data. * - * required user mob The mob who opened/is using the NanoUI. - * required src_object atom/movable The object which owns the NanoUI. - * required ui_key string The ui_key of the NanoUI. - * optional ui datum/nanoui The UI to be updated, if it exists. + * required user mob The mob who opened/is using the UI. + * required src_object atom/movable The object which owns the UI. + * required ui_key string The ui_key of the UI. + * optional ui datum/tgui The UI to be updated, if it exists. * optional data list The data to update the UI with, if it exists. * optional force_open bool If the UI should be re-opened instead of updated. * - * return datum/nanoui The found NanoUI. + * return datum/tgui The found UI. **/ -/datum/subsystem/nano/proc/try_update_ui(mob/user, atom/movable/src_object, ui_key, datum/nanoui/ui, \ +/datum/subsystem/tgui/proc/try_update_ui(mob/user, atom/movable/src_object, ui_key, datum/tgui/ui, \ list/data = null, force_open = 0) if(!data) data = src_object.get_ui_data(user) - if(isnull(ui)) // No NanoUI was passed, so look for one. + if(isnull(ui)) // No UI was passed, so look for one. ui = get_open_ui(user, src_object, ui_key) if(!isnull(ui)) @@ -43,22 +38,22 @@ /** * private * - * Get a open NanoUI given a user, src_object, and ui_key. + * Get a open UI given a user, src_object, and ui_key. * - * required user mob The mob who opened/is using the NanoUI. - * required src_object atom/movable The object which owns the NanoUI. - * required ui_key string The ui_key of the NanoUI. + * required user mob The mob who opened/is using the UI. + * required src_object atom/movable The object which owns the UI. + * required ui_key string The ui_key of the UI. * - * return datum/nanoui The found NanoUI. + * return datum/tgui The found UI. **/ -/datum/subsystem/nano/proc/get_open_ui(mob/user, atom/movable/src_object, ui_key) +/datum/subsystem/tgui/proc/get_open_ui(mob/user, atom/movable/src_object, ui_key) var/src_object_key = "\ref[src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return null // No UIs open. else if(isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list)) return null // No UIs open for this object. - for(var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) // Find UIs for this object. + for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) // Find UIs for this object. if(ui.user == user) // Make sure we have the right user return ui @@ -67,21 +62,21 @@ /** * private * - * Update all NanoUIs attached to src_object. + * Update all UIs attached to src_object. * - * required src_object atom/movable The object which owns the NanoUIs. + * required src_object atom/movable The object which owns the UIs. * - * return int The number of NanoUIs updated. + * return int The number of UIs updated. **/ -/datum/subsystem/nano/proc/update_uis(atom/movable/src_object) +/datum/subsystem/tgui/proc/update_uis(atom/movable/src_object) var/src_object_key = "\ref[src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // Couldn't find any UIs for this object. var/update_count = 0 for(var/ui_key in open_uis[src_object_key]) - for(var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) - if(ui && ui.src_object && ui.user && ui.src_object.nano_host()) // Check the UI is valid. + for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) + if(ui && ui.src_object && ui.user && ui.src_object.ui_host()) // Check the UI is valid. ui.process(force = 1) // Update the UI. update_count++ // Count each UI we update. return update_count @@ -89,21 +84,21 @@ /** * private * - * Close all NanoUIs attached to src_object. + * Close all UIs attached to src_object. * - * required src_object atom/movable The object which owns the NanoUIs. + * required src_object atom/movable The object which owns the UIs. * - * return int The number of NanoUIs closed. + * return int The number of UIs closed. **/ -/datum/subsystem/nano/proc/close_uis(atom/movable/src_object) +/datum/subsystem/tgui/proc/close_uis(atom/movable/src_object) var/src_object_key = "\ref[src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // Couldn't find any UIs for this object. var/close_count = 0 for(var/ui_key in open_uis[src_object_key]) - for(var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) - if(ui && ui.src_object && ui.user && ui.src_object.nano_host()) // Check the UI is valid. + for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) + if(ui && ui.src_object && ui.user && ui.src_object.ui_host()) // Check the UI is valid. ui.close() // Close the UI. close_count++ // Count each UI we close. return close_count @@ -111,20 +106,20 @@ /** * private * - * Update all NanoUIs belonging to a user. + * Update all UIs belonging to a user. * - * required user mob The mob who opened/is using the NanoUI. + * required user mob The mob who opened/is using the UI. * optional src_object atom/movable If provided, only update UIs belonging this atom. * optional ui_key string If provided, only update UIs with this UI key. * - * return int The number of NanoUIs updated. + * return int The number of UIs updated. **/ -/datum/subsystem/nano/proc/update_user_uis(mob/user, atom/movable/src_object = null, ui_key = null) +/datum/subsystem/tgui/proc/update_user_uis(mob/user, atom/movable/src_object = null, ui_key = null) if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) return 0 // Couldn't find any UIs for this user. var/update_count = 0 - for(var/datum/nanoui/ui in user.open_uis) + for(var/datum/tgui/ui in user.open_uis) if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key)) ui.process(force = 1) // Update the UI. update_count++ // Count each UI we upadte. @@ -133,20 +128,20 @@ /** * private * - * Close all NanoUIs belonging to a user. + * Close all UIs belonging to a user. * - * required user mob The mob who opened/is using the NanoUI. + * required user mob The mob who opened/is using the UI. * optional src_object atom/movable If provided, only update UIs belonging this atom. * optional ui_key string If provided, only update UIs with this UI key. * - * return int The number of NanoUIs closed. + * return int The number of UIs closed. **/ -/datum/subsystem/nano/proc/close_user_uis(mob/user, atom/movable/src_object = null, ui_key = null) +/datum/subsystem/tgui/proc/close_user_uis(mob/user, atom/movable/src_object = null, ui_key = null) if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) return 0 // Couldn't find any UIs for this user. var/close_count = 0 - for(var/datum/nanoui/ui in user.open_uis) + for(var/datum/tgui/ui in user.open_uis) if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key)) ui.close() // Close the UI. close_count++ // Count each UI we close. @@ -155,11 +150,11 @@ /** * private * - * Add a NanoUI to the list of open UIs. + * Add a UI to the list of open UIs. * - * required ui datum/nanoui The UI to be added. + * required ui datum/tgui The UI to be added. **/ -/datum/subsystem/nano/proc/on_open(datum/nanoui/ui) +/datum/subsystem/tgui/proc/on_open(datum/tgui/ui) var/src_object_key = "\ref[ui.src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) open_uis[src_object_key] = list(ui.ui_key = list()) // Make a list for the ui_key and src_object. @@ -175,13 +170,13 @@ /** * private * - * Remove a NanoUI from the list of open UIs. + * Remove a UI from the list of open UIs. * - * required ui datum/nanoui The UI to be removed. + * required ui datum/tgui The UI to be removed. * * return bool If the UI was removed or not. **/ -/datum/subsystem/nano/proc/on_close(datum/nanoui/ui) +/datum/subsystem/tgui/proc/on_close(datum/tgui/ui) var/src_object_key = "\ref[ui.src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // It wasn't open. @@ -198,35 +193,35 @@ /** * private * - * Handle client logout, by closing all their NanoUIs. + * Handle client logout, by closing all their UIs. * * required user mob The mob which logged out. * - * return int The number of NanoUIs closed. + * return int The number of UIs closed. **/ -/datum/subsystem/nano/proc/on_logout(mob/user) +/datum/subsystem/tgui/proc/on_logout(mob/user) return close_user_uis(user) /** * private * - * Handle clients switching mobs, by transfering their NanoUIs. + * Handle clients switching mobs, by transfering their UIs. * * required user source The client's original mob. * required user target The client's new mob. * - * return bool If the NanoUIs were transferred. + * return bool If the UIs were transferred. **/ -/datum/subsystem/nano/proc/on_transfer(mob/source, mob/target) +/datum/subsystem/tgui/proc/on_transfer(mob/source, mob/target) if(!source || isnull(source.open_uis) || !istype(source.open_uis, /list) || open_uis.len == 0) - return 0 // The old mob had no open NanoUIs. + return 0 // The old mob had no open UIs. if(isnull(target.open_uis) || !istype(target.open_uis, /list)) target.open_uis = list() // Create a list for the new mob if needed. - for(var/datum/nanoui/ui in source.open_uis) + for(var/datum/tgui/ui in source.open_uis) ui.user = target // Inform the UIs of their new owner. - target.open_uis.Add(ui) // Transfer all the NanoUIs. + target.open_uis.Add(ui) // Transfer all the UIs. source.open_uis.Cut() // Clear the old list. return 1 // Let the caller know we did it. diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm new file mode 100644 index 00000000000..8cc69f3145e --- /dev/null +++ b/code/modules/tgui/tgui.dm @@ -0,0 +1,348 @@ + /** + * tgui + * + * /tg/station user interface library + **/ + + /** + * tgui datum (represents a UI). + **/ +/datum/tgui + var/mob/user // The mob who opened/is using the UI. + var/atom/movable/src_object // The object which owns the UI. + var/title // The title of te UI. + var/ui_key // The ui_key of the UI. This allows multiple UIs for one src_object. + var/window_id // The window_id for browse() and onclose(). + var/width = 0 // The window width. + var/height = 0 // The window height + var/window_options = list( // Extra options to winset(). + "focus" = 0, + "titlebar" = 1, + "can_resize" = 1, + "can_minimize" = 1, + "can_maximize" = 0, + "can_close" = 1, + "auto_format" = 0 + ) + var/atom/ref = null // An extra ref to call when the window is closed. + var/style = "nanotrasen" // The style to be used for this UI. + var/interface // The interface (template) to be used for this UI. + var/auto_update = 1 // Update the UI every MC tick. + var/list/initial_data // The data (and datastructure) used to initialize the UI. + var/status = UI_INTERACTIVE // The status/visibility of the UI. + var/datum/ui_state/state = null // Topic state used to determine status/interactability. + var/datum/tgui/master_ui // The parent UI. + var/list/datum/tgui/children = list() // Children of this UI. + + /** + * public + * + * Create a new UI. + * + * required user mob The mob who opened/is using the UI. + * required src_object atom/movable The object which owns the UI. + * required ui_key string The ui_key of the UI. + * required interface string The interface used to render the UI. + * optional title string The title of the UI. + * optional width int The window width. + * optional height int The window height. + * optional ref atom An extra ref to use when the window is closed. + * optional master_ui datum/tgui The parent UI. + * optional state datum/ui_state The state used to determine status. + * + * return datum/tgui The requested UI. + **/ +/datum/tgui/New(mob/user, atom/movable/src_object, ui_key, interface, \ + title, width = 0, height = 0, \ + atom/ref = null, datum/tgui/master_ui = null, \ + datum/ui_state/state = default_state) + src.user = user + src.src_object = src_object + src.ui_key = ui_key + src.window_id = "\ref[src_object]-[ui_key]" + + set_interface(interface) + + if(title) + src.title = sanitize(title) + if(width) + src.width = width + if(height) + src.height = height + + if(ref) + src.ref = ref + + src.master_ui = master_ui + if(master_ui) + master_ui.children += src + src.state = state + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/tgui) + assets.send(user) + + /** + * public + * + * Open this UI (and initialize it with data). + * + * optional data list The data to intialize the UI with. + **/ +/datum/tgui/proc/open(list/data = null) + if(!user.client) + return // Bail if there is no client. + + update_status(push = 0) // Update the window status. + if(status == UI_CLOSE) + return // Bail if we should close. + + if(!initial_data) + if(!data) // If we don't have initial_data and data was not passed, get data from the src_object. + data = src_object.get_ui_data(user) + set_initial_data(data) // Otherwise use the passed data. + + var/window_size = "" + if(width && height) // If we have a width and height, use them. + window_size = "size=[width]x[height];" + + user << browse(get_html(), "window=[window_id];[window_size][list2params(window_options)]") // Open the window. + winset(user, window_id, "on-close=\"uiclose \ref[src]\"") // Instruct the client to signal UI when the window is closed. + SStgui.on_open(src) + + /** + * public + * + * Reinitialize the UI. + * (Possibly with a new interface and/or data). + * + * optional template string The name of the new interface. + * optional data list The new initial data. + **/ +/datum/tgui/proc/reinitialize(interface, list/data) + if(interface) + set_interface(interface) // Set a new interface. + if(data) + set_initial_data(data) // Replace the initial_data. + open() + + /** + * public + * + * Close the UI, and all its children. + **/ +/datum/tgui/proc/close() + user << browse(null, "window=[window_id]") // Close the window. + SStgui.on_close(src) + for(var/datum/tgui/child in children) // Loop through and close all children. + child.close() + + /** + * public + * + * Sets the browse() window options for this UI. + * + * required window_options list The window options to set. + **/ +/datum/tgui/proc/set_window_options(list/window_options) + src.window_options = window_options + + /** + * public + * + * Set the style for this UI. + * + * required style string The new UI style. + **/ +/datum/tgui/proc/set_style(style) + src.style = lowertext(style) + + /** + * public + * + * Set the interface (template) for this UI. + * + * required interface string The new UI interface. + **/ +/datum/tgui/proc/set_interface(interface) + src.interface = lowertext(interface) + + /** + * public + * + * Enable/disable auto-updating of the UI. + * + * required state bool Enable/disable auto-updating. + **/ +/datum/tgui/proc/set_auto_update(state = 1) + auto_update = state + + /** + * private + * + * Set the data to initialize the UI with. + * The datastructure cannot be changed by subsequent updates. + * + * optional data list The data/datastructure to initialize the UI with. + **/ +/datum/tgui/proc/set_initial_data(list/data) + initial_data = data + + /** + * private + * + * Generate HTML for this UI. + * + * return string UI HTML output. + **/ +/datum/tgui/proc/get_html() + // Poplate HTML with JSON. + return replacetextEx(SStgui.html, "{}", get_json(initial_data)) + + /** + * private + * + * Get the config data/datastructure to initialize the UI with. + * + * return list The config data. + **/ +/datum/tgui/proc/get_config_data() + var/list/config_data = list( + "title" = title, + "status" = status, + "style" = style, + "interface" = interface, + "fancy" = user.client.prefs.tgui_fancy, + "window" = window_id, + "ref" = "\ref[src]", + "user" = list( + "name" = user.name, + "ref" = "\ref[user]" + ), + "srcObject" = list( + "name" = src_object.name, + "ref" = "\ref[src_object]" + ) + ) + return config_data + + /** + * private + * + * Package the data to send to the UI, as JSON. + * This includes the UI data and config_data. + * + * return string The packaged JSON. + **/ +/datum/tgui/proc/get_json(list/data) + var/list/json_data = list() + + json_data["config"] = get_config_data() + if(!isnull(data)) + json_data["data"] = data + + // Generate the JSON; replace bad characters. + var/json = JSON.stringify(json_data) + json = replacetextEx(json, "\improper", "") + + return json + + /** + * private + * + * Handle clicks from the UI. + * Call the src_object's ui_act() if status is UI_INTERACTIVE. + * If the src_object's ui_act() returns 1, update all UIs attacked to it. + **/ +/datum/tgui/Topic(href, href_list) + update_status(push = 0) // Update the window state. + if(status != UI_INTERACTIVE || user != usr) + return // If UI is not interactive or usr calling Topic is not the UI user. + + var/action = href_list["action"] // Pull the action out. + href_list -= "action" + + var/update = src_object.ui_act(action, href_list, state) // Call ui_act() on the src_object. + if(src_object && update) + SStgui.update_uis(src_object) // If we have a src_object and its ui_act() told us to update. + + /** + * private + * + * Update the UI. + * Only updates the data if update is true, otherwise only updates the status. + * + * optional force bool If the UI should be forced to update. + **/ +/datum/tgui/process(force = 0) + if(!src_object || !user) // If the object or user died (or something else), abort. + close() + return + + if(status && (force || auto_update)) + update() // Update the UI if the status and update settings allow it. + else + update_status(push = 1) // Otherwise only update status. + + /** + * private + * + * Push data to an already open UI. + * + * required data list The data to send. + * optional force bool If the update should be sent regardless of state. + **/ +/datum/tgui/proc/push_data(data, force = 0) + update_status(push = 0) // Update the window state. + if(status <= UI_DISABLED && !force) + return // Cannot update UI, we have no visibility. + + // Send the new JSON to the recieveUpdate() Javascript function. + user << output(url_encode(get_json(data)), "[window_id].browser:receiveUpdate") + + + /** + * private + * + * Updates the UI by interacting with the src_object again, which will hopefully + * call try_ui_update on it. + * + * optional force_open bool If force_open should be passed to ui_interact. + **/ +/datum/tgui/proc/update(force_open = 0) + src_object.ui_interact(user, ui_key, src, force_open, master_ui, state) + + /** + * private + * + * Update the status/visibility of the UI for its user. + * + * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). + **/ +/datum/tgui/proc/update_status(push = 0) + var/new_status = src_object.ui_state(user, state) + if(master_ui) + new_status = min(new_status, master_ui.status) + + if(new_status == UI_CLOSE) + close() + else + set_status(new_status, push) + + /** + * private + * + * Set the status/visibility of the UI. + * + * required status int The status to set (UI_CLOSE/UI_DISABLED/UI_UPDATE/UI_INTERACTIVE). + * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). + **/ +/datum/tgui/proc/set_status(status, push = 0) + if(src.status != status) // Only update if status has changed. + if(src.status == UI_DISABLED) + src.status = status + if(push) + update() + else + src.status = status + if(status == UI_DISABLED || push) // Update if the UI just because disabled, or a push is requested. + push_data(null, force = 1) \ No newline at end of file diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm new file mode 100644 index 00000000000..6d9d94747dd --- /dev/null +++ b/code/modules/vehicles/atv.dm @@ -0,0 +1,82 @@ + +/obj/vehicle/atv + name = "all-terrain vehicle" + desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts." + icon_state = "atv" + keytype = /obj/item/key + generic_pixel_x = 0 + generic_pixel_y = 4 + vehicle_move_delay = 1 + var/static/image/atvcover = null + + +/obj/vehicle/atv/New() + ..() + if(!atvcover) + atvcover = image("icons/obj/vehicles.dmi", "atvcover") + atvcover.layer = MOB_LAYER + 0.1 + + +obj/vehicle/atv/post_buckle_mob(mob/living/M) + if(buckled_mob) + overlays += atvcover + else + overlays -= atvcover + + +/obj/vehicle/atv/handle_vehicle_layer() + if(dir == SOUTH) + layer = MOB_LAYER+0.1 + else + layer = OBJ_LAYER + + +//TURRETS! +/obj/vehicle/atv/turret + var/obj/machinery/porta_turret/syndicate/vehicle_turret/turret = null + + +/obj/machinery/porta_turret/syndicate/vehicle_turret + name = "mounted turret" + scan_range = 7 + emp_vunerable = 1 + density = 0 + + +/obj/vehicle/atv/turret/New() + ..() + turret = new(loc) + turret.base = src + + +/obj/vehicle/atv/turret/handle_vehicle_layer() + if(dir == SOUTH) + layer = MOB_LAYER+0.1 + else + layer = OBJ_LAYER + + if(turret) + if(dir == NORTH) + turret.layer = MOB_LAYER+0.1 + else + turret.layer = OBJ_LAYER + + +/obj/vehicle/atv/turret/handle_vehicle_offsets() + ..() + if(turret) + turret.loc = loc + switch(dir) + if(NORTH) + turret.pixel_x = 0 + turret.pixel_y = 4 + if(EAST) + turret.pixel_x = -12 + turret.pixel_y = 4 + if(SOUTH) + turret.pixel_x = 0 + turret.pixel_y = 4 + if(WEST) + turret.pixel_x = 12 + turret.pixel_y = 4 + diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm new file mode 100644 index 00000000000..c74b66caee1 --- /dev/null +++ b/code/modules/vehicles/pimpin_ride.dm @@ -0,0 +1,93 @@ + + +//PIMP-CART +/obj/vehicle/janicart + name = "janicart (pimpin' ride)" + desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." + icon_state = "pussywagon" + keytype = /obj/item/key/janitor + var/obj/item/weapon/storage/bag/trash/mybag = null + var/floorbuffer = 0 + + +/obj/vehicle/janicart/handle_vehicle_offsets() + ..() + if(buckled_mob) + switch(buckled_mob.dir) + if(NORTH) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 4 + if(EAST) + buckled_mob.pixel_x = -12 + buckled_mob.pixel_y = 7 + if(SOUTH) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 7 + if(WEST) + buckled_mob.pixel_x = 12 + buckled_mob.pixel_y = 7 + + +/obj/item/key/janitor + desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." + icon_state = "keyjanitor" + + +/obj/item/janiupgrade + name = "floor buffer upgrade" + desc = "An upgrade for mobile janicarts." + icon = 'icons/obj/vehicles.dmi' + icon_state = "upgrade" + + +/obj/vehicle/janicart/Moved(atom/OldLoc, Dir) + if(floorbuffer) + var/turf/tile = loc + if(isturf(tile)) + tile.clean_blood() + for(var/A in tile) + if(is_cleanable(A)) + qdel(A) + + +/obj/vehicle/janicart/examine(mob/user) + ..() + if(floorbuffer) + user << "It has been upgraded with a floor buffer." + + +/obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/storage/bag/trash)) + if(keytype == /obj/item/key/janitor) + if(!user.drop_item()) + return + user << "You hook the trashbag onto \the [name]." + I.loc = src + mybag = I + else if(istype(I, /obj/item/janiupgrade)) + if(keytype == /obj/item/key/janitor) + floorbuffer = 1 + qdel(I) + user << "You upgrade \the [name] with the floor buffer." + update_icon() + + ..() + + +/obj/vehicle/janicart/update_icon() + overlays.Cut() + if(mybag) + overlays += "cart_garbage" + if(floorbuffer) + overlays += "cart_buffer" + + +/obj/vehicle/janicart/attack_hand(mob/user) + if(..()) + return 1 + else if(mybag) + mybag.loc = get_turf(user) + user.put_in_hands(mybag) + mybag = null + update_icon() + diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm new file mode 100644 index 00000000000..0a440eb370c --- /dev/null +++ b/code/modules/vehicles/secway.dm @@ -0,0 +1,13 @@ + +/obj/vehicle/secway + name = "secway" + desc = "A brave security cyborg gave its life to help you look like a complete tool." + icon_state = "secway" + keytype = /obj/item/key/security + generic_pixel_x = 0 + generic_pixel_y = 4 + + +/obj/item/key/security + desc = "A keyring with a small steel key, and a rubber stun baton accessory." + icon_state = "keysec" \ No newline at end of file diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm new file mode 100644 index 00000000000..6c6c8dbf6a1 --- /dev/null +++ b/code/modules/vehicles/vehicle.dm @@ -0,0 +1,125 @@ + +/obj/vehicle + name = "vehicle" + desc = "A basic vehicle, vroom" + icon = 'icons/obj/vehicles.dmi' + icon_state = "fuckyou" + density = 1 + anchored = 0 + can_buckle = 1 + buckle_lying = 0 + var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle + var/next_vehicle_move = 0 //used for move delays + var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower + var/auto_door_open = TRUE + + //Pixels + var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver + var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver + + +/obj/vehicle/New() + ..() + handle_vehicle_layer() + + +//APPEARANCE +/obj/vehicle/proc/handle_vehicle_layer() + if(dir != NORTH) + layer = MOB_LAYER+0.1 + else + layer = OBJ_LAYER + + +//Override this to set your vehicle's various pixel offsets +//if they differ between directions, otherwise use the +//generic variables +/obj/vehicle/proc/handle_vehicle_offsets() + if(buckled_mob) + buckled_mob.dir = dir + buckled_mob.pixel_x = generic_pixel_x + buckled_mob.pixel_y = generic_pixel_y + + +/obj/vehicle/update_icon() + return + + + +//KEYS +/obj/vehicle/proc/keycheck(mob/user) + if(keytype) + if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) + return 1 + else + return 1 + return 0 + +/obj/item/key + name = "key" + desc = "A small grey key." + icon = 'icons/obj/vehicles.dmi' + icon_state = "key" + w_class = 1 + + +//BUCKLE HOOKS +/obj/vehicle/unbuckle_mob(force = 0) + if(buckled_mob) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + . = ..() + + +/obj/vehicle/user_buckle_mob(mob/living/M, mob/user) + if(user.incapacitated()) + return + for(var/atom/movable/A in get_turf(src)) + if(A.density) + if(A != src && A != M) + return + M.loc = get_turf(src) + ..() + handle_vehicle_offsets() + + +//MOVEMENT +/obj/vehicle/relaymove(mob/user, direction) + if(user.incapacitated()) + unbuckle_mob() + + if(keycheck(user)) + if(!Process_Spacemove(direction) || !has_gravity(src.loc) || world.time < next_vehicle_move || !isturf(loc)) + return + next_vehicle_move = world.time + vehicle_move_delay + + step(src, direction) + + if(buckled_mob) + if(buckled_mob.loc != loc) + buckled_mob.buckled = null //Temporary, so Move() succeeds. + buckled_mob.buckled = src //Restoring + + handle_vehicle_layer() + handle_vehicle_offsets() + else + user << "You'll need the keys in one of your hands to drive \the [name]." + + +/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0) + ..() + handle_vehicle_layer() + handle_vehicle_offsets() + + +/obj/vehicle/attackby(obj/item/I, mob/user, params) + if(keytype && istype(I, keytype)) + user << "Hold [I] in one of your hands while you drive \the [name]." + + +/obj/vehicle/Bump(atom/movable/M) + . = ..() + if(auto_door_open) + if(istype(M, /obj/machinery/door) && buckled_mob) + M.Bumped(buckled_mob) + diff --git a/config/admins.txt b/config/admins.txt index 40eb253258d..1da322c5d64 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -104,4 +104,5 @@ Lzimann = Game Master As334 = Game Master neersighted = Game Master Swankcookie = Game Master -Ressler = Game Master \ No newline at end of file +Ressler = Game Master +Bawhoppennn = Game Master \ No newline at end of file diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index dde7edfc7b6..986900d5c1d 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -18,3 +18,4 @@ #_maps/RandomZLevels/undergroundoutpost45.dmm #_maps/RandomZLevels/caves.dmm #_maps/RandomZLevels/snowdin.dmm +#_maps/RandomZLevels/research.dmm diff --git a/config/lavaRuinConfig.txt b/config/lavaRuinConfig.txt new file mode 100644 index 00000000000..c677f1e344a --- /dev/null +++ b/config/lavaRuinConfig.txt @@ -0,0 +1,4 @@ +#List the potential random ruins here. This file is for small things that would appear in lavaland, such as hidden temples or labs. +#Maps must be the full path to them +#Ruins should be 30x30 at max. Anymore than that will break the game. +#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START \ No newline at end of file diff --git a/config/spaceRuinConfig.txt b/config/spaceRuinConfig.txt new file mode 100644 index 00000000000..a0de267df38 --- /dev/null +++ b/config/spaceRuinConfig.txt @@ -0,0 +1,6 @@ +#List the potential random ruins here. This file is for small things that would appear in space, like an asteroid or broken escape pod. +#Maps must be the full path to them +#Ruins should be 40x40 at max. Anymore than that will break the game. +#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +#_maps/RandomRuins/SpaceRuins/way_home.dmm \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 94c4d651767..5c85c074aeb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,106 @@ -->
+

02 January 2016

+

Kor updated:

+
    +
  • Guardians/Parasites are now named after constellations, and have new sprites from Ausops.
  • +
+

Kor and GunHog updated:

+
    +
  • Malfunctioning AIs can now purchase Enhanced Surveillance for 30 points, which allows them to "hear" with their camera eye.
  • +
+

MMMiracles updated:

+
    +
  • A distress signal was recently discovered with gateway coordinates attached to a far-off research facility owned by Nanotrasen. The signal was sent out in hopes of someone competent receiving it, unfortunately, your station was the only one to respond. Local security forces may not be welcoming your arrival group with open arms.
  • +
+ +

01 January 2016

+

Iamgoofball updated:

+
    +
  • Redid how objectives are assigned, they're now a lot more random in terms of what you can get.
  • +
+

Incoming5643 updated:

+
    +
  • Removed gender restrictions from socks.
  • +
+

Joan updated:

+
    +
  • Storage Blobs are gone; they were effectively a waste of resources, as there are more or less no points at which you should need them, unless you were winning excessively hard.
  • +
  • Blobs can no longer burst early; instead, the button gives some early help and serves to indicate you're a blob.
  • +
  • Blobbernauts now poll candidates instead of grabbing a candidate immediately. The poll is 5 seconds, so that there's no significant pause between making a blobbernaut and it doing stuff.
  • +
  • Blobbernaut creation replaces Storage Blob creation on the blob HUD.
  • +
  • Overmind communication is now much larger and easier to see, and blob mobs, such as blobbernauts, will hear it.
  • +
+

Kor updated:

+
    +
  • The wizard has a new spell, Lesser Summon Guns. This summons an unending stream of single shot bolt action rifles into his hands, automatically replacing themselves as you fire.
  • +
  • Fixes successive generations of grey tide clones not despawning.
  • +
  • Using challenge ops now delays shuttle refuel.
  • +
  • Added a new wizard event, Advanced Darkness.
  • +
+

MrStonedOne updated:

+
    +
  • GHOST POPUP RE-WORK
  • +
  • Ghost popups will no longer steal focus
  • +
  • Ghost popups will no longer submit on key press (regardless of focus) unless you tab to a button first
  • +
  • Ghost popups will close themselves after the time out has ended
  • +
  • Ghost popups are now themed.
  • +
  • Long actions (like resisting out of handcuffs) will no longer count space/nograv drifting as the user moving.
  • +
  • This does not apply to the target of a long action if that target isn't you. Pulling something while space drifting and working on it intentionally won't work.
  • +
+ +

31 December 2015

+

Bawhoppen updated:

+
    +
  • Nanotrasen has opened the availability of tactical SWAT gear to station's cargo department
  • +
  • Due to a new trade agreement with Chinese space suit manufacturers, Nanotrasen can now obtain basic space suits much cheaper; This has been reflected in the cargo prices
  • +
  • Amateur medieval enthusiasts have found a quick way to easily make wooden bucklers.
  • +
+

Joan updated:

+
    +
  • Replaced every book sprite in the game with new, consistent versions.
  • +
  • Except the one-use wizard spellbooks, which already got new sprites.
  • +
+

PKPenguin321 updated:

+
    +
  • Chest implants have been added that allow you to morph your arms into a gun and back at will. There are two variants, a taser version and a laser version. Both versions are self-charging. Getting EMPed with one of these implants results in the implant breaking and loads of fire damage. The implants are currently admin-only.
  • +
  • The telecrystal price for thermal imaging goggles has been lowered from 6 to 4.
  • +
+

incoming5643 updated:

+
    +
  • The wizard federation has finally updated their assortment of guns for the summon guns event. Look forward to getting shot in the face with a whole new batch of interesting and rarely seen weaponry!
  • +
+ +

28 December 2015

+

AnturK updated:

+
    +
  • You can now write an entire word with crayons by setting it as a buffer and then clicking the target tiles in the right order.
  • +
+

Joan updated:

+
    +
  • Blobbernauts can no longer smash walls of any type.
  • +
+

MrStonedOne updated:

+
    +
  • Progress bars now have 20 states instead of 5.
  • +
  • Bump mining should be fixed.
  • +
  • Long actions now checks for movement/changed hands/etc more often to prevent edge cases.
  • +
  • Multiple progress bars will now stack properly, rather than fight each other for focus.
  • +
+

Ressler updated:

+
    +
  • Adds the reagent Haloperidol.
  • +
  • It is an anti-drug reagent, good for stopping assistants hyped up on meth, bath salts, and equally illegal drugs.
  • +
  • It can be made with Chlorine, Fluorine, Aluminum, Potassium Iodide, and Oil.
  • +
+

neersighted updated:

+
    +
  • Make NanoUIs transfer upon (un)ghosting.
  • +
  • Fix NanoUIs jumping when resized/dragged.
  • +
  • Lots of other NanoUI bugs.
  • +
+

27 December 2015

Joan updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b5f3110a2ad..973982dae38 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3092,3 +3092,100 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. the emper, not in range of the flash. - tweak: Flashes in a mob's inventory that are emp'ed will only aoe stun if it is not inside of a container like a backpack/box +2015-12-28: + AnturK: + - rscadd: You can now write an entire word with crayons by setting it as a buffer + and then clicking the target tiles in the right order. + Joan: + - rscdel: Blobbernauts can no longer smash walls of any type. + MrStonedOne: + - tweak: Progress bars now have 20 states instead of 5. + - bugfix: Bump mining should be fixed. + - tweak: Long actions now checks for movement/changed hands/etc more often to prevent + edge cases. + - tweak: Multiple progress bars will now stack properly, rather than fight each + other for focus. + Ressler: + - rscadd: Adds the reagent Haloperidol. + - rscadd: It is an anti-drug reagent, good for stopping assistants hyped up on meth, + bath salts, and equally illegal drugs. + - rscadd: It can be made with Chlorine, Fluorine, Aluminum, Potassium Iodide, and + Oil. + neersighted: + - bugfix: Make NanoUIs transfer upon (un)ghosting. + - bugfix: Fix NanoUIs jumping when resized/dragged. + - bugfix: Lots of other NanoUI bugs. +2015-12-31: + Bawhoppen: + - rscadd: Nanotrasen has opened the availability of tactical SWAT gear to station's + cargo department + - rscadd: Due to a new trade agreement with Chinese space suit manufacturers, Nanotrasen + can now obtain basic space suits much cheaper; This has been reflected in the + cargo prices + - rscadd: Amateur medieval enthusiasts have found a quick way to easily make wooden + bucklers. + Joan: + - imageadd: Replaced every book sprite in the game with new, consistent versions. + - imageadd: Except the one-use wizard spellbooks, which already got new sprites. + PKPenguin321: + - rscadd: Chest implants have been added that allow you to morph your arms into + a gun and back at will. There are two variants, a taser version and a laser + version. Both versions are self-charging. Getting EMPed with one of these implants + results in the implant breaking and loads of fire damage. The implants are currently + admin-only. + - tweak: The telecrystal price for thermal imaging goggles has been lowered from + 6 to 4. + incoming5643: + - rscadd: The wizard federation has finally updated their assortment of guns for + the summon guns event. Look forward to getting shot in the face with a whole + new batch of interesting and rarely seen weaponry! +2016-01-01: + Iamgoofball: + - experiment: Redid how objectives are assigned, they're now a lot more random in + terms of what you can get. + Incoming5643: + - tweak: Removed gender restrictions from socks. + Joan: + - rscdel: Storage Blobs are gone; they were effectively a waste of resources, as + there are more or less no points at which you should need them, unless you were + winning excessively hard. + - rscdel: Blobs can no longer burst early; instead, the button gives some early + help and serves to indicate you're a blob. + - wip: Blobbernauts now poll candidates instead of grabbing a candidate immediately. + The poll is 5 seconds, so that there's no significant pause between making a + blobbernaut and it doing stuff. + - rscadd: Blobbernaut creation replaces Storage Blob creation on the blob HUD. + - tweak: Overmind communication is now much larger and easier to see, and blob mobs, + such as blobbernauts, will hear it. + Kor: + - rscadd: The wizard has a new spell, Lesser Summon Guns. This summons an unending + stream of single shot bolt action rifles into his hands, automatically replacing + themselves as you fire. + - bugfix: Fixes successive generations of grey tide clones not despawning. + - tweak: Using challenge ops now delays shuttle refuel. + - rscadd: Added a new wizard event, Advanced Darkness. + MrStonedOne: + - experiment: GHOST POPUP RE-WORK + - bugfix: Ghost popups will no longer steal focus + - bugfix: Ghost popups will no longer submit on key press (regardless of focus) + unless you tab to a button first + - tweak: Ghost popups will close themselves after the time out has ended + - rscadd: Ghost popups are now themed. + - tweak: Long actions (like resisting out of handcuffs) will no longer count space/nograv + drifting as the user moving. + - tweak: This does not apply to the target of a long action if that target isn't + you. Pulling something while space drifting and working on it intentionally + won't work. +2016-01-02: + Kor: + - rscadd: Guardians/Parasites are now named after constellations, and have new sprites + from Ausops. + Kor and GunHog: + - rscadd: Malfunctioning AIs can now purchase Enhanced Surveillance for 30 points, + which allows them to "hear" with their camera eye. + MMMiracles: + - rscadd: A distress signal was recently discovered with gateway coordinates attached + to a far-off research facility owned by Nanotrasen. The signal was sent out + in hopes of someone competent receiving it, unfortunately, your station was + the only one to respond. Local security forces may not be welcoming your arrival + group with open arms. diff --git a/html/changelogs/AutoChangeLog-pr-14056.yml b/html/changelogs/AutoChangeLog-pr-14056.yml deleted file mode 100644 index 1f355cb7ef3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-14056.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: neersighted -delete-after: True -changes: - - bugfix: "Make NanoUIs transfer upon (un)ghosting." - - bugfix: "Fix NanoUIs jumping when resized/dragged." - - bugfix: "Lots of other NanoUI bugs." diff --git a/html/changelogs/AutoChangeLog-pr-14057.yml b/html/changelogs/AutoChangeLog-pr-14057.yml deleted file mode 100644 index 48b589dd834..00000000000 --- a/html/changelogs/AutoChangeLog-pr-14057.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Ressler -delete-after: True -changes: - - rscadd: "Adds the reagent Haloperidol." - - rscadd: "It is an anti-drug reagent, good for stopping assistants hyped up on meth, bath salts, and equally illegal drugs." - - rscadd: "It can be made with Chlorine, Fluorine, Aluminum, Potassium Iodide, and Oil." diff --git a/icons/effects/doafter_icon.dmi b/icons/effects/doafter_icon.dmi deleted file mode 100644 index 0add263e976..00000000000 Binary files a/icons/effects/doafter_icon.dmi and /dev/null differ diff --git a/icons/effects/progessbar.dmi b/icons/effects/progessbar.dmi new file mode 100644 index 00000000000..99284060aa6 Binary files /dev/null and b/icons/effects/progessbar.dmi differ diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi new file mode 100644 index 00000000000..57d92f17b6b Binary files /dev/null and b/icons/effects/weather_effects.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 263efbbeade..c114de2421e 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index af26c8e825d..83ca97a050f 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 64a6befed1e..e1f56e4ebbe 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index c8d92941b47..62feebd8126 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index 354b4eb33d8..184337131ad 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi index 9db3fbedc68..9da38ca7706 100644 Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index d73d539e14c..ad118904ec2 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index 159f8b93be2..b5f858b0406 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 092a08e9596..48e9898a77d 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index dbfe5a67b89..703d22a67db 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 6e03c9f6f14..83d70a7e4ac 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 90210fe486a..4696fcf81b1 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 3a99f8a99c2..b44f969c459 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index df1288b3aa1..8d3e2fa7866 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/nano/Gulpfile.coffee b/nano/Gulpfile.coffee deleted file mode 100644 index 2a0f51d326b..00000000000 --- a/nano/Gulpfile.coffee +++ /dev/null @@ -1,129 +0,0 @@ -### Settings ### -util = require("gulp-util") -f = - colorblind: util.env.colorblind || util.env.c - min: util.env.min || util.env.m - sourcemaps: util.env.sourcemaps || util.env.s - -# Project Paths -input = - html: "html" - images: "images" - scripts: "scripts" - styles: "styles" - templates: "templates" - -output = - dir: "assets" - js: "nanoui.js" - css: "nanoui.css" - -# Processor Settings -dotOpts = - evaluate: /\{\{([\s\S]+?)\}\}/g, - interpolate: /\{\{=([\s\S]+?)\}\}/g, - encode: /\{\{!([\s\S]+?)\}\}/g, - use: /\{\{#([\s\S]+?)\}\}/g, - define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, - conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, - iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, - varname: "data, config, helper", - strip: true, - append: true, - selfcontained: true - -### Packages ### -bower = require "main-bower-files" -child_process = require "child_process" -del = require "del" -gulp = require "gulp" -merge = require "merge2" - -### Plugins ### -g = require("gulp-load-plugins")({replaceString: /^gulp(-|\.)|-/g}) -p = - autoprefixer: require "autoprefixer" - colorblind: require "postcss-colorblind" - fontweights: require "postcss-font-weights" - gradient: require "postcss-filter-gradient" - opacity: require "postcss-opacity" - plsfilters: require "pleeease-filters" - rgba: require "postcss-color-rgba-fallback" - -### Helpers ### -glob = (path) -> - "#{path}/*" - -### Tasks ### -html = -> - gulp.src glob input.html - .pipe g.bytediff.start() - .pipe g.if(f.min, g.htmlmin({collapseWhitespace: true, minifyJS: true, minifyCSS: true, quoteCharacter: "'"})) - .pipe g.bytediff.stop() - .pipe gulp.dest output.dir - - -js = -> - lib = gulp.src bower "**/*.js" - .pipe g.if(f.sourcemaps, g.sourcemaps.init()) - - main = gulp.src glob input.scripts - .pipe g.if(f.sourcemaps, g.sourcemaps.init()) - .pipe g.coffee() - - templates = gulp.src glob input.templates - .pipe g.dotprecompiler({dictionary: "TMPL", templateSettings: dotOpts}) - .pipe g.concat("templates") - .pipe g.header("window.TMPL = {};\n") - - combined = merge lib, templates, main - combined - .pipe g.concat(output.js) - .pipe g.bytediff.start() - .pipe g.if(f.min, g.uglify({mangle: true, compress: {unsafe: true, negate_iife: true, drop_console: true}}), g.jsbeautifier()) - .pipe g.if(f.sourcemaps, g.sourcemaps.write()) - .pipe g.bytediff.stop() - .pipe gulp.dest output.dir - - -css = -> - lib = gulp.src bower "**/*.css" - .pipe g.if(f.sourcemaps, g.sourcemaps.init()) - - main = gulp.src glob input.styles - .pipe g.filter(["*.less", "!_*.less"]) - .pipe g.if(f.sourcemaps, g.sourcemaps.init()) - .pipe g.less({paths: [input.images]}) - .pipe g.postcss([ - p.autoprefixer({browsers: ["last 2 versions", "ie >= 8"]}), - p.gradient, - p.opacity, - p.rgba({oldie: true}), - p.plsfilters({oldIE: true}), - p.fontweights - ]) - .pipe g.if(f.colorblind, g.postcss([p.colorblind])) - - combined = merge lib, main - combined - .pipe g.concat(output.css) - .pipe g.bytediff.start() - .pipe g.if(f.min, g.cssnano({autoprefixer: {browsers: ["last 2 versions", "ie >= 8"]}, discardComments: {removeAll: true}}), g.csscomb()) - .pipe g.if(f.sourcemaps, g.sourcemaps.write()) - .pipe g.bytediff.stop() - .pipe gulp.dest output.dir - - -gulp.task "default", ["clean"], -> - all = merge js(), css(), html() - all.pipe g.size() - -gulp.task "reload", ["default"], -> - child_process.exec "reload.bat", (err, stdout, stderr) -> - console.log err if err - -gulp.task "watch", -> - Object.keys(input).forEach (inp) -> - gulp.watch [glob input[inp]], ["reload"] - -gulp.task "clean", -> del glob output.dir diff --git a/nano/README.md b/nano/README.md deleted file mode 100644 index aebc35d75d6..00000000000 --- a/nano/README.md +++ /dev/null @@ -1,377 +0,0 @@ - - -- [NanoUI](#nanoui) - - [Introduction](#introduction) - - [Components](#components) - - [`ui_interact()`](#uiinteract) - - [`get_ui_data()`](#getuidata) - - [`Topic()`](#topic) - - [Template (doT)](#template-dot) - - [Helpers](#helpers) - - [Link](#link) - - [Bar](#bar) - - [doT](#dot) - - [Styling](#styling) - - [Contributing](#contributing) - - - -# NanoUI - -## Introduction - -NanoUI is the user interface library of /tg/station. While more complex than -traditional `browse()`/stringbuilder based interfaces, it allows much more -control over display of data and gives you many features for free, such as -different `CanUseTopic()` checks (in range/is robot/in inventory/in hand/etc), -automatic refresh, attractive looks, and helpers that make writing interfaces -much easier. - -NanoUI adds a `ui_interact()` proc to all atoms, which should be called from -`interact()`. The interact proc can be called from anywhere in the atom (usually - `attack_self()` or `attack_hand()`), and is where all checks should be made. - The `ui_interact()` proc should only include NanoUI code. - -Baystation12's version of NanoUI, while slightly different in syntax, has a -good [reference](http://wiki.baystation12.net/NanoUI). - -Here is a real example from -[tanks.dm](https://github.com/tgstation/-tg-station/blob/master/code/game/objects/items/weapons/tanks/tanks.dm). - - /obj/item/weapon/tank/attack_self(mob/user) - if (!user) - return - interact(user) - - /obj/item/weapon/tank/interact(mob/user) - add_fingerprint(user) - ui_interact(user) - - /obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) - if (!ui) - ui = new(user, src, ui_key, "tanks", name, 525, 175, state = inventory_state) - ui.open() - - - - -## Components - -### `ui_interact()` - -The`ui_interact()` proc is used to open a NanoUI (or update it if already open). -As NanoUI will call this proc to update your UI, you should not put any logic in -it, as NanoUI handles the logic for you. - -The parameters for `try_update_ui` and `/datum/nanoui/new()` are documented in -the code [here](https://github.com/tgstation/-tg-station/tree/master/code/modules/nano). -The most interesting parameter is `state`, which allows the object to choose the -checks that allow the UI to be interacted with. - -The default state (`default_state`) checks that the user is alive, conscious, -and within a few tiles. It allows universal access to silicons. Other states -exist, and may be more appropriate for different interfaces. For example, -`physical_state` requires the user to be nearby, even if they are a silicon. -`inventory_state` checks that the user has the object in their first-level -(not container) inventory, this is suitable for devices such as radios; -`notcontained_state` checks that the user is outside the object (great for cryo -and similar machines). - - /obj/item/the/thing/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0) - ui = SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open) - if (!ui) - ui = new(user, src, ui_key, "template", title, width, height) - ui.open() - -### `get_ui_data()` - -The `get_ui_data()` proc returns a list which is used to populate the `data` -variable in the UI. This is where you should pass variables from your atom to -the UI. Here's another example from tanks.dm. - - /obj/item/weapon/tank/get_ui_data() - var/mob/living/carbon/location = null - - if(istype(loc, /mob/living/carbon)) - location = loc - else if(istype(loc.loc, /mob/living/carbon)) - location = loc.loc - - var/data = list() - data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) - data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) - data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) - data["minReleasePressure"] = round(TANK_MIN_RELEASE_PRESSURE) - data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) - data["valveOpen"] = 0 - data["maskConnected"] = 0 - - if(istype(location)) - var/mask_check = 0 - - if(location.internal == src) // if tank is current internal - mask_check = 1 - data["valveOpen"] = 1 - else if(src in location) // or if tank is in the mobs possession - if(!location.internal) // and they do not have any active internals - mask_check = 1 - - if(mask_check) - if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS)) - data["maskConnected"] = 1 - return data - -This data can be accessed inside the NanoUI. For example, to find out if the -mask is connected (as checked near the end of the proc), we simply use -`data.maskConnected` in our template. - -### `Topic()` - -`Topic()` handles input from the UI. Typically you will recieve some data from -a button press, or pop up a input dialog to take a numerical value from the -user. Sanity checking is useful here, as `Topic()` is trivial to spoof with -arbitrary data. - -The `Topic()` interface is just the same as with more conventional, -stringbuilder-based UIs, and this needs little explanation. - - /obj/item/weapon/tank/Topic(href, href_list) - if (..()) - return - - if (href_list["dist_p"]) - if (href_list["dist_p"] == "custom") - var/custom = input(usr, "What rate do you set the regulator to? The dial reads from 0 to [TANK_MAX_RELEASE_PRESSURE].") as null|num - if(isnum(custom)) - href_list["dist_p"] = custom - .() - else if (href_list["dist_p"] == "reset") - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - else if (href_list["dist_p"] == "min") - distribute_pressure = TANK_MIN_RELEASE_PRESSURE - else if (href_list["dist_p"] == "max") - distribute_pressure = TANK_MAX_RELEASE_PRESSURE - else - distribute_pressure = text2num(href_list["dist_p"]) - distribute_pressure = min(max(round(distribute_pressure), TANK_MIN_RELEASE_PRESSURE), TANK_MAX_RELEASE_PRESSURE) - if (href_list["stat"]) - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc - if(location.internal == src) - location.internal = null - location.internals.icon_state = "internal0" - usr << "You close the tank release valve." - if (location.internals) - location.internals.icon_state = "internal0" - else - if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS)) - location.internal = src - usr << "You open \the [src] valve." - if (location.internals) - location.internals.icon_state = "internal1" - else - usr << "You need something to connect to \the [src]!" - -### Template (doT) - -NanoUI templates are written in [doT](https://olado.github.io/doT/index.html), -a Javascript template engine. Data is accessed from the `data` object, -configuration (not used in pratice) from the `config` object, and template -helpers are accessed from the `helper` object. - -#### Helpers - -##### Link - - {{=helpers.link(text, icon, {'parameter': true}, status, class)}} - -Used to create a link (button), which will pass its parameters to `Topic()`. - -* Text: The text content of the link/button -* Icon: The icon shown to the left of the link (http://fontawesome.io/) -* Parameters: The values to be passed to `Topic()`'s `href_list`. -* Status: `null` for clickable, a class for selected/unclickable. -* Class: Styling to apply to the link. - -Status and Class have almost the same effect. However, changing a link's status -from `null` to something else makes it unclickable, while setting a custom Class -does not. - -Ternary operators are often used to avoid writing many `if` statements. -For example, depending on if a value in `data` is true or false we can set a -button to clickable or selected: - - {{=helper.link('Close', 'lock', {'stat': 1}, data.valveOpen ? null : 'selected')}} - -Available classes/statuses are: - -* null (normal) -* selected -* caution -* danger -* disabled - -##### Bar - - {{=helpers.bar(value, min, max, class, text)}} - -Used to create a bar, to display a numerical value visually. Min and Max default -to 0 and 100, but you can change them to avoid doing your own percent calculations. - -* Value: Defaults to a percentage but can be a straight number if Min/Max are set -* Min: The minimum value (left hand side) of the bar -* Max: The maximum value (right hand side) of the bar -* Class: The color of the bar (null/normal, good, average, bad) -* Text: The text label for the data contained in the bar (often just number form) - -As with buttons, ternary operators are quite useful: - - {{=helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad'))}} - -#### doT - -doT is a simple template language, with control statements mixed in with -regular HTML and interpolation expressions. - -Here is a simple example from tanks, checking if a variable is true: - - {{? data.maskConnected}} - The regulator is connected to a mask. - {{??}} - The regulator is not connected to a mask. - {{?}} - -The doT tutorial is [here](https://olado.github.io/doT/tutorial.html). - -Print: - - {{=expression }} - -Print (with escape): - - {{!expression }} - -If/Else If/Else - - {{? condition}} - // if - {{?? condition}} - // else if - {{??}} - // else - {{?}} - -For - - {{~ object:key:index}} - // key, value - {{~}} - -#### Styling - -For the most part, a NanoUI is just normal HTML. However, to use the NanoUI -styles correctly, you have to be concious of a few elements. - -A `
    ` is the building block of most NanoUIs, and -represents the wells/blocks you see in most NanoUIs. Inside said article should -be a `
    ` labeling it, and many `
    `s representing items inside -(such as a label/button pair). The styling is highly subjective, so ask a -regular contribuitor to NanoUI (@neersighted at time of writing) to take a look -at and help style your UI. - -Here's an example of UI styling from Air Alarms: - -
    -

    Air Status

    - {{? data.environment_data}} - {{~ data.environment_data:info:i}} -
    - - {{=info.name}}: - -
    - {{? info.danger_level == 2}} - - {{?? info.danger_level == 1}} - - {{??}} - - {{?}} - {{=helper.fixed(info.value, 2)}}{{=info.unit}} -
    -
    - {{~}} -
    - - Local Status: - -
    - {{? data.danger_level == 2}} - Danger (Internals Required) - {{?? data.danger_level == 1}} - Caution - {{??}} - Optimal - {{?}} -
    -
    -
    - - Area Status: - -
    - {{? data.atmos_alarm}} - Atmosphere Alarm - {{?? data.fire_alarm}} - Fire Alarm - {{??}} - Nominal - {{?}} -
    -
    - {{??}} -
    Warning: Cannot obtain air sample for analysis.
    - {{?}} - {{? data.dangerous}} -
    -
    - Warning: Safety measures offline. Device may exhibit abnormal behavior. -
    - {{?}} -
    - -## Contributing - -There are a few gotchas when it comes to writing for NanoUI. In order to -simplify server code and make the UI more responsive, we precompile all -templates to Javascript. In addition, Coffeescript and LESS are used to make -development easier, and also need to be precompiled. Precompiling CSS also -allows us to add fallbacks for old versions of Internet Explorer. - -To compile NanoUI (which you will need to do after adding or updating a -template), first install [Node.js](https://nodejs.org). - -Next, you will need to install packages used by NanoUI: - - cd nanoui/ - npm install -g gulp bower - npm install - bower install - -Finally, to compile NanoUI, run Gulp: - - gulp - -Every time you make an update, you will need to recompile. Before comitting, -make sure you minimize the files with Gulp: - - gulp --min - -If you would like to view your changes without restarting, run Gulp reload: - - gulp reload - -Finally, if you want to auto-compile and reload on save, run Gulp watch: - - gulp watch diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css deleted file mode 100644 index ec019f1b8a2..00000000000 --- a/nano/assets/nanoui.css +++ /dev/null @@ -1 +0,0 @@ -html{cursor:default}body,html{min-height:100%;margin:0}body{height:100%;background-color:#202020;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff}h1,h2,h3{font-size:18px;margin:0;padding:6px 0}h2{font-size:16px}h3{font-size:14px}hr{background-color:#40628a;border:none}.normal{color:#40628a}.good{color:#537d29}.average{color:#be6209}.bad{color:#b00e0e}.highlight,.label{color:#8ba5c4}.dark{color:#272727}.bold{font-weight:700}.italic{font-style:italic}.hidden{display:none!important}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.floatNone{float:none}.floatLeft{float:left}.floatRight{float:right}.alignTop{vertical-align:top}.alignBottom{vertical-align:bottom}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}div.loading{background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);padding:8px}div.content{margin:32px 4px 0}div.content.titlebared{padding-top:3px}header.titlebar{position:fixed;top:0;left:0;width:100%;height:32px;background-color:#363636;box-shadow:0 3px 3px rgba(0,0,0,.1)}header.titlebar .statusicon{position:absolute;top:4px;left:12px}header.titlebar .title{position:absolute;top:6px;left:46px;color:#98b0c3;font-size:16px;white-space:nowrap}header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#98b0c3;position:absolute;top:6px;right:46px}header.titlebar .minimize:hover{color:#b8c9d6}header.titlebar .close{display:inline-block;position:relative;padding:7px;margin:-7px;color:#98b0c3;position:absolute;top:4px;right:12px}header.titlebar .close:hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}.fancy{display:none!important}article.display,article.notice{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column;width:auto;padding:4px;margin:6px 2px;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}article.display header,article.notice header{padding-left:4px;margin-bottom:6px;border-bottom:2px solid #40628a}article.display section,article.notice section{width:100%;padding:3px 0}article.display .label,article.notice .label{display:inline-block;margin:0;width:33%;color:#8ba5c4}article.display .content,article.notice .content{display:inline-block;margin:0;width:66%}article.display .line,article.notice .line{display:inline-block;margin:0;width:100%}article.display .buttoninfo,article.notice .buttoninfo{margin-left:5px}article.display table,article.notice table{width:auto;border-collapse:collapse}article.display table.grow,article.notice table.grow{width:100%}article.display th,article.notice th{vertical-align:top;padding:4px 16px 4px 0;text-align:left;color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;color:#8ba5c4}article.display td,article.notice td{padding:2px 2px 0 0;vertical-align:top}article.notice{margin:8px 2px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}article.notice .label{color:#000}span.link{display:inline-block;box-sizing:border-box;height:22px;margin:1px;padding:2px 3px;white-space:nowrap;border:1px solid #272727;color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#40628a}span.link .fa{margin-right:3px}span.link .iconed{padding-left:3px}span.link.active{background-color:#40628a}span.link.active:hover{background-color:#507bad}span.link.active.selected{background-color:#2f943c}span.link.active.selected:hover{background-color:#3bbb4c}span.link.active.caution{background-color:#9a9d00}span.link.active.caution:hover{background-color:#ccd000}span.link.active.danger{background-color:#9d0808}span.link.active.danger:hover{background-color:#ce0a0a}span.link.inactive{background-color:#999}span.link.inactive.selected{background-color:#2f943c}span.link.inactive.caution{background-color:#9a9d00}span.link.inactive.danger{background-color:#9d0808}span.link.disabled{background-color:#999}span.link.gridable{width:125px}.bar{display:inline-block;position:relative;top:4px;vertical-align:top;box-sizing:border-box;width:100%;height:20px;margin:1px;padding:1px;border:1px solid #40628a;background:#272727}.bar .barText{position:absolute;top:1px;right:3px;color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.bar .barFill{display:block;height:100%;overflow:hidden;background:#40628a}.bar .barFill.good{background:#537d29}.bar .barFill.average{background:#be6209}.bar .barFill.bad{background:#b00e0e}.bar .barFill.highlight{background:#8ba5c4}body.generic{background:linear-gradient(180deg,#2a2a2a 0,#202020)}body.generic,body.nanotrasen{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.04H106.8a6.76 6.026 0 0 0-6.76 6.024v187.872a6.76 6.026 0 0 0 6.76 6.025h53.107a6.76 6.026 0 0 0 6.762-6.024V92.392l72.215 104.7a6.76 6.026 0 0 0 5.76 2.87H318.2a6.76 6.026 0 0 0 6.76-6.026V6.064A6.76 6.026 0 0 0 318.2.04h-54.717a6.76 6.026 0 0 0-6.76 6.024v102.62L183.762 2.91a6.76 6.026 0 0 0-5.76-2.87zM4.845 22.11A13.412 12.502 0 0 1 13.478.04h66.118a5.365 5 0 0 1 5.365 5v79.88zM420.155 177.89a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5v-79.88z'/%3E%3C/svg%3E") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020)} \ No newline at end of file diff --git a/nano/assets/nanoui.html b/nano/assets/nanoui.html deleted file mode 100644 index 99f00ab6777..00000000000 --- a/nano/assets/nanoui.html +++ /dev/null @@ -1 +0,0 @@ -
    Loading...
    \ No newline at end of file diff --git a/nano/assets/nanoui.js b/nano/assets/nanoui.js deleted file mode 100644 index da66a9e7080..00000000000 --- a/nano/assets/nanoui.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(e){function t(e,t,n,a){for(var r,i=n.slice(),l=s(t,e),o=0,c=i.length;c>o&&(handler=i[o],"object"==typeof handler&&"function"==typeof handler.handleEvent?handler.handleEvent(l):handler.call(e,l),!l.stoppedImmediatePropagation);o++);return r=!l.stoppedPropagation,a&&r&&e.parentNode?e.parentNode.dispatchEvent(l):!l.defaultPrevented}function n(e,t){return{configurable:!0,get:e,set:t}}function a(e,t,a){var s=b(t||e,a);g(e,"textContent",n(function(){return s.get.call(this)},function(e){s.set.call(this,e)}))}function s(e,t){return e.currentTarget=t,e.eventPhase=e.target===e.currentTarget?2:3,e}function r(e,t){for(var n=e.length;n--&&e[n]!==t;);return n}function i(){if("BR"===this.tagName)return"\n";for(var e=this.firstChild,t=[];e;)8!==e.nodeType&&7!==e.nodeType&&t.push(e.textContent),e=e.nextSibling;return t.join("")}function l(e){var t=document.createEvent("Event");t.initEvent("input",!0,!0),(e.srcElement||e.fromElement||document).dispatchEvent(t)}function o(e){!p&&x.test(document.readyState)&&(p=!p,document.detachEvent(h,o),e=document.createEvent("Event"),e.initEvent(f,!0,!0),document.dispatchEvent(e))}function c(e){for(var t;t=this.lastChild;)this.removeChild(t);null!=e&&this.appendChild(document.createTextNode(e))}function u(t,n){return n||(n=e.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var d=!0,p=!1,h="onreadystatechange",f="DOMContentLoaded",v="__IE8__"+Math.random(),g=Object.defineProperty||function(e,t,n){e[t]=n.value},m=Object.defineProperties||function(t,n){for(var a in n)if(y.call(n,a))try{g(t,a,n[a])}catch(s){e.console}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,k=e.Element.prototype,w=e.Text.prototype,E=/^[a-z]+$/,x=/loaded|complete/,T={},S=document.createElement("div"),_=document.documentElement,O=_.removeAttribute,P=_.setAttribute;a(e.HTMLCommentElement.prototype,k,"nodeValue"),a(e.HTMLScriptElement.prototype,null,"text"),a(w,null,"nodeValue"),a(e.HTMLTitleElement.prototype,null,"text"),g(e.HTMLStyleElement.prototype,"textContent",function(e){return n(function(){return e.get.call(this.styleSheet)},function(t){e.set.call(this.styleSheet,t)})}(b(e.CSSStyleSheet.prototype,"cssText"))),m(k,{textContent:{get:i,set:c},firstElementChild:{get:function(){for(var e=this.childNodes||[],t=0,n=e.length;n>t;t++)if(1==e[t].nodeType)return e[t]}},lastElementChild:{get:function(){for(var e=this.childNodes||[],t=e.length;t--;)if(1==e[t].nodeType)return e[t]}},oninput:{get:function(){return this._oninput||null},set:function(e){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=e,e&&this.addEventListener("input",e))}},previousElementSibling:{get:function(){for(var e=this.previousSibling;e&&1!=e.nodeType;)e=e.previousSibling;return e}},nextElementSibling:{get:function(){for(var e=this.nextSibling;e&&1!=e.nodeType;)e=e.nextSibling;return e}},childElementCount:{get:function(){for(var e=0,t=this.childNodes||[],n=t.length;n--;e+=1==t[n].nodeType);return e}},addEventListener:{value:function(e,n,a){var s,i,o=this,c="on"+e,d=o[v]||g(o,v,{value:{}})[v],p=d[c]||(d[c]={}),h=p.h||(p.h=[]);if(!y.call(p,"w")){if(p.w=function(e){return e[v]||t(o,u(o,e),h,!1)},!y.call(T,c))if(E.test(e)){try{s=document.createEventObject(),s[v]=!0,9!=o.nodeType&&null==o.parentNode&&S.appendChild(o),(i=o.getAttribute(c))&&O.call(o,c),o.fireEvent(c,s),T[c]=!0}catch(s){for(T[c]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=i&&P.call(o,c,i)}else T[c]=!1;(p.n=T[c])&&o.attachEvent(c,p.w)}r(h,n)<0&&h[a?"unshift":"push"](n),"input"===e&&o.attachEvent("onkeyup",l)}},dispatchEvent:{value:function(e){var n,a=this,s="on"+e.type,r=a[v],i=r&&r[s],l=!!i;return e.target||(e.target=a),l?i.n?a.fireEvent(s,e):t(a,e,i.h,!0):(n=a.parentNode)?n.dispatchEvent(e):!0,!e.defaultPrevented}},removeEventListener:{value:function(e,t,n){var a=this,s="on"+e,i=a[v],l=i&&i[s],o=l&&l.h,c=o?r(o,t):-1;c>-1&&o.splice(c,1)}}}),m(w,{addEventListener:{value:k.addEventListener},dispatchEvent:{value:k.dispatchEvent},removeEventListener:{value:k.removeEventListener}}),m(e.XMLHttpRequest.prototype,{addEventListener:{value:function(e,t,n){var a=this,s="on"+e,i=a[v]||g(a,v,{value:{}})[v],l=i[s]||(i[s]={}),o=l.h||(l.h=[]);r(o,t)<0&&(a[s]||(a[s]=function(){var t=document.createEvent("Event");t.initEvent(e,!0,!0),a.dispatchEvent(t)}),o[n?"unshift":"push"](t))}},dispatchEvent:{value:function(e){var n=this,a="on"+e.type,s=n[v],r=s&&s[a],i=!!r;return i&&(r.n?n.fireEvent(a,e):t(n,e,r.h,!0))}},removeEventListener:{value:k.removeEventListener}}),m(e.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(e,t,n){this.type=e,this.bubbles=!!t,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),m(e.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?i.call(this):null},set:function(e){11===this.nodeType&&c.call(this,e)}},addEventListener:{value:function(t,n,a){var s=this;k.addEventListener.call(s,t,n,a),d&&t===f&&!x.test(s.readyState)&&(d=!1,s.attachEvent(h,o),e==top&&!function r(e){try{s.documentElement.doScroll("left"),o()}catch(t){setTimeout(r,50)}}())}},dispatchEvent:{value:k.dispatchEvent},removeEventListener:{value:k.removeEventListener},createEvent:{value:function(e){var t;if("Event"!==e)throw Error("unsupported "+e);return t=document.createEventObject(),t.timeStamp=(new Date).getTime(),t}}}),m(e.Window.prototype,{getComputedStyle:{value:function(){function e(e){this._=e}function t(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,s=/\-([a-z])/g,r=function(e,t){return t.toUpperCase()};return e.prototype.getPropertyValue=function(e){var t,i,l,o=this._,c=o.style,u=o.currentStyle,d=o.runtimeStyle;return e=("float"===e?"style-float":e).replace(s,r),t=u?u[e]:c[e],n.test(t)&&!a.test(e)&&(i=c.left,l=d&&d.left,l&&(d.left=u.left),c.left="fontSize"===e?"1em":t,t=c.pixelLeft+"px",c.left=i,l&&(d.left=l)),null==t?t:t+""||"auto"},t.prototype.getPropertyValue=function(){return null},function(n,a){return a?new t(n):new e(n)}}()},addEventListener:{value:function(n,a,s){var i,l=e,o="on"+n;l[o]||(l[o]=function(e){return t(l,u(l,e),i,!1)}),i=l[o][v]||(l[o][v]=[]),r(i,a)<0&&i[s?"unshift":"push"](a)}},dispatchEvent:{value:function(t){var n=e["on"+t.type];return n?n.call(e,t)!==!1&&!t.defaultPrevented:!0}},removeEventListener:{value:function(t,n,a){var s="on"+t,i=(e[s]||Object)[v],l=i?r(i,n):-1;l>-1&&i.splice(l,1)}}}),function(e,t,n){for(n=0;n0||-1)*Math.floor(Math.abs(t))),t},ToPrimitive:function(t){var n,a,s;if(A(t))return t;if(a=t.valueOf,e(a)&&(n=a.call(t),A(n)))return n;if(s=t.toString,e(s)&&(n=s.call(t),A(n)))return n;throw new TypeError},ToObject:function(e){if(null==e)throw new TypeError("can't convert "+e+" to object");return a(e)},ToUint32:function(e){return e>>>0}},I=function(){};j(r,{bind:function(t){var n=this;if(!e(n))throw new TypeError("Function.prototype.bind called on incompatible "+n);for(var s,r=u.call(arguments,1),i=function(){if(this instanceof s){var e=n.apply(this,f.call(r,u.call(arguments)));return a(e)===e?e:this}return n.apply(t,f.call(r,u.call(arguments)))},l=g(0,n.length-r.length),o=[],c=0;l>c;c++)p.call(o,"$"+c);return s=Function("binder","return function ("+o.join(",")+"){ return binder.apply(this, arguments); }")(i),n.prototype&&(I.prototype=n.prototype,s.prototype=new I,I.prototype=null),s}});var R=v.bind(s.hasOwnProperty),z=v.bind(s.toString),q=v.bind(l.slice),F=v.bind(l.split),U=v.bind(l.indexOf),B=v.bind(p),H=t.isArray||function(e){return"[object Array]"===z(e)},V=1!==[].unshift(0);j(n,{unshift:function(){return h.apply(this,arguments),this.length}},V),j(t,{isArray:H});var $=a("a"),W="a"!==$[0]||!(0 in $),J=function(e){var t=!0,n=!0;return e&&(e.call("foo",function(e,n,a){"object"!=typeof a&&(t=!1)}),e.call([1],function(){"use strict";n="string"==typeof this},"x")),!!e&&t&&n};j(n,{forEach:function(t){var n,a=D.ToObject(this),s=W&&P(this)?F(this,""):a,r=-1,i=D.ToUint32(s.length);if(arguments.length>1&&(n=arguments[1]),!e(t))throw new TypeError("Array.prototype.forEach callback must be a function");for(;++r1&&(a=arguments[1]),!e(n))throw new TypeError("Array.prototype.map callback must be a function");for(var o=0;i>o;o++)o in r&&(void 0===a?l[o]=n(r[o],o,s):l[o]=n.call(a,r[o],o,s));return l}},!J(n.map)),j(n,{filter:function(t){var n,a,s=D.ToObject(this),r=W&&P(this)?F(this,""):s,i=D.ToUint32(r.length),l=[];if(arguments.length>1&&(a=arguments[1]),!e(t))throw new TypeError("Array.prototype.filter callback must be a function");for(var o=0;i>o;o++)o in r&&(n=r[o],(void 0===a?t(n,o,s):t.call(a,n,o,s))&&B(l,n));return l}},!J(n.filter)),j(n,{every:function(t){var n,a=D.ToObject(this),s=W&&P(this)?F(this,""):a,r=D.ToUint32(s.length);if(arguments.length>1&&(n=arguments[1]),!e(t))throw new TypeError("Array.prototype.every callback must be a function");for(var i=0;r>i;i++)if(i in s&&!(void 0===n?t(s[i],i,a):t.call(n,s[i],i,a)))return!1;return!0}},!J(n.every)),j(n,{some:function(t){var n,a=D.ToObject(this),s=W&&P(this)?F(this,""):a,r=D.ToUint32(s.length);if(arguments.length>1&&(n=arguments[1]),!e(t))throw new TypeError("Array.prototype.some callback must be a function");for(var i=0;r>i;i++)if(i in s&&(void 0===n?t(s[i],i,a):t.call(n,s[i],i,a)))return!0;return!1}},!J(n.some));var G=!1;n.reduce&&(G="object"==typeof n.reduce.call("es5",function(e,t,n,a){return a})),j(n,{reduce:function(t){var n=D.ToObject(this),a=W&&P(this)?F(this,""):n,s=D.ToUint32(a.length);if(!e(t))throw new TypeError("Array.prototype.reduce callback must be a function");if(0===s&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var r,i=0;if(arguments.length>=2)r=arguments[1];else for(;;){if(i in a){r=a[i++];break}if(++i>=s)throw new TypeError("reduce of empty array with no initial value")}for(;s>i;i++)i in a&&(r=t(r,a[i],i,n));return r}},!G);var X=!1;n.reduceRight&&(X="object"==typeof n.reduceRight.call("es5",function(e,t,n,a){return a})),j(n,{reduceRight:function(t){var n=D.ToObject(this),a=W&&P(this)?F(this,""):n,s=D.ToUint32(a.length);if(!e(t))throw new TypeError("Array.prototype.reduceRight callback must be a function");if(0===s&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var r,i=s-1;if(arguments.length>=2)r=arguments[1];else for(;;){if(i in a){r=a[i--];break}if(--i<0)throw new TypeError("reduceRight of empty array with no initial value")}if(0>i)return r;do i in a&&(r=t(r,a[i],i,n));while(i--);return r}},!X);var Z=n.indexOf&&-1!==[0,1].indexOf(1,2);j(n,{indexOf:function(e){var t=W&&P(this)?F(this,""):D.ToObject(this),n=D.ToUint32(t.length);if(0===n)return-1;var a=0;for(arguments.length>1&&(a=D.ToInteger(arguments[1])),a=a>=0?a:g(0,n+a);n>a;a++)if(a in t&&t[a]===e)return a;return-1}},Z);var Y=n.lastIndexOf&&-1!==[0,1].lastIndexOf(0,-3);j(n,{lastIndexOf:function(e){var t=W&&P(this)?F(this,""):D.ToObject(this),n=D.ToUint32(t.length);if(0===n)return-1;var a=n-1;for(arguments.length>1&&(a=m(a,D.ToInteger(arguments[1]))),a=a>=0?a:n-Math.abs(a);a>=0;a--)if(a in t&&e===t[a])return a;return-1}},Y);var K=function(){var e=[1,2],t=e.splice();return 2===e.length&&H(t)&&0===t.length}();j(n,{splice:function(e,t){return 0===arguments.length?[]:d.apply(this,arguments)}},!K);var Q=function(){var e={};return n.splice.call(e,0,0,1),1===e.length}();j(n,{splice:function(e,t){if(0===arguments.length)return[];var n=arguments;return this.length=g(D.ToInteger(this.length),0),arguments.length>0&&"number"!=typeof t&&(n=u.call(arguments),n.length<2?B(n,this.length-e):n[1]=D.ToInteger(t)),d.apply(this,n)}},!Q);var ee=function(){var e=new t(1e5);return e[8]="x",e.splice(1,1),7===e.indexOf("x")}(),te=function(){var e=256,t=[];return t[e]="a",t.splice(e+1,0,"b"),"a"===t[e]}();j(n,{splice:function(e,t){for(var n,a=D.ToObject(this),s=[],r=D.ToUint32(a.length),l=D.ToInteger(e),o=0>l?g(r+l,0):m(l,r),c=m(g(D.ToInteger(t),0),r-o),d=0;c>d;)n=i(o+d),R(a,n)&&(s[d]=a[n]),d+=1;var p,h=u.call(arguments,2),f=h.length;if(c>f){for(d=o;r-c>d;)n=i(d+c),p=i(d+f),R(a,n)?a[p]=a[n]:delete a[p],d+=1;for(d=r;d>r-c+f;)delete a[d-1],d-=1}else if(f>c)for(d=r-c;d>o;)n=i(d+c-1),p=i(d+f-1),R(a,n)?a[p]=a[n]:delete a[p],d-=1;d=o;for(var v=0;v=0&&!H(t)&&e(t.callee)},be=ge(arguments)?ge:me;j(a,{keys:function(t){var n=e(t),a=be(t),s=null!==t&&"object"==typeof t,r=s&&P(t);if(!s&&!n&&!a)throw new TypeError("Object.keys called on a non-object");var l=[],o=oe&&n;if(r&&ce||a)for(var c=0;cp;p++){var h=fe[p];d&&"constructor"===h||!R(t,h)||B(l,h)}return l}});var ye=a.keys&&function(){return 2===a.keys(arguments).length}(1,2),ke=a.keys&&function(){var e=a.keys(arguments);return 1!==arguments.length||1!==e.length||1!==e[0]}(1),we=a.keys;j(a,{keys:function(e){return we(be(e)?u.call(e):e)}},!ye||ke);var Ee=-621987552e5,xe="-000001",Te=Date.prototype.toISOString&&-1===new Date(Ee).toISOString().indexOf(xe),Se=Date.prototype.toISOString&&"1969-12-31T23:59:59.999Z"!==new Date(-1).toISOString();j(Date.prototype,{toISOString:function(){var e,t,n,a,s;if(!isFinite(this))throw new RangeError("Date.prototype.toISOString called on non-finite value.");for(a=this.getUTCFullYear(),s=this.getUTCMonth(),a+=Math.floor(s/12),s=(s%12+12)%12,e=[s+1,this.getUTCDate(),this.getUTCHours(),this.getUTCMinutes(),this.getUTCSeconds()],a=(0>a?"-":a>9999?"+":"")+q("00000"+Math.abs(a),a>=0&&9999>=a?-4:-6),t=e.length;t--;)n=e[t],10>n&&(e[t]="0"+n);return a+"-"+u.call(e,0,2).join("-")+"T"+u.call(e,2).join(":")+"."+q("000"+this.getUTCMilliseconds(),-3)+"Z"}},Te||Se);var _e=function(){try{return Date.prototype.toJSON&&null===new Date(NaN).toJSON()&&-1!==new Date(Ee).toJSON().indexOf(xe)&&Date.prototype.toJSON.call({toISOString:function(){return!0}})}catch(e){return!1}}();_e||(Date.prototype.toJSON=function(t){var n=a(this),s=D.ToPrimitive(n);if("number"==typeof s&&!isFinite(s))return null;var r=n.toISOString;if(!e(r))throw new TypeError("toISOString property is not callable");return r.call(n)});var Oe=1e15===Date.parse("+033658-09-27T01:46:40.000Z"),Pe=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"))||!isNaN(Date.parse("2012-12-31T23:59:60.000Z")),Ce=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(Ce||Pe||!Oe){var Le=Math.pow(2,31)-1,Me=(Math.floor(Le/1e3),N(new Date(1970,0,1,0,0,0,Le+1).getTime()));Date=function(e){var t=function(n,a,s,r,l,o,c){var u,d=arguments.length;if(this instanceof e){var p=o,h=c;if(Me&&d>=7&&c>Le){var f=Math.floor(c/Le)*Le,v=Math.floor(f/1e3);p+=v,h-=1e3*v}u=1===d&&i(n)===n?new e(t.parse(n)):d>=7?new e(n,a,s,r,l,p,h):d>=6?new e(n,a,s,r,l,p):d>=5?new e(n,a,s,r,l):d>=4?new e(n,a,s,r):d>=3?new e(n,a,s):d>=2?new e(n,a):d>=1?new e(n):new e}else u=e.apply(this,arguments);return A(u)||j(u,{constructor:t},!0),u},n=RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),a=[0,31,59,90,120,151,181,212,243,273,304,334,365],s=function(e,t){var n=t>1?1:0;return a[t]+Math.floor((e-1969+n)/4)-Math.floor((e-1901+n)/100)+Math.floor((e-1601+n)/400)+365*(e-1970)},r=function(t){var n=0,a=t;if(Me&&a>Le){var s=Math.floor(a/Le)*Le,r=Math.floor(s/1e3);n+=r,a-=1e3*r}return o(new e(1970,0,1,0,0,n,a))};for(var l in e)R(e,l)&&(t[l]=e[l]);j(t,{now:e.now,UTC:e.UTC},!0),t.prototype=e.prototype,j(t.prototype,{constructor:t},!0);var c=function(t){var a=n.exec(t);if(a){var i,l=o(a[1]),c=o(a[2]||1)-1,u=o(a[3]||1)-1,d=o(a[4]||0),p=o(a[5]||0),h=o(a[6]||0),f=Math.floor(1e3*o(a[7]||0)),v=!(!a[4]||a[8]),g="-"===a[9]?1:-1,m=o(a[10]||0),b=o(a[11]||0),y=p>0||h>0||f>0;return(y?24:25)>d&&60>p&&60>h&&1e3>f&&c>-1&&12>c&&24>m&&60>b&&u>-1&&u=-864e13&&864e13>=i)?i:NaN}return e.parse.apply(this,arguments)};return j(t,{parse:c}),t}(Date)}Date.now||(Date.now=function(){return(new Date).getTime()});var je=c.toFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0)),Ae={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function(e,t){for(var n=-1,a=t;++n=0;)n+=Ae.data[t],Ae.data[t]=Math.floor(n/e),n=n%e*Ae.base},numToString:function(){for(var e=Ae.size,t="";--e>=0;)if(""!==t||0===e||0!==Ae.data[e]){var n=i(Ae.data[e]);""===t?t=n:t+=q("0000000",0,7-n.length)+n}return t},pow:function Ze(e,t,n){return 0===t?n:t%2===1?Ze(e,t-1,n*e):Ze(e*e,t/2,n)},log:function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}},Ne=function(e){var t,n,a,s,r,l,c,u;if(t=o(e),t=N(t)?0:Math.floor(t),0>t||t>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(n=o(this),N(n))return"NaN";if(-1e21>=n||n>=1e21)return i(n);if(a="",0>n&&(a="-",n=-n),s="0",n>1e-21)if(r=Ae.log(n*Ae.pow(2,69,1))-69,l=0>r?n*Ae.pow(2,-r,1):n/Ae.pow(2,r,1),l*=4503599627370496,r=52-r,r>0){for(Ae.multiply(0,l),c=t;c>=7;)Ae.multiply(1e7,0),c-=7;for(Ae.multiply(Ae.pow(10,c,1),0),c=r-1;c>=23;)Ae.divide(1<<23),c-=23;Ae.divide(1<0?(u=s.length,s=t>=u?a+q("0.0000000000000000000",0,t-u+2)+s:a+q(s,0,u-t)+"."+q(s,u-t)):s=a+s,s};j(c,{toFixed:Ne},je);var De=function(){try{return"1"===1..toPrecision(void 0)}catch(e){return!0}}(),Ie=c.toPrecision;j(c,{toPrecision:function(e){return void 0===e?Ie.call(this):Ie.call(this,e)}},De),2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||4!=="test".split(/(?:)/,-1).length||"".split(/.?/).length||".".split(/()()/).length>1?!function(){var e=void 0===/()??/.exec("")[1],t=Math.pow(2,32)-1;l.split=function(n,a){var s=this;if(void 0===n&&0===a)return[];if(!T(n))return F(this,n,a);var r,i,l,o,c=[],d=(n.ignoreCase?"i":"")+(n.multiline?"m":"")+(n.unicode?"u":"")+(n.sticky?"y":""),h=0,f=RegExp(n.source,d+"g");s+="",e||(r=RegExp("^"+f.source+"$(?!\\s)",d));var v=void 0===a?t:D.ToUint32(a);for(i=f.exec(s);i&&(l=i.index+i[0].length,!(l>h&&(B(c,q(s,h,i.index)),!e&&i.length>1&&i[0].replace(r,function(){for(var e=1;e1&&i.index=v)));)f.lastIndex===i.index&&f.lastIndex++,i=f.exec(s);return h===s.length?(o||!f.test(""))&&B(c,""):B(c,q(s,h)),c.length>v?q(c,0,v):c}}():"0".split(void 0,0).length&&(l.split=function(e,t){return void 0===e&&0===t?[]:F(this,e,t)});var Re=l.replace,ze=function(){var e=[];return"x".replace(/x(.)?/g,function(t,n){B(e,n)}),1===e.length&&void 0===e[0]}();ze||(l.replace=function(t,n){var a=e(n),s=T(t)&&/\)[*?]/.test(t.source);if(a&&s){var r=function(e){var a=arguments.length,s=t.lastIndex;t.lastIndex=0;var r=t.exec(e)||[];return t.lastIndex=s,B(r,arguments[a-2],arguments[a-1]),n.apply(this,r)};return Re.call(this,t,r)}return Re.call(this,t,n)});var qe=l.substr,Fe="".substr&&"b"!=="0b".substr(-1);j(l,{substr:function(e,t){var n=e;return 0>e&&(n=g(this.length+e,0)),qe.call(this,n,t)}},Fe);var Ue=" \n\x0B\f\r   ᠎ â€â€‚         âŸã€€\u2028\u2029\ufeff",Be="​",He="["+Ue+"]",Ve=RegExp("^"+He+He+"*"),$e=RegExp(He+He+"*$"),We=l.trim&&(Ue.trim()||!Be.trim());j(l,{trim:function(){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");return i(this).replace(Ve,"").replace($e,"")}},We);var Je=l.lastIndexOf&&-1!=="abcã‚ã„".lastIndexOf("ã‚ã„",2);j(l,{lastIndexOf:function(e){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");for(var t=i(this),n=i(e),a=arguments.length>1?o(arguments[1]):NaN,s=N(a)?1/0:D.ToInteger(a),r=m(g(s,0),t.length),l=n.length,c=r+l;c>0;){c=g(0,c-l);var u=U(q(t,c,r+l),n);if(-1!==u)return c+u}return-1}},Je);var Ge=l.lastIndexOf;if(j(l,{lastIndexOf:function(e){return Ge.apply(this,arguments)}},1!==l.lastIndexOf.length),(8!==parseInt(Ue+"08")||22!==parseInt(Ue+"0x16"))&&(parseInt=function(e){var t=/^[\-+]?0[xX]/;return function(n,a){var s=i(n).trim(),r=o(a)||(t.test(s)?16:10);return e(s,r)}}(parseInt)),new RangeError("test")+""!="RangeError: test"){var Xe=(Error.prototype.toString,function(){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");var e=this.name;void 0===e?e="Error":"string"!=typeof e&&(e=i(e));var t=this.message;return void 0===t?t="":"string"!=typeof t&&(t=i(t)),e?t?e+": "+t:e:t});Error.prototype.toString=Xe}}),function(e,t){function n(e,t){var n=e.createElement("p"),a=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function a(){var e=y.elements;return"string"==typeof e?e.split(" "):e}function s(e,t){var n=y.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof e&&(e=e.join(" ")),y.elements=n+" "+e,c(t)}function r(e){var t=b[e[g]];return t||(t={},m++,e[g]=m,b[m]=t),t}function i(e,n,a){if(n||(n=t),d)return n.createElement(e);a||(a=r(n));var s;return s=a.cache[e]?a.cache[e].cloneNode():v.test(e)?(a.cache[e]=a.createElem(e)).cloneNode():a.createElem(e),!s.canHaveChildren||f.test(e)||s.tagUrn?s:a.frag.appendChild(s)}function l(e,n){if(e||(e=t),d)return e.createDocumentFragment();n=n||r(e);for(var s=n.frag.cloneNode(),i=0,l=a(),o=l.length;o>i;i++)s.createElement(l[i]);return s}function o(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return y.shivMethods?i(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+a().join().replace(/[\w\-:]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(y,t.frag)}function c(e){e||(e=t);var a=r(e);return!y.shivCSS||u||a.hasCSS||(a.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),d||o(e,a),e}var u,d,p="3.7.3",h=e.html5||{},f=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",m=0,b={};!function(){try{var e=t.createElement("a");e.innerHTML="",u="hidden"in e,d=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return void 0===e.cloneNode||void 0===e.createDocumentFragment||void 0===e.createElement}()}catch(n){u=!0,d=!0}}();var y={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:p,shivCSS:h.shivCSS!==!1,supportsUnknownElements:d,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:i,createDocumentFragment:l,addElements:s};e.html5=y,c(t),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.MiniSignal=e()}}(function(){return function e(t,n,a){function s(i,l){if(!n[i]){if(!t[i]){var o="function"==typeof require&&require;if(!l&&o)return o(i,!0);if(r)return r(i,!0);var c=Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[i]={exports:{}};t[i][0].call(u.exports,function(e){var n=t[i][1][e];return s(n?n:e)},u,u.exports,e,t,n,a)}return n[i].exports}for(var r="function"==typeof require&&require,i=0;i-1}}([].indexOf||function(e){for(F=this.length;F--&&this[F]!==e;);return F}),item:function(e){return this[e]||null},remove:function(){for(var e,t=0;t';var s=e.regions;if(s)for(var r,i=-1,l=s.length-1;l>i;)r=s[i+=1],a+='";a+="";var o=e.regions;if(o)for(var r,i=-1,c=o.length-1;c>i;){r=o[i+=1],a+=""}return a+="
    '+r.name+"
    ";var u=r.accesses;if(u)for(var d,p=-1,h=u.length-1;h>p;)d=u[p+=1],a+=""+n.link(d.name,d.req?"check-square-o":"square-o","set",{access:d.id},null,d.req?"selected":null)+"
    ";a+="
    "},TMPL.air_alarm=function(e,t,n){var a='
    ';if(a+=e.siliconUser?'
    Interface Lock:
    '+n.link("Engaged","lock","toggleaccess",null,e.locked?"selected":null)+n.link("Disengaged","unlock","toggleaccess",null,e.locked?null:"selected")+"
    ":e.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",a+='

    Air Status

    ',e.environment_data){var s=e.environment_data;if(s)for(var r,i=-1,l=s.length-1;l>i;)r=s[i+=1],a+='
    '+r.name+':
    ',a+=2==r.danger_level?'':1==r.danger_level?'':'',a+=""+n.fixed(r.value,2)+r.unit+"
    ";a+='
    Local Status:
    ',a+=2==e.danger_level?'Danger (Internals Required)':1==e.danger_level?'Caution':'Optimal',a+='
    Area Status:
    ',a+=e.atmos_alarm?'Atmosphere Alarm':e.fire_alarm?'Fire Alarm':'Nominal',a+="
    "}else a+='
    Warning: Cannot obtain air sample for analysis.
    ';if(e.emagged&&(a+='
    Warning: Safety measures offline. Device may exhibit abnormal behavior.
    '),a+="
    ",!e.locked||e.siliconUser)if(1!=e.screen&&(a+=""+n.link("Back","arrow-left","screen",{screen:1})),1==e.screen)a+='

    Air Controls

    ',a+=e.atmos_alarm?""+n.link("Area Atmospheric Alarm","close","reset",null,null,"caution"):""+n.link("Area Atmospheric Alarm","hand-stop-o","alarm"),a+='
    ',a+=3!=e.mode?""+n.link("Panic Siphon","exclamation","mode",{mode:3}):""+n.link("Panic Siphon","close","mode",{mode:1},null,"danger"),a+='
    '+n.link("Vent Controls","sign-out","screen",{screen:2})+'
    '+n.link("Scrubber Controls","filter","screen",{screen:3})+'
    '+n.link("Set Environmental Mode","cog","screen",{screen:4})+'
    '+n.link("Set Alarm Threshold","bar-chart","screen",{screen:5})+"
    ";else if(2==e.screen){var o=e.vents;if(o)for(var c,i=-1,u=o.length-1;u>i;)c=o[i+=1],a+='

    '+c.long_name+'

    Power:
    ',a+=c.power?""+n.link("On","power-off","adjust",{id_tag:c.id_tag,command:"power",val:0},null,null):""+n.link("Off","close","adjust",{id_tag:c.id_tag,command:"power",val:1},null,"danger"),a+='
    Mode:
    ',a+="release"==c.direction?'Pressurizing':'Siphoning',a+='
    Pressure Checks:
    '+n.link("Internal","sign-in","adjust",{id_tag:c.id_tag,command:"incheck",val:c.checks},null,c.incheck?"selected":null)+n.link("External","sign-out","adjust",{id_tag:c.id_tag,command:"excheck",val:c.checks},null,c.excheck?"selected":null)+'
    Set Pressure:
    '+n.link(n.fixed(c.external),"pencil","adjust",{id_tag:c.id_tag,command:"set_external_pressure"})+n.link("Reset","refresh","adjust",{id_tag:c.id_tag,command:"reset_external_pressure"},c.extdefault?"disabled":null)+"
    ";e.vents.length||(a+='No vents connected.')}else if(3==e.screen){var d=e.scrubbers;if(d)for(var p,i=-1,h=d.length-1;h>i;)p=d[i+=1],a+='

    '+p.long_name+'

    Power:
    ',a+=p.power?""+n.link("On","power-off","adjust",{id_tag:p.id_tag,command:"power",val:0},null,null):""+n.link("Off","close","adjust",{id_tag:p.id_tag,command:"power",val:1},null,"danger"),a+='
    Mode:
    ',a+=p.scrubbing?""+n.link("Scrubbing","filter","adjust",{id_tag:p.id_tag,command:"scrubbing",val:0},null,null):""+n.link("Siphoning","sign-in","adjust",{id_tag:p.id_tag,command:"scrubbing",val:1},null,"danger"),a+='
    Range:
    ',a+=p.widenet?""+n.link("Extended","expand","adjust",{id_tag:p.id_tag,command:"widenet",val:0},null,"caution"):""+n.link("Normal","compress","adjust",{id_tag:p.id_tag,command:"widenet",val:1},null,null),a+='
    Filters:
    '+n.link("CO2",p.filter_co2?"check-square-o":"square-o","adjust",{id_tag:p.id_tag,command:"co2_scrub",val:p.filter_co2?0:1},null,p.filter_co2?"selected":null)+n.link("N2O",p.filter_n2o?"check-square-o":"square-o","adjust",{id_tag:p.id_tag,command:"n2o_scrub",val:p.filter_n2o?0:1},null,p.filter_n2o?"selected":null)+n.link("Plasma",p.filter_toxins?"check-square-o":"square-o","adjust",{id_tag:p.id_tag,command:"tox_scrub",val:p.filter_toxins?0:1},null,p.filter_toxins?"selected":null)+"
    ";e.scrubbers.length||(a+='No scrubbers connected.')}else if(4==e.screen){a+='

    Environmental Modes

    ';var f=e.modes;if(f)for(var v,i=-1,g=f.length-1;g>i;)v=f[i+=1],a+='
    '+n.link(v.name,v.selected?"check-square-o":"square-o","mode",{mode:v.mode},null,v.selected?v.danger?"danger":"selected":null)+"
    ";a+="
    "}else if(5==e.screen){a+='

    Alarm Thresholds

    ';var m=e.thresholds;if(m)for(var b,i=-1,y=m.length-1;y>i;){b=m[i+=1],a+="";var k=b.settings;if(k)for(var w,E=-1,x=k.length-1;x>E;)w=k[E+=1],a+="";a+=""}a+="
    min2min1max1max2
    "+b.name+""+n.link(w.selected>=0?n.round(100*w.selected)/100:"Off",null,"adjust",{command:"set_threshold",env:w.env,"var":w.val})+"
    "}return a},TMPL.apc=function(e,t,n){var a='
    ';a+=e.siliconUser?'
    Interface Lock:
    '+n.link("Engaged","lock","toggleaccess",null,e.locked?"selected":null)+n.link("Disengaged","unlock","toggleaccess",null,e.malfStatus>=2?"linkOff":e.locked?null:"selected")+"
    ":e.locked?"Swipe an ID card to unlock this interface.":"Swipe an ID card to lock this interface.",a+='

    Power Status

    Main Breaker:
    ',a+=e.locked&&!e.siliconUser?e.isOperating?'On':'Off':""+n.link("On","power-off","breaker",null,e.isOperating?"selected":null)+n.link("Off","close","breaker",null,e.isOperating?null:"selected"),a+='
    External Power:
    ',a+=2==e.externalPower?'Good':1==e.externalPower?'Low':'None',a+='
    Power Cell:
    ',a+=null!=e.powerCellStatus?""+n.bar(e.powerCellStatus,0,100,e.powerCellStatus>=50?"good":e.powerCellStatus>=25?"average":"bad",n.fixed(e.powerCellStatus)+"%"):'Power cell removed.',a+="
    ",null!=e.powerCellStatus&&(a+='
    Charge Mode:
    ',a+=e.locked&&!e.siliconUser?e.chargeMode?'Auto':'Off':""+n.link("Auto","refresh","chargemode",null,e.chargeMode?"selected":null)+n.link("Off","close","chargemode",null,e.chargeMode?null:"selected"),a+=" ",a+=e.chargingStatus>1?'[Fully Charged]':1==e.chargingStatus?'[Charging]':'[Not Charging]',a+="
    "),a+='

    Power Channels

    ';var s=e.powerChannels;if(s)for(var r,i=-1,l=s.length-1;l>i;)r=s[i+=1],a+="";return a+='
    "+r.title+":"+r.powerLoad+" W",r.status<=1?a+='Off':r.status>=2&&(a+='On'),a+="",a+=1==r.status||3==r.status?"[Auto]":"[Manual]",a+='',(!e.locked||e.siliconUser)&&(a+=""+n.link("Auto","refresh","channel",r.topicParams.auto,1==r.status||3==r.status?"selected":null)+n.link("On","power-off","channel",r.topicParams.on,2==r.status?"selected":null)+n.link("Off","close","channel",r.topicParams.off,0==r.status?"selected":null)),a+="
    Total Load:'+e.totalLoad+" W
    ",e.siliconUser&&(a+='

    System Overrides

    '+n.link("Overload Lighting Circuit","lightbulb-o","overload")+"
    ",1==e.malfStatus?a+=""+n.link("Override Programming","terminal","hack"):2==e.malfStatus?a+=""+n.link("Shunt Core Processes","caret-square-o-down","occupy"):3==e.malfStatus?a+=""+n.link("Return to Main Core","carat-square-o-left","deoccupy"):4==e.malfStatus&&(a+=""+n.link("Shunt Core Processes","caret-square-o-down")),a+="
    "),a+='
    Cover Lock:
    ',a+=e.locked&&!e.siliconUser?e.coverLocked?"Engaged":"Disengaged":""+n.link("Engaged","lock","lock",null,e.coverLocked?"selected":null)+n.link("Disengaged","unlock","lock",null,e.coverLocked?null:"selected"),a+="
    "},TMPL.atmos_filter=function(e,t,n){var a='
    Power:
    '+n.link(e.on?"On":"Off",e.on?"power-off":"close","power")+'
    Output Pressure:
    '+n.link("Set","pencil","pressure",{set:"custom"})+n.link("Max","plus","pressure",{set:"max"},e.set_pressure==e.max_pressure?"disabled":null)+''+e.set_pressure+' kPa
    Filter:
    '+n.link("Nothing",null,"filter",{mode:-1},-1==e.filter_type?"selected":null)+n.link("Plasma",null,"filter",{mode:0},0==e.filter_type?"selected":null)+n.link("O2",null,"filter",{mode:1},1==e.filter_type?"selected":null)+n.link("N2",null,"filter",{mode:2},2==e.filter_type?"selected":null)+n.link("CO2",null,"filter",{mode:3},3==e.filter_type?"selected":null)+n.link("N2O",null,"filter",{mode:4},4==e.filter_type?"selected":null)+"
    ";return a},TMPL.atmos_mixer=function(e,t,n){var a='
    Power:
    '+n.link(e.on?"On":"Off",e.on?"power-off":"close","power")+'
    Output Pressure:
    '+n.link("Set","pencil","pressure",{set:"custom"})+n.link("Max","plus","pressure",{set:"max"},e.set_pressure==e.max_pressure?"disabled":null)+''+e.set_pressure+' kPa
    Node 1:
    '+n.link("","fast-backward","node1",{concentration:"-0.1"},null)+n.link("","backward","node1",{concentration:"-0.01"},null)+n.link("","forward","node1",{concentration:"0.01"},null)+n.link("","fast-forward","node1",{concentration:"0.1"},null)+''+e.node1_concentration+'%
    Node 2:
    '+n.link("","fast-backward","node2",{concentration:"-0.1"},null)+n.link("","backward","node2",{concentration:"-0.01"},null)+n.link("","forward","node2",{concentration:"0.01"},null)+n.link("","fast-forward","node2",{concentration:"0.1"},null)+''+e.node2_concentration+"%
    ";return a},TMPL.atmos_pump=function(e,t,n){var a='
    Power:
    '+n.link(e.on?"On":"Off",e.on?"power-off":"close","power")+"
    ";return a+=e.max_rate?'
    Transfer Rate:
    '+n.link("Set","pencil","transfer",{set:"custom"})+n.link("Max","plus","transfer",{set:"max"},e.transfer_rate==e.max_rate?"disabled":null)+''+e.transfer_rate+" L/s
    ":'
    Output Pressure:
    '+n.link("Set","pencil","pressure",{set:"custom"})+n.link("Max","plus","pressure",{set:"max"},e.set_pressure==e.max_pressure?"disabled":null)+''+e.set_pressure+" kPa
    ",a+="
    "},TMPL.canister=function(e,t,n){var a='
    ';return a+=e.hasHoldingTank?"The regulator is connected to a tank.":"The regulator is not connected to a tank.",a+='

    Canister

    '+n.link("Relabel","pencil","relabel",null,e.canLabel?null:"disabled")+'
    Pressure:
    '+e.tankPressure+' kPa
    Port:
    ',a+=e.portConnected?'Connected':'Disconnected',a+='

    Valve

    Release Pressure:
    '+n.bar(e.releasePressure,e.minReleasePressure,e.maxReleasePressure,null,e.releasePressure+" kPa")+'
    Pressure Regulator:
    '+n.link("Reset","refresh","pressure",{set:"reset"},e.releasePressure!=e.defaultReleasePressure?null:"disabled")+n.link("Min","minus","pressure",{set:"min"},e.releasePressure>e.minReleasePressure?null:"disabled")+n.link("Set","pencil","pressure",{set:"custom"},null)+n.link("Max","plus","pressure",{set:"max"},e.releasePressure
    Valve:
    '+n.link("Open","unlock","valve",null,e.valveOpen?"selected":null)+n.link("Close","lock","valve",null,e.valveOpen?null:"selected")+'

    Holding Tank

    ',a+=e.hasHoldingTank?"
    "+n.link("Eject","eject","eject")+'
    Label:
    '+e.holdingTank.name+'
    Tank Pressure:
    '+e.holdingTank.tankPressure+" kPa
    ":'
    No Holding Tank
    ',a+="
    "},TMPL.chem_dispenser=function(e,t,n){var a='

    Status

    Energy:
    '+n.bar(e.energy,0,e.maxEnergy,null,e.energy+" Units")+'
    Amount:
    ',s=e.beakerTransferAmounts;if(s)for(var r,i=-1,l=s.length-1;l>i;)r=s[i+=1],a+=""+n.link(r,"plus","amount",{set:r},e.amount==r?"selected":null);a+='

    Dispense

    ';var o=e.chemicals;if(o)for(var c,i=-1,u=o.length-1;u>i;)c=o[i+=1],a+=""+n.link(c.title,"tint","dispense",c.commands,null,"gridable");a+='

    Beaker

    '+n.link("Eject","eject","eject",null,e.isBeakerLoaded?null:"disabled")+'
    ';var d=e.beakerTransferAmounts;if(d)for(var r,i=-1,p=d.length-1;p>i;)r=d[i+=1],a+=""+n.link(r,"minus","remove",{amount:r});if(a+='
    Contents:
    ',e.isBeakerLoaded)if(e.beakerContents.length){a+=""+e.beakerCurrentVolume+"/"+e.beakerMaxVolume+" Units
    ";var h=e.beakerContents;if(h)for(var f,i=-1,v=h.length-1;v>i;)f=h[i+=1],a+=''+f.volume+" units of "+f.name+"
    "}else a+='Beaker Empty';else a+='No Beaker Loaded';return a+="
    "},TMPL.chem_heater=function(e,t,n){var a='

    Status

    Power:
    '+n.link(e.isActive?"On":"Off",e.isActive?"power-off":"close","power",null,e.isBeakerLoaded?null:"disabled")+'
    Target:
    '+n.link(e.targetTemp+"K","pencil","temperature")+'

    Beaker

    '+n.link("Eject","eject","eject",null,e.isBeakerLoaded?null:"disabled")+'
    Contents:
    ';if(e.isBeakerLoaded)if(a+="Temperature: "+e.currentTemp+"K
    ",e.beakerContents.length){var s=e.beakerContents;if(s)for(var r,i=-1,l=s.length-1;l>i;)r=s[i+=1],a+=''+r.volume+" units of "+r.name+"
    "}else a+='Beaker Empty';else a+='No Beaker Loaded';return a+="
"},TMPL.cryo=function(e,t,n){var a='

Occupant

Occupant:
';if(a+=e.hasOccupant?""+e.occupant.name+"":'No Occupant',a+="
",e.hasOccupant&&(a+='
State:
',a+=0==e.occupant.stat?'Conscious':1==e.occupant.stat?'Unconscious':'Dead',a+='
Temperature:
'+n.round(e.occupant.bodyTemperature)+" K
"),e.hasOccupant&&e.occupant.stat<2&&(a+='
Health:
'+n.bar(e.occupant.health,e.occupant.minHealth,e.occupant.Maxhealth,e.occupant.health>=0?"good":"average",n.round(e.occupant.health))+'
Brute:
'+n.bar(e.occupant.bruteLoss,0,e.occupant.maxHealth,"bad",n.round(e.occupant.bruteLoss))+'
Respiratory:
'+n.bar(e.occupant.oxyLoss,0,e.occupant.maxHealth,"bad",n.round(e.occupant.oxyLoss))+'
Toxin:
'+n.bar(e.occupant.toxLoss,0,e.occupant.maxHealth,"bad",n.round(e.occupant.toxLoss))+'
Burn:
'+n.bar(e.occupant.fireLoss,0,e.occupant.maxHealth,"bad",n.round(e.occupant.fireLoss))+"
"),a+='

Cell

Power:
',a+=e.isOperating?""+n.link("On","power-off","off"):""+n.link("Off","close","on"),a+='
Temperature:
'+e.cellTemperature+' K
Door:
',a+=e.isOpen?""+n.link("Open","unlock","close"):""+n.link("Closed","lock","open"),a+=e.autoEject?""+n.link("Auto","sign-out","autoeject"):""+n.link("Manual","sign-in","autoeject"),a+='

Beaker

'+n.link("Eject","eject","ejectbeaker",null,e.isBeakerLoaded?null:"disabled")+'
Contents:
',e.isBeakerLoaded)if(e.beakerContents.length){var s=e.beakerContents;if(s)for(var r,i=-1,l=s.length-1;l>i;)r=s[i+=1],a+=''+r.volume+" units of "+r.name+"
"}else a+='Beaker Empty';else a+='No Beaker Loaded';return a+="
"},TMPL.smes=function(e,t,n){var a='

Storage

Stored Energy:
'+n.bar(e.capacityPercent,0,100,e.capacityPercent>=50?"good":e.capacityPercent>=15?"average":"bad",n.round(e.capacityPercent)+"%")+'

Input

Charge Mode:
'+n.link("Auto","refresh","tryinput",null,e.inputAttempt?"selected":null)+n.link("Off","close","tryinput",null,e.inputAttempt?null:"selected")+" ";return a+=e.capacityPercent>=99?"[Fully Charged]":e.inputting?"[Charging]":"[Not Charging]",a+='
Input Setting:
'+n.bar(e.inputLevel,0,e.inputLevelMax,null,e.inputLevel+" W")+'
Adjust Input:
'+n.link("","fast-backward","input",{set:"min"},e.inputLevel?null:"selected")+n.link("","backward","input",{set:"minus"},e.inputLevel?null:"disabled")+n.link("Set","pencil","input",{set:"custom"},null)+n.link("","forward","input",{set:"plus"},e.inputLevel==e.inputLevelMax?"disabled":null)+n.link("","fast-forward","input",{set:"max"},e.inputLevel==e.inputLevelMax?"selected":null)+'
Available:
'+e.inputAvailable+' W

Output

Charge Mode:
'+n.link("On","power-off","tryoutput",null,e.outputAttempt?"selected":null)+n.link("Off","close","tryoutput",null,e.outputAttempt?null:"selected")+" ",a+=e.outputting?'[Sending]':e.charge>0?'[Not Sending]':'[No Charge]',a+='
Output Setting:
'+n.bar(e.outputLevel,0,e.outputLevelMax,null,e.outputLevel+" W")+'
Adjust Output:
'+n.link("","fast-backward","output",{set:"min"},e.outputLevel?null:"selected")+n.link("","backward","output",{set:"minus"},e.outputLevel?null:"disabled")+n.link("Set","pencil","output",{set:"custom"},null)+n.link("","forward","output",{set:"plus"},e.outputLevel==e.outputLevelMax?"disabled":null)+n.link("","fast-forward","output",{set:"max"},e.outputLevel==e.outputLevelMax?"selected":null)+'
Outputting:
'+e.outputUsed+" W
"},TMPL.solar_control=function(e,t,n){var a='

Status

Generated Power:
'+e.generated+' W
Orientation:
'+e.angle+"° ("+e.direction+')
Adjust:
'+n.link("15°","step-backward","control",{cdir:"-15"})+n.link("1°","backward","control",{cdir:"-1"})+n.link("1°","forward","control",{cdir:"1"})+n.link("15°","step-forward","control",{cdir:"15"})+'

Tracking

Tracker Mode:
'+n.link("Off","close","tracking",{mode:"0"},0==e.tracking_state?"selected":"")+n.link("Timed","clock-o","tracking",{mode:"1"},1==e.tracking_state?"selected":"");return a+=e.connected_tracker?""+n.link("Auto","refresh","tracking",{mode:"2"},2==e.tracking_state?"selected":""):""+n.link("Auto","refresh",null,null,"disabled"),a+='
Tracking Rate:
'+e.tracking_rate+" deg/h ("+e.rotating_way+')
Adjust:
'+n.link("180°","fast-backward","control",{tdir:"-180"})+n.link("30°","step-backward","control",{tdir:"-30"})+n.link("1°","backward","control",{tdir:"-1"})+n.link("1°","forward","control",{tdir:"1"})+n.link("30°","step-forward","control",{tdir:"30"})+n.link("180°","fast-forward","control",{tdir:"180"})+'

Devices

Search:
'+n.link("Refresh","refresh","refresh")+'
Solar Tracker:
',a+=e.connected_tracker?'Found':'Not Found',a+='
Solars Panels:
'+e.connected_panels+" Connected
"},TMPL.space_heater=function(e,t,n){var a='

Status

Power:
'+n.link("On","power-off","power",null,e.on?"selected":null)+n.link("Off","close","power",null,e.on?null:"selected")+'
Stored Energy:
';return a+=e.hasPowercell?""+n.bar(e.powerLevel,0,100,"good",e.powerLevel+"%"):'No power cell loaded.',a+="
",e.open&&(a+='
Cell:
',a+=e.hasPowercell?""+n.link("Eject","eject","ejectcell"):""+n.link("Install","eject","installcell"),a+="
"),a+='

Thermostat

Current Temp:
'+e.currentTemp+'°C
Target Temp:
'+e.targetTemp+"°C
",e.open&&(a+='
Adjustment:
'+n.link("","fast-backward","temp",{set:-20},e.targetTemp>e.minTemp?null:"disabled")+n.link("","backward","temp",{set:-5},e.targetTemp>e.minTemp?null:"disabled")+n.link("Set","pencil","temp",{set:"custom"},null)+n.link("","forward","temp",{set:5},e.targetTemp
"),a+='
Operational Mode:
',a+=e.open?""+n.link("Heat","long-arrow-up","mode",{mode:"heat"},"heat"!=e.mode?null:"selected")+n.link("Cool","long-arrow-down","mode",{mode:"cool"},"cool"!=e.mode?null:"selected")+n.link("Auto","arrows-v","mode",{mode:"auto"},"heat"==e.mode||"cool"==e.mode?null:"selected"):"heat"==e.mode?'Heat':"cool"==e.mode?'Cool':'Auto', -a+="
"},TMPL.tanks=function(e,t,n){var a='
';return a+=e.hasHoldingTank?"The regulator is connected to a mask.":"The regulator is not connected to a mask.",a+='
Tank Pressure:
'+n.bar(e.tankPressure,0,1013,e.tankPressure>200?"good":e.tankPressure>100?"average":"bad",e.tankPressure+" kPa")+'
Release Pressure:
'+n.bar(e.releasePressure,e.minReleasePressure,e.maxReleasePressure,null,e.releasePressure+" kPa")+'
Pressure Regulator:
'+n.link("Reset","refresh","pressure",{set:"reset"},e.releasePressure!=e.defaultReleasePressure?null:"disabled")+n.link("Min","minus","pressure",{set:"min"},e.releasePressure>e.minReleasePressure?null:"disabled")+n.link("Set","pencil","pressure",{set:"custom"},null)+n.link("Max","plus","pressure",{set:"max"},e.releasePressure
Valve:
'+n.link("Open","unlock","valve",null,e.maskConnected?e.valveOpen?"selected":null:"disabled")+n.link("Close","lock","valuve",null,e.valveOpen?null:"selected")+"
"},TMPL._generic=function(e,t,n){var a="
"+t.title+"
Initiating...
";return a},TMPL._nanotrasen=function(e,t,n){var a="
"+t.title+"
Initiating...
";return a},function(){var e=function(e,t){return function(){return e.apply(t,arguments)}};this.Chrome=function(){function t(t,n){this.nanoui=t,this.handleResize=e(this.handleResize,this),this.handleDrag=e(this.handleDrag,this),this.calcOffsets=e(this.calcOffsets,this),this.nanoui.updated.add(this.linkStatus),this.nanoui.updated.add(this.windowStatus),this.nanoui.rendered.add(this.handleLinks),n.config.user.fancy&&(this.dragging=!1,this.resizing=!1,this.switchChrome(),this.calcOffsets(),this.handleButtons(),this.handleDrag(),this.handleResize())}return t.prototype.linkStatus=function(e){var t;return t=document.queryAll(".link"),e.config.status!==NANO.INTERACTIVE?t.forEach(function(e){return e.className="link disabled"}):void 0},t.prototype.windowStatus=function(e){var t;return t=document.queryAll(".statusicon"),t.forEach(function(t){var n;switch(e.config.status){case NANO.INTERACTIVE:n="good";break;case NANO.UPDATE:n="average";break;default:n="bad"}return t.classList.remove("good","bad","average"),t.classList.add(n)})},t.prototype.handleLinks=function(e){var t;return t=function(){var t,n;return t=this.getAttribute("data-action"),n=JSON.parse(this.getAttribute("data-params")),null!=t&&null!=n&&e.config.status===NANO.INTERACTIVE?nanoui.act(t,n):void 0},document.queryAll(".link.active").forEach(function(e){return e.addEventListener("click",t)})},t.prototype.switchChrome=function(){var e;return this.nanoui.winset("titlebar",0),this.nanoui.winset("can-resize",0),e=document.queryAll(".fancy"),e.forEach(function(e){return e.classList.remove("fancy")})},t.prototype.calcOffsets=function(){return this.xOriginal=window.screenLeft,this.yOriginal=window.screenTop,this.nanoui.setPos(0,0),this.xOffset=window.screenLeft,this.yOffset=window.screenTop,this.nanoui.setPos(this.xOriginal-this.xOffset,this.yOriginal-this.yOffset)},t.prototype.handleButtons=function(){var e,t;return e=document.queryAll(".close"),e.forEach(function(e){return e.addEventListener("click",function(e){return function(){return e.nanoui.close()}}(this))}),t=document.queryAll(".minimize"),t.forEach(function(e){return e.addEventListener("click",function(e){return function(){return e.nanoui.minimize()}}(this))})},t.prototype.handleDrag=function(){var e,t;return e=function(e){return function(t){var n,a;return null==t&&(t=window.event),e.dragging?(null==e.xDrag&&(e.xDrag=t.screenX),null==e.yDrag&&(e.yDrag=t.screenY),n=t.screenX-e.xDrag+(window.screenLeft-e.xOffset),a=t.screenY-e.yDrag+(window.screenTop-e.yOffset),e.nanoui.setPos(n,a),e.xDrag=t.screenX,e.yDrag=t.screenY):void 0}}(this),t=document.query("#titlebar"),document.addEventListener("mousemove",e),t.addEventListener("mousedown",function(e){return function(){return e.dragging=!0}}(this)),document.addEventListener("mouseup",function(e){return function(){return e.dragging=!1,delete e.xDrag,delete e.yDrag}}(this))},t.prototype.handleResize=function(){var e,t;return t=function(e){return function(t){var n,a;return null==t&&(t=window.event),e.resizing?(null==e.xResize&&(e.xResize=t.screenX),null==e.yResize&&(e.yResize=t.screenY),n=Math.max(250,t.screenX-e.xResize+window.innerWidth),a=Math.max(250,t.screenY-e.yResize+window.innerHeight),e.nanoui.setSize(n,a),e.xResize=t.screenX,e.yResize=t.screenY):void 0}}(this),e=document.query("#resize"),document.addEventListener("mousemove",t),e.addEventListener("mousedown",function(e){return function(){return e.resizing=!0}}(this)),document.addEventListener("mouseup",function(e){return function(){return e.resizing=!1,delete e.xResize,delete e.yResize}}(this))},t}()}.call(this),function(){this.NANO={INTERACTIVE:2,UPDATE:1,DISABLED:0,CLOSE:-1}}.call(this),function(){this.helpers={link:function(e,t,n,a,s,r){return null==e&&(e=""),null==t&&(t=""),null==n&&(n=""),null==a&&(a={}),null==s&&(s=""),null==r&&(r=""),a=JSON.stringify(a),t&&(t="",r+=" iconed"),s?""+t+e+"":""+t+e+""},bar:function(e,t,n,a,s){var r;return null==e&&(e=0),null==t&&(t=0),null==n&&(n=100),null==a&&(a=""),null==s&&(s=""),n>t?t>e?e=t:e>n&&(e=n):e>t?e=t:n>e&&(e=n),r=Math.round((e-t)/(n-t)*100),"
"+s+"
"},round:function(e){return Math.round(e)},fixed:function(e,t){return null==t&&(t=1),+(Math.round(e+"e"+t)+"e-"+t)},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)}}}.call(this),function(){var e,t=function(e,t){return function(){return e.apply(t,arguments)}};e=function(){function e(){this.minimize=t(this.minimize,this),this.close=t(this.close,this),this.focusMap=t(this.focusMap,this),this.setSize=t(this.setSize,this),this.setPos=t(this.setPos,this),this.winset=t(this.winset,this),this.act=t(this.act,this),this.render=t(this.render,this),this.update=t(this.update,this);var e,n,a;this.laidout=!1,this.dragging=!1,this.resizing=!1;try{e=document.query("meta[name='data']"),this.data=JSON.parse(e.getAttribute("content"))}catch(a){n=a,this.error(n)}null!=this.data&&"data"in this.data&&"config"in this.data||this.error("Initial data did not load correctly."),this.render(this.data),this.chrome=new Chrome(this,this.data),this.initialized.dispatch(this.data),this.incoming.add(this.update)}return e.prototype.initialized=new MiniSignal,e.prototype.incoming=new MiniSignal,e.prototype.update=function(e){var t,n,a;try{t=JSON.parse(e),null==t.data&&(null!=this.data.data?t.data=this.data.data:t.data={}),this.data=t}catch(a){n=a,this.error(n)}return this.render(this.data),this.updated.dispatch(this.data)},e.prototype.updated=new MiniSignal,e.prototype.render=function(e){var t,n,a,s;try{return this.laidout||(this.laidout=!0,document.query("body").classList.add(e.config.layout),s=TMPL[e.config.templates.layout](e.data,e.config,helpers),document.query("#layout").innerHTML=s),t=TMPL[e.config.templates.content](e.data,e.config,helpers),document.query("#content").innerHTML=t,this.rendered.dispatch(this.data)}catch(a){return n=a,this.error(n)}},e.prototype.rendered=new MiniSignal,e.prototype.href=function(e,t){return null==e&&(e={}),null==t&&(t=""),"byond://"+t+"?"+Object.keys(e).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])}).join("&")},e.prototype.act=function(e,t){return null==t&&(t={}),t.src=this.data.config.ref,t.nano=e,location.href=this.href(t,null)},e.prototype.error=function(e){return location.href=this.href({nano_error:e},null)},e.prototype.winset=function(e,t,n){var a;return null==n&&(n=this.data.config.window),location.href=this.href((a={},a[n+"."+e]=t,a),"winset")},e.prototype.setPos=function(e,t){return this.winset("pos",e+","+t)},e.prototype.setSize=function(e,t){return this.winset("size",e+","+t)},e.prototype.focusMap=function(){return this.winset("focus",1,"mapwindow.map")},e.prototype.close=function(){return this.winset("is-visible","false"),location.href=this.href({command:"nanoclose "+this.data.config.ref},"winset")},e.prototype.minimize=function(){return this.winset("is-minimized","true")},e}(),this.nanoui=new e}.call(this); \ No newline at end of file diff --git a/nano/bower.json b/nano/bower.json deleted file mode 100644 index 51bf05891ff..00000000000 --- a/nano/bower.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "nanoui", - "private": true, - "dependencies": { - "DOM4": "dom4#~1.5.2", - "es5-shim": "~4.4.1", - "html5shiv": "~3.7.3", - "IE8": "ie8#~2.9.10", - "mini-signals": "~1.1.0" - }, - "overrides": { - "IE8": { - "main": "build/ie8.max.js" - }, - "DOM4": { - "dependencies": { - "IE8": "*" - } - }, - "mini-signals": { - "dependencies": { - "IE8": "*" - } - } - } -} diff --git a/nano/html/nanoui.html b/nano/html/nanoui.html deleted file mode 100644 index 95ded8db4b9..00000000000 --- a/nano/html/nanoui.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - -
-
Loading...
-
- - - - diff --git a/nano/package.json b/nano/package.json deleted file mode 100644 index d1749cf972d..00000000000 --- a/nano/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "nanoui", - "private": true, - "dependencies": { - "autoprefixer": "^6.2.2", - "coffee-script": "^1.10.0", - "del": "^2.2.0", - "gulp": "^3.9.0", - "gulp-bytediff": "^1.0.0", - "gulp-coffee": "^2.3.1", - "gulp-concat": "^2.6.0", - "gulp-csscomb": "^3.0.6", - "gulp-cssnano": "^2.0.0", - "gulp-dot-precompiler": "git+https://github.com/kentliau/gulp-dot-precompiler.git", - "gulp-filter": "^3.0.1", - "gulp-header": "^1.7.1", - "gulp-htmlmin": "^1.3.0", - "gulp-if": "^2.0.0", - "gulp-jsbeautifier": "^1.0.1", - "gulp-less": "^3.0.5", - "gulp-load-plugins": "^1.1.0", - "gulp-postcss": "^6.0.1", - "gulp-rename": "^1.2.2", - "gulp-replace": "^0.5.4", - "gulp-size": "^2.0.0", - "gulp-sourcemaps": "^1.6.0", - "gulp-uglify": "^1.5.1", - "gulp-util": "^3.0.7", - "hexa-color-regex": "^1.0.0", - "main-bower-files": "^2.11.0", - "merge2": "^0.3.6", - "pleeease-filters": "^2.0.0", - "postcss-color-rgba-fallback": "git+https://github.com/postcss/postcss-color-rgba-fallback", - "postcss-colorblind": "^0.4.0", - "postcss-filter-gradient": "^0.2.1", - "postcss-font-weights": "^2.0.1", - "postcss-opacity": "^3.0.0" - } -} diff --git a/nano/scripts/chrome.coffee b/nano/scripts/chrome.coffee deleted file mode 100644 index d024f7deee3..00000000000 --- a/nano/scripts/chrome.coffee +++ /dev/null @@ -1,106 +0,0 @@ -class @Chrome - constructor: (@nanoui, data) -> - @nanoui.updated.add @linkStatus - @nanoui.updated.add @windowStatus - @nanoui.rendered.add @handleLinks - - return unless data.config.user.fancy - @dragging = false - @resizing = false - - @switchChrome() - @calcOffsets() - @handleButtons() - @handleDrag() - @handleResize() - - linkStatus: (data) -> - links = document.queryAll ".link" - if data.config.status isnt NANO.INTERACTIVE - links.forEach (element) -> - element.className = "link disabled" - - windowStatus: (data) -> - statusicons = document.queryAll ".statusicon" - statusicons.forEach (statusicon) -> - switch data.config.status - when NANO.INTERACTIVE - klass = "good" - when NANO.UPDATE - klass = "average" - else - klass = "bad" - statusicon.classList.remove "good", "bad", "average" - statusicon.classList.add klass - - handleLinks: (data) -> - onClick = -> - action = @getAttribute "data-action" - params = JSON.parse @getAttribute "data-params" - if action? and params? and data.config.status is NANO.INTERACTIVE - nanoui.act action, params - - document.queryAll(".link.active").forEach (link) -> - link.addEventListener "click", onClick - - switchChrome: -> - @nanoui.winset "titlebar", 0 - @nanoui.winset "can-resize", 0 - fancy = document.queryAll ".fancy" - fancy.forEach (chrome) -> - chrome.classList.remove "fancy" - - calcOffsets: => - @xOriginal = window.screenLeft - @yOriginal = window.screenTop - @nanoui.setPos 0, 0 # Move to 0,0 to measure offsets. - @xOffset = window.screenLeft - @yOffset = window.screenTop - @nanoui.setPos @xOriginal - @xOffset, @yOriginal - @yOffset # Put the window back. - - handleButtons: -> - closers = document.queryAll ".close" - closers.forEach (closer) -> - closer.addEventListener "click", => @nanoui.close() - - minimizers = document.queryAll ".minimize" - minimizers.forEach (minimizer) -> - minimizer.addEventListener "click", => @nanoui.minimize() - - handleDrag: => - drag = (event = window.event) => - return unless @dragging - - @xDrag = event.screenX unless @xDrag? - @yDrag = event.screenY unless @yDrag? - - x = (event.screenX - @xDrag) + (window.screenLeft - @xOffset) - y = (event.screenY - @yDrag) + (window.screenTop - @yOffset) - @nanoui.setPos x, y - - @xDrag = event.screenX - @yDrag = event.screenY - - titlebar = document.query "#titlebar" - document.addEventListener "mousemove", drag - titlebar.addEventListener "mousedown", => @dragging = true - document.addEventListener "mouseup", => @dragging = false; delete @xDrag; delete @yDrag - - handleResize: => - resize = (event = window.event) => - return unless @resizing - - @xResize = event.screenX unless @xResize? - @yResize = event.screenY unless @yResize? - - x = Math.max 250, (event.screenX - @xResize) + window.innerWidth - y = Math.max 250, (event.screenY - @yResize) + window.innerHeight - @nanoui.setSize x, y - - @xResize = event.screenX - @yResize = event.screenY - - handle = document.query "#resize" - document.addEventListener "mousemove", resize - handle.addEventListener "mousedown", => @resizing = true - document.addEventListener "mouseup", => @resizing = false; delete @xResize; delete @yResize diff --git a/nano/scripts/constants.coffee b/nano/scripts/constants.coffee deleted file mode 100644 index 825a336af65..00000000000 --- a/nano/scripts/constants.coffee +++ /dev/null @@ -1,5 +0,0 @@ -@NANO = - INTERACTIVE: 2 - UPDATE: 1 - DISABLED: 0 - CLOSE: -1 diff --git a/nano/scripts/helpers.coffee b/nano/scripts/helpers.coffee deleted file mode 100644 index 77b20403406..00000000000 --- a/nano/scripts/helpers.coffee +++ /dev/null @@ -1,43 +0,0 @@ -@helpers = - link: (text = "", icon = "", action = "", params = {}, status = "", klass = "") -> - params = JSON.stringify params - - if !!icon - icon = "" - klass += " iconed" - - if !!status - "#{icon}#{text}" - else - "#{icon}#{text}" - - bar: (value = 0, min = 0, max = 100, klass = "", text = "") -> - if min < max - if value < min - value = min - else if value > max - value = max - else - if value > min - value = min - else if value < max - value = max - - percentage = Math.round((value - min) / (max - min) * 100) - - "
\ - \ - #{text} \ -
" - - round: (number) -> - Math.round number - - fixed: (number, decimals = 1) -> - Number Math.round(number + "e" + decimals) + "e-" + decimals - - floor: (number) -> - Math.floor number - - ceil: (number) -> - Math.ceil number diff --git a/nano/scripts/nanoui.coffee b/nano/scripts/nanoui.coffee deleted file mode 100644 index c6692897bf5..00000000000 --- a/nano/scripts/nanoui.coffee +++ /dev/null @@ -1,87 +0,0 @@ -class NanoUI - constructor: -> - @laidout = false - - @dragging = false - @resizing = false - - try - data = document.query "meta[name='data']" - @data = JSON.parse data.getAttribute "content" - catch error - @error error - if not (@data? and "data" of @data and "config" of @data) - @error "Initial data did not load correctly." - - @render @data - @chrome = new Chrome this, @data - - @initialized.dispatch @data - @incoming.add @update - initialized: new MiniSignal - incoming: new MiniSignal - - update: (dataString) => - try - data = JSON.parse dataString - - if not data.data? - if @data.data? - data.data = @data.data - else - data.data = {} - - @data = data - catch error - @error error - @render @data - @updated.dispatch @data - updated: new MiniSignal - - render: (data) => - try - if not @laidout - @laidout = true - document.query("body").classList.add data.config.layout - layout = TMPL[data.config.templates.layout](data.data, data.config, helpers) - document.query("#layout").innerHTML = layout - - content = TMPL[data.config.templates.content](data.data, data.config, helpers) - document.query("#content").innerHTML = content - - @rendered.dispatch @data - catch error - @error error - rendered: new MiniSignal - - - href: (params = {}, url = "") -> - "byond://#{url}?" + Object.keys(params).map (key) -> - "#{encodeURIComponent(key)}=#{encodeURIComponent(params[key])}" - .join("&") - - act: (action, params = {}) => - params.src = @data.config.ref - params.nano = action - location.href = @href params, null - error: (error) -> - location.href = @href {nano_error: error}, null - - winset: (key, value, window) => - window = @data.config.window unless window? - location.href = @href {"#{window}.#{key}": value}, "winset" - setPos: (x, y) => - @winset "pos", "#{x},#{y}" - setSize: (w, h) => - @winset "size", "#{w},#{h}" - focusMap: => - @winset "focus", 1, "mapwindow.map" - - close: => - @winset "is-visible", "false" - location.href = @href {command: "nanoclose #{@data.config.ref}"}, "winset" - minimize: => - @winset "is-minimized", "true" - - -@nanoui = new NanoUI diff --git a/nano/styles/_bar.less b/nano/styles/_bar.less deleted file mode 100644 index 6da5019d3b5..00000000000 --- a/nano/styles/_bar.less +++ /dev/null @@ -1,40 +0,0 @@ -@import "_config"; -@import "_util"; - - -.bar { - display: inline-block; - position: relative; - top: 4px; // Because this is an empty div, hack it so that it lines up. - vertical-align: top; - box-sizing: border-box; - width: 100%; - height: 20px; // Buttons are 22px, but look 20px because of their dark borders. - margin: 1px; - padding: 1px; - - border: 1px solid @normal; - - background: @dark; - - .barText { - position: absolute; - top: 1px; - right: 3px; - - .fontReset; - } - - .barFill { - display: block; - height: 100%; - - overflow: hidden; - - background: @normal; - &.good { background: @good; } - &.average { background: @average; } - &.bad { background: @bad; } - &.highlight { background: @highlight; } - } -} diff --git a/nano/styles/_chrome.less b/nano/styles/_chrome.less deleted file mode 100644 index 750b5adb51e..00000000000 --- a/nano/styles/_chrome.less +++ /dev/null @@ -1,86 +0,0 @@ -@import "_config"; -@import "_util"; - - -div.loading { - .noticeStripes; - - padding: 8px; -} - -div.content { - margin: 32px 4px 0 4px; - &.titlebared { - padding-top: 3px; - } -} - -header.titlebar { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 32px; - - background-color: @titlebar; - box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1); - - .statusicon { - position: absolute; - top: 4px; - left: 12px; - } - - .title { - position: absolute; - top: 6px; - left: 46px; - - color: @title; - font-size: 16px; - white-space: nowrap; - } - - .titlebutton() { - display: inline-block; - position: relative; - padding: 7px; // To make a bigger clickable area. - margin: -7px; - - color: @title; - - &:hover { - color: lighten(@title, @hover); - } - } - .minimize { - .titlebutton; - position: absolute; - top: 6px; - right: 46px; - } - .close { - .titlebutton; - position: absolute; - top: 4px; - right: 12px; - } -} - -div.resize { - position: fixed; - bottom: 0; - right: 0; - width: 0; - height: 0; - - border-style: solid; - border-width: 0 0 30px 30px; - border-color: transparent transparent @resize transparent; - - transform: rotate(360deg); -} - -.fancy { - .hidden; -} diff --git a/nano/styles/_config.less b/nano/styles/_config.less deleted file mode 100644 index da58aa148e7..00000000000 --- a/nano/styles/_config.less +++ /dev/null @@ -1,35 +0,0 @@ -// Fonts -@font: Verdana, Geneva, sans-serif; -@fontsize: 12px; - -// Global Colors -@normal: #40628a; -@good: #537d29; -@average: #be6209; -@bad: #b00e0e; -@highlight: #8ba5c4; -@info: #e9C183; -@label: @highlight; -@dark: #272727; - -// Body Colors -@title: #98b0c3; -@text: white; -@textinverse: black; -@titlebar: #363636; -@background-start: #2a2a2a; -@background-end: #202020; -@resize: #363636; - -// Component Colors -@border: @dark; -@rule: @normal; -@notice1: #bb9b68; -@notice2: #b1905d; - -// Link Colors -@hover: 10%; -@selected: #2f943c; -@caution: #9a9d00; -@danger: #9d0808; -@disabled: #999999; diff --git a/nano/styles/_document.less b/nano/styles/_document.less deleted file mode 100644 index 7bd1ca078ed..00000000000 --- a/nano/styles/_document.less +++ /dev/null @@ -1,41 +0,0 @@ -@import "_config"; -@import "_util"; - - -html { - min-height: 100%; - margin: 0; - - cursor: default; // Reset the cursor. -} - -body { - min-height: 100%; - height: 100%; - margin: 0; - - background-color: @background-end; // Fallback for old browsers. - - font-family: @font; - font-size: @fontsize; - color: @text; -} - -h1 { - font-size: @fontsize + 6px; - margin: 0; - padding: 6px 0; -} -h2 { - &:extend(h1); - font-size: @fontsize + 4px; -} -h3 { - &:extend(h1); - font-size: @fontsize + 2px; -} - -hr { - background-color: @rule; - border: none; -} diff --git a/nano/styles/_generic.less b/nano/styles/_generic.less deleted file mode 100644 index ffdc3cd4ff9..00000000000 --- a/nano/styles/_generic.less +++ /dev/null @@ -1,8 +0,0 @@ -@import "_config"; - - -body.generic { - background: linear-gradient(to bottom, - @background-start 0%, - @background-end 100%); -} diff --git a/nano/styles/_link.less b/nano/styles/_link.less deleted file mode 100644 index e179f3b684a..00000000000 --- a/nano/styles/_link.less +++ /dev/null @@ -1,49 +0,0 @@ -@import "_config"; -@import "_util"; - - -.active(@color) { - background-color: @color; - &:hover { - background-color: lighten(@color, @hover); - } -} - - -// Basic Link (Button) Element -span.link { - display: inline-block; - box-sizing: border-box; - height: 22px; - margin: 1px; - padding: 2px 3px; - white-space: nowrap; - - border: 1px solid @border; - - .fontReset; // Reset font settings. - - // Tweak spacing to fit icons. - .fa { margin-right: 3px; } - .iconed { padding-left: 3px; } - - // Link colors: - background-color: @normal; - &.active { - .active(@normal); - &.selected { .active(@selected); } - &.caution { .active(@caution); } - &.danger { .active(@danger); } - } - &.inactive { - background-color: @disabled; - &.selected { background-color: @selected; } - &.caution { background-color: @caution; } - &.danger { background-color: @danger; } - } - &.disabled { background-color: @disabled; } - - &.gridable { - width: 125px; - } -} diff --git a/nano/styles/_nanotrasen.less b/nano/styles/_nanotrasen.less deleted file mode 100644 index b9b0fb94489..00000000000 --- a/nano/styles/_nanotrasen.less +++ /dev/null @@ -1,9 +0,0 @@ -@import "_config"; - - -body.nanotrasen { - background: data-uri('nanotrasen.svg') no-repeat fixed center/70% 70%, - linear-gradient(to bottom, - @background-start 0%, - @background-end 100%); -} diff --git a/nano/styles/_section.less b/nano/styles/_section.less deleted file mode 100644 index b36eae5ec9e..00000000000 --- a/nano/styles/_section.less +++ /dev/null @@ -1,94 +0,0 @@ -@import "_config"; -@import "_util"; - - -article.display { - display: flex; - flex-flow: column nowrap; - width: auto; - padding: 4px; - margin: 6px 2px; - - background-color: rgba(0, 0, 0, 0.33); // Transparent background. - box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5); - - header { - padding-left: 4px; - margin-bottom: 6px; - - border-bottom: 2px solid @rule; - } - - section { - width: 100%; - padding: 3px 0; - } - - .cell() { - display: inline-block; - margin: 0; - } - - .label { - .cell; - width: 33%; - - color: @label; - } - - .content { - .cell; - width: 66%; - } - - .line { - .cell; - width: 100%; - } - - .buttoninfo { - margin-left: 5px; - } - - table { - width: auto; - - border-collapse: collapse; - } - - table.grow { - width: 100%; - } - - th { - vertical-align: top; - padding: 4px 16px 4px 0; - text-align: left; - - .fontReset; - color: @label; - } - - td { - &:extend(th); - padding: 2px 2px 0 0; - vertical-align: top; - } -} - -article.notice { - &:extend(article.display all); - margin: 8px 2px; - - box-shadow: none; - - color: @textinverse; - font-weight: bold; - font-style: italic; - - .label { - color: @textinverse; - } - - .noticeStripes; -} diff --git a/nano/styles/_util.less b/nano/styles/_util.less deleted file mode 100644 index 82c988ba6ad..00000000000 --- a/nano/styles/_util.less +++ /dev/null @@ -1,57 +0,0 @@ -@import "_config"; - - -// Colors -.color(@color) { // Explort a given color as a class. - &.@{color} { - color: @@color; - } -} - -.color(normal); -.color(good); -.color(average); -.color(bad); -.color(label); -.color(highlight); -.color(dark); - -// Text Styles -.bold { font-weight: bold; } -.italic { font-style: italic; } -.fontReset() { - color: @text; - font-size: @fontsize; - font-weight: normal; - font-style: normal; - text-decoration: none; -} - -// Fancy "Notice Me" Stripes -.noticeStripes() { - background-color: @notice1; // Fallback for old browers. - background-image: repeating-linear-gradient( - -45deg, - @notice1, - @notice1 10px, - @notice2 10px, - @notice2 20px - ); -} - -// General Helpers -.hidden { display: none !important; } - -.clearBoth { clear: both; } -.clearLeft { clear: left; } -.clearRight { clear: right; } - -.floatNone { float: none; } -.floatLeft { float: left; } -.floatRight { float: right; } - -.alignTop { vertical-align: top; } -.alignBottom { vertical-align: bottom; } -.alignLeft { text-align: left; } -.alignCenter { text-align: center; } -.alignRight { text-align: right; } diff --git a/nano/styles/nanoui.less b/nano/styles/nanoui.less deleted file mode 100644 index f28043bb223..00000000000 --- a/nano/styles/nanoui.less +++ /dev/null @@ -1,14 +0,0 @@ -@charset "utf-8"; - -@import "_config"; - -@import "_document"; -@import "_util"; - -@import "_chrome"; -@import "_section"; -@import "_link"; -@import "_bar"; - -@import "_generic"; -@import "_nanotrasen"; diff --git a/nano/templates/_generic.dot b/nano/templates/_generic.dot deleted file mode 100644 index 698191ae91c..00000000000 --- a/nano/templates/_generic.dot +++ /dev/null @@ -1,14 +0,0 @@ -
-
- - {{=config.title}} - - -
- -
-
Initiating...
-
- -
-
diff --git a/nano/templates/_nanotrasen.dot b/nano/templates/_nanotrasen.dot deleted file mode 100644 index c41921a7824..00000000000 --- a/nano/templates/_nanotrasen.dot +++ /dev/null @@ -1,14 +0,0 @@ -
-
- - {{=config.title}} - - -
- -
-
Initiating...
-
- -
-
diff --git a/nano/templates/air_alarm.dot b/nano/templates/air_alarm.dot deleted file mode 100644 index 364767cbfc9..00000000000 --- a/nano/templates/air_alarm.dot +++ /dev/null @@ -1,233 +0,0 @@ -
- {{? data.siliconUser}} -
- Interface Lock: -
- {{=helper.link('Engaged', 'lock', 'toggleaccess', null, data.locked ? 'selected' : null)}} - {{=helper.link('Disengaged', 'unlock', 'toggleaccess', null, data.locked ? null : 'selected')}} -
-
- {{??}} - {{? data.locked}} - Swipe an ID card to unlock this interface. - {{??}} - Swipe an ID card to lock this interface. - {{?}} - {{?}} -
-
-

Air Status

- {{? data.environment_data}} - {{~ data.environment_data:info:i}} -
- {{=info.name}}: -
- {{? info.danger_level == 2}} - - {{?? info.danger_level == 1}} - - {{??}} - - {{?}} - {{=helper.fixed(info.value, 2)}}{{=info.unit}} -
-
- {{~}} -
- Local Status: -
- {{? data.danger_level == 2}} - Danger (Internals Required) - {{?? data.danger_level == 1}} - Caution - {{??}} - Optimal - {{?}} -
-
-
- Area Status: -
- {{? data.atmos_alarm}} - Atmosphere Alarm - {{?? data.fire_alarm}} - Fire Alarm - {{??}} - Nominal - {{?}} -
-
- {{??}} -
- Warning: Cannot obtain air sample for analysis. -
- {{?}} - {{? data.emagged}} -
-
- Warning: Safety measures offline. Device may exhibit abnormal behavior. -
- {{?}} -
-{{? (!data.locked || data.siliconUser)}} - {{? data.screen != 1}} - {{=helper.link('Back', 'arrow-left', 'screen', {'screen': 1})}} - {{?}} - {{? data.screen == 1}} -
-

Air Controls

-
- {{? !data.atmos_alarm}} - {{=helper.link('Area Atmospheric Alarm', 'hand-stop-o', 'alarm')}} - {{??}} - {{=helper.link('Area Atmospheric Alarm', 'close', 'reset', null, null, 'caution')}} - {{?}} -
-
- {{? data.mode != 3}} - {{=helper.link('Panic Siphon', 'exclamation', 'mode', {'mode': 3})}} - {{??}} - {{=helper.link('Panic Siphon', 'close', 'mode', {'mode': 1}, null, 'danger')}} - {{?}} -
-
- {{=helper.link('Vent Controls', 'sign-out', 'screen', {'screen': 2})}} -
-
- {{=helper.link('Scrubber Controls', 'filter', 'screen', {'screen': 3})}} -
-
- {{=helper.link('Set Environmental Mode', 'cog', 'screen', {'screen': 4})}} -
-
- {{=helper.link('Set Alarm Threshold', 'bar-chart', 'screen', {'screen': 5})}} -
-
- {{?? data.screen == 2}} - {{~ data.vents:vent:i}} -
-

{{=vent.long_name}}

-
- Power: -
- {{? vent.power}} - {{=helper.link('On', 'power-off', 'adjust', {'id_tag': vent.id_tag, 'command': 'power', 'val': 0}, null, null)}} - {{??}} - {{=helper.link('Off', 'close', 'adjust', {'id_tag': vent.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}} - {{?}} -
-
-
- Mode: -
- {{? vent.direction == "release"}} - Pressurizing - {{??}} - Siphoning - {{?}} -
-
-
- Pressure Checks: -
- {{=helper.link('Internal', 'sign-in', 'adjust', {'id_tag': vent.id_tag, 'command': 'incheck', 'val': vent.checks}, null, vent.incheck ? 'selected' : null)}} - {{=helper.link('External', 'sign-out', 'adjust', {'id_tag': vent.id_tag, 'command': 'excheck', 'val': vent.checks}, null, vent.excheck ? 'selected' : null)}} -
-
-
- Set Pressure: -
- {{=helper.link(helper.fixed(vent.external), 'pencil', 'adjust', {'id_tag': vent.id_tag, 'command': 'set_external_pressure'})}} - {{=helper.link('Reset', 'refresh', 'adjust', {'id_tag': vent.id_tag, 'command': 'reset_external_pressure'}, vent.extdefault ? 'disabled' : null)}} -
-
-
- {{~}} - {{? !data.vents.length}} - No vents connected. - {{?}} - {{?? data.screen == 3}} - {{~ data.scrubbers:scrubber:i}} -
-

{{=scrubber.long_name}}

-
- Power: -
- {{? scrubber.power}} - {{=helper.link('On', 'power-off', 'adjust', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 0}, null, null)}} - {{??}} - {{=helper.link('Off', 'close', 'adjust', {'id_tag': scrubber.id_tag, 'command': 'power', 'val': 1}, null, 'danger')}} - {{?}} -
-
-
- Mode: -
- {{? scrubber.scrubbing}} - {{=helper.link('Scrubbing', 'filter', 'adjust', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 0}, null, null)}} - {{??}} - {{=helper.link('Siphoning', 'sign-in', 'adjust', {'id_tag': scrubber.id_tag, 'command': 'scrubbing', 'val': 1}, null, 'danger')}} - {{?}} -
-
-
- Range: -
- {{? scrubber.widenet}} - {{=helper.link('Extended', 'expand', 'adjust', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 0}, null, 'caution')}} - {{??}} - {{=helper.link('Normal', 'compress', 'adjust', {'id_tag': scrubber.id_tag, 'command': 'widenet', 'val': 1}, null, null)}} - {{?}} -
-
-
- Filters: -
- {{=helper.link("CO2", scrubber.filter_co2 ? 'check-square-o' : 'square-o', 'adjust', {'id_tag': scrubber.id_tag, 'command': "co2_scrub", 'val': scrubber.filter_co2 ? 0 : 1}, null, scrubber.filter_co2 ? 'selected' : null)}} - {{=helper.link("N2O", scrubber.filter_n2o ? 'check-square-o' : 'square-o', 'adjust', {'id_tag': scrubber.id_tag, 'command': "n2o_scrub", 'val': scrubber.filter_n2o ? 0 : 1}, null, scrubber.filter_n2o ? 'selected' : null)}} - {{=helper.link("Plasma", scrubber.filter_toxins ? 'check-square-o' : 'square-o', 'adjust', {'id_tag': scrubber.id_tag, 'command': "tox_scrub", 'val': scrubber.filter_toxins ? 0 : 1}, null, scrubber.filter_toxins ? 'selected' : null)}} -
-
-
- {{~}} - {{? !data.scrubbers.length}} - No scrubbers connected. - {{?}} - {{?? data.screen == 4}} -
-

Environmental Modes

- {{~ data.modes:mode:i}} -
- {{=helper.link(mode.name, mode.selected ? 'check-square-o' : 'square-o', 'mode', {'mode': mode.mode}, null, mode.selected ? (mode.danger ? 'danger' : 'selected') : null)}} -
- {{~}} -
- {{?? data.screen == 5}} -
-

Alarm Thresholds

- - - - - - - - - - - - {{~ data.thresholds:threshold:i}} - - - {{~ threshold.settings:setting:j}} - - {{~}} - - {{~}} - -
min2min1max1max2
{{=threshold.name}} - {{=helper.link(setting.selected >= 0 ? helper.round(setting.selected*100)/100 : "Off", null, 'adjust', {'command': 'set_threshold', 'env': setting.env, 'var': setting.val})}} -
- - {{?}} -{{?}} diff --git a/nano/templates/airlock_electronics.dot b/nano/templates/airlock_electronics.dot deleted file mode 100644 index 5edfb225e5b..00000000000 --- a/nano/templates/airlock_electronics.dot +++ /dev/null @@ -1,33 +0,0 @@ -
-
- {{? data.oneAccess}} - {{=helper.link('One Required', 'unlock', 'one_access')}} - {{??}} - {{=helper.link('All Required', 'lock', 'one_access')}} - {{?}} - {{=helper.link('Clear', 'refresh', 'clear')}} -
-
- - - {{~ data.regions :region:i}} - - {{~}} - - - - - {{~ data.regions :region:i}} - - {{~}} - - -
- {{=region.name}} -
- {{~ region.accesses :access:j}} - {{=helper.link(access.name, access.req ? 'check-square-o' : 'square-o', 'set', {'access': access.id}, null, access.req ? 'selected' : null)}} -
- {{~}} -
-
diff --git a/nano/templates/apc.dot b/nano/templates/apc.dot deleted file mode 100644 index 3c0d59e702a..00000000000 --- a/nano/templates/apc.dot +++ /dev/null @@ -1,157 +0,0 @@ -
- {{? data.siliconUser}} -
- Interface Lock: -
- {{=helper.link('Engaged', 'lock', 'toggleaccess', null, data.locked ? 'selected' : null)}} - {{=helper.link('Disengaged', 'unlock', 'toggleaccess', null, data.malfStatus >= 2 ? 'linkOff' : (data.locked ? null : 'selected'))}} -
-
- {{??}} - {{? data.locked}} - Swipe an ID card to unlock this interface. - {{??}} - Swipe an ID card to lock this interface. - {{?}} - {{?}} -
-
-

Power Status

-
- Main Breaker: -
- {{? data.locked && !data.siliconUser}} - {{? data.isOperating}} - On - {{??}} - Off - {{?}} - {{??}} - {{=helper.link('On', 'power-off', 'breaker', null, data.isOperating ? 'selected' : null)}} - {{=helper.link('Off', 'close', 'breaker', null, data.isOperating ? null : 'selected')}} - {{?}} -
-
-
- External Power: -
- {{? data.externalPower == 2}} - Good - {{?? data.externalPower == 1}} - Low - {{??}} - None - {{?}} -
-
-
- Power Cell: -
- {{? data.powerCellStatus != null}} - {{=helper.bar(data.powerCellStatus, 0, 100, data.powerCellStatus >= 50 ? "good" : data.powerCellStatus >= 25 ? "average" : "bad", helper.fixed(data.powerCellStatus) + "%")}} - {{??}} - Power cell removed. - {{?}} -
-
- {{? data.powerCellStatus != null}} -
- Charge Mode: -
- {{? data.locked && !data.siliconUser}} - {{? data.chargeMode}} - Auto - {{??}} - Off - {{?}} - {{??}} - {{=helper.link('Auto', 'refresh', 'chargemode', null, data.chargeMode ? 'selected' : null)}} - {{=helper.link('Off', 'close', 'chargemode', null, data.chargeMode ? null : 'selected')}} - {{?}} -   - {{? data.chargingStatus > 1}} - [Fully Charged] - {{?? data.chargingStatus == 1}} - [Charging] - {{??}} - [Not Charging] - {{?}} -
-
- {{?}} -
-
-

Power Channels

- - {{~ data.powerChannels :channel:i}} - - - - - - - - {{~}} - - - - - - - -
{{=channel.title}}:{{=channel.powerLoad}} W - {{? channel.status <= 1}} - Off - {{?? channel.status >= 2}} - On - {{?}} - - {{? channel.status == 1 || channel.status == 3}} - [Auto] - {{??}} - [Manual] - {{?}} - - {{? !data.locked || data.siliconUser}} - {{=helper.link('Auto', 'refresh', 'channel', channel.topicParams.auto, (channel.status == 1 || channel.status == 3) ? 'selected' : null)}} - {{=helper.link('On', 'power-off', 'channel', channel.topicParams.on, (channel.status == 2) ? 'selected' : null)}} - {{=helper.link('Off', 'close', 'channel', channel.topicParams.off, (channel.status == 0) ? 'selected' : null)}} - {{?}} -
Total Load:{{=data.totalLoad}} W
-
-{{? data.siliconUser}} -
-

System Overrides

-
- {{=helper.link('Overload Lighting Circuit', 'lightbulb-o', 'overload')}} -
-
- {{? data.malfStatus == 1}} - {{=helper.link('Override Programming', 'terminal', 'hack')}} - {{?? data.malfStatus == 2}} - {{=helper.link('Shunt Core Processes', 'caret-square-o-down', 'occupy')}} - {{?? data.malfStatus == 3}} - {{=helper.link('Return to Main Core', 'carat-square-o-left', 'deoccupy')}} - {{?? data.malfStatus == 4}} - {{=helper.link('Shunt Core Processes', 'caret-square-o-down')}} - {{?}} -
-
-{{?}} -
-
- Cover Lock: -
- {{? data.locked && !data.siliconUser}} - {{? data.coverLocked}} - Engaged - {{??}} - Disengaged - {{?}} - {{??}} - {{=helper.link('Engaged', 'lock', 'lock', null, data.coverLocked ? 'selected' : null)}} - {{=helper.link('Disengaged', 'unlock', 'lock', null, data.coverLocked ? null : 'selected')}} - {{?}} -
-
-
diff --git a/nano/templates/atmos_filter.dot b/nano/templates/atmos_filter.dot deleted file mode 100644 index bb8457fecc3..00000000000 --- a/nano/templates/atmos_filter.dot +++ /dev/null @@ -1,27 +0,0 @@ -
-
- Power: -
- {{=helper.link(data.on? 'On' : 'Off', data.on ? 'power-off' : 'close', 'power')}} -
-
-
- Output Pressure: -
- {{=helper.link('Set', 'pencil', 'pressure', {'set': 'custom'})}} - {{=helper.link('Max', 'plus', 'pressure', {'set': 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{=data.set_pressure}} kPa -
-
-
- Filter: -
- {{=helper.link('Nothing', null, 'filter', {'mode': -1}, data.filter_type == -1 ? 'selected' : null)}} - {{=helper.link('Plasma', null, 'filter', {'mode': 0}, data.filter_type == 0 ? 'selected' : null)}} - {{=helper.link('O2', null, 'filter', {'mode': 1}, data.filter_type == 1 ? 'selected' : null)}} - {{=helper.link('N2', null, 'filter', {'mode': 2}, data.filter_type == 2 ? 'selected' : null)}} - {{=helper.link('CO2', null, 'filter', {'mode': 3}, data.filter_type == 3 ? 'selected' : null)}} - {{=helper.link('N2O', null, 'filter', {'mode': 4}, data.filter_type == 4 ? 'selected' : null)}} -
-
-
diff --git a/nano/templates/atmos_mixer.dot b/nano/templates/atmos_mixer.dot deleted file mode 100644 index 3b95b934c6e..00000000000 --- a/nano/templates/atmos_mixer.dot +++ /dev/null @@ -1,36 +0,0 @@ -
-
- Power: -
- {{=helper.link(data.on? 'On' : 'Off', data.on? 'power-off' : 'close', 'power')}} -
-
-
- Output Pressure: -
- {{=helper.link('Set', 'pencil', 'pressure', {'set': 'custom'})}} - {{=helper.link('Max', 'plus', 'pressure', {'set': 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{=data.set_pressure}} kPa -
-
-
- Node 1: -
- {{=helper.link('', 'fast-backward', 'node1', {'concentration' : '-0.1'}, null)}} - {{=helper.link('', 'backward', 'node1', {'concentration' : '-0.01'}, null)}} - {{=helper.link('', 'forward', 'node1', {'concentration' : '0.01'}, null)}} - {{=helper.link('', 'fast-forward', 'node1', {'concentration' : '0.1'}, null)}} - {{=data.node1_concentration}}% -
-
-
- Node 2: -
- {{=helper.link('', 'fast-backward', 'node2', {'concentration' : '-0.1'}, null)}} - {{=helper.link('', 'backward', 'node2', {'concentration' : '-0.01'}, null)}} - {{=helper.link('', 'forward', 'node2', {'concentration' : '0.01'}, null)}} - {{=helper.link('', 'fast-forward', 'node2', {'concentration' : '0.1'}, null)}} - {{=data.node2_concentration}}% -
-
-
diff --git a/nano/templates/atmos_pump.dot b/nano/templates/atmos_pump.dot deleted file mode 100644 index 70f1c48aa49..00000000000 --- a/nano/templates/atmos_pump.dot +++ /dev/null @@ -1,27 +0,0 @@ -
-
- Power: -
- {{=helper.link(data.on? 'On' : 'Off', data.on? 'power-off' : 'close', 'power')}} -
-
- {{? data.max_rate}} -
- Transfer Rate: -
- {{=helper.link('Set', 'pencil', 'transfer', {'set': 'custom'})}} - {{=helper.link('Max', 'plus', 'transfer', {'set' : 'max'}, data.transfer_rate == data.max_rate ? 'disabled' : null)}} - {{=data.transfer_rate}} L/s -
-
- {{??}} -
- Output Pressure: -
- {{=helper.link('Set', 'pencil', 'pressure', {'set': 'custom'})}} - {{=helper.link('Max', 'plus', 'pressure', {'set' : 'max'}, data.set_pressure == data.max_pressure ? 'disabled' : null)}} - {{=data.set_pressure}} kPa -
-
- {{?}} -
diff --git a/nano/templates/canister.dot b/nano/templates/canister.dot deleted file mode 100644 index 20cad52be96..00000000000 --- a/nano/templates/canister.dot +++ /dev/null @@ -1,80 +0,0 @@ -
- {{? data.hasHoldingTank }} - The regulator is connected to a tank. - {{??}} - The regulator is not connected to a tank. - {{?}} -
-
-

Canister

-
- {{=helper.link('Relabel', 'pencil', 'relabel', null, data.canLabel ? null : 'disabled')}} -
-
- Pressure: -
- {{=data.tankPressure}} kPa -
-
-
- - Port: - -
- {{? data.portConnected}} - Connected - {{??}} - Disconnected - {{?}} -
-
-
-
-

Valve

-
- Release Pressure: -
- {{=helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure, null, data.releasePressure + ' kPa')}} -
-
-
-
Pressure Regulator:
-
- {{=helper.link('Reset', 'refresh', 'pressure', {'set': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} - {{=helper.link('Min', 'minus', 'pressure', {'set': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} - {{=helper.link('Set', 'pencil', 'pressure', {'set': 'custom'}, null)}} - {{=helper.link('Max', 'plus', 'pressure', {'set': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}} -
-
-
-
Valve:
-
- {{=helper.link('Open', 'unlock', 'valve', null, data.valveOpen ? 'selected' : null)}} - {{=helper.link('Close', 'lock', 'valve', null, data.valveOpen ? null : 'selected')}} -
-
-
-
-

Holding Tank

- {{? data.hasHoldingTank}} -
- {{=helper.link('Eject', 'eject', 'eject')}} -
-
- Label: -
- {{=data.holdingTank.name}} -
-
-
- Tank Pressure: -
- {{=data.holdingTank.tankPressure}} kPa -
-
- {{??}} -
- No Holding Tank -
- {{?}} -
diff --git a/nano/templates/chem_dispenser.dot b/nano/templates/chem_dispenser.dot deleted file mode 100644 index ea56c34a96d..00000000000 --- a/nano/templates/chem_dispenser.dot +++ /dev/null @@ -1,55 +0,0 @@ -
-

Status

-
- Energy: -
- {{=helper.bar(data.energy, 0, data.maxEnergy, null, data.energy + ' Units')}} -
-
-
- Amount: -
- {{~ data.beakerTransferAmounts :amount:i}} - {{=helper.link(amount, 'plus', 'amount', {'set': amount}, (data.amount == amount) ? 'selected' : null)}} - {{~}} -
-
-
-
-

Dispense

-
- {{~ data.chemicals :chem:i}} - {{=helper.link(chem.title, 'tint', 'dispense', chem.commands, null, 'gridable')}} - {{~}} -
-
-
-

Beaker

-
-
- {{=helper.link('Eject', 'eject', 'eject', null, data.isBeakerLoaded ? null : 'disabled')}} -
-
- {{~ data.beakerTransferAmounts :amount:i}} - {{=helper.link(amount, 'minus', 'remove', {'amount': amount})}} - {{~}} -
-
-
-
Contents:
-
- {{? data.isBeakerLoaded}} - {{? data.beakerContents.length}} - {{=data.beakerCurrentVolume}}/{{=data.beakerMaxVolume}} Units
- {{~ data.beakerContents :reagent:i}} - {{=reagent.volume}} units of {{=reagent.name}}
- {{~}} - {{??}} - Beaker Empty - {{?}} - {{??}} - No Beaker Loaded - {{?}} -
-
-
diff --git a/nano/templates/chem_heater.dot b/nano/templates/chem_heater.dot deleted file mode 100644 index b1bf72b3472..00000000000 --- a/nano/templates/chem_heater.dot +++ /dev/null @@ -1,38 +0,0 @@ -
-

Status

-
- Power: -
- {{=helper.link(data.isActive ? 'On' : 'Off', data.isActive ? 'power-off' : 'close', 'power', null, data.isBeakerLoaded ? null : 'disabled')}} -
-
-
- Target: -
- {{=helper.link(data.targetTemp + 'K', 'pencil', 'temperature')}} -
-
-
-
-

Beaker

-
- {{=helper.link('Eject', 'eject', 'eject', null, data.isBeakerLoaded ? null : 'disabled')}} -
-
- Contents: -
- {{? data.isBeakerLoaded}} - Temperature: {{=data.currentTemp}}K
- {{? data.beakerContents.length}} - {{~ data.beakerContents :reagent:i}} - {{=reagent.volume}} units of {{=reagent.name}}
- {{~}} - {{??}} - Beaker Empty - {{?}} - {{??}} - No Beaker Loaded - {{?}} -
-
- diff --git a/nano/templates/cryo.dot b/nano/templates/cryo.dot deleted file mode 100644 index dd182abce5c..00000000000 --- a/nano/templates/cryo.dot +++ /dev/null @@ -1,121 +0,0 @@ -
-

Occupant

-
- Occupant: -
- {{? data.hasOccupant}} - {{=data.occupant.name}} - {{??}} - No Occupant - {{?}} -
-
- {{? data.hasOccupant}} -
- State: -
- {{? data.occupant.stat == 0}} - Conscious - {{?? data.occupant.stat == 1}} - Unconscious - {{??}} - Dead - {{?}} -
-
-
- Temperature: -
- {{=helper.round(data.occupant.bodyTemperature)}} K -
-
- {{?}} - {{? data.hasOccupant && data.occupant.stat < 2}} -
- Health: -
- {{=helper.bar(data.occupant.health, data.occupant.minHealth, data.occupant.Maxhealth, data.occupant.health >= 0 ? 'good' : 'average', helper.round(data.occupant.health))}} -
-
-
- Brute: -
- {{=helper.bar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.bruteLoss))}} -
-
-
- Respiratory: -
- {{=helper.bar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.oxyLoss))}} -
-
-
- Toxin: -
- {{=helper.bar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.toxLoss))}} -
-
-
- Burn: -
- {{=helper.bar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad', helper.round(data.occupant.fireLoss))}} -
-
- {{?}} -
-
-

Cell

-
- Power: -
- {{? data.isOperating}} - {{=helper.link('On', 'power-off', 'off')}} - {{??}} - {{=helper.link('Off', 'close', 'on')}} - {{?}} -
-
-
- Temperature: -
- {{=data.cellTemperature}} K -
-
-
- Door: -
- {{? data.isOpen}} - {{=helper.link('Open', 'unlock', 'close')}} - {{??}} - {{=helper.link('Closed', 'lock', 'open')}} - {{?}} - {{? data.autoEject}} - {{=helper.link('Auto', 'sign-out', 'autoeject')}} - {{??}} - {{=helper.link('Manual', 'sign-in', 'autoeject')}} - {{?}} -
-
-
-
-

Beaker

-
- {{=helper.link('Eject', 'eject', 'ejectbeaker', null, data.isBeakerLoaded ? null : 'disabled')}} -
-
- Contents: -
- {{? data.isBeakerLoaded}} - {{? data.beakerContents.length}} - {{~ data.beakerContents :reagent:i}} - {{=reagent.volume}} units of {{=reagent.name}}
- {{~}} - {{??}} - Beaker Empty - {{?}} - {{??}} - No Beaker Loaded - {{?}} -
-
- diff --git a/nano/templates/smes.dot b/nano/templates/smes.dot deleted file mode 100644 index ddcc232f4ed..00000000000 --- a/nano/templates/smes.dot +++ /dev/null @@ -1,89 +0,0 @@ -
-

Storage

-
- Stored Energy: -
- {{=helper.bar(data.capacityPercent, 0, 100, data.capacityPercent >= 50 ? 'good' : data.capacityPercent >= 15 ? 'average' : 'bad', helper.round(data.capacityPercent) + '%')}} -
-
-
-
-

Input

-
- Charge Mode: -
- {{=helper.link('Auto', 'refresh', 'tryinput', null, data.inputAttempt ? 'selected' : null)}} - {{=helper.link('Off', 'close', 'tryinput', null, data.inputAttempt ? null : 'selected')}} -   - {{? data.capacityPercent >= 99}} - [Fully Charged] - {{?? data.inputting}} - [Charging] - {{??}} - [Not Charging] - {{?}} -
-
-
- Input Setting: -
- {{=helper.bar(data.inputLevel, 0, data.inputLevelMax, null, data.inputLevel + ' W')}} -
-
-
- Adjust Input: -
- {{=helper.link('', 'fast-backward', 'input', {'set': 'min'}, data.inputLevel ? null : 'selected')}} - {{=helper.link('', 'backward', 'input', {'set': 'minus'}, data.inputLevel ? null : 'disabled')}} - {{=helper.link('Set', 'pencil', 'input', {'set': 'custom'}, null)}} - {{=helper.link('', 'forward', 'input', {'set': 'plus'}, data.inputLevel == data.inputLevelMax ? 'disabled' : null)}} - {{=helper.link('', 'fast-forward', 'input', {'set': 'max'}, data.inputLevel == data.inputLevelMax ? 'selected' : null)}} -
-
-
- Available: -
- {{=data.inputAvailable}} W -
-
-
-
-

Output

-
- Charge Mode: -
- {{=helper.link('On', 'power-off', 'tryoutput', null, data.outputAttempt ? 'selected' : null)}} - {{=helper.link('Off', 'close', 'tryoutput', null, data.outputAttempt ? null : 'selected')}} -   - {{? data.outputting}} - [Sending] - {{?? data.charge > 0}} - [Not Sending] - {{??}} - [No Charge] - {{?}} -
-
-
- Output Setting: -
- {{=helper.bar(data.outputLevel, 0, data.outputLevelMax, null, data.outputLevel + ' W')}} -
-
-
- Adjust Output: -
- {{=helper.link('', 'fast-backward', 'output', {'set': 'min'}, data.outputLevel ? null : 'selected')}} - {{=helper.link('', 'backward', 'output', {'set': 'minus'}, data.outputLevel ? null : 'disabled')}} - {{=helper.link('Set', 'pencil', 'output', {'set': 'custom'}, null)}} - {{=helper.link('', 'forward', 'output', {'set': 'plus'}, data.outputLevel == data.outputLevelMax ? 'disabled' : null)}} - {{=helper.link('', 'fast-forward', 'output', {'set': 'max'}, data.outputLevel == data.outputLevelMax ? 'selected' : null)}} -
-
-
- Outputting: -
- {{=data.outputUsed}} W -
-
-
diff --git a/nano/templates/solar_control.dot b/nano/templates/solar_control.dot deleted file mode 100644 index 1aab8970560..00000000000 --- a/nano/templates/solar_control.dot +++ /dev/null @@ -1,85 +0,0 @@ -
-

Status

-
- Generated Power: -
- {{=data.generated}} W -
-
-
- Orientation: -
- {{=data.angle}}° ({{=data.direction}}) -
-
-
- Adjust: -
- {{=helper.link('15°', 'step-backward', 'control', {'cdir': '-15'})}} - {{=helper.link('1°', 'backward', 'control', {'cdir': '-1'})}} - {{=helper.link('1°', 'forward', 'control', {'cdir': '1'})}} - {{=helper.link('15°', 'step-forward', 'control', {'cdir': '15'})}} -
-
-
-
-

Tracking

-
- Tracker Mode: -
- {{=helper.link('Off', 'close', 'tracking', {'mode': '0'}, (data.tracking_state == 0) ? 'selected' : '')}} - {{=helper.link('Timed', 'clock-o', 'tracking', {'mode': '1'}, (data.tracking_state == 1) ? 'selected' : '')}} - {{? data.connected_tracker}} - {{=helper.link('Auto', 'refresh', 'tracking', {'mode': '2'}, (data.tracking_state == 2) ? 'selected' : '')}} - {{??}} - {{=helper.link('Auto', 'refresh', null, null, 'disabled')}} - {{?}} -
-
-
- Tracking Rate: -
- {{=data.tracking_rate}} deg/h ({{=data.rotating_way}}) -
-
-
- Adjust: -
- {{=helper.link('180°', 'fast-backward', 'control', {'tdir': '-180'})}} - {{=helper.link('30°', 'step-backward', 'control', {'tdir': '-30'})}} - {{=helper.link('1°', 'backward', 'control', {'tdir': '-1'})}} - {{=helper.link('1°', 'forward', 'control', {'tdir': '1'})}} - {{=helper.link('30°', 'step-forward', 'control', {'tdir': '30'})}} - {{=helper.link('180°', 'fast-forward', 'control', {'tdir': '180'})}} -
-
-
-
-

Devices

-
- Search: -
- {{=helper.link('Refresh', 'refresh', 'refresh')}} -
-
-
- - Solar Tracker: - -
- {{? data.connected_tracker}} - Found - {{??}} - Not Found - {{?}} -
-
-
- - Solars Panels: - -
- {{=data.connected_panels}} Connected -
- -
diff --git a/nano/templates/space_heater.dot b/nano/templates/space_heater.dot deleted file mode 100644 index f4e1fb3005c..00000000000 --- a/nano/templates/space_heater.dot +++ /dev/null @@ -1,79 +0,0 @@ -
-

Status

-
- Power: -
- {{=helper.link('On', 'power-off', 'power', null, data.on ? 'selected' : null)}} - {{=helper.link('Off', 'close', 'power', null, data.on ? null : 'selected')}} -
-
-
- Stored Energy: -
- {{? data.hasPowercell}} - {{=helper.bar(data.powerLevel, 0, 100, 'good', data.powerLevel + '%')}} - {{??}} - No power cell loaded. - {{?}} -
-
- {{? data.open}} -
- Cell: -
- {{? data.hasPowercell}} - {{=helper.link('Eject', 'eject', 'ejectcell')}} - {{??}} - {{=helper.link('Install', 'eject', 'installcell')}} - {{?}} -
-
- {{?}} -
-
-

Thermostat

-
- Current Temp: -
- {{=data.currentTemp}}°C -
-
-
- Target Temp: -
- {{=data.targetTemp}}°C -
-
- {{? data.open}} -
- Adjustment: -
- {{=helper.link('', 'fast-backward', 'temp', {'set': -20}, data.targetTemp > data.minTemp ? null : 'disabled')}} - {{=helper.link('', 'backward', 'temp', {'set': -5}, data.targetTemp > data.minTemp ? null : 'disabled')}} - {{=helper.link('Set', 'pencil', 'temp', {'set': 'custom'}, null)}} - {{=helper.link('', 'forward', 'temp', {'set': 5}, data.targetTemp < data.maxTemp ? null : 'disabled')}} - {{=helper.link('', 'fast-forward', 'temp', {'set': 20}, data.targetTemp < data.maxTemp ? null : 'disabled')}} -
-
- {{?}} -
- - Operational Mode: - -
- {{? data.open}} - {{=helper.link('Heat', 'long-arrow-up', 'mode', {'mode': 'heat'}, data.mode != "heat" ? null : 'selected')}} - {{=helper.link('Cool', 'long-arrow-down', 'mode', {'mode': 'cool'}, data.mode != "cool" ? null : 'selected')}} - {{=helper.link('Auto', 'arrows-v', 'mode', {'mode': 'auto'}, (data.mode == "heat" || data.mode == "cool") ? null : 'selected')}} - {{??}} - {{? data.mode == "heat"}} - Heat - {{?? data.mode == "cool"}} - Cool - {{??}} - Auto - {{?}} - {{?}} -
-
-
diff --git a/nano/templates/tanks.dot b/nano/templates/tanks.dot deleted file mode 100644 index 7bc46a39a4d..00000000000 --- a/nano/templates/tanks.dot +++ /dev/null @@ -1,37 +0,0 @@ -
- {{? data.hasHoldingTank }} - The regulator is connected to a mask. - {{??}} - The regulator is not connected to a mask. - {{?}} -
-
-
- Tank Pressure: -
- {{=helper.bar(data.tankPressure, 0, 1013, (data.tankPressure > 200) ? 'good' : ((data.tankPressure > 100) ? 'average' : 'bad'), data.tankPressure + ' kPa')}} -
- -
- Release Pressure: -
- {{=helper.bar(data.releasePressure, data.minReleasePressure, data.maxReleasePressure, null, data.releasePressure + ' kPa')}} -
-
-
- Pressure Regulator: -
- {{=helper.link('Reset', 'refresh', 'pressure', {'set': 'reset'}, (data.releasePressure != data.defaultReleasePressure) ? null : 'disabled')}} - {{=helper.link('Min', 'minus', 'pressure', {'set': 'min'}, (data.releasePressure > data.minReleasePressure) ? null : 'disabled')}} - {{=helper.link('Set', 'pencil', 'pressure', {'set': 'custom'}, null)}} - {{=helper.link('Max', 'plus', 'pressure', {'set': 'max'}, (data.releasePressure < data.maxReleasePressure) ? null : 'disabled')}} -
-
-
- Valve: -
- {{=helper.link('Open', 'unlock', 'valve', null, data.maskConnected ? (data.valveOpen ? 'selected' : null) : 'disabled')}} - {{=helper.link('Close', 'lock', 'valuve', null, data.valveOpen ? null : 'selected')}} -
-
-
diff --git a/tgstation.dme b/tgstation.dme index 3822e2fec1f..75bdc784e9b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -34,7 +34,6 @@ #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\math.dm" #include "code\__DEFINES\misc.dm" -#include "code\__DEFINES\nano.dm" #include "code\__DEFINES\pipe_construction.dm" #include "code\__DEFINES\preferences.dm" #include "code\__DEFINES\qdel.dm" @@ -44,6 +43,7 @@ #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\tablecrafting.dm" +#include "code\__DEFINES\tgui.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\cmp.dm" @@ -67,6 +67,7 @@ #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" #include "code\__HELPERS\sorts\TimSort.dm" +#include "code\__PATH_COMPATIBILITY\path_compatibility.dm" #include "code\_globalvars\configuration.dm" #include "code\_globalvars\database.dm" #include "code\_globalvars\game_modes.dm" @@ -155,7 +156,6 @@ #include "code\controllers\subsystem\machines.dm" #include "code\controllers\subsystem\minimap.dm" #include "code\controllers\subsystem\mobs.dm" -#include "code\controllers\subsystem\nano.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\objects.dm" #include "code\controllers\subsystem\pai.dm" @@ -163,6 +163,7 @@ #include "code\controllers\subsystem\server_maintenance.dm" #include "code\controllers\subsystem\shuttles.dm" #include "code\controllers\subsystem\sun.dm" +#include "code\controllers\subsystem\tgui.dm" #include "code\controllers\subsystem\ticker.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\voting.dm" @@ -183,6 +184,7 @@ #include "code\datums\modules.dm" #include "code\datums\mutations.dm" #include "code\datums\outfit.dm" +#include "code\datums\progressbar.dm" #include "code\datums\recipe.dm" #include "code\datums\spell.dm" #include "code\datums\supplypacks.dm" @@ -206,6 +208,7 @@ #include "code\datums\diseases\retrovirus.dm" #include "code\datums\diseases\rhumba_beat.dm" #include "code\datums\diseases\transformation.dm" +#include "code\datums\diseases\tuberculosis.dm" #include "code\datums\diseases\wizarditis.dm" #include "code\datums\diseases\advance\advance.dm" #include "code\datums\diseases\advance\presets.dm" @@ -254,6 +257,7 @@ #include "code\datums\spells\ethereal_jaunt.dm" #include "code\datums\spells\explosion.dm" #include "code\datums\spells\genetic.dm" +#include "code\datums\spells\infinite_guns.dm" #include "code\datums\spells\inflict_handler.dm" #include "code\datums\spells\knock.dm" #include "code\datums\spells\lichdom.dm" @@ -316,7 +320,6 @@ #include "code\game\gamemodes\blob\blobs\node.dm" #include "code\game\gamemodes\blob\blobs\resource.dm" #include "code\game\gamemodes\blob\blobs\shield.dm" -#include "code\game\gamemodes\blob\blobs\storage.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling_power.dm" #include "code\game\gamemodes\changeling\evolution_menu.dm" @@ -926,6 +929,7 @@ #include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" #include "code\modules\awaymissions\mission_code\centcomAway.dm" #include "code\modules\awaymissions\mission_code\challenge.dm" +#include "code\modules\awaymissions\mission_code\researchbase.dm" #include "code\modules\awaymissions\mission_code\snowdin.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" @@ -1029,6 +1033,7 @@ #include "code\modules\events\wormholes.dm" #include "code\modules\events\holiday\halloween.dm" #include "code\modules\events\holiday\xmas.dm" +#include "code\modules\events\wizard\advanced_darkness.dm" #include "code\modules\events\wizard\aid.dm" #include "code\modules\events\wizard\blobies.dm" #include "code\modules\events\wizard\curseditems.dm" @@ -1137,6 +1142,9 @@ #include "code\modules\mining\laborcamp\laborminerals.dm" #include "code\modules\mining\laborcamp\laborshuttle.dm" #include "code\modules\mining\laborcamp\laborstacker.dm" +#include "code\modules\mining\lavaland\lavaland_areas.dm" +#include "code\modules\mining\lavaland\weather.dm" +#include "code\modules\mining\lavaland\weather_types.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\interactive.dm" #include "code\modules\mob\inventory.dm" @@ -1333,6 +1341,7 @@ #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" +#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" @@ -1358,21 +1367,6 @@ #include "code\modules\mob\new_player\poll.dm" #include "code\modules\mob\new_player\preferences_setup.dm" #include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\nano\external.dm" -#include "code\modules\nano\nanoui.dm" -#include "code\modules\nano\subsystem.dm" -#include "code\modules\nano\states\admin.dm" -#include "code\modules\nano\states\conscious.dm" -#include "code\modules\nano\states\contained.dm" -#include "code\modules\nano\states\deep_inventory.dm" -#include "code\modules\nano\states\default.dm" -#include "code\modules\nano\states\hands.dm" -#include "code\modules\nano\states\inventory.dm" -#include "code\modules\nano\states\notcontained.dm" -#include "code\modules\nano\states\physical.dm" -#include "code\modules\nano\states\self.dm" -#include "code\modules\nano\states\states.dm" -#include "code\modules\nano\states\zlevel.dm" #include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\admin_ninja_verbs.dm" #include "code\modules\ninja\energy_katana.dm" @@ -1470,6 +1464,7 @@ #include "code\modules\projectiles\guns\grenade_launcher.dm" #include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\medbeam.dm" +#include "code\modules\projectiles\guns\mounted.dm" #include "code\modules\projectiles\guns\projectile.dm" #include "code\modules\projectiles\guns\syringe_gun.dm" #include "code\modules\projectiles\guns\energy\laser.dm" @@ -1560,6 +1555,7 @@ #include "code\modules\research\designs\weapon_designs.dm" #include "code\modules\research\xenobiology\xenobio_camera.dm" #include "code\modules\research\xenobiology\xenobiology.dm" +#include "code\modules\ruins\ruin_areas.dm" #include "code\modules\security levels\keycard authentication.dm" #include "code\modules\security levels\security levels.dm" #include "code\modules\shuttle\shuttle.dm" @@ -1592,7 +1588,26 @@ #include "code\modules\telesci\gps.dm" #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tgui\external.dm" +#include "code\modules\tgui\subsystem.dm" +#include "code\modules\tgui\tgui.dm" +#include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\conscious.dm" +#include "code\modules\tgui\states\contained.dm" +#include "code\modules\tgui\states\deep_inventory.dm" +#include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\notcontained.dm" +#include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\states.dm" +#include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tooltip\tooltip.dm" +#include "code\modules\vehicles\atv.dm" +#include "code\modules\vehicles\pimpin_ride.dm" +#include "code\modules\vehicles\secway.dm" +#include "code\modules\vehicles\vehicle.dm" #include "code\orphaned procs\AStar.dm" #include "code\orphaned procs\dbcore.dm" #include "code\orphaned procs\priority_announce.dm" diff --git a/nano/.gitignore b/tgui/.gitignore similarity index 100% rename from nano/.gitignore rename to tgui/.gitignore diff --git a/nano/Gulpfile.js b/tgui/Gulpfile.js similarity index 53% rename from nano/Gulpfile.js rename to tgui/Gulpfile.js index 203c68bf5c2..d1c580b989f 100644 --- a/nano/Gulpfile.js +++ b/tgui/Gulpfile.js @@ -1,2 +1,2 @@ require('coffee-script/register'); -require('./Gulpfile.coffee'); +require('./gulp'); diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css new file mode 100644 index 00000000000..dea4d8fb09e --- /dev/null +++ b/tgui/assets/tgui.css @@ -0,0 +1 @@ +.normal{color:#40628a}.good{color:#537d29}.average{color:#be6209}.bad{color:#b00e0e}.highlight,.label{color:#8ba5c4}.dark{color:#272727}html{box-sizing:border-box;min-height:100%;margin:0;cursor:default}*,:after,:before{box-sizing:inherit}body{min-height:100%;height:100%;margin:0 6px;background-color:#202020;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff}main{display:block;margin-top:32px;padding-top:3px}hr{height:2px;background-color:#40628a;border:none}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}.bar .barText,span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}.bold{font-weight:700}.italic{font-style:italic}[unselectable]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}.bar .barText{position:absolute;top:0;right:3px}.bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}.bar .barFill.good{background-color:#537d29}.bar .barFill.average{background-color:#be6209}.bar .barFill.bad{background-color:#b00e0e}.bar .barFill.highlight{background-color:#8ba5c4}span.button{display:inline-block;vertical-align:middle;height:20px;line-height:19px;padding:0 5px;white-space:nowrap;transition:background-color .25s,box-shadow .25s}span.button .fa{padding-right:2px}span.button.normal{background-color:#40628a}span.button.normal:focus,span.button.normal:hover{outline:0;box-shadow:inset 0 0 100px 100px hsla(0,0%,100%,.15)}span.button.disabled{background-color:#999}span.button.selected{background-color:#2f943c}span.button.caution{background-color:#9a9d00}span.button.danger{background-color:#9d0808}span.button.gridable{width:125px;margin:2px 0}div.display,div.notice{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}div.display header,div.notice header,div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;border-bottom:2px solid #40628a}div.display header .button,div.notice header .button,div.subdisplay header .button{position:absolute;bottom:6px;right:4px}div.display article,div.notice article,div.subdisplay article{display:table;width:100%;border-spacing:4px 6px}div.notice{background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px);margin:8px 0;box-shadow:none;color:#000;font-weight:700;font-style:italic}div.notice .button{outline:1px solid #272727}div.notice .label{color:#000}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);-ms-transform:rotate(1turn);transform:rotate(1turn)}section .content,section .label,section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle}section{display:table-row;width:100%;padding:3px 0}section:not(first-child){padding-top:4px}section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}section .content:not(:last-child){padding-right:16px}section .line{width:100%}section .buttoninfo{margin-left:5px}div.subdisplay{width:100%;margin:0}header.titlebar .close,header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#98b0c3}header.titlebar .close:hover,header.titlebar .minimize:hover{color:#a7bccc}header.titlebar{position:fixed;top:0;left:0;width:100%;height:32px;background-color:#363636;box-shadow:0 3px 3px rgba(0,0,0,.1)}header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}header.titlebar .title{position:absolute;top:6px;left:46px;color:#98b0c3;font-size:16px;white-space:nowrap}header.titlebar .minimize{position:absolute;top:6px;right:46px}header.titlebar .close{position:absolute;top:4px;right:12px}body.generic{background:linear-gradient(180deg,#2a2a2a 0,#202020)}body.generic,body.nanotrasen{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo=") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020)} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js new file mode 100644 index 00000000000..d6c9951b840 --- /dev/null +++ b/tgui/assets/tgui.js @@ -0,0 +1,8 @@ +!function t(e,n,r){function i(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(a)return a(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[o]={exports:{}};e[o][0].call(l.exports,function(t){var n=e[o][1][t];return i(n?n:t)},l,l.exports,t,e,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;o-1}}([].indexOf||function(t){for(V=this.length;V--&&this[V]!==t;);return V}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e0||-1)*Math.floor(Math.abs(e))),e},ToPrimitive:function(e){var n,r,i;if(R(e))return e;if(r=e.valueOf,t(r)&&(n=r.call(e),R(n)))return n;if(i=e.toString,t(i)&&(n=i.call(e),R(n)))return n;throw new TypeError},ToObject:function(t){if(null==t)throw new TypeError("can't convert "+t+" to object");return r(t)},ToUint32:function(t){return t>>>0}},D=function(){};M(a,{bind:function(e){var n=this;if(!t(n))throw new TypeError("Function.prototype.bind called on incompatible "+n);for(var i,a=l.call(arguments,1),o=function(){if(this instanceof i){var t=n.apply(this,d.call(a,l.call(arguments)));return r(t)===t?t:this}return n.apply(e,d.call(a,l.call(arguments)))},s=g(0,n.length-a.length),u=[],c=0;s>c;c++)h.call(u,"$"+c);return i=Function("binder","return function ("+u.join(",")+"){ return binder.apply(this, arguments); }")(o),n.prototype&&(D.prototype=n.prototype,i.prototype=new D,D.prototype=null),i}});var U=m.bind(i.hasOwnProperty),V=m.bind(i.toString),B=m.bind(l),q=v.bind(l),z=m.bind(s.slice),H=m.bind(s.split),W=m.bind(s.indexOf),$=m.bind(h),G=m.bind(i.propertyIsEnumerable),K=m.bind(n.sort),Q=e.isArray||function(t){return"[object Array]"===V(t)},Y=1!==[].unshift(0);M(n,{unshift:function(){return f.apply(this,arguments),this.length}},Y),M(e,{isArray:Q});var J=r("a"),Z="a"!==J[0]||!(0 in J),X=function(t){var e=!0,n=!0;return t&&(t.call("foo",function(t,n,r){"object"!=typeof r&&(e=!1)}),t.call([1],function(){"use strict";n="string"==typeof this},"x")),!!t&&e&&n};M(n,{forEach:function(e){var n,r=I.ToObject(this),i=Z&&A(this)?H(this,""):r,a=-1,o=I.ToUint32(i.length);if(arguments.length>1&&(n=arguments[1]),!t(e))throw new TypeError("Array.prototype.forEach callback must be a function");for(;++a1&&(r=arguments[1]),!t(n))throw new TypeError("Array.prototype.map callback must be a function");for(var u=0;o>u;u++)u in a&&(void 0===r?s[u]=n(a[u],u,i):s[u]=n.call(r,a[u],u,i));return s}},!X(n.map)),M(n,{filter:function(e){var n,r,i=I.ToObject(this),a=Z&&A(this)?H(this,""):i,o=I.ToUint32(a.length),s=[];if(arguments.length>1&&(r=arguments[1]),!t(e))throw new TypeError("Array.prototype.filter callback must be a function");for(var u=0;o>u;u++)u in a&&(n=a[u],(void 0===r?e(n,u,i):e.call(r,n,u,i))&&$(s,n));return s}},!X(n.filter)),M(n,{every:function(e){var n,r=I.ToObject(this),i=Z&&A(this)?H(this,""):r,a=I.ToUint32(i.length);if(arguments.length>1&&(n=arguments[1]),!t(e))throw new TypeError("Array.prototype.every callback must be a function");for(var o=0;a>o;o++)if(o in i&&!(void 0===n?e(i[o],o,r):e.call(n,i[o],o,r)))return!1;return!0}},!X(n.every)),M(n,{some:function(e){var n,r=I.ToObject(this),i=Z&&A(this)?H(this,""):r,a=I.ToUint32(i.length);if(arguments.length>1&&(n=arguments[1]),!t(e))throw new TypeError("Array.prototype.some callback must be a function");for(var o=0;a>o;o++)if(o in i&&(void 0===n?e(i[o],o,r):e.call(n,i[o],o,r)))return!0;return!1}},!X(n.some));var tt=!1;n.reduce&&(tt="object"==typeof n.reduce.call("es5",function(t,e,n,r){return r})),M(n,{reduce:function(e){var n=I.ToObject(this),r=Z&&A(this)?H(this,""):n,i=I.ToUint32(r.length);if(!t(e))throw new TypeError("Array.prototype.reduce callback must be a function");if(0===i&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var a,o=0;if(arguments.length>=2)a=arguments[1];else for(;;){if(o in r){a=r[o++];break}if(++o>=i)throw new TypeError("reduce of empty array with no initial value")}for(;i>o;o++)o in r&&(a=e(a,r[o],o,n));return a}},!tt);var et=!1;n.reduceRight&&(et="object"==typeof n.reduceRight.call("es5",function(t,e,n,r){return r})),M(n,{reduceRight:function(e){var n=I.ToObject(this),r=Z&&A(this)?H(this,""):n,i=I.ToUint32(r.length);if(!t(e))throw new TypeError("Array.prototype.reduceRight callback must be a function");if(0===i&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var a,o=i-1;if(arguments.length>=2)a=arguments[1];else for(;;){if(o in r){a=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}if(0>o)return a;do o in r&&(a=e(a,r[o],o,n));while(o--);return a}},!et);var nt=n.indexOf&&-1!==[0,1].indexOf(1,2);M(n,{indexOf:function(t){var e=Z&&A(this)?H(this,""):I.ToObject(this),n=I.ToUint32(e.length);if(0===n)return-1;var r=0;for(arguments.length>1&&(r=I.ToInteger(arguments[1])),r=r>=0?r:g(0,n+r);n>r;r++)if(r in e&&e[r]===t)return r;return-1}},nt);var rt=n.lastIndexOf&&-1!==[0,1].lastIndexOf(0,-3);M(n,{lastIndexOf:function(t){var e=Z&&A(this)?H(this,""):I.ToObject(this),n=I.ToUint32(e.length);if(0===n)return-1;var r=n-1;for(arguments.length>1&&(r=b(r,I.ToInteger(arguments[1]))),r=r>=0?r:n-Math.abs(r);r>=0;r--)if(r in e&&t===e[r])return r;return-1}},rt);var it=function(){var t=[1,2],e=t.splice();return 2===t.length&&Q(e)&&0===e.length}();M(n,{splice:function(t,e){return 0===arguments.length?[]:p.apply(this,arguments)}},!it);var at=function(){var t={};return n.splice.call(t,0,0,1),1===t.length}();M(n,{splice:function(t,e){if(0===arguments.length)return[];var n=arguments;return this.length=g(I.ToInteger(this.length),0),arguments.length>0&&"number"!=typeof e&&(n=B(arguments),n.length<2?$(n,this.length-t):n[1]=I.ToInteger(e)),p.apply(this,n)}},!at);var ot=function(){var t=new e(1e5);return t[8]="x",t.splice(1,1),7===t.indexOf("x")}(),st=function(){var t=256,e=[];return e[t]="a",e.splice(t+1,0,"b"),"a"===e[t]}();M(n,{splice:function(t,e){for(var n,r=I.ToObject(this),i=[],a=I.ToUint32(r.length),s=I.ToInteger(t),u=0>s?g(a+s,0):b(s,a),c=b(g(I.ToInteger(e),0),a-u),l=0;c>l;)n=o(u+l),U(r,n)&&(i[l]=r[n]),l+=1;var p,h=B(arguments,2),f=h.length;if(c>f){for(l=u;a-c>l;)n=o(l+c),p=o(l+f),U(r,n)?r[p]=r[n]:delete r[p],l+=1;for(l=a;l>a-c+f;)delete r[l-1],l-=1}else if(f>c)for(l=a-c;l>u;)n=o(l+c-1),p=o(l+f-1),U(r,n)?r[p]=r[n]:delete r[p],l-=1;l=u;for(var d=0;d=0&&!Q(e)&&t(e.callee)},At=Ot(arguments)?Ot:St;M(r,{keys:function(e){var n=t(e),r=At(e),i=null!==e&&"object"==typeof e,a=i&&A(e);if(!i&&!n&&!r)throw new TypeError("Object.keys called on a non-object");var s=[],u=yt&&n;if(a&&wt||r)for(var c=0;ch;h++){var f=Tt[h];p&&"constructor"===f||!U(e,f)||$(s,f)}return s}});var Pt=r.keys&&function(){return 2===r.keys(arguments).length}(1,2),jt=r.keys&&function(){var t=r.keys(arguments);return 1!==arguments.length||1!==t.length||1!==t[0]}(1),Nt=r.keys;M(r,{keys:function(t){return Nt(At(t)?B(t):t)}},!Pt||jt);var Ft=-621987552e5,Mt="-000001",Rt=Date.prototype.toISOString&&-1===new Date(Ft).toISOString().indexOf(Mt),Lt=Date.prototype.toISOString&&"1969-12-31T23:59:59.999Z"!==new Date(-1).toISOString();M(Date.prototype,{toISOString:function(){var t,e,n,r,i;if(!isFinite(this))throw new RangeError("Date.prototype.toISOString called on non-finite value.");for(r=this.getUTCFullYear(),i=this.getUTCMonth(),r+=Math.floor(i/12),i=(i%12+12)%12,t=[i+1,this.getUTCDate(),this.getUTCHours(),this.getUTCMinutes(),this.getUTCSeconds()],r=(0>r?"-":r>9999?"+":"")+z("00000"+Math.abs(r),r>=0&&9999>=r?-4:-6),e=t.length;e--;)n=t[e],10>n&&(t[e]="0"+n);return r+"-"+B(t,0,2).join("-")+"T"+B(t,2).join(":")+"."+z("000"+this.getUTCMilliseconds(),-3)+"Z"}},Rt||Lt);var It=function(){try{return Date.prototype.toJSON&&null===new Date(NaN).toJSON()&&-1!==new Date(Ft).toJSON().indexOf(Mt)&&Date.prototype.toJSON.call({toISOString:function(){return!0}})}catch(t){return!1}}();It||(Date.prototype.toJSON=function(e){var n=r(this),i=I.ToPrimitive(n);if("number"==typeof i&&!isFinite(i))return null;var a=n.toISOString;if(!t(a))throw new TypeError("toISOString property is not callable");return a.call(n)});var Dt=1e15===Date.parse("+033658-09-27T01:46:40.000Z"),Ut=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"))||!isNaN(Date.parse("2012-12-31T23:59:60.000Z")),Vt=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(Vt||Ut||!Dt){var Bt=Math.pow(2,31)-1,qt=L(new Date(1970,0,1,0,0,0,Bt+1).getTime());Date=function(t){var e=function(n,r,i,a,s,u,c){var l,p=arguments.length;if(this instanceof t){var h=u,f=c;if(qt&&p>=7&&c>Bt){var d=Math.floor(c/Bt)*Bt,m=Math.floor(d/1e3);h+=m,f-=1e3*m}l=1===p&&o(n)===n?new t(e.parse(n)):p>=7?new t(n,r,i,a,s,h,f):p>=6?new t(n,r,i,a,s,h):p>=5?new t(n,r,i,a,s):p>=4?new t(n,r,i,a):p>=3?new t(n,r,i):p>=2?new t(n,r):p>=1?new t(n):new t}else l=t.apply(this,arguments);return R(l)||M(l,{constructor:e},!0),l},n=RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),r=[0,31,59,90,120,151,181,212,243,273,304,334,365],i=function(t,e){var n=e>1?1:0;return r[e]+Math.floor((t-1969+n)/4)-Math.floor((t-1901+n)/100)+Math.floor((t-1601+n)/400)+365*(t-1970)},a=function(e){var n=0,r=e;if(qt&&r>Bt){var i=Math.floor(r/Bt)*Bt,a=Math.floor(i/1e3);n+=a,r-=1e3*a}return u(new t(1970,0,1,0,0,n,r))};for(var s in t)U(t,s)&&(e[s]=t[s]);M(e,{now:t.now,UTC:t.UTC},!0),e.prototype=t.prototype,M(e.prototype,{constructor:e},!0);var c=function(e){var r=n.exec(e);if(r){var o,s=u(r[1]),c=u(r[2]||1)-1,l=u(r[3]||1)-1,p=u(r[4]||0),h=u(r[5]||0),f=u(r[6]||0),d=Math.floor(1e3*u(r[7]||0)),m=!(!r[4]||r[8]),v="-"===r[9]?1:-1,g=u(r[10]||0),b=u(r[11]||0),y=h>0||f>0||d>0;return(y?24:25)>p&&60>h&&60>f&&1e3>d&&c>-1&&12>c&&24>g&&60>b&&l>-1&&l=-864e13&&864e13>=o)?o:NaN}return t.parse.apply(this,arguments)};return M(e,{parse:c}),e}(Date)}Date.now||(Date.now=function(){return(new Date).getTime()});var zt=c.toFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0)),Ht={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function(t,e){for(var n=-1,r=e;++n=0;)n+=Ht.data[e],Ht.data[e]=Math.floor(n/t),n=n%t*Ht.base},numToString:function(){for(var t=Ht.size,e="";--t>=0;)if(""!==e||0===t||0!==Ht.data[t]){var n=o(Ht.data[t]);""===e?e=n:e+=z("0000000",0,7-n.length)+n}return e},pow:function ue(t,e,n){return 0===e?n:e%2===1?ue(t,e-1,n*t):ue(t*t,e/2,n)},log:function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e}},Wt=function(t){var e,n,r,i,a,s,c,l;if(e=u(t),e=L(e)?0:Math.floor(e),0>e||e>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(n=u(this),L(n))return"NaN";if(-1e21>=n||n>=1e21)return o(n);if(r="",0>n&&(r="-",n=-n),i="0",n>1e-21)if(a=Ht.log(n*Ht.pow(2,69,1))-69,s=0>a?n*Ht.pow(2,-a,1):n/Ht.pow(2,a,1),s*=4503599627370496,a=52-a,a>0){for(Ht.multiply(0,s),c=e;c>=7;)Ht.multiply(1e7,0),c-=7;for(Ht.multiply(Ht.pow(10,c,1),0),c=a-1;c>=23;)Ht.divide(1<<23),c-=23;Ht.divide(1<0?(l=i.length,i=e>=l?r+z("0.0000000000000000000",0,e-l+2)+i:r+z(i,0,l-e)+"."+z(i,l-e)):i=r+i,i};M(c,{toFixed:Wt},zt);var $t=function(){try{return"1"===1..toPrecision(void 0)}catch(t){return!0}}(),Gt=c.toPrecision;M(c,{toPrecision:function(t){return void 0===t?Gt.call(this):Gt.call(this,t)}},$t),2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||4!=="test".split(/(?:)/,-1).length||"".split(/.?/).length||".".split(/()()/).length>1?!function(){var t=void 0===/()??/.exec("")[1],e=Math.pow(2,32)-1;s.split=function(n,r){var i=this+"";if(void 0===n&&0===r)return[];if(!T(n))return H(this,n,r);var a,o,s,u,c=[],l=(n.ignoreCase?"i":"")+(n.multiline?"m":"")+(n.unicode?"u":"")+(n.sticky?"y":""),p=0,f=RegExp(n.source,l+"g");t||(a=RegExp("^"+f.source+"$(?!\\s)",l));var d=void 0===r?e:I.ToUint32(r);for(o=f.exec(i);o&&(s=o.index+o[0].length,!(s>p&&($(c,z(i,p,o.index)),!t&&o.length>1&&o[0].replace(a,function(){for(var t=1;t1&&o.index=d)));)f.lastIndex===o.index&&f.lastIndex++,o=f.exec(i);return p===i.length?(u||!f.test(""))&&$(c,""):$(c,z(i,p)),c.length>d?z(c,0,d):c}}():"0".split(void 0,0).length&&(s.split=function(t,e){return void 0===t&&0===e?[]:H(this,t,e)});var Kt=s.replace,Qt=function(){var t=[];return"x".replace(/x(.)?/g,function(e,n){$(t,n)}),1===t.length&&void 0===t[0]}();Qt||(s.replace=function(e,n){var r=t(n),i=T(e)&&/\)[*?]/.test(e.source);if(r&&i){var a=function(t){var r=arguments.length,i=e.lastIndex;e.lastIndex=0;var a=e.exec(t)||[];return e.lastIndex=i,$(a,arguments[r-2],arguments[r-1]),n.apply(this,a)};return Kt.call(this,e,a)}return Kt.call(this,e,n)});var Yt=s.substr,Jt="".substr&&"b"!=="0b".substr(-1);M(s,{substr:function(t,e){var n=t;return 0>t&&(n=g(this.length+t,0)),Yt.call(this,n,e)}},Jt);var Zt=" \n\x0B\f\r   ᠎ â€â€‚         âŸã€€\u2028\u2029\ufeff",Xt="​",te="["+Zt+"]",ee=RegExp("^"+te+te+"*"),ne=RegExp(te+te+"*$"),re=s.trim&&(Zt.trim()||!Xt.trim());M(s,{trim:function(){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");return o(this).replace(ee,"").replace(ne,"")}},re);var ie=s.lastIndexOf&&-1!=="abcã‚ã„".lastIndexOf("ã‚ã„",2);M(s,{lastIndexOf:function(t){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");for(var e=o(this),n=o(t),r=arguments.length>1?u(arguments[1]):NaN,i=L(r)?1/0:I.ToInteger(r),a=b(g(i,0),e.length),s=n.length,c=a+s;c>0;){c=g(0,c-s);var l=W(z(e,c,a+s),n);if(-1!==l)return c+l}return-1}},ie);var ae=s.lastIndexOf;if(M(s,{lastIndexOf:function(t){return ae.apply(this,arguments)}},1!==s.lastIndexOf.length),(8!==parseInt(Zt+"08")||22!==parseInt(Zt+"0x16"))&&(parseInt=function(t){var e=/^[\-+]?0[xX]/;return function(n,r){var i=o(n).trim(),a=u(r)||(e.test(i)?16:10);return t(i,a)}}(parseInt)),new RangeError("test")+""!="RangeError: test"){var oe=function(){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");var t=this.name;void 0===t?t="Error":"string"!=typeof t&&(t=o(t));var e=this.message;return void 0===e?e="":"string"!=typeof e&&(e=o(e)),t?e?t+": "+e:t:e};Error.prototype.toString=oe}if(F){var se=function(t,e){if(G(t,e)){var n=Object.getOwnPropertyDescriptor(t,e);n.enumerable=!1,Object.defineProperty(t,e,n)}};se(Error.prototype,"message"),""!==Error.prototype.message&&(Error.prototype.message=""),se(Error.prototype,"name")}})},{}],3:[function(t,e,n){!function(t,n){function r(t,e){var n=t.createElement("p"),r=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function i(){var t=w.elements;return"string"==typeof t?t.split(" "):t}function a(t,e){var n=w.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),w.elements=n+" "+t,l(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,r){if(e||(e=n),h)return e.createElement(t);r||(r=o(e));var i;return i=r.cache[t]?r.cache[t].cloneNode():v.test(t)?(r.cache[t]=r.createElem(t)).cloneNode():r.createElem(t),!i.canHaveChildren||m.test(t)||i.tagUrn?i:r.frag.appendChild(i)}function u(t,e){if(t||(t=n),h)return t.createDocumentFragment();e=e||o(t);for(var r=e.frag.cloneNode(),a=0,s=i(),u=s.length;u>a;a++)r.createElement(s[a]);return r}function c(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return w.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(w,e.frag)}function l(t){t||(t=n);var e=o(t);return!w.shivCSS||p||e.hasCSS||(e.hasCSS=!!r(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),h||c(t,e),t}var p,h,f="3.7.3-pre",d=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",p="hidden"in t,h=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){p=!0,h=!0}}();var w={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:f,shivCSS:d.shivCSS!==!1,supportsUnknownElements:h,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:l,createElement:s,createDocumentFragment:u,addElements:a};t.html5=w,l(n),"object"==typeof e&&e.exports&&(e.exports=w)}("undefined"!=typeof window?window:this,document)},{}],4:[function(t,e,n){(function(t){!function(t){function e(t,e,n,r){for(var a,o=n.slice(),s=i(e,t),u=0,c=o.length;c>u&&(handler=o[u],"object"==typeof handler&&"function"==typeof handler.handleEvent?handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return a=!s.stoppedPropagation,r&&a&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function r(t,e,r){var i=b(e||t,r);v(t,"textContent",n(function(){return i.get.call(this)},function(t){i.set.call(this,t)}))}function i(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function a(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!h&&k.test(document.readyState)&&(h=!h,document.detachEvent(f,u),t=document.createEvent("Event"),t.initEvent(d,!0,!0),document.dispatchEvent(t))}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var p=!0,h=!1,f="onreadystatechange",d="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var r in n)if(y.call(n,r))try{v(e,r,n[r])}catch(i){t.console&&console.log(r+" failed on object:",e,i.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,w=t.Element.prototype,x=t.Text.prototype,_=/^[a-z]+$/,k=/loaded|complete/,E={},T=document.createElement("div"),C=document.documentElement,O=C.removeAttribute,S=C.setAttribute;r(t.HTMLCommentElement.prototype,w,"nodeValue"),r(t.HTMLScriptElement.prototype,null,"text"),r(x,null,"nodeValue"),r(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(w,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,r){var i,o,u=this,c="on"+t,p=u[m]||v(u,m,{value:{}})[m],h=p[c]||(p[c]={}),f=h.h||(h.h=[]);if(!y.call(h,"w")){if(h.w=function(t){return t[m]||e(u,l(u,t),f,!1)},!y.call(E,c))if(_.test(t)){try{i=document.createEventObject(),i[m]=!0,9!=u.nodeType&&null==u.parentNode&&T.appendChild(u),(o=u.getAttribute(c))&&O.call(u,c),u.fireEvent(c,i),E[c]=!0}catch(i){for(E[c]=!1;T.hasChildNodes();)T.removeChild(T.firstChild)}null!=o&&S.call(u,c,o)}else E[c]=!1;(h.n=E[c])&&u.attachEvent(c,h.w)}a(f,n)<0&&f[r?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}},dispatchEvent:{value:function(t){var n,r=this,i="on"+t.type,a=r[m],o=a&&a[i],s=!!o;return t.target||(t.target=r),s?o.n?r.fireEvent(i,t):e(r,t,o.h,!0):(n=r.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){var r=this,i="on"+t,o=r[m],s=o&&o[i],u=s&&s.h,c=u?a(u,e):-1;c>-1&&u.splice(c,1)}}}),g(x,{addEventListener:{value:w.addEventListener},dispatchEvent:{value:w.dispatchEvent},removeEventListener:{value:w.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var r=this,i="on"+t,o=r[m]||v(r,m,{value:{}})[m],s=o[i]||(o[i]={}),u=s.h||(s.h=[]);a(u,e)<0&&(r[i]||(r[i]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),r.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,r="on"+t.type,i=n[m],a=i&&i[r],o=!!a;return o&&(a.n?n.fireEvent(r,t):e(n,t,a.h,!0))}},removeEventListener:{value:w.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){ +return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:{value:function(e,n,r){var i=this;w.addEventListener.call(i,e,n,r),p&&e===d&&!k.test(i.readyState)&&(p=!1,i.attachEvent(f,u),t==top&&!function a(t){try{i.documentElement.doScroll("left"),u()}catch(e){setTimeout(a,50)}}())}},dispatchEvent:{value:w.dispatchEvent},removeEventListener:{value:w.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,r=/^(top|right|bottom|left)$/,i=/\-([a-z])/g,a=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,c=u.style,l=u.currentStyle,p=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(i,a),e=l?l[t]:c[t],n.test(e)&&!r.test(t)&&(o=c.left,s=p&&p.left,s&&(p.left=l.left),c.left="fontSize"===t?"1em":e,e=c.pixelLeft+"px",c.left=o,s&&(p.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,r){return r?new e(n):new t(n)}}()},addEventListener:{value:function(n,r,i){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,l(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),a(o,r)<0&&o[i?"unshift":"push"](r)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,r){var i="on"+e,o=(t[i]||Object)[m],s=o?a(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];for(var i,a;a=n.shift();)for(i in a)So.call(a,i)&&(t[i]=a[i]);return t}function i(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function a(t){return"[object Array]"===Ao.call(t)}function o(t){return Po.test(Ao.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function c(t){return t&&"[object Object]"===Ao.call(t)}function l(t,e){return t.replace(/%s/g,function(){return e.shift()})}function p(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];throw t=l(t,n),Error(t)}function h(){Av.DEBUG&&To.apply(null,arguments)}function f(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),Co(t,n)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=l(t,n),No[t]||(No[t]=!0,Co(t,n))}function m(){Av.DEBUG&&f.apply(null,arguments)}function v(){Av.DEBUG&&d.apply(null,arguments)}function g(t,e,n){var r=b(t,e,n);return r?r[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function w(t){var e,n,r,i,a,o;for(e=t.split("."),(n=Bo[e.length])||(n=x(e.length)),a=[],r=function(t,n){return t?"*":e[n]},i=n.length;i--;)o=n[i].map(r).join("."),a.hasOwnProperty(o)||(a.push(o),a[o]=!0);return a}function x(t){var e,n,r,i,a,o,s,u,c="";if(!Bo[t]){for(r=[];c.length=a;a+=1){for(n=a.toString(2);n.lengtho;o++)u.push(i(n[o]));r[a]=u}Bo[t]=r}return Bo[t]}function _(t,e,n,r){var i=t[e];if(!i||!i.equalsOrStartsWith(r)&&i.equalsOrStartsWith(n))return t[e]=i?i.replace(n,r):r,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ho.hasOwnProperty(t)||(Ho[t]=new Wo(t)),Ho[t])}function T(t,e){function n(e,n){var r,i,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(r=t.viewmodel.wrapped[n.str],i=r?r.get():t.viewmodel.get(n),o=i?Object.keys(i):null),o&&o.forEach(function(t){"_ractive"===t&&a(i)||e.push(n.join(t))}),e}var r,i,o;for(r=e.str.split("."),o=[Go];i=r.shift();)"*"===i?o=o.reduce(n,[]):o[0]===Go?o[0]=E(i):o=o.map(C(i));return o}function C(t){return function(e){return e.join(t)}}function O(t){return t?t.replace(qo,".$1"):""}function S(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var r=void 0,i=void 0;if(/\*/.test(e))return i={},T(t,E(O(e))).forEach(function(e){var r=t.viewmodel.get(e);if(!u(r))throw Error(Qo);i[e.str]=r+n}),t.set(i);if(r=t.get(e),!u(r))throw Error(Qo);return t.set(e,+r+n)}function A(t,e){return Ko(this,t,void 0===e?1:+e)}function P(t){this.event=t,this.method="on"+t,this.deprecate=ts[t]}function j(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function N(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]==e)return!0;return!1}function F(t,e){var n;if(!a(t)||!a(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function M(t){return"string"==typeof t?[t]:void 0===t?[]:t}function R(t){return t[t.length-1]}function L(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function I(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function D(t){setTimeout(t,0)}function U(t,e){return function(){for(var n;n=t.shift();)n(e)}}function V(t,e,n,r){var i;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof es)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{i=e.then}catch(a){return void r(a)}if("function"==typeof i){var o,s,u;s=function(e){o||(o=!0,V(t,e,n,r))},u=function(t){o||(o=!0,r(t))};try{i.call(e,s,u)}catch(a){if(!o)return r(a),void(o=!0)}}else n(e)}}function B(t,e,n){var r;return e=O(e),"~/"===e.substr(0,2)?(r=E(e.substring(2)),H(t,r.firstKey,n)):"."===e[0]?(r=q(ss(n),e),r&&H(t,r.firstKey,n)):r=z(t,E(e),n),r}function q(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function z(t,e,n,r){var i,a,o,s,u;if(e.isRoot)return e;for(a=e.firstKey;n;)if(i=n.context,n=n.parent,i&&(s=!0,o=t.viewmodel.get(i),o&&("object"==typeof o||"function"==typeof o)&&a in o))return i.join(e.str);return W(t.viewmodel,a)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,a=E(a),u=z(t.parent,a,n,!0))?(t.viewmodel.map(a,{origin:t.parent.viewmodel,keypath:u}),e):r||s?void 0:(t.viewmodel.set(e,void 0),e)}function H(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=z(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function $(t){t.teardown()}function G(t){t.unbind()}function K(t){t.unrender()}function Q(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function Z(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function X(){for(var t,e,n;ls.ractives.length;)e=ls.ractives.pop(),n=e.viewmodel.applyChanges(),n&&ds.fire(e,n);for(tt(),t=0;t=0;a--)i=t._subs[e[a]],i&&(s=gt(t,i,n,r)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,r)}}function gt(t,e,n,r){var i=null,a=!1;n&&!n._noArg&&(r=[n].concat(r)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,r)===!1&&(a=!0);return n&&!n._noArg&&a&&(i=n.original)&&(i.preventDefault&&i.preventDefault(),i.stopPropagation&&i.stopPropagation()),!a}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};Bs(this,t,e)}function yt(t){var e;return t=E(O(t)),e=this.viewmodel.get(t,Hs),void 0===e&&this.parent&&!this.isolated&&us(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function wt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function _t(t,e,n){var r,i;return t=E(O(t)),r=this.viewmodel.get(t),a(r)&&a(e)?(i=ms.start(this,!0),this.viewmodel.merge(t,r,e,n),ms.end(),i):this.set(t,e,n&&n.complete)}function kt(t,e){var n,r;return n=T(t,e),r={},n.forEach(function(e){r[e.str]=t.get(e.str)}),r}function Et(t,e,n,r){var i,a,o;e=E(O(e)),r=r||su,e.isPattern?(i=new au(t,e,n,r),t.viewmodel.patternObservers.push(i),a=!0):i=new Ys(t,e,n,r),i.init(r.init),t.viewmodel.register(e,i,a?"patternObservers":"observers"),i.ready=!0;var s={cancel:function(){var n;o||(a?(n=t.viewmodel.patternObservers.indexOf(i),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,i,"patternObservers")):t.viewmodel.unregister(e,i,"observers"),o=!0)}};return t._observers.push(s),s}function Tt(t,e,n){var r,i,a,o;if(c(t)){n=e,i=t,r=[];for(t in i)i.hasOwnProperty(t)&&(e=i[t],r.push(this.observe(t,e,n)));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",ou(this,t,e,n);if(a=t.split(" "),1===a.length)return ou(this,t,e,n);for(r=[],o=a.length;o--;)t=a[o],t&&r.push(ou(this,t,e,n));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}function Ct(t,e,n){var r=this.observe(t,function(){e.apply(this,arguments),r.cancel()},{init:!1,defer:n&&n.defer});return r}function Ot(t,e){var n,r=this;if(t)n=t.split(" ").map(lu).filter(pu),n.forEach(function(t){var n,i;(n=r._subs[t])&&(e?(i=n.indexOf(e),-1!==i&&n.splice(i,1)):r._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function St(t,e){var n,r,i,a=this;if("object"==typeof t){n=[];for(r in t)t.hasOwnProperty(r)&&n.push(this.on(r,t[r]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return i=t.split(" ").map(lu).filter(pu),i.forEach(function(t){(a._subs[t]||(a._subs[t]=[])).push(e)}),{cancel:function(){return a.off(t,e)}}}function At(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Pt(t,e,n){var r,i,a,o,s,u,c=[];if(r=jt(t,e,n),!r)return null;for(i=t.length,s=r.length-2-r[1],a=Math.min(i,r[0]),o=a+r[1],u=0;a>u;u+=1)c.push(u);for(;o>u;u+=1)c.push(-1);for(;i>u;u+=1)c.push(u+s);return 0!==s?c.touchedFrom=r[0]:c.touchedFrom=t.length,c}function jt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Nt(e,n){var r,i,a,o=this;if(a=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),r=ms.start(this,!0),ms.scheduleTask(function(){return Su.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Ft(s),e.innerHTML=""}return this.cssId&&Cu.apply(),e&&((i=e.__ractive_instances__)?i.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),ms.end(),this.transitionsEnabled=a,r.then(function(){return Au.fire(o)})}function Ft(t){t.splice(0,t.length).forEach($)}function Mt(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function Rt(t,e){var n,r,i;return r='[data-ractive-css~="{'+e+'}"]',i=function(t){var e,n,i,a,o,s,u,c=[];for(e=[];n=Ru.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(a=e.map(It),u=e.length;u--;)s=a.slice(),i=e[u],s[u]=i.base+r+i.modifiers||"",o=a.slice(),o[u]=r+" "+o[u],c.push(s.join(" "),o.join(" "));return c.join(", ")},n=Iu.test(t)?t.replace(Iu,r):t.replace(Mu,"").replace(Fu,function(t,e){var n,r;return Lu.test(e)?t:(n=e.split(",").map(Lt),r=n.map(i).join(", ")+" ",t.replace(e,r))})}function Lt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function It(t){return t.str}function Dt(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?p("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Ut(t,e){Dt(e);var n="function"==typeof t,r="function"==typeof e;return e||n||(e={}),n||r?function(){var i=r?Vt(e,this):e,a=n?Vt(t,this):t;return Bt(i,a)}:Bt(e,t)}function Vt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&p("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Bt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function qt(t){var e=wo(Wu);return e.parse=function(e,n){return zt(e,n||t)},e}function zt(t,e){if(!zu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return zu(t,e||this.options)}function Ht(t,e){var n;if(!Za){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a + +
+
+ {{yield}} +
diff --git a/tgui/scripts/components/button.ract b/tgui/scripts/components/button.ract new file mode 100644 index 00000000000..739cf15f743 --- /dev/null +++ b/tgui/scripts/components/button.ract @@ -0,0 +1,36 @@ + + + + {{#if icon}} + + {{/if}} + {{yield}} + diff --git a/tgui/scripts/components/display.ract b/tgui/scripts/components/display.ract new file mode 100644 index 00000000000..cdb1fb3c070 --- /dev/null +++ b/tgui/scripts/components/display.ract @@ -0,0 +1,11 @@ +
+ {{#if title}} +
+

{{title}}

+ {{#if button}}{{yield button}}{{/if}} +
+ {{/if}} +
+ {{yield}} +
+
diff --git a/tgui/scripts/components/notice.ract b/tgui/scripts/components/notice.ract new file mode 100644 index 00000000000..f6c063596d8 --- /dev/null +++ b/tgui/scripts/components/notice.ract @@ -0,0 +1,3 @@ +
+ {{yield}} +
diff --git a/tgui/scripts/components/resize.ract b/tgui/scripts/components/resize.ract new file mode 100644 index 00000000000..3f847a9aa73 --- /dev/null +++ b/tgui/scripts/components/resize.ract @@ -0,0 +1,23 @@ + + +{{#if config.fancy}} +
+{{/if}} diff --git a/tgui/scripts/components/section.ract b/tgui/scripts/components/section.ract new file mode 100644 index 00000000000..bcdd3e0e6e8 --- /dev/null +++ b/tgui/scripts/components/section.ract @@ -0,0 +1,14 @@ +
+ {{#if label}} + {{label}}: + {{#if nowrap}} + {{yield}} + {{else}} +
+ {{yield}} +
+ {{/if}} + {{else}} + {{yield}} + {{/if}} +
diff --git a/tgui/scripts/components/subdisplay.ract b/tgui/scripts/components/subdisplay.ract new file mode 100644 index 00000000000..108cdc933b3 --- /dev/null +++ b/tgui/scripts/components/subdisplay.ract @@ -0,0 +1,11 @@ +
+ {{#if title}} +
+

{{title}}

+ {{#if button}}{{yield button}}{{/if}} +
+ {{/if}} +
+ {{yield}} +
+
diff --git a/tgui/scripts/components/titlebar.ract b/tgui/scripts/components/titlebar.ract new file mode 100644 index 00000000000..f4cc29dc0fe --- /dev/null +++ b/tgui/scripts/components/titlebar.ract @@ -0,0 +1,42 @@ + + +
+ + {{yield}} + {{#if config.fancy}} + + + {{/if}} +
diff --git a/tgui/scripts/constants.coffee b/tgui/scripts/constants.coffee new file mode 100644 index 00000000000..1457071dabe --- /dev/null +++ b/tgui/scripts/constants.coffee @@ -0,0 +1,6 @@ +# Constants used in tgui; these are mirrored from the BYOND code. +module.exports = + UI_INTERACTIVE: 2 + UI_UPDATE: 1 + UI_DISABLED: 0 + UI_CLOSE: -1 diff --git a/tgui/scripts/interfaces/air_alarm.ract b/tgui/scripts/interfaces/air_alarm.ract new file mode 100644 index 00000000000..9139066184a --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm.ract @@ -0,0 +1,30 @@ + + + + + + + + + {{#if data.siliconUser}} + + {{data.locked ? "Engaged" : "Disengaged"}} + + {{else}} + Swipe an ID card to {{data.locked ? "unlock" : "lock"}} this interface. + {{/if}} + + +{{#if !data.locked || data.siliconUser}} + {{#if data.screen == 1}} + + {{elseif data.screen == 2}} + + {{elseif data.screen == 3}} + + {{elseif data.screen == 4}} + + {{elseif data.screen == 5}} + + {{/if}} +{{/if}} diff --git a/tgui/scripts/interfaces/air_alarm/back.ract b/tgui/scripts/interfaces/air_alarm/back.ract new file mode 100644 index 00000000000..8528495fc2f --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/back.ract @@ -0,0 +1 @@ +Back diff --git a/tgui/scripts/interfaces/air_alarm/controls.ract b/tgui/scripts/interfaces/air_alarm/controls.ract new file mode 100644 index 00000000000..530317a0c77 --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/controls.ract @@ -0,0 +1,23 @@ + + + Area Atmosphere Alarm + + + Panic Siphon + +
+ + Vent Controls + + + Scrubber Controls + + + Operating Mode + + + Alarm Thresholds + +
diff --git a/tgui/scripts/interfaces/air_alarm/modes.ract b/tgui/scripts/interfaces/air_alarm/modes.ract new file mode 100644 index 00000000000..c726a6d4ba2 --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/modes.ract @@ -0,0 +1,14 @@ + + + + {{#partial button}} + + {{/partial}} + {{#each data.modes}} + + {{name}} + + {{/each}} + diff --git a/tgui/scripts/interfaces/air_alarm/scrubbers.ract b/tgui/scripts/interfaces/air_alarm/scrubbers.ract new file mode 100644 index 00000000000..1d80db754ac --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/scrubbers.ract @@ -0,0 +1,33 @@ + + + + {{#partial button}} + + {{/partial}} + {{#each data.scrubbers}} + + + {{power ? "On" : "Off"}} + + + {{scrubbing ? "Scrubbing" : "Siphoning"}} + + + {{widenet ? "Expanded" : "Normal"}} + + + Oxygen + Nitrogen + Plasma + + + {{else}} + Error: No scrubbers connected. + {{/each}} + diff --git a/tgui/scripts/interfaces/air_alarm/status.ract b/tgui/scripts/interfaces/air_alarm/status.ract new file mode 100644 index 00000000000..c8c3412ec36 --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/status.ract @@ -0,0 +1,31 @@ + + {{#if data.environment_data}} + {{#each data.environment_data}} + + + {{Math.fixed(value, 2)}}{{unit}} + + + {{/each}} + + + {{data.danger_level == 2 ? "Danger (Internals Required)" : data.danger_level == 1 ? "Caution" : "Optimal"}} + + + + + {{data.atmos_alarm ? "Atmosphere Alarm" : fire_alarm ? "Fire Alarm" : "Nominal"}} + + + {{else}} + + Warning: Cannot obtain air sample for analysis. + + {{/if}} + {{#if data.emagged}} +
+ + Warning: Safety measures offline. Device may exhibit abnormal behavior. + + {{/if}} +
diff --git a/tgui/scripts/interfaces/air_alarm/thresholds.ract b/tgui/scripts/interfaces/air_alarm/thresholds.ract new file mode 100644 index 00000000000..600baa3339a --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/thresholds.ract @@ -0,0 +1,30 @@ + + + + {{#partial button}} + + {{/partial}} + + + + + + + + + + {{#each data.thresholds}} + + {{#each settings}}{{/each}} + {{/each}} + +
min2min1max1max2
{{{name}}} + {{Math.fixed(selected, 2)}} +
+ + + diff --git a/tgui/scripts/interfaces/air_alarm/vents.ract b/tgui/scripts/interfaces/air_alarm/vents.ract new file mode 100644 index 00000000000..8078ce72ca3 --- /dev/null +++ b/tgui/scripts/interfaces/air_alarm/vents.ract @@ -0,0 +1,32 @@ + + + + {{#partial button}} + + {{/partial}} + {{#each data.vents}} + + + {{power ? "On" : "Off"}} + + + {{direction == "release" ? "Pressurizing" : "Siphoning"}} + + + Internal + External + + + {{Math.fixed(external)}} + Reset + + + {{else}} + Error: No vents connected. + {{/each}} + diff --git a/tgui/scripts/interfaces/airlock_electronics.ract b/tgui/scripts/interfaces/airlock_electronics.ract new file mode 100644 index 00000000000..b54b963be19 --- /dev/null +++ b/tgui/scripts/interfaces/airlock_electronics.ract @@ -0,0 +1,35 @@ + + + {{data.oneAccess ? "One" : "All"}} Required + Clear + +
+
+ + {{#each data.regions}} + + {{/each}} + + + {{#each data.regions}} + + {{/each}} + +
{{name}}
{{#each accesses}} + {{name}} +
+ {{/each}}
+
+ + diff --git a/tgui/scripts/interfaces/apc.ract b/tgui/scripts/interfaces/apc.ract new file mode 100644 index 00000000000..7590def3aaf --- /dev/null +++ b/tgui/scripts/interfaces/apc.ract @@ -0,0 +1,110 @@ + + + + {{#if data.siliconUser}} + + {{data.locked ? "Engaged" : "Disengaged"}} + + {{else}} + Swipe an ID card to {{data.locked ? "unlock" : "lock"}} this interface. + {{/if}} + + + + {{#if data.locked && !data.siliconUser}} + {{data.isOperating ? "On" : "Off"}} + {{else}} + {{data.isOperating ? "On" : "Off"}} + {{/if}} + + + {{data.externalPower == 2 ? "Good" : data.externalPower == 1 ? "Low" : "None"}} + + + {{#if data.powerCellStatus != null}} + {{Math.fixed(adata.powerCellStatus)}}% + {{else}} + Power cell removed. + {{/if}} + + {{#if data.powerCellStatus != null}} + + {{#if data.locked && !data.siliconUser}} + {{data.chargeMode ? "Auto" : "Off"}} + {{else}} + {{data.chargeMode ? "Auto" : "Off"}} + {{/if}} +   + [{{data.chargingStatus == 2 ? "Fully Charged" : data.chargingStatus == 1 ? "Charging" : "Not Charging"}}] + + {{/if}} + + + {{#each adata.powerChannels}} + +
{{Math.round(powerLoad)}} W
+
{{status >= 2 ? "On" : "Off"}}
+
[{{status == 1 || status == 3 ? "Auto" : "Manual"}}]
+
+ {{#if !data.locked || data.siliconUser}} + Auto + On + Off + {{/if}} +
+
+ {{/each}} + + {{Math.round(adata.totalLoad)}} W + +
+{{#if data.siliconUser}} + + Overload + {{#if data.malfStatus}} + {{malfButton}} + {{/if}} + +{{/if}} + + + {{#if data.locked && !data.siliconUser}} + {{data.coverLocked ? "Engaged" : "Disengaged"}} + {{else}} + {{data.coverLocked ? "Engaged" : "Disengaged"}} + {{/if}} + + diff --git a/tgui/scripts/interfaces/atmos_filter.ract b/tgui/scripts/interfaces/atmos_filter.ract new file mode 100644 index 00000000000..7f9601356b7 --- /dev/null +++ b/tgui/scripts/interfaces/atmos_filter.ract @@ -0,0 +1,25 @@ + + + {{data.on ? "On" : "Off"}} + + + Set + Max + {{Math.round(adata.set_pressure)}} kPa + + + Nothing + Plasma + O2 + N2 + CO2 + N2O + + diff --git a/tgui/scripts/interfaces/atmos_mixer.ract b/tgui/scripts/interfaces/atmos_mixer.ract new file mode 100644 index 00000000000..f68516770b1 --- /dev/null +++ b/tgui/scripts/interfaces/atmos_mixer.ract @@ -0,0 +1,33 @@ + + + {{data.on ? "On" : "Off"}} + + + Set + Max + {{Math.round(adata.set_pressure)}} kPa + + + + + + + {{Math.round(adata.node1_concentration)}}% + + + + + + + {{Math.round(adata.node2_concentration)}}% + + diff --git a/tgui/scripts/interfaces/atmos_pump.ract b/tgui/scripts/interfaces/atmos_pump.ract new file mode 100644 index 00000000000..2cb3053a38c --- /dev/null +++ b/tgui/scripts/interfaces/atmos_pump.ract @@ -0,0 +1,19 @@ + + + {{data.on ? "On" : "Off"}} + + {{#if data.max_rate}} + + Set + Max + {{Math.round(adata.transfer_rate)}} L/s + + {{else}} + + Set + Max + {{Math.round(adata.set_pressure)}} kPa + + {{/if}} + diff --git a/tgui/scripts/interfaces/canister.ract b/tgui/scripts/interfaces/canister.ract new file mode 100644 index 00000000000..831d4ee6152 --- /dev/null +++ b/tgui/scripts/interfaces/canister.ract @@ -0,0 +1,53 @@ + + The regulator {{data.hasHoldingTank ? "is" : "is not"}} connected to a tank. + + + {{#partial button}} + Relabel + {{/partial}} + + {{Math.round(adata.tankPressure)}} kPa + + + {{data.portConnected ? "Connected" : "Not Connected"}} + + + + + {{Math.round(adata.releasePressure)}} kPa + + + Reset + Min + Set + Max + + + {{data.valveOpen ? "Open" : "Closed"}} + + + + {{#partial button}} + {{#if data.hasHoldingTank}} + Eject + {{/if}} + {{/partial}} + {{#if data.hasHoldingTank}} + + {{data.holdingTank.name}} + + + {{Math.round(adata.holdingTank.tankPressure)}} kPa + + {{else}} + + No Holding Tank + + {{/if}} + diff --git a/tgui/scripts/interfaces/chem_dispenser.ract b/tgui/scripts/interfaces/chem_dispenser.ract new file mode 100644 index 00000000000..1a610b4769c --- /dev/null +++ b/tgui/scripts/interfaces/chem_dispenser.ract @@ -0,0 +1,44 @@ + + + {{Math.fixed(adata.energy)}} Units + + {{#if data.beakerTransferAmounts}} + + {{#each data.beakerTransferAmounts}} + {{.}} + {{/each}} + + {{/if}} + + + + {{#each data.chemicals}} + {{title}} + {{/each}} + + + + {{#partial button}} + Eject + {{/partial}} + {{#if data.beakerTransferAmounts}} + + {{#each data.beakerTransferAmounts}} + {{.}} + {{/each}} + + {{/if}} + + {{#if data.isBeakerLoaded}} + {{Math.round(adata.beakerCurrentVolume)}}/{{data.beakerMaxVolume}} Units +
+ {{#each adata.beakerContents}} + {{Math.fixed(volume, 2)}} units of {{name}}
+ {{else}} + Beaker Empty + {{/each}} + {{else}} + No Beaker + {{/if}} +
+
diff --git a/tgui/scripts/interfaces/chem_heater.ract b/tgui/scripts/interfaces/chem_heater.ract new file mode 100644 index 00000000000..1f704af036e --- /dev/null +++ b/tgui/scripts/interfaces/chem_heater.ract @@ -0,0 +1,29 @@ + + + {{data.isActive ? "On" : "Off"}} + + + {{Math.round(adata.targetTemp)}} K + + + + {{#partial button}} + Eject + {{/partial}} + + {{#if data.isBeakerLoaded}} + Temperature: {{Math.round(adata.currentTemp)}} K +
+ {{#each adata.beakerContents}} + {{Math.fixed(volume, 2)}} units of {{name}}
+ {{else}} + Beaker Empty + {{/each}} + {{else}} + No Beaker + {{/if}} +
+
diff --git a/tgui/scripts/interfaces/cryo.ract b/tgui/scripts/interfaces/cryo.ract new file mode 100644 index 00000000000..babf4ea4d44 --- /dev/null +++ b/tgui/scripts/interfaces/cryo.ract @@ -0,0 +1,68 @@ + + + + + {{data.occupant.name ? data.occupant.name : "No Occupant"}} + + {{#if data.hasOccupant}} + + {{data.occupant.stat == 0 ? "Conscious" : data.occupant.stat == 1 ? "Unconcious" : "Dead"}} + + + {{Math.round(adata.occupant.bodyTemperature)}} K + + + {{Math.round(adata.occupant.health)}} + + {{#each [{label: "Brute", type: "bruteLoss"}, {label: "Respiratory", type: "oxyLoss"}, {label: "Toxin", type: "toxLoss"}, {label: "Burn", type: "fireLoss"}]}} + + {{Math.round(adata.occupant[type])}} + + {{/each}} + {{/if}} + + + + {{data.isOperating ? "On" : "Off"}} + + + {{Math.round(adata.cellTemperature)}} K + + + {{data.isOpen ? "Open" : "Closed"}} + {{data.autoEject ? "Auto" : "Manual"}} + + + + {{#partial button}} + Eject + {{/partial}} + + {{#if data.isBeakerLoaded}} + {{#each adata.beakerContents}} + {{Math.fixed(volume, 2)}} units of {{name}}
+ {{else}} + Beaker Empty + {{/each}} + {{else}} + No Beaker + {{/if}} +
+
diff --git a/tgui/scripts/interfaces/error.ract b/tgui/scripts/interfaces/error.ract new file mode 100644 index 00000000000..1776e064959 --- /dev/null +++ b/tgui/scripts/interfaces/error.ract @@ -0,0 +1,3 @@ + + The requested interface ({{config.interface}}) was not found. Does it exist? + diff --git a/tgui/scripts/interfaces/smes.ract b/tgui/scripts/interfaces/smes.ract new file mode 100644 index 00000000000..b7d48589ae9 --- /dev/null +++ b/tgui/scripts/interfaces/smes.ract @@ -0,0 +1,69 @@ + + + + + {{Math.fixed(adata.capacityPercent)}}% + + + + + {{data.inputAttempt ? "Auto" : "Off"}} +   + [{{data.capacityPercent >= 100 ? "Fully Charged" : data.inputting ? "Charging" : "Not Charging"}}] + + + {{Math.round(adata.inputLevel)}}W + + + + + Set + + + + + {{Math.round(adata.inputAvailable)}}W + + + + + {{data.outputAttempt ? "On" : "Off"}} +   + [{{data.outputting ? "Sending" : data.charge > 0 ? "Not Sending" : "No Charge"}}] + + + {{Math.round(adata.outputLevel)}}W + + + + + Set + + + + + {{Math.round(adata.outputUsed)}}W + + diff --git a/tgui/scripts/interfaces/solar_control.ract b/tgui/scripts/interfaces/solar_control.ract new file mode 100644 index 00000000000..852cc0474fb --- /dev/null +++ b/tgui/scripts/interfaces/solar_control.ract @@ -0,0 +1,46 @@ + + + {{Math.round(adata.generated)}}W + + + {{Math.round(adata.angle)}}° ({{data.direction}}) + + + 15° + + + 15° + + + + + Off + Timed + Auto + + + {{Math.round(adata.tracking_rate)}}°/h ({{data.rotating_way}}) + + + 180° + 30° + + + 30° + 180° + + + + {{#partial button}} + Refresh + {{/partial}} + + {{data.connected_tracker ? "" : "Not "}}Found + + + {{Math.round(adata.connected_panels)}} Panels Connected + + diff --git a/tgui/scripts/interfaces/space_heater.ract b/tgui/scripts/interfaces/space_heater.ract new file mode 100644 index 00000000000..b96a56b1ef0 --- /dev/null +++ b/tgui/scripts/interfaces/space_heater.ract @@ -0,0 +1,51 @@ + + + + {{#partial button}} + {{#if data.open}} + Eject + {{/if}} + {{/partial}} + + {{data.on ? "On" : "Off"}} + + + {{#if data.hasPowercell}} + {{Math.fixed(adata.powerLevel)}}% + {{else}} + No Cell + {{/if}} + + + + + {{Math.round(adata.currentTemp)}}°C + + + {{Math.round(adata.targetTemp)}}°C + + {{#if data.open}} + + + + Set + + + + {{/if}} + + {{#if data.open}} + Heat + Cool + Auto + {{else}} + {{text.titleCase(data.mode)}} + {{/if}} + + diff --git a/tgui/scripts/interfaces/tanks.ract b/tgui/scripts/interfaces/tanks.ract new file mode 100644 index 00000000000..87b6b1b3030 --- /dev/null +++ b/tgui/scripts/interfaces/tanks.ract @@ -0,0 +1,36 @@ + + + + The regulator {{data.hasHoldingTank ? "is" : "is not"}} connected to a mask. + + + + {{Math.round(adata.tankPressure)}} kPa + + + {{Math.round(adata.releasePressure)}} kPa + + + Reset + Min + Set + Max + + + {{data.valveOpen ? "Open" : "Closed"}} + + diff --git a/tgui/scripts/main.coffee b/tgui/scripts/main.coffee new file mode 100644 index 00000000000..9274c34c689 --- /dev/null +++ b/tgui/scripts/main.coffee @@ -0,0 +1,31 @@ +require "ie8" +require "dom4" +require "es5-shim" +require "html5shiv" +require "./math" + + +Ractive = require "ractive" +# Set Ractive debug mode based on if we're minified or not. +Ractive.DEBUG = /minified/.test (minified) -> + +WebFont = require "webfontloader" +# Load FontAwesome asynchronously from CDNJS. +WebFont.load + custom: + families: ["FontAwesome"] + urls: ["https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css"] + +tgui = require "./tgui" +# Create the UI; this is just a Ractive component. +window.tgui = new tgui + el: "#container" + data: -> + data = JSON.parse document.getElementById("data").textContent # Load initial data from the server. + alert "Initial data did not load correctly." if not data? or not (data.data? and data.config?) + data.adata = data.data # Spoof animated data as this is the first load. + data + onrender: -> + @observe "config.style", (newkey, oldkey, keypath) -> # Change body style to match config. + document.body.classList.remove oldkey if oldkey? + document.body.classList.add newkey if newkey? diff --git a/tgui/scripts/math.coffee b/tgui/scripts/math.coffee new file mode 100644 index 00000000000..7bb7000110c --- /dev/null +++ b/tgui/scripts/math.coffee @@ -0,0 +1,9 @@ +# Extensions to the built-in 'Math' object. + +# Helper to limit a number to be inside 'min' and 'max'. +Math.clamp = (number, min, max) -> + Math.max min, Math.min number, max + +# Helper to round a number to 'decimals' decimals. +Math.fixed = (number, decimals = 1) -> + Number Math.round(number + "e" + decimals) + "e-" + decimals diff --git a/tgui/scripts/text.coffee b/tgui/scripts/text.coffee new file mode 100644 index 00000000000..cb41507316f --- /dev/null +++ b/tgui/scripts/text.coffee @@ -0,0 +1,5 @@ +module.exports = + upperCaseFirst: (str) -> + str[0].toUpperCase() + str[1..].toLowerCase() + titleCase: (str) -> + str.replace /\w\S*/g, @upperCaseFirst diff --git a/tgui/scripts/tgui.ract b/tgui/scripts/tgui.ract new file mode 100644 index 00000000000..2d8d265188a --- /dev/null +++ b/tgui/scripts/tgui.ract @@ -0,0 +1,35 @@ + + + + + +{{{config.title}}} +
+ +
+ diff --git a/tgui/styles/components/bar.styl b/tgui/styles/components/bar.styl new file mode 100644 index 00000000000..c55738dac5c --- /dev/null +++ b/tgui/styles/components/bar.styl @@ -0,0 +1,28 @@ +.bar + display: inline-block + position: relative + vertical-align: middle + width: 100% + height: 20px + line-height: 17px + padding: 1px + + border: 1px solid colors.normal + background: colors.dark + + .barText + @extend $fontReset + position: absolute + top: 0 + right: 3px + + .barFill + display: block + height: 100% + + transition: background-color 1s + background-color: colors.normal + &.good { background-color: colors.good } + &.average { background-color: colors.average } + &.bad { background-color: colors.bad } + &.highlight { background-color: colors.highlight } diff --git a/tgui/styles/components/button.styl b/tgui/styles/components/button.styl new file mode 100644 index 00000000000..b65bdbdd153 --- /dev/null +++ b/tgui/styles/components/button.styl @@ -0,0 +1,30 @@ +span.button + @extend $fontReset + display: inline-block + vertical-align: middle + height: 20px + line-height: 19px + padding: 0 5px + white-space: nowrap + + .fa + padding-right: 2px + + transition: background-color 0.25s, box-shadow 0.25s + &.normal + background-color: colors.normal + &:hover, &:focus + outline: 0 + box-shadow: inset 0 0 100px 100px alpha(#fff, colors.hover) + &.disabled + background-color: colors.disabled + &.selected + background-color: colors.selected + &.caution + background-color: colors.caution + &.danger + background-color: colors.danger + + &.gridable + width: 125px + margin: 2px 0 diff --git a/tgui/styles/components/display.styl b/tgui/styles/components/display.styl new file mode 100644 index 00000000000..1201c07e62c --- /dev/null +++ b/tgui/styles/components/display.styl @@ -0,0 +1,26 @@ +div.display + width: 100% + padding: 4px + margin: 6px 0 + + background-color: alpha(#000, 0.33) // Transparent background. + box-shadow: inset 0 0 5px alpha(#000, 0.5) + + header + display: block + position: relative + width: 100% + padding: 0 4px + margin-bottom: 6px + + border-bottom: 2px solid colors.rule + + .button + position: absolute + bottom: 6px + right: 4px + + article + display: table + width: 100% + border-spacing: 4px 6px diff --git a/tgui/styles/components/notice.styl b/tgui/styles/components/notice.styl new file mode 100644 index 00000000000..76c9b6b3580 --- /dev/null +++ b/tgui/styles/components/notice.styl @@ -0,0 +1,27 @@ +@require "display" + +$noticeStripes + background-color: colors.notice1 // Fallback for old browers. + background-image: repeating-linear-gradient( + -45deg, + colors.notice1, + colors.notice1 10px, + colors.notice2 10px, + colors.notice2 20px + ) + +div.notice + @extend div.display, $noticeStripes + margin: 8px 0 + + box-shadow: none + + color: colors.textinverse + font-weight: bold + font-style: italic + + .button + outline: 1px solid colors.border + + .label + color: colors.textinverse diff --git a/tgui/styles/components/resize.styl b/tgui/styles/components/resize.styl new file mode 100644 index 00000000000..74cc43c0a0a --- /dev/null +++ b/tgui/styles/components/resize.styl @@ -0,0 +1,12 @@ +div.resize + position: fixed + bottom: 0 + right: 0 + width: 0 + height: 0 + + border-style: solid; + border-width: 0 0 45px 45px; + border-color: transparent transparent colors.resize transparent + + transform: rotate(360deg) diff --git a/tgui/styles/components/section.styl b/tgui/styles/components/section.styl new file mode 100644 index 00000000000..0ba06f8cc56 --- /dev/null +++ b/tgui/styles/components/section.styl @@ -0,0 +1,33 @@ +$cell + display: table-cell + margin: 0 + text-align: left + vertical-align: middle + +section + display: table-row + width: 100% + padding: 3px 0 + + &:not(first-child) + padding-top: 4px + + .label + @extend $cell + width: 1% + padding-right: 32px + white-space: nowrap + + color: colors.label + + .content + @extend $cell + &:not(:last-child) + padding-right: 16px + + .line + @extend $cell + width: 100% + + .buttoninfo + margin-left: 5px diff --git a/tgui/styles/components/subdisplay.styl b/tgui/styles/components/subdisplay.styl new file mode 100644 index 00000000000..d4d20c96ee3 --- /dev/null +++ b/tgui/styles/components/subdisplay.styl @@ -0,0 +1,9 @@ +div.subdisplay + width: 100% + margin: 0 + + header + @extend div.display header + + article + @extend div.display article diff --git a/tgui/styles/components/titlebar.styl b/tgui/styles/components/titlebar.styl new file mode 100644 index 00000000000..685a34e80db --- /dev/null +++ b/tgui/styles/components/titlebar.styl @@ -0,0 +1,46 @@ +$titleButton + display: inline-block + position: relative + padding: 7px // To make a bigger clickable area. + margin: -7px + + color: colors.title; + + &:hover + color: lighten(colors.title, colors.hover) + +header.titlebar + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 32px; + + background-color: colors.titlebar + box-shadow: 0 3px 3px alpha(#000, 0.1) + + .statusicon + position: absolute + top: 4px + left: 12px + transition: color 0.5s + + .title + position: absolute + top: 6px + left: 46px + + color: colors.title + font-size: 16px + white-space: nowrap + + .minimize + @extend $titleButton + position: absolute + top: 6px + right: 46px + .close + @extend $titleButton + position: absolute + top: 4px + right: 12px diff --git a/tgui/styles/config.styl b/tgui/styles/config.styl new file mode 100644 index 00000000000..0eb68db8a9e --- /dev/null +++ b/tgui/styles/config.styl @@ -0,0 +1,8 @@ +@charset "utf-8" + +// Fonts +font = Verdana, Geneva, sans-serif +fontsize = 12px + +// Colors +colors = json("../colors.json", {hash: true}) diff --git a/tgui/styles/core/clearfix.styl b/tgui/styles/core/clearfix.styl new file mode 100644 index 00000000000..80f65910db0 --- /dev/null +++ b/tgui/styles/core/clearfix.styl @@ -0,0 +1,5 @@ +$clearfix + &:after + content: "" + display: table + clear: both diff --git a/tgui/styles/core/colors.styl b/tgui/styles/core/colors.styl new file mode 100644 index 00000000000..ae588547b89 --- /dev/null +++ b/tgui/styles/core/colors.styl @@ -0,0 +1,14 @@ +.normal + color: colors.normal +.good + color: colors.good +.average + color: colors.average +.bad + color: colors.bad +.highlight + color: colors.highlight +.label + color: colors.label +.dark + color: colors.dark diff --git a/tgui/styles/core/document.styl b/tgui/styles/core/document.styl new file mode 100644 index 00000000000..ba2822cad88 --- /dev/null +++ b/tgui/styles/core/document.styl @@ -0,0 +1,32 @@ +html + box-sizing: border-box + min-height: 100% + margin: 0 + + cursor: default // Reset the cursor. + +// This really should be the default. +*, *:before, *:after + box-sizing: inherit + +body + min-height: 100% + height: 100% + margin: 0 6px + + background-color: colors.background-end; // Fallback for old browsers. + + font-family: font + font-size: fontsize + color: colors.text + +main + display: block + margin-top: 32px + padding-top: 3px + + +hr + height: 2px + background-color: colors.rule + border: none diff --git a/tgui/styles/core/header.styl b/tgui/styles/core/header.styl new file mode 100644 index 00000000000..cd3f7c85368 --- /dev/null +++ b/tgui/styles/core/header.styl @@ -0,0 +1,16 @@ +$h + display: inline-block + margin: 0 + padding: 6px 0 +h1 + @extend $h + font-size: fontsize + 6px +h2 + @extend $h + font-size: fontsize + 4px +h3 + @extend $h + font-size: fontsize + 2px +h4 + @extend $h + font-size: fontsize diff --git a/tgui/styles/core/text.styl b/tgui/styles/core/text.styl new file mode 100644 index 00000000000..62541c38381 --- /dev/null +++ b/tgui/styles/core/text.styl @@ -0,0 +1,17 @@ +// Helper to reset font options to default. +$fontReset + color: colors.text + font-size: fontsize + font-weight: normal + font-style: normal + text-decoration: none + +// Utility classes to set font styles. +.bold + font-weight: bold +.italic + font-style: italic + +// Make 'unselectable' text unselectable on all browsers. +[unselectable] + user-select: none diff --git a/tgui/styles/main.styl b/tgui/styles/main.styl new file mode 100644 index 00000000000..400ea3a6432 --- /dev/null +++ b/tgui/styles/main.styl @@ -0,0 +1,5 @@ +@require "config" + +@require "core/*" +@require "components/*" +@require "styles/*" diff --git a/tgui/styles/styles/generic.styl b/tgui/styles/styles/generic.styl new file mode 100644 index 00000000000..ff2bf29a7e3 --- /dev/null +++ b/tgui/styles/styles/generic.styl @@ -0,0 +1,4 @@ +body.generic + background: linear-gradient(to bottom, + colors.background-start 0%, + colors.background-end 100%) diff --git a/tgui/styles/styles/nanotrasen.styl b/tgui/styles/styles/nanotrasen.styl new file mode 100644 index 00000000000..0625ef88dff --- /dev/null +++ b/tgui/styles/styles/nanotrasen.styl @@ -0,0 +1,5 @@ +body.nanotrasen + background: data-url('nanotrasen.svg') no-repeat fixed center/70% 70%, + linear-gradient(to bottom, + colors.background-start 0%, + colors.background-end 100%) diff --git a/tgui/tgui.html b/tgui/tgui.html new file mode 100644 index 00000000000..162a31592b3 --- /dev/null +++ b/tgui/tgui.html @@ -0,0 +1,34 @@ + + + + + + + + + + +
+
Loading...
+
+ + + +