From 41b45396f49769fab0c4157cc71232e8b32006c1 Mon Sep 17 00:00:00 2001 From: Erthilo Date: Tue, 29 May 2012 01:45:03 +0100 Subject: [PATCH] TG: Added a new logging system that can be used for various things in the game (such as the singularity engine, AI interactions, anything-else that may be suggested to me :P). At the moment it only logs some singularity things. Please let me know if there are any important methods of singulo-grief which I may have missed. The "Investigate" verb is available to everyone of rank "Admin observer" and upwards. Just type "Investigate" and select the subject you'd like to see logs for. Typing "Investigate singulo" will also work as a shortcut. Revision: r3679 Author: elly1...@rocketmail.com TG: Disposal/Pipe Dispenser can no longer be used 'remotely' or while stunned or while they are unwrenched. Fixes issue 517 . Can no longer eject the nuke disk from the nuke while stunned. Fixes issue 497 . PA can now be powered down again. Cyborg 'skull' masks now have east and west facing sprites. Fixes issue 468 . - I encourage anyone with actual spriting skills to redo them though, I just spent 5 second in photoshop whipping these up. (icons/mob/mask.dmi the icon labeled 'Death') Revision: r3681 Author: johnsonmt88 --- baystation12.dme | 2 + code/game/cellautomata.dm | 4 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 5 +- code/game/objects/storage/backpack.dm | 1 + code/modules/admin/admin_investigate.dm | 43 ++++++++ code/modules/admin/admin_verbs.dm | 4 +- code/modules/power/singularity/collector.dm | 96 +++++++++--------- code/modules/power/singularity/emitter.dm | 26 +++-- .../power/singularity/field_generator.dm | 24 +++-- code/modules/power/singularity/investigate.dm | 4 + .../particle_accelerator.dm | 39 +++---- .../particle_accelerator/particle_control.dm | 63 ++++++------ code/modules/power/singularity/singularity.dm | 58 +++++------ code/modules/power/smes.dm | 2 +- code/modules/research/rdconsole.dm | 22 ++-- icons/mob/mask.dmi | Bin 21102 -> 21135 bytes 17 files changed, 229 insertions(+), 166 deletions(-) create mode 100644 code/modules/admin/admin_investigate.dm create mode 100644 code/modules/power/singularity/investigate.dm diff --git a/baystation12.dme b/baystation12.dme index 1da6e16ab99..62204e566d4 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -791,6 +791,7 @@ #include "code\js\byjax.dm" #include "code\js\menus.dm" #include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_memo.dm" #include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\banjob.dm" @@ -1082,6 +1083,7 @@ #include "code\modules\power\singularity\emitter.dm" #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" #include "code\modules\power\singularity\singularity.dm" #include "code\modules\power\singularity\particle_accelerator\particle.dm" #include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm index 71b46fe5bf5..3e7bc8a0977 100644 --- a/code/game/cellautomata.dm +++ b/code/game/cellautomata.dm @@ -85,13 +85,13 @@ src.load_motd() src.load_rules() src.load_admins() + investigate_reset() if (config.usealienwhitelist) load_alienwhitelist() if (config.usewhitelist) load_whitelist() LoadBansjob() src.update_status() - makepowernets() sun = new /datum/sun() @@ -196,4 +196,4 @@ /obj/effect/decal/point/point() set src in oview() set hidden = 1 - return + return \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index c744d9fd1e3..42ae74c5cae 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -79,7 +79,7 @@ /obj/machinery/nuclearbomb/Topic(href, href_list) ..() - if (usr.stat || usr.restrained()) + if (!usr.canmove || usr.stat || usr.restrained()) return if (!ishuman(usr)) usr << "\red You don't have the dexterity to do this!" diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 20323f858ea..53365eea928 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -44,7 +44,7 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..()) return - if(unwrenched) + if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=pipedispenser") return usr.machine = src @@ -135,6 +135,9 @@ usr.machine = src src.add_fingerprint(usr) if(href_list["dmake"]) + if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + usr << browse(null, "window=pipedispenser") + return if(!wait) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new (src.loc) diff --git a/code/game/objects/storage/backpack.dm b/code/game/objects/storage/backpack.dm index a6eb10e6fe7..7e5b3ff895f 100644 --- a/code/game/objects/storage/backpack.dm +++ b/code/game/objects/storage/backpack.dm @@ -47,6 +47,7 @@ return /* Remove these comments to re-enable BoH BoH Singuloths.-Hawk. if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) + investigate_log("has become a singularity. Caused by [user.key]","singulo") user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!" del(W) var/obj/machinery/singularity/singulo = new /obj/machinery/singularity (get_turf(src)) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm new file mode 100644 index 00000000000..4f2956cf9bf --- /dev/null +++ b/code/modules/admin/admin_investigate.dm @@ -0,0 +1,43 @@ +//By Carnwennan + +//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game. +//lists and variables are great. However, they have several major flaws: +//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches. +//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that +//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine! +#define INVESTIGATE_DIR "data/investigate/" + +//SYSTEM +/proc/investigate_subject2file(var/subject) + switch(subject) + if("singulo") + return file("[INVESTIGATE_DIR]singulo.html") + if("silicon") + return file("[INVESTIGATE_DIR]silicon.html") + else + return + +/proc/investigate_reset() + if(fdel(INVESTIGATE_DIR)) return 1 + return 0 + +/atom/proc/investigate_log(var/message, var/subject) + if(!message) return + var/F = investigate_subject2file(subject) + if(!F) return + F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
" + + + +//ADMINVERBS +/client/proc/investigate_show( subject in list("singulo","silicon") ) + set name = "Investigate" + set category = "Admin" + if(!holder) return + var/F = investigate_subject2file(subject) + if(!F) + src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + return + src << browse(F,"window=investigate;size=800x300") + + diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 733d6c1bccf..bc32786d082 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -105,6 +105,7 @@ //Admin Observer if (holder.level >= -1) + verbs += /client/proc/investigate_show verbs += /client/proc/cmd_admin_say verbs += /client/proc/cmd_admin_gib_self verbs += /client/proc/deadmin_self @@ -423,10 +424,11 @@ verbs -= /client/proc/deadmin_self verbs -= /client/proc/jumptocoord verbs -= /client/proc/everyone_random - verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs + verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs verbs -= /client/proc/getserverlog verbs -= /client/proc/cinematic //show a cinematic sequence verbs -= /client/proc/admin_memo + verbs -= /client/proc/investigate_show verbs -= /client/proc/cmd_admin_change_custom_event verbs -= /client/proc/admin_invis verbs -= /client/proc/callprocgen diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 8a4514cfee7..a00d1940f41 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -9,16 +9,16 @@ directwired = 1 req_access = list(access_engine) // use_power = 0 - var - obj/item/weapon/tank/plasma/P = null - last_power = 0 - active = 0 - locked = 0 - drainratio = 1 + var/obj/item/weapon/tank/plasma/P = null + var/last_power = 0 + var/active = 0 + var/locked = 0 + var/drainratio = 1 process() if(P) if(P.air_contents.toxins <= 0) + investigate_log("out of fuel.","singulo") P.air_contents.toxins = 0 eject() else @@ -32,6 +32,7 @@ toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") + investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") return else user << "\red The controls are locked!" @@ -96,48 +97,47 @@ return ..() - proc - eject() - var/obj/item/weapon/tank/plasma/Z = src.P - if (!Z) - return - Z.loc = get_turf(src) - Z.layer = initial(Z.layer) - src.P = null - if(active) - toggle_power() - else - updateicon() - - receive_pulse(var/pulse_strength) - if(P && active) - var/power_produced = 0 - power_produced = P.air_contents.toxins*pulse_strength*20 - add_avail(power_produced) - last_power = power_produced - return + proc/eject() + locked = 0 + var/obj/item/weapon/tank/plasma/Z = src.P + if (!Z) return - - - updateicon() - overlays = null - if(P) - overlays += image('singularity.dmi', "ptank") - if(stat & (NOPOWER|BROKEN)) - return - if(active) - overlays += image('singularity.dmi', "on") - - - toggle_power() - active = !active - if(active) - icon_state = "ca_on" - flick("ca_active", src) - - else - icon_state = "ca" - flick("ca_deactive", src) + Z.loc = get_turf(src) + Z.layer = initial(Z.layer) + src.P = null + if(active) + toggle_power() + else updateicon() - return + + proc/receive_pulse(var/pulse_strength) + if(P && active) + var/power_produced = 0 + power_produced = P.air_contents.toxins*pulse_strength*20 + add_avail(power_produced) + last_power = power_produced + return + return + + + proc/updateicon() + overlays = null + if(P) + overlays += image('singularity.dmi', "ptank") + if(stat & (NOPOWER|BROKEN)) + return + if(active) + overlays += image('singularity.dmi', "on") + + + proc/toggle_power() + active = !active + if(active) + icon_state = "ca_on" + flick("ca_active", src) + else + icon_state = "ca" + flick("ca_deactive", src) + updateicon() + return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e8ce8d4a364..cb11bdeb6b5 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -11,16 +11,15 @@ idle_power_usage = 10 active_power_usage = 300 - var - frequency = 1 - active = 0 - fire_delay = 100 - last_shot = 0 - shot_number = 0 - state = 0 - locked = 0 - energy = 0 - mega_energy = 0 + var/frequency = 1 + var/active = 0 + var/fire_delay = 100 + var/last_shot = 0 + var/shot_number = 0 + var/state = 0 + var/locked = 0 + var/energy = 0 + var/mega_energy = 0 verb/rotate() @@ -39,6 +38,9 @@ ..() return + Del() + investigate_log("deleted at ([x],[y],[z])","singulo") + ..() update_icon() if (active && !(stat & (NOPOWER|BROKEN))) @@ -55,12 +57,14 @@ src.active = 0 user << "You turn off the [src]." src.use_power = 1 + investigate_log("turned off by [user.key]","singulo") else src.active = 1 user << "You turn on the [src]." src.shot_number = 0 src.fire_delay = 100 src.use_power = 2 + investigate_log("turned on by [user.key]","singulo") update_icon() else user << "\red The controls are locked!" @@ -207,4 +211,4 @@ power_change() ..() update_icon() - return \ No newline at end of file + return diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index ccefe0cf57a..39ef5212feb 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -20,17 +20,16 @@ field_generator power level display anchored = 0 density = 1 use_power = 0 - var - const/num_power_levels = 6 // Total number of power level icon has - Varedit_start = 0 - Varpower = 0 - active = 0 - power = 20 // Current amount of power - state = 0 - warming_up = 0 - list/obj/machinery/containment_field/fields - list/obj/machinery/field_generator/connected_gens - clean_up = 0 + var/const/num_power_levels = 6 // Total number of power level icon has + var/Varedit_start = 0 + var/Varpower = 0 + var/active = 0 + var/power = 20 // Current amount of power + var/state = 0 + var/warming_up = 0 + var/list/obj/machinery/containment_field/fields + var/list/obj/machinery/field_generator/connected_gens + var/clean_up = 0 update_icon() @@ -87,6 +86,8 @@ field_generator power level display "You turn on the [src.name].", \ "You hear heavy droning") turn_on() + investigate_log("activated by [user.key].","singulo") + src.add_fingerprint(user) else user << "The [src] needs to be firmly secured to the floor first." @@ -214,6 +215,7 @@ field_generator power level display for(var/mob/M in viewers(src)) M.show_message("\red The [src.name] shuts down!") turn_off() + investigate_log("ran out of power and deactivated","singulo") src.power = 0 return 0 diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm new file mode 100644 index 00000000000..6389f10707c --- /dev/null +++ b/code/modules/power/singularity/investigate.dm @@ -0,0 +1,4 @@ +/area/engine/engineering/poweralert(var/state, var/source) + if (state != poweralm) + investigate_log("has a power alarm!","singulo") + ..() \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index ed1f0b3e193..fe50a6cec32 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -62,13 +62,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "none" anchored = 0 density = 1 - var - obj/machinery/particle_accelerator/control_box/master = null - construction_state = 0 - reference = null - powered = 0 - strength = null - desc_holder = null + var/obj/machinery/particle_accelerator/control_box/master = null + var/construction_state = 0 + var/reference = null + var/powered = 0 + var/strength = null + var/desc_holder = null end_cap name = "Alpha Particle Generation Array" @@ -151,6 +150,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return + Move() + ..() + if(master && master.active) + master.toggle_power() + investigate_log("was moved whilst active; it powered down.","singulo") + ex_act(severity) switch(severity) if(1.0) @@ -181,9 +186,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin update_icon() switch(construction_state) - if(0) - icon_state="[reference]" - if(1) + if(0,1) icon_state="[reference]" if(2) icon_state="[reference]w" @@ -291,13 +294,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin use_power = 0 idle_power_usage = 0 active_power_usage = 0 - var - construction_state = 0 - active = 0 - reference = null - powered = null - strength = 0 - desc_holder = null + var/construction_state = 0 + var/active = 0 + var/reference = null + var/powered = null + var/strength = 0 + var/desc_holder = null verb/rotate() @@ -376,7 +378,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin del(src) return - proc update_state() return 0 @@ -440,4 +441,4 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin use_power = 1 update_icon() return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 758a27eb4ac..05db10ef9dc 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -11,10 +11,9 @@ active_power_usage = 10000 construction_state = 0 active = 0 - var - list/obj/structure/particle_accelerator/connected_parts - assembled = 0 - parts = null + var/list/obj/structure/particle_accelerator/connected_parts + var/assembled = 0 + var/parts = null New() @@ -48,7 +47,6 @@ if(use_power) icon_state = "[reference]p" else - icon_state = "[reference]c" switch(construction_state) if(0) icon_state = "[reference]" @@ -56,7 +54,7 @@ icon_state = "[reference]" if(2) icon_state = "[reference]w" - if(3) + else icon_state = "[reference]c" return @@ -78,34 +76,34 @@ return if(href_list["togglep"]) src.toggle_power() + investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo") message_admins("[usr] toggled particle accelerator power to [active ? "on" : "off"].") log_admin("[usr] toggled particle accelerator power to [active ? "on" : "off"].") - if(href_list["scan"]) + else if(href_list["scan"]) src.part_scan() - if(href_list["strengthup"]) - src.strength++ + else if(href_list["strengthup"]) + strength++ + if(strength > 2) + strength = 2 + else + investigate_log("increased to [strength] by [usr.key]","singulo") + message_admins("[usr] increased particle accelerator power to [strength].") + log_admin("[usr] increased particle accelerator power to [strength].") for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength++ + part.strength = strength part.update_icon() - if(src.strength > 2) - src.strength = 2 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = 2 - part.update_icon() - message_admins("[usr] increased particle accelerator power to [strength].") - log_admin("[usr] increased particle accelerator power to [strength].") - if(href_list["strengthdown"]) - src.strength-- + + else if(href_list["strengthdown"]) + strength-- + if(strength < 0) + strength = 0 + else + message_admins("[usr] decreased particle accelerator power to [strength].") + log_admin("[usr] decreased particle accelerator power to [strength].") + investigate_log("decreased to [strength] by [usr.key]","singulo") for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength-- + part.strength = strength part.update_icon() - if(src.strength < 0) - src.strength = 0 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = 0 - part.update_icon() - message_admins("[usr] decreased particle accelerator power to [strength].") - log_admin("[usr] decreased particle accelerator power to [strength].") src.updateDialog() src.update_icon() return @@ -123,14 +121,15 @@ process() if(src.active) + //a part is missing! + if( length(connected_parts) < 6 ) + investigate_log("lost a connected part; It powered down.","singulo") + src.toggle_power() + return + //emit some particles for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts) if(PE) PE.emit_particle(src.strength) -// for(var/obj/structure/particle_accelerator/fuel_chamber/PF in connected_parts) -// PF.doshit() -// for(var/obj/structure/particle_accelerator/power_box/PB in connected_parts) -// PB.doshit() - //finish up putting the fuel run and power use things in here return diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 668b969d3f2..4c57ccfec07 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -15,23 +15,22 @@ var/global/list/uneatable = list( layer = 6 unacidable = 1 //Don't comment this out. use_power = 0 - var - current_size = 1 - allowed_size = 1 - contained = 1 //Are we going to move around? - energy = 100 //How strong are we? - dissipate = 1 //Do we lose energy over time? - dissipate_delay = 10 - dissipate_track = 0 - dissipate_strength = 1 //How much energy do we lose? - move_self = 1 //Do we move on our own? - grav_pull = 4 //How many tiles out do we pull? - consume_range = 0 //How many tiles out do we eat - event_chance = 15 //Prob for event each tick - target = null //its target. moves towards the target if it has one - last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing - teleport_del = 0 - last_warning + var/current_size = 1 + var/allowed_size = 1 + var/contained = 1 //Are we going to move around? + var/energy = 100 //How strong are we? + var/dissipate = 1 //Do we lose energy over time? + var/dissipate_delay = 10 + var/dissipate_track = 0 + var/dissipate_strength = 1 //How much energy do we lose? + var/move_self = 1 //Do we move on our own? + var/grav_pull = 4 //How many tiles out do we pull? + var/consume_range = 0 //How many tiles out do we eat + var/event_chance = 15 //Prob for event each tick + var/target = null //its target. moves towards the target if it has one + var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing + var/teleport_del = 0 + var/last_warning New(loc, var/starting_energy = 50, var/temp = 0) //CARN: admin-alert for chuckle-fuckery. @@ -41,6 +40,7 @@ var/global/list/uneatable = list( count = 1 break if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) + investigate_log("was created. [count?"":"No containment fields were active"]","singulo") src.energy = starting_energy if(temp) @@ -93,17 +93,16 @@ var/global/list/uneatable = list( process() - spawn(0) - eat() - dissipate() - check_energy() - if(current_size >= 3) - move() - if(current_size <= 7) - pulse() - if(current_size >= 5) - if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit - event() + eat() + dissipate() + check_energy() + if(current_size >= 3) + move() + if(current_size <= 7) + pulse() + if(current_size >= 5) + if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit + event() return @@ -183,6 +182,7 @@ var/global/list/uneatable = list( consume_range = 4 dissipate = 0 //It cant go smaller due to e loss if(current_size == allowed_size) + investigate_log("grew to size [current_size]","singulo") return 1 else if(current_size < (--temp_allowed_size)) expand(temp_allowed_size) @@ -552,4 +552,4 @@ var/global/list/uneatable = list( consume(X) if(defer_powernet_rebuild != 2) defer_powernet_rebuild = 0 - return \ No newline at end of file + return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fa4b1988f3c..6e4ffec7ed1 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -294,7 +294,7 @@ output += d output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range - + investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo") src.updateUsrDialog() else diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index a309ea13b39..3fac4a86564 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -32,18 +32,17 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole name = "R&D Console" icon_state = "rdcomp" - var - datum/research/files //Stores all the collected research data. - obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk. - obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk. + var/datum/research/files //Stores all the collected research data. + var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk. + var/obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk. - obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer - obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe - obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter + var/obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer + var/obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe + var/obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter - screen = 1.0 //Which screen is currently showing. - id = 0 //ID of the computer (for server restrictions). - sync = 1 //If sync = 0, it doesn't show up on Server Control Console + var/screen = 1.0 //Which screen is currently showing. + var/id = 0 //ID of the computer (for server restrictions). + var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console req_access = list(access_tox) //Data and setting manipulation requires scientist access. @@ -351,6 +350,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, screen = 0.3 linked_lathe.busy = 1 flick("protolathe_n",linked_lathe) + var/key = usr.key //so we don't lose the info during the spawn delay spawn(16) use_power(power) spawn(16) @@ -379,6 +379,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(being_built.build_path) var/obj/new_item = new being_built.build_path(src) + if( new_item.type == /obj/item/weapon/storage/backpack/holding ) + new_item.investigate_log("built by [key]","singulo") new_item.reliability = being_built.reliability if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0) if(being_built.locked) diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 7c834f10c98b92a631e66e2473e7aba88d034f62..79e2ea2368ae2cb7267cee29a78f3d1df9e1414b 100644 GIT binary patch delta 19517 zcmY(r2Rv1O{6Bs~Xc$e|gjA9;l1<7U*&!<{gzSBfA}T9x2wB-%WOIok$=;jni)&uv za_{}WZ=c`q`}_WTJgy%1p7TEUJzlTpYdv2VlSvkpMOOOg1RPWP;0Dia$`=)t31eou z1p|XllX2fhCUIf*Vg7kCSCpF`XBC$5z1ORH#xP!jaB$FauqzVR3UfSXm~Nkb{wX*8 z-S^w_F>1|+gmaiXr^wC=?zjE%kz$XMY*uUjER^c!w&B;+u>X{oE$R#eHC@BM#y}7h zI87}J-icFiz*d=0ZrKo4r~K4!T^5qt=Q(>^NG?M4freW4*Zr?g{)FGU5zQTO>&92# zP?oTtYW7mcGeZ-LwdBA28)#)i$Ckg|4Q7A#_0tUjfnoXn_eisag$4a$*opsrm;`!8 zkp^7yd2aOeeb{=DMBrLa0VHhMdUnofw-yl_AMel_&IqSCosIhT)!Op&8M>d4rEb#x2PizPj*q}kHYqDO+=P7gFCw)UzKQM{qx?dw%{9WnuAY`m0AQT zM6o3w6X3sL0`|RM9z`0k#)^kbIin73xRiO5y`OC#IyyHdAJ+_Pi|+aDt@Sp&BA39| zS5^-7Gr3QWx~~TfuT!;~pw>4wqTROX1CC{g`LWYC^^T7GxG#C5j$29zlP+zn3Ni1) z!jRoH*z32ubif9i7LkKZy~x1OA?7nfNc6f6-@dJ}x0>is+&+fgC~-#Jh+wgkj*DMX z(q73_w&~B;iySzIAmA30a3jmTDHV;^WTwNX8z+Vxr&Ii;u{EbUJ5z>Wbp$G*XJQR3 zSafx`c#tPUk#}6RDAb^~a;qnV#zxJjW&*M6oE`S6?LTx-zOoN|UjLKS@e z)PmF0+UQX#c);_W#Yi}ZkXE-O*{81^GeKm{zueGU0C9T+bL{uq+S%o8@9b1~t{Zi? zL~%FN_>^a>C45mvUSk~?%GWFSv%S#KfO(J;I2#hZz3p0LQm3Dx7`5k5H6Nl;)%l8? z%En_^8N0aHnJ8%Sy7)=Cvcqt(9;~MqyW4N=I{c_49=o9Kwll8=g z<~`x%Abw+U`>BbEJm=AyUOP6nNwgH{$8(W7JANB0MGqg0-*a;JZ4l~~%_G}*T(PW9 z?H=iQ^~XSq2_l$%IQ>LO{P#H}{Al@7Q;tQ6L$r}sQgamF<*cMs=P= z9;-8Rnlg?GpS@DLSf!tWnOfl^t9XazmzYadXBC+fnu>xt7JYXsE-SJI2Bx{Q`XI}W zdZuSH+0J{c&Mr_}*?02zt=?uGIjH4gGmS)8osglGvp%vYPEnDXZq?oM-Oaj8!C{q2 zx4(8*rheh_q<0Gq)18-TgUnESs_)~Su0$i_&V#R($S6lz8Er+W_j{@AvF(mcY+z6! zY0%nRy3Gu>0T$Ux^Q#Z7Zh8JlM$%Go!t(EaK3i2%fqN_xwSW`!N>mUzDensQ1#A8CwlToLDhmaIjzw2_i zd5utr^Vm0KnUvCwD(1x##cipGF&2qu6tlcPsAV^QfNfOs@u|7@Vuaq^z#L8>%`HaQ zX`*_*aL{qJa(Sv`-p)$-6el(6rE~o2&8yINp{%SdruEs$udj+HM)Ny5IHq;r{SA=`v*$$m0{aCV7%J{c2>`&0eddIk3>E^AY8cs~Qc z(=}G%z)1FbL)*6Cwtzr9_d+CldIw@MUsTk2(O=lxX}mR}D|pdnsXZhlt?qRT2bgt5 zMMYPlh{OHEi>QL4A`jB{_4R3+e9e}f_Nip&oon%8e=&OR>g`u_0!|^PyE{MKZMkLi z?JX;vKSS8hKfhwmDgHxGe^5nX5es1n#VJ45-y-w9zaGXrX^wdJsO!aKew{N;{ z-n;=rY_|_HPRUWEnflJWqWYYtlarWK`9kYW=HOAI{hW&#VN*kF;i7V1t;g!X&`|co z#Dqrok=@Q>r%}00gto(M1>aDia;3-4+jHWx!593W!`ML5>JEK`?Qd$Qlm{H9)>((4 z)^w5#3JtmPG8Q!{>yLGYTd3ImdvFV8oOV@hj#E`O>aI!5KeiQLPHehuEIe|(_hMkp zAk>~vt&kvaakb3vchpS^>>>TgKh!<{Zhmf}GpStsm1eT|pi*D(sS7dPMWc;cdzM`H zJz%u1ko~}Q{05QW?7DpPQAeY`HZOxs!V9Ce*HKV8sR=uE>KxuZ+qG?b zsCtW7Oxo{Ai9TG8*aaTt)KB}`Ik0Mj412Btmn<-ei}Okk58GICNFr$bF1XThVtGV3 ze0L^@PFyEPL&Ss#;c*npl|mk9Sa;4Te5osWb(}o_9BmohmiNSqsd~dkB7OtO%)Ngh z&)}ZZ#HZtZ2Gr)s*pDB%Lz^ajz27Z#gL#bC9iJ<_p_83^Je>3mSPDHoJ>{Lay!!g5 zSvuLz54RT@5Dlgg5Xnq0(XyxbA6v->T@w~Hj<2@;^T`5;M*92r@aZDc1|#Fj7tzCQ zsFvT8)To^<2^8XlBsd*$$K&H4+cJUR%c>j?xkxUGuAZLVM74|W)=viH(rbR>%C%gL zU<{VCROIlm{iCDhfeT3k{10YBneLbeRxmf}nv|%t58U&8zc9_%G3`{z4^y;BUDP)< zEv|4FRuRX+sT^dr3W5P)BsB`O~ z^7>{cD@jIO;C2`82uTJtTeiaCjEl)$Q_9k8Vy^RAnnT0Gd)<>|k4lmQD)rX)b%!FM znyPj4T`FjXVPF4-cANS$=drR!+Di$A_!o`Oh&z?vrkM?y1D}G^W^iYKptyt07CJpG zt!V$JE}y2c83Bza@dQ7vRr1Hcw4Izh2?g>{p1qPbSYW`*ULyTx1IG2Dre7n74bc^3 z&mXvz?|?I!QsI7$ISnGEzREK2&yjIqknRCVLnCr_kFKv1X~t~{RG`OCq!Et~lK$IDW9Dd@wk1nP4udiwe{=+)I^d8sb& z(1Fw!jzZLV>DTn^n^xL4G7IP|sLd@-`&yvS^cWkuQQx{8=23U<&u(S&^Oe4=n|ypi zXR;O44Gj|vYu)oU*4Z&%rzd<522JTj=$g}CcgF3&sgJkPIAXv`%SyND zGhf_OvvKJ$!om0MeU^JzEOzl_RKRoMN{bZj14*|1BFdE)d~@WF0p|VZI&T$qM)UBr zdj>cNb6+;Y8SX4*gne^g(N@2X9yzR%G%7l&lYts|ww0AC5*r(vEN!Q+uP=_Mm^Oi7 zFdb_!Ro|W7M@IfDwnaun&-yw=iK$60WhUdhT9$k_g)5)^m6K78Pl>$6YCq34`D#Y# z)tzKV*2v*>p*8)&C+Rqx?;N7&$=9pPw@?1=-b7;V35i2LpWW2~lK%JaGb!Psk@)BY zfXHl#`i0;F;F24QFnv4d>rT82w^gp9M0oA?K8L#hv`iB5>yl5bvMIcFv3-aB-yH?< z(v$05i?vj9sL-@x>;Zni!I`)}9hErh#?}|$pwaiqa=cueqUQTmk%_g0y+ZDGmvC-d z;y!tI4#BCGu6@nhtDDnoXQ5kiK2stPn<L64D~QXDrMVJFiLaI{tEet-$nT8rS+7Uiz#aSRV)s zqzD2(?crIP#zcJ(Q!H=6H}ownGdwtzVqD{tYr0lr#8FGPc5)`=->?sR(6y3_QGG9J zyA?n;K5Kn4cv!XL| zQhd?nCh*>2H%zco7GEtamn&Ng#R##>g-!L?+{o(aNcH)3BVhh` zKE!k3ckJThRWrMIVmt<=)Yn^8Ol-3u}VmqV8;Yhg%Ui5Ojd{h<|~eV5@S zysnN8vQjId<()!?9gT5A?P;Lq2_(Gk%T%VqzbZ1S_6)d zz4dWml(MWl;(Ufe!H!Pc10k9Sh&Yt{fGZZ@H!bH%cc=uja-HjzA%2#|=4r0BF}PDq zi>OaUHnU*pKMlB0cXex}VbHUB2QDJQFYe}vm=Wc=&MCH*z4I&X71DsF!_3mgBge(bjt`RP%U2pmndu zXCc-g(Ts>Tz+tx+aKAs^!2OoNBQdBWr&aWa<~2H*nEf`3{xSX5Zt{=51a;t!4;7mv z9j6qV|D`M%81@{!h?J!fdMwj>U!+h@?vnA5tw5RhgfM>)QWgC4<|KAz{aoLgMn^)WW~D_gT0K=BySj!B_)Lq{>{=}_C;*R(2{-k#t1vag$8aw~&14g& zxx#7;Uh$iuBz+kCn(25ez6!O-9}7U z>{3l~LS#^xk^Kzkannz+e_69|B|9FT_%>1uh&{r-eJG-rVd@LVqkof<@^pf%T%j|}<9eevfhgDPg zZlQDr1ednF!-oA`;Oen85_~&>l{${HHdT*UDF!aqh9X>B&=$P7_-)S`B%4mfBK#gGS#`BHVE+zAjGgBnkB7R zW2#1nN%|=%zr)?WxXHC%qG)Q`TJ`U`F9kU0ndepm)|(*CU6K9g!IKUeTBQ#J=}`~= zQ?evz2Cq|C;q70hV5`nntwB)cwj{)FSoT9L1(r1Y`a}(=r6XyRrW+e4#@|2?hmSYo zajb!<9k<<3p&@QQ!PXu>O~{VUP{^yS)CWkfZ)nIU!R`G!nKS7fGZ|#!bMJ&O;@BIH zGidAsMxcV=4ELX8FwGSeb>cp562+{`LD2H=etGjoQ`FO#Z-fZZZyu}q>cBYX({p?}*-A03$1O6?M@lVx*LoHI-5J3yp+CnX1=3<} zKl!yGh-&8r#q-HpkADbGau?sR6RX+$cC{i{L{xwodK?fSmHKNo&yiVF{6b<u`0LoHD1&BoI5sVWa2TX=g$=COp+Zu3Wi(s%%MPC)Wq3A8o6Nh zgN013jBvl@Fx6SGWEW9yQjFyEh79?NjSZI7SLHshh6)R!5Bz`~Ie6vK3b9kV3uvf~HN10Wqmg;FFqn0fqPW~AY?>?0a29YaGq5IuBehb~bd z231C0_*@73uBLSmxk%(Zu z93ayX9WvY=0yvBNxM&Rx$un$pwIKe1P=D#KAT7A0kuSLfNH16(I`QH1yNAsblT^@m zCGPXr`YXvOI5^G(ThCnxk%mUE-GZk>FT8vBS&92E#Ux$c681MXLnx5u{JY>&_T=;- zG@4g%kQEo9(l;jutKtBS{XcyZ5Vx`nZbq&_8!_6IqN z(e6u#Qd=h55d_W>)_5 zbzblM+wNvL?f$5!r|h8K;5T-o$(e!!YKneIOJ7DiO9j2;rr^jl8POafhXNrAP5Rdm zWYMZ;t|UP#2Lj*7b7{9eo^n%wAbM_vKv;4ngf3|*m<;0hbA@bM79gcYEpF%4Uixxq zudHI=dwq%tgna3`L8QqG>=B*+AyqwroLc6@2gTL~wza+C((A@!(t(?E`jl5l;XDcI zAHtF`0O@-IWcPt61or%DZK99ccdtfJOtx{1@j_&>i9F{|UD&1NxnOPCc{Tbi=}^*+ zX3@p17P)@(BEPY9avVuD%rSQyHwE>s4GUg4Vxb)9G!D%#De~Zjvb3%_m$uwOqM5R# z_bQy^hNaXh{#Z4bM9K+xH3=|Y2o!{8qXg9gRR6b;7?6_K^%N_cun6O#OuMrNwe%pe zl?@tlB_IxF*1OPGata6<%~lL;djJ1U$(tiRcR5r`XtiSI=$t-?f04G^0xaAj`1?}W zQ=Qvp=S0fc&Z5{Y2JH?tV-v6C*d2yuVt~vGNv+nBMkL1(PvqHoC&s}_Xj3uIuVPhy z<6rG_6>7&5kp%+UldA?fS<)7HbquTN7oysZa7;j|8Q=IIquCgdJxr$HMG2d6gPn3` zhoF~-mjg%0#`w>_yI%;Tp>&fUdUW+%TS;YPW*zHY3EPb~cB~LI()nB7d~*Hms2Dk9 zPRB=1N~B7JZ~yH^?=)~q`j8fRw!2DPgT(9O#2!M0EaJ_MWSg6YzeR_ zY2)3(Qbi149Q+`X)f{98Ob4Xuto0z^5+q6zs$aeu5SC1di>=D#w6`(wn%VN8%U<&E zn~b^yHtYNUS-NhXo$G%~2TGHGHQEGvuF*lv(C&}0Ga_*2`SpUk9lZYg82&J@J15Lf z{4gMOYt`ZjYv;Dt->vGLWMnS;7r}pmlQzDu4Mh4iCa9oJ+}3TK4tO2j9016SMQ;W~ z|3flbi6*WyIuT`tUPylqX818S3sb74K#`_4b}l3@Dxk=?$AeCXU&zoo-m<3y;MvO` z(8Z7lPUgQE{lm3d`)fVp3%^{c%!9ZnIqro3(=`6_yfD~5ji@fNo3&T%ZPukX4?y_- zD*W`NBB082l)&hccBDSWa+b7OUlM*Xh&=2pTz$QvDE7p|h;Sw|d-lK8E{yzKoOo|W zITcl^VnWa?Mk#rem?g*Ig0nCdhIB1A$BBf75jwFg@A?v?CTAqsOXL(MBe}$9a-KiymWu6SAo!;Ru1whe&g{%~MX2L9){%#TtmMw5V623mfvs$QJ0M; zS5(+^PZK!cck7Q0^2Uj;*bhIWn8R4VN^5}Z%{Lv${K5(P4~!%?udBe?V*Z?7ygmI93WT~9+f9W!-FKteZ zQ`JP&%$RX9$Im!HKCoENm3+6ZbcE4ZhQjz!KDZ+|{({Svz5e+M2 zapSy=p26UGlS+N?Cry*pY6n3UJpb6``zIM1W zat70tgSvfN`Mr!*329#n%_=6Va8wc4D6GJBrvv403pWJ>G@~uwUwZfOrA``8|GB&BIlM{=n@BxXEoLx zocmD$rz)y=KRzGLsC-y3Ha50fKt#coFP%-1U{)XMUJ=*L_O6LmTgPhQ_XPYT@Dt^G z297e%c|X?f7&hA1#doU4R5mmilMe1jYOW@RVuH2I?@5#DTx+B6~ZU-%W#zEut*p%I+`Oo5Wm0D&D!_LIA;o1v6-t+rv z`9ve~QzRM<*7u)NECWBF9N@{Jhx?>v)BuWNH0q9uiGmj>5*0~X7!l-LW$8@3 z5P6_F2WG_G*4}F^#K0G=w4A?+iQ`h-sNX4G;*}d78WMk3>1iUeL3i`|a*o`gBh!8J zRFv_K1gP-siytciAZaKg9FBJ`eYu2__piu|ydYTB&@ldt z7XBWx(1dHlF?<6VEsV*gbIkdeZTC?R!c($1G?mQ3D?2AAeO1*kOwCeChEoy{6zyTn zx_ezzG2*8=4&hTTd)BGmVFeBr*xirhlBE19YnFzb(R~g?)iVsY|BUQ+J$x%GFk0QR z^1DcG_PNA3-T76s%??oN3tGG%d9R)TtMp7R3n_ruNwx$O@aOi^OWe8s#Z!0aNJg9X ze}R`g^gv%_>EQ=iXO9NM>odGVjVZI-&#kgRqJ)%AW(;_9LQuzR|L1!|&7Z_~+w`}< z4VEBa>$6%4@%y(GBpKPz$4nJXMkT#zb}ED$fVccW|Jg2;+#%Q|a9o*|mCpUUhGsF` z>Zw?sM~zRj0Rp7RpWnQ=YSw)&5aQ@;jbP0HGRV!-7zN;>n)dt6LRgA~tH2{Cr`RII@cb!S>wFTJWK@sden8)L0vVh$gfq!X_l`RxGd(Lyr$r`V-_I8HFwm_DN@ zbz-;Wa7WGJ`(59oWIC&GU1Q_b)uhOu@UvEz%nO?L^(DO42P4Xttkin@IoYCkiC4b# z=IU**1_u0=7SbY*@>+{fW8Cg{ z0y}~u8F{|7ULW`Ca4}&|lXpB$ypaf|Gv~!2VWfB|&?&*pl7Mf8l77H z?!K|qoa#G;_>MWD+}Ab@vy5&1Fu2Ai;QZ2+c=V?`Q=4vVy-R5Qf_tlIHqU-zQPGCO zF<(tgNIn8KOY%pnnqhI=%Oh)}i_^~aPhvhYuL!iQJ+^&vOW+V3sY0%fv@`fk-4}Q|f^gh>xW9A7G9uI%r1J$5wOc6{n z_N9%4Y)}vx^KBG76cqA5*qk5cLkg7FUUrf?w(l>hQTGu2$#6fXM8;G>+u^Dr4?Z;C z-0RggZr{L7RgqD{46aw(I+@~6?+(&Ki_YZ_ThD7$SZ#7S7tjZ6!DRN;;la3N?P28fgr@s~U6AWSql4V-R$N-Hx z%60AD_sy=@bDaCfA(i36t|+|Zyi8|!0mSrGq3)wos)4EZKJvILe-Xc=}&^t zOf}~lN3Y|h^~DGe7wkrANptgqiW{0S888?dZl{Ala3^<$XrO;-{*+?v)|=o0#XckE z*ApCnhg#^Ij4MOZ+=lTA8!+J}eq%gom#|dQSF?(^;2wWM2t(&}ZM8RU9DRuEi5s_{ zNQ^paNj4Q_xY=Dr&_5Xz%11mn?N~Q&$a5Qhia-5Z#I1{*N!YtO#Tj3evrdGk)iwXO zsV$bP`&N^s^)61zUiBNA=;Ygs^h~oe&ep82wtr&Mp^dQro3G>}cdSO9 z{@*t>t$6XR!V;E?=DwEwEpBQ*4Fu4;iCH@NJj(mG3<0f51&kWgC9bKu9wpoeZSrLe z+`d}lI_;hWZ-bP6PKUHfKHry|WhytP;bZ1(bT%WyN_NsSPz%HQ1ks2648MD{Hz7QC zwX@M8A8}{N)8w4gqxgVYT^}ExBZk-9Vn;_dp@Z>W1gE;ecvYYvDIraOUy)x>P*mdM z@d8CDQ}HlH_#lrbKeCgqTJd|kV}~0z&+05y6+c|%m^45CFh;_Ec+zXS=rhZP%yHzE zlnkIeiC!B$brH@yih+9=f~@1a2By1`>r~R*tXIg!M4rcU=fPHKlxJBICx}ySiWQ&Z z_{WA*dTyAZw75_&vqByfd_)?gscs-Jx#JDHm?hFXi{6_N2hFkK3mu~NW_}MeIxb^j zRpD#k;dTT6(vY^BZbfe>kD>HDaPu-j;+w%k4eWqt3|Tc0h`&{9#JE{hRZ&bj8MGcI95c zZ@q%OimKo3?LbqEs8SyAGDV2Pfaw70OTVvhwYgZSwfSC-YAcdv94k_k#7y!=Jr_pb zkF=af97mV&<%kV_JzN|&fK9;vwQIlahKjvn26}oxves$4<&&4|`1a?J5X$cHQw0y* z$}bNibdq2nz3m#X=;^WPa*P041}Dt3cgb^Y&Db-qs6xweb=Z3dw&|a*)&XGI9?_M) z*NDeqb)M}TGkNV*^$&TX9U5@W`1fbU4?i54tu)oBB)EzlYnf28172n$A`(NG&5EH7 zr{I5be5RqwvI@7f0Cc>kPQsH&@C$e%Fd#G($K@YNOnObpXj$nM&s@iALME= z=#u=33cVWpSeV<=@r@|{h>QKK_%$;P4H>b>3_GGY zK23BgzQw%g-JX+t=j)$djF#bQN7Cz4mC0%sA{3HqYikGEzI$Aw zK%-&w=kGyOd==M5doBkCEkvZGbrc_!%+DPTe@-8wnTlx2bd~R-68Iy+tAca0Dirvx z8q*r!UT7My?y*9iXZD-3@o7cAx(_;DR0&KQ(aAn??kz%KWi{aQk^r^>wcm^` zQK=3T5OpK)@eq4;(>#h|sI8v@Mt5iJ|$phxQTLLCUylh1E zRJ7|)z3ID+_4^_7a{=q`G-RB?AvoGSAI`L-`|R*hnM?K$h-rUa`T7L@7)DsfhKB z#0J|a4aWPAOHeNx$Bez~umXrtM`|=yQWhkGEXr19#oBjb_3>L#?Mu_9hpY0D5OBsI z*`ZIn?V2juZLpq0s73ccJK2gj4b)aJE9&L>B5CRU33Dp1n}G&q)n;No^0Y^F6dZJb z#^CnMCEBTGD|HY>-2T4tC!FyC{qf%^ncEA~g?><3A8IeyHHz`e#(HXn5xQD&EPKIC z-D^k0h58Q{2oEOeW+W25)=$OXGG+2*cBgu32`rf$G=OBUk zbY$UBcNM>L@!i9L#LdMJA6Wy;x;9H&?+-uLM;TfV=>0`W_MCN%tfZ#um%X!(fdUleX|Ya zURf2DDx5GJzM*(DP>irQu9lT)JamZ3{PIdZhA7G^v49y9@bmAND=`Mq@zxhS7gjlj zF#C=sCUd>c>!^(L7O1K#^)Z{VO|Bfipp%Q`J#O{Ktx@gPMAc^)R+)Y=f&E-{@06OH zDS?&XgYi?om^XI$eoKvQB`f=h-6c)Jc2 z7jo4dhEOFV#~z9J@>Jh3!m+b|$3Pcb$*F~)!Q!X*l>}mM-w{Ev>zyUGN#M5bBoV<` zFf5nHb*yUuxN+Ud67ev-`$v!;OdtMct0?I2|98}D7x%FvcJ+#Kq$_L2aL&_WP06D! zxyIE;N0V<-2bLP1%jgZu4uQS-o#LZl$#*TktZX}1p};o-c=h2$pK{A=Q^b}V*w&vL zW>?pvbHv@|C2-itpSbyjRNbw&4+6HgHPOQomskHpZ!B-;r^3F|h*61~SJHw|UAK0? zLTit|q~@A;uhy>BAur<56s&H03BM(dbi}P6$_$FuFZdi`X`EL+p2L6i+RJhOGirMi zH+YJ4vu^2a5bN2)31D^7)Q6qoTy6^tvEK@HAkF>LUm zBdY;Ngg{sH7+pPaj*?Eh^C$0WeAs25N-n~}7x+>3;$Ni4#EcwO$_p=H)P2RaOYXb; zNm-G{x)T{1(~dN9m{92|+6E6@vg>0DSKNo&Do_2zkL&J4UDAF2yiw3GrA9YqpzLKj zHy5DECg7v8I)&ox!G(arwC3`?Zt>MyIkmO8w36~J@s6#0yl&{}U;&eB$_lZ)2`NPk zFl&k9ZlCp3NY@?X22mLfxO#)VRZ)jf-~E1$oG*Vdpr3{lfL>TV}=J zok3pBa)Yco^ zlp%gfoGnTsPhzIJn|J1oy1i6=@f)-C;9kPqL^k2Go3OriM-(cX5QFX(<2~HLjn5lG zZxu2$0M{|Q&du>X6^)>2)dtg8iCT=`h~o!4!|KO)TMvrn+5<&0BW&wTcNIht8|cERYYG`!w!leUJRO0&tKeE3cUQsL zK;{|VM>fI@!6|0I$JAJDAaWmF(DY)0j6Ko}TiSqW-~8%Z(JQv3RA6xAx$T^@=XX%g z@Sc)(#r@X}5qjSuhh?>Ook}VWWwgKwT~gM$DAp^lj#?HYm+&)6Fm8~!&-w=0vVrq~ z+h%`kYMmyre{s2&!SnfeHmlKoWiQcBmC08v{W4+iZg;KgPsb`TA>LHyDW|C{SlW=u z>{i1FN0G7;d&lIGUU~X?;D55W&1D-gsM>txUTMRdR@^%t7#tLfbrZPP5ic-&vHVGX z!RjD!>E@l_sV-FwSXAB5lVzJ?UKhI*p9o;J&-ebdWk7&s-_O6*e#9|kVvMM_g_J}! zUMnmE3sHvj^*NmN{>nvLi{~0e`Blv!taXf`86Jhez_at%hhYupvQdz%Cdmy8^Z=Qv zrqdDvVv|-!RuPbIq~9yDU*aY~U1nZILp=xyUE!B7b?6$T^o)X9HqNCaMir07c%4{g z3ItRsYFYgoB%rvn;3CN;%2Q=>GjFbvRjT0&ol>YXCbiykd*x@X?P!%`qXoZjBr=W6 zs%XF`jC(~hRgCjP-f8pHgx*}c=-rhll}nbHSZ5Uhl+SA?#4bajALn<@JKkN{M{%6~ zzu|uSu$i0YtYJ_odY^?7-Ad+=Sv(uUchjI%(uhkVqMK zo_=M15m4J&^>vjlU5a5*zrt0)sAz;=08FMcYRm#A-f{^caMn{?K$}~+Q^Uh3J?V=t z+CKcC1{I(|fEM#=AFZsyKXSnm7{)jBha3h1GP|{=1h~X*IOTJiU(iKRz%u+tR`OAf z;cAN>8=e2|+*Y}=tJ;d*g$cQ*DJ!WanKR8DAWh)Mgt`UN2Lp>IQBq<$dG|DThRCYS zupc^ftmP-_D1OP5W%XG`wP-n;`Dh7~l?Uo5sbaYlwzm5LLm`;a*= zDGLZFuY3ZV!$5tipjt>S$9}?~Bpv@-T>Z5YbYiU)@LS4MX5|GW(5?kxttOMlv`_&! zYOCa8vZY&MV?OQl{gd6$$UBIl=`;m9lvjP04Vliw4qHV(ylQd&9mT%6YO3#3^4;>FQ)ykksmtRIA)v&$qWJ0S z@p|iamGQOPL{qA?+FEhj&6)2Y$D(S$E_j*`pYD;b?kHT8C-v`Jo8K-ti^erh3c4Ih zfD}X6@JR@w=D+rU0$Iw=41-7utar=%vvMI&LhdssKKLC)qS5x}06!w|;{w@rknQB# zi%^}a3a1AiWoAarB?Zd7;^H`N5bM65?L&9)ScU^v+2Kp?bs^sqka=Dqt!xbUl09QN z+_O|>UI&Qv&71{vuasl{JOe}C?TfpzPzHdwD{lJCA1P@nr5KIReqXum0FM6M1Pue8 z9q4muAlq?VJzW5tWT;13KMJau;A^Co0fWl8f!7LU{zl82Ll88HJjcNV2NuRFaaW%b z4Ady3mVI&DByL^>Xep(%kkX(d^t+Yj(UYnES=>2ycF-@R8m+`Fj5PN&Sb9+$@FW=2 z`RVI}PCUNn^p*>7C$b~Vo_GaXEgM=Yc=(u$wLJ@yJ6BEy7gddn0?{LAdur$4tT*d3aBrlq?-8tG~Bo$0*DQ_ z6#^rhiHC&!PHAQNP?~;e))B^|h4E=Zr5NF0P6Tubfj&v$(!D4df;TA2kr=?k(x4%R zvC0IlVt3*ohthbdWgFbFyDK)oPVtfmVKJE&Eg>sh?1yii$!5?i{hhg58RAk)wnt6} z(U~Co;Q;PI4W;Gh|Ms8fVppz|@ZL06zDhwxt$Q`v{Ae!yWYvW02##%K2{0qE&4c|p zN$D*icB?~0i6HppQZBdc_N;W8M61Hk%W+NYY$&_Rwg5#%Rh6o?ptllQmrkZy#H%L2 z<%qKBHefdea|Q;d)0rkpcsW&VY&`DH(E(K|{o0vR1EU zFZ3%|@?jrpJk&B$?3&n#ID0T%QmdJ5z)QLS*8KGbzkS!+^zvX;sAIW~E4jw+>(%5%cYuf1P zd<(UDJLl_HEzled+7<;djri05p1y;r+kovs3l|`~t0DHw@nC`WO@U`o=CY z6&lHnMj{Hd{WLAp(cgJs;OSszx8k0n4!VxpVG!u-=hDiZ>@1fz|799_S{(7FG;N#; zV(u)+ySp^)TR>_={lC3rNE#a7W87+#@5O6MKq-~DXyrJQqzJokzs(PyrIm@<7VLjL zUJ^0FzPr!M!BK=8ZJYu%G6hU5uwPbnq*la}Vq!6wYG-853(1ko8lCeu4Al2BB-;nxjLr`x{s7v z(Vu`Qq5u~s6L6+|HmZw^tL&FcEpRf^L}^ZH=s}>od7vWL>pwl|@*+UMI#Z;^6J%i2 zXst&9u6?@20tyVedxFCI`K&?nn`Eb%vB~5$GKc`uWNe^iGcG!FwA@zWyjL+*U?~Sg zCjALTq*w-Yeb<9C;Mw47tw5i%253_ui82lIJvI1fe7f3F3JRv+l_O^>0EdheS5SvR ztM6iWs&n6HbcV-Hr)W}=GfM1Y0D$EL&ME<-&v*W+PpeMVoIMgxmlhUpE=wP*^lg|r zNAfed^z5(;JNEWTI9Gta1l2~rfSk=$51L~qI%p;$%)&y~kh#ziFdWC-^PZMW8BHDNCE@LeWK7ftC5Y7bUli8+Ok%0xunUb5iE`F`j+XUigm~gTd)G6Wl_q^@f_ZR_)^GN)EvX7k z)BW!y`{Ngch7~(8zAGsLZ!%;WW`E3WNjEfsCAblas?b0JW8n!Gd&Gv6<9M}JOrKGB zWz2auSMHb>bL}CNQV2XY5mf119&Hp9XUHO=2-OmJ%P@uIpltq_`^z<)Si z+P`tJD~PrRXA%l?B>STCY(_R`sZRVtAWnYJ(Ucmjm+`Nr6czr3mwqvF2R`w{I?Jci zMSM)H=v5S1rUSLwdX!lQhmsSdM8ke4k3U1vZ}yf+6k0Ei2g|DK+N)ZhIH9~w)#^Ew^2saBcGRVUJHWs5xhT9Yz0I6;;TU)U!$IUolpG z2e(hwi_M)$ZAY28-r`hhZ`zO2v6k0ulRs=_3el~d_-H)ndnt{ z+YWbzbt&Cy>{JysJD?i^UR~<72S3tD2#G%e)mMiC?!4OCL`^;j=OSr%iVnmlCI^XcJ|NkY7y$`IV$(1$5pCi$FAtS944{IA2%*< zK0(ia!1!4FQv)iP<&bzjuNMMP!v)dVZl7$p5R1cqM@DD<-fhCmPLiSjlIDS?Y?F2kcPOU1vd`zJ=u`A^uL2TZq* z*XG(H)u&Epf_{K`thxmmN4SRAMt#%Lo7VxD{IyRP-5$e+-AfOzLRr0)5zNV?A65WH zK+fxAoU833fw(@Ysl;NyLbbWEY-BC;_dSiily19<{O!9DIiFsKvfWH?|6cj_i4yIY zeEum4PC1o{2hry#ME1^;?{RQ)u;pL$E2v~r89m=Gue?l&Y;n37ai0fi-EXpwEk(Ih zv^GizNl3ucbhm1kaZ}PfJDq-wK2aTJR#`0(5nlku{+C-XbXgARal1?8{jN~&GdL@* z#nYFS{KKj2V$+|)0RdO(sW;i7vd?GboFwCd)?CiYT3csrMgLNH6sqGPD{Fr(cew~F z^tZAlf?g>1@2_)PYg?8lXQX8xK72SDPWBf3dm0L>nuE9V|6eOt|IPFs$G=9XhHYW( z((+Ima!ZSwGE5}KJlsZ-=QVj)T?^OqcXTy*Ot{p{5JJjL9%4;&6(LK?(~2@{lPjsj zZSA_>&bfcW{poYg`|~;H^FHVEdN}X*Iq%Ow`1k1lyp;31D)>oW{etZ0E&#I&m43ZD zyFe$b82*KRqpjGWb)PYJ56F^udcRl`^_eFd#?0Wh=cU4sHTmK1ETReY^6tOuhB6TPO@L`PkqovdVhcd)S&} zqX5LXwO{#1CNP5b?DG_Xm$Frr(Y~O%aM!X#ks`47(KKB|1|2$r-4*Ka2+jFQr@)PG zC^5z>j%Tf=c)K!u^{b)moqMl6F2xcJuohGP>H?jab8kNS7hvH-dcp;`lA~+>R(%h% zmBWD>Z>I34i`q`Dd6MK+c!Vp=&NaWHu|Z+*O~TK@VWW>wyD##{{j;#6-Ks=dVWmj4 z1gjY+R7F?6RKu?@dwR#PpR3=hXcpF6y4LtpMO!PcvtJGBA(FV0#*Q{Ia^GpW*zHnisoX%y}M|Qel#*+4?(#T2z z0$LRIwzt(uV#ZsO$x{u#!50X}U9EeyZep@8vQ$}r*0yg~XXRQ(T05CHu2vW{B_5t( zaB9Otc#;k>g;E)Q)r0cl%PPk$MPK4cqtU*6P9MwbQ3FqBOfyOe3$SY1Nnq=sKhuH) z2F%ZW3^c%IT<_)u8@XK2!1v9LX19Ox7VYuTD1IKL%4W=~0U?Rd5SA#a%QvN88G6kS zsUSd<;6rZ`-_eL0O3dM2*)orJw=;?P%>QI|i*PXC14s2$P4Z{^t(c>s>ic3w#sk4t z1m3LXm~fFe3vsN#hfY#+`S9|b=lUylRxw((IMvM99XI;BpZ%qVhII7nSnnLC=;+(= z%d;E$%Jzi>Zn(oxrt&89zGJ>*eRmavrfM{K=}4F!j+&d>_%{SC50E7HAjx&U-X7Z(w@j6 zY<|z7z^pcb&Ax@c!p)13%BR~OKDxQ>e8{I)Uc8ZMLOtMtT9!s6zAnHM9V2RxIl#FR z4s+$uJ=F5)G35#~8aUW1wIdDBARj#tLiwxoC3A!&_bu^B*5%*ixTTjeZlg{72WBW4 zbGr$kwtk+{(WAiWu|RVb=ln#n&($u}z`K7?NaUok2(QG>uGVOPsKnR^KdzxaADqc# zk1uHXf<*y1G9)kS?UG!?ug%<@O^el*S|?|OM}}iSpnmU;lGGvEL$miP#Wt34k&9b3 zAzIhcH#s{v#31q-kOkvCeVZ32^@at1oYa)|)CpBcm&ghPz(XT3_% zullQK8KZ}vv|_g{fERm5@J*ev~qm8wn-yPY`a`Z-EERZ!Q^`a#|35= z8XAha*LDyFIv1JyJ-Pgt_bhX0$4{q=(j-}9QM%(qYVDR?WL#hVc4#*ETV-8DG$S~e zxcqnW$;4PdS#O|jBu%^KsbAi98R%;Z;!66d4E)iKxfjqq_s>3D=<^3vrx!p09+E%YQY;Z5MGgjafcAt*_cKo?C_-Mnvb2T2?OK@+ z!qgeo&*pHnY`A*@NB8&qQ1MqE;7}W{%0)X4- zam6_V+>W{llUnx6s;(G|9Vfd0%U}x+|0~=@_#mQ@_Kd7?63fG45dbe zs+>!#*8_%oAwOxxgfVf3?_YLS>zdRDkKmC=E0`hzi9~h`gA#T&54~SU4D}WOXGgNb JE&HJKe*x6{J<Elee$gIOu90 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 y{sonj3J