From 6a5c7d7068bbd5d0f619fb6e1aab970e06ae60ce Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sat, 30 Jul 2016 13:45:46 -0700 Subject: [PATCH 01/21] first attempt. partial copy and stuff. --- code/__DEFINES/misc.dm | 30 +- code/modules/jobs/access.dm | 5 +- .../NTNet/NTNRC/conversation.dm | 68 ++ code/modules/modular_computers/NTNet/NTNet.dm | 159 ++++ .../modular_computers/NTNet/NTNet_relay.dm | 130 +++ .../modules/modular_computers/_description.dm | 121 +++ .../computers/item/modular_computer.dm | 780 ++++++++++++++++++ .../computers/item/processor.dm | 133 +++ .../computers/item/tablet.dm | 10 + .../computers/item/tablet_presets.dm | 21 + .../computers/machinery/console_presets.dm | 91 ++ .../computers/machinery/modular_computer.dm | 196 +++++ .../computers/machinery/modular_console.dm | 46 ++ .../computers/machinery/modular_laptop.dm | 110 +++ .../computers/status_icons.dmi | Bin 0 -> 818 bytes .../file_system/computer_file.dm | 39 + .../modular_computers/file_system/data.dm | 20 + .../file_system/news_article.dm | 29 + .../modular_computers/file_system/program.dm | 145 ++++ .../file_system/program_events.dm | 18 + .../file_system/programs/_engineering.dm | 85 ++ .../file_system/programs/_medical.dm | 10 + .../file_system/programs/_program.dm | 31 + .../file_system/programs/antagonist/dos.dm | 105 +++ .../programs/antagonist/revelation.dm | 79 ++ .../file_system/programs/card.dm | 228 +++++ .../file_system/programs/comm.dm | 417 ++++++++++ .../file_system/programs/configurator.dm | 62 ++ .../file_system/programs/file_browser.dm | 241 ++++++ .../file_system/programs/news_browser.dm | 120 +++ .../file_system/programs/ntdownloader.dm | 164 ++++ .../file_system/programs/ntmonitor.dm | 89 ++ .../file_system/programs/ntnrc_client.dm | 230 ++++++ .../file_system/programs/nttransfer.dm | 194 +++++ .../hardware/battery_module.dm | 71 ++ .../modular_computers/hardware/card_slot.dm | 18 + .../modular_computers/hardware/hard_drive.dm | 167 ++++ .../modular_computers/hardware/hardware.dm | 89 ++ .../hardware/nano_printer.dm | 52 ++ .../hardware/network_card.dm | 95 +++ .../hardware/portable_hard_drive.dm | 32 + .../hardware/processor_unit.dm | 41 + .../modular_computers/hardware/tesla_link.dm | 20 + .../modular_computers/laptop_vendor.dm | 296 +++++++ tgstation.dme | 23 + 45 files changed, 5108 insertions(+), 2 deletions(-) create mode 100644 code/modules/modular_computers/NTNet/NTNRC/conversation.dm create mode 100644 code/modules/modular_computers/NTNet/NTNet.dm create mode 100644 code/modules/modular_computers/NTNet/NTNet_relay.dm create mode 100644 code/modules/modular_computers/_description.dm create mode 100644 code/modules/modular_computers/computers/item/modular_computer.dm create mode 100644 code/modules/modular_computers/computers/item/processor.dm create mode 100644 code/modules/modular_computers/computers/item/tablet.dm create mode 100644 code/modules/modular_computers/computers/item/tablet_presets.dm create mode 100644 code/modules/modular_computers/computers/machinery/console_presets.dm create mode 100644 code/modules/modular_computers/computers/machinery/modular_computer.dm create mode 100644 code/modules/modular_computers/computers/machinery/modular_console.dm create mode 100644 code/modules/modular_computers/computers/machinery/modular_laptop.dm create mode 100644 code/modules/modular_computers/computers/status_icons.dmi create mode 100644 code/modules/modular_computers/file_system/computer_file.dm create mode 100644 code/modules/modular_computers/file_system/data.dm create mode 100644 code/modules/modular_computers/file_system/news_article.dm create mode 100644 code/modules/modular_computers/file_system/program.dm create mode 100644 code/modules/modular_computers/file_system/program_events.dm create mode 100644 code/modules/modular_computers/file_system/programs/_engineering.dm create mode 100644 code/modules/modular_computers/file_system/programs/_medical.dm create mode 100644 code/modules/modular_computers/file_system/programs/_program.dm create mode 100644 code/modules/modular_computers/file_system/programs/antagonist/dos.dm create mode 100644 code/modules/modular_computers/file_system/programs/antagonist/revelation.dm create mode 100644 code/modules/modular_computers/file_system/programs/card.dm create mode 100644 code/modules/modular_computers/file_system/programs/comm.dm create mode 100644 code/modules/modular_computers/file_system/programs/configurator.dm create mode 100644 code/modules/modular_computers/file_system/programs/file_browser.dm create mode 100644 code/modules/modular_computers/file_system/programs/news_browser.dm create mode 100644 code/modules/modular_computers/file_system/programs/ntdownloader.dm create mode 100644 code/modules/modular_computers/file_system/programs/ntmonitor.dm create mode 100644 code/modules/modular_computers/file_system/programs/ntnrc_client.dm create mode 100644 code/modules/modular_computers/file_system/programs/nttransfer.dm create mode 100644 code/modules/modular_computers/hardware/battery_module.dm create mode 100644 code/modules/modular_computers/hardware/card_slot.dm create mode 100644 code/modules/modular_computers/hardware/hard_drive.dm create mode 100644 code/modules/modular_computers/hardware/hardware.dm create mode 100644 code/modules/modular_computers/hardware/nano_printer.dm create mode 100644 code/modules/modular_computers/hardware/network_card.dm create mode 100644 code/modules/modular_computers/hardware/portable_hard_drive.dm create mode 100644 code/modules/modular_computers/hardware/processor_unit.dm create mode 100644 code/modules/modular_computers/hardware/tesla_link.dm create mode 100644 code/modules/modular_computers/laptop_vendor.dm diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 794528c3533..e8bc1480d48 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -497,4 +497,32 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define BUBBLEGUM_SCORE "Bubblegum Killed" #define DRAKE_SCORE "Drakes Killed" #define BOSS_SCORE "Bosses Killed" -#define TENDRIL_CLEAR_SCORE "Tendrils Killed" \ No newline at end of file +#define TENDRIL_CLEAR_SCORE "Tendrils Killed" + + + + // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc) +#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet +#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices +#define NTNET_COMMUNICATION 3 // Communication (messaging) +#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc. + +// NTNet transfer speeds, used when downloading/uploading a file/program. +#define NTNETSPEED_LOWSIGNAL 0.025 // GQ/s transfer speed when the device is wirelessly connected and on Low signal +#define NTNETSPEED_HIGHSIGNAL 0.1 // GQ/s transfer speed when the device is wirelessly connected and on High signal +#define NTNETSPEED_ETHERNET 0.5 // GQ/s transfer speed when the device is using wired connection + + +// Program bitflags +#define PROGRAM_ALL 7 +#define PROGRAM_CONSOLE 1 +#define PROGRAM_LAPTOP 2 +#define PROGRAM_TABLET 4 + +#define PROGRAM_STATE_KILLED 0 +#define PROGRAM_STATE_BACKGROUND 1 +#define PROGRAM_STATE_ACTIVE 2 + +// Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it. +#define MAX_NTNET_LOGS 500 +#define MIN_NTNET_LOGS 10 \ No newline at end of file diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 5e59e0da172..6fe7315cbbf 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -64,6 +64,7 @@ /var/const/access_mineral_storeroom = 64 /var/const/access_minisat = 65 /var/const/access_weapons = 66 //Weapon authorization for secbots +/var/const/access_network = 67 //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. @@ -237,7 +238,7 @@ access_hydroponics, access_library, access_lawyer, access_virology, access_cmo, access_qm, access_surgery, access_theatre, access_research, access_mining, access_mailsorting, access_weapons, access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce, - access_keycard_auth, access_tcomsat, access_gateway, access_mineral_storeroom, access_minisat) + access_keycard_auth, access_tcomsat, access_gateway, access_mineral_storeroom, access_minisat, access_network) /proc/get_all_centcom_access() return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_captain) @@ -424,6 +425,8 @@ return "AI Satellite" if(access_weapons) return "Weapon Permit" + if(access_network) + return "Network Access" /proc/get_centcom_access_desc(A) switch(A) diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm new file mode 100644 index 00000000000..d0f7d88d53a --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -0,0 +1,68 @@ +var/global/ntnrc_uid = 0 + +/datum/ntnet_conversation/ + var/id = null + var/title = "Untitled Conversation" + var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator, + var/list/messages = list() + var/list/clients = list() + var/password + +/datum/ntnet_conversation/New() + id = ntnrc_uid + ntnrc_uid++ + if(ntnet_global) + ntnet_global.chat_channels.Add(src) + ..() + +/datum/ntnet_conversation/proc/add_message(var/message, var/username) + message = "[stationtime2text()] [username]: [message]" + messages.Add(message) + trim_message_list() + +/datum/ntnet_conversation/proc/add_status_message(var/message) + messages.Add("[stationtime2text()] -!- [message]") + trim_message_list() + +/datum/ntnet_conversation/proc/trim_message_list() + if(messages.len <= 50) + return + for(var/message in messages) + messages -= message + if(messages <= 50) + return + +/datum/ntnet_conversation/proc/add_client(var/datum/computer_file/program/chatclient/C) + if(!istype(C)) + return + clients.Add(C) + add_status_message("[C.username] has joined the channel.") + // No operator, so we assume the channel was empty. Assign this user as operator. + if(!operator) + changeop(C) + +/datum/ntnet_conversation/proc/remove_client(var/datum/computer_file/program/chatclient/C) + if(!istype(C) || !(C in clients)) + return + clients.Remove(C) + add_status_message("[C.username] has left the channel.") + + // Channel operator left, pick new operator + if(C == operator) + operator = null + if(clients.len) + var/datum/computer_file/program/chatclient/newop = pick(clients) + changeop(newop) + + +/datum/ntnet_conversation/proc/changeop(datum/computer_file/program/chatclient/newop) + if(istype(newop)) + operator = newop + add_status_message("Channel operator status transferred to [newop.username].") + +/datum/ntnet_conversation/proc/change_title(var/newtitle, var/datum/computer_file/program/chatclient/client) + if(operator != client) + return 0 // Not Authorised + + add_status_message("[client.username] has changed channel title from [title] to [newtitle]") + title = newtitle \ No newline at end of file diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm new file mode 100644 index 00000000000..4083147e1cc --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -0,0 +1,159 @@ +var/global/datum/ntnet/ntnet_global = new() + + +// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this. +/datum/ntnet/ + var/list/relays = list() + var/list/logs = list() + var/list/available_station_software = list() + var/list/available_antag_software = list() + var/list/available_news = list() + var/list/chat_channels = list() + var/list/fileservers = list() + // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. + // High values make displaying logs much laggier. + var/setting_maxlogcount = 100 + + // These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections + var/setting_softwaredownload = 1 + var/setting_peertopeer = 1 + var/setting_communication = 1 + var/setting_systemcontrol = 1 + var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status. + + var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled + var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software. + + +// If new NTNet datum is spawned, it replaces the old one. +/datum/ntnet/New() + if(ntnet_global && (ntnet_global != src)) + ntnet_global = src // There can be only one. + for(var/obj/machinery/ntnet_relay/R in machines) + relays.Add(R) + R.NTNet = src + build_software_lists() + build_news_list() + add_log("NTNet logging system activated.") + +// Simplified logging: Adds a log. log_string is mandatory parameter, source is optional. +/datum/ntnet/proc/add_log(var/log_string, var/obj/item/weapon/computer_hardware/network_card/source = null) + var/log_text = "[stationtime2text()] - " + if(source) + log_text += "[source.get_network_tag()] - " + else + log_text += "*SYSTEM* - " + log_text += log_string + logs.Add(log_text) + + if(logs.len > setting_maxlogcount) + // We have too many logs, remove the oldest entries until we get into the limit + for(var/L in logs) + if(logs.len > setting_maxlogcount) + logs.Remove(L) + else + break + +// Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled. +/datum/ntnet/proc/check_function(var/specific_action = 0) + if(!relays || !relays.len) // No relays found. NTNet is down + return 0 + + var/operating = 0 + + // Check all relays. If we have at least one working relay, network is up. + for(var/obj/machinery/ntnet_relay/R in relays) + if(R.is_operational()) + operating = 1 + break + + if(setting_disabled) + return 0 + + if(specific_action == NTNET_SOFTWAREDOWNLOAD) + return (operating && setting_softwaredownload) + if(specific_action == NTNET_PEERTOPEER) + return (operating && setting_peertopeer) + if(specific_action == NTNET_COMMUNICATION) + return (operating && setting_communication) + if(specific_action == NTNET_SYSTEMCONTROL) + return (operating && setting_systemcontrol) + return operating + +// Builds lists that contain downloadable software. +/datum/ntnet/proc/build_software_lists() + available_station_software = list() + available_antag_software = list() + for(var/F in typesof(/datum/computer_file/program)) + var/datum/computer_file/program/prog = new F + // Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program) + if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG") + continue + // Check whether the program should be available for station/antag download, if yes, add it to lists. + if(prog.available_on_ntnet) + available_station_software.Add(prog) + if(prog.available_on_syndinet) + available_antag_software.Add(prog) + +// Builds lists that contain downloadable software. +/datum/ntnet/proc/build_news_list() + available_news = list() + for(var/F in typesof(/datum/computer_file/data/news_article/)) + var/datum/computer_file/data/news_article/news = new F(1) + if(news.stored_data) + available_news.Add(news) + + +// Attempts to find a downloadable file according to filename var +/datum/ntnet/proc/find_ntnet_file_by_name(var/filename) + for(var/datum/computer_file/program/P in available_station_software) + if(filename == P.filename) + return P + for(var/datum/computer_file/program/P in available_antag_software) + if(filename == P.filename) + return P + +// Resets the IDS alarm +/datum/ntnet/proc/resetIDS() + intrusion_detection_alarm = 0 + +/datum/ntnet/proc/toggleIDS() + resetIDS() + intrusion_detection_enabled = !intrusion_detection_enabled + +// Removes all logs +/datum/ntnet/proc/purge_logs() + logs = list() + add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") + +// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks. +/datum/ntnet/proc/update_max_log_count(var/lognumber) + if(!lognumber) + return 0 + // Trim the value if necessary + lognumber = between(MIN_NTNET_LOGS, lognumber, MAX_NTNET_LOGS) + setting_maxlogcount = lognumber + add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.") + +/datum/ntnet/proc/toggle_function(var/function) + if(!function) + return + function = text2num(function) + switch(function) + if(NTNET_SOFTWAREDOWNLOAD) + setting_softwaredownload = !setting_softwaredownload + add_log("Configuration Updated. Wireless network firewall now [setting_softwaredownload ? "allows" : "disallows"] connection to software repositories.") + if(NTNET_PEERTOPEER) + setting_peertopeer = !setting_peertopeer + add_log("Configuration Updated. Wireless network firewall now [setting_peertopeer ? "allows" : "disallows"] peer to peer network traffic.") + if(NTNET_COMMUNICATION) + setting_communication = !setting_communication + add_log("Configuration Updated. Wireless network firewall now [setting_communication ? "allows" : "disallows"] instant messaging and similar communication services.") + if(NTNET_SYSTEMCONTROL) + setting_systemcontrol = !setting_systemcontrol + add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of station's systems.") + + + + + diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm new file mode 100644 index 00000000000..7808af0cbe6 --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -0,0 +1,130 @@ +// Relays don't handle any actual communication. Global NTNet datum does that, relays only tell the datum if it should or shouldn't work. +/obj/machinery/ntnet_relay + name = "NTNet Quantum Relay" + desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." + use_power = 2 + active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. + idle_power_usage = 100 + icon_state = "bus" + anchored = 1 + density = 1 + var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame. + var/enabled = 1 // Set to 0 if the relay was turned off + var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack + var/list/dos_sources = list() // Backwards reference for qdel() stuff + + // Denial of Service attack variables + var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer + var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay + var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time. + + +// TODO: Implement more logic here. For now it's only a placeholder. +/obj/machinery/ntnet_relay/proc/is_operational() + if(stat & (BROKEN | NOPOWER | EMPED)) + return 0 + if(dos_failure) + return 0 + if(!enabled) + return 0 + return 1 + +/obj/machinery/ntnet_relay/update_icon() + if(is_operational()) + icon_state = "bus" + else + icon_state = "bus_off" + +/obj/machinery/ntnet_relay/process() + if(is_operational()) + use_power = 2 + else + use_power = 1 + + if(dos_overload) + dos_overload = max(0, dos_overload - dos_dissipate) + + // If DoS traffic exceeded capacity, crash. + if((dos_overload > dos_capacity) && !dos_failure) + dos_failure = 1 + update_icon() + ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.") + // If the DoS buffer reaches 0 again, restart. + if((dos_overload == 0) && dos_failure) + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") + ..() + +/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = list() + data["enabled"] = enabled + data["dos_capacity"] = dos_capacity + data["dos_overload"] = dos_overload + data["dos_crashed"] = dos_failure + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/ntnet_relay/attack_hand(var/mob/living/user) + ui_interact(user) + +/obj/machinery/ntnet_relay/Topic(href, href_list) + if(..()) + return 1 + if(href_list["restart"]) + dos_overload = 0 + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") + else if(href_list["toggle"]) + enabled = !enabled + ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") + update_icon() + +/obj/machinery/ntnet_relay/New() + uid = gl_uid + gl_uid++ + component_parts = list() + component_parts += new /obj/item/stack/cable_coil(src,15) + component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src) + + if(ntnet_global) + ntnet_global.relays.Add(src) + NTNet = ntnet_global + ntnet_global.add_log("New quantum relay activated. Current amount of linked relays: [NTNet.relays.len]") + ..() + +/obj/machinery/ntnet_relay/Destroy() + if(ntnet_global) + ntnet_global.relays.Remove(src) + ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]") + NTNet = null + for(var/datum/computer_file/program/ntnet_dos/D in dos_sources) + D.target = null + D.error = "Connection to quantum relay severed" + ..() + +/obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open + user << "You [panel_open ? "open" : "close"] the maintenance hatch" + return + if(istype(W, /obj/item/weapon/crowbar)) + if(!panel_open) + user << "Open the maintenance panel first." + return + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "You disassemble \the [src]!" + + for(var/atom/movable/A in component_parts) + A.forceMove(src.loc) + new/obj/machinery/constructable_frame/machine_frame(src.loc) + qdel(src) + return + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/_description.dm b/code/modules/modular_computers/_description.dm new file mode 100644 index 00000000000..2335ce08e73 --- /dev/null +++ b/code/modules/modular_computers/_description.dm @@ -0,0 +1,121 @@ +/* +Program-based computers, designed to replace computer3 project and eventually most consoles on station + + +1. Basic information +Program based computers will allow you to do multiple things from single computer. Each computer will have programs, with more being downloadable from NTNet (stationwide network with wireless coverage) +if user has apropriate ID card access. It will be possible to hack the computer by using an emag on it - the emag will have to be completely new and will be consumed on use, but it will +lift ALL locks on ALL installed programs, and allow download of programs even if your ID doesn't have access to them. Computers will have hard drives that can store files. +Files can be programs (datum/computer_file/program/ subtype) or data files (datum/computer_file/data/ subtypes). Program for sending files will be available that will allow transfer via NTNet. +NTNet coverage will be limited to station's Z level, but better network card (=more expensive and higher power use) will allow usage everywhere. Hard drives will have limited capacity for files +which will be related to how good hard drive you buy when purchasing the laptop. For storing more files USB-style drives will be buildable with Protolathe in research. + +2. Available devices +CONSOLES +Consoles will come in various pre-fabricated loadouts, each loadout starting with certain set of programs (aka Engineering console, Medical console, etc.), of course, more software may be downloaded. +Consoles won't usually have integrated battery, but the possibility to install one will exist for critical applications. Consoles are considered hardwired into NTNet network which means they +will have working coverage on higher speed (Ethernet is faster than Wi-Fi) and won't require wireless coverage to exist. +LAPTOPS +Laptops are middle ground between actual portable devices and full consoles. They offer certain level of mobility, as they can be closed, moved somewhere else and then opened again. +Laptops will by default have internal battery to power them, and may be recharged with rechargers. However, laptops rely on wireless NTNet coverage. Laptop HDDs are also designed with power efficiency +in mind, which means they sacrifice some storage space for higher battery life. Laptops may be dispensed from computer vendor machine, and may be customised before vending. For people which don't +want to rely on internal battery, tesla link exists that connects to APC, if one exists. +TABLETS +Tablets are smallest available devices, designed with full mobility in mind. Tablets have only weak CPU which means the software they can run is somewhat limited. They are also designed with high +battery life in mind, which means the hardware focuses on power efficiency rather than high performance. This is most visible with hard drives which have quite small storage capacity. +Tablets can't be equipped with tesla link, which means they have to be recharged manually. + + +3. Computer Hardware +Computers will come with basic hardware installed, with upgrades being selectable when purchasing the device. +Hard Drive: Stores data, mandatory for the computer to work +Network Card: Connects to NTNet +Battery: Internal power source that ensures the computer operates when not connected to APC. +Extras (those won't be installed by default, but can be bought) +ID Card Slot: Required for HoP-style programs to work. Access for security record-style programs is read from ID of user [RFID?] without requiring this +APC Tesla Relay: Wirelessly powers the device from APC. Consoles have it by default. Laptops can buy it. +Disk Drive: Allows usage of portable data disks. +Nano Printer: Allows the computer to scan paper contents and save them to file, as well as recycle papers and print stuff on it. + +4. NTNet +NTNet is stationwide network that allows users to download programs needed for their work. It will be possible to send any files to other active computers using relevant program (NTN Transfer). +NTNet is under jurisdiction of both Engineering and Research. Engineering is responsible for any repairs if necessary and research is responsible for monitoring. It is similar to PDA messaging. +Operation requires functional "NTNet Relay" which is by default placed on tcommsat. If the relay is damaged NTNet will be offline until it is replaced. Multiple relays bring extra redundancy, +if one is destroyed the second will take over. If all relays are gone it stops working, simple as that. NTNet may be altered via administration console available to Research Director. It is +possible to enable/disable Software Downloading, P2P file transfers and Communication (IC version of IRC, PDA messages for more than two people) + +5. Software +Software would almost exclusively use NanoUI modules. Few exceptions are text editor (uses similar screen as TCS IDE used for editing and classic HTML for previewing as Nano looks differently) +and similar programs which for some reason require HTML UI. Most software will be highly dependent on NTNet to work as laptops are not physically connected to the station's network. +What i plan to add: + +Note: XXXXDB programs will use ingame_manuals to display basic help for players, similar to how books, etc. do + +Basic - Software in this bundle is automagically preinstalled in every new computer + NTN Transfer - Allows P2P transfer of files to other computers that run this. + Configurator - Allows configuration of computer's hardware, basically status screen. + File Browser - Allows you to browse all files stored on the computer. Allows renaming/deleting of files. + TXT Editor - Allows you editing data files in text editor mode. + NanoPrint - Allows you to operate NanoPrinter hardware to print text files. + NTNRC Chat - NTNet Relay Chat client. Allows PDA-messaging style messaging for more than two users. Person which created the conversation is Host and has administrative privilegies (kicking, etc.) + NTNet News - Allows reading news from newscaster network. + +Engineering - Requires "Engineering" access on ID card (ie. CE, Atmostech, Engineer) + Alarm Monitor - Allows monitoring alarms, same as the stationbound one. + Power Monitor - Power monitoring computer, connects to sensors in same way as regular one does. + Atmospheric Control - Allows access to the Atmospherics Monitor Console that operates air alarms. Requires extra access: "Atmospherics" + RCON Remote Control Console - Allows access to the RCON Remote Control Console. Requires extra access: "Power Equipment" + EngiDB - Allows accessing NTNet information repository for information about engineering-related things. + +Medical - Requires "Medbay" access on ID card (ie. CMO, Doctor,..) + Medical Records Uplink - Allows editing/reading of medical records. Printing requires NanoPrinter hardware. + MediDB - Allows accessing NTNet information repository for information about medical procedures + ChemDB - Requires extra access: "Chemistry" - Downloads basic information about recipes from NTNet + +Research - Requires "Research and Development" access on ID card (ie. RD, Roboticist, etc.) + Research Server Monitor - Allows monitoring of research levels on RnD servers. (read only) + Robotics Monitor Console - Allows monitoring of robots and exosuits. Lockdown/Self-Destruct options are unavailable [balance reasons for malf/traitor AIs]. Requires extra access: "Robotics" + NTNRC Administration Console - Allows administrative access to NTNRC. This includes bypassing any channel passwords and enabling "invisible" mode for spying on conversations. Requires extra access: "Research Director" + NTNet Administration Console - Allows remote configuration of NTNet Relay - CAUTION: If NTNet is turned off it won't be possible to turn it on again from the computer, as operation requires NTNet to work! Requires extra access: "Research Director" + NTNet Monitor - Allows monitoring of NTNet and it's various components, including simplified network logs and system status. + +Security - Requires "Security" access on ID card (ie. HOS, Security officer, Detective) + Security Records Uplink - Allows editing/reading of security records. Printing requires Nanoprinter hardware. + LawDB - Allows accessing NTNet information repository for security information (corporate regulations) + Camera Uplink - Allows viewing cameras around the station. + +Command - Requires "Bridge" access on ID card (all heads) + Alertcon Access - Allows changing of alert levels. Red requires activation from two computers with two IDs similar to how those wall mounted devices do. + Employment Records Access - Allows reading of employment records. Printing requires NanoPrinter hardware. + Communication Console - Allows sending emergency messages to Central. + Emergency Shuttle Control Console - Allows calling/recalling the emergency shuttle. + Shuttle Control Console - Allows control of various shuttles around the station (mining, research, engineering) + +*REDACTED* - Can be downloaded from SyndiCorp servers, only via emagged devices. These files are very large and limited to laptops/consoles only. + SYSCRACK - Allows cracking of secure network terminals, such as, NTNet administration. The sysadmin will probably notice this. + SYSOVERRIDE - Allows hacking into any device connected to NTNet. User will notice this and may stop the hack by disconnecting from NTNet first. After hacking various options exist, such as stealing/deleting files. + SYSKILL - Tricks NTNet to force-disconnect a device. The sysadmin will probably notice this. + SYSDOS - Launches a Denial of Service attack on NTNet relay. Can DoS only one relay at once. Requires NTNet connection. After some time the relay crashes until attack stops. The sysadmin will probably notice this. + AIHACK - Hacks an AI, allowing you to upload/remove/modify a law even without relevant circuit board. The AI is alerted once the hack starts, and it takes a while for it to complete. Does not work on AIs with zeroth law. + COREPURGE - Deletes all files on the hard drive, including the undeletable ones. Something like software self-destruct for computer. + +6. Security +Laptops will be password-lockable. If password is set a MD5 hash of it is stored and password is required every time you turn on the laptop. +Passwords may be decrypted by using special Decrypter (protolathable, RDs office starts with one) device that will slowly decrypt the password. +Decryption time would be length_of_password * 30 seconds, with maximum being 9 minutes (due to battery life limitations, which is 10+ min). +If decrypted the password is cleared, so you can keep using your favorite password without people ever actually revealing it (for meta prevention reasons mostly). +Emagged laptops will have option to enable "Safe Encryption". If safely encrypted laptop is decrypted it loses it's emag status and 50% of files is deleted (randomly selected). + +7. System Administrator +System Administrator will be new job under Research. It's main specifics will be maintaining of computer systems on station, espicially from software side. +From IC perspective they'd probably know how to build a console or something given they work with computers, but they are mostly programmers/network experts. +They will have office in research, which will probably replace (and contain) the server room and part of the toxins storage which is currently oversized. +They will have access to DOWNLOAD (not run) all programs that exist on NTNet. They'll have fairly good amount of available programs, most of them being +administrative consoles and other very useful things. They'll also be able to monitor NTNet. There will probably be one or two job slots. + +8. IDS +With addition of various antag programs, IDS(Intrusion Detection System) will be added to NTNet. This system can be turned on/off via administration console. +If enabled, this system automatically detects any abnormality and triggers a warning that's visible on the NTNet status screen, as well as generating a security log. +IDS can be disabled by simple on/off switch in the configuration. + +*/ \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm new file mode 100644 index 00000000000..bec75113a21 --- /dev/null +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -0,0 +1,780 @@ +// This is the base type that does all the hardware stuff. +// Other types expand it - tablets use a direct subtypes, and +// consoles and laptops use "procssor" item that is held inside machinery piece +/obj/item/modular_computer + name = "Modular Microcomputer" + desc = "A small portable microcomputer." + + var/enabled = 0 // Whether the computer is turned on. + var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. + var/datum/computer_file/program/active_program = null // A currently active program running on the computer. + var/hardware_flag = 0 // A flag that describes this device type + var/last_power_usage = 0 + var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged + var/last_world_time = "00:00" + var/list/last_header_icons + var/computer_emagged = 0 // Whether the computer is emagged. + + var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too. + var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops) + + // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..) + // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently + // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. + + icon = 'icons/obj/computer.dmi' + icon_state = "laptop-open" + var/icon_state_unpowered = null // Icon state when the computer is turned off + var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. + var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed. + var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer. + var/light_strength = 0 + + // Damage of the chassis. If the chassis takes too much damage it will break apart. + var/damage = 0 // Current damage level + var/broken_damage = 50 // Damage level at which the computer ceases to operate + var/max_damage = 100 // Damage level at which the computer breaks apart. + + // Important hardware (must be installed for computer to work) + var/obj/item/weapon/computer_hardware/processor_unit/processor_unit // CPU. Without it the computer won't run. Better CPUs can run more programs at once. + var/obj/item/weapon/computer_hardware/network_card/network_card // Network Card component of this computer. Allows connection to NTNet + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. + var/obj/item/weapon/computer_hardware/battery_module/battery_module // An internal power source for this computer. Can be recharged. + // Optional hardware (improves functionality, but is not critical for computer to work) + var/obj/item/weapon/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification. + var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs. + var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage + + var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/item/modular_computer/verb/eject_id() + set name = "Eject ID" + set category = "Object" + set src in view(1) + + if(usr.incapacitated() || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + proc_eject_id(usr) + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/item/modular_computer/verb/eject_usb() + set name = "Eject Portable Device" + set category = "Object" + set src in view(1) + + if(usr.incapacitated() || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + proc_eject_usb(usr) + +/obj/item/modular_computer/proc/proc_eject_id(mob/user) + if(!user) + user = usr + + if(!card_slot) + user << "\The [src] does not have an ID card slot" + return + + if(!card_slot.stored_card) + user << "There is no card in \the [src]" + return + + if(active_program) + active_program.event_idremoved(0) + + for(var/datum/computer_file/program/P in idle_threads) + P.event_idremoved(1) + + card_slot.stored_card.forceMove(get_turf(src)) + card_slot.stored_card = null + update_uis() + user << "You remove the card from \the [src]" + +/obj/item/modular_computer/proc/proc_eject_usb(mob/user) + if(!user) + user = usr + + if(!portable_drive) + user << "There is no portable device connected to \the [src]." + return + + uninstall_component(user, portable_drive) + update_uis() + +/obj/item/modular_computer/attack_ghost(mob/dead/observer/user) + if(enabled) + ui_interact(user) + else if(check_rights_for(user.client, R_ADMIN)) + var/response = alert(user, "This computer is turned off. Would you like to turn it on?", "Admin Override", "Yes", "No") + if(response == "Yes") + turn_on(user) + +/obj/item/modular_computer/emag_act(remaining_charges, mob/user) + if(computer_emagged) + user << "\The [src] was already emagged." + return 0 + else + computer_emagged = 1 + user << "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message." + return 1 + +/obj/item/modular_computer/examine(mob/user) + ..() + if(damage > broken_damage) + user << "It is heavily damaged!" + else if(damage) + user << "It is damaged." + +/obj/item/modular_computer/New() + processing_objects.Add(src) + update_icon() + ..() + +/obj/item/modular_computer/Destroy() + kill_program(1) + processing_objects.Remove(src) + for(var/obj/item/weapon/computer_hardware/CH in src.get_all_components()) + uninstall_component(null, CH) + qdel(CH) + return ..() + +/obj/item/modular_computer/update_icon() + icon_state = icon_state_unpowered + + overlays.Cut() + if(!enabled) + //set_light(0) + return + //set_light(light_strength) + if(active_program) + overlays.Add(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) + else + overlays.Add(icon_state_menu) + +// Used by child types if they have other power source than battery +/obj/item/modular_computer/proc/check_power_override() + return 0 + +// Operates NanoUI +/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) + if(!screen_on || !enabled) + if(ui) + ui.close() + return 0 + if((!battery_module || !battery_module.battery.charge) && !check_power_override()) + if(ui) + ui.close() + return 0 + + // If we have an active program switch to it now. + if(active_program) + if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now. + ui.close() + active_program.ui_interact(user) + return + + // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it. + // This screen simply lists available programs and user may select them. + if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) + visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") + return // No HDD, No HDD files list or no stored files. Something is very broken. + + var/list/data = get_header_data() + + var/list/programs = list() + for(var/datum/computer_file/program/P in hard_drive.stored_files) + var/list/program = list() + program["name"] = P.filename + program["desc"] = P.filedesc + if(P in idle_threads) + program["running"] = 1 + programs.Add(list(program)) + + data["programs"] = programs + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) +// ui = new(user, src, ui_key, "laptop_mainscreen", "NTOS Main Menu", 400, 500) + ui = new(user, src, ui_key, "vr_sleeper", "VR Sleeper", 475, 340, master_ui, state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +// On-click handling. Turns on the computer if it's off and opens the GUI. +/obj/item/modular_computer/attack_self(mob/user) + if(enabled) + ui_interact(user) + else + turn_on(user) + +/obj/item/modular_computer/proc/break_apart() + visible_message("\The [src] breaks apart!") + var/turf/newloc = get_turf(src) + new /obj/item/stack/material/steel(newloc, round(steel_sheet_cost/2)) + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + uninstall_component(null, H) + H.forceMove(newloc) + if(prob(25)) + H.take_damage(rand(10,30)) + relay_qdel() + qdel() + +/obj/item/modular_computer/proc/turn_on(mob/user) + var/issynth = issilicon(user) // Robots and AIs get different activation messages. + if(damage > broken_damage) + if(issynth) + user << "You send an activation signal to \the [src], but it responds with an error code. It must be damaged." + else + user << "You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again." + return + if(processor_unit && ((battery_module && battery_module.battery.charge && battery_module.check_functionality()) || check_power_override())) // Battery-run and charged or non-battery but powered by APC. + if(issynth) + user << "You send an activation signal to \the [src], turning it on" + else + user << "You press the power button and start up \the [src]" + enabled = 1 + update_icon() + ui_interact(user) + else // Unpowered + if(issynth) + user << "You send an activation signal to \the [src] but it does not respond" + else + user << "You press the power button but \the [src] does not respond" + +// Process currently calls handle_power(), may be expanded in future if more things are added. +/obj/item/modular_computer/process() + if(!enabled) // The computer is turned off + last_power_usage = 0 + return 0 + + if(damage > broken_damage) + shutdown_computer() + return 0 + + if(active_program && active_program.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature)) // Active program requires NTNet to run but we've just lost connection. Crash. + active_program.event_networkfailure(0) + + for(var/datum/computer_file/program/P in idle_threads) + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) + P.event_networkfailure(1) + + if(active_program) + if(active_program.program_state != PROGRAM_STATE_KILLED) + active_program.process_tick() + active_program.ntnet_status = get_ntnet_status() + active_program.computer_emagged = computer_emagged + else + active_program = null + + for(var/datum/computer_file/program/P in idle_threads) + if(P.program_state != PROGRAM_STATE_KILLED) + P.process_tick() + P.ntnet_status = get_ntnet_status() + P.computer_emagged = computer_emagged + else + idle_threads.Remove(P) + + handle_power() // Handles all computer power interaction + check_update_ui_need() + +// Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" +/obj/item/modular_computer/proc/get_header_data() + var/list/data = list() + + if(battery_module) + switch(battery_module.battery.percent()) + if(80 to 200) // 100 should be maximal but just in case.. + data["PC_batteryicon"] = "batt_100.gif" + if(60 to 80) + data["PC_batteryicon"] = "batt_80.gif" + if(40 to 60) + data["PC_batteryicon"] = "batt_60.gif" + if(20 to 40) + data["PC_batteryicon"] = "batt_40.gif" + if(5 to 20) + data["PC_batteryicon"] = "batt_20.gif" + else + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "[round(battery_module.battery.percent())] %" + data["PC_showbatteryicon"] = 1 + else + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "N/C" + data["PC_showbatteryicon"] = battery_module ? 1 : 0 + + switch(get_ntnet_status()) + if(0) + data["PC_ntneticon"] = "sig_none.gif" + if(1) + data["PC_ntneticon"] = "sig_low.gif" + if(2) + data["PC_ntneticon"] = "sig_high.gif" + if(3) + data["PC_ntneticon"] = "sig_lan.gif" + + if(idle_threads.len) + var/list/program_headers = list() + for(var/datum/computer_file/program/P in idle_threads) + if(!P.ui_header) + continue + program_headers.Add(list(list( + "icon" = P.ui_header + ))) + + data["PC_programheaders"] = program_headers + + data["PC_stationtime"] = stationtime2text() + data["PC_hasheader"] = 1 + data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen + return data + +// Relays kill program request to currently active program. Use this to quit current program. +/obj/item/modular_computer/proc/kill_program(var/forced = 0) + if(active_program) + active_program.kill_program(forced) + active_program = null + var/mob/user = usr + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + update_icon() + +// Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) +/obj/item/modular_computer/proc/get_ntnet_status(var/specific_action = 0) + if(network_card) + return network_card.get_signal(specific_action) + else + return 0 + +/obj/item/modular_computer/proc/add_log(var/text) + if(!get_ntnet_status()) + return 0 + return ntnet_global.add_log(text, network_card) + +/obj/item/modular_computer/proc/shutdown_computer(var/loud = 1) + kill_program(1) + for(var/datum/computer_file/program/P in idle_threads) + P.kill_program(1) + idle_threads.Remove(P) + if(loud) + visible_message("\The [src] shuts down.") + enabled = 0 + update_icon() + return + +// Handles user's GUI input +/obj/item/modular_computer/Topic(href, href_list) + if(..()) + return 1 + if( href_list["PC_exit"] ) + kill_program() + return 1 + if( href_list["PC_enable_component"] ) + var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(href_list["PC_enable_component"]) + if(H && istype(H) && !H.enabled) + H.enabled = 1 + . = 1 + if( href_list["PC_disable_component"] ) + var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(href_list["PC_disable_component"]) + if(H && istype(H) && H.enabled) + H.enabled = 0 + . = 1 + if( href_list["PC_shutdown"] ) + shutdown_computer() + return 1 + if( href_list["PC_minimize"] ) + var/mob/user = usr + if(!active_program || !processor_unit) + return + + idle_threads.Add(active_program) + active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs + nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) + active_program = null + update_icon() + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + + if( href_list["PC_killprogram"] ) + var/prog = href_list["PC_killprogram"] + var/datum/computer_file/program/P = null + var/mob/user = usr + if(hard_drive) + P = hard_drive.find_file_by_name(prog) + + if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED) + return + + P.kill_program(1) + update_uis() + user << "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed." + + if( href_list["PC_runprogram"] ) + var/prog = href_list["PC_runprogram"] + var/datum/computer_file/program/P = null + var/mob/user = usr + if(hard_drive) + P = hard_drive.find_file_by_name(prog) + + if(!P || !istype(P)) // Program not found or it's not executable program. + user << "\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning." + return + + P.computer = src + + if(!P.is_supported_by_hardware(hardware_flag, 1, user)) + return + + // The program is already running. Resume it. + if(P in idle_threads) + P.program_state = PROGRAM_STATE_ACTIVE + active_program = P + idle_threads.Remove(P) + update_icon() + return + + if(idle_threads.len >= processor_unit.max_idle_programs+1) + user << "\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error" + return + + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. + user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." + return + + if(P.run_program(user)) + active_program = P + update_icon() + return 1 + if(.) + update_uis() + +// Used in following function to reduce copypaste +/obj/item/modular_computer/proc/power_failure(var/malfunction = 0) + if(enabled) // Shut down the computer + visible_message("\The [src]'s screen flickers \"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\" warning as it shuts down unexpectedly.") + if(active_program) + active_program.event_powerfailure(0) + for(var/datum/computer_file/program/PRG in idle_threads) + PRG.event_powerfailure(1) + shutdown_computer(0) + +// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged +/obj/item/modular_computer/proc/handle_power() + if(!battery_module || battery_module.battery.charge <= 0) // Battery-run but battery is depleted. + power_failure() + return 0 + + var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage + + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + if(H.enabled) + power_usage += H.power_usage + + if(battery_module) + if(!battery_module.check_functionality()) + power_failure(1) + return + battery_module.battery.use(power_usage * CELLRATE) + + last_power_usage = power_usage + +/obj/item/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/card/id)) // ID Card, try to insert it. + var/obj/item/weapon/card/id/I = W + if(!card_slot) + user << "You try to insert \the [I] into \the [src], but it does not have an ID card slot installed." + return + + if(card_slot.stored_card) + user << "You try to insert \the [I] into \the [src], but it's ID card slot is occupied." + return + user.drop_from_inventory(I) + card_slot.stored_card = I + I.forceMove(src) + update_uis() + user << "You insert \the [I] into \the [src]." + return + if(istype(W, /obj/item/weapon/paper)) + if(!nano_printer) + return + nano_printer.attackby(W, user) + if(istype(W, /obj/item/weapon/computer_hardware)) + var/obj/item/weapon/computer_hardware/C = W + if(C.hardware_size <= max_hardware_size) + try_install_component(user, C) + else + user << "This component is too large for \the [src]." + if(istype(W, /obj/item/weapon/wrench)) + var/list/components = get_all_components() + if(components.len) + user << "Remove all components from \the [src] before disassembling it." + return + new /obj/item/stack/material/steel( get_turf(src.loc), steel_sheet_cost ) + src.visible_message("\The [src] has been disassembled by [user].") + relay_qdel() + qdel(src) + return + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(!WT.isOn()) + user << "\The [W] is off." + return + + if(!damage) + user << "\The [src] does not require repairs." + return + + user << "You begin repairing damage to \the [src]..." + if(WT.remove_fuel(round(damage/75)) && do_after(usr, damage/10)) + damage = 0 + user << "You repair \the [src]." + return + + if(istype(W, /obj/item/weapon/screwdriver)) + var/list/all_components = get_all_components() + if(!all_components.len) + user << "This device doesn't have any components installed." + return + var/list/component_names = list() + for(var/obj/item/weapon/computer_hardware/H in all_components) + component_names.Add(H.name) + + var/choice = input(usr, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in component_names + + if(!choice) + return + + if(!Adjacent(usr)) + return + + var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(choice) + + if(!H) + return + + uninstall_component(user, H) + + return + + ..() + +// Used by processor to relay qdel() to machinery type. +/obj/item/modular_computer/proc/relay_qdel() + return + +// Attempts to install the hardware into apropriate slot. +/obj/item/modular_computer/proc/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0) + // "USB" flash drive. + if(istype(H, /obj/item/weapon/computer_hardware/hard_drive/portable)) + if(portable_drive) + user << "This computer's portable drive slot is already occupied by \the [portable_drive]." + return + found = 1 + portable_drive = H + else if(istype(H, /obj/item/weapon/computer_hardware/hard_drive)) + if(hard_drive) + user << "This computer's hard drive slot is already occupied by \the [hard_drive]." + return + found = 1 + hard_drive = H + else if(istype(H, /obj/item/weapon/computer_hardware/network_card)) + if(network_card) + user << "This computer's network card slot is already occupied by \the [network_card]." + return + found = 1 + network_card = H + else if(istype(H, /obj/item/weapon/computer_hardware/nano_printer)) + if(nano_printer) + user << "This computer's nano printer slot is already occupied by \the [nano_printer]." + return + found = 1 + nano_printer = H + else if(istype(H, /obj/item/weapon/computer_hardware/card_slot)) + if(card_slot) + user << "This computer's card slot is already occupied by \the [card_slot]." + return + found = 1 + card_slot = H + else if(istype(H, /obj/item/weapon/computer_hardware/battery_module)) + if(battery_module) + user << "This computer's battery slot is already occupied by \the [battery_module]." + return + found = 1 + battery_module = H + else if(istype(H, /obj/item/weapon/computer_hardware/processor_unit)) + if(processor_unit) + user << "This computer's processor slot is already occupied by \the [processor_unit]." + return + found = 1 + processor_unit = H + if(found) + user << "You install \the [H] into \the [src]" + H.holder2 = src + user.drop_from_inventory(H) + H.forceMove(src) + +// Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware. +/obj/item/modular_computer/proc/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0) + if(portable_drive == H) + portable_drive = null + found = 1 + if(hard_drive == H) + hard_drive = null + found = 1 + critical = 1 + if(network_card == H) + network_card = null + found = 1 + if(nano_printer == H) + nano_printer = null + found = 1 + if(card_slot == H) + card_slot = null + found = 1 + if(battery_module == H) + battery_module = null + found = 1 + if(processor_unit == H) + processor_unit = null + found = 1 + critical = 1 + if(found) + if(user) + user << "You remove \the [H] from \the [src]." + H.forceMove(get_turf(src)) + H.holder2 = null + if(critical && enabled) + if(user) + user << "\The [src]'s screen freezes for few seconds and then displays an \"HARDWARE ERROR: Critical component disconnected. Please verify component connection and reboot the device. If the problem persists contact technical support for assistance.\" warning." + shutdown_computer() + update_icon() + + +// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null +/obj/item/modular_computer/proc/find_hardware_by_name(var/name) + if(portable_drive && (portable_drive.name == name)) + return portable_drive + if(hard_drive && (hard_drive.name == name)) + return hard_drive + if(network_card && (network_card.name == name)) + return network_card + if(nano_printer && (nano_printer.name == name)) + return nano_printer + if(card_slot && (card_slot.name == name)) + return card_slot + if(battery_module && (battery_module.name == name)) + return battery_module + if(processor_unit && (processor_unit.name == name)) + return processor_unit + return null + +// Returns list of all components +/obj/item/modular_computer/proc/get_all_components() + var/list/all_components = list() + if(hard_drive) + all_components.Add(hard_drive) + if(network_card) + all_components.Add(network_card) + if(portable_drive) + all_components.Add(portable_drive) + if(nano_printer) + all_components.Add(nano_printer) + if(card_slot) + all_components.Add(card_slot) + if(battery_module) + all_components.Add(battery_module) + if(processor_unit) + all_components.Add(processor_unit) + return all_components + +/obj/item/modular_computer/proc/update_uis() + if(active_program) //Should we update program ui or computer ui? + nanomanager.update_uis(active_program) + if(active_program.NM) + nanomanager.update_uis(active_program.NM) + else + nanomanager.update_uis(src) + +/obj/item/modular_computer/proc/check_update_ui_need() + var/ui_update_needed = 0 + if(battery_module) + var/batery_percent = battery_module.battery.percent() + if(last_battery_percent != batery_percent) //Let's update UI on percent change + ui_update_needed = 1 + last_battery_percent = batery_percent + + if(stationtime2text() != last_world_time) + last_world_time = stationtime2text() + ui_update_needed = 1 + + if(idle_threads.len) + var/list/current_header_icons = list() + for(var/datum/computer_file/program/P in idle_threads) + if(!P.ui_header) + continue + current_header_icons[P.type] = P.ui_header + if(!last_header_icons) + last_header_icons = current_header_icons + + else if(!listequal(last_header_icons, current_header_icons)) + last_header_icons = current_header_icons + ui_update_needed = 1 + else + for(var/x in last_header_icons|current_header_icons) + if(last_header_icons[x]!=current_header_icons[x]) + last_header_icons = current_header_icons + ui_update_needed = 1 + break + + if(ui_update_needed) + update_uis() + +/obj/item/modular_computer/proc/take_damage(var/amount, var/component_probability, var/damage_casing = 1, var/randomize = 1) + if(randomize) + // 75%-125%, rand() works with integers, apparently. + amount *= (rand(75, 125) / 100.0) + amount = round(amount) + if(damage_casing) + damage += amount + damage = between(0, damage, max_damage) + + if(component_probability) + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + if(prob(component_probability)) + H.take_damage(round(amount / 2)) + + if(damage >= max_damage) + break_apart() + +// Stronger explosions cause serious damage to internal components +// Minor explosions are mostly mitigitated by casing. +/obj/item/modular_computer/ex_act(var/severity) + take_damage(rand(100,200) / severity, 30 / severity) + +// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components +/obj/item/modular_computer/emp_act(var/severity) + take_damage(rand(100,200) / severity, 50 / severity, 0) + +// "Stun" weapons can cause minor damage to components (short-circuits?) +// "Burn" damage is equally strong against internal components and exterior casing +// "Brute" damage mostly damages the casing. +/obj/item/modular_computer/bullet_act(var/obj/item/projectile/Proj) + switch(Proj.damage_type) + if(BRUTE) + take_damage(Proj.damage, Proj.damage / 2) + //if(HALLOSS) + // take_damage(Proj.damage, Proj.damage / 3, 0) + if(BURN) + take_damage(Proj.damage, Proj.damage / 1.5) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm new file mode 100644 index 00000000000..eca01472280 --- /dev/null +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -0,0 +1,133 @@ +// Held by /obj/machinery/modular_computer to reduce amount of copy-pasted code. +/obj/item/modular_computer/processor + name = "processing unit" + desc = "You shouldn't see this. If you do, report it." + icon = null + icon_state = null + icon_state_unpowered = null + icon_state_menu = null + hardware_flag = 0 + + var/obj/machinery/modular_computer/machinery_computer = null + +/obj/item/modular_computer/processor/Destroy() + . = ..() + if(machinery_computer && (machinery_computer.cpu == src)) + machinery_computer.cpu = null + machinery_computer = null + +/obj/item/modular_computer/processor/nano_host() + return machinery_computer.nano_host() + +// Due to how processes work, we'd receive two process calls - one from machinery type and one from our own type. +// Since we want this to be in-sync with machinery (as it's hidden type for machinery-based computers) we'll ignore +// non-relayed process calls. +/obj/item/modular_computer/processor/process(var/relayed = 0) + if(relayed) + ..() + else + return + +/obj/item/modular_computer/processor/examine(var/mob/user) + if(damage > broken_damage) + user << "It is heavily damaged!" + else if(damage) + user << "It is damaged." + +// Power interaction is handled by our machinery part, due to machinery having APC connection. +/obj/item/modular_computer/processor/handle_power() + if(machinery_computer) + machinery_computer.handle_power() + +/obj/item/modular_computer/processor/New(var/comp) + if(!comp || !istype(comp, /obj/machinery/modular_computer)) + CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") + return + // Obtain reference to machinery computer + machinery_computer = comp + machinery_computer.cpu = src + hardware_flag = machinery_computer.hardware_flag + max_hardware_size = machinery_computer.max_hardware_size + steel_sheet_cost = machinery_computer.steel_sheet_cost + max_damage = machinery_computer._max_damage + broken_damage = machinery_computer._break_damage + +/obj/item/modular_computer/processor/relay_qdel() + qdel(machinery_computer) + +/obj/item/modular_computer/processor/find_hardware_by_name(var/N) + var/obj/item/weapon/computer_hardware/H = machinery_computer.find_hardware_by_name(N) + if(H) + return H + else + return ..() + +/obj/item/modular_computer/processor/update_icon() + if(machinery_computer) + return machinery_computer.update_icon() + +/obj/item/modular_computer/processor/get_header_data() + var/list/L = ..() + if(machinery_computer.tesla_link && machinery_computer.tesla_link.enabled && machinery_computer.powered()) + L["PC_apclinkicon"] = "charging.gif" + return L + +// Checks whether the machinery computer doesn't take power from APC network +/obj/item/modular_computer/processor/check_power_override() + if(!machinery_computer) + return 0 + if(!machinery_computer.tesla_link || !machinery_computer.tesla_link.enabled) + return 0 + return machinery_computer.powered() + +// This thing is not meant to be used on it's own, get topic data from our machinery owner. +/obj/item/modular_computer/processor/CanUseTopic(user, state) + if(!machinery_computer) + return 0 + return machinery_computer.CanUseTopic(user, state) + +/obj/item/modular_computer/processor/shutdown_computer() + if(!machinery_computer) + return + ..() + machinery_computer.update_icon() + machinery_computer.use_power = 0 + return + +// Tesla links only work on machinery types, so we'll override the default try_install_component() proc +/obj/item/modular_computer/processor/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0) + if(istype(H, /obj/item/weapon/computer_hardware/tesla_link)) + if(machinery_computer.tesla_link) + user << "This computer's tesla link slot is already occupied by \the [machinery_computer.tesla_link]." + return + var/obj/item/weapon/computer_hardware/tesla_link/L = H + L.holder = machinery_computer + machinery_computer.tesla_link = L + found = 1 + ..(user, H, found) + +/obj/item/modular_computer/processor/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0) + if(machinery_computer.tesla_link == H) + machinery_computer.tesla_link = null + var/obj/item/weapon/computer_hardware/tesla_link/L = H + L.holder = null + found = 1 + ..(user, H, found, critical) + +/obj/item/modular_computer/processor/get_all_components() + var/list/all_components = ..() + if(machinery_computer && machinery_computer.tesla_link) + all_components.Add(machinery_computer.tesla_link) + return all_components + +// Perform adjacency checks on our machinery counterpart, rather than on ourselves. +/obj/item/modular_computer/processor/Adjacent(var/atom/neighbor) + if(!machinery_computer) + return 0 + return machinery_computer.Adjacent(neighbor) + +/obj/item/modular_computer/processor/turn_on(var/mob/user) + // If we have a tesla link on our machinery counterpart, enable it automatically. Lets computer without a battery work. + if(machinery_computer && machinery_computer.tesla_link) + machinery_computer.tesla_link.enabled = 1 + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm new file mode 100644 index 00000000000..4848a247879 --- /dev/null +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -0,0 +1,10 @@ +/obj/item/modular_computer/tablet + name = "tablet computer" + icon = 'icons/obj/modular_tablet.dmi' + icon_state = "tablet" + icon_state_unpowered = "tablet" + icon_state_menu = "menu" + hardware_flag = PROGRAM_TABLET + max_hardware_size = 1 + w_class = 2 + light_strength = 2 // Same as PDAs \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm new file mode 100644 index 00000000000..4f40e31d869 --- /dev/null +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -0,0 +1,21 @@ + +// Available as custom loadout item, this is literally the worst possible cheap tablet +/obj/item/modular_computer/tablet/preset/custom_loadout/cheap/New() + . = ..() + desc = "A low-end tablet often seen among low ranked station personnel." + processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module/nano(src) + battery_module.charge_to_full() + hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(src) + network_card = new/obj/item/weapon/computer_hardware/network_card(src) + +// Alternative version, an average one, for higher ranked positions mostly +/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/New() + . = ..() + processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module(src) + battery_module.charge_to_full() + hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(src) + network_card = new/obj/item/weapon/computer_hardware/network_card(src) + nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(src) + card_slot = new/obj/item/weapon/computer_hardware/card_slot(src) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm new file mode 100644 index 00000000000..6363e848789 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -0,0 +1,91 @@ +/obj/machinery/modular_computer/console/preset/ + // Can be changed to give devices specific hardware + var/_has_id_slot = 0 + var/_has_printer = 0 + var/_has_battery = 0 + +/obj/machinery/modular_computer/console/preset/New() + . = ..() + if(!cpu) + return + cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(cpu) + if(_has_id_slot) + cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(cpu) + if(_has_printer) + cpu.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(cpu) + if(_has_battery) + cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(cpu) + install_programs() + +// Override in child types to install preset-specific programs. +/obj/machinery/modular_computer/console/preset/proc/install_programs() + return + +// ===== ENGINEERING CONSOLE ===== +/obj/machinery/modular_computer/console/preset/engineering + console_department = "Engineering" + desc = "A stationary computer. This one comes preloaded with engineering programs." + +/obj/machinery/modular_computer/console/preset/engineering/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/power_monitor()) + cpu.hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) + cpu.hard_drive.store_file(new/datum/computer_file/program/atmos_control()) + cpu.hard_drive.store_file(new/datum/computer_file/program/rcon_console()) + + +// ===== MEDICAL CONSOLE ===== +/obj/machinery/modular_computer/console/preset/medical + console_department = "Medical" + desc = "A stationary computer. This one comes preloaded with medical programs." + +/obj/machinery/modular_computer/console/preset/medical/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/suit_sensors()) + + +// ===== RESEARCH CONSOLE ===== +/obj/machinery/modular_computer/console/preset/research + console_department = "Research" + desc = "A stationary computer. This one comes preloaded with research programs." + +/obj/machinery/modular_computer/console/preset/research/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) + cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + + +// ===== COMMAND CONSOLE ===== +/obj/machinery/modular_computer/console/preset/command + console_department = "Command" + desc = "A stationary computer. This one comes preloaded with command programs." + _has_id_slot = 1 + _has_printer = 1 + +/obj/machinery/modular_computer/console/preset/command/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) + cpu.hard_drive.store_file(new/datum/computer_file/program/comm()) + +/obj/machinery/modular_computer/console/preset/command/main + console_department = "Command" + desc = "A stationary computer. This one comes preloaded with essential command programs." + _has_id_slot = 1 + _has_printer = 1 + +// ===== SECURITY CONSOLE ===== +/obj/machinery/modular_computer/console/preset/security + console_department = "Security" + desc = "A stationary computer. This one comes preloaded with security programs." + +/obj/machinery/modular_computer/console/preset/security/install_programs() + return // No security programs exist, yet, but the preset is ready so it may be mapped in. + + +// ===== CIVILIAN CONSOLE ===== +/obj/machinery/modular_computer/console/preset/civilian + console_department = "Civilian" + desc = "A stationary computer. This one comes preloaded with generic programs." + +/obj/machinery/modular_computer/console/preset/civilian/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) + cpu.hard_drive.store_file(new/datum/computer_file/program/newsbrowser()) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm new file mode 100644 index 00000000000..92c8fe5f2bb --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -0,0 +1,196 @@ +// Global var to track modular computers +var/list/global_modular_computers = list() + +// Modular Computer - device that runs various programs and operates with hardware +// DO NOT SPAWN THIS TYPE. Use /laptop/ or /console/ instead. +/obj/machinery/modular_computer/ + name = "modular computer" + desc = "An advanced computer." + + var/battery_powered = 0 // Whether computer should be battery powered. It is set automatically + use_power = 0 + var/hardware_flag = 0 // A flag that describes this device type + var/last_power_usage = 0 // Power usage during last tick + + // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..) + // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently + // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. + + icon = null + icon_state = null + var/icon_state_unpowered = null // Icon state when the computer is turned off + var/screen_icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. + var/screen_icon_screensaver = "standby" // Icon state overlay when the computer is powered, but not 'switched on'. + var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed. + var/steel_sheet_cost = 10 // Amount of steel sheets refunded when disassembling an empty frame of this computer. + var/light_strength = 0 // Light luminosity when turned on + var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too. + var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops) + + var/_max_damage = 100 + var/_break_damage = 50 + + var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link component of this computer. Allows remote charging from nearest APC. + + var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things. + +/obj/machinery/modular_computer/attack_ghost(var/mob/observer/ghost/user) + if(cpu) + cpu.attack_ghost(user) + +/obj/machinery/modular_computer/emag_act(var/remaining_charges, var/mob/user) + return cpu ? cpu.emag_act(remaining_charges, user) : NO_EMAG_ACT + +/obj/machinery/modular_computer/update_icon() + icon_state = icon_state_unpowered + overlays.Cut() + + if(!cpu || !cpu.enabled) + if (!(stat & NOPOWER) || battery_powered) + overlays.Add(screen_icon_screensaver) + set_light(0) + return + set_light(light_strength) + if(cpu.active_program) + overlays.Add(cpu.active_program.program_icon_state ? cpu.active_program.program_icon_state : screen_icon_state_menu) + else + overlays.Add(screen_icon_state_menu) + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/machinery/modular_computer/verb/eject_id() + set name = "Eject ID" + set category = "Object" + set src in view(1) + + if(cpu) + cpu.eject_id() + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/machinery/modular_computer/verb/eject_usb() + set name = "Eject Portable Device" + set category = "Object" + set src in view(1) + + if(cpu) + cpu.eject_usb() + +/obj/machinery/modular_computer/New() + ..() + cpu = new(src) + global_modular_computers.Add(src) + +/obj/machinery/modular_computer/Destroy() + if(cpu) + qdel(cpu) + cpu = null + return ..() + +// On-click handling. Turns on the computer if it's off and opens the GUI. +/obj/machinery/modular_computer/attack_hand(mob/user) + if(cpu) + cpu.attack_self(user) // CPU is an item, that's why we route attack_hand to attack_self + +/obj/machinery/modular_computer/examine(var/mob/user) + . = ..() + if(cpu) + cpu.examine(user) + +// Process currently calls handle_power(), may be expanded in future if more things are added. +/obj/machinery/modular_computer/process() + if(cpu) + // Keep names in sync. + cpu.name = src.name + cpu.process(1) + +// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null +/obj/machinery/modular_computer/proc/find_hardware_by_name(var/N) + if(tesla_link && (tesla_link.name == N)) + return tesla_link + return null + +// Used in following function to reduce copypaste +/obj/machinery/modular_computer/proc/power_failure(var/malfunction = 0) + if(cpu && cpu.enabled) // Shut down the computer + visible_message("\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") + if(cpu) + cpu.shutdown_computer(0) + battery_powered = 0 + stat |= NOPOWER + update_icon() + +// Called by cpu item's process() automatically, handles our power interaction. +/obj/machinery/modular_computer/proc/handle_power() + if(cpu.battery_module && cpu.battery_module.battery.charge <= 0) // Battery-run but battery is depleted. + power_failure() + return 0 + else if(!cpu.battery_module && (!powered() || !tesla_link || !tesla_link.enabled || !tesla_link.check_functionality())) // Not battery run, but lacking APC connection. + power_failure() + return 0 + else if(stat & NOPOWER) + stat &= ~NOPOWER + + if(cpu.battery_module && cpu.battery_module.battery.charge) + battery_powered = 1 + else + battery_powered = 0 + + var/power_usage = cpu.screen_on ? base_active_power_usage : base_idle_power_usage + for(var/obj/item/weapon/computer_hardware/CH in src.cpu.get_all_components()) + if(CH.enabled) + power_usage += CH.power_usage + + // Wireless APC connection exists. + if(tesla_link && tesla_link.enabled && tesla_link.check_functionality()) + idle_power_usage = power_usage + active_power_usage = idle_power_usage + 100 // APCLink only charges at 100W rate, but covers any power usage. + use_power = 1 + // Battery is not fully charged. Begin slowly recharging. + if(cpu.battery_module && (cpu.battery_module.battery.charge < cpu.battery_module.battery.maxcharge)) + use_power = 2 + + if(cpu.battery_module && powered() && (use_power == 2)) // Battery charging itself + cpu.battery_module.battery.give(100 * CELLRATE) + else if(cpu.battery_module && !powered()) // Unpowered, but battery covers the usage. + cpu.battery_module.battery.use(idle_power_usage * CELLRATE) + + else // No wireless connection run only on battery. + use_power = 0 + if (cpu.battery_module) + if(!cpu.battery_module.check_functionality()) + power_failure(1) + return + cpu.battery_module.battery.use(power_usage * CELLRATE) + cpu.last_power_usage = power_usage + +// Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us. +/obj/machinery/modular_computer/power_change() + if(battery_powered) + return + ..() + +/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(cpu) + return cpu.attackby(W, user) + return ..() + + +// Stronger explosions cause serious damage to internal components +// Minor explosions are mostly mitigitated by casing. +/obj/machinery/modular_computer/ex_act(var/severity) + if(cpu) + cpu.ex_act(severity) + +// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components +/obj/machinery/modular_computer/emp_act(var/severity) + if(cpu) + cpu.emp_act(severity) + +// "Stun" weapons can cause minor damage to components (short-circuits?) +// "Burn" damage is equally strong against internal components and exterior casing +// "Brute" damage mostly damages the casing. +/obj/machinery/modular_computer/bullet_act(var/obj/item/projectile/Proj) + if(cpu) + cpu.bullet_act(Proj) + + + diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm new file mode 100644 index 00000000000..576c8cb0b0f --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -0,0 +1,46 @@ +/obj/machinery/modular_computer/console/ + name = "console" + desc = "A stationary computer." + + icon = 'icons/obj/modular_console.dmi' + icon_state = "console" + icon_state_unpowered = "console" + screen_icon_state_menu = "menu" + hardware_flag = PROGRAM_CONSOLE + var/console_department = "" // Used in New() to set network tag according to our area. + anchored = 1 + density = 1 + base_idle_power_usage = 100 + base_active_power_usage = 500 + max_hardware_size = 3 + steel_sheet_cost = 20 + light_strength = 4 + _max_damage = 300 + _break_damage = 150 + +/obj/machinery/modular_computer/console/buildable/New() + ..() + // User-built consoles start as empty frames. + qdel(tesla_link) + qdel(cpu.network_card) + qdel(cpu.hard_drive) + +/obj/machinery/modular_computer/console/New() + ..() + cpu.battery_module = null + cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/wired(src) + tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src) + cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(src) // Consoles generally have better HDDs due to lower space limitations + var/area/A = get_area(src) + // Attempts to set this console's tag according to our area. Since some areas have stuff like "XX - YY" in their names we try to remove that too. + if(A && console_department) + cpu.network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_" + else if(A) + cpu.network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_") + else if(console_department) + cpu.network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_") + else + cpu.network_card.identification_string = "Unknown Console" + if(cpu) + cpu.screen_on = 1 + update_icon() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/modular_laptop.dm b/code/modules/modular_computers/computers/machinery/modular_laptop.dm new file mode 100644 index 00000000000..55cb385a4e1 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_laptop.dm @@ -0,0 +1,110 @@ +// Laptop in it's item state, can be carried around. + +/obj/item/laptop + name = "laptop computer" + desc = "A portable computer. It is closed." + icon = 'icons/obj/modular_laptop.dmi' + icon_state = "laptop-closed" + item_state = "laptop-inhand" + w_class = 3 + var/obj/machinery/modular_computer/laptop/stored_computer = null + +/obj/item/laptop/verb/open_computer() + set name = "Open Laptop" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + if(!istype(loc,/turf)) + usr << "[src] is too bulky! You'll have to set it down." + return + + if(!stored_computer) + if(contents.len) + for(var/obj/O in contents) + O.forceMove(src.loc) + usr << "\The [src] crumbles to pieces." + spawn(5) + qdel(src) + return + + stored_computer.forceMove(src.loc) + stored_computer.stat &= ~MAINT + stored_computer.update_icon() + if(stored_computer.cpu) + stored_computer.cpu.screen_on = 1 + loc = stored_computer + usr << "You open \the [src]." + + +/obj/item/laptop/AltClick() + if(Adjacent(usr)) + open_computer() + +// The actual laptop +/obj/machinery/modular_computer/laptop + name = "laptop computer" + desc = "A portable computer." + var/obj/item/laptop/portable = null // Portable version of this computer, dropped on alt-click to allow transport. Used by laptops. + hardware_flag = PROGRAM_LAPTOP + icon_state_unpowered = "laptop-open" // Icon state when the computer is turned off + icon = 'icons/obj/modular_laptop.dmi' + icon_state = "laptop-open" + base_idle_power_usage = 25 + base_active_power_usage = 200 + max_hardware_size = 2 + light_strength = 3 + _max_damage = 200 + _break_damage = 100 + +/obj/machinery/modular_computer/laptop/buildable/New() + ..() + // User-built consoles start as empty frames. + qdel(tesla_link) + qdel(cpu.network_card) + qdel(cpu.hard_drive) + +// Close the computer. collapsing it into movable item that can't be used. +/obj/machinery/modular_computer/laptop/verb/close_computer() + set name = "Close Laptop" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + close_laptop(usr) + +/obj/machinery/modular_computer/laptop/proc/close_laptop(mob/user = null) + if(istype(loc,/obj/item/laptop)) + return + if(!istype(loc,/turf)) + return + + if(!portable) + portable=new + portable.stored_computer = src + + portable.forceMove(src.loc) + src.forceMove(portable) + stat |= MAINT + if(user) + user << "You close \the [src]." + if(cpu) + cpu.screen_on = 0 + +/obj/machinery/modular_computer/laptop/AltClick() + if(Adjacent(usr)) + close_laptop() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/status_icons.dmi b/code/modules/modular_computers/computers/status_icons.dmi new file mode 100644 index 0000000000000000000000000000000000000000..52127ec484268b00240fbde8364073fadaa39b92 GIT binary patch literal 818 zcmV-21I_%2P)vOM0000OP)t-sz`(!& zJOBXy0RR60{{R3y002BZ0KmY&jE4BJ00001bW%=J06^y0W&i*HdU{k?bVOxyV{&P5 zbZKvH004NLQ&w0eu$DM)Bz1|bJL-!NX?I*#`0DBdr zzW*a!zMMEEK#~FnI*e3NtH1o?_=5_7S2ghwS&io+ZI877IX%~3pX>R9o1YpO6EG%Ve8V?@Q>of5 zDUy4^*PCE>wlUt*^G+rJT79Xqt`!I_yf3RZ{660kU5B>PQdyHnUV#%bB@BjNoM z!JZ=zLRdYBwCi$MAR^SlDybpjVwgvK2l#BNZUWngD`ATgoY@#jIJYH} zaK0^q!Gt7Q^Ld8BJq0uOsY!WudP<+E!Q7`NCHYqFe&4mSuu4GoG;H8wK9AQ$b zBQzPxwoU9B7H*WdoN{1`xh3Re;KA%U2R5AB{G_(4VcBQG8g#;-HVg)q0p^pEEcg^j zjiyKo_k)M|qzuyDw?AwlhWUZ^x<67Y7}isfT9dMFR7JePI(zVk!UKVZy!s>xte~ij{RoVBIFH zvY9ZVFIU!brhF=*H-T!nLfEZ<3yxjEmBRMGI;4yhshU)Ykg*c$Y>}vI`NqSqQcbD| wsW~wZ*QAQzs#Jyd=yH|@TXk_7d+6)rFFs{kYNr;VkN^Mx07*qoM6N<$g8D9fdH?_b literal 0 HcmV?d00001 diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm new file mode 100644 index 00000000000..c5c1d9e86e5 --- /dev/null +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -0,0 +1,39 @@ +var/global/file_uid = 0 + +/datum/computer_file/ + var/filename = "NewFile" // Placeholder. No spacebars + var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case + var/size = 1 // File size in GQ. Integers only! + var/obj/item/weapon/computer_hardware/hard_drive/holder // Holder that contains this file. + var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means. + var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. + var/uid // UID of this file + +/datum/computer_file/New() + ..() + uid = file_uid + file_uid++ + +/datum/computer_file/Destroy() + if(!holder) + return ..() + + holder.remove_file(src) + // holder.holder is the computer that has drive installed. If we are Destroy()ing program that's currently running kill it. + if(holder.holder2 && holder.holder2.active_program == src) + holder.holder2.kill_program(1) + holder = null + ..() + +// Returns independent copy of this file. +/datum/computer_file/proc/clone(var/rename = 0) + var/datum/computer_file/temp = new type + temp.unsendable = unsendable + temp.undeletable = undeletable + temp.size = size + if(rename) + temp.filename = filename + "(Copy)" + else + temp.filename = filename + temp.filetype = filetype + return temp \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/data.dm b/code/modules/modular_computers/file_system/data.dm new file mode 100644 index 00000000000..32ef6f53dd1 --- /dev/null +++ b/code/modules/modular_computers/file_system/data.dm @@ -0,0 +1,20 @@ +// /data/ files store data in string format. +// They don't contain other logic for now. +/datum/computer_file/data + var/stored_data = "" // Stored data in string format. + filetype = "DAT" + var/block_size = 250 + var/do_not_edit = 0 // Whether the user will be reminded that the file probably shouldn't be edited. + +/datum/computer_file/data/clone() + var/datum/computer_file/data/temp = ..() + temp.stored_data = stored_data + return temp + +// Calculates file size from amount of characters in saved string +/datum/computer_file/data/proc/calculate_size() + size = max(1, round(length(stored_data) / block_size)) + +/datum/computer_file/data/logfile + filetype = "LOG" + diff --git a/code/modules/modular_computers/file_system/news_article.dm b/code/modules/modular_computers/file_system/news_article.dm new file mode 100644 index 00000000000..2af9be7c20b --- /dev/null +++ b/code/modules/modular_computers/file_system/news_article.dm @@ -0,0 +1,29 @@ +// /data/ files store data in string format. +// They don't contain other logic for now. +/datum/computer_file/data/news_article + filetype = "XNML" + filename = "Unknown News Entry" + block_size = 1000 // Results in smaller files + do_not_edit = 1 // Editing the file breaks most formatting due to some HTML tags not being accepted as input from average user. + var/server_file_path // File path to HTML file that will be loaded on server start. Example: '/news_articles/space_magazine_1.html'. Use the /news_articles/ folder! + +/datum/computer_file/data/news_article/New(var/load_from_file = 0) + ..() + if(server_file_path && load_from_file) + stored_data = file2text(server_file_path) + calculate_size() + + +// NEWS DEFINITIONS BELOW THIS LINE + +/datum/computer_file/data/news_article/space/vol_one + filename = "SPACE Magazine vol. 1" + server_file_path = 'news_articles/space_magazine_1.html' + +/datum/computer_file/data/news_article/space/vol_two + filename = "SPACE Magazine vol. 2" + server_file_path = 'news_articles/space_magazine_2.html' + +/datum/computer_file/data/news_article/space/vol_three + filename = "SPACE Magazine vol. 3" + server_file_path = 'news_articles/space_magazine_3.html' \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm new file mode 100644 index 00000000000..53de9c91d6e --- /dev/null +++ b/code/modules/modular_computers/file_system/program.dm @@ -0,0 +1,145 @@ +// /program/ files are executable programs that do things. +/datum/computer_file/program + filetype = "PRG" + filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET! + var/required_access = null // List of required accesses to *run* the program. + var/datum/nano_module/NM = null // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact. + var/nanomodule_path = null // Path to nanomodule, make sure to set this if implementing new program. + var/program_state = PROGRAM_STATE_KILLED// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running. + var/obj/item/modular_computer/computer // Device that runs this program. + var/filedesc = "Unknown Program" // User-friendly name of this program. + var/extended_desc = "N/A" // Short description of this program's function. + var/program_icon_state = null // Program-specific screen icon state + var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes. + var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION) + var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc. + var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL + var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging. + var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable. + var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. + var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick + var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! + +/datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) + ..() + if(comp && istype(comp)) + computer = comp + +/datum/computer_file/program/Destroy() + computer = null + . = ..() + +/datum/computer_file/program/nano_host() + return computer.nano_host() + +/datum/computer_file/program/clone() + var/datum/computer_file/program/temp = ..() + temp.required_access = required_access + temp.nanomodule_path = nanomodule_path + temp.filedesc = filedesc + temp.program_icon_state = program_icon_state + temp.requires_ntnet = requires_ntnet + temp.requires_ntnet_feature = requires_ntnet_feature + temp.usage_flags = usage_flags + return temp + +// Relays icon update to the computer. +/datum/computer_file/program/proc/update_computer_icon() + if(computer) + computer.update_icon() + +// Attempts to create a log in global ntnet datum. Returns 1 on success, 0 on fail. +/datum/computer_file/program/proc/generate_network_log(var/text) + if(computer) + return computer.add_log(text) + return 0 + +/datum/computer_file/program/proc/is_supported_by_hardware(var/hardware_flag = 0, var/loud = 0, var/mob/user = null) + if(!(hardware_flag & usage_flags)) + if(loud && computer && user) + user << "\The [computer] flashes an \"Hardware Error - Incompatible software\" warning." + return 0 + return 1 + +/datum/computer_file/program/proc/get_signal(var/specific_action = 0) + if(computer) + return computer.get_ntnet_status(specific_action) + return 0 + +// Called by Process() on device that runs us, once every tick. +/datum/computer_file/program/proc/process_tick() + return 1 + +// Check if the user can run program. Only humans can operate computer. Automatically called in run_program() +// User has to wear their ID or have it inhand for ID Scan to work. +// Can also be called manually, with optional parameter being access_to_check to scan the user's ID +/datum/computer_file/program/proc/can_run(mob/living/user, loud = 0, access_to_check) + // Defaults to required_access + if(!access_to_check) + access_to_check = required_access + if(!access_to_check) // No required_access, allow it. + return 1 + + var/obj/item/weapon/card/id/I = user.GetIdCard() + if(!I) + if(loud) + user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." + return 0 + + if(access_to_check in I.access) + return 1 + else if(loud) + user << "\The [computer] flashes an \"Access Denied\" warning." + +// This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones +// always include the device here in this proc. This proc basically relays the request to whatever is running the program. +/datum/computer_file/program/proc/get_header_data() + if(computer) + return computer.get_header_data() + return list() + +// This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. +// When implementing new program based device, use this to run the program. +/datum/computer_file/program/proc/run_program(mob/living/user) + if(can_run(user, 1)) + if(nanomodule_path) + NM = new nanomodule_path(src, new /datum/topic_manager/program(src), src) + if(requires_ntnet && network_destination) + generate_network_log("Connection opened to [network_destination].") + program_state = PROGRAM_STATE_ACTIVE + return 1 + return 0 + +// Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. +/datum/computer_file/program/proc/kill_program(var/forced = 0) + program_state = PROGRAM_STATE_KILLED + if(network_destination) + generate_network_log("Connection to [network_destination] closed.") + if(NM) + qdel(NM) + NM = null + return 1 + +// This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. +// It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. +/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. + if(ui) + ui.close() + return computer.ui_interact(user) + if(istype(NM)) + NM.ui_interact(user, ui_key, null, force_open) + return 0 + return 1 + + +// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC: +// Topic calls are automagically forwarded from NanoModule this program contains. +// Calls beginning with "PRG_" are reserved for programs handling. +// Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) +// ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. +/datum/computer_file/program/Topic(href, href_list) + if(..()) + return 1 + if(computer) + return computer.Topic(href, href_list) diff --git a/code/modules/modular_computers/file_system/program_events.dm b/code/modules/modular_computers/file_system/program_events.dm new file mode 100644 index 00000000000..2901759b6c3 --- /dev/null +++ b/code/modules/modular_computers/file_system/program_events.dm @@ -0,0 +1,18 @@ +// Events are sent to the program by the computer. +// Always include a parent call when overriding an event. + +// Called when the ID card is removed from computer. ID is removed AFTER this proc. +/datum/computer_file/program/proc/event_idremoved(var/background) + return + +// Called when the computer fails due to power loss. Override when program wants to specifically react to power loss. +/datum/computer_file/program/proc/event_powerfailure(var/background) + kill_program(1) + +// Called when the network connectivity fails. Computer does necessary checks and only calls this when requires_ntnet_feature and similar variables are not met. +/datum/computer_file/program/proc/event_networkfailure(var/background) + kill_program(1) + if(background) + computer.visible_message("\The [computer]'s screen displays an \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error") + else + computer.visible_message("\The [computer]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.") diff --git a/code/modules/modular_computers/file_system/programs/_engineering.dm b/code/modules/modular_computers/file_system/programs/_engineering.dm new file mode 100644 index 00000000000..71bc0d475b3 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/_engineering.dm @@ -0,0 +1,85 @@ +// These programs are associated with engineering. + +/datum/computer_file/program/power_monitor + filename = "powermonitor" + filedesc = "Power Monitoring" + nanomodule_path = /datum/nano_module/power_monitor/ + program_icon_state = "power_monitor" + extended_desc = "This program connects to sensors around the station to provide information about electrical systems" + ui_header = "power_norm.gif" + required_access = access_engine + requires_ntnet = 1 + network_destination = "power monitoring system" + size = 9 + var/has_alert = 0 + +/datum/computer_file/program/power_monitor/process_tick() + ..() + var/datum/nano_module/power_monitor/NMA = NM + if(istype(NMA) && NMA.has_alarm()) + if(!has_alert) + program_icon_state = "power_monitor_warn" + ui_header = "power_warn.gif" + update_computer_icon() + has_alert = 1 + else + if(has_alert) + program_icon_state = "power_monitor" + ui_header = "power_norm.gif" + update_computer_icon() + has_alert = 0 + +/datum/computer_file/program/alarm_monitor + filename = "alarmmonitor" + filedesc = "Alarm Monitoring" + nanomodule_path = /datum/nano_module/alarm_monitor/engineering + ui_header = "alarm_green.gif" + program_icon_state = "alert-green" + extended_desc = "This program provides visual interface for station's alarm system." + requires_ntnet = 1 + network_destination = "alarm monitoring network" + size = 5 + var/has_alert = 0 + +/datum/computer_file/program/alarm_monitor/process_tick() + ..() + var/datum/nano_module/alarm_monitor/NMA = NM + if(istype(NMA) && NMA.has_major_alarms()) + if(!has_alert) + program_icon_state = "alert-red" + ui_header = "alarm_red.gif" + update_computer_icon() + has_alert = 1 + else + if(has_alert) + program_icon_state = "alert-green" + ui_header = "alarm_green.gif" + update_computer_icon() + has_alert = 0 + return 1 + +/datum/computer_file/program/atmos_control + filename = "atmoscontrol" + filedesc = "Atmosphere Control" + nanomodule_path = /datum/nano_module/atmos_control + program_icon_state = "atmos_control" + extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers." + required_access = access_atmospherics + requires_ntnet = 1 + network_destination = "atmospheric control system" + requires_ntnet_feature = NTNET_SYSTEMCONTROL + usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE + size = 17 + +/datum/computer_file/program/rcon_console + filename = "rconconsole" + filedesc = "RCON Remote Control" + nanomodule_path = /datum/nano_module/rcon + program_icon_state = "generic" + extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers." + required_access = access_engine + requires_ntnet = 1 + network_destination = "RCON remote control system" + requires_ntnet_feature = NTNET_SYSTEMCONTROL + usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE + size = 19 diff --git a/code/modules/modular_computers/file_system/programs/_medical.dm b/code/modules/modular_computers/file_system/programs/_medical.dm new file mode 100644 index 00000000000..4099d156bbb --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/_medical.dm @@ -0,0 +1,10 @@ +/datum/computer_file/program/suit_sensors + filename = "sensormonitor" + filedesc = "Suit Sensors Monitoring" + nanomodule_path = /datum/nano_module/crew_monitor + program_icon_state = "crew" + extended_desc = "This program connects to life signs monitoring system to provide basic information on crew health." + required_access = access_medical + requires_ntnet = 1 + network_destination = "crew lifesigns monitoring system" + size = 11 diff --git a/code/modules/modular_computers/file_system/programs/_program.dm b/code/modules/modular_computers/file_system/programs/_program.dm new file mode 100644 index 00000000000..1097ef65903 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/_program.dm @@ -0,0 +1,31 @@ +/obj/machinery/modular_computer/initial_data() + return cpu ? cpu.get_header_data() : ..() + +/obj/item/modular_computer/initial_data() + return get_header_data() + +/obj/machinery/modular_computer/update_layout() + return TRUE + +/obj/item/modular_computer/update_layout() + return TRUE + +/datum/nano_module/program + available_to_ai = FALSE + var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null. + +/datum/nano_module/program/New(var/host, var/topic_manager, var/program) + ..() + src.program = program + +/datum/topic_manager/program + var/datum/program + +/datum/topic_manager/program/New(var/datum/program) + ..() + src.program = program + +// Calls forwarded to PROGRAM itself should begin with "PRG_" +// Calls forwarded to COMPUTER running the program should begin with "PC_" +/datum/topic_manager/program/Topic(href, href_list) + return program && program.Topic(href, href_list) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm new file mode 100644 index 00000000000..b38a688c52d --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -0,0 +1,105 @@ +/datum/computer_file/program/ntnet_dos + filename = "ntn_dos" + filedesc = "DoS Traffic Generator" + program_icon_state = "hostile" + extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against same relay for increased effect" + size = 20 + requires_ntnet = 1 + available_on_ntnet = 0 + available_on_syndinet = 1 + nanomodule_path = /datum/nano_module/program/computer_dos/ + var/obj/machinery/ntnet_relay/target = null + var/dos_speed = 0 + var/error = "" + var/executed = 0 + +/datum/computer_file/program/ntnet_dos/process_tick() + dos_speed = 0 + switch(ntnet_status) + if(1) + dos_speed = NTNETSPEED_LOWSIGNAL * 10 + if(2) + dos_speed = NTNETSPEED_HIGHSIGNAL * 10 + if(3) + dos_speed = NTNETSPEED_ETHERNET * 10 + if(target && executed) + target.dos_overload += dos_speed + if(!target.is_operational()) + target.dos_sources.Remove(src) + target = null + error = "Connection to destination relay lost." + +/datum/computer_file/program/ntnet_dos/kill_program(var/forced) + target.dos_sources.Remove(src) + target = null + executed = 0 + + ..(forced) + +/datum/nano_module/program/computer_dos + name = "DoS Traffic Generator" + +/datum/nano_module/program/computer_dos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!ntnet_global) + return + var/datum/computer_file/program/ntnet_dos/PRG = program + var/list/data = list() + if(!istype(PRG)) + return + data = PRG.get_header_data() + + if(PRG.error) + data["error"] = PRG.error + else if(PRG.target && PRG.executed) + data["target"] = 1 + data["speed"] = PRG.dos_speed + + // This is mostly visual, generate some strings of 1s and 0s + // Probability of 1 is equal of completion percentage of DoS attack on this relay. + // Combined with UI updates this adds quite nice effect to the UI + var/percentage = PRG.target.dos_overload * 100 / PRG.target.dos_capacity + var/list/strings[0] + for(var/j, j<10, j++) + var/string = "" + for(var/i, i<20, i++) + string = "[string][prob(percentage)]" + strings.Add(string) + data["dos_strings"] = strings + else + var/list/relays[0] + for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) + relays.Add(R.uid) + data["relays"] = relays + data["focus"] = PRG.target ? PRG.target.uid : null + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_dos.tmpl", "DoS Traffic Generator", 400, 250, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/computer_file/program/ntnet_dos/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_target_relay"]) + for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) + if("[R.uid]" == href_list["PRG_target_relay"]) + target = R + return 1 + if(href_list["PRG_reset"]) + if(target) + target.dos_sources.Remove(src) + target = null + executed = 0 + error = "" + return 1 + if(href_list["PRG_execute"]) + if(target) + executed = 1 + target.dos_sources.Add(src) + if(ntnet_global.intrusion_detection_enabled) + ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]") + ntnet_global.intrusion_detection_alarm = 1 + return 1 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm new file mode 100644 index 00000000000..87ce4de9cc4 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -0,0 +1,79 @@ +/datum/computer_file/program/revelation + filename = "revelation" + filedesc = "Revelation" + program_icon_state = "hostile" + extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution." + size = 13 + requires_ntnet = 0 + available_on_ntnet = 0 + available_on_syndinet = 1 + nanomodule_path = /datum/nano_module/program/revelation/ + var/armed = 0 + +/datum/computer_file/program/revelation/run_program(var/mob/living/user) + . = ..(user) + if(armed) + activate() + +/datum/computer_file/program/revelation/proc/activate() + if(computer) + computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.") + computer.enabled = 0 + computer.update_icon() + qdel(computer.hard_drive) + if(computer.battery_module && prob(25)) + qdel(computer.battery_module) + computer.visible_message("\The [computer]'s battery explodes in rain of sparks.") + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(10, 1, computer.loc) + s.start() + if(istype(computer, /obj/item/modular_computer/processor)) + var/obj/item/modular_computer/processor/P = computer + if(P.machinery_computer.tesla_link && prob(50)) + qdel(P.machinery_computer.tesla_link) + computer.visible_message("\The [computer]'s tesla link explodes in rain of sparks.") + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(10, 1, computer.loc) + s.start() + +/datum/computer_file/program/revelation/Topic(href, href_list) + if(..()) + return 1 + else if(href_list["PRG_arm"]) + armed = !armed + else if(href_list["PRG_activate"]) + activate() + else if(href_list["PRG_obfuscate"]) + var/mob/living/user = usr + var/newname = sanitize(input(user, "Enter new program name: ")) + if(!newname) + return + filedesc = newname + return 1 + +/datum/computer_file/program/revelation/clone() + var/datum/computer_file/program/revelation/temp = ..() + temp.armed = armed + return temp + +/datum/nano_module/program/revelation + name = "Revelation Virus" + +/datum/nano_module/program/revelation/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = list() + var/datum/computer_file/program/revelation/PRG = program + if(!istype(PRG)) + return + + data = PRG.get_header_data() + + data["armed"] = PRG.armed + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "revelation.tmpl", "Revelation Virus", 400, 250, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm new file mode 100644 index 00000000000..0ee48b2474c --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -0,0 +1,228 @@ +/datum/computer_file/program/card_mod + filename = "cardmod" + filedesc = "ID card modification program" + nanomodule_path = /datum/nano_module/program/card_mod + program_icon_state = "id" + extended_desc = "Program for programming employee ID cards to access parts of the station." + required_access = access_change_ids + requires_ntnet = 0 + size = 8 + +/datum/nano_module/program/card_mod + name = "ID card modification program" + var/mod_mode = 1 + var/is_centcom = 0 + var/show_assignments = 0 + +/datum/nano_module/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = host.initial_data() + + data["src"] = "\ref[src]" + data["station_name"] = station_name() + data["manifest"] = data_core ? data_core.get_manifest(0) : null + data["assignments"] = show_assignments + if(program && program.computer) + data["have_id_slot"] = !!program.computer.card_slot + data["have_printer"] = !!program.computer.nano_printer + data["authenticated"] = program.can_run(user) + if(!program.computer.card_slot) + mod_mode = 0 //We can't modify IDs when there is no card reader + else + data["have_id_slot"] = 0 + data["have_printer"] = 0 + data["authenticated"] = 0 + data["mmode"] = mod_mode + data["centcom_access"] = is_centcom + + if(program && program.computer && program.computer.card_slot) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + data["has_id"] = !!id_card + data["id_account_number"] = id_card ? id_card.associated_account_number : null + data["id_rank"] = id_card && id_card.assignment ? id_card.assignment : "Unassigned" + data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----" + data["id_name"] = id_card ? id_card.name : "-----" + + + data["engineering_jobs"] = format_jobs(engineering_positions) + data["medical_jobs"] = format_jobs(medical_positions) + data["science_jobs"] = format_jobs(science_positions) + data["security_jobs"] = format_jobs(security_positions) + data["cargo_jobs"] = format_jobs(cargo_positions) + data["civilian_jobs"] = format_jobs(civilian_positions) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + + data["all_centcom_access"] = is_centcom ? get_accesses(1) : null + data["regions"] = get_accesses() + + if(program.computer.card_slot.stored_card) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + if(is_centcom) + var/list/all_centcom_access = list() + for(var/access in get_all_centcom_access()) + all_centcom_access.Add(list(list( + "desc" = replacetext(get_centcom_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + data["all_centcom_access"] = all_centcom_access + else + var/list/regions = list() + for(var/i = 1; i <= 7; i++) + var/list/accesses = list() + for(var/access in get_region_accesses(i)) + if (get_access_desc(access)) + accesses.Add(list(list( + "desc" = replacetext(get_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + + regions.Add(list(list( + "name" = get_region_accesses_name(i), + "accesses" = accesses))) + data["regions"] = regions + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "identification_computer.tmpl", name, 600, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + +/datum/nano_module/program/card_mod/proc/format_jobs(list/jobs) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + var/list/formatted = list() + for(var/job in jobs) + formatted.Add(list(list( + "display_name" = replacetext(job, " ", " "), + "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", + "job" = job))) + + return formatted + +/datum/nano_module/program/card_mod/proc/get_accesses(var/is_centcom = 0) + return null + + +/datum/computer_file/program/card_mod/Topic(href, href_list) + if(..()) + return 1 + + var/mob/user = usr + var/obj/item/weapon/card/id/user_id_card = user.GetIdCard() + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card + var/datum/nano_module/program/card_mod/module = NM + switch(href_list["action"]) + if("switchm") + if(href_list["target"] == "mod") + module.mod_mode = 1 + else if (href_list["target"] == "manifest") + module.mod_mode = 0 + if("togglea") + if(module.show_assignments) + module.show_assignments = 0 + else + module.show_assignments = 1 + if("print") + if(computer && computer.nano_printer) //This option should never be called if there is no printer + if(module.mod_mode) + if(can_run(user, 1)) + var/contents = {"

Access Report

+ Prepared By: [user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
+ For: [id_card.registered_name ? id_card.registered_name : "Unregistered"]
+
+ Assignment: [id_card.assignment]
+ Account Number: #[id_card.associated_account_number]
+ Blood Type: [id_card.blood_type]

+ Access:
+ "} + + var/known_access_rights = get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM) + for(var/A in id_card.access) + if(A in known_access_rights) + contents += " [get_access_desc(A)]" + + if(!computer.nano_printer.print_text(contents,"access report")) + usr << "Hardware error: Printer was unable to print the file. It may be out of paper." + return + else + computer.visible_message("\The [computer] prints out paper.") + else + var/contents = {"

Crew Manifest

+
+ [data_core ? data_core.get_manifest(0) : ""] + "} + if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", stationtime2text()))) + usr << "Hardware error: Printer was unable to print the file. It may be out of paper." + return + else + computer.visible_message("\The [computer] prints out paper.") + if("eject") + if(computer && computer.card_slot) + if(id_card) + data_core.manifest_modify(id_card.registered_name, id_card.assignment) + computer.proc_eject_id(user) + if("terminate") + if(computer && can_run(user, 1)) + id_card.assignment = "Terminated" + remove_nt_access(id_card) + callHook("terminate_employee", list(id_card)) + if("edit") + if(computer && can_run(user, 1)) + if(href_list["name"]) + var/temp_name = sanitizeName(input("Enter name.", "Name", id_card.registered_name)) + if(temp_name) + id_card.registered_name = temp_name + else + computer.visible_message("[computer] buzzes rudely.") + else if(href_list["account"]) + var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) + id_card.associated_account_number = account_num + if("assign") + if(computer && can_run(user, 1) && id_card) + var/t1 = href_list["assign_target"] + if(t1 == "Custom") + var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment", id_card.assignment), 45) + //let custom jobs function as an impromptu alt title, mainly for sechuds + if(temp_t) + id_card.assignment = temp_t + else + var/list/access = list() + if(module.is_centcom) + access = get_centcom_access(t1) + else + var/datum/job/jobdatum + for(var/jobtype in typesof(/datum/job)) + var/datum/job/J = new jobtype + if(ckey(J.title) == ckey(t1)) + jobdatum = J + break + if(!jobdatum) + usr << "No log exists for this job: [t1]" + return + + access = jobdatum.get_access() + + remove_nt_access(id_card) + apply_access(id_card, access) + id_card.assignment = t1 + id_card.rank = t1 + + callHook("reassign_employee", list(id_card)) + if("access") + if(href_list["allowed"] && computer && can_run(user, 1)) + var/access_type = text2num(href_list["access_target"]) + var/access_allowed = text2num(href_list["allowed"]) + if(access_type in get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM)) + id_card.access -= access_type + if(!access_allowed) + id_card.access += access_type + if(id_card) + id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])") + + nanomanager.update_uis(NM) + return 1 + +/datum/computer_file/program/card_mod/proc/remove_nt_access(var/obj/item/weapon/card/id/id_card) + id_card.access -= get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM) + +/datum/computer_file/program/card_mod/proc/apply_access(var/obj/item/weapon/card/id/id_card, var/list/accesses) + id_card.access |= accesses diff --git a/code/modules/modular_computers/file_system/programs/comm.dm b/code/modules/modular_computers/file_system/programs/comm.dm new file mode 100644 index 00000000000..736b87a1665 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/comm.dm @@ -0,0 +1,417 @@ +#define STATE_DEFAULT 1 +#define STATE_MESSAGELIST 2 +#define STATE_VIEWMESSAGE 3 +#define STATE_STATUSDISPLAY 4 +#define STATE_ALERT_LEVEL 5 +/datum/computer_file/program/comm + filename = "comm" + filedesc = "Command and communications program." + program_icon_state = "comm" + nanomodule_path = /datum/nano_module/program/comm + extended_desc = "Used to command and control the station. Can relay long-range communications. This program can not be run on tablet computers." + required_access = access_heads + requires_ntnet = 1 + size = 12 + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP + network_destination = "station long-range communication array" + var/datum/comm_message_listener/message_core = new + +/datum/computer_file/program/comm/clone() + var/datum/computer_file/program/comm/temp = ..() + temp.message_core.messages = null + temp.message_core.messages = message_core.messages.Copy() + return temp + +/datum/nano_module/program/comm + name = "Command and communications program" + available_to_ai = TRUE + var/current_status = STATE_DEFAULT + var/msg_line1 = "" + var/msg_line2 = "" + var/centcomm_message_cooldown = 0 + var/announcment_cooldown = 0 + var/datum/announcement/priority/crew_announcement = new + var/current_viewing_message_id = 0 + var/current_viewing_message = null + +/datum/nano_module/program/comm/New() + ..() + crew_announcement.newscast = 1 + +/datum/nano_module/program/comm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = host.initial_data() + + if(program) + data["emagged"] = program.computer_emagged + data["net_comms"] = !!program.get_signal(NTNET_COMMUNICATION) //Double !! is needed to get 1 or 0 answer + data["net_syscont"] = !!program.get_signal(NTNET_SYSTEMCONTROL) + if(program.computer) + data["have_printer"] = !!program.computer.nano_printer + else + data["have_printer"] = 0 + else + data["emagged"] = 0 + data["net_comms"] = 1 + data["net_syscont"] = 1 + data["have_printer"] = 0 + + data["message_line1"] = msg_line1 + data["message_line2"] = msg_line2 + data["state"] = current_status + data["isAI"] = issilicon(usr) + data["authenticated"] = is_autenthicated(user) + data["boss_short"] = boss_short + data["current_security_level"] = security_level + data["current_security_level_title"] = num2seclevel(security_level) + + data["def_SEC_LEVEL_DELTA"] = SEC_LEVEL_DELTA + data["def_SEC_LEVEL_BLUE"] = SEC_LEVEL_BLUE + data["def_SEC_LEVEL_GREEN"] = SEC_LEVEL_GREEN + + var/datum/comm_message_listener/l = obtain_message_listener() + data["messages"] = l.messages + data["message_deletion_allowed"] = l != global_message_listener + data["message_current_id"] = current_viewing_message_id + if(current_viewing_message) + data["message_current"] = current_viewing_message + + if(emergency_shuttle.location()) + data["have_shuttle"] = 1 + if(emergency_shuttle.online()) + data["have_shuttle_called"] = 1 + else + data["have_shuttle_called"] = 0 + else + data["have_shuttle"] = 0 + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "communication.tmpl", name, 550, 420, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + +/datum/nano_module/program/comm/proc/is_autenthicated(var/mob/user) + if(program) + return program.can_run(user) + return 1 + +/datum/nano_module/program/comm/proc/obtain_message_listener() + if(program) + var/datum/computer_file/program/comm/P = program + return P.message_core + return global_message_listener + +/datum/nano_module/program/comm/Topic(href, href_list) + if(..()) + return 1 + var/mob/user = usr + var/ntn_comm = program ? !!program.get_signal(NTNET_COMMUNICATION) : 1 + var/ntn_cont = program ? !!program.get_signal(NTNET_SYSTEMCONTROL) : 1 + var/datum/comm_message_listener/l = obtain_message_listener() + switch(href_list["action"]) + if("sw_menu") + . = 1 + current_status = text2num(href_list["target"]) + if("announce") + . = 1 + if(is_autenthicated(user) && !issilicon(usr) && ntn_comm) + if(user) + var/obj/item/weapon/card/id/id_card = user.GetIdCard() + crew_announcement.announcer = GetNameAndAssignmentFromId(id_card) + else + crew_announcement.announcer = "Unknown" + if(announcment_cooldown) + usr << "Please allow at least one minute to pass between announcements" + return TRUE + var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") as null|text + if(!input || !can_still_topic()) + return 1 + crew_announcement.Announce(input) + announcment_cooldown = 1 + spawn(600)//One minute cooldown + announcment_cooldown = 0 + if("message") + . = 1 + if(href_list["target"] == "emagged") + if(program) + if(is_autenthicated(user) && program.computer_emagged && !issilicon(usr) && ntn_comm) + if(centcomm_message_cooldown) + usr << "Arrays recycling. Please stand by." + nanomanager.update_uis(src) + return + var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) + if(!input || !can_still_topic()) + return 1 + Syndicate_announce(input, usr) + usr << "Message transmitted." + log_say("[key_name(usr)] has made an illegal announcement: [input]") + centcomm_message_cooldown = 1 + spawn(300)//30 second cooldown + centcomm_message_cooldown = 0 + else if(href_list["target"] == "regular") + if(is_autenthicated(user) && !issilicon(usr) && ntn_comm) + if(centcomm_message_cooldown) + usr << "Arrays recycling. Please stand by." + nanomanager.update_uis(src) + return + if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. + usr <<"No Emergency Bluespace Relay detected. Unable to transmit message." + return 1 + var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) + if(!input || !can_still_topic()) + return 1 + Centcomm_announce(input, usr) + usr << "Message transmitted." + log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") + centcomm_message_cooldown = 1 + spawn(300) //30 second cooldown + centcomm_message_cooldown = 0 + if("shuttle") + . = 1 + if(is_autenthicated(user) && ntn_cont) + if(href_list["target"] == "call") + var/confirm = alert("Are you sure you want to call the shuttle?", name, "No", "Yes") + if(confirm == "Yes" && can_still_topic()) + call_shuttle_proc(usr) + if(href_list["target"] == "cancel" && !issilicon(usr)) + var/confirm = alert("Are you sure you want to cancel the shuttle?", name, "No", "Yes") + if(confirm == "Yes" && can_still_topic()) + cancel_call_proc(usr) + if("setstatus") + . = 1 + if(is_autenthicated(user) && ntn_cont) + switch(href_list["target"]) + if("line1") + var/linput = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", msg_line1) as text|null, 40), 40) + if(can_still_topic()) + msg_line1 = linput + if("line2") + var/linput = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", msg_line2) as text|null, 40), 40) + if(can_still_topic()) + msg_line2 = linput + if("message") + post_status("message", msg_line1, msg_line2) + if("alert") + post_status("alert", href_list["alert"]) + else + post_status(href_list["target"]) + if("setalert") + . = 1 + if(is_autenthicated(user) && !issilicon(usr) && ntn_cont && ntn_comm) + var/current_level = text2num(href_list["target"]) + var/confirm = alert("Are you sure you want to change alert level to [num2seclevel(current_level)]?", name, "No", "Yes") + if(confirm == "Yes" && can_still_topic()) + var/old_level = security_level + if(!current_level) current_level = SEC_LEVEL_GREEN + if(current_level < SEC_LEVEL_GREEN) current_level = SEC_LEVEL_GREEN + if(current_level > SEC_LEVEL_BLUE) current_level = SEC_LEVEL_BLUE //Cannot engage delta with this + set_security_level(current_level) + if(security_level != old_level) + log_game("[key_name(usr)] has changed the security level to [get_security_level()].") + message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") + switch(security_level) + if(SEC_LEVEL_GREEN) + feedback_inc("alert_comms_green",1) + if(SEC_LEVEL_BLUE) + feedback_inc("alert_comms_blue",1) + else + usr << "You press button, but red light flashes and nothing happens." //This should never happen + current_status = STATE_DEFAULT + if("viewmessage") + . = 1 + if(is_autenthicated(user) && ntn_comm) + current_viewing_message_id = text2num(href_list["target"]) + for(var/list/m in l.messages) + if(m["id"] == current_viewing_message_id) + current_viewing_message = m + current_status = STATE_VIEWMESSAGE + if("delmessage") + . = 1 + if(is_autenthicated(user) && ntn_comm && l != global_message_listener) + l.Remove(current_viewing_message) + current_status = STATE_MESSAGELIST + if("printmessage") + . = 1 + if(is_autenthicated(user) && ntn_comm) + if(program && program.computer && program.computer.nano_printer) + if(!program.computer.nano_printer.print_text(current_viewing_message["contents"],current_viewing_message["title"])) + usr << "Hardware error: Printer was unable to print the file. It may be out of paper." + else + program.computer.visible_message("\The [program.computer] prints out paper.") + +#undef STATE_DEFAULT +#undef STATE_MESSAGELIST +#undef STATE_VIEWMESSAGE +#undef STATE_STATUSDISPLAY +#undef STATE_ALERT_LEVEL + +/* +General message handling stuff +*/ +var/list/comm_message_listeners = list() //We first have to initialize list then we can use it. +var/datum/comm_message_listener/global_message_listener = new //May be used by admins +var/last_message_id = 0 + +/proc/get_comm_message_id() + last_message_id = last_message_id + 1 + return last_message_id + +/proc/post_comm_message(var/message_title, var/message_text) + var/list/message = list() + message["id"] = get_comm_message_id() + message["title"] = message_title + message["contents"] = message_text + + for (var/datum/comm_message_listener/l in comm_message_listeners) + l.Add(message) + + for (var/obj/machinery/modular_computer/console/preset/command/main/computer in global_modular_computers) + if(!(computer.stat & (BROKEN | NOPOWER)) && computer.cpu) + if(computer.cpu.hard_drive) + var/datum/computer_file/program/comm/C = locate(/datum/computer_file/program/comm) in computer.cpu.hard_drive.stored_files + if(C) + var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper(computer.loc) + intercept.name = message_title + intercept.info = message_text + +/datum/comm_message_listener + var/list/messages + +/datum/comm_message_listener/New() + ..() + messages = list() + comm_message_listeners.Add(src) + +/datum/comm_message_listener/proc/Add(var/list/message) + messages[++messages.len] = message + +/datum/comm_message_listener/proc/Remove(var/list/message) + messages -= list(message) + +/proc/post_status(var/command, var/data1, var/data2) + + var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) + + if(!frequency) return + + + var/datum/signal/status_signal = new + status_signal.source = src + status_signal.transmission_method = 1 + status_signal.data["command"] = command + + switch(command) + if("message") + status_signal.data["msg1"] = data1 + status_signal.data["msg2"] = data2 + log_admin("STATUS: [key_name(usr)] set status screen message with [src]: [data1] [data2]") + if("alert") + status_signal.data["picture_state"] = data1 + + frequency.post_signal(src, status_signal) + +/proc/cancel_call_proc(var/mob/user) + if (!( ticker ) || !emergency_shuttle.can_recall()) + return + if((ticker.mode.name == "blob")||(ticker.mode.name == "Meteor")) + return + + if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm + emergency_shuttle.recall() + log_game("[key_name(user)] has recalled the shuttle.") + message_admins("[key_name_admin(user)] has recalled the shuttle.", 1) + return + + +/proc/is_relay_online() + for(var/obj/machinery/bluespacerelay/M in machines) + if(M.stat == 0) + return 1 + return 0 + +/proc/enable_prison_shuttle(var/mob/user) + for(var/obj/machinery/computer/prison_shuttle/PS in machines) + PS.allowedtocall = !(PS.allowedtocall) + +/proc/call_shuttle_proc(var/mob/user) + if ((!( ticker ) || !emergency_shuttle.location())) + return + + if(!universe.OnShuttleCall(usr)) + user << "Cannot establish a bluespace connection." + return + + if(deathsquad.deployed) + user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." + return + + if(emergency_shuttle.deny_shuttle) + user << "The emergency shuttle may not be sent at this time. Please try again later." + return + + if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE + user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minute\s before trying again." + return + + if(emergency_shuttle.going_to_centcom()) + user << "The emergency shuttle may not be called while returning to [boss_short]." + return + + if(emergency_shuttle.online()) + user << "The emergency shuttle is already on its way." + return + + if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic") + user << "Under directive 7-10, [station_name()] is quarantined until further notice." + return + + if(!emergency_shuttle.call_evac(user)) + return + log_and_message_admins("has called the shuttle.") + +/proc/init_shift_change(var/mob/user, var/force = 0) + if ((!( ticker ) || !emergency_shuttle.location())) + return + + if(emergency_shuttle.going_to_centcom()) + user << "The shuttle may not be called while returning to [boss_short]." + return + + if(emergency_shuttle.online()) + user << "The shuttle is already on its way." + return + + // if force is 0, some things may stop the shuttle call + if(!force) + if(emergency_shuttle.deny_shuttle) + user << "[boss_short] does not currently have a shuttle available in your sector. Please try again later." + return + + if(deathsquad.deployed == 1) + user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." + return + + if(world.time < 54000) // 30 minute grace period to let the game get going + user << "The shuttle is refueling. Please wait another [round((54000-world.time)/60)] minutes before trying again." + return + + if(ticker.mode.auto_recall_shuttle) + //New version pretends to call the shuttle but cause the shuttle to return after a random duration. + emergency_shuttle.auto_recall = 1 + + if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic") + user << "Under directive 7-10, [station_name()] is quarantined until further notice." + return + + emergency_shuttle.call_transfer() + + //delay events in case of an autotransfer + if (isnull(user)) + event_manager.delay_events(EVENT_LEVEL_MODERATE, 10200) //17 minutes + event_manager.delay_events(EVENT_LEVEL_MAJOR, 10200) + + log_game("[user? key_name(user) : "Autotransfer"] has called the shuttle.") + message_admins("[user? key_name_admin(user) : "Autotransfer"] has called the shuttle.", 1) + + return diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm new file mode 100644 index 00000000000..c7b898cb83b --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -0,0 +1,62 @@ +// This is special hardware configuration program. +// It is to be used only with modular computers. +// It allows you to toggle components of your device. + +/datum/computer_file/program/computerconfig + filename = "compconfig" + filedesc = "Computer Configuration Tool" + extended_desc = "This program allows configuration of computer's hardware" + program_icon_state = "generic" + unsendable = 1 + undeletable = 1 + size = 4 + available_on_ntnet = 0 + requires_ntnet = 0 + nanomodule_path = /datum/nano_module/program/computer_configurator/ + +/datum/nano_module/program/computer_configurator + name = "NTOS Computer Configuration Tool" + var/obj/item/modular_computer/movable = null + +/datum/nano_module/program/computer_configurator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(program) + movable = program.computer + if(!istype(movable)) + movable = null + + // No computer connection, we can't get data from that. + if(!movable) + return 0 + + var/list/data = list() + + if(program) + data = program.get_header_data() + + var/list/hardware = movable.get_all_components() + + data["disk_size"] = movable.hard_drive.max_capacity + data["disk_used"] = movable.hard_drive.used_capacity + data["power_usage"] = movable.last_power_usage + data["battery_exists"] = movable.battery_module ? 1 : 0 + if(movable.battery_module) + data["battery_rating"] = movable.battery_module.battery.maxcharge + data["battery_percent"] = round(movable.battery_module.battery.percent()) + + var/list/all_entries[0] + for(var/obj/item/weapon/computer_hardware/H in hardware) + all_entries.Add(list(list( + "name" = H.name, + "desc" = H.desc, + "enabled" = H.enabled, + "critical" = H.critical, + "powerusage" = H.power_usage + ))) + + data["hardware"] = all_entries + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "laptop_configuration.tmpl", "NTOS Configuration Utility", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm new file mode 100644 index 00000000000..c2b25581d0f --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -0,0 +1,241 @@ +/datum/computer_file/program/filemanager + filename = "filemanager" + filedesc = "NTOS File Manager" + extended_desc = "This program allows management of files." + program_icon_state = "generic" + size = 8 + requires_ntnet = 0 + available_on_ntnet = 0 + undeletable = 1 + nanomodule_path = /datum/nano_module/program/computer_filemanager/ + var/open_file + var/error + +/datum/computer_file/program/filemanager/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["PRG_openfile"]) + . = 1 + open_file = href_list["PRG_openfile"] + if(href_list["PRG_newtextfile"]) + . = 1 + var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename")) + if(!newname) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = new/datum/computer_file/data() + F.filename = newname + F.filetype = "TXT" + HDD.store_file(F) + if(href_list["PRG_deletefile"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_deletefile"]) + if(!file || file.undeletable) + return 1 + HDD.remove_file(file) + if(href_list["PRG_usbdeletefile"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.portable_drive + if(!RHDD) + return 1 + var/datum/computer_file/file = RHDD.find_file_by_name(href_list["PRG_usbdeletefile"]) + if(!file || file.undeletable) + return 1 + RHDD.remove_file(file) + if(href_list["PRG_closefile"]) + . = 1 + open_file = null + error = null + if(href_list["PRG_clone"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_clone"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(1) + HDD.store_file(C) + if(href_list["PRG_rename"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_rename"]) + if(!file || !istype(file)) + return 1 + var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename)) + if(file && newname) + file.filename = newname + if(href_list["PRG_edit"]) + . = 1 + if(!open_file) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) + if(!F || !istype(F)) + return 1 + if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) + return 1 + // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. + var/newtext = sanitize(html_decode(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", F.stored_data) as message|null), 16384) + if(!newtext) + return + if(F) + var/datum/computer_file/data/backup = F.clone() + HDD.remove_file(F) + F.stored_data = newtext + F.calculate_size() + // We can't store the updated file, it's probably too large. Print an error and restore backed up version. + // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space. + // They will be able to copy-paste the text from error screen and store it in notepad or something. + if(!HDD.store_file(F)) + error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:

[F.stored_data]

" + HDD.store_file(backup) + if(href_list["PRG_printfile"]) + . = 1 + if(!open_file) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) + if(!F || !istype(F)) + return 1 + if(!computer.nano_printer) + error = "Missing Hardware: Your computer does not have required hardware to complete this operation." + return 1 + if(!computer.nano_printer.print_text(parse_tags(F.stored_data))) + error = "Hardware error: Printer was unable to print the file. It may be out of paper." + return 1 + if(href_list["PRG_copytousb"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive + if(!HDD || !RHDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_copytousb"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(0) + RHDD.store_file(C) + if(href_list["PRG_copyfromusb"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive + if(!HDD || !RHDD) + return 1 + var/datum/computer_file/F = RHDD.find_file_by_name(href_list["PRG_copyfromusb"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(0) + HDD.store_file(C) + if(.) + nanomanager.update_uis(NM) + +/datum/computer_file/program/filemanager/proc/parse_tags(var/t) + t = replacetext(t, "\[center\]", "
") + t = replacetext(t, "\[/center\]", "
") + t = replacetext(t, "\[br\]", "
") + t = replacetext(t, "\[b\]", "") + t = replacetext(t, "\[/b\]", "") + t = replacetext(t, "\[i\]", "") + t = replacetext(t, "\[/i\]", "") + t = replacetext(t, "\[u\]", "") + t = replacetext(t, "\[/u\]", "") + t = replacetext(t, "\[time\]", "[stationtime2text()]") + t = replacetext(t, "\[date\]", "[stationdate2text()]") + t = replacetext(t, "\[large\]", "") + t = replacetext(t, "\[/large\]", "") + t = replacetext(t, "\[h1\]", "

") + t = replacetext(t, "\[/h1\]", "

") + t = replacetext(t, "\[h2\]", "

") + t = replacetext(t, "\[/h2\]", "

") + t = replacetext(t, "\[h3\]", "

") + t = replacetext(t, "\[/h3\]", "

") + t = replacetext(t, "\[*\]", "
  • ") + t = replacetext(t, "\[hr\]", "
    ") + t = replacetext(t, "\[small\]", "") + t = replacetext(t, "\[/small\]", "") + t = replacetext(t, "\[list\]", "
      ") + t = replacetext(t, "\[/list\]", "
    ") + t = replacetext(t, "\[table\]", "") + t = replacetext(t, "\[/table\]", "
    ") + t = replacetext(t, "\[grid\]", "") + t = replacetext(t, "\[/grid\]", "
    ") + t = replacetext(t, "\[row\]", "") + t = replacetext(t, "\[tr\]", "") + t = replacetext(t, "\[td\]", "") + t = replacetext(t, "\[cell\]", "") + t = replacetext(t, "\[logo\]", "") + return t + + +/datum/nano_module/program/computer_filemanager + name = "NTOS File Manager" + +/datum/nano_module/program/computer_filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = host.initial_data() + var/datum/computer_file/program/filemanager/PRG + PRG = program + + var/obj/item/weapon/computer_hardware/hard_drive/HDD + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD + if(PRG.error) + data["error"] = PRG.error + if(PRG.open_file) + var/datum/computer_file/data/file + + if(!PRG.computer || !PRG.computer.hard_drive) + data["error"] = "I/O ERROR: Unable to access hard drive." + else + HDD = PRG.computer.hard_drive + file = HDD.find_file_by_name(PRG.open_file) + if(!istype(file)) + data["error"] = "I/O ERROR: Unable to open file." + else + data["filedata"] = PRG.parse_tags(file.stored_data) + data["filename"] = "[file.filename].[file.filetype]" + else + if(!PRG.computer || !PRG.computer.hard_drive) + data["error"] = "I/O ERROR: Unable to access hard drive." + else + HDD = PRG.computer.hard_drive + RHDD = PRG.computer.portable_drive + var/list/files[0] + for(var/datum/computer_file/F in HDD.stored_files) + files.Add(list(list( + "name" = F.filename, + "type" = F.filetype, + "size" = F.size, + "undeletable" = F.undeletable + ))) + data["files"] = files + if(RHDD) + data["usbconnected"] = 1 + var/list/usbfiles[0] + for(var/datum/computer_file/F in RHDD.stored_files) + usbfiles.Add(list(list( + "name" = F.filename, + "type" = F.filetype, + "size" = F.size, + "undeletable" = F.undeletable + ))) + data["usbfiles"] = usbfiles + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + + diff --git a/code/modules/modular_computers/file_system/programs/news_browser.dm b/code/modules/modular_computers/file_system/programs/news_browser.dm new file mode 100644 index 00000000000..2fe58ee6348 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/news_browser.dm @@ -0,0 +1,120 @@ +/datum/computer_file/program/newsbrowser + filename = "newsbrowser" + filedesc = "NTNet/ExoNet News Browser" + extended_desc = "This program may be used to view and download news articles from the network." + program_icon_state = "generic" + size = 8 + requires_ntnet = 1 + available_on_ntnet = 1 + + nanomodule_path = /datum/nano_module/program/computer_newsbrowser/ + var/datum/computer_file/data/news_article/loaded_article + var/download_progress = 0 + var/download_netspeed = 0 + var/downloading = 0 + var/message = "" + +/datum/computer_file/program/newsbrowser/process_tick() + if(!downloading) + return + download_netspeed = 0 + // Speed defines are found in misc.dm + switch(ntnet_status) + if(1) + download_netspeed = NTNETSPEED_LOWSIGNAL + if(2) + download_netspeed = NTNETSPEED_HIGHSIGNAL + if(3) + download_netspeed = NTNETSPEED_ETHERNET + download_progress += download_netspeed + if(download_progress >= loaded_article.size) + downloading = 0 + requires_ntnet = 0 // Turn off NTNet requirement as we already loaded the file into local memory. + nanomanager.update_uis(NM) + +/datum/computer_file/program/newsbrowser/kill_program() + ..() + requires_ntnet = 1 + loaded_article = null + download_progress = 0 + downloading = 0 + +/datum/computer_file/program/newsbrowser/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_openarticle"]) + . = 1 + if(downloading || loaded_article) + return 1 + + for(var/datum/computer_file/data/news_article/N in ntnet_global.available_news) + if(N.uid == text2num(href_list["PRG_openarticle"])) + loaded_article = N.clone() + downloading = 1 + break + if(href_list["PRG_reset"]) + . = 1 + downloading = 0 + download_progress = 0 + requires_ntnet = 1 + loaded_article = null + if(href_list["PRG_clearmessage"]) + . = 1 + message = "" + if(href_list["PRG_savearticle"]) + . = 1 + if(downloading || !loaded_article) + return + + var/savename = sanitize(input(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename)) + if(!savename) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/news_article/N = loaded_article.clone() + N.filename = savename + HDD.store_file(N) + if(.) + nanomanager.update_uis(NM) + + +/datum/nano_module/program/computer_newsbrowser + name = "NTNet/ExoNet News Browser" + +/datum/nano_module/program/computer_newsbrowser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + + var/datum/computer_file/program/newsbrowser/PRG + var/list/data = list() + if(program) + data = program.get_header_data() + PRG = program + else + return + + data["message"] = PRG.message + if(PRG.loaded_article && !PRG.downloading) // Viewing an article. + data["title"] = PRG.loaded_article.filename + data["article"] = PRG.loaded_article.stored_data + else if(PRG.downloading) // Downloading an article. + data["download_running"] = 1 + data["download_progress"] = PRG.download_progress + data["download_maxprogress"] = PRG.loaded_article.size + data["download_rate"] = PRG.download_netspeed + else // Viewing list of articles + var/list/all_articles[0] + for(var/datum/computer_file/data/news_article/F in ntnet_global.available_news) + all_articles.Add(list(list( + "name" = F.filename, + "size" = F.size, + "uid" = F.uid + ))) + data["all_articles"] = all_articles + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "news_browser.tmpl", "NTNet/ExoNet News Browser", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm new file mode 100644 index 00000000000..bd3f6611273 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -0,0 +1,164 @@ +/datum/computer_file/program/ntnetdownload + filename = "ntndownloader" + filedesc = "NTNet Software Download Tool" + program_icon_state = "generic" + extended_desc = "This program allows downloads of software from official NT repositories" + unsendable = 1 + undeletable = 1 + size = 4 + requires_ntnet = 1 + requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD + available_on_ntnet = 0 + nanomodule_path = /datum/nano_module/program/computer_ntnetdownload/ + ui_header = "downloader_finished.gif" + var/datum/computer_file/program/downloaded_file = null + var/hacked_download = 0 + var/download_completion = 0 //GQ of downloaded data. + var/download_netspeed = 0 + var/downloaderror = "" + +/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename) + if(downloaded_file) + return 0 + + var/datum/computer_file/program/PRG = ntnet_global.find_ntnet_file_by_name(filename) + + if(!PRG || !istype(PRG)) + return 0 + + // Attempting to download antag only program, but without having emagged computer. No. + if(PRG.available_on_syndinet && !computer_emagged) + return 0 + + if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG)) + return 0 + + ui_header = "downloader_running.gif" + + if(PRG in ntnet_global.available_station_software) + generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.") + hacked_download = 0 + else if(PRG in ntnet_global.available_antag_software) + generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.") + hacked_download = 1 + else + generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from unspecified server.") + hacked_download = 0 + + downloaded_file = PRG.clone() + +/datum/computer_file/program/ntnetdownload/proc/abort_file_download() + if(!downloaded_file) + return + generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].") + downloaded_file = null + download_completion = 0 + ui_header = "downloader_finished.gif" + +/datum/computer_file/program/ntnetdownload/proc/complete_file_download() + if(!downloaded_file) + return + generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].") + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file)) + // The download failed + downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance." + downloaded_file = null + download_completion = 0 + ui_header = "downloader_finished.gif" + +/datum/computer_file/program/ntnetdownload/process_tick() + if(!downloaded_file) + return + if(download_completion >= downloaded_file.size) + complete_file_download() + // Download speed according to connectivity state. NTNet server is assumed to be on unlimited speed so we're limited by our local connectivity + download_netspeed = 0 + // Speed defines are found in misc.dm + switch(ntnet_status) + if(1) + download_netspeed = NTNETSPEED_LOWSIGNAL + if(2) + download_netspeed = NTNETSPEED_HIGHSIGNAL + if(3) + download_netspeed = NTNETSPEED_ETHERNET + download_completion += download_netspeed + +/datum/computer_file/program/ntnetdownload/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_downloadfile"]) + if(!downloaded_file) + begin_file_download(href_list["PRG_downloadfile"]) + return 1 + if(href_list["PRG_reseterror"]) + if(downloaderror) + download_completion = 0 + download_netspeed = 0 + downloaded_file = null + downloaderror = "" + return 1 + return 0 + +/datum/nano_module/program/computer_ntnetdownload + name = "Network Downloader" + var/obj/item/modular_computer/my_computer = null + +/datum/nano_module/program/computer_ntnetdownload/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(program) + my_computer = program.computer + + if(!istype(my_computer)) + return + + var/list/data = list() + var/datum/computer_file/program/ntnetdownload/prog = program + // For now limited to execution by the downloader program + if(!prog || !istype(prog)) + return + if(program) + data = program.get_header_data() + + // This IF cuts on data transferred to client, so i guess it's worth it. + if(prog.downloaderror) // Download errored. Wait until user resets the program. + data["error"] = prog.downloaderror + else if(prog.downloaded_file) // Download running. Wait please.. + data["downloadname"] = prog.downloaded_file.filename + data["downloaddesc"] = prog.downloaded_file.filedesc + data["downloadsize"] = prog.downloaded_file.size + data["downloadspeed"] = prog.download_netspeed + data["downloadcompletion"] = round(prog.download_completion, 0.1) + else // No download running, pick file. + data["disk_size"] = my_computer.hard_drive.max_capacity + data["disk_used"] = my_computer.hard_drive.used_capacity + var/list/all_entries[0] + for(var/datum/computer_file/program/P in ntnet_global.available_station_software) + // Only those programs our user can run will show in the list + if(!P.can_run(user)) + continue + all_entries.Add(list(list( + "filename" = P.filename, + "filedesc" = P.filedesc, + "fileinfo" = P.extended_desc, + "size" = P.size + ))) + data["hackedavailable"] = 0 + if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software + var/list/hacked_programs[0] + for(var/datum/computer_file/program/P in ntnet_global.available_antag_software) + data["hackedavailable"] = 1 + hacked_programs.Add(list(list( + "filename" = P.filename, + "filedesc" = P.filedesc, + "fileinfo" = P.extended_desc, + "size" = P.size + ))) + data["hacked_programs"] = hacked_programs + + data["downloadable_programs"] = all_entries + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_downloader.tmpl", "NTNet Download Program", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm new file mode 100644 index 00000000000..c2378918a00 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -0,0 +1,89 @@ +/datum/computer_file/program/ntnetmonitor + filename = "ntmonitor" + filedesc = "NTNet Diagnostics and Monitoring" + program_icon_state = "comm_monitor" + extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" + size = 12 + requires_ntnet = 1 + required_access = access_network + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/computer_ntnetmonitor/ + +/datum/nano_module/computer_ntnetmonitor + name = "NTNet Diagnostics and Monitoring" + available_to_ai = TRUE + +/datum/nano_module/computer_ntnetmonitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!ntnet_global) + return + var/list/data = host.initial_data() + + data["ntnetstatus"] = ntnet_global.check_function() + data["ntnetrelays"] = ntnet_global.relays.len + data["idsstatus"] = ntnet_global.intrusion_detection_enabled + data["idsalarm"] = ntnet_global.intrusion_detection_alarm + + data["config_softwaredownload"] = ntnet_global.setting_softwaredownload + data["config_peertopeer"] = ntnet_global.setting_peertopeer + data["config_communication"] = ntnet_global.setting_communication + data["config_systemcontrol"] = ntnet_global.setting_systemcontrol + + data["ntnetlogs"] = ntnet_global.logs + data["ntnetmaxlogs"] = ntnet_global.setting_maxlogcount + + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_monitor.tmpl", "NTNet Diagnostics and Monitoring Tool", 575, 700, state = state) + if(host.update_layout()) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/nano_module/computer_ntnetmonitor/Topic(href, href_list) + if(..()) + return 1 + if(href_list["resetIDS"]) + . = 1 + if(ntnet_global) + ntnet_global.resetIDS() + return 1 + if(href_list["toggleIDS"]) + . = 1 + if(ntnet_global) + ntnet_global.toggleIDS() + return 1 + if(href_list["toggleWireless"]) + . = 1 + if(!ntnet_global) + return 1 + + // NTNet is disabled. Enabling can be done without user prompt + if(ntnet_global.setting_disabled) + ntnet_global.setting_disabled = 0 + return 1 + + // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on) + var/mob/user = usr + if(!user) + return 1 + var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No") + if(response == "Yes") + ntnet_global.setting_disabled = 1 + return 1 + if(href_list["purgelogs"]) + . = 1 + if(ntnet_global) + ntnet_global.purge_logs() + if(href_list["updatemaxlogs"]) + . = 1 + var/mob/user = usr + var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):")) + if(ntnet_global) + ntnet_global.update_max_log_count(logcount) + if(href_list["toggle_function"]) + . = 1 + if(!ntnet_global) + return 1 + ntnet_global.toggle_function(href_list["toggle_function"]) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm new file mode 100644 index 00000000000..c609fa86bcb --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -0,0 +1,230 @@ +/datum/computer_file/program/chatclient + filename = "ntnrc_client" + filedesc = "NTNet Relay Chat Client" + program_icon_state = "command" + extended_desc = "This program allows communication over NTNRC network" + size = 8 + requires_ntnet = 1 + requires_ntnet_feature = NTNET_COMMUNICATION + network_destination = "NTNRC server" + ui_header = "ntnrc_idle.gif" + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/program/computer_chatclient/ + var/last_message = null // Used to generate the toolbar icon + var/username + var/datum/ntnet_conversation/channel = null + var/operator_mode = 0 // Channel operator mode + var/netadmin_mode = 0 // Administrator mode (invisible to other users + bypasses passwords) + +/datum/computer_file/program/chatclient/New() + username = "DefaultUser[rand(100, 999)]" + +/datum/computer_file/program/chatclient/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["PRG_speak"]) + . = 1 + if(!channel) + return 1 + var/mob/living/user = usr + var/message = sanitize(input(user, "Enter message or leave blank to cancel: ")) + if(!message || !channel) + return + channel.add_message(message, username) + + if(href_list["PRG_joinchannel"]) + . = 1 + var/datum/ntnet_conversation/C + for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) + if(chan.id == text2num(href_list["PRG_joinchannel"])) + C = chan + break + + if(!C) + return 1 + + if(netadmin_mode) + channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others. + return 1 + + if(C.password) + var/mob/living/user = usr + var/password = sanitize(input(user,"Access Denied. Enter password:")) + if(C && (password == C.password)) + C.add_client(src) + channel = C + return 1 + C.add_client(src) + channel = C + if(href_list["PRG_leavechannel"]) + . = 1 + if(channel) + channel.remove_client(src) + channel = null + if(href_list["PRG_newchannel"]) + . = 1 + var/mob/living/user = usr + var/channel_title = sanitize(input(user,"Enter channel name or leave blank to cancel:")) + if(!channel_title) + return + var/datum/ntnet_conversation/C = new/datum/ntnet_conversation() + C.add_client(src) + C.operator = src + channel = C + C.title = channel_title + if(href_list["PRG_toggleadmin"]) + . = 1 + if(netadmin_mode) + netadmin_mode = 0 + if(channel) + channel.remove_client(src) // We shouldn't be in channel's user list, but just in case... + channel = null + return 1 + var/mob/living/user = usr + if(can_run(usr, 1, access_network)) + if(channel) + var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No") + if(response == "Yes") + if(channel) + channel.remove_client(src) + channel = null + else + return + netadmin_mode = 1 + if(href_list["PRG_changename"]) + . = 1 + var/mob/living/user = usr + var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:")) + if(!newname) + return 1 + if(channel) + channel.add_status_message("[username] is now known as [newname].") + username = newname + + if(href_list["PRG_savelog"]) + . = 1 + if(!channel) + return + var/mob/living/user = usr + var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:") + if(!logname || !channel) + return 1 + var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() + // Now we will generate HTML-compliant file that can actually be viewed/printed. + logfile.filename = logname + logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]" + for(var/logstring in channel.messages) + logfile.stored_data += "[logstring]\[BR\]" + logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]" + logfile.calculate_size() + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(logfile)) + if(!computer) + // This program shouldn't even be runnable without computer. + CRASH("Var computer is null!") + return 1 + if(!computer.hard_drive) + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.") + else // In 99.9% cases this will mean our HDD is full + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.") + if(href_list["PRG_renamechannel"]) + . = 1 + if(!operator_mode || !channel) + return 1 + var/mob/living/user = usr + var/newname = sanitize(input(user, "Enter new channel name or leave blank to cancel:")) + if(!newname || !channel) + return + channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.") + channel.title = newname + if(href_list["PRG_deletechannel"]) + . = 1 + if(channel && ((channel.operator == src) || netadmin_mode)) + qdel(channel) + channel = null + if(href_list["PRG_setpassword"]) + . = 1 + if(!channel || ((channel.operator != src) && !netadmin_mode)) + return 1 + + var/mob/living/user = usr + var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:")) + if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode)) + return 1 + + if(newpassword == "nopassword") + channel.password = "" + else + channel.password = newpassword + +/datum/computer_file/program/chatclient/process_tick() + ..() + if(program_state != PROGRAM_STATE_KILLED) + ui_header = "ntnrc_idle.gif" + if(channel) + // Remember the last message. If there is no message in the channel remember null. + last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null + else + last_message = null + return 1 + if(channel && channel.messages && channel.messages.len) + ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif" + else + ui_header = "ntnrc_idle.gif" + +/datum/computer_file/program/chatclient/kill_program(var/forced = 0) + if(channel) + channel.remove_client(src) + channel = null + ..(forced) + +/datum/nano_module/program/computer_chatclient + name = "NTNet Relay Chat Client" + +/datum/nano_module/program/computer_chatclient/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!ntnet_global || !ntnet_global.chat_channels) + return + + var/list/data = list() + if(program) + data = program.get_header_data() + + var/datum/computer_file/program/chatclient/C = program + if(!istype(C)) + return + + data["adminmode"] = C.netadmin_mode + if(C.channel) + data["title"] = C.channel.title + var/list/messages[0] + for(var/M in C.channel.messages) + messages.Add(list(list( + "msg" = M + ))) + data["messages"] = messages + var/list/clients[0] + for(var/datum/computer_file/program/chatclient/cl in C.channel.clients) + clients.Add(list(list( + "name" = cl.username + ))) + data["clients"] = clients + C.operator_mode = (C.channel.operator == C) ? 1 : 0 + data["is_operator"] = C.operator_mode || C.netadmin_mode + + else // Channel selection screen + var/list/all_channels[0] + for(var/datum/ntnet_conversation/conv in ntnet_global.chat_channels) + if(conv && conv.title) + all_channels.Add(list(list( + "chan" = conv.title, + "id" = conv.id + ))) + data["all_channels"] = all_channels + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_chat.tmpl", "NTNet Relay Chat Client", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm new file mode 100644 index 00000000000..5bd76726aaa --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm @@ -0,0 +1,194 @@ +var/global/nttransfer_uid = 0 + +/datum/computer_file/program/nttransfer + filename = "nttransfer" + filedesc = "NTNet P2P Transfer Client" + extended_desc = "This program allows for simple file transfer via direct peer to peer connection." + program_icon_state = "comm_logs" + size = 7 + requires_ntnet = 1 + requires_ntnet_feature = NTNET_PEERTOPEER + network_destination = "other device via P2P tunnel" + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/program/computer_nttransfer/ + + var/error = "" // Error screen + var/server_password = "" // Optional password to download the file. + var/datum/computer_file/provided_file = null // File which is provided to clients. + var/datum/computer_file/downloaded_file = null // File which is being downloaded + var/list/connected_clients = list() // List of connected clients. + var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from. + var/download_completion = 0 // Download progress in GQ + var/download_netspeed = 0 // Our connectivity speed in GQ/s + var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed. + var/unique_token // UID of this program + var/upload_menu = 0 // Whether we show the program list and upload menu + +/datum/computer_file/program/nttransfer/New() + unique_token = nttransfer_uid + nttransfer_uid++ + ..() + +/datum/computer_file/program/nttransfer/process_tick() + // Server mode + update_netspeed() + if(provided_file) + for(var/datum/computer_file/program/nttransfer/C in connected_clients) + // Transfer speed is limited by device which uses slower connectivity. + // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer + // so they can all run on same speed. + C.actual_netspeed = min(C.download_netspeed, download_netspeed) + C.download_completion += C.actual_netspeed + if(C.download_completion >= provided_file.size) + C.finish_download() + else if(downloaded_file) // Client mode + if(!remote) + crash_download("Connection to remote server lost") + +/datum/computer_file/program/nttransfer/kill_program(var/forced = 0) + if(downloaded_file) // Client mode, clean up variables for next use + finalize_download() + + if(provided_file) // Server mode, disconnect all clients + for(var/datum/computer_file/program/nttransfer/P in connected_clients) + P.crash_download("Connection terminated by remote server") + downloaded_file = null + ..(forced) + + + +/datum/computer_file/program/nttransfer/proc/update_netspeed() + download_netspeed = 0 + switch(ntnet_status) + if(1) + download_netspeed = NTNETSPEED_LOWSIGNAL + if(2) + download_netspeed = NTNETSPEED_HIGHSIGNAL + if(3) + download_netspeed = NTNETSPEED_ETHERNET + +// Finishes download and attempts to store the file on HDD +/datum/computer_file/program/nttransfer/proc/finish_download() + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file)) + error = "I/O Error: Unable to save file. Check your hard drive and try again." + finalize_download() + +// Crashes the download and displays specific error message +/datum/computer_file/program/nttransfer/proc/crash_download(var/message) + error = message ? message : "An unknown error has occured during download" + finalize_download() + +// Cleans up variables for next use +/datum/computer_file/program/nttransfer/proc/finalize_download() + if(remote) + remote.connected_clients.Remove(src) + downloaded_file = null + remote = null + download_completion = 0 + + +/datum/nano_module/program/computer_nttransfer + name = "NTNet P2P Transfer Client" + +/datum/nano_module/program/computer_nttransfer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!program) + return + var/datum/computer_file/program/nttransfer/PRG = program + if(!istype(PRG)) + return + + var/list/data = program.get_header_data() + + if(PRG.error) + data["error"] = PRG.error + else if(PRG.downloaded_file) + data["downloading"] = 1 + data["download_size"] = PRG.downloaded_file.size + data["download_progress"] = PRG.download_completion + data["download_netspeed"] = PRG.actual_netspeed + data["download_name"] = "[PRG.downloaded_file.filename].[PRG.downloaded_file.filetype]" + else if (PRG.provided_file) + data["uploading"] = 1 + data["upload_uid"] = PRG.unique_token + data["upload_clients"] = PRG.connected_clients.len + data["upload_haspassword"] = PRG.server_password ? 1 : 0 + data["upload_filename"] = "[PRG.provided_file.filename].[PRG.provided_file.filetype]" + else if (PRG.upload_menu) + var/list/all_files[0] + for(var/datum/computer_file/F in PRG.computer.hard_drive.stored_files) + all_files.Add(list(list( + "uid" = F.uid, + "filename" = "[F.filename].[F.filetype]", + "size" = F.size + ))) + data["upload_filelist"] = all_files + else + var/list/all_servers[0] + for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers) + all_servers.Add(list(list( + "uid" = P.unique_token, + "filename" = "[P.provided_file.filename].[P.provided_file.filetype]", + "size" = P.provided_file.size, + "haspassword" = P.server_password ? 1 : 0 + ))) + data["servers"] = all_servers + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_transfer.tmpl", "NTNet P2P Transfer Client", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/computer_file/program/nttransfer/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_downloadfile"]) + for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers) + if("[P.unique_token]" == href_list["PRG_downloadfile"]) + remote = P + break + if(!remote || !remote.provided_file) + return + if(remote.server_password) + var/pass = sanitize(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) + if(pass != remote.server_password) + error = "Incorrect Password" + return + downloaded_file = remote.provided_file.clone() + remote.connected_clients.Add(src) + return 1 + if(href_list["PRG_reset"]) + error = "" + upload_menu = 0 + finalize_download() + if(src in ntnet_global.fileservers) + ntnet_global.fileservers.Remove(src) + for(var/datum/computer_file/program/nttransfer/T in connected_clients) + T.crash_download("Remote server has forcibly closed the connection") + provided_file = null + return 1 + if(href_list["PRG_setpassword"]) + var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) + if(!pass) + return + if(pass == "none") + server_password = "" + return + server_password = pass + return 1 + if(href_list["PRG_uploadfile"]) + for(var/datum/computer_file/F in computer.hard_drive.stored_files) + if("[F.uid]" == href_list["PRG_uploadfile"]) + if(F.unsendable) + error = "I/O Error: File locked." + return + provided_file = F + ntnet_global.fileservers.Add(src) + return + error = "I/O Error: Unable to locate file on hard drive." + return 1 + if(href_list["PRG_uploadmenu"]) + upload_menu = 1 + return 0 diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm new file mode 100644 index 00000000000..1b1eae2d26a --- /dev/null +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -0,0 +1,71 @@ +// This device is wrapper for actual power cell. I have decided to not use power cells directly as even low-end cells available on station +// have tremendeous capacity in comparsion. Higher tier cells would provide your device with nearly infinite battery life, which is something i want to avoid. +/obj/item/weapon/computer_hardware/battery_module + name = "standard battery" + desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops. It's rating is 750." + icon_state = "battery_normal" + critical = 1 + malfunction_probability = 1 + origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) + var/battery_rating = 750 + var/obj/item/weapon/cell/battery = null + +/obj/item/weapon/computer_hardware/battery_module/advanced + name = "advanced battery" + desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. It's rating is 1100." + icon_state = "battery_advanced" + origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + hardware_size = 2 + battery_rating = 1100 + +/obj/item/weapon/computer_hardware/battery_module/super + name = "super battery" + desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 1500." + icon_state = "battery_super" + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) + hardware_size = 2 + battery_rating = 1500 + +/obj/item/weapon/computer_hardware/battery_module/ultra + name = "ultra battery" + desc = "A very advanced large power cell. It's often used as uninterruptable power supply for critical consoles or servers. It's rating is 2000." + icon_state = "battery_ultra" + origin_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4) + hardware_size = 3 + battery_rating = 2000 + +/obj/item/weapon/computer_hardware/battery_module/micro + name = "micro battery" + desc = "A small power cell, commonly seen in most portable microcomputers. It's rating is 500." + icon_state = "battery_micro" + origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + battery_rating = 500 + +/obj/item/weapon/computer_hardware/battery_module/nano + name = "nano battery" + desc = "A tiny power cell, commonly seen in low-end portable microcomputers. It's rating is 300." + icon_state = "battery_nano" + origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) + battery_rating = 300 + +// This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes. +/obj/item/weapon/computer_hardware/battery_module/lambda + name = "lambda coil" + desc = "A very complex device that creates it's own bluespace dimension. This dimension may be used to store massive amounts of energy." + icon_state = "battery_lambda" + hardware_size = 1 + battery_rating = 1000000 + +/obj/item/weapon/computer_hardware/battery_module/diagnostics(var/mob/user) + ..() + user << "Internal battery charge: [battery.charge]/[battery.maxcharge] CU" + +/obj/item/weapon/computer_hardware/battery_module/New() + battery = new/obj/item/weapon/cell(src) + battery.maxcharge = battery_rating + battery.charge = 0 + ..() + +/obj/item/weapon/computer_hardware/battery_module/proc/charge_to_full() + if(battery) + battery.charge = battery.maxcharge \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm new file mode 100644 index 00000000000..35eddbd5ec9 --- /dev/null +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -0,0 +1,18 @@ +/obj/item/weapon/computer_hardware/card_slot + name = "RFID card slot" + desc = "Slot that allows this computer to write data on RFID cards. Necessary for some programs to run properly." + power_usage = 10 //W + critical = 0 + icon_state = "cardreader" + hardware_size = 1 + origin_tech = list(TECH_DATA = 2) + + var/obj/item/weapon/card/id/stored_card = null + +/obj/item/weapon/computer_hardware/card_slot/Destroy() + if(holder2 && (holder2.card_slot == src)) + holder2.card_slot = null + if(stored_card) + stored_card.forceMove(get_turf(holder2)) + holder2 = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm new file mode 100644 index 00000000000..4a74081c687 --- /dev/null +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -0,0 +1,167 @@ +/obj/item/weapon/computer_hardware/hard_drive/ + name = "basic hard drive" + desc = "A small power efficient solid state drive, with 128GQ of storage capacity for use in basic computers where power efficiency is desired." + power_usage = 25 // SSD or something with low power usage + icon_state = "hdd_normal" + hardware_size = 1 + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + var/max_capacity = 128 + var/used_capacity = 0 + var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY! + +/obj/item/weapon/computer_hardware/hard_drive/advanced + name = "advanced hard drive" + desc = "A small hybrid hard drive with 256GQ of storage capacity for use in higher grade computers where balance between power efficiency and capacity is desired." + max_capacity = 256 + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + power_usage = 50 // Hybrid, medium capacity and medium power storage + icon_state = "hdd_advanced" + hardware_size = 2 + +/obj/item/weapon/computer_hardware/hard_drive/super + name = "super hard drive" + desc = "A small hard drive with 512GQ of storage capacity for use in cluster storage solutions where capacity is more important than power efficiency." + max_capacity = 512 + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link. + icon_state = "hdd_super" + hardware_size = 2 + +/obj/item/weapon/computer_hardware/hard_drive/cluster + name = "cluster hard drive" + desc = "A large storage cluster consisting of multiple hard drives for usage in high capacity storage systems. Has capacity of 2048 GQ." + power_usage = 500 + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) + max_capacity = 2048 + icon_state = "hdd_cluster" + hardware_size = 3 + +// For tablets, etc. - highly power efficient. +/obj/item/weapon/computer_hardware/hard_drive/small + name = "small hard drive" + desc = "A small highly efficient solid state drive for portable devices." + power_usage = 10 + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + max_capacity = 64 + icon_state = "hdd_small" + hardware_size = 1 + +/obj/item/weapon/computer_hardware/hard_drive/micro + name = "micro hard drive" + desc = "A small micro hard drive for portable devices." + power_usage = 2 + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + max_capacity = 32 + icon_state = "hdd_micro" + hardware_size = 1 + +/obj/item/weapon/computer_hardware/hard_drive/diagnostics(var/mob/user) + ..() + // 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space. + user << "NT-NFS File Table Status: [stored_files.len]/999" + user << "Storage capacity: [used_capacity]/[max_capacity]GQ" + +// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. +/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F) + if(!F || !istype(F)) + return 0 + + if(!can_store_file(F.size)) + return 0 + + if(!check_functionality()) + return 0 + + if(!stored_files) + return 0 + + // This file is already stored. Don't store it again. + if(F in stored_files) + return 0 + + F.holder = src + stored_files.Add(F) + recalculate_size() + return 1 + +// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. +/obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs() + store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar + store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository + store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. + + +// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. +/obj/item/weapon/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F) + if(!F || !istype(F)) + return 0 + + if(!stored_files) + return 0 + + if(!check_functionality()) + return 0 + + if(F in stored_files) + stored_files -= F + recalculate_size() + return 1 + else + return 0 + +// Loops through all stored files and recalculates used_capacity of this drive +/obj/item/weapon/computer_hardware/hard_drive/proc/recalculate_size() + var/total_size = 0 + for(var/datum/computer_file/F in stored_files) + total_size += F.size + + used_capacity = total_size + +// Checks whether file can be stored on the hard drive. +/obj/item/weapon/computer_hardware/hard_drive/proc/can_store_file(var/size = 1) + // In the unlikely event someone manages to create that many files. + // BYOND is acting weird with numbers above 999 in loops (infinite loop prevention) + if(stored_files.len >= 999) + return 0 + if(used_capacity + size > max_capacity) + return 0 + else + return 1 + +// Checks whether we can store the file. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file. +/obj/item/weapon/computer_hardware/hard_drive/proc/try_store_file(var/datum/computer_file/F) + if(!F || !istype(F)) + return 0 + var/name = F.filename + "." + F.filetype + for(var/datum/computer_file/file in stored_files) + if((file.filename + "." + file.filetype) == name) + return 0 + return can_store_file(F.size) + + + +// Tries to find the file by filename. Returns null on failure +/obj/item/weapon/computer_hardware/hard_drive/proc/find_file_by_name(var/filename) + if(!check_functionality()) + return null + + if(!filename) + return null + + if(!stored_files) + return null + + for(var/datum/computer_file/F in stored_files) + if(F.filename == filename) + return F + return null + +/obj/item/weapon/computer_hardware/hard_drive/Destroy() + if(holder2 && (holder2.hard_drive == src)) + holder2.hard_drive = null + stored_files = null + ..() + +/obj/item/weapon/computer_hardware/hard_drive/New() + install_default_programs() + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm new file mode 100644 index 00000000000..7f25298e06e --- /dev/null +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -0,0 +1,89 @@ +/obj/item/weapon/computer_hardware/ + name = "Hardware" + desc = "Unknown Hardware." + icon = 'icons/obj/modular_components.dmi' + var/obj/item/modular_computer/holder2 = null + var/power_usage = 0 // If the hardware uses extra power, change this. + var/enabled = 1 // If the hardware is turned off set this to 0. + var/critical = 1 // Prevent disabling for important component, like the HDD. + var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only + var/damage = 0 // Current damage level + var/max_damage = 100 // Maximal damage level. + var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things + var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all. + var/malfunction_probability = 10// Chance of malfunction when the component is damaged + +/obj/item/weapon/computer_hardware/attackby(var/obj/item/W as obj, var/mob/living/user as mob) + // Multitool. Runs diagnostics + if(istype(W, /obj/item/device/multitool)) + user << "***** DIAGNOSTICS REPORT *****" + diagnostics(user) + user << "******************************" + return 1 + // Nanopaste. Repair all damage if present for a single unit. + var/obj/item/stack/S = W + if(istype(S, /obj/item/stack/nanopaste)) + if(!damage) + user << "\The [src] doesn't seem to require repairs." + return 1 + if(S.use(1)) + user << "You apply a bit of \the [W] to \the [src]. It immediately repairs all damage." + damage = 0 + return 1 + // Cable coil. Works as repair method, but will probably require multiple applications and more cable. + if(istype(S, /obj/item/stack/cable_coil)) + if(!damage) + user << "\The [src] doesn't seem to require repairs." + return 1 + if(S.use(1)) + user << "You patch up \the [src] with a bit of \the [W]." + take_damage(-10) + return 1 + return ..() + + +// Called on multitool click, prints diagnostic information to the user. +/obj/item/weapon/computer_hardware/proc/diagnostics(var/mob/user) + user << "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]" + +/obj/item/weapon/computer_hardware/New(var/obj/L) + w_class = hardware_size + if(istype(L, /obj/machinery/modular_computer)) + var/obj/machinery/modular_computer/C = L + if(C.cpu) + holder2 = C.cpu + return + if(istype(L, /obj/item/modular_computer)) + holder2 = L + return + +/obj/item/weapon/computer_hardware/Destroy() + holder2 = null + return ..() + +// Handles damage checks +/obj/item/weapon/computer_hardware/proc/check_functionality() + // Too damaged to work at all. + if(damage > damage_failure) + return 0 + // Still working. Well, sometimes... + if(damage > damage_malfunction) + if(prob(malfunction_probability)) + return 0 + // Good to go. + return 1 + +/obj/item/weapon/computer_hardware/examine(var/mob/user) + . = ..() + if(damage > damage_failure) + user << "It seems to be severely damaged!" + else if(damage > damage_malfunction) + user << "It seems to be damaged!" + else if(damage) + user << "It seems to be slightly damaged." + +// Damages the component. Contains necessary checks. Negative damage "heals" the component. +/obj/item/weapon/computer_hardware/proc/take_damage(var/amount) + damage += round(amount) // We want nice rounded numbers here. + damage = between(0, damage, max_damage) // Clamp the value. + diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm new file mode 100644 index 00000000000..40142ccda46 --- /dev/null +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -0,0 +1,52 @@ +/obj/item/weapon/computer_hardware/nano_printer + name = "nano printer" + desc = "Small integrated printer with paper recycling module." + power_usage = 50 + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + critical = 0 + icon_state = "printer" + hardware_size = 1 + var/stored_paper = 5 + var/max_paper = 10 + +/obj/item/weapon/computer_hardware/nano_printer/diagnostics(var/mob/user) + ..() + user << "Paper buffer level: [stored_paper]/[max_paper]" + +/obj/item/weapon/computer_hardware/nano_printer/proc/print_text(var/text_to_print, var/paper_title = null) + if(!stored_paper) + return 0 + if(!enabled) + return 0 + if(!check_functionality()) + return 0 + + var/obj/item/weapon/paper/P = new/obj/item/weapon/paper(get_turf(holder2)) + + // Damaged printer causes the resulting paper to be somewhat harder to read. + if(damage > damage_malfunction) + P.info = stars(text_to_print, 100-malfunction_probability) + else + P.info = text_to_print + if(paper_title) + P.name = paper_title + P.update_icon() + stored_paper-- + P = null + return 1 + +/obj/item/weapon/computer_hardware/nano_printer/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/paper)) + if(stored_paper >= max_paper) + user << "You try to add \the [W] into [src], but it's paper bin is full" + return + + user << "You insert \the [W] into [src]." + qdel(W) + stored_paper++ + +/obj/item/weapon/computer_hardware/nano_printer/Destroy() + if(holder2 && (holder2.nano_printer == src)) + holder2.nano_printer = null + holder2 = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm new file mode 100644 index 00000000000..8ffc802dbda --- /dev/null +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -0,0 +1,95 @@ +var/global/ntnet_card_uid = 1 + +/obj/item/weapon/computer_hardware/network_card/ + name = "basic NTNet network card" + desc = "A basic network card for usage with standard NTNet frequencies." + power_usage = 50 + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) + critical = 0 + icon_state = "netcard_basic" + hardware_size = 1 + var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user. + var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user. + var/long_range = 0 + var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks. + malfunction_probability = 1 + +/obj/item/weapon/computer_hardware/network_card/diagnostics(var/mob/user) + ..() + user << "NIX Unique ID: [identification_id]" + user << "NIX User Tag: [identification_string]" + user << "Supported protocols:" + user << "511.m SFS (Subspace) - Standard Frequency Spread" + if(long_range) + user << "511.n WFS/HB (Subspace) - Wide Frequency Spread/High Bandiwdth" + if(ethernet) + user << "OpenEth (Physical Connection) - Physical network connection port" + +/obj/item/weapon/computer_hardware/network_card/New(var/l) + ..(l) + identification_id = ntnet_card_uid + ntnet_card_uid++ + +/obj/item/weapon/computer_hardware/network_card/advanced + name = "advanced NTNet network card" + desc = "An advanced network card for usage with standard NTNet frequencies. It's transmitter is strong enough to connect even off-station." + long_range = 1 + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) + power_usage = 100 // Better range but higher power usage. + icon_state = "netcard_advanced" + hardware_size = 1 + +/obj/item/weapon/computer_hardware/network_card/wired + name = "wired NTNet network card" + desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection." + ethernet = 1 + origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) + power_usage = 100 // Better range but higher power usage. + icon_state = "netcard_ethernet" + hardware_size = 3 + +/obj/item/weapon/computer_hardware/network_card/Destroy() + if(holder2 && (holder2.network_card == src)) + holder2.network_card = null + holder2 = null + ..() + +// Returns a string identifier of this network card +/obj/item/weapon/computer_hardware/network_card/proc/get_network_tag() + return "[identification_string] (NID [identification_id])" + +// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection +/obj/item/weapon/computer_hardware/network_card/proc/get_signal(var/specific_action = 0) + if(!holder2) // Hardware is not installed in anything. No signal. How did this even get called? + return 0 + + if(!enabled) + return 0 + + if(!check_functionality()) + return 0 + + if(ethernet) // Computer is connected via wired connection. + return 3 + + if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal. + return 0 + + if(holder2) + var/turf/T = get_turf(holder2) + if((T && istype(T)) && T.z in using_map.station_levels) + // Computer is on station. Low/High signal depending on what type of network card you have + if(long_range) + return 2 + else + return 1 + + if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. + return 1 + + return 0 // Computer is not on station and does not have upgraded network card. No signal. + +/obj/item/weapon/computer_hardware/network_card/Destroy() + if(holder2 && (holder2.network_card == src)) + holder2.network_card = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm new file mode 100644 index 00000000000..4001a63301c --- /dev/null +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -0,0 +1,32 @@ +// These are basically USB data sticks and may be used to transfer files between devices +/obj/item/weapon/computer_hardware/hard_drive/portable/ + name = "basic data crystal" + desc = "Small crystal with imprinted photonic circuits that can be used to store data. It's capacity is 16 GQ." + power_usage = 10 + icon_state = "flashdrive_basic" + hardware_size = 1 + max_capacity = 16 + origin_tech = list(TECH_DATA = 1) + +/obj/item/weapon/computer_hardware/hard_drive/portable/advanced + name = "advanced data crystal" + desc = "Small crystal with imprinted high-density photonic circuits that can be used to store data. It's capacity is 64 GQ." + power_usage = 20 + icon_state = "flashdrive_advanced" + hardware_size = 1 + max_capacity = 64 + origin_tech = list(TECH_DATA = 2) + +/obj/item/weapon/computer_hardware/hard_drive/portable/super + name = "super data crystal" + desc = "Small crystal with imprinted ultra-density photonic circuits that can be used to store data. It's capacity is 256 GQ." + power_usage = 40 + icon_state = "flashdrive_super" + hardware_size = 1 + max_capacity = 256 + origin_tech = list(TECH_DATA = 4) + +/obj/item/weapon/computer_hardware/hard_drive/portable/New() + ..() + stored_files = list() + recalculate_size() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm new file mode 100644 index 00000000000..8f9009f72b9 --- /dev/null +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -0,0 +1,41 @@ +// CPU that allows the computer to run programs. +// Better CPUs are obtainable via research and can run more programs on background. + +/obj/item/weapon/computer_hardware/processor_unit + name = "standard processor" + desc = "A standard CPU used in most computers. It can run up to three programs simultaneously." + icon_state = "cpu_normal" + hardware_size = 2 + power_usage = 50 + critical = 1 + malfunction_probability = 1 + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + + var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description. + +/obj/item/weapon/computer_hardware/processor_unit/small + name = "standard microprocessor" + desc = "A standard miniaturised CPU used in portable devices. It can run up to two programs simultaneously." + icon_state = "cpu_small" + hardware_size = 1 + power_usage = 25 + max_idle_programs = 1 + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + +/obj/item/weapon/computer_hardware/processor_unit/photonic + name = "photonic processor" + desc = "An advanced experimental CPU that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power." + icon_state = "cpu_normal_photonic" + hardware_size = 2 + power_usage = 250 + max_idle_programs = 4 + origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) + +/obj/item/weapon/computer_hardware/processor_unit/photonic/small + name = "photonic microprocessor" + desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously." + icon_state = "cpu_small_photonic" + hardware_size = 1 + power_usage = 75 + max_idle_programs = 2 + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/tesla_link.dm b/code/modules/modular_computers/hardware/tesla_link.dm new file mode 100644 index 00000000000..5296f0e120b --- /dev/null +++ b/code/modules/modular_computers/hardware/tesla_link.dm @@ -0,0 +1,20 @@ +/obj/item/weapon/computer_hardware/tesla_link + name = "tesla link" + desc = "An advanced tesla link that wirelessly recharges connected device from nearby area power controller." + critical = 0 + enabled = 1 + icon_state = "teslalink" + hardware_size = 2 // Can't be installed into tablets + origin_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) + var/obj/machinery/modular_computer/holder + +/obj/item/weapon/computer_hardware/tesla_link/New(var/obj/L) + if(istype(L, /obj/machinery/modular_computer)) + holder = L + return + ..(L) + +/obj/item/weapon/computer_hardware/tesla_link/Destroy() + if(holder && (holder.tesla_link == src)) + holder.tesla_link = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm new file mode 100644 index 00000000000..6ae3cda4690 --- /dev/null +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -0,0 +1,296 @@ +// A vendor machine for modular computer portable devices - Laptops and Tablets + +/obj/machinery/lapvend + name = "computer vendor" + desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers." + icon = 'icons/obj/vending.dmi' + icon_state = "robotics" + layer = 2.9 + anchored = 1 + density = 1 + + // The actual laptop/tablet + var/obj/machinery/modular_computer/laptop/fabricated_laptop = null + var/obj/item/modular_computer/tablet/fabricated_tablet = null + + // Utility vars + var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen + var/devtype = 0 // 0: None(unselected), 1: Laptop, 2: Tablet + var/total_price = 0 // Price of currently vended device. + + // Device loadout + var/dev_cpu = 1 // 1: Default, 2: Upgraded + var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced + var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced + var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range + var/dev_tesla = 0 // 0: None, 1: Standard (LAPTOP ONLY) + var/dev_nanoprint = 0 // 0: None, 1: Standard + var/dev_card = 0 // 0: None, 1: Standard + +// Removes all traces of old order and allows you to begin configuration from scratch. +/obj/machinery/lapvend/proc/reset_order() + state = 0 + devtype = 0 + if(fabricated_laptop) + qdel(fabricated_laptop) + fabricated_laptop = null + if(fabricated_tablet) + qdel(fabricated_tablet) + fabricated_tablet = null + dev_cpu = 1 + dev_battery = 1 + dev_disk = 1 + dev_netcard = 0 + dev_tesla = 0 + dev_nanoprint = 0 + dev_card = 0 + +// Recalculates the price and optionally even fabricates the device. +/obj/machinery/lapvend/proc/fabricate_and_recalc_price(var/fabricate = 0) + total_price = 0 + if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles + if(fabricate) + fabricated_laptop = new(src) + total_price = 99 + switch(dev_cpu) + if(1) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_laptop.cpu) + if(2) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(fabricated_laptop.cpu) + total_price += 299 + switch(dev_battery) + if(1) // Basic(750C) + if(fabricate) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_laptop.cpu) + if(2) // Upgraded(1100C) + if(fabricate) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_laptop.cpu) + total_price += 199 + if(3) // Advanced(1500C) + if(fabricate) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_laptop.cpu) + total_price += 499 + switch(dev_disk) + if(1) // Basic(128GQ) + if(fabricate) + fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive(fabricated_laptop.cpu) + if(2) // Upgraded(256GQ) + if(fabricate) + fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/advanced(fabricated_laptop.cpu) + total_price += 99 + if(3) // Advanced(512GQ) + if(fabricate) + fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(fabricated_laptop.cpu) + total_price += 299 + switch(dev_netcard) + if(1) // Basic(Short-Range) + if(fabricate) + fabricated_laptop.cpu.network_card = new/obj/item/weapon/computer_hardware/network_card(fabricated_laptop.cpu) + total_price += 99 + if(2) // Advanced (Long Range) + if(fabricate) + fabricated_laptop.cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(fabricated_laptop.cpu) + total_price += 299 + if(dev_tesla) + total_price += 399 + if(fabricate) + fabricated_laptop.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(fabricated_laptop) + if(dev_nanoprint) + total_price += 99 + if(fabricate) + fabricated_laptop.cpu.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(fabricated_laptop.cpu) + if(dev_card) + total_price += 199 + if(fabricate) + fabricated_laptop.cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_laptop.cpu) + + return total_price + else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. + if(fabricate) + fabricated_tablet = new(src) + fabricated_tablet.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_tablet) + total_price = 199 + switch(dev_battery) + if(1) // Basic(300C) + if(fabricate) + fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module/nano(fabricated_tablet) + if(2) // Upgraded(500C) + if(fabricate) + fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module/micro(fabricated_tablet) + total_price += 199 + if(3) // Advanced(750C) + if(fabricate) + fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_tablet) + total_price += 499 + switch(dev_disk) + if(1) // Basic(32GQ) + if(fabricate) + fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(fabricated_tablet) + if(2) // Upgraded(64GQ) + if(fabricate) + fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(fabricated_tablet) + total_price += 99 + if(3) // Advanced(128GQ) + if(fabricate) + fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive(fabricated_tablet) + total_price += 299 + switch(dev_netcard) + if(1) // Basic(Short-Range) + if(fabricate) + fabricated_tablet.network_card = new/obj/item/weapon/computer_hardware/network_card(fabricated_tablet) + total_price += 99 + if(2) // Advanced (Long Range) + if(fabricate) + fabricated_tablet.network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(fabricated_tablet) + total_price += 299 + if(dev_nanoprint) + total_price += 99 + if(fabricate) + fabricated_tablet.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(fabricated_tablet) + if(dev_card) + total_price += 199 + if(fabricate) + fabricated_tablet.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_tablet) + return total_price + return 0 + + + + + +/obj/machinery/lapvend/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["pick_device"]) + if(state) // We've already picked a device type + return 0 + devtype = text2num(href_list["pick_device"]) + state = 1 + fabricate_and_recalc_price(0) + return 1 + if(href_list["clean_order"]) + reset_order() + return 1 + if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode + return 0 + if(href_list["confirm_order"]) + state = 2 // Wait for ID swipe for payment processing + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_cpu"]) + dev_cpu = text2num(href_list["hw_cpu"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_battery"]) + dev_battery = text2num(href_list["hw_battery"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_disk"]) + dev_disk = text2num(href_list["hw_disk"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_netcard"]) + dev_netcard = text2num(href_list["hw_netcard"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_tesla"]) + dev_tesla = text2num(href_list["hw_tesla"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_nanoprint"]) + dev_nanoprint = text2num(href_list["hw_nanoprint"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_card"]) + dev_card = text2num(href_list["hw_card"]) + fabricate_and_recalc_price(0) + return 1 + return 0 + +/obj/machinery/lapvend/attack_hand(var/mob/user) + ui_interact(user) + +/obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(stat & (BROKEN | NOPOWER | MAINT)) + if(ui) + ui.close() + return 0 + + var/list/data[0] + data["state"] = state + data["devtype"] = devtype + data["hw_battery"] = dev_battery + data["hw_disk"] = dev_disk + data["hw_netcard"] = dev_netcard + data["hw_tesla"] = dev_tesla + data["hw_nanoprint"] = dev_nanoprint + data["hw_card"] = dev_card + data["hw_cpu"] = dev_cpu + data["totalprice"] = "[total_price]" + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "computer_fabricator.tmpl", "Personal Computer Vendor", 500, 400) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + + +obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/obj/item/weapon/card/id/I = W.GetID() + // Awaiting payment state + if(state == 2) + if(process_payment(I,W)) + fabricate_and_recalc_price(1) + if((devtype == 1) && fabricated_laptop) + fabricated_laptop.cpu.battery_module.charge_to_full() + fabricated_laptop.forceMove(src.loc) + fabricated_laptop.close_laptop() + fabricated_laptop = null + else if((devtype == 2) && fabricated_tablet) + fabricated_tablet.battery_module.charge_to_full() + fabricated_tablet.forceMove(src.loc) + fabricated_tablet = null + ping("Enjoy your new product!") + state = 3 + return 1 + return 0 + return ..() + + +// Simplified payment processing, returns 1 on success. +/obj/machinery/lapvend/proc/process_payment(var/obj/item/weapon/card/id/I, var/obj/item/ID_container) + if(I==ID_container || ID_container == null) + visible_message("\The [usr] swipes \the [I] through \the [src].") + else + visible_message("\The [usr] swipes \the [ID_container] through \the [src].") + var/datum/money_account/customer_account = get_account(I.associated_account_number) + if (!customer_account || customer_account.suspended) + ping("Connection error. Unable to connect to account.") + return 0 + + if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) + + if(!customer_account) + ping("Unable to access account: incorrect credentials.") + return 0 + + if(total_price > customer_account.money) + ping("Insufficient funds in account.") + return 0 + else + customer_account.money -= total_price + var/datum/transaction/T = new() + T.target_name = "Computer Manufacturer (via [src.name])" + T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]." + T.amount = total_price + T.source_terminal = src.name + T.date = current_date_string + T.time = stationtime2text() + customer_account.transaction_log.Add(T) + return 1 \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index a3e5b6149c7..0decd436ade 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1515,6 +1515,29 @@ #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\modular_computers\computers\item\modular_computer.dm" +#include "code\modules\modular_computers\computers\item\processor.dm" +#include "code\modules\modular_computers\computers\item\tablet.dm" +#include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" +#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" +#include "code\modules\modular_computers\computers\machinery\modular_laptop.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\hardware.dm" +#include "code\modules\modular_computers\hardware\nano_printer.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" +#include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" #include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\admin_ninja_verbs.dm" #include "code\modules\ninja\energy_katana.dm" From 2eb1ece07577663bc249767302722d10ae190c6c Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 31 Jul 2016 00:13:27 -0700 Subject: [PATCH 02/21] more wip --- code/modules/modular_computers/NTNet/NTNet.dm | 4 +- .../computers/item/modular_computer.dm | 16 ++-- .../modular_computers/file_system/program.dm | 4 +- .../file_system/program_events.dm | 6 +- .../file_system/programs/_program.dm | 6 +- .../file_system/programs/configurator.dm | 11 ++- .../hardware/battery_module.dm | 4 +- .../modular_computers/hardware/hard_drive.dm | 4 +- .../modular_computers/hardware/hardware.dm | 2 +- .../hardware/network_card.dm | 4 +- icons/obj/modular_components.dmi | Bin 0 -> 3291 bytes icons/obj/modular_console.dmi | Bin 0 -> 26704 bytes icons/obj/modular_laptop.dmi | Bin 0 -> 26360 bytes icons/obj/modular_tablet.dmi | Bin 0 -> 1467 bytes tgstation.dme | 3 +- tgui/src/interfaces/computer_main.ract | 27 +++++++ tgui/src/interfaces/laptop_configuration.ract | 71 ++++++++++++++++++ 17 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 icons/obj/modular_components.dmi create mode 100644 icons/obj/modular_console.dmi create mode 100644 icons/obj/modular_laptop.dmi create mode 100644 icons/obj/modular_tablet.dmi create mode 100644 tgui/src/interfaces/computer_main.ract create mode 100644 tgui/src/interfaces/laptop_configuration.ract diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm index 4083147e1cc..dce270abba8 100644 --- a/code/modules/modular_computers/NTNet/NTNet.dm +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -97,12 +97,14 @@ var/global/datum/ntnet/ntnet_global = new() // Builds lists that contain downloadable software. /datum/ntnet/proc/build_news_list() +/* available_news = list() for(var/F in typesof(/datum/computer_file/data/news_article/)) var/datum/computer_file/data/news_article/news = new F(1) if(news.stored_data) available_news.Add(news) - +*/ + return 1 // Attempts to find a downloadable file according to filename var /datum/ntnet/proc/find_ntnet_file_by_name(var/filename) diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index bec75113a21..436b9870b77 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -178,14 +178,14 @@ if(ui) ui.close() return 0 - +/* // If we have an active program switch to it now. if(active_program) if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now. ui.close() active_program.ui_interact(user) return - +*/ // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it. // This screen simply lists available programs and user may select them. if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) @@ -207,11 +207,11 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) // ui = new(user, src, ui_key, "laptop_mainscreen", "NTOS Main Menu", 400, 500) - ui = new(user, src, ui_key, "vr_sleeper", "VR Sleeper", 475, 340, master_ui, state) + ui = new(user, src, ui_key, "computer_main", "Main menu", 475, 340, master_ui, state) ui.auto_update_layout = 1 - ui.set_initial_data(data) +// ui.set_initial_data(data) ui.open() - ui.set_auto_update(1) +// ui.set_auto_update(1) // On-click handling. Turns on the computer if it's off and opens the GUI. /obj/item/modular_computer/attack_self(mob/user) @@ -521,7 +521,7 @@ if(components.len) user << "Remove all components from \the [src] before disassembling it." return - new /obj/item/stack/material/steel( get_turf(src.loc), steel_sheet_cost ) + new /obj/item/stack/sheet/metal( get_turf(src.loc), steel_sheet_cost ) src.visible_message("\The [src] has been disassembled by [user].") relay_qdel() qdel(src) @@ -622,7 +622,7 @@ if(found) user << "You install \the [H] into \the [src]" H.holder2 = src - user.drop_from_inventory(H) +// user.drop_from_inventory(H) H.forceMove(src) // Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware. @@ -748,7 +748,7 @@ amount = round(amount) if(damage_casing) damage += amount - damage = between(0, damage, max_damage) +// damage = between(0, damage, max_damage) if(component_probability) for(var/obj/item/weapon/computer_hardware/H in get_all_components()) diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 53de9c91d6e..14cc1614ccb 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -19,7 +19,7 @@ var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! - + var/datum/computer_file/program/program = null /datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) ..() if(comp && istype(comp)) @@ -122,7 +122,7 @@ // This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. // It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. -/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. if(ui) ui.close() diff --git a/code/modules/modular_computers/file_system/program_events.dm b/code/modules/modular_computers/file_system/program_events.dm index 2901759b6c3..e64fba154bc 100644 --- a/code/modules/modular_computers/file_system/program_events.dm +++ b/code/modules/modular_computers/file_system/program_events.dm @@ -2,15 +2,15 @@ // Always include a parent call when overriding an event. // Called when the ID card is removed from computer. ID is removed AFTER this proc. -/datum/computer_file/program/proc/event_idremoved(var/background) +/datum/computer_file/program/proc/event_idremoved(background) return // Called when the computer fails due to power loss. Override when program wants to specifically react to power loss. -/datum/computer_file/program/proc/event_powerfailure(var/background) +/datum/computer_file/program/proc/event_powerfailure(background) kill_program(1) // Called when the network connectivity fails. Computer does necessary checks and only calls this when requires_ntnet_feature and similar variables are not met. -/datum/computer_file/program/proc/event_networkfailure(var/background) +/datum/computer_file/program/proc/event_networkfailure(background) kill_program(1) if(background) computer.visible_message("\The [computer]'s screen displays an \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error") diff --git a/code/modules/modular_computers/file_system/programs/_program.dm b/code/modules/modular_computers/file_system/programs/_program.dm index 1097ef65903..5ebfad06eb3 100644 --- a/code/modules/modular_computers/file_system/programs/_program.dm +++ b/code/modules/modular_computers/file_system/programs/_program.dm @@ -11,17 +11,17 @@ return TRUE /datum/nano_module/program - available_to_ai = FALSE +// available_to_ai = FALSE var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null. -/datum/nano_module/program/New(var/host, var/topic_manager, var/program) +/datum/nano_module/program/New(host, topic_manager, program) ..() src.program = program /datum/topic_manager/program var/datum/program -/datum/topic_manager/program/New(var/datum/program) +/datum/topic_manager/program/New(datum/program) ..() src.program = program diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index c7b898cb83b..d764c13a9d4 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -12,13 +12,16 @@ size = 4 available_on_ntnet = 0 requires_ntnet = 0 - nanomodule_path = /datum/nano_module/program/computer_configurator/ +// nanomodule_path = /datum/nano_module/program/computer_configurator/ -/datum/nano_module/program/computer_configurator - name = "NTOS Computer Configuration Tool" +//datum/nano_module/program/computer_configurator +// name = "NTOS Computer Configuration Tool" var/obj/item/modular_computer/movable = null -/datum/nano_module/program/computer_configurator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + +//obj/machinery/vr_sleeper/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) + +/datum/computer_file/program/computerconfig/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) if(program) movable = program.computer if(!istype(movable)) diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 1b1eae2d26a..e9b3287b792 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -8,7 +8,7 @@ malfunction_probability = 1 origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) var/battery_rating = 750 - var/obj/item/weapon/cell/battery = null + var/obj/item/weapon/stock_parts/cell/battery = null /obj/item/weapon/computer_hardware/battery_module/advanced name = "advanced battery" @@ -61,7 +61,7 @@ user << "Internal battery charge: [battery.charge]/[battery.maxcharge] CU" /obj/item/weapon/computer_hardware/battery_module/New() - battery = new/obj/item/weapon/cell(src) + battery = new/obj/item/weapon/stock_parts/cell(src) battery.maxcharge = battery_rating battery.charge = 0 ..() diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 4a74081c687..0dfa5652327 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -87,8 +87,8 @@ // Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. /obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs() store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar - store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository - store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. +// store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository +// store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. // Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm index 7f25298e06e..5e65c565f59 100644 --- a/code/modules/modular_computers/hardware/hardware.dm +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -22,7 +22,7 @@ return 1 // Nanopaste. Repair all damage if present for a single unit. var/obj/item/stack/S = W - if(istype(S, /obj/item/stack/nanopaste)) + if(istype(S, /obj/item/stack/sheet/glass)) if(!damage) user << "\The [src] doesn't seem to require repairs." return 1 diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 8ffc802dbda..db9c27657f4 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -76,6 +76,8 @@ var/global/ntnet_card_uid = 1 return 0 if(holder2) + return 2 +/* var/turf/T = get_turf(holder2) if((T && istype(T)) && T.z in using_map.station_levels) // Computer is on station. Low/High signal depending on what type of network card you have @@ -83,7 +85,7 @@ var/global/ntnet_card_uid = 1 return 2 else return 1 - +*/ if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. return 1 diff --git a/icons/obj/modular_components.dmi b/icons/obj/modular_components.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3594a12c17f70f3b71af1027e7671db465c53934 GIT binary patch literal 3291 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 literal 0 HcmV?d00001 diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a157462f57a35a2960e223c952f5ec27affaa43a GIT binary patch literal 26704 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Μ(H1wW+i0+D7Jow&=hBui$*Riz@ zR6IOg8Yp|YLvw0v;$8a^AapEpkwNsrwabWCZ&qJ%O#K7bek2CfNR4?uVa8?UjdE08 zM;uFpYi?avtB;@ot3yX&;xnUx+Q&Z7vtO5>LBz(c+%5;9pt6;kqr}~;FBSRx0A-*A zIX9PwoqM@z7CayO4KLTH65X@1!@hl+wqv{ul6||45mAt4F~f$pEpsgFQs0p{Na@or z5rF6{xI6q61l{@!yKi6!dZC0xLEDb8peJ9T4b7q7*re>msW}Nz{dJPn^~QW?y+~Z3 z!(+2P++5cDpKhFlBj3W}(~EgB|3$EsS1r5)>>>iF*aD)N zQ6!Uo%uSICf+NoVg>pPjJAqEm9SC3S^?7j!O`Svf7v&x}ymL~Gg6`|R?O)1~oM0}J z85-%BzFtM954ug;Ef_O#3S04uS2k>gc|3D^MWk1`=foq?L?|PVTG&6J+{qz~GFho1 zzOC*hBd=T39%l44 z7iL`C&gn(kQw;emiuc1dTCzX6uEt|@aCP1N8yq>oPx3F^V&n8ys(gsoU*1Dk>n)J! zDR;NCp%88gZ(X1-BRWD}UK9GMjh;Jym2@!bqoe63l8MyD=)GVE=T4;Y2hJ`E!dt*p z-BBFvfsNh8cZVgmL2V5t5sDgqYrg4Ut#Pi(q zJw5awL8Z%gcI(6SUR&kh$}ic_bWVx3fDzLIs1lSfM0IYt@V$DE@NBewS>SC2_)5IKn~;VZGdmDkTFTGb zu78VyeS16~LND!jP21uh5+u!|F(kyrbBRQ&!ZI<@Ylu~ml#EZ#oxvNO*u&3??y}x} z|1h(4&E?4a##2X`e(3jI*jMKv!+xk)=4$F1;%Evk{UY?II|T1QLy6!0A%nX3M|$9v zc@;A#iV{5`sQDb#EOe5om`!C{Y?gaAmuS94u6Pa}&KG7@EvVRUbQ7KRiBL#=Oz`D; zt!=)POIv;I(6uG-0*i7fsIbTL!o=8z+2(jAB8(XR5lk->`m@K^VCR#t+2%;UK_zGJ zlqoe<|Aa&?mDV@eYUqSBeC!r+n!owaho~<6&CFZ;CPI_ZN%X&es}*|b7Zcka!91m< zZyu;pF?0lbMyR9HJ>D&7wVN#$f z(gh1T{D$!S4HqndYa(f1m@>c%!HoBu_X$E5{^D4O%2@>R`x!AOLrZHwTENp{P?2kN z^8`+eHgKfC+TtZAS=1Taas7`rF}84Qx6R4t(t4s`lu@hC$t`u8?$}f5Zds`Op)^ky zZmlda%Gj`*BB(rWaRpU;b& zW#WwovAzSVPg(>e)tvX}|H)C=CWoFiQwfDLF4BS-@k}h~e5XL?EQduhJrB0%J!}o) zH)Lcww@Qm$1s-29ACx#{I*G-Y?D;HonJKo1lh>YppuuGaORWohDFb~mNgpZv-sU%$ zjor^eH_ z??BU27&x#!7*^3qc~ElidKH@Fk9KH714bUWxn6HC@Vf2Qa_V}SOQb=U zPrID?Drx2Fs;MDm|91Xt#Gc;Tp)!oNJUQh6<;dLngUpDudhyHjU(Uw0J_p^xTL&vd zMh>4{LOw#O$p>tEKQ;e-moVUUOVM2-nd`EqQbetCS09L)pvS}M6AVd3^Ki}*hluT3 zow9?xSByL3CGDgF`uGUW;4p>VNm0xUaDZMdW1xf=f0}V8WUyOtku(X@ON<7|TWdK4 zPI{~_e{AAo)lf*7Hf~8$jh!MQkG8^;UooWqIu@UiY7AM%rbDX|)S>`*+yg}+w%Eim z&8i3dEM^atWM1Nwz+_MkJz06RL8xO`sp#yi_U$r;+a#i|(!v9aZDkv9*GN)2ZxdjM zU$P2M`D9R8+cWHlLfzz(e~Bx2@f8+-t)vdxO0K%vD^CW=!R!@DJ#FZQ(=1HEzPZBs znS_X<3;=9=Z}$Lc;ay5>ehNbok}n6K2%MD_Ze}hF=^r$;-;X?Zw}Zq6UV2Q62XfI zb{W#UX`f5a9lyK7NY-4{A-}tnE`qrcSxTDS#!u3ib8StsPLQv~Rb}ucLLPi3G2=Kh zjQEL>?vO<_gPQ_dM_ti)^^~K?moTc<@J?#o7Z&L$af+NBt6yo%`z5L0a{9u~RRtA= zadw00zR$kHR|sxY^*`rDiMvT!U)Lmj4Mb7A`?RO70;0&!^A1OQlueF3nxNQOF{IDs zpyt&wZTN+Av;4%6fojs+j2S%8_(jL-o-@Y-c@gbBx~vs)IXc#90NRlfu=HM=UgNwn zD$)F|a1mdhZ`;t5>mA#-yyMbqpjG;a8EH9(L_>tF=~yKTHs47&cLE%;uXHBZz2?A6 z#N<2#3Y$@eq<250vj1==-^+Z#-2oRIKnEZ3Ie^V775HK6-MkIe&6lh_w76tz&vwY5 zRN}agicuS4mWxPNM9x0nFZ%p4X$JIfz}LNZs>-p1p2aDy{H*VKVCP~w6B3(&5eq zYD_Ow>uoq(g`(qc7J8gM4yv;at5Um)afWYII%@c6@%ybO1r=R8(8)D(W_^M(IJQHP zQ14cY9PrrJJWymm`&RypbL+7=X4fI+5XWzJ{@BbyHT`OirFkW9w^pPcWd0amKc7NP z{|n;pdPV)J$FYf}OTS z;XazyTt?xM)?SSbH%w3)yspj!R%nH6gui}x)HA2tM`PjLvZ(WC=I>xEp^ml`cMKGl zgG)|Tb5m8-JX~NM=OSmECsYa?myujpKC93Iwk;C1>8|yZF>+y7E1HAsKLn zTz5*T=3UM;sKO#Q*roXmJH^QhHNBc7<7)T`$v1}nzQ{b}70dN}lqLf2binQFY&+}rn`t7pK-Ju@PlvC3rLSRn^UO5q(2y;J38&L6Q5gZ_{HMa4}kI_xXU5w6?w}`uazptj>cb% zy^$i0*8lq(zZyt#JM4R3%)wdj9dHd43I!k`$?N}m;Efn*G1vp2jQoH50{8!~`qCxi z>*xNh1^92irF<==y1eetTFcXbx z!i7rKwjnPP=iL*ZPB)VGg(#$9p+)Z@EbU&^_DlkF4y&n58cTRk0GIvO5K%B686zXc zC3u_f)!ev7saEb7rB+>bWUNjbIYYI3FagC;H6vGK1G>^}c&V6PB$calG|>(Q@ZS74 z6VK;gaG6aQu2}6%3ca@sD8a<4x;a_jiEQ>skEqfFlWr-#!^G~>7*dR!;S9c=Q!Yo* zX%fGuBf=HJw;a+6_#T06J?kn+lqsN;&$pih|Db&qi^qWgzuIJm?mQ1Y!+TvLhA zJG1YeM+M!WUNhI#U(V>*eOb$r@tQbfsEH}S6S|)STB|fy_F}wAuUM-QzrVPBWG7fr zn8(7bdeXtdEY$nmi9>(cnE~Hrh@+jhx1(l?2!((Y#m9THF>$tru|ZkI^}-EO>kQt# z3;s2?qL!q0Lz}Qi8ixcjE%@g!(78OSk1W0DDbuV*m?`-Kvoe9|nUx4$`SNX7;Jsm& z%0ktw6+LvP25yn6W<-x0d$saYBK7Jw&y^Aa-_rbj>k4P)Z&Xf~*IK9;Z|M*tKsMul z*)AmutTHILLMg(U5PV^vt7u{@3%oI>aiu1kDH#I02k9OaT9z@oor29wc?p^y0hPsuv5mlFMlR~xDyv=y z^HPm}dk9=2_5)6z=Gx(ss|i%uES!^&Ol9U?Ygsp)*o?4cbiwOWRzhRsJYrEGON{c$ z$vAdkY^-Xk-J|ollvi1wEG2c>jQL~Dsn6@+@laHXMq#W)?7-6VYE|T7d9U3Yif&O& zE`1<4dHj{C8_)kvUr9^p5>IHX$W$|g$(>7RD$5EsSBh%y_4BAR5&9dwgTAABo;bhB zN#}|j?5_PwwZHl_&TQ?fokfye3D5Z|rTvNX)lB|*dF~eu94~pb!(+Xp6}$S%EU@|0 zF$f-WYp!YXZN5kkmU28xzVeQk|H88gpq(%%k50Op;yaulcbtN;WmUjKI*AMZYhiYo z%J`m_O3jDxZAHiOvO!eRSZ_Dt8qpeZTB9E!yt2R2%E4SoI^L?>xZKaA^x75n@^k%w zdM~T2kaKGNBqgIH%*9errpH|w(p@d>VPaQNg>TQ!k(!PN=#_vCtA?wf;tbf%)+LVT zA^jmYI>6(S00IlJHvLP!W76j7ThrqaAL}|^V)xS?w;%EG+`WR^<&$wkw_la zJ`t6z9BdhQ*r&R;G`E<{;Lb_p^$%&W2SFOjh40`a@e)zg56)(J?W75slC%3$&4Q9H z@=ZrMZUYB=nyrYnV$#6QgtbAj*;R4gs!jlSdk%P0dyK{ph^w-r@-oZ#8aJp{d1S)1 zSt1Kk<1(UY0|0MJ9~j4W!yn4^vE5k7?+5nH$Kk7z-17sr4S}8gP!BtpXwZ-8W>W7L z?j!0fojE`Z%5`V}<1GE0_H1+hOr7qPA3f}$(Ux%2r2nfszGQGH_z;`jxT@jBCHH%v zif4(=@5B0EGOBB*GT?Gi*@~8efR8R^pyomvN5rt#_=9Ry|Gg<3u@(N{;|o(Uw?7y4 zL$ChX!fNWy%TQ`k=w9p|o8126R;w?z5TRPJRX2zJN}70|i2N_;P)@ZI>H0^B=x@B% zfgy`v4-}dOJ)1Sn0S|lRfY--sFMXzAf3;M`xUJq0B!A9e(oL#rgrbaFd96r&lWeVK z;?9b>SKcNqZ4o1-l{LsStQ=t_DUQXM|I4Cxgs7A5cl{c2k>RI*BFq7KqVgef4rxbZ zl{SUl{?fdV^sb+iedZzwo=E8&eq24{2C&o5hN;m9s0K=0D4<}v0-n!^=K{Z8YQ+rF zPjv~ilYOrW&0^uw zn$v`c=qi-qT5Ln_YVP;`k{>(PO})#N@JYru9wYIk9l*;C^=waC@y=9RJE_&F0`rMu z&B(3?&GD$Ko!2WlQp^71r;i4^@y;HyyM|GU?Puo^qgVqMM}o*^UzYz@ao-)))V6LP zM2ZT6q5?LsVnIPrKw3alR8)#+1f(b;C_C6E`|ca>z2Er#_r@KAj75?W_O~``tvT1XzByyyLuDJpP6FPX>Kt7{MheF5&ZY*-pY@tSiL!M6x&#{Sw42
    o3eCSc|2iJp)Q|`*2EhQu;+`=3Du##zq#%^U{16OwgM8>7Uo`u z*RB31X>d0DSDIn(mkXN_lH)Ra>fe`UxCDe&r#zke3VvyNAv)X_v5z4aAsD8ybo(ctYe9MEZ}jrg%g*1u5{+s64~0! z$^d$-@;D~3Z8n4>VJ~n{ymxlc92%P<8mSDW`W4~lx_Q7MuIxdn_|vzITjaQXwKf8CJnO zSBgLK7_W-${KBx?@6DfCp))2 zv@bl|aj?cRVL3)c5Y*AbAJ^Mw#Ex*k>bo79b4R}sZRQg){~tTfeaX3R1^Zfjn)bP$ zJ&J#IAj%%-A)^se|B~ho>$1pTdV$%ww2?a0awQ-9fOI(o@^A4h8ss*m+{IxbgMh%d z{v0YN&-PI64dEZ;gsA#{cDmhysOQc%(0nkLp*y}gbm+Vbs%oJCBZ4~FXmBnQe*+;fo|Y@3o#ETPl}$~o)D&!=$;yXoiJh-SAf9whU$^%nH1owr_O0dR z3X9ScR>rxTKMsmG4ZQnYFp5*6B!U|XciJr4g*2#ny9k?5~R<+N+x%a!!f77GYtP~db ztsmn!I>Mb@(i9p^U;-}P4W#lcZ9qFX%^@$JqAq8iM-jFo0E@32Q(!!zj~2+`_}Vm( z#Iq2iRMtS0d2p=)4V@!gyC}E=@reMgRv>!1u1l+EI{@*?L`cXif-`vgX1G-g4=Qp57l|dXE(M(OMra6) zeE424tgtm1%y(6bB(7@lz6n=F+7jqpX9xjxI%FE!yt zwry}bZrD0O5M0Fz?ecQc7$2x`Y@=69Yz0obq;0dFV#_)7bMyO@5gKr&fZ`15b}|q9 zKs!&+w0{=ojaIV=@ZR@qQm_BXbGvBZcV7KHY#Bsq$E;=PRuMLiv&o~|mW{n9In`V5 z18f2)M8?2=rfx0;6w-aNg#REz!~W&)JC^g6WV%GZp0Jxfnx>|5lVK}*u?XQl_CcO} zxN2xyze_cy{hb35R{3=5lsfRl0i=MiiV`~QKD5pJ$<&ZH4pzx#s5kRZ&E64aSqxBK z+7l7NT*GJkv(xvU{P@8j)x(=VFwf>wpQP5^@dm-klLrS7c1h>RQIOPhrrXZrM>}{a z1T45OR1!%azVmlrmr(q`x?cg;Ywm=SroiB{mi{WjnI)d54(hcBG zeszXRl>HJqF0LZ}{adcFbI7}pkXs3_pjc)MQo;|lMw zqD~INJl^D|-;A@EJ({XK2oV+)MrdaOF~{153(#aAlD2ChJDD6E*%wYxe~y6mX6>nq zH>%}dmJI)){c~%nRnW@q7>Z9@Rh54ha!pKEbY<}X+^bwFUWE0WKAOHfJQA`^v5A)L>O+BgV2;BM!j-tT>+!w7&>!!2L_)z%hu{bk3?^H0Ca?za* zM?3!k3cP?D#5_kO9Gu>)(&RM{7aX-pm`L9r?0k;eE;@?%Ab=Iu{0n`BWw2c0u1WBl zM-*BU^|#{I-KJ7fWVYpU=-*@tBys~{Fc{#4E6268mY(}$A^45d<_Sc)1k3ChonetM z0dc>B#}^F{(h#6`ApO=asV2%fISQG^_t8k5_NsWP?{{|?c3W~ zVd;tRkDi4lL}NQ(JUEYvcho&a0_8wAZK1*SgqfClME046%fg zu(4H$ZcepVImZ@|tU{{MIreNjkL^gd^-0q6GJ$nxT|`zXB&zX7gu+@(sg4LLWQW-F zAlJt9N!&{W9a+!40D2DEqpGD0IwP_jc~wd4iw#ccGzj+Sw6%kS+ufb`&jR~H#wPbv z`7k$lIaQl9#pX?Ry?>mH&Se)P_6H)_GshmOdoS}PC0}>{cGDXit?2Nw7itpei65vb z`m~)E^(vF=^I@cB*i(R%)#Jo&lb-!*huE%W4rEW{tpdUiyI5Je>kTsa( zP0s2}o)|6UMPyl&K$m9MTW!5vQ{TSC%5D|YJB*y13WL4PW$m86{9^eiTtI)P=6ALd zkq=jSU+h+{K% zN|6`^5s?LX%DMN54Z0I>%pW4fk^@dJe|tout-fEbqEoVa5j#?TKGyikY za579D`#rt!i{%9GRs5t*N~7mQjUapX%^hi<*2gDhA&w46ulnD6NybFYa;l*nDA=!e zS*j9p|0%rNxAeS{G7;A&R+5d)9&KdQiNtn@Si}ic+$0hvLMf<(JCMx-shl^w>@caE z%~_{V+7B}Fvq^4RZwBDo`{wCdFGh{?mxIg%A+m3ced@B0}qpD-JF<>wN@xVlW|)8!>E(2c!@?0`BvOW<%6w2o)a$5xB1m z$uMam_Xg~rG0jrjH7$c1i)~$B;VWqmo83oduIuwd?n&$ua-YfQ)$k(+ZO{jcNK1`q zDSYx#$3klL?DJP#FXD%D_`5HzG7}nDe5$EP+k5aFelUohFK`TK>CA z?0+~k{yS>5bImn`{{OHyS-48P(9JYCRLy|ET7D9aZ&?Wc{ z#%bj_H}lvOR`>peJ}ePT}@ww6-wG>-VSB#%}eSS~)>K7YgCvQ&51 z-ze49q!Ikf)eqUYl^nY#-9kYe)quTju(LU0(#FQrcNrb5mL>AdtX!l#kfj@=WZ-{} zIVlB-HT^H$S5^r?&bmyf3R2ev_fj7W=F~3uV`2agTF7~kF+mca-Xs%T1PAtmI7Fg! zja)OD9t7F(gQz39S2@unqk*Hq4_B@OlkzJwbObn_KDhrie)+6+MKIFml)zg{YFy2f z-&_?$-I=cwJ26Sj?ivD-<(t6sURXj0mJNJ%9WAzn5T$+m-Y)pZ+slrh|74>)s{e@+ z_o&$6a_0oL7o)#7Mu8cB1}f(_c9_o&fJW~FAw1Ei%#|Q0TC=?~1)UyTTFpcp=ya=R`lY^sO~Y>vkI?qb zeAahP<~%)a5Mc7M8!kS6bf}179-8L}mu>1^{VVXjsr>Cv>hY$M=Mu#>U{p|=eeV(q zPxU&AIf4(QW1@tI9|W%$Lcc#8;FBhpOY1lv9W;7qGurZR$jrqyZd#$wyf2Py0AP;4$^#l}Lrtx0N1jM}g8V#*zYAKGK^%`<6luLL)jh z+*b_qAznUzLwclY){uXXkGPG&vxZhwu5#pavK;?y`g_Aak{UN%bD+Judr=I9wA_wC z=5;T^ws~7C$x}fR>t(#fpn#5+4vpczVs9#E6hI{oQ;9{5rR;of62Mt{Ai4iA*h%1h zFG=qg%)^5#BwJy|;Rml|x?5wE-={i%M;cV!;L6o9Z>I*NaRuTX^!jBYc}NEVl13J3 z9_|FBlq0Xv(t-q~Ibi5TH)4n&KsiSp4d*%N{hbFUlcyCmbTd;6__Af>Fbxl&zy+lMfj+9lqC zYT;Tb%+CmgPgS8sx)rN7xUPJ@vE>XB%<0Oi%RBLdNEeJlZD^CfG1Mv^x}p}?{O+Uk z)LUq&#Ey(^KEnS#WjSZ@R;U`(y_h&f4XGH5nIPXahE1E`KbJ?Mf)y`gz7z}e*MR~^ zv8{zRZU?;FYz@s8w`2;x5%_|ZwkaRsOX`_aI5hMHWb)g>t@}+bv(F|CUUygNn<^J2 zDGTg`?*8V!T6(G#OM{i}(nh@)a$?QI>V}G$qbphUk#EE{+CBRu(|pf!$E#Q7VPUGL zlMb4O-FUL6KrVW=_sw@!K4#?%F91`yTU;}65WF#fcQne>va&-k?#xQxve@Bz4R=&$ zXVER+rJN$U*9Y2$ifZM8@o>GsS5mW!NAVRhH@vyo)1f$Fx7u`K#cUg6m6qzCgL}+? zWYmG>E%su{pG+llD8pT=XG%yj~YDLXxX;w|(YUX=rVR6Wi z+Ny~C%V%-_ovl}#Di7{gR$5tmv0#tkVck0qf+lnrg~N@lF-Z-=9GU2fRT$`ZEuZ>^ z@`8pN+&=ktkk)ck7&37;j>W6XYf3-q zzZkFdoTad~1N9>Ip%24UJVMQ-p-*GU^U8R()i+*74ow;+JU193XT39&*!cRfST7mf zc|}zpyndN8^h7ntTBxTie?r{$wKEXm0ObR!5C`3i?UmZlJSoWbOEH#6 zE*Bb)8|wug>wh3+H1k1HELrVq!ktHW70gw9< zA8EH5qH1xS=Nag1RvSk!HUdkv7n(2&0DF+m%1+0pKzBj-iE4HyC95Gi%urwH_R}iV zcCzw)HC3+Iap0-gYuNeta-Ss{T2376;sF(_kHKp*j{^g6#JEiX0|D*L% z$w-G?g}ysWU`W`Qe(`PQs5ct*1-JBJv1I>!JTt~8^>P@i%`!$eRB&kw?;jTnFe?`W z*X(*S-uffcJT6oM7c)wF9~xyHqY4G`#Wc7p>aLur{ifYc3rxi^!cIWD)A)vtY`C#t zp&sL-v;8~bjBm8XJ(xE`{MvQ7J5b>vYqp|A=SM-{Fa7n&)T6_(V{d{|7R$|G%f7gK ziVwDDP$V{T&n#$P#XVttzT$C2BlDQSx??*SY6p{1D2ZaxcLdlT)ib>IJqoh}Tl-FO zVX#`wGTA-+qIe1gl?xPc#v^mP*7M~&cv+F zrER;Ahz2d^c72hHALB`h564EJzreLci6@F8(#P)#! zRn#1ZpBr|_)6+8zyq15{%Zu;;Moj2rT|nV2^y+Qfwms#Mc;a}{5d79%YQ21(9Ch5MD(6rw}j zUO-EMCn(c%E1w5*BLgnUn_m2AbL^0As*2)?iZzGY#9wwMZo{D-3b@5&>Bv{YwnPm- zP7#4{)74en!NK7v59BipisqVM?$Pu4y?V=*Et*C~F?cYJKsZ9DCm0Iq78VgV>(%!@ zZ!L7{DCfV=RXM=mQpVLXFL952+ILqv!;T74cQ;-NYSB%7=j{i4>YbmHbK@Fx3gu5< zt)hO`Eo7|pjYxX7cm8FQn^By2>BZl%`QR*WhmVuPg9>*rpA`&JsXMAl=&TS?m_Y`r zmbXD^eCrZI=ZDwnoW7HH4m2Tv$uAELrK^?mTc$TsrOri*^Xi&o3YzsRI!=!Ie@^;j z?sau5h7~nFt5GBD3463e08Ld?Pc{!S1K5IdzZ7?*oRQy?711hz+mTkYa!X%U#mMtv zgdsu8z3LX+As+s5;PD}eWU*_#tu&ztf_;-3}Q^DTeZh8)vTs+uWJl2A}k znC9?*jEtNuB5%95{j_`cm#vSrpxu4F^PC=Uq6Gn{rn1@YuCDdf5?2}*6~8K>)Ya9a z=lFoU;I_YX*N!|pxqZ@B*y70Oh(gN?yIa}$Ua1?OOgIB>1{dTL0O$=p$Ml{4k+)rS zU~NX%R*5%lw_mcvBu(R_!@sypKUi3@^M9!078In2M1q9T=zy(x+R}0!n^tk6+nZ?K zsSzF%VFPQscV;*h@p-D7!vr)|Rgqk8W8>M}c~}lDc=Yt?({{dD5-&DM{)~0tN zG$|*0fV291=*r}FW>bz_0{V_Yau_tm`m?20c#OYr0AB=Htpbmhme&51d}~ffTzyjH z*8p?9cAMWQClYIn<$U+3mR452=;-Kpx$ImM!m1-VdwH}i5Gh_7KbuQ`=?25!g|8>N znA}%AyERdN@au!a*GtCSQG7I}A3@*i5jq3U@PFx>oC11fta@GCBeUUS4wspGB7=9? zK)$WcoJ_0;k#_aSK$|74gn(%emWZaoVhZnsYmdY0qU8;KI^X;eql4OwV8PiPk|u!) o!ha%@^tbXXc#qI6LN~dV(mIU$E&&|QuDMt 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 literal 0 HcmV?d00001 diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1872315f49f0acc11771ebb495858e7bcb741e6b GIT binary patch literal 1467 zcmX|9eKga182_@`#jMFocFD2iem_jRE zD%|cRv+5*ny2N#QVdLtCw3)ZeHuJl4?m7MOeV*s@d_Ujk`FzjwlpZJeB6Uo3002n8 zBi_MkFW5R-Ftt6SdDB_#>W?1{@ev3F6bgmGU|3sQL+a!eB^C=|Fc@eMKwB692w)*> ztvZMYpcV{b!QkK^7K&9r1ecaT$ucNi0TnV(B?qi^z>@KJJWwf*ii!f)RG?Y`s+FJ? z0&Ep1UjxqZpmY_mH^J2naA_G7E`nd=>hgfG0CML6T?`mvP#^`xi=cQ3)(2O}NC2KJ`^{ z*{C4#E~|n^dQ-5Fb=Z|*=;>tKDAFBf8vWX*2cw4V4hnY}?{&11vDzGhV~dc_DvdL# zSE;jUvV%H5=K8eT(kn=uR=*wRa*Su%Lt=IXUDl568T~i8&Twxgu@C#G2i1tAAWnIj zx!{Eq>I-`ZWe6p=vOK*|L@~anixH-3O>N%wIdb2_`DM2`fJBjQwKFMoc9A=D49c5D zubIkz{j_jaAwl=|*Z{uUc|z|e)4r)$kAK4L)B}Y*^z-%%$+#)uL=ZpV4U3Ql`o-JI z!owbhL_}nbosvLM0tex3?lN1c8$K|s+7lRYTH0=fxkG*5js*a%J%A`)8!4hJGqnsX ztJz5J8bL-FQVDBBD$U6s9z+e9D27=(1@3E3Lj%Bn30~ehA$!m@e^78VE*Zy-d!OoF zFEhf+<+7YYaw10Yvx@@EtOmAQjJ<)oFyJ$1F_w67FXGtrW?HH##!oNWnhfC$AYcEj z9RmOlREbE%+ai^6{p(Y!j57EY#DH|xw*}??^mZgn3_CxB!8UlRuh63WRS-|yd3(h` z9BQ7!RN?gQS(Wm-J58FX34C3v@&D^>S&OFg=sWzgT+RLLfHiGP)kIJ%v({g!qYszx8T>YlEM`MjP9dRz(KIZ0)G_Hb_Z?p+ZOnMg z>xTSGiRlAk(hDcOc>EW~S7PH9>axkAg?uG;ZEU(Rs_0v9J)4m`oBYQ+e4gj2ZZUK) z;>m#9%bwgb9)&W*T)=fP1}G`Xr==l4 z=Ad;w5pQOg?@GQrijXAkk-|1MbCs)+`Iw#~!g5+P*^aAO28EW;zG($j7P<56)$r#B zx^Se>oP5g$*t>G=I6-T3_TQYRw#V%3@s9OYF^Swq^j+PzU})%&#?rQUoQ0P|x>4Fj zrY8z@fC+zAQCZKL-q%0RuMb|&3`X^qnEBUm8`+$+WXS$A))j+m0>V!GTo`$EZx2dW z2-@lF)jsn${Ky|f8&4L*L4VUzrQcc*iz;7?k+oj^F|bE7_eAt&?`B|X^%BYEz^P;a#E4_>sCkI>ph z&Sa--0a<(~iC?6HnH$ZK^iTe#PAKI5N>xW2yt$h?)!dU#TjWZTZOs~vYT@Ul3vN=6 z4mHPLnH^C{Ep@8V)*$6}y`P|oRWWKo(HXGX?qm(LYNnbtwZdK#)o(EuLahxnwG>3` zCJmL2La`)09;Uk&IqOPReQzF=nUkd$7rAczRX`u`uptyp?~$Ucx3HfN!MoKfn)x3y C$eJ?% literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 0decd436ade..3183a2c504e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1519,7 +1519,6 @@ #include "code\modules\modular_computers\computers\item\processor.dm" #include "code\modules\modular_computers\computers\item\tablet.dm" #include "code\modules\modular_computers\computers\item\tablet_presets.dm" -#include "code\modules\modular_computers\computers\machinery\console_presets.dm" #include "code\modules\modular_computers\computers\machinery\modular_computer.dm" #include "code\modules\modular_computers\computers\machinery\modular_console.dm" #include "code\modules\modular_computers\computers\machinery\modular_laptop.dm" @@ -1527,6 +1526,8 @@ #include "code\modules\modular_computers\file_system\data.dm" #include "code\modules\modular_computers\file_system\program.dm" #include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\_program.dm" +#include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\hardware\battery_module.dm" #include "code\modules\modular_computers\hardware\card_slot.dm" #include "code\modules\modular_computers\hardware\hard_drive.dm" diff --git a/tgui/src/interfaces/computer_main.ract b/tgui/src/interfaces/computer_main.ract new file mode 100644 index 00000000000..cc9605ba993 --- /dev/null +++ b/tgui/src/interfaces/computer_main.ract @@ -0,0 +1,27 @@ + + + + + + {{! Active program}} + <{{{getActiveProgramTag(data.active_program_template)}}}/> + + {{! Taskbar}} + {{{getTaskbarContents()}}} + + \ No newline at end of file diff --git a/tgui/src/interfaces/laptop_configuration.ract b/tgui/src/interfaces/laptop_configuration.ract new file mode 100644 index 00000000000..18bb98e9539 --- /dev/null +++ b/tgui/src/interfaces/laptop_configuration.ract @@ -0,0 +1,71 @@ + + + + + + Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.
    + + {{#if data.battery}} + + Active + + + {{data.battery.max}} + + + {{Math.round(adata.battery.charge)}}/{{adata.battery.max}} + + {{else}} + + Not Available + + {{/if}} + + + {{data.power_usage}}W + + + + + + {{Math.round(adata.disk.used)}}GQ/{{adata.disk.size}}GQ + + + + + + {{#each data.hardware}} + + + {{desc}}
    + + + + {{enabled ? "Enabled" : "Disabled"}} + + + + {{powerusage}}W + + {{#if !critical}} + + + Purge buffered traffic + + {{else}} + + + {{data.enabled ? "ENABLED" : "DISABLED"}} + + + + + {{data.dos_overload}} / {{data.dos_capacity}} GQ + + {{/if}} +
    \ No newline at end of file From 23c9acdc62ffaa10227df079fc3f5eef36cae47e Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 31 Jul 2016 20:00:10 -0700 Subject: [PATCH 04/21] morewip --- code/modules/modular_computers/NTNet/NTNet.dm | 4 +- .../modular_computers/NTNet/NTNet_relay.dm | 47 ++++++++-- .../computers/item/modular_computer.dm | 88 ++++++++++++------- .../computers/item/processor.dm | 13 +-- .../computers/machinery/console_presets.dm | 3 + .../computers/machinery/modular_computer.dm | 11 +-- .../modular_computers/file_system/program.dm | 9 +- .../file_system/programs/_program.dm | 4 + .../file_system/programs/configurator.dm | 16 ++-- .../modular_computers/hardware/hardware.dm | 2 +- tgstation.dme | 1 + tgui/src/interfaces/computer_main.ract | 1 + .../{ntnet_relay.ract => nt_relay.ract} | 4 +- 13 files changed, 137 insertions(+), 66 deletions(-) rename tgui/src/interfaces/{ntnet_relay.ract => nt_relay.ract} (95%) diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm index dce270abba8..39f0400c47f 100644 --- a/code/modules/modular_computers/NTNet/NTNet.dm +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -38,7 +38,7 @@ var/global/datum/ntnet/ntnet_global = new() // Simplified logging: Adds a log. log_string is mandatory parameter, source is optional. /datum/ntnet/proc/add_log(var/log_string, var/obj/item/weapon/computer_hardware/network_card/source = null) - var/log_text = "[stationtime2text()] - " + var/log_text = "[worldtime2text()] - " if(source) log_text += "[source.get_network_tag()] - " else @@ -133,7 +133,7 @@ var/global/datum/ntnet/ntnet_global = new() if(!lognumber) return 0 // Trim the value if necessary - lognumber = between(MIN_NTNET_LOGS, lognumber, MAX_NTNET_LOGS) + lognumber = max(MIN_NTNET_LOGS, min(lognumber, MAX_NTNET_LOGS)) setting_maxlogcount = lognumber add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.") diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 7808af0cbe6..de40b427476 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -5,6 +5,7 @@ use_power = 2 active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. idle_power_usage = 100 + icon = 'icons/obj/machines/telecomms.dmi' icon_state = "bus" anchored = 1 density = 1 @@ -20,7 +21,7 @@ // TODO: Implement more logic here. For now it's only a placeholder. -/obj/machinery/ntnet_relay/proc/is_operational() +/obj/machinery/ntnet_relay/is_operational() if(stat & (BROKEN | NOPOWER | EMPED)) return 0 if(dos_failure) @@ -56,23 +57,55 @@ ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") ..() -/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) +/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) + + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + + if(!ui) + ui = new(user, src, ui_key, "nt_relay", name, 300, 150, master_ui, state) + ui.open() + + +/obj/machinery/ntnet_relay/ui_data(mob/user) var/list/data = list() data["enabled"] = enabled data["dos_capacity"] = dos_capacity data["dos_overload"] = dos_overload data["dos_crashed"] = dos_failure + return data - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + +/obj/machinery/ntnet_relay/ui_act(action, params) + if(..()) + return + switch(action) + if("restart") + dos_overload = 0 + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") + if("toggle") + enabled = !enabled + ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") + update_icon() + + + +/* + + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) +*/ + /obj/machinery/ntnet_relay/attack_hand(var/mob/living/user) ui_interact(user) +/* /obj/machinery/ntnet_relay/Topic(href, href_list) if(..()) return 1 @@ -85,13 +118,13 @@ enabled = !enabled ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") update_icon() - +*/ /obj/machinery/ntnet_relay/New() uid = gl_uid gl_uid++ component_parts = list() component_parts += new /obj/item/stack/cable_coil(src,15) - component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src) +// component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src) if(ntnet_global) ntnet_global.relays.Add(src) @@ -104,9 +137,11 @@ ntnet_global.relays.Remove(src) ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]") NTNet = null +/* for(var/datum/computer_file/program/ntnet_dos/D in dos_sources) D.target = null D.error = "Connection to quantum relay severed" +*/ ..() /obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) @@ -124,7 +159,7 @@ for(var/atom/movable/A in component_parts) A.forceMove(src.loc) - new/obj/machinery/constructable_frame/machine_frame(src.loc) +// new/obj/machinery/constructable_frame/machine_frame(src.loc) qdel(src) return ..() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index 436b9870b77..54e7e7e5b2c 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -7,7 +7,7 @@ var/enabled = 0 // Whether the computer is turned on. var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. - var/datum/computer_file/program/active_program = null // A currently active program running on the computer. + var/datum/computer_file/program/active_program = new /datum/computer_file/program/computerconfig // A currently active program running on the computer. var/hardware_flag = 0 // A flag that describes this device type var/last_power_usage = 0 var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged @@ -100,7 +100,7 @@ card_slot.stored_card.forceMove(get_turf(src)) card_slot.stored_card = null - update_uis() +// update_uis() user << "You remove the card from \the [src]" /obj/item/modular_computer/proc/proc_eject_usb(mob/user) @@ -112,7 +112,7 @@ return uninstall_component(user, portable_drive) - update_uis() +// update_uis() /obj/item/modular_computer/attack_ghost(mob/dead/observer/user) if(enabled) @@ -139,13 +139,15 @@ user << "It is damaged." /obj/item/modular_computer/New() - processing_objects.Add(src) + machines += src + START_PROCESSING(SSmachine, src) update_icon() ..() /obj/item/modular_computer/Destroy() kill_program(1) - processing_objects.Remove(src) + machines.Remove(src) + STOP_PROCESSING(SSmachine, src) for(var/obj/item/weapon/computer_hardware/CH in src.get_all_components()) uninstall_component(null, CH) qdel(CH) @@ -169,15 +171,15 @@ return 0 // Operates NanoUI -/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) - if(!screen_on || !enabled) - if(ui) - ui.close() - return 0 - if((!battery_module || !battery_module.battery.charge) && !check_power_override()) - if(ui) - ui.close() - return 0 +/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = contained_state) +// if(!screen_on || !enabled) +// if(ui) +// ui.close() +// return 0 +// if((!battery_module || !battery_module.battery.charge) && !check_power_override()) +// if(ui) +// ui.close() +// return 0 /* // If we have an active program switch to it now. if(active_program) @@ -190,28 +192,39 @@ // This screen simply lists available programs and user may select them. if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") - return // No HDD, No HDD files list or no stored files. Something is very broken. + // return // No HDD, No HDD files list or no stored files. Something is very broken. + + +// data["programs"] = programs + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) +// ui = new(user, src, ui_key, "laptop_mainscreen", "NTOS Main Menu", 400, 500) + ui = new(user, src, ui_key, "computer_main", "Main menu", 475, 340, master_ui, state) +// ui.set_initial_data(data) + ui.open() + ui.set_autoupdate(state = 1) + + +/obj/item/modular_computer/ui_data(mob/user) + var/list/data = list() + data["active_program_template"] = active_program + + return data +/* var/list/data = get_header_data() var/list/programs = list() for(var/datum/computer_file/program/P in hard_drive.stored_files) var/list/program = list() + program["name"] = P.filename program["desc"] = P.filedesc if(P in idle_threads) program["running"] = 1 programs.Add(list(program)) +*/ - data["programs"] = programs - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if (!ui) -// ui = new(user, src, ui_key, "laptop_mainscreen", "NTOS Main Menu", 400, 500) - ui = new(user, src, ui_key, "computer_main", "Main menu", 475, 340, master_ui, state) - ui.auto_update_layout = 1 -// ui.set_initial_data(data) - ui.open() -// ui.set_auto_update(1) // On-click handling. Turns on the computer if it's off and opens the GUI. /obj/item/modular_computer/attack_self(mob/user) @@ -223,7 +236,7 @@ /obj/item/modular_computer/proc/break_apart() visible_message("\The [src] breaks apart!") var/turf/newloc = get_turf(src) - new /obj/item/stack/material/steel(newloc, round(steel_sheet_cost/2)) + new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2)) for(var/obj/item/weapon/computer_hardware/H in get_all_components()) uninstall_component(null, H) H.forceMove(newloc) @@ -288,7 +301,7 @@ idle_threads.Remove(P) handle_power() // Handles all computer power interaction - check_update_ui_need() + //check_update_ui_need() // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" /obj/item/modular_computer/proc/get_header_data() @@ -336,7 +349,7 @@ data["PC_programheaders"] = program_headers - data["PC_stationtime"] = stationtime2text() + data["PC_stationtime"] = worldtime2text() data["PC_hasheader"] = 1 data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen return data @@ -401,7 +414,8 @@ idle_threads.Add(active_program) active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs - nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) +// nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) + active_program = null update_icon() if(user && istype(user)) @@ -418,7 +432,7 @@ return P.kill_program(1) - update_uis() +// update_uis() user << "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed." if( href_list["PC_runprogram"] ) @@ -458,7 +472,8 @@ update_icon() return 1 if(.) - update_uis() + return +// update_uis() // Used in following function to reduce copypaste /obj/item/modular_computer/proc/power_failure(var/malfunction = 0) @@ -500,10 +515,11 @@ if(card_slot.stored_card) user << "You try to insert \the [I] into \the [src], but it's ID card slot is occupied." return - user.drop_from_inventory(I) + if(!user.drop_item(I)) + return card_slot.stored_card = I I.forceMove(src) - update_uis() +// update_uis() user << "You insert \the [I] into \the [src]." return if(istype(W, /obj/item/weapon/paper)) @@ -622,7 +638,8 @@ if(found) user << "You install \the [H] into \the [src]" H.holder2 = src -// user.drop_from_inventory(H) + if(!user.drop_item(H)) + return H.forceMove(src) // Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware. @@ -699,6 +716,8 @@ all_components.Add(processor_unit) return all_components +/* + /obj/item/modular_computer/proc/update_uis() if(active_program) //Should we update program ui or computer ui? nanomanager.update_uis(active_program) @@ -741,6 +760,9 @@ if(ui_update_needed) update_uis() +*/ + + /obj/item/modular_computer/proc/take_damage(var/amount, var/component_probability, var/damage_casing = 1, var/randomize = 1) if(randomize) // 75%-125%, rand() works with integers, apparently. diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index eca01472280..b88aa9a7a9a 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -16,8 +16,8 @@ machinery_computer.cpu = null machinery_computer = null -/obj/item/modular_computer/processor/nano_host() - return machinery_computer.nano_host() +//obj/item/modular_computer/processor/nano_host() +// return machinery_computer.nano_host() // Due to how processes work, we'd receive two process calls - one from machinery type and one from our own type. // Since we want this to be in-sync with machinery (as it's hidden type for machinery-based computers) we'll ignore @@ -81,10 +81,11 @@ return machinery_computer.powered() // This thing is not meant to be used on it's own, get topic data from our machinery owner. -/obj/item/modular_computer/processor/CanUseTopic(user, state) - if(!machinery_computer) - return 0 - return machinery_computer.CanUseTopic(user, state) +//obj/item/modular_computer/processor/canUseTopic(user, state) +// if(!machinery_computer) +// return 0 + +// return machinery_computer.canUseTopic(user, state) /obj/item/modular_computer/processor/shutdown_computer() if(!machinery_computer) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 6363e848789..155e121c00b 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -21,6 +21,8 @@ /obj/machinery/modular_computer/console/preset/proc/install_programs() return +/* + // ===== ENGINEERING CONSOLE ===== /obj/machinery/modular_computer/console/preset/engineering console_department = "Engineering" @@ -89,3 +91,4 @@ cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) cpu.hard_drive.store_file(new/datum/computer_file/program/newsbrowser()) +*/ \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 92c8fe5f2bb..72e9f056e69 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -34,12 +34,13 @@ var/list/global_modular_computers = list() var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things. -/obj/machinery/modular_computer/attack_ghost(var/mob/observer/ghost/user) +/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user) if(cpu) cpu.attack_ghost(user) -/obj/machinery/modular_computer/emag_act(var/remaining_charges, var/mob/user) - return cpu ? cpu.emag_act(remaining_charges, user) : NO_EMAG_ACT +/obj/machinery/modular_computer/emag_act(remaining_charges, mob/user) +// return cpu ? cpu.emag_act(remaining_charges, user) : NO_EMAG_ACT + return 1 /obj/machinery/modular_computer/update_icon() icon_state = icon_state_unpowered @@ -48,9 +49,9 @@ var/list/global_modular_computers = list() if(!cpu || !cpu.enabled) if (!(stat & NOPOWER) || battery_powered) overlays.Add(screen_icon_screensaver) - set_light(0) +// set_light(0) return - set_light(light_strength) +// set_light(light_strength) if(cpu.active_program) overlays.Add(cpu.active_program.program_icon_state ? cpu.active_program.program_icon_state : screen_icon_state_menu) else diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 14cc1614ccb..92acae82ec1 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -29,8 +29,8 @@ computer = null . = ..() -/datum/computer_file/program/nano_host() - return computer.nano_host() +//datum/computer_file/program/nano_host() +// return computer.nano_host() /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() @@ -79,7 +79,8 @@ access_to_check = required_access if(!access_to_check) // No required_access, allow it. return 1 - + return 1 +/* var/obj/item/weapon/card/id/I = user.GetIdCard() if(!I) if(loud) @@ -90,7 +91,7 @@ return 1 else if(loud) user << "\The [computer] flashes an \"Access Denied\" warning." - +*/ // This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones // always include the device here in this proc. This proc basically relays the request to whatever is running the program. /datum/computer_file/program/proc/get_header_data() diff --git a/code/modules/modular_computers/file_system/programs/_program.dm b/code/modules/modular_computers/file_system/programs/_program.dm index 5ebfad06eb3..0039b8f5976 100644 --- a/code/modules/modular_computers/file_system/programs/_program.dm +++ b/code/modules/modular_computers/file_system/programs/_program.dm @@ -1,3 +1,5 @@ +/* + /obj/machinery/modular_computer/initial_data() return cpu ? cpu.get_header_data() : ..() @@ -10,6 +12,8 @@ /obj/item/modular_computer/update_layout() return TRUE +*/ + /datum/nano_module/program // available_to_ai = FALSE var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null. diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index d764c13a9d4..8e494e6c310 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -22,6 +22,15 @@ //obj/machinery/vr_sleeper/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) /datum/computer_file/program/computerconfig/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) + + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) + ui = new(user, src, ui_key, "laptop_configuration", "NTOS Configuration Utility", 575, 700, state = state) +// ui.auto_update_layout = 1 +// ui.set_initial_data(data) + ui.open() + +/datum/computer_file/program/computerconfig/ui_data(mob/user) if(program) movable = program.computer if(!istype(movable)) @@ -57,9 +66,4 @@ ))) data["hardware"] = all_entries - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "laptop_configuration.tmpl", "NTOS Configuration Utility", 575, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() \ No newline at end of file + return data \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm index 5e65c565f59..4e525cac247 100644 --- a/code/modules/modular_computers/hardware/hardware.dm +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -85,5 +85,5 @@ // Damages the component. Contains necessary checks. Negative damage "heals" the component. /obj/item/weapon/computer_hardware/proc/take_damage(var/amount) damage += round(amount) // We want nice rounded numbers here. - damage = between(0, damage, max_damage) // Clamp the value. + damage = max(0, min(damage, max_damage)) // Clamp the value. diff --git a/tgstation.dme b/tgstation.dme index 3183a2c504e..e2013aacb3e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1519,6 +1519,7 @@ #include "code\modules\modular_computers\computers\item\processor.dm" #include "code\modules\modular_computers\computers\item\tablet.dm" #include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" #include "code\modules\modular_computers\computers\machinery\modular_computer.dm" #include "code\modules\modular_computers\computers\machinery\modular_console.dm" #include "code\modules\modular_computers\computers\machinery\modular_laptop.dm" diff --git a/tgui/src/interfaces/computer_main.ract b/tgui/src/interfaces/computer_main.ract index cc9605ba993..9affb5f6053 100644 --- a/tgui/src/interfaces/computer_main.ract +++ b/tgui/src/interfaces/computer_main.ract @@ -23,5 +23,6 @@ {{! Taskbar}} {{{getTaskbarContents()}}} + butt
    \ No newline at end of file diff --git a/tgui/src/interfaces/ntnet_relay.ract b/tgui/src/interfaces/nt_relay.ract similarity index 95% rename from tgui/src/interfaces/ntnet_relay.ract rename to tgui/src/interfaces/nt_relay.ract index 18dfc3c016a..592d235164e 100644 --- a/tgui/src/interfaces/ntnet_relay.ract +++ b/tgui/src/interfaces/nt_relay.ract @@ -1,6 +1,4 @@ - - - + {{#if data.dos_crashed}}

    NETWORK BUFFERS OVERLOADED

    Overload Recovery Mode

    From 83e5d9844084dbfe23b88f6285a26887fc1100dc Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Wed, 3 Aug 2016 16:52:59 -0700 Subject: [PATCH 05/21] Yay tgui compiles. sorta ish --- tgui/assets/tgui.js | 26 ++++---- tgui/src/interfaces/computer_main.ract | 18 +++--- tgui/src/interfaces/ntnet_downloader.ract | 79 +++++++++++++++++++++++ 3 files changed, 101 insertions(+), 22 deletions(-) create mode 100644 tgui/src/interfaces/ntnet_downloader.ract diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 68bcdc106e0..e92bfdaba3f 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,13 +1,13 @@ -require=function t(e,n,r){function a(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[o]={exports:{}};e[o][0].call(p.exports,function(t){var n=e[o][1][t];return a(n?n:t)},p,p.exports,t,e,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?c[2]:void 0,l=Math.min((void 0===p?o:a(p,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),a=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=i(e.length),o=arguments,s=o.length,u=a(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,p=void 0===c?n:a(c,n);p>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),a=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),p=i(o,c);if(t&&n!=n){for(;c>p;)if(s=u[p++],s!=s)return!0}else for(;c>p;p++)if((t||p in u)&&u[p]===n)return t||p;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),a=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,p=6==t,l=5==t||p;return function(f,d,h){for(var m,v,g=i(f),b=a(g),y=r(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(c)return!1;return p?-1:u||c?c:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),a=t(36),i=t(83)("species");e.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),a=t(83)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[a])?n:i?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),a=t(31),i=t(60),o=t(17),s=t(69),u=t(18),c=t(27),p=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";a(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,a){var p=t(function(t,i){s(t,p,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&c(i,n,t[a],t)});return i(p.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var r=n.n,a=n.p;delete e._i[n.i],n.r=!0,a&&(a.n=r),r&&(r.p=a),e._f==n&&(e._f=r),e._l==n&&(e._l=a),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&r.setDesc(p.prototype,"size",{get:function(){return u(this[b])}}),p},def:function(t,e,n){var r,a,i=_(t,e);return i?i.v=n:(t._l=i={i:a=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[b]++,"F"!==a&&(t._i[a]=i)),t},getEntry:_,setStrong:function(t,e,n){p(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),a=t(10);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),a=t(60),i=t(4),o=t(38),s=t(69),u=t(27),c=t(8),p=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var i=t(function(t,a){s(t,i,e),t._i=m++,t._l=void 0,void 0!=a&&u(a,n,t[r],t)});return a(i.prototype,{"delete":function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(p(e,l)||r(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),a=t(22),i=t(61),o=t(60),s=t(27),u=t(69),c=t(38),p=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!p(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=p(function(){k.has(1)}),O=l(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,a(a.G+a.W+a.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),a=t(29).document,i=r(a)&&r(a.createElement);e.exports=function(t){return i?a.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var a,i=n(t),o=r.isEnum,s=0;i.length>s;)o.call(t,a=i[s++])&&e.push(a);return e}},{46:46}],22:[function(t,e,n){var r=t(29),a=t(16),i=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var p,l,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?a:a[e]||(a[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(p in n)l=!h&&y&&p in y,f=(l?y:n)[p],d=b&&l?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,p,f),x[p]!=f&&i(x,p,d),g&&_[p]!=f&&(_[p]=f)};r.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(a){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),a=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(a(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),a=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var p,l,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(p=s(t.length);p>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)a(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),a=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),a=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),a=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||i[a]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),a=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&a(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),a=t(11),i=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==a(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&r(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),a=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:a(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),a=t(22),i=t(61),o=t(31),s=t(30),u=t(45),c=t(41),p=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){c(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=y==v,C=!1,A=t.prototype,P=A[f]||A[h]||y&&A[y],T=P||E(y);if(P){var j=l(T.call(new t));p(j,S,!0),!r&&s(A,h)&&o(j,f,g),O&&P.name!==v&&(C=!0,T=function(){return P.call(this)})}if(r&&!_||!d&&!C&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:O?T:E(v),keys:x?T:E(m),entries:O?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else a(a.P+a.F*(d||C),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),a=!1;try{var i=[7][r]();i["return"]=function(){a=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!a)return!1;var n=!1;try{var i=[7],o=i[r]();o.next=function(){n=!0},i[r]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),a=t(78);e.exports=function(t,e){for(var n,i=a(t),o=r.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,a,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,p=o.Promise,l="process"==t(11)(c),f=function(){var t,e,n;for(l&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;a=void 0,t&&t.enter()};if(l)i=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=p&&p.resolve?function(){p.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&c.domain};a&&(a.next=e),r||(r=e,i()),a=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),a=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=a})?function(t,e){for(var n=a(t),o=arguments,s=o.length,u=1,c=r.getKeys,p=r.getSymbols,l=r.isEnum;s>u;)for(var f,d=i(o[u++]),h=p?c(d).concat(p(d)):c(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),a=t(16),i=t(24);e.exports=function(t,e){var n=(a.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),a=t(78),i=r.isEnum;e.exports=function(t){return function(e){for(var n,o=a(e),s=r.getKeys(o),u=s.length,c=0,p=[];u>c;)i.call(o,n=s[c++])&&p.push(t?[n,o[n]]:o[n]);return p}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),a=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=r.getNames(a(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),a=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,i=this,o=arguments,c=o.length,p=0,l=0;if(!u&&!c)return a(t,n,i);if(r=n.slice(),u)for(;e>p;p++)r[p]===s&&(r[p]=o[l++]);for(;c>l;)r.push(o[l++]);return a(t,r,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),a=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||a(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||a(n,"name",e)),t===r?t[e]=n:(o||delete t[e],a(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,a=t(38),i=t(4),o=function(t,e){if(i(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),a=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];i&&e&&!e[o]&&a.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,a=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),a="__core-js_shared__",i=r[a]||(r[a]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),a=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[i])?e:a(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),a=t(18);e.exports=function(t){return function(e,n){var i,o,s=a(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),a=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return a(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),a=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,c=void 0===n?" ":n+"",p=r(e);if(u>=p)return s;""==c&&(c=" ");var l=p-u,f=a.call(c,Math.ceil(l/c.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),a=t(18);e.exports=function(t){var e=a(this)+"",n="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),a=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),p=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=a(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(p,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var r,a,i,o=t(17),s=t(33),u=t(32),c=t(20),p=t(29),l=p.process,f=p.setImmediate,d=p.clearImmediate,h=p.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?r=function(t){l.nextTick(o(b,t,1))}:h?(a=new h,i=a.port2,a.port1.onmessage=y,r=o(i.postMessage,i,1)):p.addEventListener&&"function"==typeof postMessage&&!p.importScripts?(r=function(t){p.postMessage(t+"","*")},p.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),a=Math.max,i=Math.min;e.exports=function(t,e){return t=r(t),0>t?a(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,a=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?a:r)(t)}},{}],78:[function(t,e,n){var r=t(34),a=t(18);e.exports=function(t){return r(a(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),a=Math.min;e.exports=function(t){return t>0?a(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,a;if(e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;if("function"==typeof(n=t.valueOf)&&!r(a=n.call(t)))return a;if(!e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,a=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+a).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),a=t(82),i=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||a)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),a=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[a]||t["@@iterator"]||i[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,a=t(46),i=t(22),o=t(19),s=t(59),u=t(32),c=t(20),p=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,C=Array.prototype,A=C.slice,P=C.join,T=a.setDesc,j=a.getDesc,M=a.setDescs,L={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),a.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},a.getDesc=function(t,e){if(r)try{return j(t,e)}catch(n){}return p(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},a.setDescs=M=function(t,e){h(t);for(var n,r=a.getKeys(e),i=r.length,o=0;i>o;)a.setDesc(t,n=r[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:a.getDesc,defineProperty:a.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" - {{! Active program}} - <{{{getActiveProgramTag(data.active_program_template)}}}/> - - {{! Taskbar}} - {{{getTaskbarContents()}}} + {{! Active program}} + {{{getActiveProgramTag(data.active_program_template)}}} + + {{! Taskbar}} + {{{getTaskbarContents()}}} butt - + \ No newline at end of file diff --git a/tgui/src/interfaces/ntnet_downloader.ract b/tgui/src/interfaces/ntnet_downloader.ract new file mode 100644 index 00000000000..b1cd751a036 --- /dev/null +++ b/tgui/src/interfaces/ntnet_downloader.ract @@ -0,0 +1,79 @@ + + + Welcome to software download utility. Please select which software you wish to download.
    + {{#if data.error}} + + + {{data.error}} + + + + RESET + + + + {{else data.downloadname}} + + Please wait... + + {{data.downloadname}} + + + {{data.downloaddesc}} + + + {{data.downloadcompletion}}GQ / {{data.downloadsize}}GQ + + + {{data.downloadspeed}} GQ/s + + + {{Math.round(adata.downloadcompletion)}}/{{adata.downloadsize}} + + + {{else}} + + + {{Math.round(adata.disk_used)}}GQ/{{adata.disk_size}}GQ + + {{#each data.downloadable_programs}} + + {{value.filename}} ({{size}} GQ) + + + {{filedesc}} + + + {{fileinfo}} + + + + DOWNLOAD + + + {{/each}} + + {{#if data.hackedavailable}} + + Please note that NanoTrasen does not recommend download of software from non-official servers. + {{#each data.hacked_programs}} + + {{filename}} ({{size}} GQ) + + + {{filedesc}} + + + {{fileinfo}} + + + + DOWNLOAD + + + {{/each}} + + {{/if}} + {{/if}} +


    NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 +
    \ No newline at end of file From 5d9bc548a27e080d624a07f829d311a4ead11ac9 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Fri, 5 Aug 2016 01:00:51 -0700 Subject: [PATCH 06/21] More WIP Majority of base systems done. --- .../computers/item/modular_computer.dm | 203 +++++++++--------- .../computers/item/tablet.dm | 3 +- .../modular_computers/file_system/program.dm | 33 ++- .../file_system/programs/antagonist/dos.dm | 94 ++++---- .../file_system/programs/configurator.dm | 36 ++-- .../file_system/programs/file_browser.dm | 2 +- .../file_system/programs/ntdownloader.dm | 84 ++++---- .../file_system/programs/ntmonitor.dm | 125 +++++------ .../modular_computers/hardware/hard_drive.dm | 2 +- tgstation.dme | 3 + tgui/assets/tgui.js | 25 +-- tgui/src/interfaces/computer_main.ract | 72 ++++--- tgui/src/interfaces/laptop_configuration.ract | 4 +- tgui/src/interfaces/ntnet_dos.ract | 27 +++ tgui/src/interfaces/ntnet_downloader.ract | 128 +++++++---- tgui/src/interfaces/ntnet_monitor.ract | 126 +++++++++++ 16 files changed, 609 insertions(+), 358 deletions(-) create mode 100644 tgui/src/interfaces/ntnet_dos.ract create mode 100644 tgui/src/interfaces/ntnet_monitor.ract diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index 54e7e7e5b2c..592f70ade32 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -7,7 +7,7 @@ var/enabled = 0 // Whether the computer is turned on. var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. - var/datum/computer_file/program/active_program = new /datum/computer_file/program/computerconfig // A currently active program running on the computer. + var/datum/computer_file/program/active_program = null // A currently active program running on the computer. var/hardware_flag = 0 // A flag that describes this device type var/last_power_usage = 0 var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged @@ -46,6 +46,7 @@ var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + var/activetemplate = "computer_main" // Eject ID card from computer, if it has ID slot with card inside. @@ -171,7 +172,7 @@ return 0 // Operates NanoUI -/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = contained_state) +/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) // if(!screen_on || !enabled) // if(ui) // ui.close() @@ -180,50 +181,50 @@ // if(ui) // ui.close() // return 0 -/* + // If we have an active program switch to it now. if(active_program) if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now. ui.close() active_program.ui_interact(user) return -*/ + // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it. // This screen simply lists available programs and user may select them. if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") - // return // No HDD, No HDD files list or no stored files. Something is very broken. + return // No HDD, No HDD files list or no stored files. Something is very broken. - - -// data["programs"] = programs ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) // ui = new(user, src, ui_key, "laptop_mainscreen", "NTOS Main Menu", 400, 500) - ui = new(user, src, ui_key, "computer_main", "Main menu", 475, 340, master_ui, state) + ui = new(user, src, ui_key, activetemplate, "Main menu", 400, 500, master_ui, state) // ui.set_initial_data(data) ui.open() ui.set_autoupdate(state = 1) /obj/item/modular_computer/ui_data(mob/user) - var/list/data = list() - data["active_program_template"] = active_program +// var/list/data = list() +// data["active_program_template"] = active_program + +// return data - return data -/* var/list/data = get_header_data() - - var/list/programs = list() + data["programs"] = list() +// var/list/programs = list() for(var/datum/computer_file/program/P in hard_drive.stored_files) - var/list/program = list() - program["name"] = P.filename - program["desc"] = P.filedesc - if(P in idle_threads) - program["running"] = 1 - programs.Add(list(program)) -*/ + data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc)) + +// var/list/program = list() + +// program["name"] = P.filename +// program["desc"] = P.filedesc +// if(P in idle_threads) +// program["running"] = 1 +// programs.Add(list(program)) + return data // On-click handling. Turns on the computer if it's off and opens the GUI. @@ -388,92 +389,80 @@ return // Handles user's GUI input -/obj/item/modular_computer/Topic(href, href_list) +/obj/item/modular_computer/ui_act(action, params) if(..()) - return 1 - if( href_list["PC_exit"] ) - kill_program() - return 1 - if( href_list["PC_enable_component"] ) - var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(href_list["PC_enable_component"]) - if(H && istype(H) && !H.enabled) - H.enabled = 1 - . = 1 - if( href_list["PC_disable_component"] ) - var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(href_list["PC_disable_component"]) - if(H && istype(H) && H.enabled) - H.enabled = 0 - . = 1 - if( href_list["PC_shutdown"] ) - shutdown_computer() - return 1 - if( href_list["PC_minimize"] ) - var/mob/user = usr - if(!active_program || !processor_unit) - return - - idle_threads.Add(active_program) - active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs -// nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) - - active_program = null - update_icon() - if(user && istype(user)) - ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. - - if( href_list["PC_killprogram"] ) - var/prog = href_list["PC_killprogram"] - var/datum/computer_file/program/P = null - var/mob/user = usr - if(hard_drive) - P = hard_drive.find_file_by_name(prog) - - if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED) - return - - P.kill_program(1) -// update_uis() - user << "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed." - - if( href_list["PC_runprogram"] ) - var/prog = href_list["PC_runprogram"] - var/datum/computer_file/program/P = null - var/mob/user = usr - if(hard_drive) - P = hard_drive.find_file_by_name(prog) - - if(!P || !istype(P)) // Program not found or it's not executable program. - user << "\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning." - return - - P.computer = src - - if(!P.is_supported_by_hardware(hardware_flag, 1, user)) - return - - // The program is already running. Resume it. - if(P in idle_threads) - P.program_state = PROGRAM_STATE_ACTIVE - active_program = P - idle_threads.Remove(P) - update_icon() - return - - if(idle_threads.len >= processor_unit.max_idle_programs+1) - user << "\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error" - return - - if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. - user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." - return - - if(P.run_program(user)) - active_program = P - update_icon() - return 1 - if(.) return -// update_uis() + switch(action) + if("PC_exit") + kill_program() + return 1 + if("PC_shutdown") + shutdown_computer() + return 1 + if("PC_minimize") + var/mob/user = usr + if(!active_program || !processor_unit) + return + + idle_threads.Add(active_program) + active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs + + active_program = null + update_icon() + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + + if("PC_killprogram") + var/prog = params["name"] + var/datum/computer_file/program/P = null + var/mob/user = usr + if(hard_drive) + P = hard_drive.find_file_by_name(prog) + + if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED) + return + + P.kill_program(1) + user << "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed." + + if("PC_runprogram") + var/prog = params["name"] + var/datum/computer_file/program/P = null + var/mob/user = usr + if(hard_drive) + P = hard_drive.find_file_by_name(prog) + + if(!P || !istype(P)) // Program not found or it's not executable program. + user << "\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning." + return + + P.computer = src + + if(!P.is_supported_by_hardware(hardware_flag, 1, user)) + return + + // The program is already running. Resume it. + if(P in idle_threads) + P.program_state = PROGRAM_STATE_ACTIVE + active_program = P + idle_threads.Remove(P) + update_icon() + return + + if(idle_threads.len >= processor_unit.max_idle_programs+1) + user << "\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error" + return + + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. + user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." + return + + if(P.run_program(user)) + active_program = P + update_icon() + return 1 + else + return // Used in following function to reduce copypaste /obj/item/modular_computer/proc/power_failure(var/malfunction = 0) @@ -681,6 +670,8 @@ // Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null /obj/item/modular_computer/proc/find_hardware_by_name(var/name) + world <<"ran" + world << name if(portable_drive && (portable_drive.name == name)) return portable_drive if(hard_drive && (hard_drive.name == name)) diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 4848a247879..649e20e57ea 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -7,4 +7,5 @@ hardware_flag = PROGRAM_TABLET max_hardware_size = 1 w_class = 2 - light_strength = 2 // Same as PDAs \ No newline at end of file + light_strength = 2 // Same as PDAs + var/use_power = 1 \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 92acae82ec1..975f3ee2f49 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -125,12 +125,11 @@ // It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. /datum/computer_file/program/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. + if(!ui) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(ui) ui.close() return computer.ui_interact(user) - if(istype(NM)) - NM.ui_interact(user, ui_key, null, force_open) - return 0 return 1 @@ -139,8 +138,32 @@ // Calls beginning with "PRG_" are reserved for programs handling. // Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) // ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. -/datum/computer_file/program/Topic(href, href_list) +/datum/computer_file/program/ui_act(action,params) if(..()) return 1 if(computer) - return computer.Topic(href, href_list) + switch(action) + if("PC_exit") + computer.kill_program() + return 1 + if("PC_shutdown") + computer.shutdown_computer() + return 1 + if("PC_minimize") + var/mob/user = usr + if(!computer.active_program || !computer.processor_unit) + return + + computer.idle_threads.Add(computer.active_program) + program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs + + computer.active_program = null + computer.update_icon() + if(user && istype(user)) + computer.ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + + + + + //if(computer) + // return computer.ui_act(action,params) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index b38a688c52d..4d82967d342 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -7,7 +7,6 @@ requires_ntnet = 1 available_on_ntnet = 0 available_on_syndinet = 1 - nanomodule_path = /datum/nano_module/program/computer_dos/ var/obj/machinery/ntnet_relay/target = null var/dos_speed = 0 var/error = "" @@ -36,28 +35,61 @@ ..(forced) -/datum/nano_module/program/computer_dos - name = "DoS Traffic Generator" -/datum/nano_module/program/computer_dos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) +/datum/computer_file/program/ntnet_dos/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) + + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_dos", "DoS Traffic Generator", 400, 250, state = state) + ui.set_style("syndicate") + ui.set_autoupdate(state = 1) + ui.open() + + + +/datum/computer_file/program/ntnet_dos/ui_act(action, params) + if(..()) + return 1 + switch(action) + if("PRG_target_relay") + for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) + if("[R.uid]" == params) + target = R + return 1 + if("PRG_reset") + if(target) + target.dos_sources.Remove(src) + target = null + executed = 0 + error = "" + return 1 + if("PRG_execute") + if(target) + executed = 1 + target.dos_sources.Add(src) + if(ntnet_global.intrusion_detection_enabled) + ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]") + ntnet_global.intrusion_detection_alarm = 1 + return 1 + +/datum/computer_file/program/ntnet_dos/ui_data(mob/user) if(!ntnet_global) return - var/datum/computer_file/program/ntnet_dos/PRG = program - var/list/data = list() - if(!istype(PRG)) - return - data = PRG.get_header_data() - if(PRG.error) - data["error"] = PRG.error - else if(PRG.target && PRG.executed) + var/list/data = list() + + data = get_header_data() + + if(error) + data["error"] = error + else if(target && executed) data["target"] = 1 - data["speed"] = PRG.dos_speed + data["speed"] = dos_speed // This is mostly visual, generate some strings of 1s and 0s // Probability of 1 is equal of completion percentage of DoS attack on this relay. // Combined with UI updates this adds quite nice effect to the UI - var/percentage = PRG.target.dos_overload * 100 / PRG.target.dos_capacity + var/percentage = target.dos_overload * 100 / target.dos_capacity var/list/strings[0] for(var/j, j<10, j++) var/string = "" @@ -70,36 +102,6 @@ for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) relays.Add(R.uid) data["relays"] = relays - data["focus"] = PRG.target ? PRG.target.uid : null + data["focus"] = target ? target.uid : null - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "ntnet_dos.tmpl", "DoS Traffic Generator", 400, 250, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/datum/computer_file/program/ntnet_dos/Topic(href, href_list) - if(..()) - return 1 - if(href_list["PRG_target_relay"]) - for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) - if("[R.uid]" == href_list["PRG_target_relay"]) - target = R - return 1 - if(href_list["PRG_reset"]) - if(target) - target.dos_sources.Remove(src) - target = null - executed = 0 - error = "" - return 1 - if(href_list["PRG_execute"]) - if(target) - executed = 1 - target.dos_sources.Add(src) - if(ntnet_global.intrusion_detection_enabled) - ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]") - ntnet_global.intrusion_detection_alarm = 1 - return 1 + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index 8e494e6c310..f72546c0385 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -12,27 +12,22 @@ size = 4 available_on_ntnet = 0 requires_ntnet = 0 -// nanomodule_path = /datum/nano_module/program/computer_configurator/ - -//datum/nano_module/program/computer_configurator -// name = "NTOS Computer Configuration Tool" var/obj/item/modular_computer/movable = null //obj/machinery/vr_sleeper/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) -/datum/computer_file/program/computerconfig/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) +/datum/computer_file/program/computerconfig/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) ui = new(user, src, ui_key, "laptop_configuration", "NTOS Configuration Utility", 575, 700, state = state) -// ui.auto_update_layout = 1 -// ui.set_initial_data(data) ui.open() + ui.set_autoupdate(state = 1) /datum/computer_file/program/computerconfig/ui_data(mob/user) - if(program) - movable = program.computer + + movable = computer if(!istype(movable)) movable = null @@ -42,8 +37,8 @@ var/list/data = list() - if(program) - data = program.get_header_data() + + data = program.get_header_data() var/list/hardware = movable.get_all_components() @@ -55,6 +50,9 @@ data["battery_rating"] = movable.battery_module.battery.maxcharge data["battery_percent"] = round(movable.battery_module.battery.percent()) + if(movable.battery_module) + data["battery"] = list("max" = movable.battery_module.battery.maxcharge, "charge" = round(movable.battery_module.battery.charge)) + var/list/all_entries[0] for(var/obj/item/weapon/computer_hardware/H in hardware) all_entries.Add(list(list( @@ -66,4 +64,18 @@ ))) data["hardware"] = all_entries - return data \ No newline at end of file + return data + + +/datum/computer_file/program/computerconfig/ui_act(action,params) + world << "test" + if(..()) + return + world << action + world <2?c[2]:void 0,l=Math.min((void 0===p?o:a(p,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),a=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=i(e.length),o=arguments,s=o.length,u=a(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,p=void 0===c?n:a(c,n);p>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),a=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),p=i(o,c);if(t&&n!=n){for(;c>p;)if(s=u[p++],s!=s)return!0}else for(;c>p;p++)if((t||p in u)&&u[p]===n)return t||p;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),a=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,p=6==t,l=5==t||p;return function(f,d,h){for(var m,v,g=i(f),b=a(g),y=r(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(c)return!1;return p?-1:u||c?c:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),a=t(36),i=t(83)("species");e.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),a=t(83)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[a])?n:i?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),a=t(31),i=t(60),o=t(17),s=t(69),u=t(18),c=t(27),p=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";a(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,a){var p=t(function(t,i){s(t,p,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&c(i,n,t[a],t)});return i(p.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var r=n.n,a=n.p;delete e._i[n.i],n.r=!0,a&&(a.n=r),r&&(r.p=a),e._f==n&&(e._f=r),e._l==n&&(e._l=a),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&r.setDesc(p.prototype,"size",{get:function(){return u(this[b])}}),p},def:function(t,e,n){var r,a,i=_(t,e);return i?i.v=n:(t._l=i={i:a=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[b]++,"F"!==a&&(t._i[a]=i)),t},getEntry:_,setStrong:function(t,e,n){p(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),a=t(10);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),a=t(60),i=t(4),o=t(38),s=t(69),u=t(27),c=t(8),p=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var i=t(function(t,a){s(t,i,e),t._i=m++,t._l=void 0,void 0!=a&&u(a,n,t[r],t)});return a(i.prototype,{"delete":function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(p(e,l)||r(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),a=t(22),i=t(61),o=t(60),s=t(27),u=t(69),c=t(38),p=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!p(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=p(function(){k.has(1)}),O=l(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,a(a.G+a.W+a.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),a=t(29).document,i=r(a)&&r(a.createElement);e.exports=function(t){return i?a.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var a,i=n(t),o=r.isEnum,s=0;i.length>s;)o.call(t,a=i[s++])&&e.push(a);return e}},{46:46}],22:[function(t,e,n){var r=t(29),a=t(16),i=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var p,l,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?a:a[e]||(a[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(p in n)l=!h&&y&&p in y,f=(l?y:n)[p],d=b&&l?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,p,f),x[p]!=f&&i(x,p,d),g&&_[p]!=f&&(_[p]=f)};r.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(a){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),a=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(a(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),a=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var p,l,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(p=s(t.length);p>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)a(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),a=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),a=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),a=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||i[a]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),a=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&a(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),a=t(11),i=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==a(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&r(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),a=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:a(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),a=t(22),i=t(61),o=t(31),s=t(30),u=t(45),c=t(41),p=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){c(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=y==v,C=!1,A=t.prototype,P=A[f]||A[h]||y&&A[y],T=P||E(y);if(P){var j=l(T.call(new t));p(j,S,!0),!r&&s(A,h)&&o(j,f,g),O&&P.name!==v&&(C=!0,T=function(){return P.call(this)})}if(r&&!_||!d&&!C&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:O?T:E(v),keys:x?T:E(m),entries:O?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else a(a.P+a.F*(d||C),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),a=!1;try{var i=[7][r]();i["return"]=function(){a=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!a)return!1;var n=!1;try{var i=[7],o=i[r]();o.next=function(){return{done:n=!0}},i[r]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),a=t(78);e.exports=function(t,e){for(var n,i=a(t),o=r.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,a,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,p=o.Promise,l="process"==t(11)(c),f=function(){var t,e,n;for(l&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;a=void 0,t&&t.enter()};if(l)i=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=p&&p.resolve?function(){p.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&c.domain};a&&(a.next=e),r||(r=e,i()),a=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),a=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=a})?function(t,e){for(var n=a(t),o=arguments,s=o.length,u=1,c=r.getKeys,p=r.getSymbols,l=r.isEnum;s>u;)for(var f,d=i(o[u++]),h=p?c(d).concat(p(d)):c(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),a=t(16),i=t(24);e.exports=function(t,e){var n=(a.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),a=t(78),i=r.isEnum;e.exports=function(t){return function(e){for(var n,o=a(e),s=r.getKeys(o),u=s.length,c=0,p=[];u>c;)i.call(o,n=s[c++])&&p.push(t?[n,o[n]]:o[n]);return p}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),a=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=r.getNames(a(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),a=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,i=this,o=arguments,c=o.length,p=0,l=0;if(!u&&!c)return a(t,n,i);if(r=n.slice(),u)for(;e>p;p++)r[p]===s&&(r[p]=o[l++]);for(;c>l;)r.push(o[l++]);return a(t,r,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),a=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||a(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||a(n,"name",e)),t===r?t[e]=n:(o||delete t[e],a(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,a=t(38),i=t(4),o=function(t,e){if(i(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),a=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];i&&e&&!e[o]&&a.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,a=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),a="__core-js_shared__",i=r[a]||(r[a]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),a=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[i])?e:a(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),a=t(18);e.exports=function(t){return function(e,n){var i,o,s=a(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),a=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return a(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),a=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,c=void 0===n?" ":n+"",p=r(e);if(u>=p)return s;""==c&&(c=" ");var l=p-u,f=a.call(c,Math.ceil(l/c.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),a=t(18);e.exports=function(t){var e=a(this)+"",n="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),a=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),p=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=a(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(p,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var r,a,i,o=t(17),s=t(33),u=t(32),c=t(20),p=t(29),l=p.process,f=p.setImmediate,d=p.clearImmediate,h=p.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?r=function(t){l.nextTick(o(b,t,1))}:h?(a=new h,i=a.port2,a.port1.onmessage=y,r=o(i.postMessage,i,1)):p.addEventListener&&"function"==typeof postMessage&&!p.importScripts?(r=function(t){p.postMessage(t+"","*")},p.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),a=Math.max,i=Math.min;e.exports=function(t,e){return t=r(t),0>t?a(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,a=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?a:r)(t)}},{}],78:[function(t,e,n){var r=t(34),a=t(18);e.exports=function(t){return r(a(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),a=Math.min;e.exports=function(t){return t>0?a(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,a;if(e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;if("function"==typeof(n=t.valueOf)&&!r(a=n.call(t)))return a;if(!e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,a=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+a).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),a=t(82),i=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||a)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),a=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[a]||t["@@iterator"]||i[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,a=t(46),i=t(22),o=t(19),s=t(59),u=t(32),c=t(20),p=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,C=Array.prototype,A=C.slice,P=C.join,T=a.setDesc,j=a.getDesc,M=a.setDescs,L={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),a.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},a.getDesc=function(t,e){if(r)try{return j(t,e)}catch(n){}return p(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},a.setDescs=M=function(t,e){h(t);for(var n,r=a.getKeys(e),i=r.length,o=0;i>o;)a.setDesc(t,n=r[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:a.getDesc,defineProperty:a.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" - + - {{! Active program}} - {{{getActiveProgramTag(data.active_program_template)}}} - - {{! Taskbar}} - {{{getTaskbarContents()}}} - butt - + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + No program loaded. Please select program from list below. + + {{#each data.programs}} +
    + {{name}} + + + {{/each}} +
    \ No newline at end of file diff --git a/tgui/src/interfaces/laptop_configuration.ract b/tgui/src/interfaces/laptop_configuration.ract index 18bb98e9539..e505568f3af 100644 --- a/tgui/src/interfaces/laptop_configuration.ract +++ b/tgui/src/interfaces/laptop_configuration.ract @@ -39,7 +39,7 @@ - {{Math.round(adata.disk.used)}}GQ/{{adata.disk.size}}GQ + {{Math.round(adata.disk_used)}}GQ/{{adata.disk_size}}GQ @@ -60,7 +60,7 @@ {{#if !critical}} - {{enabled ? "On" : "Off"}} diff --git a/tgui/src/interfaces/ntnet_dos.ract b/tgui/src/interfaces/ntnet_dos.ract new file mode 100644 index 00000000000..b34ec6c40c1 --- /dev/null +++ b/tgui/src/interfaces/ntnet_dos.ract @@ -0,0 +1,27 @@ + + + + {{#if data.error}} + ##SYSTEM ERROR: {{data.error}}RESET + {{else}} + {{#if data.target}} + ##DoS traffic generator active. Tx: {{data.speed}}GQ/s
    + {{#each data.dos_strings}} + {{value}}
    + {{/each}} + ABORT + {{else}} + ##DoS traffic generator ready. Select target device.
    + {{#if data.focus}} + Targeted device ID: {{data.focus}} + {{else}} + Targeted device ID: None + {{/if}} + EXECUTE
    + Detected devices on network:
    + {{#each data.relays}} + {{value}} + {{/each}} + {{/if}} + {{/if}} +
    diff --git a/tgui/src/interfaces/ntnet_downloader.ract b/tgui/src/interfaces/ntnet_downloader.ract index b1cd751a036..1c7f4a3324c 100644 --- a/tgui/src/interfaces/ntnet_downloader.ract +++ b/tgui/src/interfaces/ntnet_downloader.ract @@ -1,5 +1,42 @@ + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + Welcome to software download utility. Please select which software you wish to download.
    {{#if data.error}} @@ -12,53 +49,37 @@ - {{else data.downloadname}} - - Please wait... - - {{data.downloadname}} - - - {{data.downloaddesc}} - - - {{data.downloadcompletion}}GQ / {{data.downloadsize}}GQ - - - {{data.downloadspeed}} GQ/s - - - {{Math.round(adata.downloadcompletion)}}/{{adata.downloadsize}} - - - {{else}} - - - {{Math.round(adata.disk_used)}}GQ/{{adata.disk_size}}GQ - - {{#each data.downloadable_programs}} + {{else}} + {{#if data.downloadname}} + + Please wait... - {{value.filename}} ({{size}} GQ) + {{data.downloadname}} - - {{filedesc}} - - - {{fileinfo}} + + {{data.downloaddesc}} - - - DOWNLOAD - + + {{data.downloadcompletion}}GQ / {{data.downloadsize}}GQ - {{/each}} - - {{#if data.hackedavailable}} - - Please note that NanoTrasen does not recommend download of software from non-official servers. - {{#each data.hacked_programs}} + + {{data.downloadspeed}} GQ/s + + + {{Math.round(adata.downloadcompletion)}}/{{adata.downloadsize}} + + + {{/if}} + {{/if}} + {{#if !data.downloadname}} + {{#if !data.error}} + + + {{Math.round(adata.disk_used)}}GQ/{{adata.disk_size}}GQ + + {{#each data.downloadable_programs}} - {{filename}} ({{size}} GQ) + {{value.filename}} ({{size}} GQ) {{filedesc}} @@ -70,9 +91,30 @@ DOWNLOAD - + {{/each}} + {{#if data.hackedavailable}} + + Please note that NanoTrasen does not recommend download of software from non-official servers. + {{#each data.hacked_programs}} + + {{filename}} ({{size}} GQ) + + + {{filedesc}} + + + {{fileinfo}} + + + + DOWNLOAD + + + {{/each}} + + {{/if}} {{/if}} {{/if}}


    NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 diff --git a/tgui/src/interfaces/ntnet_monitor.ract b/tgui/src/interfaces/ntnet_monitor.ract new file mode 100644 index 00000000000..4c01db1f73e --- /dev/null +++ b/tgui/src/interfaces/ntnet_monitor.ract @@ -0,0 +1,126 @@ + + + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + + + + {{data.ntnetrelays}} + + {{#if data.ntnetrelays}} + + {{data.ntnetstatus ? "ENABLED" : "DISABLED"}} + + + + + TOGGLE + + +

    + Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again! + {{else}} +

    Wireless coverage unavailable, no relays are connected.

    + {{/if}} +
    + + + + + + + + + + +
    PROTOCOL + STATUS + CONTROL +
    Software Downloads + {{data.config_softwaredownload ? 'ENABLED' : 'DISABLED'}} + TOGGLE +
    Peer to Peer Traffic + {{data.config_peertopeer ? 'ENABLED' : 'DISABLED'}} + TOGGLE +
    Communication Systems + {{data.config_communication ? 'ENABLED' : 'DISABLED'}} + TOGGLE +
    Remote System Control + {{data.config_systemcontrol ? 'ENABLED' : 'DISABLED'}} + TOGGLE +
    +
    + + + + {{#if data.idsalarm}} + +

    NETWORK INCURSION DETECTED

    +
    + An abnormal activity has been detected in the network. Please verify system logs for more information + + {{/if}} + + {{data.idsstatus ? 'ENABLED' : 'DISABLED'}} + + + + {{data.ntnetmaxlogs}} + + + + + +
    RESET IDS +
    TOGGLE IDS +
    SET LOG LIMIT +
    PURGE LOGS +
    + + +
    +
    +
    + {{#each data.ntnetlogs}} + {{value}}
    + {{/each}} +
    +
    +
    +
    + + \ No newline at end of file From 0c9554cd35b306eb03ef0dcbeb93aca1bb732ed6 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Fri, 5 Aug 2016 22:51:53 -0700 Subject: [PATCH 07/21] Base systems pretty much done. Still need to convert the id computer program. --- code/_globalvars/lists/objects.dm | 1 + code/game/area/areas.dm | 13 + .../NTNet/NTNRC/conversation.dm | 4 +- code/modules/modular_computers/NTNet/NTNet.dm | 18 - .../modular_computers/NTNet/NTNet_relay.dm | 10 +- .../modules/modular_computers/_description.dm | 121 ----- .../computers/item/modular_computer.dm | 44 +- .../computers/item/tablet.dm | 3 +- .../computers/machinery/console_presets.dm | 44 +- .../computers/machinery/modular_computer.dm | 6 +- .../file_system/news_article.dm | 29 -- .../modular_computers/file_system/program.dm | 42 +- .../file_system/programs/_engineering.dm | 85 ---- .../file_system/programs/_medical.dm | 10 - .../file_system/programs/_program.dm | 35 -- .../file_system/programs/alarm.dm | 106 +++++ .../file_system/programs/antagonist/dos.dm | 18 +- .../programs/antagonist/revelation.dm | 65 ++- .../file_system/programs/comm.dm | 417 ------------------ .../file_system/programs/configurator.dm | 4 +- .../file_system/programs/file_browser.dm | 301 +++++++------ .../file_system/programs/news_browser.dm | 120 ----- .../file_system/programs/ntdownloader.dm | 2 +- .../file_system/programs/ntmonitor.dm | 15 +- .../file_system/programs/ntnrc_client.dm | 305 +++++++------ .../file_system/programs/nttransfer.dm | 162 ++++--- .../file_system/programs/powermonitor.dm | 88 ++++ .../modular_computers/hardware/hard_drive.dm | 2 +- .../modular_computers/hardware/hardware.dm | 2 + .../hardware/network_card.dm | 7 +- .../modular_computers/laptop_vendor.dm | 296 ------------- tgstation.dme | 8 +- tgui/assets/tgui.js | 27 +- tgui/src/interfaces/computer_main.ract | 71 ++- tgui/src/interfaces/file_manager.ract | 98 ++++ tgui/src/interfaces/laptop_configuration.ract | 35 +- tgui/src/interfaces/ntnet_chat.ract | 103 +++++ tgui/src/interfaces/ntnet_dos.ract | 67 ++- tgui/src/interfaces/ntnet_downloader.ract | 68 ++- tgui/src/interfaces/ntnet_monitor.ract | 10 +- .../{nt_relay.ract => ntnet_relay.ract} | 0 tgui/src/interfaces/ntnet_transfer.ract | 136 ++++++ tgui/src/interfaces/power_monitor_prog.ract | 112 +++++ tgui/src/interfaces/revelation.ract | 60 +++ tgui/src/interfaces/station_alert_prog.ract | 47 ++ 45 files changed, 1431 insertions(+), 1786 deletions(-) delete mode 100644 code/modules/modular_computers/_description.dm delete mode 100644 code/modules/modular_computers/file_system/news_article.dm delete mode 100644 code/modules/modular_computers/file_system/programs/_engineering.dm delete mode 100644 code/modules/modular_computers/file_system/programs/_medical.dm delete mode 100644 code/modules/modular_computers/file_system/programs/_program.dm create mode 100644 code/modules/modular_computers/file_system/programs/alarm.dm delete mode 100644 code/modules/modular_computers/file_system/programs/comm.dm delete mode 100644 code/modules/modular_computers/file_system/programs/news_browser.dm create mode 100644 code/modules/modular_computers/file_system/programs/powermonitor.dm delete mode 100644 code/modules/modular_computers/laptop_vendor.dm create mode 100644 tgui/src/interfaces/file_manager.ract create mode 100644 tgui/src/interfaces/ntnet_chat.ract rename tgui/src/interfaces/{nt_relay.ract => ntnet_relay.ract} (100%) create mode 100644 tgui/src/interfaces/ntnet_transfer.ract create mode 100644 tgui/src/interfaces/power_monitor_prog.ract create mode 100644 tgui/src/interfaces/revelation.ract create mode 100644 tgui/src/interfaces/station_alert_prog.ract diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 8f1775261d5..b5014ec7c91 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -10,6 +10,7 @@ var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacon var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons. var/global/list/nuke_list = list() var/global/list/nuke_tiles = list() //list of all turfs that turn to animated red grids when a nuke is triggered +var/global/list/alarmdisplay = list() //list of all machines or programs that can display station alerts var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 5032ea6ec26..4b82ec57231 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -74,6 +74,11 @@ D.cancelAlarm("Power", src, source) else D.triggerAlarm("Power", src, cameras, source) + for(var/datum/computer_file/program/alarm_monitor/p in alarmdisplay) + if(state == 1) + p.cancelAlarm("Power", src, source) + else + p.triggerAlarm("Power", src, cameras, source) /area/proc/atmosalert(danger_level, obj/source) if(danger_level != atmosalm) @@ -89,6 +94,8 @@ a.triggerAlarm("Atmosphere", src, cameras, source) for(var/mob/living/simple_animal/drone/D in mob_list) D.triggerAlarm("Atmosphere", src, cameras, source) + for(var/datum/computer_file/program/alarm_monitor/p in alarmdisplay) + p.triggerAlarm("Atmosphere", src, cameras, source) else if (src.atmosalm == 2) for(var/mob/living/silicon/aiPlayer in player_list) @@ -97,6 +104,8 @@ a.cancelAlarm("Atmosphere", src, source) for(var/mob/living/simple_animal/drone/D in mob_list) D.cancelAlarm("Atmosphere", src, source) + for(var/datum/computer_file/program/alarm_monitor/p in alarmdisplay) + p.cancelAlarm("Atmosphere", src, source) src.atmosalm = danger_level return 1 @@ -128,6 +137,8 @@ aiPlayer.triggerAlarm("Fire", src, cameras, source) for (var/mob/living/simple_animal/drone/D in mob_list) D.triggerAlarm("Fire", src, cameras, source) + for(var/datum/computer_file/program/alarm_monitor/p in alarmdisplay) + p.triggerAlarm("Fire", src, cameras, source) /area/proc/firereset(obj/source) for(var/area/RA in related) @@ -150,6 +161,8 @@ a.cancelAlarm("Fire", src, source) for (var/mob/living/simple_animal/drone/D in mob_list) D.cancelAlarm("Fire", src, source) + for(var/datum/computer_file/program/alarm_monitor/p in alarmdisplay) + p.cancelAlarm("Fire", src, source) /area/proc/burglaralert(obj/trigger) if(always_unpowered == 1) //no burglar alarms in space/asteroid diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index d0f7d88d53a..a3310dec696 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -16,12 +16,12 @@ var/global/ntnrc_uid = 0 ..() /datum/ntnet_conversation/proc/add_message(var/message, var/username) - message = "[stationtime2text()] [username]: [message]" + message = "[worldtime2text()] [username]: [message]" messages.Add(message) trim_message_list() /datum/ntnet_conversation/proc/add_status_message(var/message) - messages.Add("[stationtime2text()] -!- [message]") + messages.Add("[worldtime2text()] -!- [message]") trim_message_list() /datum/ntnet_conversation/proc/trim_message_list() diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm index 39f0400c47f..d1d67403d9e 100644 --- a/code/modules/modular_computers/NTNet/NTNet.dm +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -7,7 +7,6 @@ var/global/datum/ntnet/ntnet_global = new() var/list/logs = list() var/list/available_station_software = list() var/list/available_antag_software = list() - var/list/available_news = list() var/list/chat_channels = list() var/list/fileservers = list() // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. @@ -33,7 +32,6 @@ var/global/datum/ntnet/ntnet_global = new() relays.Add(R) R.NTNet = src build_software_lists() - build_news_list() add_log("NTNet logging system activated.") // Simplified logging: Adds a log. log_string is mandatory parameter, source is optional. @@ -95,17 +93,6 @@ var/global/datum/ntnet/ntnet_global = new() if(prog.available_on_syndinet) available_antag_software.Add(prog) -// Builds lists that contain downloadable software. -/datum/ntnet/proc/build_news_list() -/* - available_news = list() - for(var/F in typesof(/datum/computer_file/data/news_article/)) - var/datum/computer_file/data/news_article/news = new F(1) - if(news.stored_data) - available_news.Add(news) -*/ - return 1 - // Attempts to find a downloadable file according to filename var /datum/ntnet/proc/find_ntnet_file_by_name(var/filename) for(var/datum/computer_file/program/P in available_station_software) @@ -154,8 +141,3 @@ var/global/datum/ntnet/ntnet_global = new() if(NTNET_SYSTEMCONTROL) setting_systemcontrol = !setting_systemcontrol add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of station's systems.") - - - - - diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index de40b427476..00c6447f7e6 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -57,12 +57,12 @@ ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") ..() -/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) +/obj/machinery/ntnet_relay/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "nt_relay", name, 300, 150, master_ui, state) + ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", 500, 300, master_ui, state) ui.open() @@ -137,11 +137,11 @@ ntnet_global.relays.Remove(src) ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]") NTNet = null -/* + for(var/datum/computer_file/program/ntnet_dos/D in dos_sources) D.target = null D.error = "Connection to quantum relay severed" -*/ + ..() /obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) @@ -159,7 +159,7 @@ for(var/atom/movable/A in component_parts) A.forceMove(src.loc) -// new/obj/machinery/constructable_frame/machine_frame(src.loc) + new/obj/structure/frame/machine(src.loc) qdel(src) return ..() \ No newline at end of file diff --git a/code/modules/modular_computers/_description.dm b/code/modules/modular_computers/_description.dm deleted file mode 100644 index 2335ce08e73..00000000000 --- a/code/modules/modular_computers/_description.dm +++ /dev/null @@ -1,121 +0,0 @@ -/* -Program-based computers, designed to replace computer3 project and eventually most consoles on station - - -1. Basic information -Program based computers will allow you to do multiple things from single computer. Each computer will have programs, with more being downloadable from NTNet (stationwide network with wireless coverage) -if user has apropriate ID card access. It will be possible to hack the computer by using an emag on it - the emag will have to be completely new and will be consumed on use, but it will -lift ALL locks on ALL installed programs, and allow download of programs even if your ID doesn't have access to them. Computers will have hard drives that can store files. -Files can be programs (datum/computer_file/program/ subtype) or data files (datum/computer_file/data/ subtypes). Program for sending files will be available that will allow transfer via NTNet. -NTNet coverage will be limited to station's Z level, but better network card (=more expensive and higher power use) will allow usage everywhere. Hard drives will have limited capacity for files -which will be related to how good hard drive you buy when purchasing the laptop. For storing more files USB-style drives will be buildable with Protolathe in research. - -2. Available devices -CONSOLES -Consoles will come in various pre-fabricated loadouts, each loadout starting with certain set of programs (aka Engineering console, Medical console, etc.), of course, more software may be downloaded. -Consoles won't usually have integrated battery, but the possibility to install one will exist for critical applications. Consoles are considered hardwired into NTNet network which means they -will have working coverage on higher speed (Ethernet is faster than Wi-Fi) and won't require wireless coverage to exist. -LAPTOPS -Laptops are middle ground between actual portable devices and full consoles. They offer certain level of mobility, as they can be closed, moved somewhere else and then opened again. -Laptops will by default have internal battery to power them, and may be recharged with rechargers. However, laptops rely on wireless NTNet coverage. Laptop HDDs are also designed with power efficiency -in mind, which means they sacrifice some storage space for higher battery life. Laptops may be dispensed from computer vendor machine, and may be customised before vending. For people which don't -want to rely on internal battery, tesla link exists that connects to APC, if one exists. -TABLETS -Tablets are smallest available devices, designed with full mobility in mind. Tablets have only weak CPU which means the software they can run is somewhat limited. They are also designed with high -battery life in mind, which means the hardware focuses on power efficiency rather than high performance. This is most visible with hard drives which have quite small storage capacity. -Tablets can't be equipped with tesla link, which means they have to be recharged manually. - - -3. Computer Hardware -Computers will come with basic hardware installed, with upgrades being selectable when purchasing the device. -Hard Drive: Stores data, mandatory for the computer to work -Network Card: Connects to NTNet -Battery: Internal power source that ensures the computer operates when not connected to APC. -Extras (those won't be installed by default, but can be bought) -ID Card Slot: Required for HoP-style programs to work. Access for security record-style programs is read from ID of user [RFID?] without requiring this -APC Tesla Relay: Wirelessly powers the device from APC. Consoles have it by default. Laptops can buy it. -Disk Drive: Allows usage of portable data disks. -Nano Printer: Allows the computer to scan paper contents and save them to file, as well as recycle papers and print stuff on it. - -4. NTNet -NTNet is stationwide network that allows users to download programs needed for their work. It will be possible to send any files to other active computers using relevant program (NTN Transfer). -NTNet is under jurisdiction of both Engineering and Research. Engineering is responsible for any repairs if necessary and research is responsible for monitoring. It is similar to PDA messaging. -Operation requires functional "NTNet Relay" which is by default placed on tcommsat. If the relay is damaged NTNet will be offline until it is replaced. Multiple relays bring extra redundancy, -if one is destroyed the second will take over. If all relays are gone it stops working, simple as that. NTNet may be altered via administration console available to Research Director. It is -possible to enable/disable Software Downloading, P2P file transfers and Communication (IC version of IRC, PDA messages for more than two people) - -5. Software -Software would almost exclusively use NanoUI modules. Few exceptions are text editor (uses similar screen as TCS IDE used for editing and classic HTML for previewing as Nano looks differently) -and similar programs which for some reason require HTML UI. Most software will be highly dependent on NTNet to work as laptops are not physically connected to the station's network. -What i plan to add: - -Note: XXXXDB programs will use ingame_manuals to display basic help for players, similar to how books, etc. do - -Basic - Software in this bundle is automagically preinstalled in every new computer - NTN Transfer - Allows P2P transfer of files to other computers that run this. - Configurator - Allows configuration of computer's hardware, basically status screen. - File Browser - Allows you to browse all files stored on the computer. Allows renaming/deleting of files. - TXT Editor - Allows you editing data files in text editor mode. - NanoPrint - Allows you to operate NanoPrinter hardware to print text files. - NTNRC Chat - NTNet Relay Chat client. Allows PDA-messaging style messaging for more than two users. Person which created the conversation is Host and has administrative privilegies (kicking, etc.) - NTNet News - Allows reading news from newscaster network. - -Engineering - Requires "Engineering" access on ID card (ie. CE, Atmostech, Engineer) - Alarm Monitor - Allows monitoring alarms, same as the stationbound one. - Power Monitor - Power monitoring computer, connects to sensors in same way as regular one does. - Atmospheric Control - Allows access to the Atmospherics Monitor Console that operates air alarms. Requires extra access: "Atmospherics" - RCON Remote Control Console - Allows access to the RCON Remote Control Console. Requires extra access: "Power Equipment" - EngiDB - Allows accessing NTNet information repository for information about engineering-related things. - -Medical - Requires "Medbay" access on ID card (ie. CMO, Doctor,..) - Medical Records Uplink - Allows editing/reading of medical records. Printing requires NanoPrinter hardware. - MediDB - Allows accessing NTNet information repository for information about medical procedures - ChemDB - Requires extra access: "Chemistry" - Downloads basic information about recipes from NTNet - -Research - Requires "Research and Development" access on ID card (ie. RD, Roboticist, etc.) - Research Server Monitor - Allows monitoring of research levels on RnD servers. (read only) - Robotics Monitor Console - Allows monitoring of robots and exosuits. Lockdown/Self-Destruct options are unavailable [balance reasons for malf/traitor AIs]. Requires extra access: "Robotics" - NTNRC Administration Console - Allows administrative access to NTNRC. This includes bypassing any channel passwords and enabling "invisible" mode for spying on conversations. Requires extra access: "Research Director" - NTNet Administration Console - Allows remote configuration of NTNet Relay - CAUTION: If NTNet is turned off it won't be possible to turn it on again from the computer, as operation requires NTNet to work! Requires extra access: "Research Director" - NTNet Monitor - Allows monitoring of NTNet and it's various components, including simplified network logs and system status. - -Security - Requires "Security" access on ID card (ie. HOS, Security officer, Detective) - Security Records Uplink - Allows editing/reading of security records. Printing requires Nanoprinter hardware. - LawDB - Allows accessing NTNet information repository for security information (corporate regulations) - Camera Uplink - Allows viewing cameras around the station. - -Command - Requires "Bridge" access on ID card (all heads) - Alertcon Access - Allows changing of alert levels. Red requires activation from two computers with two IDs similar to how those wall mounted devices do. - Employment Records Access - Allows reading of employment records. Printing requires NanoPrinter hardware. - Communication Console - Allows sending emergency messages to Central. - Emergency Shuttle Control Console - Allows calling/recalling the emergency shuttle. - Shuttle Control Console - Allows control of various shuttles around the station (mining, research, engineering) - -*REDACTED* - Can be downloaded from SyndiCorp servers, only via emagged devices. These files are very large and limited to laptops/consoles only. - SYSCRACK - Allows cracking of secure network terminals, such as, NTNet administration. The sysadmin will probably notice this. - SYSOVERRIDE - Allows hacking into any device connected to NTNet. User will notice this and may stop the hack by disconnecting from NTNet first. After hacking various options exist, such as stealing/deleting files. - SYSKILL - Tricks NTNet to force-disconnect a device. The sysadmin will probably notice this. - SYSDOS - Launches a Denial of Service attack on NTNet relay. Can DoS only one relay at once. Requires NTNet connection. After some time the relay crashes until attack stops. The sysadmin will probably notice this. - AIHACK - Hacks an AI, allowing you to upload/remove/modify a law even without relevant circuit board. The AI is alerted once the hack starts, and it takes a while for it to complete. Does not work on AIs with zeroth law. - COREPURGE - Deletes all files on the hard drive, including the undeletable ones. Something like software self-destruct for computer. - -6. Security -Laptops will be password-lockable. If password is set a MD5 hash of it is stored and password is required every time you turn on the laptop. -Passwords may be decrypted by using special Decrypter (protolathable, RDs office starts with one) device that will slowly decrypt the password. -Decryption time would be length_of_password * 30 seconds, with maximum being 9 minutes (due to battery life limitations, which is 10+ min). -If decrypted the password is cleared, so you can keep using your favorite password without people ever actually revealing it (for meta prevention reasons mostly). -Emagged laptops will have option to enable "Safe Encryption". If safely encrypted laptop is decrypted it loses it's emag status and 50% of files is deleted (randomly selected). - -7. System Administrator -System Administrator will be new job under Research. It's main specifics will be maintaining of computer systems on station, espicially from software side. -From IC perspective they'd probably know how to build a console or something given they work with computers, but they are mostly programmers/network experts. -They will have office in research, which will probably replace (and contain) the server room and part of the toxins storage which is currently oversized. -They will have access to DOWNLOAD (not run) all programs that exist on NTNet. They'll have fairly good amount of available programs, most of them being -administrative consoles and other very useful things. They'll also be able to monitor NTNet. There will probably be one or two job slots. - -8. IDS -With addition of various antag programs, IDS(Intrusion Detection System) will be added to NTNet. This system can be turned on/off via administration console. -If enabled, this system automatically detects any abnormality and triggers a warning that's visible on the NTNet status screen, as well as generating a security log. -IDS can be disabled by simple on/off switch in the configuration. - -*/ \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index 592f70ade32..780484b44a8 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -28,7 +28,6 @@ var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed. var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer. - var/light_strength = 0 // Damage of the chassis. If the chassis takes too much damage it will break apart. var/damage = 0 // Current damage level @@ -47,6 +46,8 @@ var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. var/activetemplate = "computer_main" + var/obj/physical = null + // Eject ID card from computer, if it has ID slot with card inside. @@ -123,7 +124,7 @@ if(response == "Yes") turn_on(user) -/obj/item/modular_computer/emag_act(remaining_charges, mob/user) +/obj/item/modular_computer/emag_act(mob/user) if(computer_emagged) user << "\The [src] was already emagged." return 0 @@ -143,6 +144,8 @@ machines += src START_PROCESSING(SSmachine, src) update_icon() + if(!physical) + physical = src ..() /obj/item/modular_computer/Destroy() @@ -172,11 +175,13 @@ return 0 // Operates NanoUI -/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) -// if(!screen_on || !enabled) -// if(ui) -// ui.close() -// return 0 +/obj/item/modular_computer/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) + + + if(!screen_on || !enabled) + if(ui) + ui.close() + return 0 // if((!battery_module || !battery_module.battery.charge) && !check_power_override()) // if(ui) // ui.close() @@ -192,7 +197,7 @@ // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it. // This screen simply lists available programs and user may select them. if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) - visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") + physical.visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") return // No HDD, No HDD files list or no stored files. Something is very broken. ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -214,8 +219,11 @@ data["programs"] = list() // var/list/programs = list() for(var/datum/computer_file/program/P in hard_drive.stored_files) + var/running = 0 + if(P in idle_threads) + running = 1 - data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc)) + data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc, "running" = running)) // var/list/program = list() @@ -235,7 +243,7 @@ turn_on(user) /obj/item/modular_computer/proc/break_apart() - visible_message("\The [src] breaks apart!") + physical.visible_message("\The [src] breaks apart!") var/turf/newloc = get_turf(src) new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2)) for(var/obj/item/weapon/computer_hardware/H in get_all_components()) @@ -383,7 +391,7 @@ P.kill_program(1) idle_threads.Remove(P) if(loud) - visible_message("\The [src] shuts down.") + physical.visible_message("\The [src] shuts down.") enabled = 0 update_icon() return @@ -467,7 +475,7 @@ // Used in following function to reduce copypaste /obj/item/modular_computer/proc/power_failure(var/malfunction = 0) if(enabled) // Shut down the computer - visible_message("\The [src]'s screen flickers \"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\" warning as it shuts down unexpectedly.") + physical.visible_message("\The [src]'s screen flickers \"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\" warning as it shuts down unexpectedly.") if(active_program) active_program.event_powerfailure(0) for(var/datum/computer_file/program/PRG in idle_threads) @@ -527,7 +535,7 @@ user << "Remove all components from \the [src] before disassembling it." return new /obj/item/stack/sheet/metal( get_turf(src.loc), steel_sheet_cost ) - src.visible_message("\The [src] has been disassembled by [user].") + physical.visible_message("\The [src] has been disassembled by [user].") relay_qdel() qdel(src) return @@ -670,8 +678,6 @@ // Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null /obj/item/modular_computer/proc/find_hardware_by_name(var/name) - world <<"ran" - world << name if(portable_drive && (portable_drive.name == name)) return portable_drive if(hard_drive && (hard_drive.name == name)) @@ -790,4 +796,10 @@ //if(HALLOSS) // take_damage(Proj.damage, Proj.damage / 3, 0) if(BURN) - take_damage(Proj.damage, Proj.damage / 1.5) \ No newline at end of file + take_damage(Proj.damage, Proj.damage / 1.5) + +/obj/item/modular_computer/ui_host() + if(physical) + return physical + else + return src \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 649e20e57ea..d03c25cca12 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -7,5 +7,4 @@ hardware_flag = PROGRAM_TABLET max_hardware_size = 1 w_class = 2 - light_strength = 2 // Same as PDAs - var/use_power = 1 \ No newline at end of file + var/use_power = 0 \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 155e121c00b..26410e6794c 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -21,7 +21,6 @@ /obj/machinery/modular_computer/console/preset/proc/install_programs() return -/* // ===== ENGINEERING CONSOLE ===== /obj/machinery/modular_computer/console/preset/engineering @@ -31,18 +30,6 @@ /obj/machinery/modular_computer/console/preset/engineering/install_programs() cpu.hard_drive.store_file(new/datum/computer_file/program/power_monitor()) cpu.hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) - cpu.hard_drive.store_file(new/datum/computer_file/program/atmos_control()) - cpu.hard_drive.store_file(new/datum/computer_file/program/rcon_console()) - - -// ===== MEDICAL CONSOLE ===== -/obj/machinery/modular_computer/console/preset/medical - console_department = "Medical" - desc = "A stationary computer. This one comes preloaded with medical programs." - -/obj/machinery/modular_computer/console/preset/medical/install_programs() - cpu.hard_drive.store_file(new/datum/computer_file/program/suit_sensors()) - // ===== RESEARCH CONSOLE ===== /obj/machinery/modular_computer/console/preset/research @@ -54,34 +41,6 @@ cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) - -// ===== COMMAND CONSOLE ===== -/obj/machinery/modular_computer/console/preset/command - console_department = "Command" - desc = "A stationary computer. This one comes preloaded with command programs." - _has_id_slot = 1 - _has_printer = 1 - -/obj/machinery/modular_computer/console/preset/command/install_programs() - cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) - cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) - cpu.hard_drive.store_file(new/datum/computer_file/program/comm()) - -/obj/machinery/modular_computer/console/preset/command/main - console_department = "Command" - desc = "A stationary computer. This one comes preloaded with essential command programs." - _has_id_slot = 1 - _has_printer = 1 - -// ===== SECURITY CONSOLE ===== -/obj/machinery/modular_computer/console/preset/security - console_department = "Security" - desc = "A stationary computer. This one comes preloaded with security programs." - -/obj/machinery/modular_computer/console/preset/security/install_programs() - return // No security programs exist, yet, but the preset is ready so it may be mapped in. - - // ===== CIVILIAN CONSOLE ===== /obj/machinery/modular_computer/console/preset/civilian console_department = "Civilian" @@ -90,5 +49,4 @@ /obj/machinery/modular_computer/console/preset/civilian/install_programs() cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) - cpu.hard_drive.store_file(new/datum/computer_file/program/newsbrowser()) -*/ \ No newline at end of file + diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 72e9f056e69..e7ce0500c14 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -38,9 +38,8 @@ var/list/global_modular_computers = list() if(cpu) cpu.attack_ghost(user) -/obj/machinery/modular_computer/emag_act(remaining_charges, mob/user) -// return cpu ? cpu.emag_act(remaining_charges, user) : NO_EMAG_ACT - return 1 +/obj/machinery/modular_computer/emag_act(mob/user) + return cpu ? cpu.emag_act(user) : 1 /obj/machinery/modular_computer/update_icon() icon_state = icon_state_unpowered @@ -78,6 +77,7 @@ var/list/global_modular_computers = list() /obj/machinery/modular_computer/New() ..() cpu = new(src) + cpu.physical = src global_modular_computers.Add(src) /obj/machinery/modular_computer/Destroy() diff --git a/code/modules/modular_computers/file_system/news_article.dm b/code/modules/modular_computers/file_system/news_article.dm deleted file mode 100644 index 2af9be7c20b..00000000000 --- a/code/modules/modular_computers/file_system/news_article.dm +++ /dev/null @@ -1,29 +0,0 @@ -// /data/ files store data in string format. -// They don't contain other logic for now. -/datum/computer_file/data/news_article - filetype = "XNML" - filename = "Unknown News Entry" - block_size = 1000 // Results in smaller files - do_not_edit = 1 // Editing the file breaks most formatting due to some HTML tags not being accepted as input from average user. - var/server_file_path // File path to HTML file that will be loaded on server start. Example: '/news_articles/space_magazine_1.html'. Use the /news_articles/ folder! - -/datum/computer_file/data/news_article/New(var/load_from_file = 0) - ..() - if(server_file_path && load_from_file) - stored_data = file2text(server_file_path) - calculate_size() - - -// NEWS DEFINITIONS BELOW THIS LINE - -/datum/computer_file/data/news_article/space/vol_one - filename = "SPACE Magazine vol. 1" - server_file_path = 'news_articles/space_magazine_1.html' - -/datum/computer_file/data/news_article/space/vol_two - filename = "SPACE Magazine vol. 2" - server_file_path = 'news_articles/space_magazine_2.html' - -/datum/computer_file/data/news_article/space/vol_three - filename = "SPACE Magazine vol. 3" - server_file_path = 'news_articles/space_magazine_3.html' \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 975f3ee2f49..66cd8f91f4d 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -29,9 +29,6 @@ computer = null . = ..() -//datum/computer_file/program/nano_host() -// return computer.nano_host() - /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() temp.required_access = required_access @@ -79,19 +76,19 @@ access_to_check = required_access if(!access_to_check) // No required_access, allow it. return 1 - return 1 -/* - var/obj/item/weapon/card/id/I = user.GetIdCard() + + + var/obj/item/weapon/card/id/I = user.GetID() if(!I) if(loud) user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." return 0 - if(access_to_check in I.access) + if(access_to_check in I.GetAccess) return 1 else if(loud) user << "\The [computer] flashes an \"Access Denied\" warning." -*/ + // This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones // always include the device here in this proc. This proc basically relays the request to whatever is running the program. /datum/computer_file/program/proc/get_header_data() @@ -103,8 +100,6 @@ // When implementing new program based device, use this to run the program. /datum/computer_file/program/proc/run_program(mob/living/user) if(can_run(user, 1)) - if(nanomodule_path) - NM = new nanomodule_path(src, new /datum/topic_manager/program(src), src) if(requires_ntnet && network_destination) generate_network_log("Connection opened to [network_destination].") program_state = PROGRAM_STATE_ACTIVE @@ -116,19 +111,12 @@ program_state = PROGRAM_STATE_KILLED if(network_destination) generate_network_log("Connection to [network_destination] closed.") - if(NM) - qdel(NM) - NM = null return 1 // This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. // It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. -/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 1, datum/tgui/master_ui = null, datum/ui_state/state = default_state) +/datum/computer_file/program/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) if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. - if(!ui) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(ui) - ui.close() return computer.ui_interact(user) return 1 @@ -138,16 +126,18 @@ // Calls beginning with "PRG_" are reserved for programs handling. // Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) // ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. -/datum/computer_file/program/ui_act(action,params) +/datum/computer_file/program/ui_act(action,params,datum/tgui/ui) if(..()) return 1 if(computer) switch(action) if("PC_exit") computer.kill_program() + ui.close() return 1 if("PC_shutdown") computer.shutdown_computer() + ui.close() return 1 if("PC_minimize") var/mob/user = usr @@ -159,11 +149,19 @@ computer.active_program = null computer.update_icon() + ui.close() + if(user && istype(user)) computer.ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. +/datum/computer_file/program/ui_host() + if(computer.physical) + return computer.physical + else + return computer - - //if(computer) - // return computer.ui_act(action,params) +/datum/computer_file/program/ui_status(mob/user) + if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. + return UI_CLOSE + return ..() diff --git a/code/modules/modular_computers/file_system/programs/_engineering.dm b/code/modules/modular_computers/file_system/programs/_engineering.dm deleted file mode 100644 index 71bc0d475b3..00000000000 --- a/code/modules/modular_computers/file_system/programs/_engineering.dm +++ /dev/null @@ -1,85 +0,0 @@ -// These programs are associated with engineering. - -/datum/computer_file/program/power_monitor - filename = "powermonitor" - filedesc = "Power Monitoring" - nanomodule_path = /datum/nano_module/power_monitor/ - program_icon_state = "power_monitor" - extended_desc = "This program connects to sensors around the station to provide information about electrical systems" - ui_header = "power_norm.gif" - required_access = access_engine - requires_ntnet = 1 - network_destination = "power monitoring system" - size = 9 - var/has_alert = 0 - -/datum/computer_file/program/power_monitor/process_tick() - ..() - var/datum/nano_module/power_monitor/NMA = NM - if(istype(NMA) && NMA.has_alarm()) - if(!has_alert) - program_icon_state = "power_monitor_warn" - ui_header = "power_warn.gif" - update_computer_icon() - has_alert = 1 - else - if(has_alert) - program_icon_state = "power_monitor" - ui_header = "power_norm.gif" - update_computer_icon() - has_alert = 0 - -/datum/computer_file/program/alarm_monitor - filename = "alarmmonitor" - filedesc = "Alarm Monitoring" - nanomodule_path = /datum/nano_module/alarm_monitor/engineering - ui_header = "alarm_green.gif" - program_icon_state = "alert-green" - extended_desc = "This program provides visual interface for station's alarm system." - requires_ntnet = 1 - network_destination = "alarm monitoring network" - size = 5 - var/has_alert = 0 - -/datum/computer_file/program/alarm_monitor/process_tick() - ..() - var/datum/nano_module/alarm_monitor/NMA = NM - if(istype(NMA) && NMA.has_major_alarms()) - if(!has_alert) - program_icon_state = "alert-red" - ui_header = "alarm_red.gif" - update_computer_icon() - has_alert = 1 - else - if(has_alert) - program_icon_state = "alert-green" - ui_header = "alarm_green.gif" - update_computer_icon() - has_alert = 0 - return 1 - -/datum/computer_file/program/atmos_control - filename = "atmoscontrol" - filedesc = "Atmosphere Control" - nanomodule_path = /datum/nano_module/atmos_control - program_icon_state = "atmos_control" - extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers." - required_access = access_atmospherics - requires_ntnet = 1 - network_destination = "atmospheric control system" - requires_ntnet_feature = NTNET_SYSTEMCONTROL - usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE - size = 17 - -/datum/computer_file/program/rcon_console - filename = "rconconsole" - filedesc = "RCON Remote Control" - nanomodule_path = /datum/nano_module/rcon - program_icon_state = "generic" - extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers." - required_access = access_engine - requires_ntnet = 1 - network_destination = "RCON remote control system" - requires_ntnet_feature = NTNET_SYSTEMCONTROL - usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE - size = 19 diff --git a/code/modules/modular_computers/file_system/programs/_medical.dm b/code/modules/modular_computers/file_system/programs/_medical.dm deleted file mode 100644 index 4099d156bbb..00000000000 --- a/code/modules/modular_computers/file_system/programs/_medical.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/computer_file/program/suit_sensors - filename = "sensormonitor" - filedesc = "Suit Sensors Monitoring" - nanomodule_path = /datum/nano_module/crew_monitor - program_icon_state = "crew" - extended_desc = "This program connects to life signs monitoring system to provide basic information on crew health." - required_access = access_medical - requires_ntnet = 1 - network_destination = "crew lifesigns monitoring system" - size = 11 diff --git a/code/modules/modular_computers/file_system/programs/_program.dm b/code/modules/modular_computers/file_system/programs/_program.dm deleted file mode 100644 index 0039b8f5976..00000000000 --- a/code/modules/modular_computers/file_system/programs/_program.dm +++ /dev/null @@ -1,35 +0,0 @@ -/* - -/obj/machinery/modular_computer/initial_data() - return cpu ? cpu.get_header_data() : ..() - -/obj/item/modular_computer/initial_data() - return get_header_data() - -/obj/machinery/modular_computer/update_layout() - return TRUE - -/obj/item/modular_computer/update_layout() - return TRUE - -*/ - -/datum/nano_module/program -// available_to_ai = FALSE - var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null. - -/datum/nano_module/program/New(host, topic_manager, program) - ..() - src.program = program - -/datum/topic_manager/program - var/datum/program - -/datum/topic_manager/program/New(datum/program) - ..() - src.program = program - -// Calls forwarded to PROGRAM itself should begin with "PRG_" -// Calls forwarded to COMPUTER running the program should begin with "PC_" -/datum/topic_manager/program/Topic(href, href_list) - return program && program.Topic(href, href_list) diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm new file mode 100644 index 00000000000..3a3c9d72e78 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -0,0 +1,106 @@ + + + +/datum/computer_file/program/alarm_monitor + filename = "alarmmonitor" + filedesc = "Alarm Monitoring" + ui_header = "alarm_green.gif" + program_icon_state = "alert-green" + extended_desc = "This program provides visual interface for station's alarm system." + requires_ntnet = 1 + network_destination = "alarm monitoring network" + size = 5 + var/has_alert = 0 + var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list()) + +/datum/computer_file/program/alarm_monitor/process_tick() + ..() + + if(has_alert) + program_icon_state = "alert-red" + ui_header = "alarm_red.gif" + update_computer_icon() + else + if(!has_alert) + program_icon_state = "alert-green" + ui_header = "alarm_green.gif" + update_computer_icon() + return 1 + + + +/datum/computer_file/program/alarm_monitor/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) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "station_alert_prog", "Alarm Monitoring", 300, 500, master_ui, state) + ui.open() + +/datum/computer_file/program/alarm_monitor/ui_data(mob/user) + var/list/data = get_header_data() + + data["alarms"] = list() + for(var/class in alarms) + data["alarms"][class] = list() + for(var/area in alarms[class]) + data["alarms"][class] += area + + return data + +/datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/A, O, obj/source) + + var/list/L = alarms[class] + for(var/I in L) + if (I == A.name) + var/list/alarm = L[I] + var/list/sources = alarm[3] + if (!(source in sources)) + sources += source + return 1 + var/obj/machinery/camera/C = null + var/list/CL = null + if(O && istype(O, /list)) + CL = O + if (CL.len == 1) + C = CL[1] + else if(O && istype(O, /obj/machinery/camera)) + C = O + L[A.name] = list(A, (C ? C : O), list(source)) + + update_alarm_display() + + return 1 + + +/datum/computer_file/program/alarm_monitor/proc/cancelAlarm(class, area/A, obj/origin) + + + var/list/L = alarms[class] + var/cleared = 0 + for (var/I in L) + if (I == A.name) + var/list/alarm = L[I] + var/list/srcs = alarm[3] + if (origin in srcs) + srcs -= origin + if (srcs.len == 0) + cleared = 1 + L -= I + + update_alarm_display() + return !cleared + +/datum/computer_file/program/alarm_monitor/proc/update_alarm_display() + has_alert = FALSE + for(var/cat in alarms) + var/list/L = alarms[cat] + if(L.len) + has_alert = TRUE + +/datum/computer_file/program/alarm_monitor/run_program(mob/user) + . = ..(user) + alarmdisplay += src + +/datum/computer_file/program/alarm_monitor/kill_program(forced = 0) + alarmdisplay -= src + ..(forced) \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 4d82967d342..306b1495cc3 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -29,14 +29,15 @@ error = "Connection to destination relay lost." /datum/computer_file/program/ntnet_dos/kill_program(var/forced) - target.dos_sources.Remove(src) + if(target) + target.dos_sources.Remove(src) target = null executed = 0 ..(forced) -/datum/computer_file/program/ntnet_dos/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) +/datum/computer_file/program/ntnet_dos/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) @@ -50,10 +51,11 @@ /datum/computer_file/program/ntnet_dos/ui_act(action, params) if(..()) return 1 + world << params switch(action) if("PRG_target_relay") for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) - if("[R.uid]" == params) + if("[R.uid]" == params["targid"]) target = R return 1 if("PRG_reset") @@ -90,18 +92,16 @@ // Probability of 1 is equal of completion percentage of DoS attack on this relay. // Combined with UI updates this adds quite nice effect to the UI var/percentage = target.dos_overload * 100 / target.dos_capacity - var/list/strings[0] + data["dos_strings"] = list() for(var/j, j<10, j++) var/string = "" for(var/i, i<20, i++) string = "[string][prob(percentage)]" - strings.Add(string) - data["dos_strings"] = strings + data["dos_strings"] += list(list("nums" = string)) else - var/list/relays[0] + data["relays"] = list() for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) - relays.Add(R.uid) - data["relays"] = relays + data["relays"] += list(list("id" = R.uid)) data["focus"] = target ? target.uid : null return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index 87ce4de9cc4..6549c4d02f5 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -7,7 +7,6 @@ requires_ntnet = 0 available_on_ntnet = 0 available_on_syndinet = 1 - nanomodule_path = /datum/nano_module/program/revelation/ var/armed = 0 /datum/computer_file/program/revelation/run_program(var/mob/living/user) @@ -24,56 +23,50 @@ if(computer.battery_module && prob(25)) qdel(computer.battery_module) computer.visible_message("\The [computer]'s battery explodes in rain of sparks.") - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(10, 1, computer.loc) - s.start() + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread + spark_system.start() if(istype(computer, /obj/item/modular_computer/processor)) var/obj/item/modular_computer/processor/P = computer if(P.machinery_computer.tesla_link && prob(50)) qdel(P.machinery_computer.tesla_link) computer.visible_message("\The [computer]'s tesla link explodes in rain of sparks.") - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(10, 1, computer.loc) - s.start() + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread + spark_system.start() -/datum/computer_file/program/revelation/Topic(href, href_list) +/datum/computer_file/program/revelation/ui_act(action, params) if(..()) return 1 - else if(href_list["PRG_arm"]) - armed = !armed - else if(href_list["PRG_activate"]) - activate() - else if(href_list["PRG_obfuscate"]) - var/mob/living/user = usr - var/newname = sanitize(input(user, "Enter new program name: ")) - if(!newname) - return - filedesc = newname - return 1 + switch(action) + if("PRG_arm") + armed = !armed + if("PRG_activate") + activate() + if("PRG_obfuscate") + var/mob/living/user = usr + var/newname = sanitize(input(user, "Enter new program name: ")) + if(!newname) + return + filedesc = newname + /datum/computer_file/program/revelation/clone() var/datum/computer_file/program/revelation/temp = ..() temp.armed = armed return temp -/datum/nano_module/program/revelation - name = "Revelation Virus" +/datum/computer_file/program/revelation/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) -/datum/nano_module/program/revelation/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - var/list/data = list() - var/datum/computer_file/program/revelation/PRG = program - if(!istype(PRG)) - return - - data = PRG.get_header_data() - - data["armed"] = PRG.armed - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "revelation.tmpl", "Revelation Virus", 400, 250, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) + ui = new(user, src, ui_key, "revelation", "Revelation Virus", 400, 250, state = state) + ui.set_style("syndicate") + ui.set_autoupdate(state = 1) ui.open() - ui.set_auto_update(1) + +/datum/computer_file/program/revelation/ui_data(mob/user) + var/list/data = get_header_data() + + data["armed"] = armed + + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/comm.dm b/code/modules/modular_computers/file_system/programs/comm.dm deleted file mode 100644 index 736b87a1665..00000000000 --- a/code/modules/modular_computers/file_system/programs/comm.dm +++ /dev/null @@ -1,417 +0,0 @@ -#define STATE_DEFAULT 1 -#define STATE_MESSAGELIST 2 -#define STATE_VIEWMESSAGE 3 -#define STATE_STATUSDISPLAY 4 -#define STATE_ALERT_LEVEL 5 -/datum/computer_file/program/comm - filename = "comm" - filedesc = "Command and communications program." - program_icon_state = "comm" - nanomodule_path = /datum/nano_module/program/comm - extended_desc = "Used to command and control the station. Can relay long-range communications. This program can not be run on tablet computers." - required_access = access_heads - requires_ntnet = 1 - size = 12 - usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP - network_destination = "station long-range communication array" - var/datum/comm_message_listener/message_core = new - -/datum/computer_file/program/comm/clone() - var/datum/computer_file/program/comm/temp = ..() - temp.message_core.messages = null - temp.message_core.messages = message_core.messages.Copy() - return temp - -/datum/nano_module/program/comm - name = "Command and communications program" - available_to_ai = TRUE - var/current_status = STATE_DEFAULT - var/msg_line1 = "" - var/msg_line2 = "" - var/centcomm_message_cooldown = 0 - var/announcment_cooldown = 0 - var/datum/announcement/priority/crew_announcement = new - var/current_viewing_message_id = 0 - var/current_viewing_message = null - -/datum/nano_module/program/comm/New() - ..() - crew_announcement.newscast = 1 - -/datum/nano_module/program/comm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - var/list/data = host.initial_data() - - if(program) - data["emagged"] = program.computer_emagged - data["net_comms"] = !!program.get_signal(NTNET_COMMUNICATION) //Double !! is needed to get 1 or 0 answer - data["net_syscont"] = !!program.get_signal(NTNET_SYSTEMCONTROL) - if(program.computer) - data["have_printer"] = !!program.computer.nano_printer - else - data["have_printer"] = 0 - else - data["emagged"] = 0 - data["net_comms"] = 1 - data["net_syscont"] = 1 - data["have_printer"] = 0 - - data["message_line1"] = msg_line1 - data["message_line2"] = msg_line2 - data["state"] = current_status - data["isAI"] = issilicon(usr) - data["authenticated"] = is_autenthicated(user) - data["boss_short"] = boss_short - data["current_security_level"] = security_level - data["current_security_level_title"] = num2seclevel(security_level) - - data["def_SEC_LEVEL_DELTA"] = SEC_LEVEL_DELTA - data["def_SEC_LEVEL_BLUE"] = SEC_LEVEL_BLUE - data["def_SEC_LEVEL_GREEN"] = SEC_LEVEL_GREEN - - var/datum/comm_message_listener/l = obtain_message_listener() - data["messages"] = l.messages - data["message_deletion_allowed"] = l != global_message_listener - data["message_current_id"] = current_viewing_message_id - if(current_viewing_message) - data["message_current"] = current_viewing_message - - if(emergency_shuttle.location()) - data["have_shuttle"] = 1 - if(emergency_shuttle.online()) - data["have_shuttle_called"] = 1 - else - data["have_shuttle_called"] = 0 - else - data["have_shuttle"] = 0 - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if(!ui) - ui = new(user, src, ui_key, "communication.tmpl", name, 550, 420, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - -/datum/nano_module/program/comm/proc/is_autenthicated(var/mob/user) - if(program) - return program.can_run(user) - return 1 - -/datum/nano_module/program/comm/proc/obtain_message_listener() - if(program) - var/datum/computer_file/program/comm/P = program - return P.message_core - return global_message_listener - -/datum/nano_module/program/comm/Topic(href, href_list) - if(..()) - return 1 - var/mob/user = usr - var/ntn_comm = program ? !!program.get_signal(NTNET_COMMUNICATION) : 1 - var/ntn_cont = program ? !!program.get_signal(NTNET_SYSTEMCONTROL) : 1 - var/datum/comm_message_listener/l = obtain_message_listener() - switch(href_list["action"]) - if("sw_menu") - . = 1 - current_status = text2num(href_list["target"]) - if("announce") - . = 1 - if(is_autenthicated(user) && !issilicon(usr) && ntn_comm) - if(user) - var/obj/item/weapon/card/id/id_card = user.GetIdCard() - crew_announcement.announcer = GetNameAndAssignmentFromId(id_card) - else - crew_announcement.announcer = "Unknown" - if(announcment_cooldown) - usr << "Please allow at least one minute to pass between announcements" - return TRUE - var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") as null|text - if(!input || !can_still_topic()) - return 1 - crew_announcement.Announce(input) - announcment_cooldown = 1 - spawn(600)//One minute cooldown - announcment_cooldown = 0 - if("message") - . = 1 - if(href_list["target"] == "emagged") - if(program) - if(is_autenthicated(user) && program.computer_emagged && !issilicon(usr) && ntn_comm) - if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." - nanomanager.update_uis(src) - return - var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic()) - return 1 - Syndicate_announce(input, usr) - usr << "Message transmitted." - log_say("[key_name(usr)] has made an illegal announcement: [input]") - centcomm_message_cooldown = 1 - spawn(300)//30 second cooldown - centcomm_message_cooldown = 0 - else if(href_list["target"] == "regular") - if(is_autenthicated(user) && !issilicon(usr) && ntn_comm) - if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." - nanomanager.update_uis(src) - return - if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. - usr <<"No Emergency Bluespace Relay detected. Unable to transmit message." - return 1 - var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic()) - return 1 - Centcomm_announce(input, usr) - usr << "Message transmitted." - log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") - centcomm_message_cooldown = 1 - spawn(300) //30 second cooldown - centcomm_message_cooldown = 0 - if("shuttle") - . = 1 - if(is_autenthicated(user) && ntn_cont) - if(href_list["target"] == "call") - var/confirm = alert("Are you sure you want to call the shuttle?", name, "No", "Yes") - if(confirm == "Yes" && can_still_topic()) - call_shuttle_proc(usr) - if(href_list["target"] == "cancel" && !issilicon(usr)) - var/confirm = alert("Are you sure you want to cancel the shuttle?", name, "No", "Yes") - if(confirm == "Yes" && can_still_topic()) - cancel_call_proc(usr) - if("setstatus") - . = 1 - if(is_autenthicated(user) && ntn_cont) - switch(href_list["target"]) - if("line1") - var/linput = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", msg_line1) as text|null, 40), 40) - if(can_still_topic()) - msg_line1 = linput - if("line2") - var/linput = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", msg_line2) as text|null, 40), 40) - if(can_still_topic()) - msg_line2 = linput - if("message") - post_status("message", msg_line1, msg_line2) - if("alert") - post_status("alert", href_list["alert"]) - else - post_status(href_list["target"]) - if("setalert") - . = 1 - if(is_autenthicated(user) && !issilicon(usr) && ntn_cont && ntn_comm) - var/current_level = text2num(href_list["target"]) - var/confirm = alert("Are you sure you want to change alert level to [num2seclevel(current_level)]?", name, "No", "Yes") - if(confirm == "Yes" && can_still_topic()) - var/old_level = security_level - if(!current_level) current_level = SEC_LEVEL_GREEN - if(current_level < SEC_LEVEL_GREEN) current_level = SEC_LEVEL_GREEN - if(current_level > SEC_LEVEL_BLUE) current_level = SEC_LEVEL_BLUE //Cannot engage delta with this - set_security_level(current_level) - if(security_level != old_level) - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - switch(security_level) - if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) - if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) - else - usr << "You press button, but red light flashes and nothing happens." //This should never happen - current_status = STATE_DEFAULT - if("viewmessage") - . = 1 - if(is_autenthicated(user) && ntn_comm) - current_viewing_message_id = text2num(href_list["target"]) - for(var/list/m in l.messages) - if(m["id"] == current_viewing_message_id) - current_viewing_message = m - current_status = STATE_VIEWMESSAGE - if("delmessage") - . = 1 - if(is_autenthicated(user) && ntn_comm && l != global_message_listener) - l.Remove(current_viewing_message) - current_status = STATE_MESSAGELIST - if("printmessage") - . = 1 - if(is_autenthicated(user) && ntn_comm) - if(program && program.computer && program.computer.nano_printer) - if(!program.computer.nano_printer.print_text(current_viewing_message["contents"],current_viewing_message["title"])) - usr << "Hardware error: Printer was unable to print the file. It may be out of paper." - else - program.computer.visible_message("\The [program.computer] prints out paper.") - -#undef STATE_DEFAULT -#undef STATE_MESSAGELIST -#undef STATE_VIEWMESSAGE -#undef STATE_STATUSDISPLAY -#undef STATE_ALERT_LEVEL - -/* -General message handling stuff -*/ -var/list/comm_message_listeners = list() //We first have to initialize list then we can use it. -var/datum/comm_message_listener/global_message_listener = new //May be used by admins -var/last_message_id = 0 - -/proc/get_comm_message_id() - last_message_id = last_message_id + 1 - return last_message_id - -/proc/post_comm_message(var/message_title, var/message_text) - var/list/message = list() - message["id"] = get_comm_message_id() - message["title"] = message_title - message["contents"] = message_text - - for (var/datum/comm_message_listener/l in comm_message_listeners) - l.Add(message) - - for (var/obj/machinery/modular_computer/console/preset/command/main/computer in global_modular_computers) - if(!(computer.stat & (BROKEN | NOPOWER)) && computer.cpu) - if(computer.cpu.hard_drive) - var/datum/computer_file/program/comm/C = locate(/datum/computer_file/program/comm) in computer.cpu.hard_drive.stored_files - if(C) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper(computer.loc) - intercept.name = message_title - intercept.info = message_text - -/datum/comm_message_listener - var/list/messages - -/datum/comm_message_listener/New() - ..() - messages = list() - comm_message_listeners.Add(src) - -/datum/comm_message_listener/proc/Add(var/list/message) - messages[++messages.len] = message - -/datum/comm_message_listener/proc/Remove(var/list/message) - messages -= list(message) - -/proc/post_status(var/command, var/data1, var/data2) - - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) - - if(!frequency) return - - - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = 1 - status_signal.data["command"] = command - - switch(command) - if("message") - status_signal.data["msg1"] = data1 - status_signal.data["msg2"] = data2 - log_admin("STATUS: [key_name(usr)] set status screen message with [src]: [data1] [data2]") - if("alert") - status_signal.data["picture_state"] = data1 - - frequency.post_signal(src, status_signal) - -/proc/cancel_call_proc(var/mob/user) - if (!( ticker ) || !emergency_shuttle.can_recall()) - return - if((ticker.mode.name == "blob")||(ticker.mode.name == "Meteor")) - return - - if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm - emergency_shuttle.recall() - log_game("[key_name(user)] has recalled the shuttle.") - message_admins("[key_name_admin(user)] has recalled the shuttle.", 1) - return - - -/proc/is_relay_online() - for(var/obj/machinery/bluespacerelay/M in machines) - if(M.stat == 0) - return 1 - return 0 - -/proc/enable_prison_shuttle(var/mob/user) - for(var/obj/machinery/computer/prison_shuttle/PS in machines) - PS.allowedtocall = !(PS.allowedtocall) - -/proc/call_shuttle_proc(var/mob/user) - if ((!( ticker ) || !emergency_shuttle.location())) - return - - if(!universe.OnShuttleCall(usr)) - user << "Cannot establish a bluespace connection." - return - - if(deathsquad.deployed) - user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." - return - - if(emergency_shuttle.deny_shuttle) - user << "The emergency shuttle may not be sent at this time. Please try again later." - return - - if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE - user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minute\s before trying again." - return - - if(emergency_shuttle.going_to_centcom()) - user << "The emergency shuttle may not be called while returning to [boss_short]." - return - - if(emergency_shuttle.online()) - user << "The emergency shuttle is already on its way." - return - - if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic") - user << "Under directive 7-10, [station_name()] is quarantined until further notice." - return - - if(!emergency_shuttle.call_evac(user)) - return - log_and_message_admins("has called the shuttle.") - -/proc/init_shift_change(var/mob/user, var/force = 0) - if ((!( ticker ) || !emergency_shuttle.location())) - return - - if(emergency_shuttle.going_to_centcom()) - user << "The shuttle may not be called while returning to [boss_short]." - return - - if(emergency_shuttle.online()) - user << "The shuttle is already on its way." - return - - // if force is 0, some things may stop the shuttle call - if(!force) - if(emergency_shuttle.deny_shuttle) - user << "[boss_short] does not currently have a shuttle available in your sector. Please try again later." - return - - if(deathsquad.deployed == 1) - user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." - return - - if(world.time < 54000) // 30 minute grace period to let the game get going - user << "The shuttle is refueling. Please wait another [round((54000-world.time)/60)] minutes before trying again." - return - - if(ticker.mode.auto_recall_shuttle) - //New version pretends to call the shuttle but cause the shuttle to return after a random duration. - emergency_shuttle.auto_recall = 1 - - if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic") - user << "Under directive 7-10, [station_name()] is quarantined until further notice." - return - - emergency_shuttle.call_transfer() - - //delay events in case of an autotransfer - if (isnull(user)) - event_manager.delay_events(EVENT_LEVEL_MODERATE, 10200) //17 minutes - event_manager.delay_events(EVENT_LEVEL_MAJOR, 10200) - - log_game("[user? key_name(user) : "Autotransfer"] has called the shuttle.") - message_admins("[user? key_name_admin(user) : "Autotransfer"] has called the shuttle.", 1) - - return diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index f72546c0385..7a148346986 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -17,7 +17,7 @@ //obj/machinery/vr_sleeper/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) -/datum/computer_file/program/computerconfig/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) +/datum/computer_file/program/computerconfig/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) @@ -38,7 +38,7 @@ var/list/data = list() - data = program.get_header_data() + data = get_header_data() var/list/hardware = movable.get_all_components() diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index 26d8b81f755..2cb5a09aa98 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -7,139 +7,138 @@ requires_ntnet = 0 available_on_ntnet = 0 undeletable = 1 - nanomodule_path = /datum/nano_module/program/computer_filemanager/ var/open_file var/error -/datum/computer_file/program/filemanager/ui_act(href, href_list) +/datum/computer_file/program/filemanager/ui_act(action, params) if(..()) return 1 - if(href_list["PRG_openfile"]) - . = 1 - open_file = href_list["PRG_openfile"] - if(href_list["PRG_newtextfile"]) - . = 1 - var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename")) - if(!newname) - return 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/data/F = new/datum/computer_file/data() - F.filename = newname - F.filetype = "TXT" - HDD.store_file(F) - if(href_list["PRG_deletefile"]) - . = 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_deletefile"]) - if(!file || file.undeletable) - return 1 - HDD.remove_file(file) - if(href_list["PRG_usbdeletefile"]) - . = 1 - var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.portable_drive - if(!RHDD) - return 1 - var/datum/computer_file/file = RHDD.find_file_by_name(href_list["PRG_usbdeletefile"]) - if(!file || file.undeletable) - return 1 - RHDD.remove_file(file) - if(href_list["PRG_closefile"]) - . = 1 - open_file = null - error = null - if(href_list["PRG_clone"]) - . = 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_clone"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(1) - HDD.store_file(C) - if(href_list["PRG_rename"]) - . = 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_rename"]) - if(!file || !istype(file)) - return 1 - var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename)) - if(file && newname) - file.filename = newname - if(href_list["PRG_edit"]) - . = 1 - if(!open_file) - return 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) - if(!F || !istype(F)) - return 1 - if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) - return 1 - // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. - var/newtext = sanitize(html_decode(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", F.stored_data) as message|null), 16384) - if(!newtext) - return - if(F) - var/datum/computer_file/data/backup = F.clone() - HDD.remove_file(F) - F.stored_data = newtext - F.calculate_size() - // We can't store the updated file, it's probably too large. Print an error and restore backed up version. - // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space. - // They will be able to copy-paste the text from error screen and store it in notepad or something. - if(!HDD.store_file(F)) - error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:

    [F.stored_data]

    " - HDD.store_file(backup) - if(href_list["PRG_printfile"]) - . = 1 - if(!open_file) - return 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) - if(!F || !istype(F)) - return 1 - if(!computer.nano_printer) - error = "Missing Hardware: Your computer does not have required hardware to complete this operation." - return 1 - if(!computer.nano_printer.print_text(parse_tags(F.stored_data))) - error = "Hardware error: Printer was unable to print the file. It may be out of paper." - return 1 - if(href_list["PRG_copytousb"]) - . = 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive - if(!HDD || !RHDD) - return 1 - var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_copytousb"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(0) - RHDD.store_file(C) - if(href_list["PRG_copyfromusb"]) - . = 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive - if(!HDD || !RHDD) - return 1 - var/datum/computer_file/F = RHDD.find_file_by_name(href_list["PRG_copyfromusb"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(0) - HDD.store_file(C) - if(.) - nanomanager.update_uis(NM) + switch(action) + if("PRG_openfile") + . = 1 + open_file = params["name"] + if("PRG_newtextfile") + . = 1 + var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename")) + if(!newname) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = new/datum/computer_file/data() + F.filename = newname + F.filetype = "TXT" + HDD.store_file(F) + if("PRG_deletefile") + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) + if(!file || file.undeletable) + return 1 + HDD.remove_file(file) + if("PRG_usbdeletefile") + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.portable_drive + if(!RHDD) + return 1 + var/datum/computer_file/file = RHDD.find_file_by_name(params["name"]) + if(!file || file.undeletable) + return 1 + RHDD.remove_file(file) + if("PRG_closefile") + . = 1 + open_file = null + error = null + if("PRG_clone") + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(params["name"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(1) + HDD.store_file(C) + if("PRG_rename") + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) + if(!file || !istype(file)) + return 1 + var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename)) + if(file && newname) + file.filename = newname + if("PRG_edit") + . = 1 + if(!open_file) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) + if(!F || !istype(F)) + return 1 + if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) + return 1 + // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. + var/newtext = sanitize(html_decode(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", F.stored_data) as message|null), 16384) + if(!newtext) + return + if(F) + var/datum/computer_file/data/backup = F.clone() + HDD.remove_file(F) + F.stored_data = newtext + F.calculate_size() + // We can't store the updated file, it's probably too large. Print an error and restore backed up version. + // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space. + // They will be able to copy-paste the text from error screen and store it in notepad or something. + if(!HDD.store_file(F)) + error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:

    [F.stored_data]

    " + HDD.store_file(backup) + if("PRG_printfile") + . = 1 + if(!open_file) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) + if(!F || !istype(F)) + return 1 + if(!computer.nano_printer) + error = "Missing Hardware: Your computer does not have required hardware to complete this operation." + return 1 + if(!computer.nano_printer.print_text(parse_tags(F.stored_data))) + error = "Hardware error: Printer was unable to print the file. It may be out of paper." + return 1 + if("PRG_copytousb") + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive + if(!HDD || !RHDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(params) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(0) + RHDD.store_file(C) + if("PRG_copyfromusb") + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive + if(!HDD || !RHDD) + return 1 + var/datum/computer_file/F = RHDD.find_file_by_name(params) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(0) + HDD.store_file(C) + /datum/computer_file/program/filemanager/proc/parse_tags(var/t) t = replacetext(t, "\[center\]", "
    ") @@ -151,8 +150,8 @@ t = replacetext(t, "\[/i\]", "") t = replacetext(t, "\[u\]", "") t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[time\]", "[stationtime2text()]") - t = replacetext(t, "\[date\]", "[stationdate2text()]") + t = replacetext(t, "\[time\]", "[worldtime2text()]") + t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [year_integer+540]") t = replacetext(t, "\[large\]", "") t = replacetext(t, "\[/large\]", "") t = replacetext(t, "\[h1\]", "

    ") @@ -179,37 +178,40 @@ return t -/datum/nano_module/program/computer_filemanager - name = "NTOS File Manager" +/datum/computer_file/program/filemanager/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) -/datum/nano_module/program/computer_filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - var/list/data = host.initial_data() - var/datum/computer_file/program/filemanager/PRG - PRG = program + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) + ui = new(user, src, ui_key, "file_manager", "NTOS File Manage", 575, 700, state = state) + ui.open() + ui.set_autoupdate(state = 1) + +/datum/computer_file/program/filemanager/ui_data(mob/user) + var/list/data = get_header_data() var/obj/item/weapon/computer_hardware/hard_drive/HDD var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD - if(PRG.error) - data["error"] = PRG.error - if(PRG.open_file) + if(error) + data["error"] = error + if(open_file) var/datum/computer_file/data/file - if(!PRG.computer || !PRG.computer.hard_drive) + if(!computer || !computer.hard_drive) data["error"] = "I/O ERROR: Unable to access hard drive." else - HDD = PRG.computer.hard_drive - file = HDD.find_file_by_name(PRG.open_file) + HDD = computer.hard_drive + file = HDD.find_file_by_name(open_file) if(!istype(file)) data["error"] = "I/O ERROR: Unable to open file." else - data["filedata"] = PRG.parse_tags(file.stored_data) + data["filedata"] = parse_tags(file.stored_data) data["filename"] = "[file.filename].[file.filetype]" else - if(!PRG.computer || !PRG.computer.hard_drive) + if(!computer || !computer.hard_drive) data["error"] = "I/O ERROR: Unable to access hard drive." else - HDD = PRG.computer.hard_drive - RHDD = PRG.computer.portable_drive + HDD = computer.hard_drive + RHDD = computer.portable_drive var/list/files[0] for(var/datum/computer_file/F in HDD.stored_files) files.Add(list(list( @@ -231,11 +233,4 @@ ))) data["usbfiles"] = usbfiles - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - - + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/news_browser.dm b/code/modules/modular_computers/file_system/programs/news_browser.dm deleted file mode 100644 index 2fe58ee6348..00000000000 --- a/code/modules/modular_computers/file_system/programs/news_browser.dm +++ /dev/null @@ -1,120 +0,0 @@ -/datum/computer_file/program/newsbrowser - filename = "newsbrowser" - filedesc = "NTNet/ExoNet News Browser" - extended_desc = "This program may be used to view and download news articles from the network." - program_icon_state = "generic" - size = 8 - requires_ntnet = 1 - available_on_ntnet = 1 - - nanomodule_path = /datum/nano_module/program/computer_newsbrowser/ - var/datum/computer_file/data/news_article/loaded_article - var/download_progress = 0 - var/download_netspeed = 0 - var/downloading = 0 - var/message = "" - -/datum/computer_file/program/newsbrowser/process_tick() - if(!downloading) - return - download_netspeed = 0 - // Speed defines are found in misc.dm - switch(ntnet_status) - if(1) - download_netspeed = NTNETSPEED_LOWSIGNAL - if(2) - download_netspeed = NTNETSPEED_HIGHSIGNAL - if(3) - download_netspeed = NTNETSPEED_ETHERNET - download_progress += download_netspeed - if(download_progress >= loaded_article.size) - downloading = 0 - requires_ntnet = 0 // Turn off NTNet requirement as we already loaded the file into local memory. - nanomanager.update_uis(NM) - -/datum/computer_file/program/newsbrowser/kill_program() - ..() - requires_ntnet = 1 - loaded_article = null - download_progress = 0 - downloading = 0 - -/datum/computer_file/program/newsbrowser/Topic(href, href_list) - if(..()) - return 1 - if(href_list["PRG_openarticle"]) - . = 1 - if(downloading || loaded_article) - return 1 - - for(var/datum/computer_file/data/news_article/N in ntnet_global.available_news) - if(N.uid == text2num(href_list["PRG_openarticle"])) - loaded_article = N.clone() - downloading = 1 - break - if(href_list["PRG_reset"]) - . = 1 - downloading = 0 - download_progress = 0 - requires_ntnet = 1 - loaded_article = null - if(href_list["PRG_clearmessage"]) - . = 1 - message = "" - if(href_list["PRG_savearticle"]) - . = 1 - if(downloading || !loaded_article) - return - - var/savename = sanitize(input(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename)) - if(!savename) - return 1 - var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive - if(!HDD) - return 1 - var/datum/computer_file/data/news_article/N = loaded_article.clone() - N.filename = savename - HDD.store_file(N) - if(.) - nanomanager.update_uis(NM) - - -/datum/nano_module/program/computer_newsbrowser - name = "NTNet/ExoNet News Browser" - -/datum/nano_module/program/computer_newsbrowser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - - var/datum/computer_file/program/newsbrowser/PRG - var/list/data = list() - if(program) - data = program.get_header_data() - PRG = program - else - return - - data["message"] = PRG.message - if(PRG.loaded_article && !PRG.downloading) // Viewing an article. - data["title"] = PRG.loaded_article.filename - data["article"] = PRG.loaded_article.stored_data - else if(PRG.downloading) // Downloading an article. - data["download_running"] = 1 - data["download_progress"] = PRG.download_progress - data["download_maxprogress"] = PRG.loaded_article.size - data["download_rate"] = PRG.download_netspeed - else // Viewing list of articles - var/list/all_articles[0] - for(var/datum/computer_file/data/news_article/F in ntnet_global.available_news) - all_articles.Add(list(list( - "name" = F.filename, - "size" = F.size, - "uid" = F.uid - ))) - data["all_articles"] = all_articles - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "news_browser.tmpl", "NTNet/ExoNet News Browser", 575, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index fc81882fbd7..cdb4a553935 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -103,7 +103,7 @@ //datum/nano_module/program/computer_ntnetdownload // name = "Network Downloader" -/datum/computer_file/program/ntnetdownload/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) +/datum/computer_file/program/ntnetdownload/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 498e2eccf25..8df93e98fc4 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -8,11 +8,7 @@ required_access = access_network available_on_ntnet = 1 -//datum/nano_module/computer_ntnetmonitor -// name = "NTNet Diagnostics and Monitoring" -// available_to_ai = TRUE - -/datum/computer_file/program/ntnetmonitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state) +/datum/computer_file/program/ntnetmonitor/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) @@ -67,12 +63,12 @@ . = 1 if(!ntnet_global) return 1 - ntnet_global.toggle_function(params) + ntnet_global.toggle_function(text2num(params["id"])) /datum/computer_file/program/ntnetmonitor/ui_data(mob/user) if(!ntnet_global) return - var/list/data = list() + var/list/data = get_header_data() data["ntnetstatus"] = ntnet_global.check_function() data["ntnetrelays"] = ntnet_global.relays.len @@ -84,7 +80,10 @@ data["config_communication"] = ntnet_global.setting_communication data["config_systemcontrol"] = ntnet_global.setting_systemcontrol - data["ntnetlogs"] = ntnet_global.logs + data["ntnetlogs"] = list() + + for(var/i in ntnet_global.logs) + data["ntnetlogs"] += list(list("entry" = i)) data["ntnetmaxlogs"] = ntnet_global.setting_maxlogcount return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index c609fa86bcb..4d3fcc17b2e 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -9,7 +9,6 @@ network_destination = "NTNRC server" ui_header = "ntnrc_idle.gif" available_on_ntnet = 1 - nanomodule_path = /datum/nano_module/program/computer_chatclient/ var/last_message = null // Used to generate the toolbar icon var/username var/datum/ntnet_conversation/channel = null @@ -19,143 +18,144 @@ /datum/computer_file/program/chatclient/New() username = "DefaultUser[rand(100, 999)]" -/datum/computer_file/program/chatclient/Topic(href, href_list) +/datum/computer_file/program/chatclient/ui_act(action, params) if(..()) return 1 - if(href_list["PRG_speak"]) - . = 1 - if(!channel) - return 1 - var/mob/living/user = usr - var/message = sanitize(input(user, "Enter message or leave blank to cancel: ")) - if(!message || !channel) - return - channel.add_message(message, username) - - if(href_list["PRG_joinchannel"]) - . = 1 - var/datum/ntnet_conversation/C - for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) - if(chan.id == text2num(href_list["PRG_joinchannel"])) - C = chan - break - - if(!C) - return 1 - - if(netadmin_mode) - channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others. - return 1 - - if(C.password) - var/mob/living/user = usr - var/password = sanitize(input(user,"Access Denied. Enter password:")) - if(C && (password == C.password)) - C.add_client(src) - channel = C - return 1 - C.add_client(src) - channel = C - if(href_list["PRG_leavechannel"]) - . = 1 - if(channel) - channel.remove_client(src) - channel = null - if(href_list["PRG_newchannel"]) - . = 1 - var/mob/living/user = usr - var/channel_title = sanitize(input(user,"Enter channel name or leave blank to cancel:")) - if(!channel_title) - return - var/datum/ntnet_conversation/C = new/datum/ntnet_conversation() - C.add_client(src) - C.operator = src - channel = C - C.title = channel_title - if(href_list["PRG_toggleadmin"]) - . = 1 - if(netadmin_mode) - netadmin_mode = 0 - if(channel) - channel.remove_client(src) // We shouldn't be in channel's user list, but just in case... - channel = null - return 1 - var/mob/living/user = usr - if(can_run(usr, 1, access_network)) - if(channel) - var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No") - if(response == "Yes") - if(channel) - channel.remove_client(src) - channel = null - else - return - netadmin_mode = 1 - if(href_list["PRG_changename"]) - . = 1 - var/mob/living/user = usr - var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:")) - if(!newname) - return 1 - if(channel) - channel.add_status_message("[username] is now known as [newname].") - username = newname - - if(href_list["PRG_savelog"]) - . = 1 - if(!channel) - return - var/mob/living/user = usr - var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:") - if(!logname || !channel) - return 1 - var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() - // Now we will generate HTML-compliant file that can actually be viewed/printed. - logfile.filename = logname - logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]" - for(var/logstring in channel.messages) - logfile.stored_data += "[logstring]\[BR\]" - logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]" - logfile.calculate_size() - if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(logfile)) - if(!computer) - // This program shouldn't even be runnable without computer. - CRASH("Var computer is null!") + switch(action) + if("PRG_speak") + . = 1 + if(!channel) return 1 - if(!computer.hard_drive) - computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.") - else // In 99.9% cases this will mean our HDD is full - computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.") - if(href_list["PRG_renamechannel"]) - . = 1 - if(!operator_mode || !channel) - return 1 - var/mob/living/user = usr - var/newname = sanitize(input(user, "Enter new channel name or leave blank to cancel:")) - if(!newname || !channel) - return - channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.") - channel.title = newname - if(href_list["PRG_deletechannel"]) - . = 1 - if(channel && ((channel.operator == src) || netadmin_mode)) - qdel(channel) + var/mob/living/user = usr + var/message = sanitize(input(user, "Enter message or leave blank to cancel: ")) + if(!message || !channel) + return + channel.add_message(message, username) + + if("PRG_joinchannel") + . = 1 + var/datum/ntnet_conversation/C + for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) + if(chan.id == text2num(params["id"])) + C = chan + break + + if(!C) + return 1 + + if(netadmin_mode) + channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others. + return 1 + + if(C.password) + var/mob/living/user = usr + var/password = sanitize(input(user,"Access Denied. Enter password:")) + if(C && (password == C.password)) + C.add_client(src) + channel = C + return 1 + C.add_client(src) + channel = C + if("PRG_leavechannel") + . = 1 + if(channel) + channel.remove_client(src) channel = null - if(href_list["PRG_setpassword"]) - . = 1 - if(!channel || ((channel.operator != src) && !netadmin_mode)) - return 1 + if("PRG_newchannel") + . = 1 + var/mob/living/user = usr + var/channel_title = sanitize(input(user,"Enter channel name or leave blank to cancel:")) + if(!channel_title) + return + var/datum/ntnet_conversation/C = new/datum/ntnet_conversation() + C.add_client(src) + C.operator = src + channel = C + C.title = channel_title + if("PRG_toggleadmin") + . = 1 + if(netadmin_mode) + netadmin_mode = 0 + if(channel) + channel.remove_client(src) // We shouldn't be in channel's user list, but just in case... + channel = null + return 1 + var/mob/living/user = usr + if(can_run(usr, 1, access_network)) + if(channel) + var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No") + if(response == "Yes") + if(channel) + channel.remove_client(src) + channel = null + else + return + netadmin_mode = 1 + if("PRG_changename") + . = 1 + var/mob/living/user = usr + var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:")) + if(!newname) + return 1 + if(channel) + channel.add_status_message("[username] is now known as [newname].") + username = newname - var/mob/living/user = usr - var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:")) - if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode)) - return 1 + if("PRG_savelog") + . = 1 + if(!channel) + return + var/mob/living/user = usr + var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:") + if(!logname || !channel) + return 1 + var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() + // Now we will generate HTML-compliant file that can actually be viewed/printed. + logfile.filename = logname + logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]" + for(var/logstring in channel.messages) + logfile.stored_data += "[logstring]\[BR\]" + logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]" + logfile.calculate_size() + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(logfile)) + if(!computer) + // This program shouldn't even be runnable without computer. + CRASH("Var computer is null!") + return 1 + if(!computer.hard_drive) + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.") + else // In 99.9% cases this will mean our HDD is full + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.") + if("PRG_renamechannel") + . = 1 + if(!operator_mode || !channel) + return 1 + var/mob/living/user = usr + var/newname = sanitize(input(user, "Enter new channel name or leave blank to cancel:")) + if(!newname || !channel) + return + channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.") + channel.title = newname + if("PRG_deletechannel") + . = 1 + if(channel && ((channel.operator == src) || netadmin_mode)) + qdel(channel) + channel = null + if("PRG_setpassword") + . = 1 + if(!channel || ((channel.operator != src) && !netadmin_mode)) + return 1 - if(newpassword == "nopassword") - channel.password = "" - else - channel.password = newpassword + var/mob/living/user = usr + var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:")) + if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode)) + return 1 + + if(newpassword == "nopassword") + channel.password = "" + else + channel.password = newpassword /datum/computer_file/program/chatclient/process_tick() ..() @@ -172,44 +172,47 @@ else ui_header = "ntnrc_idle.gif" -/datum/computer_file/program/chatclient/kill_program(var/forced = 0) +/datum/computer_file/program/chatclient/kill_program(forced = 0) if(channel) channel.remove_client(src) channel = null ..(forced) -/datum/nano_module/program/computer_chatclient - name = "NTNet Relay Chat Client" +/datum/computer_file/program/chatclient/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) -/datum/nano_module/program/computer_chatclient/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_chat", "NTNet Relay Chat Client", 575, 700, state = state) + ui.open() + ui.set_autoupdate(state = 1) + + +/datum/computer_file/program/chatclient/ui_data(mob/user) if(!ntnet_global || !ntnet_global.chat_channels) return var/list/data = list() - if(program) - data = program.get_header_data() - var/datum/computer_file/program/chatclient/C = program - if(!istype(C)) - return + data = get_header_data() - data["adminmode"] = C.netadmin_mode - if(C.channel) - data["title"] = C.channel.title + + data["adminmode"] = netadmin_mode + if(channel) + data["title"] = channel.title var/list/messages[0] - for(var/M in C.channel.messages) + for(var/M in channel.messages) messages.Add(list(list( "msg" = M ))) data["messages"] = messages var/list/clients[0] - for(var/datum/computer_file/program/chatclient/cl in C.channel.clients) + for(var/datum/computer_file/program/chatclient/cl in channel.clients) clients.Add(list(list( "name" = cl.username ))) data["clients"] = clients - C.operator_mode = (C.channel.operator == C) ? 1 : 0 - data["is_operator"] = C.operator_mode || C.netadmin_mode + operator_mode = (channel.operator == src) ? 1 : 0 + data["is_operator"] = operator_mode || netadmin_mode else // Channel selection screen var/list/all_channels[0] @@ -221,10 +224,4 @@ ))) data["all_channels"] = all_channels - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "ntnet_chat.tmpl", "NTNet Relay Chat Client", 575, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm index 5bd76726aaa..2e863d744c0 100644 --- a/code/modules/modular_computers/file_system/programs/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm @@ -10,7 +10,6 @@ var/global/nttransfer_uid = 0 requires_ntnet_feature = NTNET_PEERTOPEER network_destination = "other device via P2P tunnel" available_on_ntnet = 1 - nanomodule_path = /datum/nano_module/program/computer_nttransfer/ var/error = "" // Error screen var/server_password = "" // Optional password to download the file. @@ -55,8 +54,6 @@ var/global/nttransfer_uid = 0 downloaded_file = null ..(forced) - - /datum/computer_file/program/nttransfer/proc/update_netspeed() download_netspeed = 0 switch(ntnet_status) @@ -87,35 +84,88 @@ var/global/nttransfer_uid = 0 download_completion = 0 -/datum/nano_module/program/computer_nttransfer - name = "NTNet P2P Transfer Client" +/datum/computer_file/program/nttransfer/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) -/datum/nano_module/program/computer_nttransfer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - if(!program) - return - var/datum/computer_file/program/nttransfer/PRG = program - if(!istype(PRG)) - return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_transfer", "NTNet P2P Transfer Client", 575, 700, state = state) + ui.open() + ui.set_autoupdate(state = 1) - var/list/data = program.get_header_data() +/datum/computer_file/program/nttransfer/ui_act(action, params) + if(..()) + return 1 + switch(action) + if("PRG_downloadfile") + for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers) + if("[P.unique_token]" == params["id"]) + remote = P + break + if(!remote || !remote.provided_file) + return + if(remote.server_password) + var/pass = sanitize(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) + if(pass != remote.server_password) + error = "Incorrect Password" + return + downloaded_file = remote.provided_file.clone() + remote.connected_clients.Add(src) + return 1 + if("PRG_reset") + error = "" + upload_menu = 0 + finalize_download() + if(src in ntnet_global.fileservers) + ntnet_global.fileservers.Remove(src) + for(var/datum/computer_file/program/nttransfer/T in connected_clients) + T.crash_download("Remote server has forcibly closed the connection") + provided_file = null + return 1 + if("PRG_setpassword") + var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) + if(!pass) + return + if(pass == "none") + server_password = "" + return + server_password = pass + return 1 + if("PRG_uploadfile") + for(var/datum/computer_file/F in computer.hard_drive.stored_files) + if("[F.uid]" == params["id"]) + if(F.unsendable) + error = "I/O Error: File locked." + return + provided_file = F + ntnet_global.fileservers.Add(src) + return + error = "I/O Error: Unable to locate file on hard drive." + return 1 + if("PRG_uploadmenu") + upload_menu = 1 - if(PRG.error) - data["error"] = PRG.error - else if(PRG.downloaded_file) + +/datum/computer_file/program/nttransfer/ui_data(mob/user) + + var/list/data = get_header_data() + + if(error) + data["error"] = error + else if(downloaded_file) data["downloading"] = 1 - data["download_size"] = PRG.downloaded_file.size - data["download_progress"] = PRG.download_completion - data["download_netspeed"] = PRG.actual_netspeed - data["download_name"] = "[PRG.downloaded_file.filename].[PRG.downloaded_file.filetype]" - else if (PRG.provided_file) + data["download_size"] = downloaded_file.size + data["download_progress"] = download_completion + data["download_netspeed"] = actual_netspeed + data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]" + else if (provided_file) data["uploading"] = 1 - data["upload_uid"] = PRG.unique_token - data["upload_clients"] = PRG.connected_clients.len - data["upload_haspassword"] = PRG.server_password ? 1 : 0 - data["upload_filename"] = "[PRG.provided_file.filename].[PRG.provided_file.filetype]" - else if (PRG.upload_menu) + data["upload_uid"] = unique_token + data["upload_clients"] = connected_clients.len + data["upload_haspassword"] = server_password ? 1 : 0 + data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]" + else if (upload_menu) var/list/all_files[0] - for(var/datum/computer_file/F in PRG.computer.hard_drive.stored_files) + for(var/datum/computer_file/F in computer.hard_drive.stored_files) all_files.Add(list(list( "uid" = F.uid, "filename" = "[F.filename].[F.filetype]", @@ -133,62 +183,4 @@ var/global/nttransfer_uid = 0 ))) data["servers"] = all_servers - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "ntnet_transfer.tmpl", "NTNet P2P Transfer Client", 575, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/datum/computer_file/program/nttransfer/Topic(href, href_list) - if(..()) - return 1 - if(href_list["PRG_downloadfile"]) - for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers) - if("[P.unique_token]" == href_list["PRG_downloadfile"]) - remote = P - break - if(!remote || !remote.provided_file) - return - if(remote.server_password) - var/pass = sanitize(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) - if(pass != remote.server_password) - error = "Incorrect Password" - return - downloaded_file = remote.provided_file.clone() - remote.connected_clients.Add(src) - return 1 - if(href_list["PRG_reset"]) - error = "" - upload_menu = 0 - finalize_download() - if(src in ntnet_global.fileservers) - ntnet_global.fileservers.Remove(src) - for(var/datum/computer_file/program/nttransfer/T in connected_clients) - T.crash_download("Remote server has forcibly closed the connection") - provided_file = null - return 1 - if(href_list["PRG_setpassword"]) - var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) - if(!pass) - return - if(pass == "none") - server_password = "" - return - server_password = pass - return 1 - if(href_list["PRG_uploadfile"]) - for(var/datum/computer_file/F in computer.hard_drive.stored_files) - if("[F.uid]" == href_list["PRG_uploadfile"]) - if(F.unsendable) - error = "I/O Error: File locked." - return - provided_file = F - ntnet_global.fileservers.Add(src) - return - error = "I/O Error: Unable to locate file on hard drive." - return 1 - if(href_list["PRG_uploadmenu"]) - upload_menu = 1 - return 0 + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm new file mode 100644 index 00000000000..7ec0cbd3b4a --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -0,0 +1,88 @@ + + +/datum/computer_file/program/power_monitor + filename = "powermonitor" + filedesc = "Power Monitoring" + program_icon_state = "power_monitor" + extended_desc = "This program connects to sensors around the station to provide information about electrical systems" + ui_header = "power_norm.gif" + required_access = access_engine + usage_flags = PROGRAM_CONSOLE + requires_ntnet = 0 + network_destination = "power monitoring system" + size = 9 + var/has_alert = 0 + var/obj/structure/cable/attached + var/list/history = list() + var/record_size = 60 + var/record_interval = 50 + var/next_record = 0 + + + + +/datum/computer_file/program/power_monitor/run_program(mob/living/user) + . = ..(user) + search() + history["supply"] = list() + history["demand"] = list() + + +/datum/computer_file/program/power_monitor/process_tick() + if(!attached) + search() + else + record() + +/datum/computer_file/program/power_monitor/proc/search() + var/turf/T = get_turf(computer) + attached = locate() in T + +/datum/computer_file/program/power_monitor/proc/record() + if(world.time >= next_record) + next_record = world.time + record_interval + + var/list/supply = history["supply"] + supply += attached.powernet.viewavail + if(supply.len > record_size) + supply.Cut(1, 2) + + var/list/demand = history["demand"] + demand += attached.powernet.viewload + if(demand.len > record_size) + demand.Cut(1, 2) + +/datum/computer_file/program/power_monitor/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) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "power_monitor_prog", "Power Monitoring", 1200, 1000, master_ui, state) + ui.open() + +/datum/computer_file/program/power_monitor/ui_data() + var/list/data = get_header_data() + data["stored"] = record_size + data["interval"] = record_interval / 10 + data["attached"] = attached ? TRUE : FALSE + if(attached) + data["supply"] = attached.powernet.viewavail + data["demand"] = attached.powernet.viewload + data["history"] = history + + data["areas"] = list() + if(attached) + for(var/obj/machinery/power/terminal/term in attached.powernet.nodes) + var/obj/machinery/power/apc/A = term.master + if(istype(A)) + data["areas"] += list(list( + "name" = A.area.name, + "charge" = A.cell.percent(), + "load" = A.lastused_total, + "charging" = A.charging, + "eqp" = A.equipment, + "lgt" = A.lighting, + "env" = A.environ + )) + + return data + diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index d53975843da..4a74081c687 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -88,7 +88,7 @@ /obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs() store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository -// store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. + store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. // Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm index 4e525cac247..a5ca5456650 100644 --- a/code/modules/modular_computers/hardware/hardware.dm +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -22,6 +22,7 @@ return 1 // Nanopaste. Repair all damage if present for a single unit. var/obj/item/stack/S = W +/* if(istype(S, /obj/item/stack/sheet/glass)) if(!damage) user << "\The [src] doesn't seem to require repairs." @@ -30,6 +31,7 @@ user << "You apply a bit of \the [W] to \the [src]. It immediately repairs all damage." damage = 0 return 1 +*/ // Cable coil. Works as repair method, but will probably require multiple applications and more cable. if(istype(S, /obj/item/stack/cable_coil)) if(!damage) diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index db9c27657f4..a4d1b25f1b9 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -76,16 +76,15 @@ var/global/ntnet_card_uid = 1 return 0 if(holder2) - return 2 -/* + var/turf/T = get_turf(holder2) - if((T && istype(T)) && T.z in using_map.station_levels) + if((T && istype(T)) && T.z == ZLEVEL_STATION) // Computer is on station. Low/High signal depending on what type of network card you have if(long_range) return 2 else return 1 -*/ + if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. return 1 diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm deleted file mode 100644 index 6ae3cda4690..00000000000 --- a/code/modules/modular_computers/laptop_vendor.dm +++ /dev/null @@ -1,296 +0,0 @@ -// A vendor machine for modular computer portable devices - Laptops and Tablets - -/obj/machinery/lapvend - name = "computer vendor" - desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers." - icon = 'icons/obj/vending.dmi' - icon_state = "robotics" - layer = 2.9 - anchored = 1 - density = 1 - - // The actual laptop/tablet - var/obj/machinery/modular_computer/laptop/fabricated_laptop = null - var/obj/item/modular_computer/tablet/fabricated_tablet = null - - // Utility vars - var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen - var/devtype = 0 // 0: None(unselected), 1: Laptop, 2: Tablet - var/total_price = 0 // Price of currently vended device. - - // Device loadout - var/dev_cpu = 1 // 1: Default, 2: Upgraded - var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced - var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced - var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range - var/dev_tesla = 0 // 0: None, 1: Standard (LAPTOP ONLY) - var/dev_nanoprint = 0 // 0: None, 1: Standard - var/dev_card = 0 // 0: None, 1: Standard - -// Removes all traces of old order and allows you to begin configuration from scratch. -/obj/machinery/lapvend/proc/reset_order() - state = 0 - devtype = 0 - if(fabricated_laptop) - qdel(fabricated_laptop) - fabricated_laptop = null - if(fabricated_tablet) - qdel(fabricated_tablet) - fabricated_tablet = null - dev_cpu = 1 - dev_battery = 1 - dev_disk = 1 - dev_netcard = 0 - dev_tesla = 0 - dev_nanoprint = 0 - dev_card = 0 - -// Recalculates the price and optionally even fabricates the device. -/obj/machinery/lapvend/proc/fabricate_and_recalc_price(var/fabricate = 0) - total_price = 0 - if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles - if(fabricate) - fabricated_laptop = new(src) - total_price = 99 - switch(dev_cpu) - if(1) - if(fabricate) - fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_laptop.cpu) - if(2) - if(fabricate) - fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(fabricated_laptop.cpu) - total_price += 299 - switch(dev_battery) - if(1) // Basic(750C) - if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_laptop.cpu) - if(2) // Upgraded(1100C) - if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_laptop.cpu) - total_price += 199 - if(3) // Advanced(1500C) - if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_laptop.cpu) - total_price += 499 - switch(dev_disk) - if(1) // Basic(128GQ) - if(fabricate) - fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive(fabricated_laptop.cpu) - if(2) // Upgraded(256GQ) - if(fabricate) - fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/advanced(fabricated_laptop.cpu) - total_price += 99 - if(3) // Advanced(512GQ) - if(fabricate) - fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(fabricated_laptop.cpu) - total_price += 299 - switch(dev_netcard) - if(1) // Basic(Short-Range) - if(fabricate) - fabricated_laptop.cpu.network_card = new/obj/item/weapon/computer_hardware/network_card(fabricated_laptop.cpu) - total_price += 99 - if(2) // Advanced (Long Range) - if(fabricate) - fabricated_laptop.cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(fabricated_laptop.cpu) - total_price += 299 - if(dev_tesla) - total_price += 399 - if(fabricate) - fabricated_laptop.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(fabricated_laptop) - if(dev_nanoprint) - total_price += 99 - if(fabricate) - fabricated_laptop.cpu.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(fabricated_laptop.cpu) - if(dev_card) - total_price += 199 - if(fabricate) - fabricated_laptop.cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_laptop.cpu) - - return total_price - else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. - if(fabricate) - fabricated_tablet = new(src) - fabricated_tablet.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_tablet) - total_price = 199 - switch(dev_battery) - if(1) // Basic(300C) - if(fabricate) - fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module/nano(fabricated_tablet) - if(2) // Upgraded(500C) - if(fabricate) - fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module/micro(fabricated_tablet) - total_price += 199 - if(3) // Advanced(750C) - if(fabricate) - fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_tablet) - total_price += 499 - switch(dev_disk) - if(1) // Basic(32GQ) - if(fabricate) - fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(fabricated_tablet) - if(2) // Upgraded(64GQ) - if(fabricate) - fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(fabricated_tablet) - total_price += 99 - if(3) // Advanced(128GQ) - if(fabricate) - fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive(fabricated_tablet) - total_price += 299 - switch(dev_netcard) - if(1) // Basic(Short-Range) - if(fabricate) - fabricated_tablet.network_card = new/obj/item/weapon/computer_hardware/network_card(fabricated_tablet) - total_price += 99 - if(2) // Advanced (Long Range) - if(fabricate) - fabricated_tablet.network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(fabricated_tablet) - total_price += 299 - if(dev_nanoprint) - total_price += 99 - if(fabricate) - fabricated_tablet.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(fabricated_tablet) - if(dev_card) - total_price += 199 - if(fabricate) - fabricated_tablet.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_tablet) - return total_price - return 0 - - - - - -/obj/machinery/lapvend/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["pick_device"]) - if(state) // We've already picked a device type - return 0 - devtype = text2num(href_list["pick_device"]) - state = 1 - fabricate_and_recalc_price(0) - return 1 - if(href_list["clean_order"]) - reset_order() - return 1 - if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode - return 0 - if(href_list["confirm_order"]) - state = 2 // Wait for ID swipe for payment processing - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_cpu"]) - dev_cpu = text2num(href_list["hw_cpu"]) - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_battery"]) - dev_battery = text2num(href_list["hw_battery"]) - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_disk"]) - dev_disk = text2num(href_list["hw_disk"]) - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_netcard"]) - dev_netcard = text2num(href_list["hw_netcard"]) - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_tesla"]) - dev_tesla = text2num(href_list["hw_tesla"]) - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_nanoprint"]) - dev_nanoprint = text2num(href_list["hw_nanoprint"]) - fabricate_and_recalc_price(0) - return 1 - if(href_list["hw_card"]) - dev_card = text2num(href_list["hw_card"]) - fabricate_and_recalc_price(0) - return 1 - return 0 - -/obj/machinery/lapvend/attack_hand(var/mob/user) - ui_interact(user) - -/obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(stat & (BROKEN | NOPOWER | MAINT)) - if(ui) - ui.close() - return 0 - - var/list/data[0] - data["state"] = state - data["devtype"] = devtype - data["hw_battery"] = dev_battery - data["hw_disk"] = dev_disk - data["hw_netcard"] = dev_netcard - data["hw_tesla"] = dev_tesla - data["hw_nanoprint"] = dev_nanoprint - data["hw_card"] = dev_card - data["hw_cpu"] = dev_cpu - data["totalprice"] = "[total_price]" - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "computer_fabricator.tmpl", "Personal Computer Vendor", 500, 400) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - - -obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) - var/obj/item/weapon/card/id/I = W.GetID() - // Awaiting payment state - if(state == 2) - if(process_payment(I,W)) - fabricate_and_recalc_price(1) - if((devtype == 1) && fabricated_laptop) - fabricated_laptop.cpu.battery_module.charge_to_full() - fabricated_laptop.forceMove(src.loc) - fabricated_laptop.close_laptop() - fabricated_laptop = null - else if((devtype == 2) && fabricated_tablet) - fabricated_tablet.battery_module.charge_to_full() - fabricated_tablet.forceMove(src.loc) - fabricated_tablet = null - ping("Enjoy your new product!") - state = 3 - return 1 - return 0 - return ..() - - -// Simplified payment processing, returns 1 on success. -/obj/machinery/lapvend/proc/process_payment(var/obj/item/weapon/card/id/I, var/obj/item/ID_container) - if(I==ID_container || ID_container == null) - visible_message("\The [usr] swipes \the [I] through \the [src].") - else - visible_message("\The [usr] swipes \the [ID_container] through \the [src].") - var/datum/money_account/customer_account = get_account(I.associated_account_number) - if (!customer_account || customer_account.suspended) - ping("Connection error. Unable to connect to account.") - return 0 - - if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) - - if(!customer_account) - ping("Unable to access account: incorrect credentials.") - return 0 - - if(total_price > customer_account.money) - ping("Insufficient funds in account.") - return 0 - else - customer_account.money -= total_price - var/datum/transaction/T = new() - T.target_name = "Computer Manufacturer (via [src.name])" - T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]." - T.amount = total_price - T.source_terminal = src.name - T.date = current_date_string - T.time = stationtime2text() - customer_account.transaction_log.Add(T) - return 1 \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index d57ab3136fa..0f984328612 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1527,11 +1527,16 @@ #include "code\modules\modular_computers\file_system\data.dm" #include "code\modules\modular_computers\file_system\program.dm" #include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\_program.dm" +#include "code\modules\modular_computers\file_system\programs\alarm.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\file_browser.dm" #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\powermonitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" #include "code\modules\modular_computers\hardware\battery_module.dm" #include "code\modules\modular_computers\hardware\card_slot.dm" #include "code\modules\modular_computers\hardware\hard_drive.dm" @@ -1543,6 +1548,7 @@ #include "code\modules\modular_computers\hardware\tesla_link.dm" #include "code\modules\modular_computers\NTNet\NTNet.dm" #include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" #include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\admin_ninja_verbs.dm" #include "code\modules\ninja\energy_katana.dm" diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 7aa508866fb..ea7ae8a4094 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,14 +1,15 @@ -require=function t(e,n,r){function a(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[o]={exports:{}};e[o][0].call(p.exports,function(t){var n=e[o][1][t];return a(n?n:t)},p,p.exports,t,e,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?c[2]:void 0,l=Math.min((void 0===p?o:a(p,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),a=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=i(e.length),o=arguments,s=o.length,u=a(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,p=void 0===c?n:a(c,n);p>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),a=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),p=i(o,c);if(t&&n!=n){for(;c>p;)if(s=u[p++],s!=s)return!0}else for(;c>p;p++)if((t||p in u)&&u[p]===n)return t||p;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),a=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,p=6==t,l=5==t||p;return function(f,d,h){for(var m,v,g=i(f),b=a(g),y=r(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(c)return!1;return p?-1:u||c?c:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),a=t(36),i=t(83)("species");e.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),a=t(83)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[a])?n:i?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),a=t(31),i=t(60),o=t(17),s=t(69),u=t(18),c=t(27),p=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";a(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,a){var p=t(function(t,i){s(t,p,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&c(i,n,t[a],t)});return i(p.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var r=n.n,a=n.p;delete e._i[n.i],n.r=!0,a&&(a.n=r),r&&(r.p=a),e._f==n&&(e._f=r),e._l==n&&(e._l=a),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&r.setDesc(p.prototype,"size",{get:function(){return u(this[b])}}),p},def:function(t,e,n){var r,a,i=_(t,e);return i?i.v=n:(t._l=i={i:a=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[b]++,"F"!==a&&(t._i[a]=i)),t},getEntry:_,setStrong:function(t,e,n){p(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),a=t(10);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),a=t(60),i=t(4),o=t(38),s=t(69),u=t(27),c=t(8),p=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var i=t(function(t,a){s(t,i,e),t._i=m++,t._l=void 0,void 0!=a&&u(a,n,t[r],t)});return a(i.prototype,{"delete":function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(p(e,l)||r(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),a=t(22),i=t(61),o=t(60),s=t(27),u=t(69),c=t(38),p=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!p(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=p(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,a(a.G+a.W+a.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),a=t(29).document,i=r(a)&&r(a.createElement);e.exports=function(t){return i?a.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var a,i=n(t),o=r.isEnum,s=0;i.length>s;)o.call(t,a=i[s++])&&e.push(a);return e}},{46:46}],22:[function(t,e,n){var r=t(29),a=t(16),i=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var p,l,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?a:a[e]||(a[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(p in n)l=!h&&y&&p in y,f=(l?y:n)[p],d=b&&l?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,p,f),x[p]!=f&&i(x,p,d),g&&_[p]!=f&&(_[p]=f)};r.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(a){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),a=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(a(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),a=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var p,l,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(p=s(t.length);p>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)a(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),a=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),a=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),a=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||i[a]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),a=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&a(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),a=t(11),i=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==a(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&r(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),a=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:a(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),a=t(22),i=t(61),o=t(31),s=t(30),u=t(45),c=t(41),p=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){c(n,e,b);var w,k,E=function(t){if(!d&&t in O)return O[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",C=y==v,P=!1,O=t.prototype,A=O[f]||O[h]||y&&O[y],T=A||E(y);if(A){var M=l(T.call(new t));p(M,S,!0),!r&&s(O,h)&&o(M,f,g),C&&A.name!==v&&(P=!0,T=function(){return A.call(this)})}if(r&&!_||!d&&!P&&O[f]||o(O,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in O||i(O,k,w[k]);else a(a.P+a.F*(d||P),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),a=!1;try{var i=[7][r]();i["return"]=function(){a=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!a)return!1;var n=!1;try{var i=[7],o=i[r]();o.next=function(){return{done:n=!0}},i[r]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),a=t(78);e.exports=function(t,e){for(var n,i=a(t),o=r.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,a,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,p=o.Promise,l="process"==t(11)(c),f=function(){var t,e,n;for(l&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;a=void 0,t&&t.enter()};if(l)i=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=p&&p.resolve?function(){p.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&c.domain};a&&(a.next=e),r||(r=e,i()),a=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),a=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=a})?function(t,e){for(var n=a(t),o=arguments,s=o.length,u=1,c=r.getKeys,p=r.getSymbols,l=r.isEnum;s>u;)for(var f,d=i(o[u++]),h=p?c(d).concat(p(d)):c(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),a=t(16),i=t(24);e.exports=function(t,e){var n=(a.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),a=t(78),i=r.isEnum;e.exports=function(t){return function(e){for(var n,o=a(e),s=r.getKeys(o),u=s.length,c=0,p=[];u>c;)i.call(o,n=s[c++])&&p.push(t?[n,o[n]]:o[n]);return p}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),a=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=r.getNames(a(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),a=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,i=this,o=arguments,c=o.length,p=0,l=0;if(!u&&!c)return a(t,n,i);if(r=n.slice(),u)for(;e>p;p++)r[p]===s&&(r[p]=o[l++]);for(;c>l;)r.push(o[l++]);return a(t,r,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),a=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||a(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||a(n,"name",e)),t===r?t[e]=n:(o||delete t[e],a(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,a=t(38),i=t(4),o=function(t,e){if(i(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),a=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];i&&e&&!e[o]&&a.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,a=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),a="__core-js_shared__",i=r[a]||(r[a]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),a=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[i])?e:a(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),a=t(18);e.exports=function(t){return function(e,n){var i,o,s=a(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),a=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return a(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),a=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,c=void 0===n?" ":n+"",p=r(e);if(u>=p)return s;""==c&&(c=" ");var l=p-u,f=a.call(c,Math.ceil(l/c.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),a=t(18);e.exports=function(t){var e=a(this)+"",n="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),a=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),p=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=a(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(p,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var r,a,i,o=t(17),s=t(33),u=t(32),c=t(20),p=t(29),l=p.process,f=p.setImmediate,d=p.clearImmediate,h=p.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?r=function(t){l.nextTick(o(b,t,1))}:h?(a=new h,i=a.port2,a.port1.onmessage=y,r=o(i.postMessage,i,1)):p.addEventListener&&"function"==typeof postMessage&&!p.importScripts?(r=function(t){p.postMessage(t+"","*")},p.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),a=Math.max,i=Math.min;e.exports=function(t,e){return t=r(t),0>t?a(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,a=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?a:r)(t)}},{}],78:[function(t,e,n){var r=t(34),a=t(18);e.exports=function(t){return r(a(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),a=Math.min;e.exports=function(t){return t>0?a(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,a;if(e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;if("function"==typeof(n=t.valueOf)&&!r(a=n.call(t)))return a;if(!e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,a=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+a).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),a=t(82),i=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||a)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),a=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[a]||t["@@iterator"]||i[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,a=t(46),i=t(22),o=t(19),s=t(59),u=t(32),c=t(20),p=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),C=Object.prototype,P=Array.prototype,O=P.slice,A=P.join,T=a.setDesc,M=a.getDesc,j=a.setDescs,L={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),a.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},a.getDesc=function(t,e){if(r)try{return M(t,e)}catch(n){}return p(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},a.setDescs=j=function(t,e){h(t);for(var n,r=a.getKeys(e),i=r.length,o=0;i>o;)a.setDesc(t,n=r[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:a.getDesc,defineProperty:a.setDesc,defineProperties:j});var N="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),R=N.concat("length","prototype"),F=N.length,D=function(){var t,e=c("iframe"),n=F,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" - +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.
    diff --git a/tgui/src/interfaces/ntnet_chat.ract b/tgui/src/interfaces/ntnet_chat.ract new file mode 100644 index 00000000000..65420867924 --- /dev/null +++ b/tgui/src/interfaces/ntnet_chat.ract @@ -0,0 +1,103 @@ + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + {{#if data.adminmode}} +

    ADMINISTRATIVE MODE

    + {{/if}} + + {{#if data.title}} +
    + Current channel: +
    +
    + {{data.title}} +
    +
    + Operator access: +
    +
    + {{#if data.is_operator}} + Enabled + {{else}} + Disabled + {{/if}} +
    +
    + Controls: +
    +
    + +
    Send message +
    Change nickname +
    Toggle administration mode +
    Leave channel +
    Save log to local drive + {{#if data.is_operator}} +
    Rename channel +
    Set password +
    Delete channel + {{/if}} +
    +
    + Chat Window +
    +
    +
    + {{#each data.messages}} + {{msg}}
    + {{/each}} +
    +
    +
    + Connected Users
    + {{#each data.clients}} + {{name}}
    + {{/each}} + {{else}} + Controls: + +
    Change nickname +
    New Channel +
    Toggle administration mode +
    + Available channels: + + {{#each data.all_channels}} +
    {{id}}
    + {{/each}} +
    + {{/if}} +
    \ No newline at end of file diff --git a/tgui/src/interfaces/ntnet_dos.ract b/tgui/src/interfaces/ntnet_dos.ract index b34ec6c40c1..afff153814d 100644 --- a/tgui/src/interfaces/ntnet_dos.ract +++ b/tgui/src/interfaces/ntnet_dos.ract @@ -1,27 +1,58 @@ - +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    {{#if data.error}} ##SYSTEM ERROR: {{data.error}}RESET + {{elseif data.target}} + ##DoS traffic generator active. Tx: {{data.speed}}GQ/s
    + {{#each data.dos_strings}} + {{nums}}
    + {{/each}} + ABORT {{else}} - {{#if data.target}} - ##DoS traffic generator active. Tx: {{data.speed}}GQ/s
    - {{#each data.dos_strings}} - {{value}}
    - {{/each}} - ABORT + ##DoS traffic generator ready. Select target device.
    + {{#if data.focus}} + Targeted device ID: {{data.focus}} {{else}} - ##DoS traffic generator ready. Select target device.
    - {{#if data.focus}} - Targeted device ID: {{data.focus}} - {{else}} - Targeted device ID: None - {{/if}} - EXECUTE
    - Detected devices on network:
    - {{#each data.relays}} - {{value}} - {{/each}} + Targeted device ID: None {{/if}} + EXECUTE
    + Detected devices on network:
    + {{#each data.relays}} + {{id}} + {{/each}} {{/if}}
    diff --git a/tgui/src/interfaces/ntnet_downloader.ract b/tgui/src/interfaces/ntnet_downloader.ract index 1c7f4a3324c..da100b50e5a 100644 --- a/tgui/src/interfaces/ntnet_downloader.ract +++ b/tgui/src/interfaces/ntnet_downloader.ract @@ -1,42 +1,40 @@ - - -
    -
    - - {{#if data.PC_batteryicon && data.PC_showbatteryicon}} -
    - {{/if}} - {{#if data.PC_batterypercent && data.PC_showbatteryicon}} - {{data.PC_batterypercent}} - {{/if}} - {{#if data.PC_ntneticon}} - - {{/if}} - {{#if data.PC_apclinkicon}} - - {{/if}} - {{#if data.PC_stationtime}} - {{data.PC_stationtime}} - {{/if}} - {{#each data.PC_programheaders}} - - {{/each}} -
    -
    -
    -
    +
    +
    -
    Shutdown - {{#if data.PC_showexitprogram}} - EXIT PROGRAM - Minimize Program - {{/if}} + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} + + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}}
    -
    - +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + Welcome to software download utility. Please select which software you wish to download.
    {{#if data.error}} @@ -79,7 +77,7 @@ {{#each data.downloadable_programs}} - {{value.filename}} ({{size}} GQ) + {{filename}} ({{size}} GQ) {{filedesc}} diff --git a/tgui/src/interfaces/ntnet_monitor.ract b/tgui/src/interfaces/ntnet_monitor.ract index 4c01db1f73e..67943650afe 100644 --- a/tgui/src/interfaces/ntnet_monitor.ract +++ b/tgui/src/interfaces/ntnet_monitor.ract @@ -69,19 +69,19 @@ Software Downloads {{data.config_softwaredownload ? 'ENABLED' : 'DISABLED'}} - TOGGLE + TOGGLE Peer to Peer Traffic {{data.config_peertopeer ? 'ENABLED' : 'DISABLED'}} - TOGGLE + TOGGLE Communication Systems {{data.config_communication ? 'ENABLED' : 'DISABLED'}} - TOGGLE + TOGGLE Remote System Control {{data.config_systemcontrol ? 'ENABLED' : 'DISABLED'}} - TOGGLE + TOGGLE @@ -116,7 +116,7 @@
    {{#each data.ntnetlogs}} - {{value}}
    + {{entry}}
    {{/each}}
    diff --git a/tgui/src/interfaces/nt_relay.ract b/tgui/src/interfaces/ntnet_relay.ract similarity index 100% rename from tgui/src/interfaces/nt_relay.ract rename to tgui/src/interfaces/ntnet_relay.ract diff --git a/tgui/src/interfaces/ntnet_transfer.ract b/tgui/src/interfaces/ntnet_transfer.ract new file mode 100644 index 00000000000..f0c499f8de0 --- /dev/null +++ b/tgui/src/interfaces/ntnet_transfer.ract @@ -0,0 +1,136 @@ + + + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + {{#if data.error}} +
    +

    An error has occured during operation...

    + Additional information: {{data.error}}
    + Clear +
    + {{elseif data.downloading}} +

    Download in progress...

    +
    + Downloaded file: +
    +
    + {{data.download_name}} +
    +
    + Download progress: +
    +
    + {{data.download_progress}} / {{data.download_size}} GQ +
    +
    + Transfer speed: +
    +
    + {{data.download_netspeed}}GQ/s +
    +
    + Controls: +
    +
    + Abort download +
    + {{elseif data.uploading}} +

    Server enabled

    +
    + Connected clients: +
    +
    + {{data.upload_clients}} +
    +
    + Provided file: +
    +
    + {{data.upload_filename}} +
    +
    + Server password: +
    +
    + {{#if data.haspassword}} + ENABLED + {{else}} + DISABLED + {{/if}} +
    +
    + Commands: +
    +
    + Set password + Exit server +
    + {{elseif data.upload_filelist}} +

    File transfer server ready. Select file to upload:

    + +
    File nameFile sizeControls + {{#each data.upload_filelist}} +
    {{filename}} + {{size}}GQ + Select + {{/each}} +
    +
    + Set password + Return + {{else}} +

    Available files:

    +
    Server UIDFile NameFile SizePassword ProtectionOperations + {{#each data.servers}} +
    {{uid}} + {{filename}} + {{size}}GQ + {{#if haspassword}} + Enabled + {{/if}} + {{#if !haspassword}} + Disabled + {{/if}} + + Download + {{/each}} +
    +
    + Send file + {{/if}} + + \ No newline at end of file diff --git a/tgui/src/interfaces/power_monitor_prog.ract b/tgui/src/interfaces/power_monitor_prog.ract new file mode 100644 index 00000000000..ba40f27ec07 --- /dev/null +++ b/tgui/src/interfaces/power_monitor_prog.ract @@ -0,0 +1,112 @@ + + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + + {{#if config.fancy}} + + {{else}} + + {{data.supply}} W + + + {{data.demand}} W + + {{/if}} + + + +
    Area
    +
    Charge
    +
    Load
    +
    Status
    +
    Equipment
    +
    Lighting
    +
    Environment
    +
    + {{#each data.areas}} + +
    {{Math.round(adata.areas[@index].charge)}} %
    +
    {{Math.round(adata.areas[@index].load)}} W
    +
    {{chargingMode(charging)}}
    +
    {{channelPower(eqp)}} [{{channelMode(eqp)}}]
    +
    {{channelPower(lgt)}} [{{channelMode(lgt)}}]
    +
    {{channelPower(env)}} [{{channelMode(env)}}]
    +
    + {{/each}} +
    \ No newline at end of file diff --git a/tgui/src/interfaces/revelation.ract b/tgui/src/interfaces/revelation.ract new file mode 100644 index 00000000000..50f2489facb --- /dev/null +++ b/tgui/src/interfaces/revelation.ract @@ -0,0 +1,60 @@ + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + + +
    +
    + Payload status: +
    +
    + {{#if data.armed}} + ARMED + {{else}} + DISARMED + {{/if}} +
    +
    + Controls: +
    +
    + +
    OBFUSCATE PROGRAM NAME +
    {{data.armed ? "DISARM" : "ARM"}} + ACTIVATE +
    +
    +
    +
    \ No newline at end of file diff --git a/tgui/src/interfaces/station_alert_prog.ract b/tgui/src/interfaces/station_alert_prog.ract new file mode 100644 index 00000000000..5ba78cdb91e --- /dev/null +++ b/tgui/src/interfaces/station_alert_prog.ract @@ -0,0 +1,47 @@ + +
    +
    + + {{#if data.PC_batteryicon && data.PC_showbatteryicon}} +
    + {{/if}} + {{#if data.PC_batterypercent && data.PC_showbatteryicon}} + {{data.PC_batterypercent}} + {{/if}} + {{#if data.PC_ntneticon}} + + {{/if}} + {{#if data.PC_apclinkicon}} + + {{/if}} + {{#if data.PC_stationtime}} + {{data.PC_stationtime}} + {{/if}} + {{#each data.PC_programheaders}} + + {{/each}} +
    +
    +
    +
    + +
    Shutdown + {{#if data.PC_showexitprogram}} + EXIT PROGRAM + Minimize Program + {{/if}} +
    +
    +
    + +{{#each data.alarms:class}} + +
      + {{#each .}} +
    • {{.}}
    • + {{else}} +
    • System Nominal
    • + {{/each}} +
    +
    +{{/each}} \ No newline at end of file From fb0034ff485e6f3c80577c6ee93a26cf1836a3e9 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Fri, 5 Aug 2016 23:14:51 -0700 Subject: [PATCH 08/21] Fix access. --- .../computers/machinery/console_presets.dm | 13 ++++++++ .../modular_computers/file_system/program.dm | 33 +++++++++++-------- .../file_system/programs/card.dm | 12 ++++--- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 26410e6794c..ca2c0811737 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -22,6 +22,7 @@ return + // ===== ENGINEERING CONSOLE ===== /obj/machinery/modular_computer/console/preset/engineering console_department = "Engineering" @@ -41,6 +42,18 @@ cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + +// ===== COMMAND CONSOLE ===== +/obj/machinery/modular_computer/console/preset/command + console_department = "Command" + desc = "A stationary computer. This one comes preloaded with command programs." + _has_id_slot = 1 + _has_printer = 1 + +/obj/machinery/modular_computer/console/preset/command/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) +// cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) + // ===== CIVILIAN CONSOLE ===== /obj/machinery/modular_computer/console/preset/civilian console_department = "Civilian" diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 66cd8f91f4d..e4f1a50da6b 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -19,7 +19,7 @@ var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! - var/datum/computer_file/program/program = null + /datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) ..() if(comp && istype(comp)) @@ -68,7 +68,7 @@ return 1 // Check if the user can run program. Only humans can operate computer. Automatically called in run_program() -// User has to wear their ID or have it inhand for ID Scan to work. +// User has to wear their ID for ID Scan to work. // Can also be called manually, with optional parameter being access_to_check to scan the user's ID /datum/computer_file/program/proc/can_run(mob/living/user, loud = 0, access_to_check) // Defaults to required_access @@ -77,19 +77,24 @@ if(!access_to_check) // No required_access, allow it. return 1 - - var/obj/item/weapon/card/id/I = user.GetID() - if(!I) - if(loud) - user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." - return 0 - - if(access_to_check in I.GetAccess) + if(issilicon(user)) return 1 - else if(loud) - user << "\The [computer] flashes an \"Access Denied\" warning." -// This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones + if(ishuman(user)) + var/mob/living/carbon/human/h = user + var/obj/item/weapon/card/id/I = h.get_idcard() + if(!I) + if(loud) + user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." + return 0 + + if(access_to_check in I.GetAccess()) + return 1 + else if(loud) + user << "\The [computer] flashes an \"Access Denied\" warning." + return 0 + +// This attempts to retrieve header data for UIs. If implementing completely new device of different type than existing ones // always include the device here in this proc. This proc basically relays the request to whatever is running the program. /datum/computer_file/program/proc/get_header_data() if(computer) @@ -114,7 +119,7 @@ return 1 // This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. -// It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. + /datum/computer_file/program/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) if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. return computer.ui_interact(user) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 0ee48b2474c..6e955174531 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -1,12 +1,14 @@ /datum/computer_file/program/card_mod filename = "cardmod" filedesc = "ID card modification program" - nanomodule_path = /datum/nano_module/program/card_mod program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." required_access = access_change_ids requires_ntnet = 0 size = 8 + var/mod_mode = 1 + var/is_centcom = 0 + var/show_assignments = 0 /datum/nano_module/program/card_mod name = "ID card modification program" @@ -15,7 +17,7 @@ var/show_assignments = 0 /datum/nano_module/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - var/list/data = host.initial_data() + var/list/data = get_header_data() data["src"] = "\ref[src]" data["station_name"] = station_name() @@ -87,7 +89,7 @@ ui.set_initial_data(data) ui.open() -/datum/nano_module/program/card_mod/proc/format_jobs(list/jobs) +/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card var/list/formatted = list() for(var/job in jobs) @@ -98,11 +100,11 @@ return formatted -/datum/nano_module/program/card_mod/proc/get_accesses(var/is_centcom = 0) +/datum/computer_file/program/card_mod/proc/get_accesses(var/is_centcom = 0) return null -/datum/computer_file/program/card_mod/Topic(href, href_list) +/datum/computer_file/program/card_mod/ui_act(action params) if(..()) return 1 From 4ebeec67d6aa8f28833ebee8bf9cc8ba456c3340 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sat, 6 Aug 2016 23:05:05 -0700 Subject: [PATCH 09/21] Adds header icons Does some fixes and cleanup Some consoles added to the map and tablets added to job loadouts for testmerging. --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 6 +- code/game/machinery/recharger.dm | 10 ++- .../items/stacks/sheets/sheet_types.dm | 1 + code/modules/client/asset_cache.dm | 30 +++++++ code/modules/jobs/job_types/assistant.dm | 2 + code/modules/jobs/job_types/captain.dm | 4 +- code/modules/jobs/job_types/cargo_service.dm | 8 +- code/modules/jobs/job_types/civilian.dm | 6 +- .../jobs/job_types/civilian_chaplain.dm | 1 + code/modules/jobs/job_types/engineering.dm | 4 +- code/modules/jobs/job_types/medical.dm | 6 +- code/modules/jobs/job_types/science.dm | 4 +- code/modules/jobs/job_types/security.dm | 8 +- .../NTNet/NTNRC/conversation.dm | 7 +- code/modules/modular_computers/NTNet/NTNet.dm | 46 ++++++----- .../modular_computers/NTNet/NTNet_relay.dm | 27 +----- .../computers/item/modular_computer.dm | 70 +++++++++------- .../computers/item/processor.dm | 17 ++-- .../computers/item/tablet_presets.dm | 4 +- .../computers/machinery/modular_computer.dm | 17 ++-- .../file_system/computer_file.dm | 2 +- .../modular_computers/file_system/program.dm | 10 +-- .../file_system/programs/antagonist/dos.dm | 1 - .../file_system/programs/card.dm | 77 ++++++++++++++++-- .../file_system/programs/configurator.dm | 12 +-- .../file_system/programs/file_browser.dm | 6 +- .../file_system/programs/ntdownloader.dm | 22 +++-- .../file_system/programs/ntmonitor.dm | 5 ++ .../file_system/programs/ntnrc_client.dm | 12 ++- .../file_system/programs/nttransfer.dm | 7 +- .../file_system/programs/powermonitor.dm | 5 ++ .../hardware/network_card.dm | 2 +- icons/program_icons/alarm_green.gif | Bin 0 -> 107 bytes icons/program_icons/alarm_red.gif | Bin 0 -> 163 bytes icons/program_icons/batt_100.gif | Bin 0 -> 173 bytes icons/program_icons/batt_20.gif | Bin 0 -> 284 bytes icons/program_icons/batt_40.gif | Bin 0 -> 185 bytes icons/program_icons/batt_5.gif | Bin 0 -> 273 bytes icons/program_icons/batt_60.gif | Bin 0 -> 166 bytes icons/program_icons/batt_80.gif | Bin 0 -> 172 bytes icons/program_icons/charging.gif | Bin 0 -> 160 bytes icons/program_icons/downloader_finished.gif | Bin 0 -> 130 bytes icons/program_icons/downloader_running.gif | Bin 0 -> 574 bytes icons/program_icons/ntnrc_idle.gif | Bin 0 -> 113 bytes icons/program_icons/ntnrc_new.gif | Bin 0 -> 181 bytes icons/program_icons/power_norm.gif | Bin 0 -> 431 bytes icons/program_icons/power_warn.gif | Bin 0 -> 485 bytes icons/program_icons/sig_high.gif | Bin 0 -> 182 bytes icons/program_icons/sig_lan.gif | Bin 0 -> 191 bytes icons/program_icons/sig_low.gif | Bin 0 -> 179 bytes icons/program_icons/sig_none.gif | Bin 0 -> 202 bytes 51 files changed, 282 insertions(+), 157 deletions(-) create mode 100644 icons/program_icons/alarm_green.gif create mode 100644 icons/program_icons/alarm_red.gif create mode 100644 icons/program_icons/batt_100.gif create mode 100644 icons/program_icons/batt_20.gif create mode 100644 icons/program_icons/batt_40.gif create mode 100644 icons/program_icons/batt_5.gif create mode 100644 icons/program_icons/batt_60.gif create mode 100644 icons/program_icons/batt_80.gif create mode 100644 icons/program_icons/charging.gif create mode 100644 icons/program_icons/downloader_finished.gif create mode 100644 icons/program_icons/downloader_running.gif create mode 100644 icons/program_icons/ntnrc_idle.gif create mode 100644 icons/program_icons/ntnrc_new.gif create mode 100644 icons/program_icons/power_norm.gif create mode 100644 icons/program_icons/power_warn.gif create mode 100644 icons/program_icons/sig_high.gif create mode 100644 icons/program_icons/sig_lan.gif create mode 100644 icons/program_icons/sig_low.gif create mode 100644 icons/program_icons/sig_none.gif diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 753df9896f2..4d23903abfa 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -35139,6 +35139,7 @@ }, /area/crew_quarters/hor) "bzN" = ( +/obj/machinery/modular_computer/console/preset/research, /turf/open/floor/plasteel/warnwhite{ dir = 6 }, @@ -47471,6 +47472,7 @@ /obj/machinery/power/terminal{ dir = 4 }, +/obj/machinery/ntnet_relay, /turf/open/floor/bluegrid{ name = "Mainframe Base"; initial_gas_mix = "n2=100;TEMP=80" @@ -49066,13 +49068,11 @@ /turf/open/floor/plating, /area/maintenance/aft) "cdk" = ( -/obj/machinery/computer/monitor{ - name = "primary power monitoring console" - }, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/obj/machinery/modular_computer/console/preset/engineering, /turf/open/floor/plasteel, /area/engine/engineering) "cdl" = ( diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 2a4b37d4fd4..0e267848fe6 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -36,7 +36,7 @@ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) return - if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G, /obj/item/ammo_box/magazine/recharge)) + if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G, /obj/item/ammo_box/magazine/recharge) || istype(G, /obj/item/weapon/computer_hardware/battery_module)) if(anchored) if(charging || panel_open) return 1 @@ -127,6 +127,14 @@ use_power(200 * recharge_coeff) using_power = 1 + if(istype(charging, /obj/item/weapon/gun/energy)) + var/obj/item/weapon/computer_hardware/battery_module/B = charging + if(B.battery) + if(B.battery.charge < B.battery.maxcharge) + B.battery.give(B.battery.chargerate * recharge_coeff) + use_power(200 * recharge_coeff) + using_power = 1 + update_icon(using_power) /obj/machinery/recharger/power_change() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 95a6e9909f7..980f9b8c882 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -30,6 +30,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = 1, on_floor = 1), \ +/* new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = 1, on_floor = 1), \*/ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \ diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index ca83278c923..5ee5114ce07 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -179,6 +179,36 @@ You can set verify to TRUE if you want send() to sleep until the client has the "tgui.js" = 'tgui/assets/tgui.js' ) +/datum/asset/simple/headers + assets = list( + "alarm_green.gif" = 'icons/program_icons/alarm_green.gif', + "alarm_red.gif" = 'icons/program_icons/alarm_red.gif', + "batt_5.gif" = 'icons/program_icons/batt_5.gif', + "batt_20.gif" = 'icons/program_icons/batt_20.gif', + "batt_40.gif" = 'icons/program_icons/batt_40.gif', + "batt_60.gif" = 'icons/program_icons/batt_60.gif', + "batt_80.gif" = 'icons/program_icons/batt_80.gif', + "batt_100.gif" = 'icons/program_icons/batt_100.gif', + "charging.gif" = 'icons/program_icons/charging.gif', + "downloader_finished.gif" = 'icons/program_icons/downloader_finished.gif', + "downloader_running.gif" = 'icons/program_icons/downloader_running.gif', + "ntnrc_idle.gif" = 'icons/program_icons/ntnrc_idle.gif', + "ntnrc_new.gif" = 'icons/program_icons/ntnrc_new.gif', + "power_norm.gif" = 'icons/program_icons/power_norm.gif', + "power_warn.gif" = 'icons/program_icons/power_warn.gif', + "sig_high.gif" = 'icons/program_icons/sig_high.gif', + "sig_low.gif" = 'icons/program_icons/sig_low.gif', + "sig_lan.gif" = 'icons/program_icons/sig_lan.gif', + "sig_none.gif" = 'icons/program_icons/sig_none.gif', + ) + + + + + + + + /datum/asset/simple/pda assets = list( "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png', diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 9a1822fad7e..13686960cdc 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -14,6 +14,7 @@ Assistant minimal_access = list() //See /datum/job/assistant/get_access() outfit = /datum/outfit/job/assistant + /datum/job/assistant/get_access() if((config.jobs_have_maint_access & ASSISTANTS_HAVE_MAINT_ACCESS) || !config.jobs_have_minimal_access) //Config has assistant maint access set . = ..() @@ -31,6 +32,7 @@ Assistant /datum/outfit/job/assistant name = "Assistant" + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H) ..() diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index b605a977be8..e1987dbdd30 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -35,7 +35,7 @@ Captain suit = /obj/item/clothing/suit/armor/vest/capcarapace shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/caphat - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/station_charter=1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/station_charter=1, /obj/item/modular_computer/tablet/preset/advanced = 1) backpack = /obj/item/weapon/storage/backpack/captain satchel = /obj/item/weapon/storage/backpack/satchel/cap @@ -99,7 +99,7 @@ Head of Personnel shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/hopcap backpack_contents = list(/obj/item/weapon/storage/box/ids=1,\ - /obj/item/weapon/melee/classic_baton/telescopic=1) + /obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) /datum/outfit/job/hop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 6cc148adfbd..1ab91a61d11 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -26,6 +26,7 @@ Quartermaster shoes = /obj/item/clothing/shoes/sneakers/brown glasses = /obj/item/clothing/glasses/sunglasses l_hand = /obj/item/weapon/clipboard + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /* Cargo Technician @@ -52,6 +53,7 @@ Cargo Technician belt = /obj/item/device/pda/cargo ears = /obj/item/device/radio/headset/headset_cargo uniform = /obj/item/clothing/under/rank/cargotech + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /* @@ -92,6 +94,7 @@ Shaft Miner satchel = /obj/item/weapon/storage/backpack/satchel/explorer dufflebag = /obj/item/weapon/storage/backpack/dufflebag box = /obj/item/weapon/storage/box/survival_mining + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /* Bartender @@ -121,7 +124,7 @@ Bartender ears = /obj/item/device/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/bartender suit = /obj/item/clothing/suit/armor/vest - backpack_contents = list(/obj/item/weapon/storage/box/beanbag=1) + backpack_contents = list(/obj/item/weapon/storage/box/beanbag=1,/obj/item/modular_computer/tablet/preset/cheap=1) shoes = /obj/item/clothing/shoes/laceup /* @@ -152,6 +155,7 @@ Cook uniform = /obj/item/clothing/under/rank/chef suit = /obj/item/clothing/suit/toggle/chef head = /obj/item/clothing/head/chefhat + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H) ..() @@ -200,6 +204,7 @@ Botanist backpack = /obj/item/weapon/storage/backpack/botany satchel = /obj/item/weapon/storage/backpack/satchel/hyd + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /* @@ -228,3 +233,4 @@ Janitor belt = /obj/item/device/pda/janitor ears = /obj/item/device/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/janitor + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index faa6818ec73..5a2071b1404 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -31,7 +31,8 @@ Clown /obj/item/weapon/reagent_containers/spray/waterflower = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, /obj/item/device/megaphone/clown = 1, - /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1 + /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1, + /obj/item/modular_computer/tablet/preset/advanced = 1 ) backpack = /obj/item/weapon/storage/backpack/clown @@ -88,7 +89,7 @@ Mime head = /obj/item/clothing/head/beret suit = /obj/item/clothing/suit/suspenders backpack_contents = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing=1,\ - /obj/item/toy/crayon/mime=1) + /obj/item/toy/crayon/mime=1,/obj/item/modular_computer/tablet/preset/cheap = 1) backpack = /obj/item/weapon/storage/backpack/mime satchel = /obj/item/weapon/storage/backpack/mime @@ -165,6 +166,7 @@ Lawyer shoes = /obj/item/clothing/shoes/laceup l_hand = /obj/item/weapon/storage/briefcase/lawyer l_pocket = /obj/item/device/laser_pointer + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index 9eaedeb2552..2bb570bcdcc 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -26,6 +26,7 @@ Chaplain backpack_contents = list(/obj/item/device/camera/spooky = 1) backpack = /obj/item/weapon/storage/backpack/cultpack satchel = /obj/item/weapon/storage/backpack/cultpack + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /datum/outfit/job/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index 77bac526440..033288a82e2 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -36,7 +36,7 @@ Chief Engineer shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/hardhat/white gloves = /obj/item/clothing/gloves/color/black/ce - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/modular_computer/tablet/preset/advanced = 1) backpack = /obj/item/weapon/storage/backpack/industrial satchel = /obj/item/weapon/storage/backpack/satchel/eng @@ -85,6 +85,7 @@ Station Engineer r_pocket = /obj/item/device/t_scanner backpack = /obj/item/weapon/storage/backpack/industrial + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) satchel = /obj/item/weapon/storage/backpack/satchel/eng dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering box = /obj/item/weapon/storage/box/engineer @@ -122,5 +123,6 @@ Atmospheric Technician backpack = /obj/item/weapon/storage/backpack/industrial satchel = /obj/item/weapon/storage/backpack/satchel/eng dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) box = /obj/item/weapon/storage/box/engineer pda_slot = slot_l_store \ No newline at end of file diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 1e1b2d71311..0c3f477f232 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -34,7 +34,7 @@ Chief Medical Officer suit = /obj/item/clothing/suit/toggle/labcoat/cmo l_hand = /obj/item/weapon/storage/firstaid/regular suit_store = /obj/item/device/flashlight/pen - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/weapon/storage/backpack/medic satchel = /obj/item/weapon/storage/backpack/satchel/med @@ -81,6 +81,7 @@ Medical Doctor backpack = /obj/item/weapon/storage/backpack/medic satchel = /obj/item/weapon/storage/backpack/satchel/med dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Chemist @@ -114,6 +115,7 @@ Chemist backpack = /obj/item/weapon/storage/backpack/chemistry satchel = /obj/item/weapon/storage/backpack/satchel/chem dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Geneticist @@ -147,6 +149,7 @@ Geneticist backpack = /obj/item/weapon/storage/backpack/genetics satchel = /obj/item/weapon/storage/backpack/satchel/gen dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Virologist @@ -181,3 +184,4 @@ Virologist backpack = /obj/item/weapon/storage/backpack/virology satchel = /obj/item/weapon/storage/backpack/satchel/vir dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index fa163abbf8c..1ecf799a4ab 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -38,7 +38,7 @@ Research Director suit = /obj/item/clothing/suit/toggle/labcoat l_hand = /obj/item/weapon/clipboard l_pocket = /obj/item/device/laser_pointer - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/weapon/storage/backpack/science satchel = /obj/item/weapon/storage/backpack/satchel/tox @@ -81,6 +81,7 @@ Scientist backpack = /obj/item/weapon/storage/backpack/science satchel = /obj/item/weapon/storage/backpack/satchel/tox + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Roboticist @@ -112,5 +113,6 @@ Roboticist backpack = /obj/item/weapon/storage/backpack/science satchel = /obj/item/weapon/storage/backpack/satchel/tox + backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) pda_slot = slot_l_store diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index ec5b4a2db64..c683c233741 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -46,7 +46,7 @@ Head of Security suit_store = /obj/item/weapon/gun/energy/gun r_pocket = /obj/item/device/assembly/flash/handheld l_pocket = /obj/item/weapon/restraints/handcuffs - backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1) + backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1, /obj/item/modular_computer/tablet/preset/advanced = 1) backpack = /obj/item/weapon/storage/backpack/security satchel = /obj/item/weapon/storage/backpack/satchel/sec @@ -104,7 +104,7 @@ Warden r_pocket = /obj/item/device/assembly/flash/handheld l_pocket = /obj/item/weapon/restraints/handcuffs suit_store = /obj/item/weapon/gun/energy/gun/advtaser - backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1) + backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1,/obj/item/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/weapon/storage/backpack/security satchel = /obj/item/weapon/storage/backpack/satchel/sec @@ -158,7 +158,7 @@ Detective backpack_contents = list(/obj/item/weapon/storage/box/evidence=1,\ /obj/item/device/detective_scanner=1,\ /obj/item/weapon/melee/classic_baton=1,\ - /obj/item/weapon/reagent_containers/food/drinks/flask/det) + /obj/item/weapon/reagent_containers/food/drinks/flask/det=1,/obj/item/modular_computer/tablet/preset/cheap=1) mask = /obj/item/clothing/mask/cigarette /datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -214,7 +214,7 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science") l_pocket = /obj/item/weapon/restraints/handcuffs r_pocket = /obj/item/device/assembly/flash/handheld suit_store = /obj/item/weapon/gun/energy/gun/advtaser - backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1) + backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1,/obj/item/modular_computer/tablet/preset/advanced = 1) backpack = /obj/item/weapon/storage/backpack/security satchel = /obj/item/weapon/storage/backpack/satchel/sec diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index a3310dec696..fad69527bb3 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -1,4 +1,4 @@ -var/global/ntnrc_uid = 0 +var/global/static/ntnrc_uid = 0 /datum/ntnet_conversation/ var/id = null @@ -27,10 +27,7 @@ var/global/ntnrc_uid = 0 /datum/ntnet_conversation/proc/trim_message_list() if(messages.len <= 50) return - for(var/message in messages) - messages -= message - if(messages <= 50) - return + messages = messages.Copy(messages.len-50 ,0) /datum/ntnet_conversation/proc/add_client(var/datum/computer_file/program/chatclient/C) if(!istype(C)) diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm index d1d67403d9e..498bd206b7f 100644 --- a/code/modules/modular_computers/NTNet/NTNet.dm +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -35,7 +35,7 @@ var/global/datum/ntnet/ntnet_global = new() add_log("NTNet logging system activated.") // Simplified logging: Adds a log. log_string is mandatory parameter, source is optional. -/datum/ntnet/proc/add_log(var/log_string, var/obj/item/weapon/computer_hardware/network_card/source = null) +/datum/ntnet/proc/add_log(log_string, obj/item/weapon/computer_hardware/network_card/source = null) var/log_text = "[worldtime2text()] - " if(source) log_text += "[source.get_network_tag()] - " @@ -44,23 +44,22 @@ var/global/datum/ntnet/ntnet_global = new() log_text += log_string logs.Add(log_text) + + // We have too many logs, remove the oldest entries until we get into the limit if(logs.len > setting_maxlogcount) - // We have too many logs, remove the oldest entries until we get into the limit - for(var/L in logs) - if(logs.len > setting_maxlogcount) - logs.Remove(L) - else - break + logs = logs.Copy(logs.len-setting_maxlogcount,0) + // Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled. -/datum/ntnet/proc/check_function(var/specific_action = 0) +/datum/ntnet/proc/check_function(specific_action = 0) if(!relays || !relays.len) // No relays found. NTNet is down return 0 var/operating = 0 // Check all relays. If we have at least one working relay, network is up. - for(var/obj/machinery/ntnet_relay/R in relays) + for(var/M in relays) + var/obj/machinery/ntnet_relay/R = M if(R.is_operational()) operating = 1 break @@ -68,14 +67,15 @@ var/global/datum/ntnet/ntnet_global = new() if(setting_disabled) return 0 - if(specific_action == NTNET_SOFTWAREDOWNLOAD) - return (operating && setting_softwaredownload) - if(specific_action == NTNET_PEERTOPEER) - return (operating && setting_peertopeer) - if(specific_action == NTNET_COMMUNICATION) - return (operating && setting_communication) - if(specific_action == NTNET_SYSTEMCONTROL) - return (operating && setting_systemcontrol) + switch(specific_action) + if(NTNET_SOFTWAREDOWNLOAD) + return (operating && setting_softwaredownload) + if(NTNET_PEERTOPEER) + return (operating && setting_peertopeer) + if(NTNET_COMMUNICATION) + return (operating && setting_communication) + if(NTNET_SYSTEMCONTROL) + return (operating && setting_systemcontrol) return operating // Builds lists that contain downloadable software. @@ -94,11 +94,13 @@ var/global/datum/ntnet/ntnet_global = new() available_antag_software.Add(prog) // Attempts to find a downloadable file according to filename var -/datum/ntnet/proc/find_ntnet_file_by_name(var/filename) - for(var/datum/computer_file/program/P in available_station_software) +/datum/ntnet/proc/find_ntnet_file_by_name(filename) + for(var/N in available_station_software) + var/datum/computer_file/program/P = N if(filename == P.filename) return P - for(var/datum/computer_file/program/P in available_antag_software) + for(var/N in available_antag_software) + var/datum/computer_file/program/P = N if(filename == P.filename) return P @@ -116,7 +118,7 @@ var/global/datum/ntnet/ntnet_global = new() add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") // Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks. -/datum/ntnet/proc/update_max_log_count(var/lognumber) +/datum/ntnet/proc/update_max_log_count(lognumber) if(!lognumber) return 0 // Trim the value if necessary @@ -124,7 +126,7 @@ var/global/datum/ntnet/ntnet_global = new() setting_maxlogcount = lognumber add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.") -/datum/ntnet/proc/toggle_function(var/function) +/datum/ntnet/proc/toggle_function(function) if(!function) return function = text2num(function) diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 00c6447f7e6..013a4b6a29d 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -91,34 +91,9 @@ -/* - - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if (!ui) - ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300, state = state) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -*/ - -/obj/machinery/ntnet_relay/attack_hand(var/mob/living/user) +/obj/machinery/ntnet_relay/attack_hand(mob/living/user) ui_interact(user) -/* -/obj/machinery/ntnet_relay/Topic(href, href_list) - if(..()) - return 1 - if(href_list["restart"]) - dos_overload = 0 - dos_failure = 0 - update_icon() - ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") - else if(href_list["toggle"]) - enabled = !enabled - ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") - update_icon() -*/ /obj/machinery/ntnet_relay/New() uid = gl_uid gl_uid++ diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index 780484b44a8..a9df960cb5d 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -45,7 +45,6 @@ var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. - var/activetemplate = "computer_main" var/obj/physical = null @@ -97,7 +96,8 @@ if(active_program) active_program.event_idremoved(0) - for(var/datum/computer_file/program/P in idle_threads) + for(var/I in idle_threads) + var/datum/computer_file/program/P = I P.event_idremoved(1) card_slot.stored_card.forceMove(get_turf(src)) @@ -152,7 +152,8 @@ kill_program(1) machines.Remove(src) STOP_PROCESSING(SSmachine, src) - for(var/obj/item/weapon/computer_hardware/CH in src.get_all_components()) + for(var/H in src.get_all_components()) + var/obj/item/weapon/computer_hardware/CH = H uninstall_component(null, CH) qdel(CH) return ..() @@ -162,9 +163,7 @@ overlays.Cut() if(!enabled) - //set_light(0) return - //set_light(light_strength) if(active_program) overlays.Add(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) else @@ -182,10 +181,10 @@ if(ui) ui.close() return 0 -// if((!battery_module || !battery_module.battery.charge) && !check_power_override()) -// if(ui) -// ui.close() -// return 0 + if((!battery_module || !battery_module.battery.charge) && !check_power_override()) + if(ui) + ui.close() + return 0 // If we have an active program switch to it now. if(active_program) @@ -202,9 +201,11 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) -// ui = new(user, src, ui_key, "laptop_mainscreen", "NTOS Main Menu", 400, 500) - ui = new(user, src, ui_key, activetemplate, "Main menu", 400, 500, master_ui, state) -// ui.set_initial_data(data) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + + ui = new(user, src, ui_key, "computer_main", "NTOS Main menu", 400, 500, master_ui, state) ui.open() ui.set_autoupdate(state = 1) @@ -246,7 +247,8 @@ physical.visible_message("\The [src] breaks apart!") var/turf/newloc = get_turf(src) new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2)) - for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + for(var/C in get_all_components()) + var/obj/item/weapon/computer_hardware/H = C uninstall_component(null, H) H.forceMove(newloc) if(prob(25)) @@ -289,7 +291,8 @@ if(active_program && active_program.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature)) // Active program requires NTNet to run but we've just lost connection. Crash. active_program.event_networkfailure(0) - for(var/datum/computer_file/program/P in idle_threads) + for(var/I in idle_threads) + var/datum/computer_file/program/P = I if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) P.event_networkfailure(1) @@ -301,7 +304,8 @@ else active_program = null - for(var/datum/computer_file/program/P in idle_threads) + for(var/I in idle_threads) + var/datum/computer_file/program/P = I if(P.program_state != PROGRAM_STATE_KILLED) P.process_tick() P.ntnet_status = get_ntnet_status() @@ -349,7 +353,8 @@ if(idle_threads.len) var/list/program_headers = list() - for(var/datum/computer_file/program/P in idle_threads) + for(var/I in idle_threads) + var/datum/computer_file/program/P = I if(!P.ui_header) continue program_headers.Add(list(list( @@ -364,7 +369,7 @@ return data // Relays kill program request to currently active program. Use this to quit current program. -/obj/item/modular_computer/proc/kill_program(var/forced = 0) +/obj/item/modular_computer/proc/kill_program(forced = 0) if(active_program) active_program.kill_program(forced) active_program = null @@ -374,18 +379,18 @@ update_icon() // Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) -/obj/item/modular_computer/proc/get_ntnet_status(var/specific_action = 0) +/obj/item/modular_computer/proc/get_ntnet_status(specific_action = 0) if(network_card) return network_card.get_signal(specific_action) else return 0 -/obj/item/modular_computer/proc/add_log(var/text) +/obj/item/modular_computer/proc/add_log(text) if(!get_ntnet_status()) return 0 return ntnet_global.add_log(text, network_card) -/obj/item/modular_computer/proc/shutdown_computer(var/loud = 1) +/obj/item/modular_computer/proc/shutdown_computer(loud = 1) kill_program(1) for(var/datum/computer_file/program/P in idle_threads) P.kill_program(1) @@ -473,12 +478,13 @@ return // Used in following function to reduce copypaste -/obj/item/modular_computer/proc/power_failure(var/malfunction = 0) +/obj/item/modular_computer/proc/power_failure(malfunction = 0) if(enabled) // Shut down the computer physical.visible_message("\The [src]'s screen flickers \"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\" warning as it shuts down unexpectedly.") if(active_program) active_program.event_powerfailure(0) - for(var/datum/computer_file/program/PRG in idle_threads) + for(var/I in idle_threads) + var/datum/computer_file/program/PRG = I PRG.event_powerfailure(1) shutdown_computer(0) @@ -502,7 +508,7 @@ last_power_usage = power_usage -/obj/item/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) +/obj/item/modular_computer/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/card/id)) // ID Card, try to insert it. var/obj/item/weapon/card/id/I = W if(!card_slot) @@ -588,7 +594,7 @@ return // Attempts to install the hardware into apropriate slot. -/obj/item/modular_computer/proc/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0) +/obj/item/modular_computer/proc/try_install_component(mob/living/user, obj/item/weapon/computer_hardware/H, found = 0) // "USB" flash drive. if(istype(H, /obj/item/weapon/computer_hardware/hard_drive/portable)) if(portable_drive) @@ -640,7 +646,7 @@ H.forceMove(src) // Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware. -/obj/item/modular_computer/proc/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0) +/obj/item/modular_computer/proc/uninstall_component(mob/living/user, obj/item/weapon/computer_hardware/H, found = 0, critical = 0) if(portable_drive == H) portable_drive = null found = 1 @@ -677,7 +683,7 @@ // Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null -/obj/item/modular_computer/proc/find_hardware_by_name(var/name) +/obj/item/modular_computer/proc/find_hardware_by_name(name) if(portable_drive && (portable_drive.name == name)) return portable_drive if(hard_drive && (hard_drive.name == name)) @@ -760,17 +766,19 @@ */ -/obj/item/modular_computer/proc/take_damage(var/amount, var/component_probability, var/damage_casing = 1, var/randomize = 1) +/obj/item/modular_computer/proc/take_damage(amount, component_probability, damage_casing = 1, randomize = 1) if(randomize) // 75%-125%, rand() works with integers, apparently. amount *= (rand(75, 125) / 100.0) amount = round(amount) if(damage_casing) damage += amount + damage = max(0,min(max_damage,damage)) // damage = between(0, damage, max_damage) if(component_probability) - for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + for(var/I in get_all_components()) + var/obj/item/weapon/computer_hardware/H = I if(prob(component_probability)) H.take_damage(round(amount / 2)) @@ -779,17 +787,17 @@ // Stronger explosions cause serious damage to internal components // Minor explosions are mostly mitigitated by casing. -/obj/item/modular_computer/ex_act(var/severity) +/obj/item/modular_computer/ex_act(severity) take_damage(rand(100,200) / severity, 30 / severity) // EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components -/obj/item/modular_computer/emp_act(var/severity) +/obj/item/modular_computer/emp_act(severity) take_damage(rand(100,200) / severity, 50 / severity, 0) // "Stun" weapons can cause minor damage to components (short-circuits?) // "Burn" damage is equally strong against internal components and exterior casing // "Brute" damage mostly damages the casing. -/obj/item/modular_computer/bullet_act(var/obj/item/projectile/Proj) +/obj/item/modular_computer/bullet_act(obj/item/projectile/Proj) switch(Proj.damage_type) if(BRUTE) take_damage(Proj.damage, Proj.damage / 2) diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index b88aa9a7a9a..aff20f4feb3 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -16,13 +16,10 @@ machinery_computer.cpu = null machinery_computer = null -//obj/item/modular_computer/processor/nano_host() -// return machinery_computer.nano_host() - // Due to how processes work, we'd receive two process calls - one from machinery type and one from our own type. // Since we want this to be in-sync with machinery (as it's hidden type for machinery-based computers) we'll ignore // non-relayed process calls. -/obj/item/modular_computer/processor/process(var/relayed = 0) +/obj/item/modular_computer/processor/process(relayed = 0) if(relayed) ..() else @@ -39,7 +36,7 @@ if(machinery_computer) machinery_computer.handle_power() -/obj/item/modular_computer/processor/New(var/comp) +/obj/item/modular_computer/processor/New(comp) if(!comp || !istype(comp, /obj/machinery/modular_computer)) CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") return @@ -55,7 +52,7 @@ /obj/item/modular_computer/processor/relay_qdel() qdel(machinery_computer) -/obj/item/modular_computer/processor/find_hardware_by_name(var/N) +/obj/item/modular_computer/processor/find_hardware_by_name(N) var/obj/item/weapon/computer_hardware/H = machinery_computer.find_hardware_by_name(N) if(H) return H @@ -96,7 +93,7 @@ return // Tesla links only work on machinery types, so we'll override the default try_install_component() proc -/obj/item/modular_computer/processor/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0) +/obj/item/modular_computer/processor/try_install_component(mob/living/user, obj/item/weapon/computer_hardware/H, found = 0) if(istype(H, /obj/item/weapon/computer_hardware/tesla_link)) if(machinery_computer.tesla_link) user << "This computer's tesla link slot is already occupied by \the [machinery_computer.tesla_link]." @@ -107,7 +104,7 @@ found = 1 ..(user, H, found) -/obj/item/modular_computer/processor/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0) +/obj/item/modular_computer/processor/uninstall_component(mob/living/user, obj/item/weapon/computer_hardware/H, found = 0, critical = 0) if(machinery_computer.tesla_link == H) machinery_computer.tesla_link = null var/obj/item/weapon/computer_hardware/tesla_link/L = H @@ -122,12 +119,12 @@ return all_components // Perform adjacency checks on our machinery counterpart, rather than on ourselves. -/obj/item/modular_computer/processor/Adjacent(var/atom/neighbor) +/obj/item/modular_computer/processor/Adjacent(atom/neighbor) if(!machinery_computer) return 0 return machinery_computer.Adjacent(neighbor) -/obj/item/modular_computer/processor/turn_on(var/mob/user) +/obj/item/modular_computer/processor/turn_on(mob/user) // If we have a tesla link on our machinery counterpart, enable it automatically. Lets computer without a battery work. if(machinery_computer && machinery_computer.tesla_link) machinery_computer.tesla_link.enabled = 1 diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 4f40e31d869..0f78d917ff2 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -1,6 +1,6 @@ // Available as custom loadout item, this is literally the worst possible cheap tablet -/obj/item/modular_computer/tablet/preset/custom_loadout/cheap/New() +/obj/item/modular_computer/tablet/preset/cheap/New() . = ..() desc = "A low-end tablet often seen among low ranked station personnel." processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) @@ -10,7 +10,7 @@ network_card = new/obj/item/weapon/computer_hardware/network_card(src) // Alternative version, an average one, for higher ranked positions mostly -/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/New() +/obj/item/modular_computer/tablet/preset/advanced/New() . = ..() processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) battery_module = new/obj/item/weapon/computer_hardware/battery_module(src) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index e7ce0500c14..e05f1debb49 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -91,7 +91,7 @@ var/list/global_modular_computers = list() if(cpu) cpu.attack_self(user) // CPU is an item, that's why we route attack_hand to attack_self -/obj/machinery/modular_computer/examine(var/mob/user) +/obj/machinery/modular_computer/examine(mob/user) . = ..() if(cpu) cpu.examine(user) @@ -104,13 +104,13 @@ var/list/global_modular_computers = list() cpu.process(1) // Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null -/obj/machinery/modular_computer/proc/find_hardware_by_name(var/N) +/obj/machinery/modular_computer/proc/find_hardware_by_name(N) if(tesla_link && (tesla_link.name == N)) return tesla_link return null // Used in following function to reduce copypaste -/obj/machinery/modular_computer/proc/power_failure(var/malfunction = 0) +/obj/machinery/modular_computer/proc/power_failure(malfunction = 0) if(cpu && cpu.enabled) // Shut down the computer visible_message("\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") if(cpu) @@ -136,7 +136,8 @@ var/list/global_modular_computers = list() battery_powered = 0 var/power_usage = cpu.screen_on ? base_active_power_usage : base_idle_power_usage - for(var/obj/item/weapon/computer_hardware/CH in src.cpu.get_all_components()) + for(var/C in src.cpu.get_all_components()) + var/obj/item/weapon/computer_hardware/CH = C if(CH.enabled) power_usage += CH.power_usage @@ -169,7 +170,7 @@ var/list/global_modular_computers = list() return ..() -/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) +/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, mob/user) if(cpu) return cpu.attackby(W, user) return ..() @@ -177,19 +178,19 @@ var/list/global_modular_computers = list() // Stronger explosions cause serious damage to internal components // Minor explosions are mostly mitigitated by casing. -/obj/machinery/modular_computer/ex_act(var/severity) +/obj/machinery/modular_computer/ex_act(severity) if(cpu) cpu.ex_act(severity) // EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components -/obj/machinery/modular_computer/emp_act(var/severity) +/obj/machinery/modular_computer/emp_act(severity) if(cpu) cpu.emp_act(severity) // "Stun" weapons can cause minor damage to components (short-circuits?) // "Burn" damage is equally strong against internal components and exterior casing // "Brute" damage mostly damages the casing. -/obj/machinery/modular_computer/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj) if(cpu) cpu.bullet_act(Proj) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index c5c1d9e86e5..c853e7ce0fd 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -26,7 +26,7 @@ var/global/file_uid = 0 ..() // Returns independent copy of this file. -/datum/computer_file/proc/clone(var/rename = 0) +/datum/computer_file/proc/clone(rename = 0) var/datum/computer_file/temp = new type temp.unsendable = unsendable temp.undeletable = undeletable diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index e4f1a50da6b..f907c447e91 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -20,7 +20,7 @@ var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! -/datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) +/datum/computer_file/program/New(obj/item/modular_computer/comp = null) ..() if(comp && istype(comp)) computer = comp @@ -46,19 +46,19 @@ computer.update_icon() // Attempts to create a log in global ntnet datum. Returns 1 on success, 0 on fail. -/datum/computer_file/program/proc/generate_network_log(var/text) +/datum/computer_file/program/proc/generate_network_log(text) if(computer) return computer.add_log(text) return 0 -/datum/computer_file/program/proc/is_supported_by_hardware(var/hardware_flag = 0, var/loud = 0, var/mob/user = null) +/datum/computer_file/program/proc/is_supported_by_hardware(hardware_flag = 0, loud = 0, mob/user = null) if(!(hardware_flag & usage_flags)) if(loud && computer && user) user << "\The [computer] flashes an \"Hardware Error - Incompatible software\" warning." return 0 return 1 -/datum/computer_file/program/proc/get_signal(var/specific_action = 0) +/datum/computer_file/program/proc/get_signal(specific_action = 0) if(computer) return computer.get_ntnet_status(specific_action) return 0 @@ -112,7 +112,7 @@ return 0 // Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. -/datum/computer_file/program/proc/kill_program(var/forced = 0) +/datum/computer_file/program/proc/kill_program(forced = 0) program_state = PROGRAM_STATE_KILLED if(network_destination) generate_network_log("Connection to [network_destination] closed.") diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 306b1495cc3..a3eb9a27354 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -51,7 +51,6 @@ /datum/computer_file/program/ntnet_dos/ui_act(action, params) if(..()) return 1 - world << params switch(action) if("PRG_target_relay") for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 6e955174531..eefe6b671ef 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -10,13 +10,7 @@ var/is_centcom = 0 var/show_assignments = 0 -/datum/nano_module/program/card_mod - name = "ID card modification program" - var/mod_mode = 1 - var/is_centcom = 0 - var/show_assignments = 0 - -/datum/nano_module/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) +/datum/computer_file/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/list/data = get_header_data() data["src"] = "\ref[src]" @@ -228,3 +222,72 @@ /datum/computer_file/program/card_mod/proc/apply_access(var/obj/item/weapon/card/id/id_card, var/list/accesses) id_card.access |= accesses + +/datum/computer_file/program/card_mod/ui_data(mob/user) + + var/list/data = get_header_data() + + data["src"] = "\ref[src]" + data["station_name"] = station_name() + data["manifest"] = data_core ? data_core.get_manifest(0) : null + data["assignments"] = show_assignments + if(program && program.computer) + data["have_id_slot"] = !!program.computer.card_slot + data["have_printer"] = !!program.computer.nano_printer + data["authenticated"] = program.can_run(user) + if(!program.computer.card_slot) + mod_mode = 0 //We can't modify IDs when there is no card reader + else + data["have_id_slot"] = 0 + data["have_printer"] = 0 + data["authenticated"] = 0 + data["mmode"] = mod_mode + data["centcom_access"] = is_centcom + + if(program && program.computer && program.computer.card_slot) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + data["has_id"] = !!id_card + data["id_account_number"] = id_card ? id_card.associated_account_number : null + data["id_rank"] = id_card && id_card.assignment ? id_card.assignment : "Unassigned" + data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----" + data["id_name"] = id_card ? id_card.name : "-----" + + + data["engineering_jobs"] = format_jobs(engineering_positions) + data["medical_jobs"] = format_jobs(medical_positions) + data["science_jobs"] = format_jobs(science_positions) + data["security_jobs"] = format_jobs(security_positions) + data["cargo_jobs"] = format_jobs(cargo_positions) + data["civilian_jobs"] = format_jobs(civilian_positions) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + + data["all_centcom_access"] = is_centcom ? get_accesses(1) : null + data["regions"] = get_accesses() + + if(program.computer.card_slot.stored_card) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + if(is_centcom) + var/list/all_centcom_access = list() + for(var/access in get_all_centcom_access()) + all_centcom_access.Add(list(list( + "desc" = replacetext(get_centcom_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + data["all_centcom_access"] = all_centcom_access + else + var/list/regions = list() + for(var/i = 1; i <= 7; i++) + var/list/accesses = list() + for(var/access in get_region_accesses(i)) + if (get_access_desc(access)) + accesses.Add(list(list( + "desc" = replacetext(get_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + + regions.Add(list(list( + "name" = get_region_accesses_name(i), + "accesses" = accesses))) + data["regions"] = regions + + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index 7a148346986..e0fd5e2f3cf 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -15,12 +15,14 @@ var/obj/item/modular_computer/movable = null -//obj/machinery/vr_sleeper/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) - /datum/computer_file/program/computerconfig/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + ui = new(user, src, ui_key, "laptop_configuration", "NTOS Configuration Utility", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) @@ -54,7 +56,8 @@ data["battery"] = list("max" = movable.battery_module.battery.maxcharge, "charge" = round(movable.battery_module.battery.charge)) var/list/all_entries[0] - for(var/obj/item/weapon/computer_hardware/H in hardware) + for(var/I in hardware) + var/obj/item/weapon/computer_hardware/H = I all_entries.Add(list(list( "name" = H.name, "desc" = H.desc, @@ -68,11 +71,8 @@ /datum/computer_file/program/computerconfig/ui_act(action,params) - world << "test" if(..()) return - world << action - world <") t = replacetext(t, "\[/center\]", "

    ") t = replacetext(t, "\[br\]", "
    ") @@ -182,6 +182,10 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + ui = new(user, src, ui_key, "file_manager", "NTOS File Manage", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index cdb4a553935..6ba68126808 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -17,7 +17,7 @@ var/downloaderror = "" var/obj/item/modular_computer/my_computer = null -/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename) +/datum/computer_file/program/ntnetdownload/proc/begin_file_download(filename) if(downloaded_file) return 0 @@ -100,19 +100,18 @@ return 1 return 0 -//datum/nano_module/program/computer_ntnetdownload -// name = "Network Downloader" - /datum/computer_file/program/ntnetdownload/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) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + ui = new(user, src, ui_key, "ntnet_downloader", "NTNet Download Program", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) - - /datum/computer_file/program/ntnetdownload/ui_data(mob/user) my_computer = computer @@ -120,10 +119,7 @@ if(!istype(my_computer)) return - var/list/data = list() - - - data = get_header_data() + var/list/data = get_header_data() // This IF cuts on data transferred to client, so i guess it's worth it. if(downloaderror) // Download errored. Wait until user resets the program. @@ -138,7 +134,8 @@ data["disk_size"] = my_computer.hard_drive.max_capacity data["disk_used"] = my_computer.hard_drive.used_capacity var/list/all_entries[0] - for(var/datum/computer_file/program/P in ntnet_global.available_station_software) + for(var/A in ntnet_global.available_station_software) + var/datum/computer_file/program/P = A // Only those programs our user can run will show in the list if(!P.can_run(user)) continue @@ -151,7 +148,8 @@ data["hackedavailable"] = 0 if(computer_emagged) // If we are running on emagged computer we have access to some "bonus" software var/list/hacked_programs[0] - for(var/datum/computer_file/program/P in ntnet_global.available_antag_software) + for(var/S in ntnet_global.available_antag_software) + var/datum/computer_file/program/P = S data["hackedavailable"] = 1 hacked_programs.Add(list(list( "filename" = P.filename, diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 8df93e98fc4..60cc80a3b86 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -12,6 +12,11 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + + ui = new(user, src, ui_key, "ntnet_monitor", "NTNet Diagnostics and Monitoring Tool", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 4d3fcc17b2e..62a3e303533 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -182,6 +182,12 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) + + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + + ui = new(user, src, ui_key, "ntnet_chat", "NTNet Relay Chat Client", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) @@ -206,7 +212,8 @@ ))) data["messages"] = messages var/list/clients[0] - for(var/datum/computer_file/program/chatclient/cl in channel.clients) + for(var/C in channel.clients) + var/datum/computer_file/program/chatclient/cl = C clients.Add(list(list( "name" = cl.username ))) @@ -216,7 +223,8 @@ else // Channel selection screen var/list/all_channels[0] - for(var/datum/ntnet_conversation/conv in ntnet_global.chat_channels) + for(var/C in ntnet_global.chat_channels) + var/datum/ntnet_conversation/conv = C if(conv && conv.title) all_channels.Add(list(list( "chan" = conv.title, diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm index 2e863d744c0..a914878c426 100644 --- a/code/modules/modular_computers/file_system/programs/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm @@ -44,7 +44,7 @@ var/global/nttransfer_uid = 0 if(!remote) crash_download("Connection to remote server lost") -/datum/computer_file/program/nttransfer/kill_program(var/forced = 0) +/datum/computer_file/program/nttransfer/kill_program(forced = 0) if(downloaded_file) // Client mode, clean up variables for next use finalize_download() @@ -88,6 +88,11 @@ var/global/nttransfer_uid = 0 ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + + ui = new(user, src, ui_key, "ntnet_transfer", "NTNet P2P Transfer Client", 575, 700, state = state) ui.open() ui.set_autoupdate(state = 1) diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index 7ec0cbd3b4a..bfa946d4154 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -56,6 +56,11 @@ datum/tgui/master_ui = null, datum/ui_state/state = default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + + ui = new(user, src, ui_key, "power_monitor_prog", "Power Monitoring", 1200, 1000, master_ui, state) ui.open() diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index a4d1b25f1b9..31a46260d47 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -78,7 +78,7 @@ var/global/ntnet_card_uid = 1 if(holder2) var/turf/T = get_turf(holder2) - if((T && istype(T)) && T.z == ZLEVEL_STATION) + if((T && istype(T)) && (T.z == ZLEVEL_STATION || T.z == ZLEVEL_MINING)) // Computer is on station. Low/High signal depending on what type of network card you have if(long_range) return 2 diff --git a/icons/program_icons/alarm_green.gif b/icons/program_icons/alarm_green.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c2570c8ce30fd03c48a6332eba57bcd3dab25a2 GIT binary patch literal 107 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%al4F+Zg z9gsXo3j>qpoc@)k-|{b>v&F38^N~f|I*jw!Tav@w9?f)meZx*h^0Z{e(_iPl?+amI Gum%9P&mj8% literal 0 HcmV?d00001 diff --git a/icons/program_icons/alarm_red.gif b/icons/program_icons/alarm_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..327d58e4db8acf03e219e09ace17c6f1f990f499 GIT binary patch literal 163 zcmZ?wbhEHb6k`x$SjfO&!NBl?f#JY`0}KodivPL&TtkAL9RpmA^bD98K|()SIE@&X z8FYYbpawAp1}4op{VPwu z9Uz+lq=kVgdrtq#({K3~&(XZmz4_ijR))4m9@89-*W5WZulLlknX~7~XS7<@-QM-< z)5p3a3k8=ph_;@YD-fCaZO)aKyj=lOOHa#wTkte*^$w}Z9NjwJhnsI~PrIE`a*N4r Z`pwD9_U->OX}Y^(L`Fr2MIZx%H2^2XMuq?Y literal 0 HcmV?d00001 diff --git a/icons/program_icons/batt_20.gif b/icons/program_icons/batt_20.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d5e38fc888430a7bb2a1062468c7d822d7c66e1 GIT binary patch literal 284 zcmZ?wbhEHb)L;-}IK;rf@PmQD0tgun95?`E!hzy{Za>$MU}whwS0gveMHo^t=VfrUT;SOEL275g-IH&n1op^o z=9lV!P(86h^6mx>t7j(O%Z^Kid|P5Z$GPHY-im1Li@&d`EsQmCFt|K%`J3m`_rh+z z&%XGl`Q`8b4UOWQ*sKjFXl>T}cWXYI3Y~UjK2~sKzM#q(-TuQppDLZbR{Cf!?s%H9 d{c_%U&2Mf?S8e&VTesZc!;Tui{VEI$)&M66a}odm literal 0 HcmV?d00001 diff --git a/icons/program_icons/batt_40.gif b/icons/program_icons/batt_40.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5cedb996759170d5e2477619ca9f40d66a18c6a GIT binary patch literal 185 zcmZ?wbhEHb)L;-}*u=oV@PmQDg5kh{13!QaB%t`8+s`#5*x50_)kx2PnGq+Z` zi-Cnf2c!(7oq;*qW7nO32B$n%@6~;AcK82A5r&k^c^OP*m|J z3#SnSD}xS51xPysb9ltAJO2z$d9L2e`{L~G{|zi0DVg&!v|283?E4_Kv*7N@w^{Gs zt@&&!blQ>mSizC`f+}Zp`w#bgs&w{R>7%{4<7vkB%X#NDzqu`4wdL1t-ExBuJ8Jy) Vs}Qg&7i3qn2@A+BDa!4#1^~mJZcP9H literal 0 HcmV?d00001 diff --git a/icons/program_icons/batt_60.gif b/icons/program_icons/batt_60.gif new file mode 100644 index 0000000000000000000000000000000000000000..d39534c8cb03fd6b7580267d38ebbed0e7d16433 GIT binary patch literal 166 zcmZ?wbhEHb)L;-}SjfP@@PmQDg5kh{13;$Ye{Mh5kYH!W09PYD17=2$&`%alE(T@> z9Uz+lq=kVgWlsOf({K3~&(XZmz4_ijR))4m9@89-*W5WZulLlknX~7~XS7<%UFKf1 z`(~4FeCi2qq3|8I_&BGU)(1We&T?Ux91|_L^hVh9IhhrArZ%15RF+p;vVC*Z z9Uz+lq=kVgYfk^l({K3~&(XZmz4_ijR))4m9@89-*W5WZulLlknX~7~XS7<@-8SCU z@UqJKc7ar_(qx0*Qj WFFrMOA(iFsh8__a6&8UE4AubO+dx48 literal 0 HcmV?d00001 diff --git a/icons/program_icons/charging.gif b/icons/program_icons/charging.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf19ca72876b33bb683ea14aa4d9dc4c6c621bc8 GIT binary patch literal 160 zcmZ?wbhEHb)L;-}SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alE(T@> z9gsXo3jy+yJb<5u_TVtSn;qvt0wAPESQ>533&YSr0)^5#} LkH0rFF<1itpY1(Q literal 0 HcmV?d00001 diff --git a/icons/program_icons/downloader_finished.gif b/icons/program_icons/downloader_finished.gif new file mode 100644 index 0000000000000000000000000000000000000000..f01b7c42af8ba61a23b3ba009a1f491922267479 GIT binary patch literal 130 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alE(T@> z9gsXo3j>qGoc@)k-|laiBP6A;iLESQZs9fdE`gn;8fkWGK5X@y)0gnV&)mlFMPK)y dJkk3GD#0FQM`JW^Mtrhj=MufRCyI-~8UX$-DMkPQ literal 0 HcmV?d00001 diff --git a/icons/program_icons/downloader_running.gif b/icons/program_icons/downloader_running.gif new file mode 100644 index 0000000000000000000000000000000000000000..68fb977c86dda6273d7fbd853b86ca38375891b2 GIT binary patch literal 574 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alE(T@> z9gsXo3j>qvoc@)k-|laiBP6A;iLET)R_h~=Y0o;By*jn+owOJ>9m=RW66O|OWA74h zEd}Y|KK{w)`nOoDHmPCNx3e^3MNlw1SYPk+U;jj~S*eXvYtx$-T+f^X?*g@+`~Hvr ziYQjA_3-Q8d}^(=waC@4|M+>h+K(hMVsnBCAtSzs1pCZ=|HsTbplx#B#||H@=_i@6 z8DvScK^{p97bLw{HAiD|-)GKVD{io9Ul>uM&z5A<0#03AzH(Mc%dwY>85pbqqOR3W literal 0 HcmV?d00001 diff --git a/icons/program_icons/ntnrc_idle.gif b/icons/program_icons/ntnrc_idle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d47c01d580080e8e614de62448815b87705a122f GIT binary patch literal 113 zcmZ?wbhEHb6k`x$n8?7uV8L+UzyTl)1d9K;{aizWogD*Qjr0td89_onSvZXtm>6_G z@*ph?O!`y$SDt>$zc^;Wt!~{*{n8&Ar)bngYlhsO6~oo#^kK@TOEwR;%O1S>ei3K; KkwqIB7_0$IQY1tG literal 0 HcmV?d00001 diff --git a/icons/program_icons/ntnrc_new.gif b/icons/program_icons/ntnrc_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..af72a8b332fc4983088ccafc64593bb04294e551 GIT binary patch literal 181 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alBL-#$ z9gsXo3j>q>oc@)k-|{bxS#+yg_fo&~$HpldbQvgwk|!|k#MZ@yo| T*?wfvM*LGc*ia%L6 zH5gbJbU=zg+8LNVJ$Bvsr?~GV)811_tG)|2eeYD>$-vSu>$TUecap}dW?60X(Kg8X zZxDORUFMU7Vw_-vkx?=4giDbnCG)NxE1kLa#RdURiL4|QtfqV6GX2zwDX-^!UcJa@ zoxSedcLuJ09CwyVC_c)U%u$(n)L+QW)XXYWfupNQ!M=ouhCBcc!@ou<`_u6H! zYT3F)=M2|czt#M2GoQEPwXTzM?8YT3*ZNL8y>xLR(@H08mDepETZ|_wGh#CuPq?gG zzUrmqWxwp@8ok%K=B#(;F>*TiXv2|gJ=q0IHothGGoN?$q*-@kle;^f-ZrrmVz34P Dlu)Cy literal 0 HcmV?d00001 diff --git a/icons/program_icons/power_warn.gif b/icons/program_icons/power_warn.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c85b3a85a1e46e7ea81d98562f1cf10509f13d4 GIT binary patch literal 485 zcmZ?wbhEHb6k`x$*u=oV@B;`Le*9oKaNq!t2M3D(x&2&2f}I@$T#fV$m>Gc*ia%L6 zH5gbJbU=zg+8LO`Ja*mrr?~GV)812Qz2ejFDse<>RK<8qJ9lFO!-0LPH=Qzme2d$! z!Q?haTh*Hi7Wshi)kljKh4uzSyY(Ku_T|@RnU%MFKK}mNvplu%q^f7RZf?*W7f-BK z#lWnJy>!#N==SvE98BtZOF8>8eyx>dWZ>dlD;+z%n6=5OX>I#W7nOsF8=8YvD!usw zmVeOXej-@Cu6mAVXw_>A8ZTFIkYL$G`gO`34U23&g|61AV zmstl>WoP^`48OSIedNi9Dp>9EhuO9FRMM*N!cE@;ABg&?x-c+QnMJ*}n)|0UM=Ww% z@Uw0S&h*t^CF~>HKYS8&?+W?ya*oo<4Xsl;*JjN2oEj>$Y@+k?tAR&67#OSp?%csB literal 0 HcmV?d00001 diff --git a/icons/program_icons/sig_high.gif b/icons/program_icons/sig_high.gif new file mode 100644 index 0000000000000000000000000000000000000000..efb20f6730654a761fa061b451efae0122d0aa71 GIT binary patch literal 182 zcmZ?wbhEHb)L;-}SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alBL-#$ z9gsXo3jO_X57g-b8zbsXLHQ^1moO6yJZE zsA1B~Kl!3Vf!jT|?^ePgVB*KO^Q)UQp-((S@6Vw^UIER58u{+UcY pWZL=se|Wpurscs#79FY`73myDPRw|+k>h7VQ0L5*oskR-)&PE-NT2`! literal 0 HcmV?d00001 diff --git a/icons/program_icons/sig_low.gif b/icons/program_icons/sig_low.gif new file mode 100644 index 0000000000000000000000000000000000000000..08f98baea8e69b04e3b8a8f12f20ad4bb09b2ec8 GIT binary patch literal 179 zcmZ?wbhEHb)L;-}IK;qUVZm_VzyXFIKo-LfAPEDC|GE8KLxPk%Fip~B~z57xb zi)?z*Z*Xy0o|rpPO~Z+yA@$@>1_6#hWrL)ndfU%un{lK$aNjjtzs6(v{wv#ltnFR= VJZVQz-_mTu^o*>a79LIpYXEgwJ&phX literal 0 HcmV?d00001 diff --git a/icons/program_icons/sig_none.gif b/icons/program_icons/sig_none.gif new file mode 100644 index 0000000000000000000000000000000000000000..79840d8a2bd4b30c263cbc680aa2727dfeb27555 GIT binary patch literal 202 zcmZ?wbhEHb)L;-}IK;rfV8QSMNd5rQ3P*m|J z3#SnSD}xS51xPysb4|pqJO2!r%))zrFb0-CKQlph(PPc@iDJ$HNpG_owf1h(n=`wt zUenMc;IZ>XC+j6^CT7V^4LFneD~G3DvVYsFjzo7kzV8>k`g)oSEfegn*X=s^y{0?n tc4VnY$MhFJy)7CAO2cZKN~((6ntigmW7~}j6!Ut0@@CGO&CkhT4FK Date: Sat, 6 Aug 2016 23:08:06 -0700 Subject: [PATCH 10/21] Removes a couple vars in arguments. --- .../modular_computers/NTNet/NTNRC/conversation.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index fad69527bb3..075bef313fe 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -15,12 +15,12 @@ var/global/static/ntnrc_uid = 0 ntnet_global.chat_channels.Add(src) ..() -/datum/ntnet_conversation/proc/add_message(var/message, var/username) +/datum/ntnet_conversation/proc/add_message(message, username) message = "[worldtime2text()] [username]: [message]" messages.Add(message) trim_message_list() -/datum/ntnet_conversation/proc/add_status_message(var/message) +/datum/ntnet_conversation/proc/add_status_message(message) messages.Add("[worldtime2text()] -!- [message]") trim_message_list() @@ -29,7 +29,7 @@ var/global/static/ntnrc_uid = 0 return messages = messages.Copy(messages.len-50 ,0) -/datum/ntnet_conversation/proc/add_client(var/datum/computer_file/program/chatclient/C) +/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/C) if(!istype(C)) return clients.Add(C) @@ -38,7 +38,7 @@ var/global/static/ntnrc_uid = 0 if(!operator) changeop(C) -/datum/ntnet_conversation/proc/remove_client(var/datum/computer_file/program/chatclient/C) +/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/C) if(!istype(C) || !(C in clients)) return clients.Remove(C) @@ -57,7 +57,7 @@ var/global/static/ntnrc_uid = 0 operator = newop add_status_message("Channel operator status transferred to [newop.username].") -/datum/ntnet_conversation/proc/change_title(var/newtitle, var/datum/computer_file/program/chatclient/client) +/datum/ntnet_conversation/proc/change_title(newtitle, datum/computer_file/program/chatclient/client) if(operator != client) return 0 // Not Authorised From 2b381baa2521ac5784e13c009422d2173150b00a Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sat, 6 Aug 2016 23:25:58 -0700 Subject: [PATCH 11/21] Added ntnet relay to other maps. --- _maps/map_files/BirdStation/BirdStation.dmm | 1 + _maps/map_files/DreamStation/dreamstation04.dmm | 1 + _maps/map_files/EfficiencyStation/EfficiencyStation.dmm | 1 + _maps/map_files/MetaStation/MetaStation.dmm | 1 + 4 files changed, 4 insertions(+) diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index ba0be3682f0..bedea03f443 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -2066,6 +2066,7 @@ /obj/machinery/light{ dir = 1 }, +/obj/machinery/ntnet_relay, /turf/open/floor/plasteel/black, /area/turret_protected/tcomeast{ name = "\improper Telecommunications Chamber" diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index 9d2848a9387..9f6e1f7d6f3 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -25112,6 +25112,7 @@ pixel_x = -22; tag = "icon-alarm0 (EAST)" }, +/obj/machinery/ntnet_relay, /turf/open/floor/plasteel/darkyellow{ name = "Mainframe Floor"; initial_gas_mix = "n2=100;TEMP=80" diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm index 0ddd8ac394f..781caeb2e84 100644 --- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm +++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm @@ -55704,6 +55704,7 @@ /area/tcommsat/server) "cib" = ( /obj/machinery/power/terminal, +/obj/machinery/ntnet_relay, /turf/open/floor/bluegrid{ name = "Mainframe Base"; initial_gas_mix = "n2=100;TEMP=80" diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4d1482c1d76..f6165b31ea0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -54563,6 +54563,7 @@ network = list("SS13","tcomm") }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/ntnet_relay, /turf/open/floor/plasteel/black{ name = "Mainframe Floor"; initial_gas_mix = "n2=100;TEMP=80" From 2f330babb724888ff5d00c57a6c378ebbf807ea6 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 7 Aug 2016 00:01:50 -0700 Subject: [PATCH 12/21] testmerge feedback --- code/__DEFINES/misc.dm | 8 ++++---- code/modules/jobs/job_types/cargo_service.dm | 3 +-- .../modular_computers/computers/item/tablet_presets.dm | 4 ++-- code/modules/modular_computers/hardware/battery_module.dm | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index fdd549e71e2..fb0c9a88314 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -509,9 +509,9 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc. // NTNet transfer speeds, used when downloading/uploading a file/program. -#define NTNETSPEED_LOWSIGNAL 0.025 // GQ/s transfer speed when the device is wirelessly connected and on Low signal -#define NTNETSPEED_HIGHSIGNAL 0.1 // GQ/s transfer speed when the device is wirelessly connected and on High signal -#define NTNETSPEED_ETHERNET 0.5 // GQ/s transfer speed when the device is using wired connection +#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal +#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal +#define NTNETSPEED_ETHERNET 3 // GQ/s transfer speed when the device is using wired connection // Program bitflags @@ -525,5 +525,5 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define PROGRAM_STATE_ACTIVE 2 // Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it. -#define MAX_NTNET_LOGS 500 +#define MAX_NTNET_LOGS 300 #define MIN_NTNET_LOGS 10 \ No newline at end of file diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 1ab91a61d11..661069d1d01 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -88,13 +88,12 @@ Shaft Miner backpack_contents = list( /obj/item/weapon/storage/bag/ore=1,\ /obj/item/weapon/kitchen/knife/combat/survival=1,\ - /obj/item/weapon/mining_voucher=1) + /obj/item/weapon/mining_voucher=1,/obj/item/modular_computer/tablet/preset/cheap=1) backpack = /obj/item/weapon/storage/backpack/explorer satchel = /obj/item/weapon/storage/backpack/satchel/explorer dufflebag = /obj/item/weapon/storage/backpack/dufflebag box = /obj/item/weapon/storage/box/survival_mining - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /* Bartender diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 0f78d917ff2..c0f3dea536b 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -4,7 +4,7 @@ . = ..() desc = "A low-end tablet often seen among low ranked station personnel." processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) - battery_module = new/obj/item/weapon/computer_hardware/battery_module/nano(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(src) battery_module.charge_to_full() hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(src) network_card = new/obj/item/weapon/computer_hardware/network_card(src) @@ -13,7 +13,7 @@ /obj/item/modular_computer/tablet/preset/advanced/New() . = ..() processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) - battery_module = new/obj/item/weapon/computer_hardware/battery_module(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(src) battery_module.charge_to_full() hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(src) network_card = new/obj/item/weapon/computer_hardware/network_card(src) diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index e9b3287b792..2499da2f816 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -23,7 +23,7 @@ desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 1500." icon_state = "battery_super" origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) - hardware_size = 2 + hardware_size = 1 //temp for testmerge battery_rating = 1500 /obj/item/weapon/computer_hardware/battery_module/ultra From bec5eaa893c4b5c0dc49cfadf3eea16e4ec6c831 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 7 Aug 2016 00:06:29 -0700 Subject: [PATCH 13/21] librarian --- code/modules/jobs/job_types/civilian.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 5a2071b1404..ea74d8aa0c1 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -135,6 +135,7 @@ Librarian l_hand = /obj/item/weapon/storage/bag/books r_pocket = /obj/item/weapon/barcodescanner l_pocket = /obj/item/device/laser_pointer + backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced = 1) /* Lawyer From 596ff2b14660861e56a6257bf35493defe377024 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Sun, 7 Aug 2016 00:31:36 -0700 Subject: [PATCH 14/21] Fixed irc client interface --- tgui/assets/tgui.js | 4 ++-- tgui/src/interfaces/ntnet_chat.ract | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index ea7ae8a4094..6354d8c822e 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -9,7 +9,7 @@ var a,i,o,s;for(a=bu(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.sta t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},a.exports.components=a.exports.components||{};var i={vents:t(225),modes:t(221),thresholds:t(224),status:t(223),scrubbers:t(222)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,221:221,222:222,223:223,224:224,225:225}],220:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=r.extend(a.exports)},{205:205}],221:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},a.exports.components=a.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,220:220}],222:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,117],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,174],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,196]}]},f:[{p:[9,7,219],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,255],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,272]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,314]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,391]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,411]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,425]}]}]}," ",{p:[13,7,490],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,525],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[14,26,542]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[14,71,587]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[15,50,670]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[15,70,690]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[15,88,708]}]}]}," ",{p:[17,7,790],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[18,9,826],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[18,26,843]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[18,70,887]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[19,48,968]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[19,68,988]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[19,84,1004]}]}]}," ",{p:[21,7,1080],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[22,9,1118],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_co2"],s:'_0?"check-square-o":"square-o"'},p:[22,26,1135]}],style:[{t:2,x:{r:["filter_co2"],s:'_0?"selected":null'},p:[22,81,1190]}],action:"co2_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[23,50,1276]},'", "val": ',{t:2,x:{r:["filter_co2"],s:"+!_0"},p:[23,70,1296]},"}"]},f:["CO2"]}," ",{p:[24,9,1340],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_n2o"],s:'_0?"check-square-o":"square-o"'},p:[24,26,1357]}],style:[{t:2,x:{r:["filter_n2o"],s:'_0?"selected":null'},p:[24,81,1412]}],action:"n2o_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,50,1498]},'", "val": ',{t:2,x:{r:["filter_n2o"],s:"+!_0"},p:[25,70,1518]},"}"]},f:["N2O"]}," ",{p:[26,9,1562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_toxins"],s:'_0?"check-square-o":"square-o"'},p:[26,26,1579]}],style:[{t:2,x:{r:["filter_toxins"],s:'_0?"selected":null'},p:[26,84,1637]}],action:"tox_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,50,1726]},'", "val": ',{t:2,x:{r:["filter_toxins"],s:"+!_0"},p:[27,70,1746]},"}"]},f:["Plasma"]}," ",{p:[28,3,1790],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_bz"],s:'_0?"check-square-o":"square-o"'},p:[28,20,1807]}],style:[{t:2,x:{r:["filter_bz"],s:'_0?"selected":null'},p:[28,74,1861]}],action:"bz_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[29,43,1939]},'", "val": ',{t:2,x:{r:["filter_bz"],s:"+!_0"},p:[29,63,1959]},"}"]},f:["BZ"]}]}]}],n:52,r:"data.scrubbers",p:[7,3,144]},{t:4,n:51,f:[{p:[33,5,2052],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},a.exports.components=a.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,220:220}],223:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=r.extend(a.exports)},{205:205}],224:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",a.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},a.exports.components=a.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,220:220}],225:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{p:[22,7,1039],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,9,1085],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[24,31,1172]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[24,45,1186]}]}," ",{p:[25,9,1232],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[25,42,1265]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[26,31,1365]},'"}']},f:["Reset"]}]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[30,5,1457],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},a.exports.components=a.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,220:220}],226:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}]}," "]},e.exports=r.extend(a.exports)},{205:205}],227:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[46,1,1184],t:7,e:"ui-notice",f:[{t:4,f:[{p:[48,5,1229],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[49,7,1272],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[49,24,1289]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[49,75,1340]}]}]}],n:50,r:"data.siliconUser",p:[47,3,1199]},{t:4,n:51,f:[{p:[52,5,1431],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[52,31,1457]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[55,1,1542],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[56,3,1579],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[58,7,1666],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[58,20,1679]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[58,59,1718]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[57,5,1618]},{t:4,n:51,f:[{p:[60,7,1782],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[60,24,1799]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[60,77,1852]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[61,26,1920]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[64,3,2001],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[65,5,2042],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[65,18,2055]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[65,54,2091]}]}]}," ",{p:[67,3,2198],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[69,7,2279],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[69,40,2312]}],state:[{t:2,r:"powerCellStatusState",p:[69,73,2345]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[69,99,2371]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[68,5,2235]},{t:4,n:51,f:[{p:[71,7,2440],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[75,5,2548],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[77,9,2638],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[77,22,2651]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[77,60,2689]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[76,7,2588]},{t:4,n:51,f:[{p:[79,9,2758],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[79,26,2775]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[79,76,2825]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[80,27,2893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[83,8,2979],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[83,21,2992]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[83,58,3029]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[74,3,2506]}]}," ",{p:[87,1,3187],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[89,5,3260],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[89,24,3279]}],nowrap:0},f:[{p:[90,7,3305],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[90,28,3326]}," W"]}," ",{p:[91,7,3395],t:7,e:"div",a:{"class":"content"},f:[{p:[91,28,3416],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[91,41,3429]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[91,75,3463]}]}]}," ",{p:[92,7,3514],t:7,e:"div",a:{"class":"content"},f:["[",{p:[92,29,3536],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[92,35,3542]}]},"]"]}," ",{p:[93,7,3614],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[95,11,3717],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[95,44,3750]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[96,38,3840]}]},f:["Auto"]}," ",{p:[97,11,3890],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[97,46,3925]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[98,21,4e3]}]},f:["On"]}," ",{p:[99,11,4046],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[99,42,4077]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[100,21,4152]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[94,9,3665]}]}]}],n:52,r:"data.powerChannels",p:[88,3,3226]}," ",{p:[105,3,4255],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[106,5,4292],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[106,24,4311]}," W"]}]}]}," ",{t:4,f:[{p:[110,3,4413],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[111,5,4456],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[113,7,4561],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[113,24,4578]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[113,45,4599]}],action:[{t:2,r:"malfAction",p:[113,99,4653]}]},f:[{t:2,r:"malfButton",p:[113,115,4669]}]}],n:50,r:"data.malfStatus",p:[112,5,4530]}]}],n:50,r:"data.siliconUser",p:[109,1,4385]},{p:[117,1,4736],t:7,e:"ui-notice",f:[{p:[118,3,4751],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[120,7,4836],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[120,13,4842]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[119,5,4788]},{t:4,n:51,f:[{p:[122,7,4918],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[122,24,4935]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[122,81,4992]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}]},e.exports=r.extend(a.exports)},{205:205}],228:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],229:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=r.extend(a.exports)},{205:205}],230:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{p:[12,5,619],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==""?"selected":null'},p:[12,23,637]}],action:"filter",params:'{"mode": ""}'},f:["Nothing"]}," ",{p:[14,5,755],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="plasma"?"selected":null'},p:[14,23,773]}],action:"filter",params:'{"mode": "plasma"}'},f:["Plasma"]}," ",{p:[16,5,902],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="o2"?"selected":null'},p:[16,23,920]}],action:"filter",params:'{"mode": "o2"}'},f:["O2"]}," ",{p:[18,5,1037],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2"?"selected":null'},p:[18,23,1055]}],action:"filter",params:'{"mode": "n2"}'},f:["N2"]}," ",{p:[20,5,1172],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="co2"?"selected":null'},p:[20,23,1190]}],action:"filter",params:'{"mode": "co2"}'},f:["CO2"]}," ",{p:[22,5,1310],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2o"?"selected":null'},p:[22,23,1328]}],action:"filter",params:'{"mode": "n2o"}'},f:["N2O"]}," ",{p:[24,2,1445],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="bz"?"selected":null'},p:[24,20,1463]}],action:"filter",params:'{"mode": "bz"}'},f:["BZ"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],231:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],232:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"transfer",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,529],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,535]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,609],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,653],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,750],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,780]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,910],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,916]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=r.extend(a.exports)},{205:205}],233:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=r.extend(a.exports); },{205:205}],234:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}]}," ",{p:[15,1,557],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[16,3,587],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[17,5,630],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[17,18,643]}],max:[{t:2,r:"data.maxReleasePressure",p:[17,52,677]}],value:[{t:2,r:"data.releasePressure",p:[18,14,720]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[18,40,746]}," kPa"]}]}," ",{p:[20,3,817],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[21,5,862],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[21,38,895]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[23,5,1051],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[23,36,1082]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[25,5,1229],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[26,5,1324],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[26,35,1354]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[29,3,1516],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[30,5,1548],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[30,22,1565]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[31,14,1619]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[32,22,1713]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[38,7,1901],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[38,38,1932]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[37,5,1866]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[42,3,2066],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[43,4,2097]}]}," ",{p:[45,3,2143],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[46,4,2177]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[41,3,2035]},{t:4,n:51,f:[{p:[49,3,2259],t:7,e:"ui-section",f:[{p:[50,4,2276],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=r.extend(a.exports)},{205:205}],235:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(a),a.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"Centcom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],t:7,e:"span",a:{"class":"bad"},f:["Loaned to Centcom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=r.extend(a.exports)},{205:205}],236:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{t:4,f:[{p:[16,7,521],t:7,e:"span",f:["Required Absorbtions: ",{t:2,r:"required_absorbtions",p:[16,35,549]}]}],n:50,r:"required_absorbtions",p:[15,5,485]}," ",{p:[19,5,594],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[20,14,619]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[22,25,726]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[23,7,746]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[28,3,849],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[27,1,826]}]}]},e.exports=r.extend(a.exports)},{205:205}],237:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,315],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,345]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[9,114,422]},"}"]},f:[{t:2,r:".",p:[9,122,430]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,271]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,482],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,532],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,599]},'"}']},f:[{t:2,r:"title",p:[14,84,609]}]}],n:52,r:"data.chemicals",p:[13,5,500]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,786],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,845]},"}"]},f:[{t:2,r:".",p:[21,74,853]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,742]}," ",{p:[23,5,891],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,922]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,1019],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1089],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1095]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1137]}," Units"]}," ",{p:[28,7,1182],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1235],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1278]}," units of ",{t:2,r:"name",p:[30,87,1313]}]},{p:[30,102,1328],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1195]},{t:4,n:51,f:[{p:[32,9,1359],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1054]},{t:4,n:51,f:[{p:[35,7,1435],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],238:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],239:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject and Clear Buffer":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,357],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,443],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,462]}," units of ",{t:2,r:"name",p:[13,60,497]}],nowrap:0},f:[{p:[14,7,522],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,572],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,625]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,670],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,723]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,768],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,821]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,868],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,921]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,971],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1024]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1075],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1119]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,407]},{t:4,n:51,f:[{p:[24,5,1201],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,374]},{t:4,n:51,f:[{p:[27,5,1272],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1360],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1391],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1429]}]},f:["Destroy"]}," ",{p:[34,3,1487],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1525]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1594],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1646],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1665]}," units of ",{t:2,r:"name",p:[37,59,1700]}],nowrap:0},f:[{p:[38,6,1724],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1773],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1828]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1872],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1927]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1971],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2026]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2072],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2127]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2176],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2231]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2281],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2325]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1611]}]}]}," ",{t:4,f:[{p:[52,3,2461],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2551],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2585]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2634]}]}," ",{p:[55,5,2715],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2737]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2761]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2514]},{t:4,n:51,f:[{p:[57,5,2813],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2877],t:7,e:"br"}," ",{p:[61,4,2887],t:7,e:"br"}," ",{p:[62,4,2897],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2956]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3040],t:7,e:"br"}," ",{p:[64,4,3050],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3109]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3193],t:7,e:"br"}," ",{p:[66,4,3203],t:7,e:"br"}," ",{p:[67,4,3213],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3273]}]},f:["Create Patch (max 50µ)"]}," ",{p:[68,4,3358],t:7,e:"br"}," ",{p:[69,4,3368],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3428]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3514],t:7,e:"br"}," ",{p:[71,4,3524],t:7,e:"br"}," ",{p:[72,4,3534],t:7,e:"ui-button",a:{action:"createBottle",state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,44,3574]}]},f:["Create Bottle (max 30µ)"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2438]},{t:4,n:51,f:[{p:[76,3,3688],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[77,4,3743],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[77,63,3802]}]},f:["Create Pack (max 10µ)"]}," ",{p:[78,4,3886],t:7,e:"br"}," ",{p:[79,4,3896],t:7,e:"br"}," ",{p:[80,4,3906],t:7,e:"ui-button",a:{action:"createBottle",state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,44,3946]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[84,2,4094],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[84,20,4112]}]},f:[{p:[85,3,4143],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[86,3,4191],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[86,46,4234]}]}," ",{p:[87,3,4277],t:7,e:"br"}," ",{p:[88,3,4286],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[89,3,4328],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[89,23,4348]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[89,69,4394]}]},f:[{t:2,r:"data.analyzeVars.color",p:[89,97,4422]}]}," ",{p:[90,3,4459],t:7,e:"br"}," ",{p:[91,3,4468],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[92,3,4510],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[92,25,4532]}]}," ",{p:[93,3,4569],t:7,e:"br"}," ",{p:[94,3,4578],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[95,3,4634],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[95,25,4656]},"µ/minute"]}," ",{p:[96,3,4704],t:7,e:"br"}," ",{p:[97,3,4713],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[98,3,4768],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[98,25,4790]}]}," ",{p:[99,3,4827],t:7,e:"br"}," ",{p:[100,3,4836],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[101,3,4892],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[101,25,4914]}]}," ",{p:[102,3,4952],t:7,e:"br"}," ",{p:[103,3,4961],t:7,e:"br"}," ",{p:[104,3,4970],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=r.extend(a.exports)},{205:205}],240:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,974],t:7,e:"ui-display",f:[{p:[38,2,989],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[39,2,1056],t:7,e:"table",f:[{t:4,f:[{p:[41,4,1095],t:7,e:"tr",f:[{p:[41,8,1099],t:7,e:"td",f:[{p:[41,12,1103],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[41,64,1155]},'"}']},f:[{t:2,r:"desc",p:[42,5,1173]}]}]},{p:[44,4,1203],t:7,e:"td",f:[{p:[44,8,1207],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[44,26,1225]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[44,114,1313]},'"}']}}]}]}],n:52,r:"data.programs",p:[40,3,1067]}]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],241:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],242:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{temperatureStatus:function(t){return 225>t?"good":273.15>t?"average":"bad"}},computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(a),a.exports.template={v:3,t:[" ",{p:[22,1,466],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[23,3,499],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[24,3,532],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[24,9,538]}]}]}," ",{t:4,f:[{p:[27,5,655],t:7,e:"ui-section",a:{label:"State"},f:[{p:[28,7,689],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[28,20,702]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[28,43,725]}]}]}," ",{p:[30,4,846],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,6,885],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.occupant.bodyTemperature"],s:"_0(_1)"},p:[31,19,898]}]},f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[31,74,953]}," K"]}]}," ",{p:[33,5,1032],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[34,7,1067],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[34,20,1080]}],max:[{t:2,r:"data.occupant.maxHealth",p:[34,54,1114]}],value:[{t:2,r:"data.occupant.health",p:[34,90,1150]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[35,16,1192]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[35,68,1244]}]}]}," ",{t:4,f:[{p:[38,7,1481],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[38,26,1500]}]},f:[{p:[39,9,1521],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[39,30,1542]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[39,66,1578]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[39,103,1615]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[37,5,1315]}],n:50,r:"data.hasOccupant",p:[26,3,625]}]}," ",{p:[44,1,1724],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[45,3,1753],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[46,5,1785],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[46,22,1802]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[47,14,1862]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[48,14,1918]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[49,22,1977]}]}]}," ",{p:[51,3,2045],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[52,3,2081],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.cellTemperature"],s:"_0(_1)"},p:[52,16,2094]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[52,62,2140]}," K"]}]}," ",{p:[54,2,2205],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[55,5,2236],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[55,22,2253]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[55,73,2304]}]}," ",{p:[56,5,2357],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[56,22,2374]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[56,86,2438]}]}]}]}," ",{p:{button:[{p:[61,5,2584],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[61,36,2615]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[63,3,2718],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[66,9,2828],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[66,52,2871]}," units of ",{t:2,r:"name",p:[66,87,2906]}]},{p:[66,102,2921],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[65,7,2788]},{t:4,n:51,f:[{p:[68,9,2952],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[64,5,2753]},{t:4,n:51,f:[{p:[71,7,3028],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],243:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=r.extend(a.exports)},{205:205}],244:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=r.extend(a.exports)},{205:205}],245:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-display",f:[{p:[4,2,19],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,48],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,71],t:7,e:"table",f:[{p:[6,11,78],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,147],t:7,e:"td",f:[{p:[8,9,151],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,161]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,87]}," ",{t:4,f:[{p:[11,5,266],t:7,e:"td",f:[{p:[11,9,270],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,273]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,203]}," ",{t:4,f:[{p:[14,5,351],t:7,e:"td",f:[{p:[14,9,355],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,365]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,320]}," ",{t:4,f:[{p:[17,5,438],t:7,e:"td",f:[{p:[17,9,442],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,452]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,405]}," ",{t:4,f:[{p:[20,5,527],t:7,e:"td",f:[{p:[20,9,531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,534]},{p:[20,35,557],t:7,e:"b",f:[]}]}]}],n:50, r:"data.PC_stationtime",p:[19,4,494]}," ",{t:4,f:[{p:[23,5,615],t:7,e:"td",f:[{p:[23,9,619],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,629]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,577]}]}]}]}]}," ",{p:[28,2,688],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,718],t:7,e:"table",f:[{p:[29,10,725],t:7,e:"tr",f:[{p:[30,4,734],t:7,e:"td",f:[{p:[30,8,738],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,832],t:7,e:"td",f:[{p:[32,9,836],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,894],t:7,e:"td",f:[{p:[33,9,898],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,795]}]}]}]}]}," ",{p:[37,2,994],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[40,3,1046],t:7,e:"h2",f:["An error has occured and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[41,27,1138]},{p:[41,41,1152],t:7,e:"br"}," ",{p:[42,3,1160],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[43,3,1262],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[39,2,1024]},{t:4,n:51,f:[{t:4,f:[{p:[46,4,1364],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[46,21,1381]}]}," ",{p:[47,4,1408],t:7,e:"div",a:{"class":"item"},f:[{p:[48,4,1431],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[49,4,1487],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[50,4,1537],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[51,10,1599],t:7,e:"hr"}," ",{t:2,r:"data.filedata",p:[52,4,1608]}],n:50,r:"data.filename",p:[45,3,1338]},{t:4,n:51,f:[{p:[54,4,1642],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[55,4,1680],t:7,e:"table",f:[{p:[56,5,1693],t:7,e:"tr",f:[{p:[56,9,1697],t:7,e:"th",f:["File name"]},{p:[57,5,1716],t:7,e:"th",f:["File type"]},{p:[58,5,1735],t:7,e:"th",f:["File size (GQ)"]},{p:[59,5,1759],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[61,6,1806],t:7,e:"tr",f:[{p:[61,10,1810],t:7,e:"td",f:[{t:2,r:"name",p:[61,14,1814]}]},{p:[62,6,1829],t:7,e:"td",f:[".",{t:2,r:"type",p:[62,11,1834]}]},{p:[63,6,1849],t:7,e:"td",f:[{t:2,r:"size",p:[63,10,1853]},"GQ"]},{p:[64,6,1870],t:7,e:"td",f:[" ",{p:[65,7,1882],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[65,58,1933]},'"}']},f:["VIEW"]}," ",{p:[66,7,1969],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[66,25,1987]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[66,104,2066]},'"}']},f:["DELETE"]}," ",{p:[67,7,2104],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[67,25,2122]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[67,100,2197]},'"}']},f:["RENAME"]}," ",{p:[68,7,2235],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[68,25,2253]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[68,99,2327]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[70,8,2398],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[70,26,2416]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[70,104,2494]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[69,7,2364]}]}]}],n:52,r:"data.files",p:[60,5,1779]}]}]}]}," ",{t:4,f:[{p:[75,4,2602],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[76,4,2650],t:7,e:"table",f:[{p:[77,5,2663],t:7,e:"tr",f:[{p:[77,9,2667],t:7,e:"th",f:["File name"]},{p:[78,5,2686],t:7,e:"th",f:["File type"]},{p:[79,5,2705],t:7,e:"th",f:["File size (GQ)"]},{p:[80,5,2729],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[82,6,2779],t:7,e:"tr",f:[{p:[82,10,2783],t:7,e:"td",f:[{t:2,r:"name",p:[82,14,2787]}]},{p:[83,6,2802],t:7,e:"td",f:[".",{t:2,r:"type",p:[83,11,2807]}]},{p:[84,6,2822],t:7,e:"td",f:[{t:2,r:"size",p:[84,10,2826]},"GQ"]},{p:[85,6,2843],t:7,e:"td",f:[" ",{p:[86,7,2855],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[86,25,2873]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[86,107,2955]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[88,8,3027],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[88,26,3045]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[88,106,3125]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[87,7,2993]}]}]}],n:52,r:"data.usbfiles",p:[81,5,2749]}]}]}]}],n:50,r:"data.usbconnected",p:[74,4,2572]}," ",{p:[93,4,3215],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],246:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(a),a.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=r.extend(a.exports)},{205:205}],247:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],248:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2,r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=r.extend(a.exports)},{205:205}],249:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(a),a.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],250:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.wiping","data.isDead"],s:'_0||_1?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:["Wipe AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,651],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,688],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,701]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,755]}]}]}," ",{p:[29,5,850],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,897],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,930]}],state:[{t:2,r:"healthState",p:[30,64,954]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,971]},"%"]}]}," ",{p:[32,5,1034],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1096],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1120]}]},{p:[34,45,1132],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1067]}]}," ",{p:[37,5,1179],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1216],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1248]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1342],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1378]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,628]}]}]},e.exports=r.extend(a.exports)},{205:205}],251:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=r.extend(a.exports)},{205:205}],252:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],253:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[15,1,266],t:7,e:"div",a:{style:"float: left"},f:[{p:[16,2,294],t:7,e:"div",a:{"class":"item"},f:[{p:[17,3,316],t:7,e:"table",f:[{p:[17,10,323],t:7,e:"tr",f:[{t:4,f:[{p:[19,4,390],t:7,e:"td",f:[{p:[19,8,394],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[19,18,404]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[18,3,331]}," ",{t:4,f:[{p:[22,4,506],t:7,e:"td",f:[{p:[22,8,510],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[22,11,513]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[21,3,444]}," ",{t:4,f:[{p:[25,4,588],t:7,e:"td",f:[{p:[25,8,592],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[25,18,602]}]}}]}],n:50,r:"data.PC_ntneticon",p:[24,3,558]}," ",{t:4,f:[{p:[28,4,672],t:7,e:"td",f:[{p:[28,8,676],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[28,18,686]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[27,3,640]}," ",{t:4,f:[{p:[31,4,758],t:7,e:"td",f:[{p:[31,8,762],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[31,11,765]},{p:[31,34,788],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[30,3,726]}," ",{t:4,f:[{p:[34,4,843],t:7,e:"td",f:[{p:[34,8,847],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[34,18,857]}]}}]}],n:52,r:"data.PC_programheaders",p:[33,3,806]}]}]}]}]}," ",{p:[39,1,911],t:7,e:"div",a:{style:"float: right"},f:[{p:[40,2,940],t:7,e:"table",f:[{p:[40,9,947],t:7,e:"tr",f:[{p:[41,3,955],t:7,e:"td",f:[{p:[41,7,959],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[43,4,1051],t:7,e:"td",f:[{p:[43,8,1055],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[44,4,1112],t:7,e:"td",f:[{p:[44,8,1116],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[42,3,1015]}]}]}]}]}," ",{p:[48,1,1208],t:7,e:"div",a:{style:"clear: both"},f:[{p:[49,1,1235],t:7,e:"ui-display",f:[{p:[50,2,1250],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[50,137,1385],t:7,e:"hr"}," ",{p:[51,2,1392],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{t:4,f:[{p:[53,4,1454],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[56,4,1525],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[57,5,1566]}]}," ",{p:[59,4,1609],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[60,5,1650],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[60,26,1671]}],value:[{t:2,r:"adata.battery.charge",p:[60,56,1701]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[60,89,1734]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[60,128,1773]},"/",{t:2,r:"adata.battery.max",p:[60,165,1810]}]}]}],n:50,r:"data.battery",p:[52,3,1429]},{t:4,n:51,f:[{p:[63,4,1875],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}," ",{p:[68,3,1964],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[69,4,2001]},"W"]}]}," ",{p:[73,2,2061],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[74,3,2097],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[75,4,2136],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[75,25,2157]}],value:[{t:2,r:"adata.disk_used",p:[75,53,2185]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[75,87,2219]},"GQ/",{t:2,r:"adata.disk_size",p:[75,121,2253]},"GQ"]}]}]}," ",{p:[79,2,2322],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[82,4,2396],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[82,26,2418]}]},f:[{p:[84,5,2436],t:7,e:"i",f:[{t:2,r:"desc",p:[84,8,2439]}]},{p:[84,20,2451],t:7,e:"br"}," ",{p:[85,5,2461],t:7,e:"ui-section",a:{label:"State"},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[88,6,2502]}]}," ",{p:[91,5,2568],t:7,e:"ui-section",a:{Label:"Power Usage"},f:[{t:2,r:"powerusage",p:[92,6,2607]},"W"]}," ",{t:4,f:[{p:[95,6,2671],t:7,e:"ui-section",a:{label:"Toggle Component"},f:[{p:[96,7,2716],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["enabled"],s:'_0?"power-off":"close"'},p:[96,24,2733]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[96,108,2817]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"On":"Off"'},p:[97,8,2838]}]}]}],n:50,x:{r:["critical"],s:"!_0"},p:[94,5,2647]}," ",{p:[101,4,2922],t:7,e:"br"},{p:[101,8,2926],t:7,e:"br"}]}],n:52,r:"data.hardware",p:[81,3,2368]}]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],254:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=r.extend(a.exports)},{205:205}],255:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=r.extend(a.exports)},{205:205}],256:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[36,1,971],t:7,e:"ui-display",f:[{t:4,f:[{p:[38,3,1012],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[37,2,986]}," ",{t:4,f:[{p:[42,3,1077],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[45,3,1136],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[46,4,1166]}]}," ",{p:[48,3,1194],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[51,3,1253],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[53,5,1313],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[52,4,1283]},{t:4,n:51,f:[{p:[55,5,1346],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[58,3,1387],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[61,3,1439],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[62,4,1469],t:7,e:"table",f:[{p:[63,5,1482],t:7,e:"tr",f:[{p:[63,9,1486],t:7,e:"td",f:[{p:[63,13,1490],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[64,5,1550],t:7,e:"tr",f:[{p:[64,9,1554],t:7,e:"td",f:[{p:[64,13,1558],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[65,5,1626],t:7,e:"tr",f:[{p:[65,9,1630],t:7,e:"td",f:[{p:[65,13,1634],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[66,5,1714],t:7,e:"tr",f:[{p:[66,9,1718],t:7,e:"td",f:[{p:[66,13,1722],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[67,5,1790],t:7,e:"tr",f:[{p:[67,9,1794],t:7,e:"td",f:[{p:[67,13,1798],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[69,6,1902],t:7,e:"tr",f:[{p:[69,10,1906],t:7,e:"td",f:[{p:[69,14,1910],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[70,6,1981],t:7,e:"tr",f:[{p:[70,10,1985],t:7,e:"td",f:[{p:[70,14,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[71,6,2056],t:7,e:"tr",f:[{p:[71,10,2060],t:7,e:"td",f:[{p:[71,14,2064],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[68,5,1871]}]}]}]}]}," ",{p:[75,3,2170],t:7,e:"b",f:["Chat Window"]}," ",{p:[76,4,2193],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[77,4,2249],t:7,e:"div",a:{"class":"item"},f:[{p:[78,5,2273],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[80,7,2357]},{p:[80,14,2364],t:7,e:"br"}],n:52,r:"data.messages",p:[79,6,2326]}]}]}]}," ",{p:[85,3,2423],t:7,e:"b",f:["Connected Users"]},{p:[85,25,2445],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[87,4,2480]},{p:[87,12,2488],t:7,e:"br"}],n:52,r:"data.clients",p:[86,3,2453]}],n:50,r:"data.title",p:[41,2,1055]},{t:4,n:51,f:[{p:[90,3,2520],t:7,e:"b",f:["Controls:"]}," ",{p:[91,3,2540],t:7,e:"table",f:[{p:[92,4,2552],t:7,e:"tr",f:[{p:[92,8,2556],t:7,e:"td",f:[{p:[92,12,2560],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[93,4,2627],t:7,e:"tr",f:[{p:[93,8,2631],t:7,e:"td",f:[{p:[93,12,2635],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[94,4,2698],t:7,e:"tr",f:[{p:[94,8,2702],t:7,e:"td",f:[{p:[94,12,2706],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[96,3,2796],t:7,e:"b",f:["Available channels:"]}," ",{p:[97,3,2826],t:7,e:"table",f:[{t:4,f:[{p:[99,4,2871],t:7,e:"tr",f:[{p:[99,8,2875],t:7,e:"td",f:[{p:[99,12,2879],t:7,e:"ui-button", -a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[99,64,2931]},'"}']},f:[{t:2,r:"id",p:[99,74,2941]}]},{p:[99,92,2959],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[98,3,2837]}]}],r:"data.title"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],257:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[36,1,971],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[38,19,1024]},{p:[38,33,1038],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[37,2,986]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[40,39,1150]},"GQ/s",{p:[40,57,1168],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[42,4,1207]},{p:[42,12,1215],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[41,3,1176]}," ",{p:[44,3,1236],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[46,55,1350],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[48,24,1401]}],n:50,r:"data.focus",p:[47,3,1358]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[52,3,1471],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[52,54,1522],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[53,31,1584],t:7,e:"br"}," ",{t:4,f:[{p:[55,4,1618],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[55,61,1675]},'"}']},f:[{t:2,r:"id",p:[55,71,1685]}]}],n:52,r:"data.relays",p:[54,3,1592]}]}],r:"data.error"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],258:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,973],t:7,e:"ui-display",f:[{p:[38,2,988],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[38,97,1083],t:7,e:"hr"}," ",{t:4,f:[{p:[40,3,1112],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[41,4,1152],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[42,5,1190]}]}," ",{p:[44,4,1227],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[45,5,1267],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[39,2,1090]},{t:4,n:51,f:[{t:4,f:[{p:[52,4,1425],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[53,5,1468],t:7,e:"i",f:["Please wait..."]}," ",{p:[54,5,1495],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[55,6,1532]}]}," ",{p:[57,5,1578],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[58,6,1622]}]}," ",{p:[60,5,1668],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadcompletion",p:[61,6,1705]},"GQ / ",{t:2,r:"data.downloadsize",p:[61,38,1737]},"GQ"]}," ",{p:[63,5,1785],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[64,6,1826]}," GQ/s"]}," ",{p:[66,5,1878],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[67,6,1923],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[67,27,1944]}],value:[{t:2,r:"adata.downloadcompletion",p:[67,58,1975]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[67,101,2018]},"/",{t:2,r:"adata.downloadsize",p:[67,142,2059]}]}]}]}],n:50,r:"data.downloadname",p:[51,3,1395]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[74,4,2205],t:7,e:"ui-display",a:{title:"Primary software repository"},f:[{p:[75,5,2259],t:7,e:"ui-section",a:{label:"Hard drive"},f:[{p:[76,6,2297],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[76,27,2318]}],value:[{t:2,r:"adata.disk_used",p:[76,55,2346]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[76,89,2380]},"GQ/",{t:2,r:"adata.disk_size",p:[76,123,2414]},"GQ"]}]}," ",{t:4,f:[{p:[79,6,2512],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[80,7,2550]}," (",{t:2,r:"size",p:[80,21,2564]}," GQ)"]}," ",{p:[82,6,2603],t:7,e:"ui-section",a:{label:"Program name"},f:[{t:2,r:"filedesc",p:[83,7,2644]}]}," ",{p:[85,6,2684],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"fileinfo",p:[86,7,2724]}]}," ",{p:[88,6,2763],t:7,e:"ui-section",a:{label:"File controls"},f:[{p:[89,7,2805],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[89,80,2878]},'"}']},f:["DOWNLOAD"]}]}],n:52,r:"data.downloadable_programs",p:[78,5,2469]}]}," ",{t:4,f:[{p:[96,5,3023],t:7,e:"ui-display",a:{title:"UNKNOWN software repository"},f:[{p:[97,6,3078],t:7,e:"i",f:["Please note that NanoTrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[99,7,3224],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[100,8,3263]}," (",{t:2,r:"size",p:[100,22,3277]}," GQ)"]}," ",{p:[102,7,3318],t:7,e:"ui-section",a:{label:"Program name"},f:[{t:2,r:"filedesc",p:[103,8,3360]}]}," ",{p:[105,7,3402],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"fileinfo",p:[106,8,3443]}]}," ",{p:[108,7,3484],t:7,e:"ui-section",a:{label:"File controls"},f:[{p:[109,8,3527],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[109,81,3600]},'"}']},f:["DOWNLOAD"]}]}],n:52,r:"data.hacked_programs",p:[98,6,3186]}]}],n:50,r:"data.hackedavailable",p:[95,4,2989]}],n:50,x:{r:["data.error"],s:"!_0"},p:[73,3,2181]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[72,2,2151]}," ",{p:[118,2,3748],t:7,e:"br"},{p:[118,6,3752],t:7,e:"br"},{p:[118,10,3756],t:7,e:"hr"},{p:[118,14,3760],t:7,e:"i",f:["NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],259:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[3,1,4],t:7,e:"ui-display",f:[{p:[4,2,19],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,48],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,71],t:7,e:"table",f:[{p:[6,11,78],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,147],t:7,e:"td",f:[{p:[8,9,151],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,161]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,87]}," ",{t:4,f:[{p:[11,5,266],t:7,e:"td",f:[{p:[11,9,270],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,273]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,203]}," ",{t:4,f:[{p:[14,5,351],t:7,e:"td",f:[{p:[14,9,355],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,365]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,320]}," ",{t:4,f:[{p:[17,5,438],t:7,e:"td",f:[{p:[17,9,442],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,452]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,405]}," ",{t:4,f:[{p:[20,5,527],t:7,e:"td",f:[{p:[20,9,531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,534]},{p:[20,35,557],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,494]}," ",{t:4,f:[{p:[23,5,615],t:7,e:"td",f:[{p:[23,9,619],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,629]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,577]}]}]}]}]}," ",{p:[28,2,688],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,718],t:7,e:"table",f:[{p:[29,10,725],t:7,e:"tr",f:[{p:[30,4,734],t:7,e:"td",f:[{p:[30,8,738],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,832],t:7,e:"td",f:[{p:[32,9,836],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,894],t:7,e:"td",f:[{p:[33,9,898],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,795]}]}]}]}]}," ",{p:[37,2,994],t:7,e:"div",a:{style:"clear: both"},f:[{p:[39,2,1024],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[41,3,1072],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[42,4,1116],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[42,7,1119]}]}]}," ",{t:4,f:[{p:[45,4,1193],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[46,6,1234],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[46,9,1237]}]}]}," ",{p:[48,4,1309],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[50,4,1344],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[54,4,1443],t:7,e:"br"},{p:[54,8,1447],t:7,e:"br"}," ",{p:[55,4,1456],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[44,3,1164]},{t:4,n:51,f:[{p:[57,4,1593],t:7,e:"br"},{p:[57,8,1597],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[62,2,1693],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[64,2,1741],t:7,e:"table",f:[{p:[65,3,1752],t:7,e:"tr",f:[{p:[66,4,1761],t:7,e:"th",f:["PROTOCOL"]},{p:[67,4,1778],t:7,e:"th",f:["STATUS"]},{p:[68,4,1793],t:7,e:"th",f:["CONTROL"]}]},{p:[69,3,1808],t:7,e:"tr",f:[" ",{p:[70,4,1817],t:7,e:"td",f:["Software Downloads"]},{p:[71,4,1844],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[71,8,1848]}]},{p:[72,4,1910],t:7,e:"td",f:[" ",{p:[72,9,1915],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[73,3,1994],t:7,e:"tr",f:[" ",{p:[74,4,2003],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[75,4,2032],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[75,8,2036]}]},{p:[76,4,2092],t:7,e:"td",f:[{p:[76,8,2096],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[77,3,2175],t:7,e:"tr",f:[" ",{p:[78,4,2184],t:7,e:"td",f:["Communication Systems"]},{p:[79,4,2214],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[79,8,2218]}]},{p:[80,4,2277],t:7,e:"td",f:[{p:[80,8,2281],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[81,3,2360],t:7,e:"tr",f:[" ",{p:[82,4,2369],t:7,e:"td",f:["Remote System Control"]},{p:[83,4,2399],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[83,8,2403]}]},{p:[84,4,2462],t:7,e:"td",f:[{p:[84,8,2466],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[88,2,2573],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[91,4,2642],t:7,e:"ui-notice",f:[{p:[92,5,2659],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[94,5,2717],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[90,3,2616]}," ",{p:[97,3,2845],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[98,4,2897],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[98,7,2900]}]}]}," ",{p:[101,3,2972],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[102,4,3015],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[102,7,3018]}]}]}," ",{p:[105,3,3068],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[107,4,3119],t:7,e:"table",f:[{p:[108,4,3131],t:7,e:"tr",f:[{p:[108,8,3135],t:7,e:"td",f:[{p:[108,12,3139],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[109,4,3194],t:7,e:"tr",f:[{p:[109,8,3198],t:7,e:"td",f:[{p:[109,12,3202],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[110,4,3259],t:7,e:"tr",f:[{p:[110,8,3263],t:7,e:"td",f:[{p:[110,12,3267],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[111,4,3331],t:7,e:"tr",f:[{p:[111,8,3335],t:7,e:"td",f:[{p:[111,12,3339],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[114,3,3410],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[115,3,3449],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[116,3,3504],t:7,e:"div",a:{"class":"item"},f:[{p:[117,4,3527],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[119,6,3610]},{p:[119,15,3619],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[118,5,3579]}]}]}]}]}]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],260:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=r.extend(a.exports)},{205:205}],261:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-display",f:[{p:[4,2,19],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,48],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,71],t:7,e:"table",f:[{p:[6,11,78],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,147],t:7,e:"td",f:[{p:[8,9,151],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,161]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,87]}," ",{t:4,f:[{p:[11,5,266],t:7,e:"td",f:[{p:[11,9,270],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,273]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,203]}," ",{t:4,f:[{p:[14,5,351],t:7,e:"td",f:[{p:[14,9,355],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,365]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,320]}," ",{t:4,f:[{p:[17,5,438],t:7,e:"td",f:[{p:[17,9,442],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,452]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,405]}," ",{t:4,f:[{p:[20,5,527],t:7,e:"td",f:[{p:[20,9,531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,534]},{p:[20,35,557],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,494]}," ",{t:4,f:[{p:[23,5,615],t:7,e:"td",f:[{p:[23,9,619],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,629]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,577]}]}]}]}]}," ",{p:[28,2,688],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,718],t:7,e:"table",f:[{p:[29,10,725],t:7,e:"tr",f:[{p:[30,4,734],t:7,e:"td",f:[{p:[30,8,738],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,832],t:7,e:"td",f:[{p:[32,9,836],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,894],t:7,e:"td",f:[{p:[33,9,898],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,795]}]}]}]}]}," ",{p:[37,2,994],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[40,2,1045],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1067],t:7,e:"h2",f:["An error has occured during operation..."]}," ",{p:[42,3,1120],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[42,34,1151]},{p:[42,48,1165],t:7,e:"br"}," ",{p:[43,3,1173],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[39,2,1024]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[46,3,1263],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[47,3,1299],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[50,3,1358],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[51,4,1388]}]}," ",{p:[53,3,1425],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[56,3,1486],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[57,4,1516]}," / ",{t:2,r:"data.download_size",p:[57,33,1545]}," GQ"]}," ",{p:[59,3,1584],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[62,3,1642],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[63,4,1672]},"GQ/s"]}," ",{p:[65,3,1716],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[68,3,1768],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[69,4,1798],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[72,3,1896],t:7,e:"h2",f:["Server enabled"]}," ",{p:[73,3,1923],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[76,3,1984],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[77,4,2014]}]}," ",{p:[79,3,2051],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[82,3,2108],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[83,4,2138]}]}," ",{p:[85,3,2176],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[88,3,2235],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.haspassword",p:[89,4,2265]},{t:4,n:51,f:["DISABLED"],r:"data.haspassword"}]}," ",{p:[95,3,2355],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[98,3,2407],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[99,4,2437],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[100,4,2502],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[103,3,2603],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[104,3,2667],t:7,e:"table",f:[{p:[105,3,2678],t:7,e:"tr",f:[{p:[105,7,2682],t:7,e:"th",f:["File name"]},{p:[105,20,2695],t:7,e:"th",f:["File size"]},{p:[105,33,2708],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[107,4,2759],t:7,e:"tr",f:[{p:[107,8,2763],t:7,e:"td",f:[{t:2,r:"filename",p:[107,12,2767]}]},{p:[108,4,2784],t:7,e:"td",f:[{t:2,r:"size",p:[108,8,2788]},"GQ"]},{p:[109,4,2803],t:7,e:"td",f:[{p:[109,8,2807],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[109,59,2858]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[106,3,2724]}]}]}]}," ",{p:[112,3,2916],t:7,e:"hr"}," ",{p:[113,3,2924],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[114,3,2988],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[116,3,3051],t:7,e:"h2",f:["Available files:"]}," ",{p:[117,3,3080],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[117,55,3132],t:7,e:"tr",f:[{p:[117,59,3136],t:7,e:"th",f:["Server UID"]},{p:[117,73,3150],t:7,e:"th",f:["File Name"]},{p:[117,86,3163],t:7,e:"th",f:["File Size"]},{p:[117,99,3176],t:7,e:"th",f:["Password Protection"]},{p:[117,122,3199],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[119,5,3246],t:7,e:"tr",f:[{p:[119,9,3250],t:7,e:"td",f:[{t:2,r:"uid",p:[119,13,3254]}]},{p:[120,5,3267],t:7,e:"td",f:[{t:2,r:"filename",p:[120,9,3271]}]},{p:[121,5,3289],t:7,e:"td",f:[{t:2,r:"size",p:[121,9,3293]},"GQ ",{t:4,f:[{p:[123,6,3335],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[122,5,3309]}," ",{t:4,f:[{p:[126,6,3392],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[125,5,3365]}]},{p:[129,5,3429],t:7,e:"td",f:[{p:[129,9,3433],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[129,62,3486]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[118,4,3218]}]}]}]}," ",{p:[132,3,3547],t:7,e:"hr"}," ",{p:[133,3,3555],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],262:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],263:[function(t,e,n){var r=t(205),a={exports:{}};!function(e){"use strict";var n=t(293);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var r="";return t&&(r+="REQUIREMENTS: "+t+" "),e&&(r+="CATALYSTS: "+e+" "),n&&(r+="TOOLS: "+n),r}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,r,a){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(a),a.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]}]},f:[{t:4,f:[{p:[50,3,1404],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1433],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1383]},{t:4,n:51,f:[{p:[54,3,1502],t:7,e:"ui-section",f:[{p:[55,4,1519],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[56,5,1575]}]}," ",{p:[58,4,1614],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[59,5,1670]}]}," ",{t:4,f:[{p:[62,5,1750],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[61,4,1709]},{t:4,n:51,f:[{p:[66,5,1866],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}," ",{p:[70,4,1976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[70,21,1993]}],action:"toggle_compact"},f:["Compact"]}," ",{t:4,f:[{t:4,f:[" ",{p:[75,6,2226],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[75,23,2243]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[74,5,2136]}],n:50,r:"config.fancy",p:[73,4,2110]}]}," ",{t:4,f:[{p:[80,5,2378],t:7,e:"ui-display",f:[{t:4,f:[{p:[82,6,2427],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[82,25,2446]}]},f:[{p:[83,7,2464],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[83,27,2484]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[83,135,2592]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[81,5,2396]}," ",{t:4,f:[{t:4,f:[{p:[90,7,2801],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[90,26,2820]}]},f:[{p:[91,8,2839],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[91,28,2859]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[89,6,2768]}],n:51,r:"data.display_craftable_only",p:[88,5,2729]}]}],n:50,r:"data.display_compact",p:[79,4,2344]},{t:4,n:51,f:[{t:4,f:[{p:[100,6,3181],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[100,25,3200]}]},f:[{t:4,f:[{p:[102,8,3243],t:7,e:"ui-section",a:{ -label:"Requirements"},f:[{t:2,r:"req_text",p:[103,9,3286]}]}],n:50,r:"req_text",p:[101,7,3218]}," ",{t:4,f:[{p:[107,8,3373],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[108,9,3413]}]}],n:50,r:"catalyst_text",p:[106,7,3343]}," ",{t:4,f:[{p:[112,8,3501],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[113,9,3537]}]}],n:50,r:"tool_text",p:[111,7,3475]}," ",{p:[116,7,3595],t:7,e:"ui-section",f:[{p:[117,8,3616],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[117,66,3674]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[99,5,3150]}," ",{t:4,f:[{t:4,f:[{p:[125,7,3855],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[125,26,3874]}]},f:[{t:4,f:[{p:[127,9,3919],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[128,10,3963]}]}],n:50,r:"req_text",p:[126,8,3893]}," ",{t:4,f:[{p:[132,9,4054],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[133,10,4095]}]}],n:50,r:"catalyst_text",p:[131,8,4023]}," ",{t:4,f:[{p:[137,9,4187],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[138,10,4224]}]}],n:50,r:"tool_text",p:[136,8,4160]}]}],n:52,r:"data.cant_craft",p:[124,6,3822]}],n:51,r:"data.display_craftable_only",p:[123,5,3783]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=r.extend(a.exports)},{205:205,293:293}],264:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(a.exports)},{205:205}],265:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[13,3,461],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,493],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,510]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,561]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,618]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[22,7,787],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[22,38,818]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[21,5,759]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[26,3,938],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[27,4,969]}]}," ",{p:[29,3,1011],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[30,4,1045]}," kPa"]}],n:50,r:"data.holding",p:[25,3,914]},{t:4,n:51,f:[{p:[33,3,1119],t:7,e:"ui-section",f:[{p:[34,4,1136],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(a.exports)},{205:205}],266:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(a),a.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}," W"]}]}," ",{p:[52,5,1466],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1501],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1507]}," W"]}]}],r:"config.fancy"}]}," ",{p:[57,1,1578],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1608],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1633],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1670],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1709],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1746],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1785],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1827],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1868],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1953],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1972]}],nowrap:0},f:[{p:[69,7,1997],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2018]}," %"]}," ",{p:[70,7,2076],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[70,28,2097]}," W"]}," ",{p:[71,7,2153],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2174],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2187]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2216]}]}]}," ",{p:[72,7,2263],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2284],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2297]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2320]}," [",{p:[72,87,2343],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2349]}]},"]"]}]}," ",{p:[73,7,2398],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2419],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2432]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2455]}," [",{p:[73,87,2478],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2484]}]},"]"]}]}," ",{p:[74,7,2533],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2554],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2567]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2590]}," [",{p:[74,87,2613],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2619]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1927]}]}]},e.exports=r.extend(a.exports)},{205:205}],267:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(a),a.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"div",a:{style:"float: left"},f:[{p:[43,2,1063],t:7,e:"div",a:{"class":"item"},f:[{p:[44,3,1085],t:7,e:"table",f:[{p:[44,10,1092],t:7,e:"tr",f:[{t:4,f:[{p:[46,4,1159],t:7,e:"td",f:[{p:[46,8,1163],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[46,18,1173]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[45,3,1100]}," ",{t:4,f:[{p:[49,4,1275],t:7,e:"td",f:[{p:[49,8,1279],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[49,11,1282]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[48,3,1213]}," ",{t:4,f:[{p:[52,4,1357],t:7,e:"td",f:[{p:[52,8,1361],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[52,18,1371]}]}}]}],n:50,r:"data.PC_ntneticon",p:[51,3,1327]}," ",{t:4,f:[{p:[55,4,1441],t:7,e:"td",f:[{p:[55,8,1445],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[55,18,1455]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[54,3,1409]}," ",{t:4,f:[{p:[58,4,1527],t:7,e:"td",f:[{p:[58,8,1531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[58,11,1534]},{p:[58,34,1557],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[57,3,1495]}," ",{t:4,f:[{p:[61,4,1612],t:7,e:"td",f:[{p:[61,8,1616],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[61,18,1626]}]}}]}],n:52,r:"data.PC_programheaders",p:[60,3,1575]}]}]}]}]}," ",{p:[66,1,1680],t:7,e:"div",a:{style:"float: right"},f:[{p:[67,2,1709],t:7,e:"table",f:[{p:[67,9,1716],t:7,e:"tr",f:[{p:[68,3,1724],t:7,e:"td",f:[{p:[68,7,1728],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[70,4,1820],t:7,e:"td",f:[{p:[70,8,1824],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[71,4,1881],t:7,e:"td",f:[{p:[71,8,1885],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[69,3,1784]}]}]}]}]}," ",{p:[75,1,1977],t:7,e:"div",a:{style:"clear: both"},f:[{p:[77,1,2006],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[79,5,2064],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[79,27,2086]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[81,38,2238]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[82,15,2294]}],yinc:"9"}}],n:50,r:"config.fancy",p:[78,3,2038]},{t:4,n:51,f:[{p:[84,5,2344],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[85,7,2382],t:7,e:"span",f:[{t:2,r:"data.supply",p:[85,13,2388]}," W"]}]}," ",{p:[87,5,2437],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[88,9,2472],t:7,e:"span",f:[{t:2,r:"data.demand",p:[88,15,2478]}," W"]}]}],r:"config.fancy"}]}," ",{p:[92,1,2549],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[93,3,2579],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[94,5,2604],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[95,5,2641],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[96,5,2680],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[97,5,2717],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[98,5,2756],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[99,5,2798],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[100,5,2839],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[103,5,2924],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[103,24,2943]}],nowrap:0},f:[{p:[104,7,2968],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[104,28,2989]}," %"]}," ",{p:[105,7,3047],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[105,28,3068]}," W"]}," ",{p:[106,7,3124],t:7,e:"div",a:{"class":"content"},f:[{p:[106,28,3145],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[106,41,3158]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[106,70,3187]}]}]}," ",{p:[107,7,3234],t:7,e:"div",a:{"class":"content"},f:[{p:[107,28,3255],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[107,41,3268]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[107,64,3291]}," [",{p:[107,87,3314],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[107,93,3320]}]},"]"]}]}," ",{p:[108,7,3369],t:7,e:"div",a:{"class":"content"},f:[{p:[108,28,3390],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[108,41,3403]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[108,64,3426]}," [",{p:[108,87,3449],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[108,93,3455]}]},"]"]}]}," ",{p:[109,7,3504],t:7,e:"div",a:{"class":"content"},f:[{p:[109,28,3525],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[109,41,3538]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[109,64,3561]}," [",{p:[109,87,3584],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[109,93,3590]}]},"]"]}]}]}],n:52,r:"data.areas",p:[102,3,2898]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],268:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(a),a.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=r.extend(a.exports)},{205:205}],269:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,973],t:7,e:"ui-display",f:[{p:[38,2,988],t:7,e:"div",a:{"class":"item"},f:[{p:[39,3,1010],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[42,3,1067],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[43,4,1097]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[49,3,1179],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[52,3,1230],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,4,1260],t:7,e:"table",f:[{p:[54,4,1272],t:7,e:"tr",f:[{p:[54,8,1276],t:7,e:"td",f:[{p:[54,12,1280],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[55,4,1353],t:7,e:"tr",f:[{p:[55,8,1357],t:7,e:"td",f:[{p:[55,12,1361],t:7,e:"ui-button",a:{action:"PRG_arm"},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[55,40,1389]}]}," ",{p:[56,4,1439],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[56,39,1474]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],270:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},a.exports.components=a.exports.components||{};var i={modification:t(271),templates:t(273),status:t(272)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,271:271,272:272,273:273}],271:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=r.extend(a.exports)},{205:205}],272:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=r.extend(a.exports)},{205:205}],273:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=r.extend(a.exports)},{205:205}],274:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(a),a.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}," ",{p:[23,5,658],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,7,693],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[24,20,706]}],max:[{t:2,r:"data.occupant.maxHealth",p:[24,54,740]}],value:[{t:2,r:"data.occupant.health",p:[24,90,776]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[25,16,818]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[25,68,870]}]}]}," ",{t:4,f:[{p:[28,7,1107],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[28,26,1126]}]},f:[{p:[29,9,1147],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[29,30,1168]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[29,66,1204]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[29,103,1241]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[27,5,941]}," ",{p:[32,5,1328],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[33,9,1364],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[33,22,1377]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[33,68,1423]}]}]}," ",{p:[35,5,1506],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[36,9,1542],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[36,22,1555]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[36,68,1601]}]}]}," ",{p:[38,5,1685],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[40,11,1772],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[40,54,1815]}," units of ",{t:2,r:"name",p:[40,89,1850]}]},{p:[40,104,1865],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[39,9,1727]},{t:4,n:51,f:[{p:[42,11,1900],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[47,1,1996],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[48,2,2028],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[49,5,2059],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[49,22,2076]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[49,71,2125]}]}]}," ",{p:[51,3,2190],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[53,7,2251],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[53,38,2282]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[53,122,2366]},'"}']},f:[{t:2,r:"name",p:[53,132,2376]}]},{p:[53,152,2396],t:7,e:"br"}],n:52,r:"data.chems",p:[52,5,2223]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],275:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:2,x:{r:["is_current"],s:'_0?"You Are Here":"Swap"'},p:[10,7,491]}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=r.extend(a.exports)},{205:205}],276:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827] +a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[99,64,2931]},'"}']},f:[{t:2,r:"chan",p:[99,74,2941]}]},{p:[99,94,2961],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[98,3,2837]}]}],r:"data.title"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],257:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[36,1,971],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[38,19,1024]},{p:[38,33,1038],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[37,2,986]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[40,39,1150]},"GQ/s",{p:[40,57,1168],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[42,4,1207]},{p:[42,12,1215],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[41,3,1176]}," ",{p:[44,3,1236],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[46,55,1350],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[48,24,1401]}],n:50,r:"data.focus",p:[47,3,1358]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[52,3,1471],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[52,54,1522],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[53,31,1584],t:7,e:"br"}," ",{t:4,f:[{p:[55,4,1618],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[55,61,1675]},'"}']},f:[{t:2,r:"id",p:[55,71,1685]}]}],n:52,r:"data.relays",p:[54,3,1592]}]}],r:"data.error"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],258:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,973],t:7,e:"ui-display",f:[{p:[38,2,988],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[38,97,1083],t:7,e:"hr"}," ",{t:4,f:[{p:[40,3,1112],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[41,4,1152],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[42,5,1190]}]}," ",{p:[44,4,1227],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[45,5,1267],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[39,2,1090]},{t:4,n:51,f:[{t:4,f:[{p:[52,4,1425],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[53,5,1468],t:7,e:"i",f:["Please wait..."]}," ",{p:[54,5,1495],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[55,6,1532]}]}," ",{p:[57,5,1578],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[58,6,1622]}]}," ",{p:[60,5,1668],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadcompletion",p:[61,6,1705]},"GQ / ",{t:2,r:"data.downloadsize",p:[61,38,1737]},"GQ"]}," ",{p:[63,5,1785],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[64,6,1826]}," GQ/s"]}," ",{p:[66,5,1878],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[67,6,1923],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[67,27,1944]}],value:[{t:2,r:"adata.downloadcompletion",p:[67,58,1975]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[67,101,2018]},"/",{t:2,r:"adata.downloadsize",p:[67,142,2059]}]}]}]}],n:50,r:"data.downloadname",p:[51,3,1395]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[74,4,2205],t:7,e:"ui-display",a:{title:"Primary software repository"},f:[{p:[75,5,2259],t:7,e:"ui-section",a:{label:"Hard drive"},f:[{p:[76,6,2297],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[76,27,2318]}],value:[{t:2,r:"adata.disk_used",p:[76,55,2346]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[76,89,2380]},"GQ/",{t:2,r:"adata.disk_size",p:[76,123,2414]},"GQ"]}]}," ",{t:4,f:[{p:[79,6,2512],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[80,7,2550]}," (",{t:2,r:"size",p:[80,21,2564]}," GQ)"]}," ",{p:[82,6,2603],t:7,e:"ui-section",a:{label:"Program name"},f:[{t:2,r:"filedesc",p:[83,7,2644]}]}," ",{p:[85,6,2684],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"fileinfo",p:[86,7,2724]}]}," ",{p:[88,6,2763],t:7,e:"ui-section",a:{label:"File controls"},f:[{p:[89,7,2805],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[89,80,2878]},'"}']},f:["DOWNLOAD"]}]}],n:52,r:"data.downloadable_programs",p:[78,5,2469]}]}," ",{t:4,f:[{p:[96,5,3023],t:7,e:"ui-display",a:{title:"UNKNOWN software repository"},f:[{p:[97,6,3078],t:7,e:"i",f:["Please note that NanoTrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[99,7,3224],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[100,8,3263]}," (",{t:2,r:"size",p:[100,22,3277]}," GQ)"]}," ",{p:[102,7,3318],t:7,e:"ui-section",a:{label:"Program name"},f:[{t:2,r:"filedesc",p:[103,8,3360]}]}," ",{p:[105,7,3402],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"fileinfo",p:[106,8,3443]}]}," ",{p:[108,7,3484],t:7,e:"ui-section",a:{label:"File controls"},f:[{p:[109,8,3527],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[109,81,3600]},'"}']},f:["DOWNLOAD"]}]}],n:52,r:"data.hacked_programs",p:[98,6,3186]}]}],n:50,r:"data.hackedavailable",p:[95,4,2989]}],n:50,x:{r:["data.error"],s:"!_0"},p:[73,3,2181]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[72,2,2151]}," ",{p:[118,2,3748],t:7,e:"br"},{p:[118,6,3752],t:7,e:"br"},{p:[118,10,3756],t:7,e:"hr"},{p:[118,14,3760],t:7,e:"i",f:["NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],259:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[3,1,4],t:7,e:"ui-display",f:[{p:[4,2,19],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,48],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,71],t:7,e:"table",f:[{p:[6,11,78],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,147],t:7,e:"td",f:[{p:[8,9,151],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,161]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,87]}," ",{t:4,f:[{p:[11,5,266],t:7,e:"td",f:[{p:[11,9,270],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,273]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,203]}," ",{t:4,f:[{p:[14,5,351],t:7,e:"td",f:[{p:[14,9,355],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,365]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,320]}," ",{t:4,f:[{p:[17,5,438],t:7,e:"td",f:[{p:[17,9,442],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,452]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,405]}," ",{t:4,f:[{p:[20,5,527],t:7,e:"td",f:[{p:[20,9,531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,534]},{p:[20,35,557],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,494]}," ",{t:4,f:[{p:[23,5,615],t:7,e:"td",f:[{p:[23,9,619],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,629]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,577]}]}]}]}]}," ",{p:[28,2,688],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,718],t:7,e:"table",f:[{p:[29,10,725],t:7,e:"tr",f:[{p:[30,4,734],t:7,e:"td",f:[{p:[30,8,738],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,832],t:7,e:"td",f:[{p:[32,9,836],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,894],t:7,e:"td",f:[{p:[33,9,898],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,795]}]}]}]}]}," ",{p:[37,2,994],t:7,e:"div",a:{style:"clear: both"},f:[{p:[39,2,1024],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[41,3,1072],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[42,4,1116],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[42,7,1119]}]}]}," ",{t:4,f:[{p:[45,4,1193],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[46,6,1234],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[46,9,1237]}]}]}," ",{p:[48,4,1309],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[50,4,1344],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[54,4,1443],t:7,e:"br"},{p:[54,8,1447],t:7,e:"br"}," ",{p:[55,4,1456],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[44,3,1164]},{t:4,n:51,f:[{p:[57,4,1593],t:7,e:"br"},{p:[57,8,1597],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[62,2,1693],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[64,2,1741],t:7,e:"table",f:[{p:[65,3,1752],t:7,e:"tr",f:[{p:[66,4,1761],t:7,e:"th",f:["PROTOCOL"]},{p:[67,4,1778],t:7,e:"th",f:["STATUS"]},{p:[68,4,1793],t:7,e:"th",f:["CONTROL"]}]},{p:[69,3,1808],t:7,e:"tr",f:[" ",{p:[70,4,1817],t:7,e:"td",f:["Software Downloads"]},{p:[71,4,1844],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[71,8,1848]}]},{p:[72,4,1910],t:7,e:"td",f:[" ",{p:[72,9,1915],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[73,3,1994],t:7,e:"tr",f:[" ",{p:[74,4,2003],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[75,4,2032],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[75,8,2036]}]},{p:[76,4,2092],t:7,e:"td",f:[{p:[76,8,2096],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[77,3,2175],t:7,e:"tr",f:[" ",{p:[78,4,2184],t:7,e:"td",f:["Communication Systems"]},{p:[79,4,2214],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[79,8,2218]}]},{p:[80,4,2277],t:7,e:"td",f:[{p:[80,8,2281],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[81,3,2360],t:7,e:"tr",f:[" ",{p:[82,4,2369],t:7,e:"td",f:["Remote System Control"]},{p:[83,4,2399],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[83,8,2403]}]},{p:[84,4,2462],t:7,e:"td",f:[{p:[84,8,2466],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[88,2,2573],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[91,4,2642],t:7,e:"ui-notice",f:[{p:[92,5,2659],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[94,5,2717],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[90,3,2616]}," ",{p:[97,3,2845],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[98,4,2897],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[98,7,2900]}]}]}," ",{p:[101,3,2972],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[102,4,3015],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[102,7,3018]}]}]}," ",{p:[105,3,3068],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[107,4,3119],t:7,e:"table",f:[{p:[108,4,3131],t:7,e:"tr",f:[{p:[108,8,3135],t:7,e:"td",f:[{p:[108,12,3139],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[109,4,3194],t:7,e:"tr",f:[{p:[109,8,3198],t:7,e:"td",f:[{p:[109,12,3202],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[110,4,3259],t:7,e:"tr",f:[{p:[110,8,3263],t:7,e:"td",f:[{p:[110,12,3267],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[111,4,3331],t:7,e:"tr",f:[{p:[111,8,3335],t:7,e:"td",f:[{p:[111,12,3339],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[114,3,3410],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[115,3,3449],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[116,3,3504],t:7,e:"div",a:{"class":"item"},f:[{p:[117,4,3527],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[119,6,3610]},{p:[119,15,3619],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[118,5,3579]}]}]}]}]}]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],260:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=r.extend(a.exports)},{205:205}],261:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-display",f:[{p:[4,2,19],t:7,e:"div",a:{style:"float: left"},f:[{p:[5,3,48],t:7,e:"div",a:{"class":"item"},f:[{p:[6,4,71],t:7,e:"table",f:[{p:[6,11,78],t:7,e:"tr",f:[{t:4,f:[{p:[8,5,147],t:7,e:"td",f:[{p:[8,9,151],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[8,19,161]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[7,4,87]}," ",{t:4,f:[{p:[11,5,266],t:7,e:"td",f:[{p:[11,9,270],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[11,12,273]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[10,4,203]}," ",{t:4,f:[{p:[14,5,351],t:7,e:"td",f:[{p:[14,9,355],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[14,19,365]}]}}]}],n:50,r:"data.PC_ntneticon",p:[13,4,320]}," ",{t:4,f:[{p:[17,5,438],t:7,e:"td",f:[{p:[17,9,442],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[17,19,452]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[16,4,405]}," ",{t:4,f:[{p:[20,5,527],t:7,e:"td",f:[{p:[20,9,531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[20,12,534]},{p:[20,35,557],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[19,4,494]}," ",{t:4,f:[{p:[23,5,615],t:7,e:"td",f:[{p:[23,9,619],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[23,19,629]}]}}]}],n:52,r:"data.PC_programheaders",p:[22,4,577]}]}]}]}]}," ",{p:[28,2,688],t:7,e:"div",a:{style:"float: right"},f:[{p:[29,3,718],t:7,e:"table",f:[{p:[29,10,725],t:7,e:"tr",f:[{p:[30,4,734],t:7,e:"td",f:[{p:[30,8,738],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[32,5,832],t:7,e:"td",f:[{p:[32,9,836],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[33,5,894],t:7,e:"td",f:[{p:[33,9,898],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[31,4,795]}]}]}]}]}," ",{p:[37,2,994],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[40,2,1045],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1067],t:7,e:"h2",f:["An error has occured during operation..."]}," ",{p:[42,3,1120],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[42,34,1151]},{p:[42,48,1165],t:7,e:"br"}," ",{p:[43,3,1173],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[39,2,1024]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[46,3,1263],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[47,3,1299],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[50,3,1358],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[51,4,1388]}]}," ",{p:[53,3,1425],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[56,3,1486],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[57,4,1516]}," / ",{t:2,r:"data.download_size",p:[57,33,1545]}," GQ"]}," ",{p:[59,3,1584],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[62,3,1642],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[63,4,1672]},"GQ/s"]}," ",{p:[65,3,1716],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[68,3,1768],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[69,4,1798],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[72,3,1896],t:7,e:"h2",f:["Server enabled"]}," ",{p:[73,3,1923],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[76,3,1984],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[77,4,2014]}]}," ",{p:[79,3,2051],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[82,3,2108],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[83,4,2138]}]}," ",{p:[85,3,2176],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[88,3,2235],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.haspassword",p:[89,4,2265]},{t:4,n:51,f:["DISABLED"],r:"data.haspassword"}]}," ",{p:[95,3,2355],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[98,3,2407],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[99,4,2437],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[100,4,2502],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[103,3,2603],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[104,3,2667],t:7,e:"table",f:[{p:[105,3,2678],t:7,e:"tr",f:[{p:[105,7,2682],t:7,e:"th",f:["File name"]},{p:[105,20,2695],t:7,e:"th",f:["File size"]},{p:[105,33,2708],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[107,4,2759],t:7,e:"tr",f:[{p:[107,8,2763],t:7,e:"td",f:[{t:2,r:"filename",p:[107,12,2767]}]},{p:[108,4,2784],t:7,e:"td",f:[{t:2,r:"size",p:[108,8,2788]},"GQ"]},{p:[109,4,2803],t:7,e:"td",f:[{p:[109,8,2807],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[109,59,2858]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[106,3,2724]}]}]}]}," ",{p:[112,3,2916],t:7,e:"hr"}," ",{p:[113,3,2924],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[114,3,2988],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[116,3,3051],t:7,e:"h2",f:["Available files:"]}," ",{p:[117,3,3080],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[117,55,3132],t:7,e:"tr",f:[{p:[117,59,3136],t:7,e:"th",f:["Server UID"]},{p:[117,73,3150],t:7,e:"th",f:["File Name"]},{p:[117,86,3163],t:7,e:"th",f:["File Size"]},{p:[117,99,3176],t:7,e:"th",f:["Password Protection"]},{p:[117,122,3199],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[119,5,3246],t:7,e:"tr",f:[{p:[119,9,3250],t:7,e:"td",f:[{t:2,r:"uid",p:[119,13,3254]}]},{p:[120,5,3267],t:7,e:"td",f:[{t:2,r:"filename",p:[120,9,3271]}]},{p:[121,5,3289],t:7,e:"td",f:[{t:2,r:"size",p:[121,9,3293]},"GQ ",{t:4,f:[{p:[123,6,3335],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[122,5,3309]}," ",{t:4,f:[{p:[126,6,3392],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[125,5,3365]}]},{p:[129,5,3429],t:7,e:"td",f:[{p:[129,9,3433],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[129,62,3486]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[118,4,3218]}]}]}]}," ",{p:[132,3,3547],t:7,e:"hr"}," ",{p:[133,3,3555],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],262:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],263:[function(t,e,n){var r=t(205),a={exports:{}};!function(e){"use strict";var n=t(293);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var r="";return t&&(r+="REQUIREMENTS: "+t+" "),e&&(r+="CATALYSTS: "+e+" "),n&&(r+="TOOLS: "+n),r}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,r,a){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(a),a.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]}]},f:[{t:4,f:[{p:[50,3,1404],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1433],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1383]},{t:4,n:51,f:[{p:[54,3,1502],t:7,e:"ui-section",f:[{p:[55,4,1519],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[56,5,1575]}]}," ",{p:[58,4,1614],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[59,5,1670]}]}," ",{t:4,f:[{p:[62,5,1750],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[61,4,1709]},{t:4,n:51,f:[{p:[66,5,1866],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}," ",{p:[70,4,1976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[70,21,1993]}],action:"toggle_compact"},f:["Compact"]}," ",{t:4,f:[{t:4,f:[" ",{p:[75,6,2226],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[75,23,2243]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[74,5,2136]}],n:50,r:"config.fancy",p:[73,4,2110]}]}," ",{t:4,f:[{p:[80,5,2378],t:7,e:"ui-display",f:[{t:4,f:[{p:[82,6,2427],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[82,25,2446]}]},f:[{p:[83,7,2464],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[83,27,2484]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[83,135,2592]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[81,5,2396]}," ",{t:4,f:[{t:4,f:[{p:[90,7,2801],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[90,26,2820]}]},f:[{p:[91,8,2839],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[91,28,2859]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[89,6,2768]}],n:51,r:"data.display_craftable_only",p:[88,5,2729]}]}],n:50,r:"data.display_compact",p:[79,4,2344]},{t:4,n:51,f:[{t:4,f:[{p:[100,6,3181],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[100,25,3200]}]},f:[{t:4,f:[{p:[102,8,3243],t:7,e:"ui-section", +a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[103,9,3286]}]}],n:50,r:"req_text",p:[101,7,3218]}," ",{t:4,f:[{p:[107,8,3373],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[108,9,3413]}]}],n:50,r:"catalyst_text",p:[106,7,3343]}," ",{t:4,f:[{p:[112,8,3501],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[113,9,3537]}]}],n:50,r:"tool_text",p:[111,7,3475]}," ",{p:[116,7,3595],t:7,e:"ui-section",f:[{p:[117,8,3616],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[117,66,3674]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[99,5,3150]}," ",{t:4,f:[{t:4,f:[{p:[125,7,3855],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[125,26,3874]}]},f:[{t:4,f:[{p:[127,9,3919],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[128,10,3963]}]}],n:50,r:"req_text",p:[126,8,3893]}," ",{t:4,f:[{p:[132,9,4054],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[133,10,4095]}]}],n:50,r:"catalyst_text",p:[131,8,4023]}," ",{t:4,f:[{p:[137,9,4187],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[138,10,4224]}]}],n:50,r:"tool_text",p:[136,8,4160]}]}],n:52,r:"data.cant_craft",p:[124,6,3822]}],n:51,r:"data.display_craftable_only",p:[123,5,3783]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=r.extend(a.exports)},{205:205,293:293}],264:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(a.exports)},{205:205}],265:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[13,3,461],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,493],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,510]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,561]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,618]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[22,7,787],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[22,38,818]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[21,5,759]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[26,3,938],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[27,4,969]}]}," ",{p:[29,3,1011],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[30,4,1045]}," kPa"]}],n:50,r:"data.holding",p:[25,3,914]},{t:4,n:51,f:[{p:[33,3,1119],t:7,e:"ui-section",f:[{p:[34,4,1136],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(a.exports)},{205:205}],266:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(a),a.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}," W"]}]}," ",{p:[52,5,1466],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1501],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1507]}," W"]}]}],r:"config.fancy"}]}," ",{p:[57,1,1578],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1608],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1633],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1670],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1709],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1746],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1785],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1827],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1868],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1953],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1972]}],nowrap:0},f:[{p:[69,7,1997],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2018]}," %"]}," ",{p:[70,7,2076],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[70,28,2097]}," W"]}," ",{p:[71,7,2153],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2174],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2187]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2216]}]}]}," ",{p:[72,7,2263],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2284],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2297]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2320]}," [",{p:[72,87,2343],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2349]}]},"]"]}]}," ",{p:[73,7,2398],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2419],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2432]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2455]}," [",{p:[73,87,2478],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2484]}]},"]"]}]}," ",{p:[74,7,2533],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2554],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2567]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2590]}," [",{p:[74,87,2613],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2619]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1927]}]}]},e.exports=r.extend(a.exports)},{205:205}],267:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(a),a.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"div",a:{style:"float: left"},f:[{p:[43,2,1063],t:7,e:"div",a:{"class":"item"},f:[{p:[44,3,1085],t:7,e:"table",f:[{p:[44,10,1092],t:7,e:"tr",f:[{t:4,f:[{p:[46,4,1159],t:7,e:"td",f:[{p:[46,8,1163],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[46,18,1173]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[45,3,1100]}," ",{t:4,f:[{p:[49,4,1275],t:7,e:"td",f:[{p:[49,8,1279],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[49,11,1282]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[48,3,1213]}," ",{t:4,f:[{p:[52,4,1357],t:7,e:"td",f:[{p:[52,8,1361],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[52,18,1371]}]}}]}],n:50,r:"data.PC_ntneticon",p:[51,3,1327]}," ",{t:4,f:[{p:[55,4,1441],t:7,e:"td",f:[{p:[55,8,1445],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[55,18,1455]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[54,3,1409]}," ",{t:4,f:[{p:[58,4,1527],t:7,e:"td",f:[{p:[58,8,1531],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[58,11,1534]},{p:[58,34,1557],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[57,3,1495]}," ",{t:4,f:[{p:[61,4,1612],t:7,e:"td",f:[{p:[61,8,1616],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[61,18,1626]}]}}]}],n:52,r:"data.PC_programheaders",p:[60,3,1575]}]}]}]}]}," ",{p:[66,1,1680],t:7,e:"div",a:{style:"float: right"},f:[{p:[67,2,1709],t:7,e:"table",f:[{p:[67,9,1716],t:7,e:"tr",f:[{p:[68,3,1724],t:7,e:"td",f:[{p:[68,7,1728],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[70,4,1820],t:7,e:"td",f:[{p:[70,8,1824],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[71,4,1881],t:7,e:"td",f:[{p:[71,8,1885],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[69,3,1784]}]}]}]}]}," ",{p:[75,1,1977],t:7,e:"div",a:{style:"clear: both"},f:[{p:[77,1,2006],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[79,5,2064],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[79,27,2086]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[81,38,2238]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[82,15,2294]}],yinc:"9"}}],n:50,r:"config.fancy",p:[78,3,2038]},{t:4,n:51,f:[{p:[84,5,2344],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[85,7,2382],t:7,e:"span",f:[{t:2,r:"data.supply",p:[85,13,2388]}," W"]}]}," ",{p:[87,5,2437],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[88,9,2472],t:7,e:"span",f:[{t:2,r:"data.demand",p:[88,15,2478]}," W"]}]}],r:"config.fancy"}]}," ",{p:[92,1,2549],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[93,3,2579],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[94,5,2604],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[95,5,2641],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[96,5,2680],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[97,5,2717],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[98,5,2756],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[99,5,2798],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[100,5,2839],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[103,5,2924],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[103,24,2943]}],nowrap:0},f:[{p:[104,7,2968],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[104,28,2989]}," %"]}," ",{p:[105,7,3047],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[105,28,3068]}," W"]}," ",{p:[106,7,3124],t:7,e:"div",a:{"class":"content"},f:[{p:[106,28,3145],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[106,41,3158]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[106,70,3187]}]}]}," ",{p:[107,7,3234],t:7,e:"div",a:{"class":"content"},f:[{p:[107,28,3255],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[107,41,3268]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[107,64,3291]}," [",{p:[107,87,3314],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[107,93,3320]}]},"]"]}]}," ",{p:[108,7,3369],t:7,e:"div",a:{"class":"content"},f:[{p:[108,28,3390],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[108,41,3403]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[108,64,3426]}," [",{p:[108,87,3449],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[108,93,3455]}]},"]"]}]}," ",{p:[109,7,3504],t:7,e:"div",a:{"class":"content"},f:[{p:[109,28,3525],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[109,41,3538]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[109,64,3561]}," [",{p:[109,87,3584],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[109,93,3590]}]},"]"]}]}]}],n:52,r:"data.areas",p:[102,3,2898]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],268:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(a),a.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=r.extend(a.exports)},{205:205}],269:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{p:[37,1,973],t:7,e:"ui-display",f:[{p:[38,2,988],t:7,e:"div",a:{"class":"item"},f:[{p:[39,3,1010],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[42,3,1067],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[43,4,1097]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[49,3,1179],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[52,3,1230],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,4,1260],t:7,e:"table",f:[{p:[54,4,1272],t:7,e:"tr",f:[{p:[54,8,1276],t:7,e:"td",f:[{p:[54,12,1280],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[55,4,1353],t:7,e:"tr",f:[{p:[55,8,1357],t:7,e:"td",f:[{p:[55,12,1361],t:7,e:"ui-button",a:{action:"PRG_arm"},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[55,40,1389]}]}," ",{p:[56,4,1439],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[56,39,1474]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],270:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},a.exports.components=a.exports.components||{};var i={modification:t(271),templates:t(273),status:t(272)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{205:205,271:271,272:272,273:273}],271:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=r.extend(a.exports)},{205:205}],272:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=r.extend(a.exports)},{205:205}],273:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=r.extend(a.exports)},{205:205}],274:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(a),a.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}," ",{p:[23,5,658],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,7,693],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[24,20,706]}],max:[{t:2,r:"data.occupant.maxHealth",p:[24,54,740]}],value:[{t:2,r:"data.occupant.health",p:[24,90,776]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[25,16,818]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[25,68,870]}]}]}," ",{t:4,f:[{p:[28,7,1107],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[28,26,1126]}]},f:[{p:[29,9,1147],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[29,30,1168]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[29,66,1204]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[29,103,1241]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[27,5,941]}," ",{p:[32,5,1328],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[33,9,1364],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[33,22,1377]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[33,68,1423]}]}]}," ",{p:[35,5,1506],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[36,9,1542],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[36,22,1555]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[36,68,1601]}]}]}," ",{p:[38,5,1685],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[40,11,1772],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[40,54,1815]}," units of ",{t:2,r:"name",p:[40,89,1850]}]},{p:[40,104,1865],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[39,9,1727]},{t:4,n:51,f:[{p:[42,11,1900],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[47,1,1996],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[48,2,2028],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[49,5,2059],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[49,22,2076]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[49,71,2125]}]}]}," ",{p:[51,3,2190],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[53,7,2251],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[53,38,2282]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[53,122,2366]},'"}']},f:[{t:2,r:"name",p:[53,132,2376]}]},{p:[53,152,2396],t:7,e:"br"}],n:52,r:"data.chems",p:[52,5,2223]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],275:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:2,x:{r:["is_current"],s:'_0?"You Are Here":"Swap"'},p:[10,7,491]}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=r.extend(a.exports)},{205:205}],276:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827] },"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"   [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,x:{r:["adata.inputLevel"],s:"Math.round(_0)"},p:[37,78,1447]},"W"]}]}," ",{p:[39,3,1509],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1548],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1587]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1682],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1716]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1812],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1902],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1935]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2047],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2085]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2212],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2246],t:7,e:"span",f:[{t:2,x:{r:["adata.inputAvailable"],s:"Math.round(_0)"},p:[47,9,2252]},"W"]}]}]}," ",{p:[50,1,2329],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2360],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2398],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2415]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2470]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2540]}]},"   [",{p:[55,6,2608],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2621]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2638]}]},"]"]}," ",{p:[57,3,2745],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2785],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2806]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2838]}]},f:[{t:2,x:{r:["adata.outputLevel"],s:"Math.round(_0)"},p:[58,80,2860]},"W"]}]}," ",{p:[60,3,2923],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2963],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,3002]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3099],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3133]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3231],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3322],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3355]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3470],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3508]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3638],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3673],t:7,e:"span",f:[{t:2,x:{r:["adata.outputUsed"],s:"Math.round(_0)"},p:[68,9,3679]},"W"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],277:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],278:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=r.extend(a.exports)},{205:205}],279:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=r.extend(a.exports)},{205:205}],280:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"div",a:{style:"float: left"},f:[{p:[3,2,30],t:7,e:"div",a:{"class":"item"},f:[{p:[4,3,52],t:7,e:"table",f:[{p:[4,10,59],t:7,e:"tr",f:[{t:4,f:[{p:[6,4,126],t:7,e:"td",f:[{p:[6,8,130],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[6,18,140]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[5,3,67]}," ",{t:4,f:[{p:[9,4,242],t:7,e:"td",f:[{p:[9,8,246],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[9,11,249]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[8,3,180]}," ",{t:4,f:[{p:[12,4,324],t:7,e:"td",f:[{p:[12,8,328],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[12,18,338]}]}}]}],n:50,r:"data.PC_ntneticon",p:[11,3,294]}," ",{t:4,f:[{p:[15,4,408],t:7,e:"td",f:[{p:[15,8,412],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[15,18,422]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[14,3,376]}," ",{t:4,f:[{p:[18,4,494],t:7,e:"td",f:[{p:[18,8,498],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[18,11,501]},{p:[18,34,524],t:7,e:"b",f:[]}]}]}],n:50,r:"data.PC_stationtime",p:[17,3,462]}," ",{t:4,f:[{p:[21,4,579],t:7,e:"td",f:[{p:[21,8,583],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[21,18,593]}]}}]}],n:52,r:"data.PC_programheaders",p:[20,3,542]}]}]}]}]}," ",{p:[26,1,647],t:7,e:"div",a:{style:"float: right"},f:[{p:[27,2,676],t:7,e:"table",f:[{p:[27,9,683],t:7,e:"tr",f:[{p:[28,3,691],t:7,e:"td",f:[{p:[28,7,695],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[30,4,787],t:7,e:"td",f:[{p:[30,8,791],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}]},{p:[31,4,848],t:7,e:"td",f:[{p:[31,8,852],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}]}],n:50,r:"data.PC_showexitprogram",p:[29,3,751]}]}]}]}]}," ",{p:[35,1,944],t:7,e:"div",a:{style:"clear: both"},f:[{t:4,f:[{p:[38,3,1004],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[38,22,1023]}," Alarms"]},f:[{p:[39,5,1047],t:7,e:"ul",f:[{t:4,f:[{p:[41,9,1080],t:7,e:"li",f:[{t:2,r:".",p:[41,13,1084]}]}],n:52,r:".",p:[40,7,1059]},{t:4,n:51,f:[{p:[43,9,1120],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[37,1,973]}]}]},e.exports=r.extend(a.exports)},{205:205}],281:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=r.extend(a.exports)},{205:205}],282:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],283:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],284:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=r.extend(a.exports)},{205:205}],285:[function(t,e,n){var r=t(205),a={exports:{}};!function(e){"use strict";var n=t(293);e.exports={data:{filter:""},oninit:function(){var t=this;this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,r,a){var i=t.findAll(".display:not(:first-child)");(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(a),a.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[29,7,770],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[29,24,787]}],placeholder:"Filter..."}}],n:50,r:"config.fancy",p:[28,5,742]}," ",{t:4,f:[{p:[32,7,872],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[31,5,843]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[35,3,958],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[36,5,1003],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[36,18,1016]}]},f:[{t:2,r:"data.telecrystals",p:[36,62,1060]}," TC"]}]}]}," ",{t:4,f:[{p:[40,3,1154],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,22,1173]}]},f:[{t:4,f:[{p:[42,7,1212],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[42,26,1231]}],candystripe:0,right:0},f:[{p:[43,9,1269],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[43,29,1289]},": ",{t:2,r:"desc",p:[43,39,1299]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[44,18,1347]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[45,46,1512]},'", "item": ',{t:2,r:"name",p:[45,69,1535]},', "cost": ',{t:2,r:"cost",p:[45,87,1553]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[46,49,1613]}," TC"]}]}],n:52,r:"items",p:[41,5,1189]}]}],n:52,r:"data.categories",p:[39,1,1125]}]},e.exports=r.extend(a.exports)},{205:205,293:293}],286:[function(t,e,n){var r=t(205),a={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(a),a.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=r.extend(a.exports)},{205:205}],287:[function(t,e,n){var r=t(205),a={exports:{}};a.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=r.extend(a.exports)},{205:205}],288:[function(t,e,n){(function(e){"use strict";var n=t(205),r=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var a=t(289),i=e.interopRequireDefault(a),o=t(290),s=t(191),u=t(192),c=e.interopRequireDefault(u);r["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(294)),window.initialize=function(e){window.tgui||(window.tgui=new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(291),text:t(295),config:n.config,data:n.data,adata:n.data}}}))};var p=document.getElementById("data"),l=p.textContent,f=p.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),p.remove()),(0,o.act)(f,"tgui:initialize"),(0,s.loadCSS)("https://cdn.jsdelivr.net/fontawesome/4.5.0/css/font-awesome.min.css");var d=new c["default"]("FontAwesome");d.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,289:289,290:290,291:291,294:294,295:295,"babel/external-helpers":"babel/external-helpers"}],289:[function(t,e,n){var r=t(205),a={exports:{}};!function(e){"use strict";var n=t(290),r=t(292);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={airalarm:t(219),"airalarm/back":t(220),"airalarm/modes":t(221),"airalarm/scrubbers":t(222),"airalarm/status":t(223),"airalarm/thresholds":t(224),"airalarm/vents":t(225),airlock_electronics:t(226),apc:t(227),atmos_alert:t(228),atmos_control:t(229),atmos_filter:t(230),atmos_mixer:t(231),atmos_pump:t(232),brig_timer:t(233),canister:t(234),cargo:t(235),cellular_emporium:t(236),chem_dispenser:t(237),chem_heater:t(238),chem_master:t(239),computer_main:t(240),crayon:t(241),cryo:t(242),emergency_shuttle_console:t(243),error:t(244),file_manager:t(245),firealarm:t(246),gulag_console:t(247),gulag_item_reclaimer:t(248),implantchair:t(249),intellicard:t(250),keycard_auth:t(251),labor_claim_console:t(252),laptop_configuration:t(253),mech_bay_power_console:t(254),mulebot:t(255),ntnet_chat:t(256),ntnet_dos:t(257),ntnet_downloader:t(258),ntnet_monitor:t(259),ntnet_relay:t(260),ntnet_transfer:t(261),nuclear_bomb:t(262),personal_crafting:t(263),portable_pump:t(264),portable_scrubber:t(265),power_monitor:t(266),power_monitor_prog:t(267),radio:t(268),revelation:t(269),shuttle_manipulator:t(270),"shuttle_manipulator/modification":t(271),"shuttle_manipulator/status":t(272),"shuttle_manipulator/templates":t(273),sleeper:t(274),slime_swap_body:t(275),smes:t(276),solar_control:t(277),space_heater:t(278),station_alert:t(279),station_alert_prog:t(280),suit_storage_unit:t(281),tank_dispenser:t(282),tanks:t(283),thermomachine:t(284),uplink:t(285),vr_sleeper:t(286),wires:t(287)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,r.lock)(window.screenLeft,window.screenTop),e=t.x,a=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+a)}(0,n.winset)("mapwindow.map","focus",!0)}}}(a),a.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},a.exports.components=a.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(a.exports.components[o]=i[o]);e.exports=r.extend(a.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,290:290,292:292}],290:[function(t,e,n){"use strict";function r(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?"":arguments[1];return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function a(t,e){var n=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];window.location.href=r(Object.assign({src:t,action:e},n))}function i(t,e,n){var a;window.location.href=r((a={},a[t+"."+e]=n,a),"winset")}n.__esModule=!0,n.href=r,n.act=a,n.winset=i;var o=encodeURIComponent},{}],291:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],292:[function(t,e,n){"use strict";function r(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function a(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var a=r(e,n);e=a.x,n=a.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){ var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,r=i(e,n);e=r.x,n=r.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=r,n.drag=a,n.sane=i,n.resize=o;var s=t(290)},{290:290}],293:[function(t,e,n){"use strict";function r(t,e){for(var n=t,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",a(s,e)):s.style.display="none"}}function a(t,e){for(var n=t.queryAll("section"),r=t.query("header").textContent.toLowerCase().includes(e),a=n,i=Array.isArray(a),o=0,a=i?a:a[Symbol.iterator]();;){var s;if(i){if(o>=a.length)break;s=a[o++]}else{if(o=a.next(),o.done)break;s=o.value}var u=s;r||u.textContent.toLowerCase().includes(e)?u.style.display="":u.style.display="none"}}n.__esModule=!0,n.filterMulti=r,n.filter=a},{}],294:[function(t,e,n){"use strict";function r(t,e,n){return Math.max(t,Math.min(n,e))}function a(t){var e=arguments.length<=1||void 0===arguments[1]?1:arguments[1];return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=r,n.fixed=a},{}],295:[function(t,e,n){"use strict";function r(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function a(t){return t.replace(/\w\S*/g,r)}function i(t,e){for(t=""+t;t.length1){for(var u=Array(o),c=0;o>c;c++)u[c]=arguments[c+3];n.children=u}return{$$typeof:t,type:e,key:void 0===r?null:""+r,ref:null,props:n,_owner:null}}}(),e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function r(a,i){try{var o=e[a](i),s=o.value}catch(u){return void n(u)}return o.done?void t(s):Promise.resolve(s).then(function(t){return r("next",t)},function(t){return r("throw",t)})}return r("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function r(t,e,n,a){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&r(o,e,n,a)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(a,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,r=[],a=t[Symbol.iterator]();!(n=a.next()).done&&(r.push(n.value),!e||r.length!==e););return r}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);eAvailable channels: {{#each data.all_channels}} -
    {{id}}
    +
    {{chan}}
    {{/each}}
    {{/if}} From 6bb69d760e388c1c21245529c5eb246b5ef64ccb Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Mon, 8 Aug 2016 00:40:03 -0700 Subject: [PATCH 15/21] Id computer mostly complete Various fixes and improvements. --- code/__DEFINES/misc.dm | 2 +- code/game/machinery/recharger.dm | 29 ++- code/modules/jobs/access.dm | 2 +- code/modules/jobs/job_types/science.dm | 4 +- .../modular_computers/NTNet/NTNet_relay.dm | 31 +-- .../computers/item/modular_computer.dm | 4 +- .../computers/machinery/console_presets.dm | 2 +- .../file_system/programs/card.dm | 235 ++++++++---------- .../research/designs/machine_designs.dm | 8 + tgstation.dme | 1 + tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 30 +-- tgui/src/components/button.ract | 2 +- tgui/src/components/button.styl | 1 + .../interfaces/identification_computer.ract | 182 ++++++++++++++ tgui/src/interfaces/revelation.ract | 2 +- 16 files changed, 349 insertions(+), 188 deletions(-) create mode 100644 tgui/src/interfaces/identification_computer.ract diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index fb0c9a88314..b4434b693ff 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -511,7 +511,7 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE // NTNet transfer speeds, used when downloading/uploading a file/program. #define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal #define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal -#define NTNETSPEED_ETHERNET 3 // GQ/s transfer speed when the device is using wired connection +#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection // Program bitflags diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 0e267848fe6..c7afad3cb6f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -8,6 +8,7 @@ idle_power_usage = 4 active_power_usage = 250 var/obj/item/weapon/charging = null + var/list/allowed_devices = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/ammo_box/magazine/recharge,/obj/item/weapon/computer_hardware/battery_module,/obj/item/laptop,/obj/item/modular_computer/) var/recharge_coeff = 1 /obj/machinery/recharger/New() @@ -36,7 +37,11 @@ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) return - if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G, /obj/item/ammo_box/magazine/recharge) || istype(G, /obj/item/weapon/computer_hardware/battery_module)) + var/allowed = 0 + for (var/allowed_type in allowed_devices) + if (istype(G, allowed_type)) allowed = 1 + + if(allowed) if(anchored) if(charging || panel_open) return 1 @@ -127,7 +132,17 @@ use_power(200 * recharge_coeff) using_power = 1 - if(istype(charging, /obj/item/weapon/gun/energy)) + if(istype(charging, /obj/item/laptop)) + var/obj/item/laptop/L = charging + if(L.stored_computer.cpu.battery_module) + var/obj/item/weapon/computer_hardware/battery_module/B = L.stored_computer.cpu.battery_module + if(B.battery) + if(B.battery.charge < B.battery.maxcharge) + B.battery.give(B.battery.chargerate * recharge_coeff) + use_power(200 * recharge_coeff) + using_power = 1 + + if(istype(charging, /obj/item/weapon/computer_hardware/battery_module)) var/obj/item/weapon/computer_hardware/battery_module/B = charging if(B.battery) if(B.battery.charge < B.battery.maxcharge) @@ -135,6 +150,16 @@ use_power(200 * recharge_coeff) using_power = 1 + if(istype(charging, /obj/item/modular_computer)) + var/obj/item/modular_computer/C = charging + if(C.battery_module) + var/obj/item/weapon/computer_hardware/battery_module/B = C.battery_module + if(B.battery) + if(B.battery.charge < B.battery.maxcharge) + B.battery.give(B.battery.chargerate * recharge_coeff) + use_power(200 * recharge_coeff) + using_power = 1 + update_icon(using_power) /obj/machinery/recharger/power_change() diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 6fe7315cbbf..4b6a96add86 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -268,7 +268,7 @@ if(3) //medbay return list(access_medical, access_genetics, access_morgue, access_chemistry, access_virology, access_surgery, access_cmo) if(4) //research - return list(access_research, access_tox, access_tox_storage, access_genetics, access_robotics, access_xenobiology, access_minisat, access_rd) + return list(access_research, access_tox, access_tox_storage, access_genetics, access_robotics, access_xenobiology, access_minisat, access_rd, access_network) if(5) //engineering and maintenance return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_tcomsat, access_minisat, access_ce) if(6) //supply diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 1ecf799a4ab..1fbe1dbf290 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -20,12 +20,12 @@ Research Director access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, - access_tech_storage, access_minisat, access_maint_tunnels) + access_tech_storage, access_minisat, access_maint_tunnels, access_network) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom, - access_tech_storage, access_minisat, access_maint_tunnels) + access_tech_storage, access_minisat, access_maint_tunnels, access_network) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 013a4b6a29d..1eb87cec084 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -90,7 +90,6 @@ update_icon() - /obj/machinery/ntnet_relay/attack_hand(mob/living/user) ui_interact(user) @@ -98,8 +97,8 @@ uid = gl_uid gl_uid++ component_parts = list() - component_parts += new /obj/item/stack/cable_coil(src,15) -// component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src) + var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/ntnet_relay(null) + B.apply_default_parts(src) if(ntnet_global) ntnet_global.relays.Add(src) @@ -119,22 +118,10 @@ ..() -/obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(istype(W, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance hatch" - return - if(istype(W, /obj/item/weapon/crowbar)) - if(!panel_open) - user << "Open the maintenance panel first." - return - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "You disassemble \the [src]!" - - for(var/atom/movable/A in component_parts) - A.forceMove(src.loc) - new/obj/structure/frame/machine(src.loc) - qdel(src) - return - ..() \ No newline at end of file +/obj/item/weapon/circuitboard/machine/ntnet_relay + name = "circuit board (NTNet Relay)" + build_path = /obj/machinery/ntnet_relay + origin_tech = "programming=3;bluespace=3;magnets=2" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/filter = 1) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index a9df960cb5d..5b562ab3c2d 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -141,7 +141,6 @@ user << "It is damaged." /obj/item/modular_computer/New() - machines += src START_PROCESSING(SSmachine, src) update_icon() if(!physical) @@ -150,9 +149,8 @@ /obj/item/modular_computer/Destroy() kill_program(1) - machines.Remove(src) STOP_PROCESSING(SSmachine, src) - for(var/H in src.get_all_components()) + for(var/H in get_all_components()) var/obj/item/weapon/computer_hardware/CH = H uninstall_component(null, CH) qdel(CH) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index ca2c0811737..0f6aec6558b 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -52,7 +52,7 @@ /obj/machinery/modular_computer/console/preset/command/install_programs() cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) -// cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) + cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) // ===== CIVILIAN CONSOLE ===== /obj/machinery/modular_computer/console/preset/civilian diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index eefe6b671ef..368144b618b 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -9,129 +9,91 @@ var/mod_mode = 1 var/is_centcom = 0 var/show_assignments = 0 + var/list/region_access = null + var/list/head_subordinates = null + var/target_dept = 0 //Which department this computer has access to. 0=all departments + var/change_position_cooldown = 60 + //Jobs you cannot open new positions for + var/list/blacklisted = list( + "AI", + "Assistant", + "Cyborg", + "Captain", + "Head of Personnel", + "Head of Security", + "Chief Engineer", + "Research Director", + "Chief Medical Officer", + "Chaplain") -/datum/computer_file/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) - var/list/data = get_header_data() + //The scaling factor of max total positions in relation to the total amount of people on board the station in % + var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players - data["src"] = "\ref[src]" - data["station_name"] = station_name() - data["manifest"] = data_core ? data_core.get_manifest(0) : null - data["assignments"] = show_assignments - if(program && program.computer) - data["have_id_slot"] = !!program.computer.card_slot - data["have_printer"] = !!program.computer.nano_printer - data["authenticated"] = program.can_run(user) - if(!program.computer.card_slot) - mod_mode = 0 //We can't modify IDs when there is no card reader - else - data["have_id_slot"] = 0 - data["have_printer"] = 0 - data["authenticated"] = 0 - data["mmode"] = mod_mode - data["centcom_access"] = is_centcom - - if(program && program.computer && program.computer.card_slot) - var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card - data["has_id"] = !!id_card - data["id_account_number"] = id_card ? id_card.associated_account_number : null - data["id_rank"] = id_card && id_card.assignment ? id_card.assignment : "Unassigned" - data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----" - data["id_name"] = id_card ? id_card.name : "-----" + //This is used to keep track of opened positions for jobs to allow instant closing + //Assoc array: "JobName" = (int) + var/list/opened_positions = list(); - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["cargo_jobs"] = format_jobs(cargo_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) +/datum/computer_file/program/card_mod/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) - data["all_centcom_access"] = is_centcom ? get_accesses(1) : null - data["regions"] = get_accesses() - - if(program.computer.card_slot.stored_card) - var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card - if(is_centcom) - var/list/all_centcom_access = list() - for(var/access in get_all_centcom_access()) - all_centcom_access.Add(list(list( - "desc" = replacetext(get_centcom_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in id_card.access) ? 1 : 0))) - data["all_centcom_access"] = all_centcom_access - else - var/list/regions = list() - for(var/i = 1; i <= 7; i++) - var/list/accesses = list() - for(var/access in get_region_accesses(i)) - if (get_access_desc(access)) - accesses.Add(list(list( - "desc" = replacetext(get_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in id_card.access) ? 1 : 0))) - - regions.Add(list(list( - "name" = get_region_accesses_name(i), - "accesses" = accesses))) - data["regions"] = regions - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "identification_computer.tmpl", name, 600, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + + ui = new(user, src, ui_key, "identification_computer", "ID card modification program", 600, 700, state = state) ui.open() + ui.set_autoupdate(state = 1) + /datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) - var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card var/list/formatted = list() for(var/job in jobs) formatted.Add(list(list( - "display_name" = replacetext(job, " ", " "), + "display_name" = replacetext(job, " ", " "), "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", "job" = job))) return formatted -/datum/computer_file/program/card_mod/proc/get_accesses(var/is_centcom = 0) - return null - - -/datum/computer_file/program/card_mod/ui_act(action params) +/datum/computer_file/program/card_mod/ui_act(action, params) if(..()) return 1 + var/obj/item/weapon/card/id/user_id_card = null var/mob/user = usr - var/obj/item/weapon/card/id/user_id_card = user.GetIdCard() + + if(ishuman(user)) + var/mob/living/carbon/human/h = user + user_id_card = h.get_idcard() + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card - var/datum/nano_module/program/card_mod/module = NM - switch(href_list["action"]) - if("switchm") - if(href_list["target"] == "mod") - module.mod_mode = 1 - else if (href_list["target"] == "manifest") - module.mod_mode = 0 - if("togglea") - if(module.show_assignments) - module.show_assignments = 0 + switch(action) + if("PRG_switchm") + if(params["target"] == "mod") + mod_mode = 1 + else if (params["target"] == "manifest") + mod_mode = 0 + if("PRG_togglea") + if(show_assignments) + show_assignments = 0 else - module.show_assignments = 1 - if("print") + show_assignments = 1 + if("PRG_print") if(computer && computer.nano_printer) //This option should never be called if there is no printer - if(module.mod_mode) + if(mod_mode) if(can_run(user, 1)) var/contents = {"

    Access Report

    Prepared By: [user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
    For: [id_card.registered_name ? id_card.registered_name : "Unregistered"]

    Assignment: [id_card.assignment]
    - Account Number: #[id_card.associated_account_number]
    - Blood Type: [id_card.blood_type]

    Access:
    "} - var/known_access_rights = get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM) + var/known_access_rights = get_all_accesses() for(var/A in id_card.access) if(A in known_access_rights) contents += " [get_access_desc(A)]" @@ -146,43 +108,43 @@
    [data_core ? data_core.get_manifest(0) : ""] "} - if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", stationtime2text()))) + if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", worldtime2text()))) usr << "Hardware error: Printer was unable to print the file. It may be out of paper." return else computer.visible_message("\The [computer] prints out paper.") - if("eject") + if("PRG_eject") if(computer && computer.card_slot) if(id_card) data_core.manifest_modify(id_card.registered_name, id_card.assignment) computer.proc_eject_id(user) - if("terminate") + if("PRG_terminate") if(computer && can_run(user, 1)) id_card.assignment = "Terminated" remove_nt_access(id_card) - callHook("terminate_employee", list(id_card)) - if("edit") + + if("PRG_edit") if(computer && can_run(user, 1)) - if(href_list["name"]) - var/temp_name = sanitizeName(input("Enter name.", "Name", id_card.registered_name)) + if(params["name"]) + var/temp_name = reject_bad_name(input("Enter name.", "Name", id_card.registered_name)) if(temp_name) id_card.registered_name = temp_name else computer.visible_message("[computer] buzzes rudely.") - else if(href_list["account"]) - var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) - id_card.associated_account_number = account_num - if("assign") + //else if(params["account"]) + // var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) + // id_card.associated_account_number = account_num + if("PRG_assign") if(computer && can_run(user, 1) && id_card) - var/t1 = href_list["assign_target"] + var/t1 = params["assign_target"] if(t1 == "Custom") - var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment", id_card.assignment), 45) + var/temp_t = reject_bad_text(input("Enter a custom job assignment.","Assignment", id_card.assignment), 45) //let custom jobs function as an impromptu alt title, mainly for sechuds if(temp_t) id_card.assignment = temp_t else var/list/access = list() - if(module.is_centcom) + if(is_centcom) access = get_centcom_access(t1) else var/datum/job/jobdatum @@ -200,25 +162,26 @@ remove_nt_access(id_card) apply_access(id_card, access) id_card.assignment = t1 - id_card.rank = t1 - callHook("reassign_employee", list(id_card)) - if("access") - if(href_list["allowed"] && computer && can_run(user, 1)) - var/access_type = text2num(href_list["access_target"]) - var/access_allowed = text2num(href_list["allowed"]) - if(access_type in get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM)) + if("PRG_access") + if(params["allowed"] && computer && can_run(user, 1)) + var/access_type = text2num(params["access_target"]) + var/access_allowed = text2num(params["allowed"]) + world << "type [access_type]" + world << "allow [access_allowed]" + if(access_type in (is_centcom ? get_all_centcom_access() : get_all_accesses())) + world << "yes" id_card.access -= access_type if(!access_allowed) + world << "check" id_card.access += access_type if(id_card) id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])") - nanomanager.update_uis(NM) return 1 /datum/computer_file/program/card_mod/proc/remove_nt_access(var/obj/item/weapon/card/id/id_card) - id_card.access -= get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM) + id_card.access -= get_all_accesses() /datum/computer_file/program/card_mod/proc/apply_access(var/obj/item/weapon/card/id/id_card, var/list/accesses) id_card.access |= accesses @@ -231,11 +194,11 @@ data["station_name"] = station_name() data["manifest"] = data_core ? data_core.get_manifest(0) : null data["assignments"] = show_assignments - if(program && program.computer) - data["have_id_slot"] = !!program.computer.card_slot - data["have_printer"] = !!program.computer.nano_printer - data["authenticated"] = program.can_run(user) - if(!program.computer.card_slot) + if(computer) + data["have_id_slot"] = !!computer.card_slot + data["have_printer"] = !!computer.nano_printer + data["authenticated"] = can_run(user) + if(!computer.card_slot) mod_mode = 0 //We can't modify IDs when there is no card reader else data["have_id_slot"] = 0 @@ -244,33 +207,29 @@ data["mmode"] = mod_mode data["centcom_access"] = is_centcom - if(program && program.computer && program.computer.card_slot) - var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + if(computer && computer.card_slot) + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card data["has_id"] = !!id_card - data["id_account_number"] = id_card ? id_card.associated_account_number : null - data["id_rank"] = id_card && id_card.assignment ? id_card.assignment : "Unassigned" - data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----" - data["id_name"] = id_card ? id_card.name : "-----" + data["id_rank"] = id_card && id_card.assignment ? html_encode(id_card.assignment) : "Unassigned" + data["id_owner"] = id_card && id_card.registered_name ? html_encode(id_card.registered_name) : "-----" + data["id_name"] = id_card ? strip_html_simple(id_card.name) : "-----" - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["cargo_jobs"] = format_jobs(cargo_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + data["engineering_jobs"] = format_jobs(engineering_positions) + data["medical_jobs"] = format_jobs(medical_positions) + data["science_jobs"] = format_jobs(science_positions) + data["security_jobs"] = format_jobs(security_positions) + data["cargo_jobs"] = format_jobs(supply_positions) + data["civilian_jobs"] = format_jobs(supply_positions) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) - data["all_centcom_access"] = is_centcom ? get_accesses(1) : null - data["regions"] = get_accesses() - - if(program.computer.card_slot.stored_card) - var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + if(computer.card_slot.stored_card) + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card if(is_centcom) var/list/all_centcom_access = list() for(var/access in get_all_centcom_access()) all_centcom_access.Add(list(list( - "desc" = replacetext(get_centcom_access_desc(access), " ", " "), + "desc" = replacetext(get_centcom_access_desc(access), " ", " "), "ref" = access, "allowed" = (access in id_card.access) ? 1 : 0))) data["all_centcom_access"] = all_centcom_access @@ -281,7 +240,7 @@ for(var/access in get_region_accesses(i)) if (get_access_desc(access)) accesses.Add(list(list( - "desc" = replacetext(get_access_desc(access), " ", " "), + "desc" = replacetext(get_access_desc(access), " ", " "), "ref" = access, "allowed" = (access in id_card.access) ? 1 : 0))) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 3ed57ca5fea..3b510ae40ba 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -386,3 +386,11 @@ req_tech = list("programming" = 4, "biotech" = 3) build_path = /obj/item/weapon/circuitboard/machine/plantgenes category = list ("Misc. Machinery") + +/datum/design/board/ntnet_relay + name = "Machine Design (NTNet Relay Board)" + desc = "The circuit board for a wireless network relay." + id = "ntnet_relay" + req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2) + build_path = /obj/item/weapon/circuitboard/machine/ntnet_relay + category = list("Subspace Telecomms") \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 139d11d51c3..b768900608c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1533,6 +1533,7 @@ #include "code\modules\modular_computers\file_system\program.dm" #include "code\modules\modular_computers\file_system\program_events.dm" #include "code\modules\modular_computers\file_system\programs\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\card.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 6156a956a45..38c1495d003 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}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}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{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)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;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)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen 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;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate 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;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}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}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{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)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;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)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen 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;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate 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;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 6354d8c822e..a78213e06c8 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,15 +1,15 @@ -require=function t(e,n,r){function a(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[o]={exports:{}};e[o][0].call(p.exports,function(t){var n=e[o][1][t];return a(n?n:t)},p,p.exports,t,e,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?c[2]:void 0,l=Math.min((void 0===p?o:a(p,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),a=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=i(e.length),o=arguments,s=o.length,u=a(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,p=void 0===c?n:a(c,n);p>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),a=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),p=i(o,c);if(t&&n!=n){for(;c>p;)if(s=u[p++],s!=s)return!0}else for(;c>p;p++)if((t||p in u)&&u[p]===n)return t||p;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),a=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,p=6==t,l=5==t||p;return function(f,d,h){for(var m,v,g=i(f),b=a(g),y=r(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(c)return!1;return p?-1:u||c?c:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),a=t(36),i=t(83)("species");e.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),a=t(83)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[a])?n:i?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),a=t(31),i=t(60),o=t(17),s=t(69),u=t(18),c=t(27),p=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";a(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,a){var p=t(function(t,i){s(t,p,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&c(i,n,t[a],t)});return i(p.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var r=n.n,a=n.p;delete e._i[n.i],n.r=!0,a&&(a.n=r),r&&(r.p=a),e._f==n&&(e._f=r),e._l==n&&(e._l=a),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&r.setDesc(p.prototype,"size",{get:function(){return u(this[b])}}),p},def:function(t,e,n){var r,a,i=_(t,e);return i?i.v=n:(t._l=i={i:a=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[b]++,"F"!==a&&(t._i[a]=i)),t},getEntry:_,setStrong:function(t,e,n){p(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),a=t(10);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),a=t(60),i=t(4),o=t(38),s=t(69),u=t(27),c=t(8),p=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var i=t(function(t,a){s(t,i,e),t._i=m++,t._l=void 0,void 0!=a&&u(a,n,t[r],t)});return a(i.prototype,{"delete":function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(p(e,l)||r(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),a=t(22),i=t(61),o=t(60),s=t(27),u=t(69),c=t(38),p=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!p(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,P=p(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(P||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,a(a.G+a.W+a.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),a=t(29).document,i=r(a)&&r(a.createElement);e.exports=function(t){return i?a.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var a,i=n(t),o=r.isEnum,s=0;i.length>s;)o.call(t,a=i[s++])&&e.push(a);return e}},{46:46}],22:[function(t,e,n){var r=t(29),a=t(16),i=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var p,l,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?a:a[e]||(a[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(p in n)l=!h&&y&&p in y,f=(l?y:n)[p],d=b&&l?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,p,f),x[p]!=f&&i(x,p,d),g&&_[p]!=f&&(_[p]=f)};r.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(a){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),a=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(a(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),a=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var p,l,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(p=s(t.length);p>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)a(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),a=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),a=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),a=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||i[a]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),a=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&a(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),a=t(11),i=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==a(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&r(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),a=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:a(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),a=t(22),i=t(61),o=t(31),s=t(30),u=t(45),c=t(41),p=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){c(n,e,b);var w,k,E=function(t){if(!d&&t in O)return O[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},P=e+" Iterator",C=y==v,S=!1,O=t.prototype,A=O[f]||O[h]||y&&O[y],T=A||E(y);if(A){var M=l(T.call(new t));p(M,P,!0),!r&&s(O,h)&&o(M,f,g),C&&A.name!==v&&(S=!0,T=function(){return A.call(this)})}if(r&&!_||!d&&!S&&O[f]||o(O,f,T),u[e]=T,u[P]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in O||i(O,k,w[k]);else a(a.P+a.F*(d||S),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),a=!1;try{var i=[7][r]();i["return"]=function(){a=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!a)return!1;var n=!1;try{var i=[7],o=i[r]();o.next=function(){return{done:n=!0}},i[r]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),a=t(78);e.exports=function(t,e){for(var n,i=a(t),o=r.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,a,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,p=o.Promise,l="process"==t(11)(c),f=function(){var t,e,n;for(l&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;a=void 0,t&&t.enter()};if(l)i=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=p&&p.resolve?function(){p.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&c.domain};a&&(a.next=e),r||(r=e,i()),a=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),a=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=a})?function(t,e){for(var n=a(t),o=arguments,s=o.length,u=1,c=r.getKeys,p=r.getSymbols,l=r.isEnum;s>u;)for(var f,d=i(o[u++]),h=p?c(d).concat(p(d)):c(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),a=t(16),i=t(24);e.exports=function(t,e){var n=(a.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),a=t(78),i=r.isEnum;e.exports=function(t){return function(e){for(var n,o=a(e),s=r.getKeys(o),u=s.length,c=0,p=[];u>c;)i.call(o,n=s[c++])&&p.push(t?[n,o[n]]:o[n]);return p}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),a=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=r.getNames(a(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),a=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,i=this,o=arguments,c=o.length,p=0,l=0;if(!u&&!c)return a(t,n,i);if(r=n.slice(),u)for(;e>p;p++)r[p]===s&&(r[p]=o[l++]);for(;c>l;)r.push(o[l++]);return a(t,r,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),a=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||a(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||a(n,"name",e)),t===r?t[e]=n:(o||delete t[e],a(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,a=t(38),i=t(4),o=function(t,e){if(i(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),a=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];i&&e&&!e[o]&&a.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,a=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),a="__core-js_shared__",i=r[a]||(r[a]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),a=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[i])?e:a(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),a=t(18);e.exports=function(t){return function(e,n){var i,o,s=a(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),a=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return a(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),a=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,c=void 0===n?" ":n+"",p=r(e);if(u>=p)return s;""==c&&(c=" ");var l=p-u,f=a.call(c,Math.ceil(l/c.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),a=t(18);e.exports=function(t){var e=a(this)+"",n="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),a=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),p=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=a(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(p,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var r,a,i,o=t(17),s=t(33),u=t(32),c=t(20),p=t(29),l=p.process,f=p.setImmediate,d=p.clearImmediate,h=p.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?r=function(t){l.nextTick(o(b,t,1))}:h?(a=new h,i=a.port2,a.port1.onmessage=y,r=o(i.postMessage,i,1)):p.addEventListener&&"function"==typeof postMessage&&!p.importScripts?(r=function(t){p.postMessage(t+"","*")},p.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),a=Math.max,i=Math.min;e.exports=function(t,e){return t=r(t),0>t?a(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,a=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?a:r)(t)}},{}],78:[function(t,e,n){var r=t(34),a=t(18);e.exports=function(t){return r(a(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),a=Math.min;e.exports=function(t){return t>0?a(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,a;if(e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;if("function"==typeof(n=t.valueOf)&&!r(a=n.call(t)))return a;if(!e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,a=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+a).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),a=t(82),i=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||a)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),a=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[a]||t["@@iterator"]||i[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,a=t(46),i=t(22),o=t(19),s=t(59),u=t(32),c=t(20),p=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),P=t(7)(!1),C=Object.prototype,S=Array.prototype,O=S.slice,A=S.join,T=a.setDesc,M=a.getDesc,R=a.setDescs,j={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),a.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},a.getDesc=function(t,e){if(r)try{return M(t,e)}catch(n){}return p(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},a.setDescs=R=function(t,e){h(t);for(var n,r=a.getKeys(e),i=r.length,o=0;i>o;)a.setDesc(t,n=r[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:a.getDesc,defineProperty:a.setDesc,defineProperties:R});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),F=L.length,D=function(){var t,e=c("iframe"),n=F,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("