From 95cb0d4d23c4f478d1ed3d1f773dcdbc395130ac Mon Sep 17 00:00:00 2001 From: DamianX Date: Thu, 9 Sep 2021 14:44:13 +0200 Subject: [PATCH] Components! TGUI uplinks! Oh god! (#30641) * components * tgui uplink * Components! TGUI uplinks! Oh god! * yeah * this too --- code/__HELPERS/{datumpool.dm => datum.dm} | 7 +- code/_hooks/events.dm | 25 +- code/_onclick/item_attack.dm | 1 + code/datums/components/component.dm | 79 +++++ code/datums/components/uplink.dm | 180 +++++++++++ code/datums/emotes.dm | 4 +- code/datums/gamemode/misc_gamemode_procs.dm | 69 +---- .../gamemode/objectives/target/assassinate.dm | 14 +- code/datums/gamemode/role/syndicate.dm | 45 ++- code/datums/map_elements.dm | 2 +- code/datums/shuttle.dm | 2 +- code/datums/uplink_item.dm | 51 +-- code/defines/obj/weapon.dm | 19 -- code/game/atoms.dm | 2 +- code/game/objects/items.dm | 6 - code/game/objects/items/devices/PDA/PDA.dm | 20 +- code/game/objects/items/devices/multitool.dm | 3 + .../objects/items/devices/radio/headset.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 26 +- code/game/objects/items/devices/uplinks.dm | 291 +----------------- .../objects/items/weapons/implants/exile2.dm | 1 + .../objects/items/weapons/implants/implant.dm | 21 +- .../items/weapons/implants/implantuplink.dm | 20 +- code/game/objects/objs.dm | 1 + code/game/objects/structures/musician.dm | 2 - code/modules/components/component.dm | 1 + code/modules/library/lib_machines.dm | 2 +- code/modules/nano/nanoui.dm | 2 - code/modules/power/components.dm | 4 +- code/modules/power/powernet.dm | 2 +- code/modules/tgui/tgui_window.dm | 2 +- tgui/packages/tgui/interfaces/Uplink.js | 198 ++++++++++++ tgui/public/tgui.bundle.js | 2 +- vgstation13.dme | 4 +- 34 files changed, 634 insertions(+), 476 deletions(-) rename code/__HELPERS/{datumpool.dm => datum.dm} (69%) create mode 100644 code/datums/components/component.dm create mode 100644 code/datums/components/uplink.dm create mode 100644 tgui/packages/tgui/interfaces/Uplink.js diff --git a/code/__HELPERS/datumpool.dm b/code/__HELPERS/datum.dm similarity index 69% rename from code/__HELPERS/datumpool.dm rename to code/__HELPERS/datum.dm index 040990eb477..07889ae1959 100644 --- a/code/__HELPERS/datumpool.dm +++ b/code/__HELPERS/datum.dm @@ -1,5 +1,10 @@ +/datum + var/list/datum_components + +/datum/proc/initialize() + return + //Called when a variable is edited by admin powers //Return 1 to block the varedit! -//Why is this here? /datum/proc/variable_edited(variable_name, old_value, new_value) return diff --git a/code/_hooks/events.dm b/code/_hooks/events.dm index e3f1fc50cc0..a4d02aa9e55 100644 --- a/code/_hooks/events.dm +++ b/code/_hooks/events.dm @@ -213,12 +213,35 @@ /event/ui_act -//Called when living calls a life() tick +// Called when living calls a life() tick // Arguments: // mob/living/L: thing that ticker // life_ticks: the amounts of lifetick processed /lazy_event/on_life +// Called by attack_self +// Arguments: +// mob/living/user +/event/item_attack_self + +// Called when a PDA's ringtone is about to be changed. +// Arguments: +// mob/user: who's changing the ringtone +// new_ringtone: the new ringtone, string +/event/pda_change_ringtone + +// Called when a radio's frequency is about to be changed +// Arguments: +// mob/user: who's changing the frequency +// new_frequency: the new frequency, number +/event/radio_new_frequency + +// Called when a mob performs an emote +// Arguments: +// emote: the name of the emote being performed +// mob/source: the mob performing the emote +/event/emote + /datum /// Associative list of type path -> list(), /// where the type path is a descendant of /event_type. diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index e03fa004b6b..29bb23b623b 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -3,6 +3,7 @@ // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) + . = invoke_event(/event/item_attack_self, list("user" = user)) if(flags & TWOHANDABLE) if(!(flags & MUSTTWOHAND)) if(wielded) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm new file mode 100644 index 00000000000..4093c3d95ab --- /dev/null +++ b/code/datums/components/component.dm @@ -0,0 +1,79 @@ +/datum/component + var/datum/parent + +/datum/component/New(datum/parent, ...) + src.parent = parent + var/list/arguments = args.Copy(2) + if(!initialize(arglist(arguments))) + stack_trace("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") + qdel(src) + return + + _join_parent(parent) + +/datum/component/Destroy() + if(parent) + _remove_from_parent() + parent = null + ..() + +/datum/component/proc/_join_parent() + var/datum/P = parent + var/list/dc = P.datum_components + if(!dc) + P.datum_components = dc = list() + + dc[type] = src + + register_with_parent() + +/datum/component/proc/_remove_from_parent() + var/datum/P = parent + var/list/dc = P.datum_components + dc -= type + if(!dc.len) + P.datum_components = null + + unregister_from_parent() + +/datum/component/proc/register_with_parent() + return + +/datum/component/proc/unregister_from_parent() + return + +/datum/component/proc/remove() + if(!parent) + return + _remove_from_parent() + parent = null + + +/datum/proc/get_component(datum/component/c_type) + RETURN_TYPE(c_type) + var/list/dc = datum_components + if(!dc) + return null + return dc[c_type] + +/datum/proc/add_component(...) + var/datum/component/new_type = args[1] + + if(!ispath(new_type)) + CRASH("add_component called with non-path first argument: [new_type]") + + if(!isnull(get_component(new_type))) + CRASH("add_component called but [new_type] already exists") + + args[1] = src + var/datum/component/new_component = new new_type(arglist(args)) + + if(!new_component || new_component.gcDestroyed) + CRASH("add_component tried to create new [new_type] but it was deleted") + + return new_component + +/datum/proc/load_component(datum/component/c_type, ...) + . = get_component(c_type) + if(!.) + return add_component(arglist(args)) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm new file mode 100644 index 00000000000..31578f12724 --- /dev/null +++ b/code/datums/components/uplink.dm @@ -0,0 +1,180 @@ +/datum/component/uplink + var/locked = TRUE + var/lockable = TRUE + var/list/purchase_log = list() + var/unlock_code + var/unlock_frequency + var/compact_mode + var/telecrystals = 20 + var/selected_category + var/job + var/nuke_ops_inventory = FALSE + +/datum/component/uplink/initialize() + if(!isitem(parent)) + return FALSE + + parent.register_event(/event/attackby, src, .proc/on_attackby) + parent.register_event(/event/item_attack_self, src, .proc/on_attack_self) + if(istype(parent, /obj/item/device/pda)) + generate_unlock_code() + parent.register_event(/event/pda_change_ringtone, src, .proc/on_pda_change_ringtone) + + if(istype(parent, /obj/item/device/radio)) + generate_frequency() + parent.register_event(/event/radio_new_frequency, src, .proc/on_radio_new_frequency) + + return TRUE + +/datum/component/uplink/Destroy() + parent.unregister_event(/event/attackby, src, .proc/on_attackby) + parent.unregister_event(/event/item_attack_self, src, .proc/on_attack_self) + parent.unregister_event(/event/pda_change_ringtone, src, .proc/on_pda_change_ringtone) + parent.unregister_event(/event/radio_new_frequency, src, .proc/on_radio_new_frequency) + ..() + +/datum/component/uplink/ui_host(mob/user) + return parent + +/datum/component/uplink/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Uplink") + ui.set_autoupdate(FALSE) + ui.open() + +/datum/component/uplink/ui_data(mob/user) + var/list/data = list() + data["telecrystals"] = telecrystals + data["lockable"] = lockable + data["compactMode"] = compact_mode + data["selectedCategory"] = selected_category + return data + +/datum/component/uplink/ui_static_data(mob/user) + var/list/data = list() + data["categories"] = list() + for(var/category in get_uplink_items(uplink_items)) + var/list/cat = list( + "name" = category, + "items" = list() + ) + for(var/datum/uplink_item/I in uplink_items[category]) + if(!I.available_for_job(job) || (!I.available_for_nuke_ops && nuke_ops_inventory)) + continue + cat["items"] += list(list( + "name" = I.name, + "cost" = I.get_cost(job), + "desc" = I.desc, + "discounted" = I.gives_discount(job) || length(I.jobs_exclusive), + "refundable" = I.refundable, + )) + if(!length(cat["items"])) + continue + data["categories"] += list(cat) + return data + +/datum/component/uplink/ui_state(mob/user) + return global.deep_inventory_state + +/datum/component/uplink/ui_act(action, params) + . = ..() + if(.) + return + if(locked) + return + switch(action) + if("buy") + var/item_name = params["name"] + var/list/buyable_items = get_uplink_items(job) + var/datum/uplink_item/item + for(var/category in buyable_items) + for(var/datum/uplink_item/category_item in buyable_items[category]) + if(category_item.name == item_name) + item = category_item + break + if(!item) + CRASH("unknown uplink_item [item_name]") + item.buy(src, usr) + return TRUE + if("lock") + locked = TRUE + SStgui.close_uis(src) + if("select") + selected_category = params["category"] + return TRUE + if("compact_toggle") + compact_mode = !compact_mode + return TRUE + if("get_tc") + var/amount = clamp(text2num(params["amount"]), 0, telecrystals) + if(amount == 0) + return + telecrystals -= amount + var/obj/item/stack/telecrystal/R = new(get_turf(usr), amount) + to_chat(usr, "You withdraw [amount] telecrystal[amount > 1 ? "s" : ""] from the uplink.") + usr.put_in_hands(R) + return TRUE + +// Dumb oldcode +/datum/component/uplink/proc/generate_frequency() + var/freq = 1441 + var/static/list/freqlist + if(!freqlist) + freqlist = list() + while (freq <= 1489) + if (freq < 1451 || freq > 1459) + freqlist += freq + freq += 2 + if ((freq % 2) == 0) + freq += 1 + unlock_frequency = pick(freqlist) + +/datum/component/uplink/proc/generate_unlock_code() + unlock_code = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" + +/datum/component/uplink/proc/on_attackby(mob/living/attacker, obj/item/item) + if(locked) + return + if(istype(item, /obj/item/stack/telecrystal)) + var/obj/item/stack/telecrystal/crystals = item + telecrystals += crystals.amount + crystals.use(crystals.amount) + to_chat(attacker, "You insert [crystals.amount] telecrystal[crystals.amount > 1 ? "s" : ""] into the uplink.") + return + var/list/items = get_uplink_items() + for(var/category in items) + for(var/category_item in items[category]) + var/datum/uplink_item/uplink_item = category_item + if(!uplink_item.refundable) + continue + + var/path = uplink_item.refund_path || uplink_item.item + if(!istype(uplink_item, path) || item.check_uplink_validity()) + continue + + var/cost = uplink_item.refund_amount || uplink_item.cost + telecrystals += cost + to_chat(attacker, "[item] refunded.") + qdel(item) + +/datum/component/uplink/proc/on_attack_self(mob/user) + if(locked) + return + tgui_interact(user) + return TRUE + +/datum/component/uplink/proc/on_pda_change_ringtone(mob/user, new_ringtone) + if(trim(lowertext(new_ringtone)) != trim(lowertext(unlock_code))) + return + locked = FALSE + tgui_interact(user) + return TRUE + +/datum/component/uplink/proc/on_radio_new_frequency(mob/user, new_frequency) + if(new_frequency != unlock_frequency) + return + locked = FALSE + tgui_interact(user) + return TRUE + diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 0ee00a078bc..36067364b8d 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -47,9 +47,7 @@ msg = replace_pronoun(user, msg) if(isliving(user)) - var/mob/living/L = user - for(var/obj/item/weapon/implant/I in L) - I.trigger(key, L) + user.invoke_event(/event/emote, list("emote" = key, "source" = user)) if(!msg) return diff --git a/code/datums/gamemode/misc_gamemode_procs.dm b/code/datums/gamemode/misc_gamemode_procs.dm index bb4a5aeeaf9..81537a2b368 100644 --- a/code/datums/gamemode/misc_gamemode_procs.dm +++ b/code/datums/gamemode/misc_gamemode_procs.dm @@ -310,73 +310,16 @@ roles += player.mind.assigned_role return roles -/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/uses = 20, var/datum/role/traitor/role) - if (!istype(traitor_mob)) - return - . = 1 - - // find a radio! toolbox(es), backpack, belt, headset - var/loc = "" - var/list/contents = recursive_type_check(traitor_mob, /obj/item/device) - var/obj/item/R = locate(/obj/item/device/pda) in contents //Hide the uplink in a PDA if available, otherwise radio - if(!R) - R = locate(/obj/item/device/radio) in contents - - if (!R) - to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you a radio.") - . = 0 - else - var/obj/item/device/uplink/hidden/T - if (istype(R, /obj/item/device/radio)) - // generate list of radio freqs - var/obj/item/device/radio/target_radio = R - var/freq = 1441 - var/list/freqlist = list() - while (freq <= 1489) - if (freq < 1451 || freq > 1459) - freqlist += freq - freq += 2 - if ((freq % 2) == 0) - freq += 1 - freq = freqlist[rand(1, freqlist.len)] - - T = new(R) - T.uses = uses - target_radio.hidden_uplink = T - target_radio.traitor_frequency = freq - to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.") - traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [loc]).") - traitor_mob.mind.total_TC += target_radio.hidden_uplink.uses - else if (istype(R, /obj/item/device/pda)) - // generate a passcode if the uplink is hidden in a PDA - var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" - - T = new(R) - R.hidden_uplink = T - var/obj/item/device/pda/P = R - P.lock_code = pda_pass - - to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.") - traitor_mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [loc]).") - traitor_mob.mind.total_TC += R.hidden_uplink.uses - if (role && T) - role.uplink = T - -/datum/mind/proc/find_syndicate_uplink(var/obj/item/device/uplink/true_uplink) - var/uplink = null - +/datum/mind/proc/find_syndicate_uplink(datum/component/uplink/true_uplink) for (var/obj/item/I in get_contents_in_object(current, /obj/item)) - if (I && I.hidden_uplink) - uplink = I.hidden_uplink - break + var/datum/component/uplink/uplink_comp = I.get_component(/datum/component/uplink) + if(uplink_comp) + return uplink_comp - if (!uplink && true_uplink) - return true_uplink//returns the uplink they spawned with rather than the one they are currently carrying - - return uplink + return true_uplink // returns the uplink they spawned with rather than the one they are currently carrying, or null /datum/mind/proc/take_uplink() - var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() + var/datum/component/uplink/H = find_syndicate_uplink() if(H) message_admins("Found and deleted [H] for [src].") qdel(H) diff --git a/code/datums/gamemode/objectives/target/assassinate.dm b/code/datums/gamemode/objectives/target/assassinate.dm index 5b5f990470c..d4960710725 100644 --- a/code/datums/gamemode/objectives/target/assassinate.dm +++ b/code/datums/gamemode/objectives/target/assassinate.dm @@ -95,8 +95,8 @@ var/list/assassination_objectives = list() if (A.syndicate_checked) continue - var/obj/item/device/uplink/hidden/owner_uplink = owner.find_syndicate_uplink() - var/obj/item/device/uplink/hidden/enemy_uplink = target.find_syndicate_uplink(enemy.uplink) + var/datum/component/uplink/owner_uplink = owner.find_syndicate_uplink() + var/datum/component/uplink/enemy_uplink = target.find_syndicate_uplink(enemy.uplink) //chances are the target's uplink is no longer on their mind.current especially if they got decapitated or such. //by associating the uplink with the role we can at least try and get the TCs out of it. @@ -104,10 +104,10 @@ var/list/assassination_objectives = list() to_chat(owner.current, "The Syndicate congratulates you on your Victory. Look forward to be assigned on higher risk operations another day.") else if (owner_uplink) - owner_uplink.uses += DOUBLE_AGENT_TC_REWARD + owner_uplink.telecrystals += DOUBLE_AGENT_TC_REWARD if (enemy_uplink) - owner_uplink.uses += enemy_uplink.uses - enemy_uplink.uses = 0 + owner_uplink.telecrystals += enemy_uplink.telecrystals + enemy_uplink.telecrystals = 0 to_chat(owner.current, "Good work agent. [DOUBLE_AGENT_TC_REWARD] additional tele-crystals have been sent to your uplink.") else to_chat(owner.current, "Good work agent. Unfortunately we couldn't find your uplink on your person, so no additional tele-crystals could be distributed.") @@ -117,8 +117,8 @@ var/list/assassination_objectives = list() to_chat(owner.current, "New Objective: [new_kill_target.explanation_text]
") if (owner_uplink && enemy_uplink) - owner_uplink.uses += enemy_uplink.uses - enemy_uplink.uses = 0 + owner_uplink.telecrystals += enemy_uplink.telecrystals + enemy_uplink.telecrystals = 0 A.syndicate_checked = SYNDICATE_CANCELED to_chat(target.current, "The Syndicate has taken note of your demise. You are therefore ineligible for victory this time around. Better luck next time!") diff --git a/code/datums/gamemode/role/syndicate.dm b/code/datums/gamemode/role/syndicate.dm index 38f20534444..c1485187f7b 100644 --- a/code/datums/gamemode/role/syndicate.dm +++ b/code/datums/gamemode/role/syndicate.dm @@ -7,7 +7,7 @@ default_admin_voice = "The Syndicate" admin_voice_style = "syndradio" var/can_be_smooth = TRUE //Survivors can't be smooth because they get nothing. - var/obj/item/device/uplink/hidden/uplink//so we keep track of where the uplink they spawn with ends up + var/datum/component/uplink/uplink //so we keep track of where the uplink they spawn with ends up /datum/role/traitor/OnPostSetup() ..() @@ -81,9 +81,9 @@ /datum/role/traitor/extraPanelButtons() var/dat = "" - var/obj/item/device/uplink/hidden/guplink = antag.find_syndicate_uplink() + var/datum/component/uplink/guplink = antag.find_syndicate_uplink() if(guplink) - dat += " - Telecrystals: [guplink.uses](Set telecrystals)
" + dat += " - Telecrystals: [guplink.telecrystals](Set telecrystals)
" dat += " - (Remove uplink)
" else dat = " - (Give uplink)
" @@ -94,11 +94,11 @@ if(href_list["giveuplink"]) equip_traitor(antag.current, 20, src) if(href_list["telecrystalsSet"]) - var/obj/item/device/uplink/hidden/guplink = M.find_syndicate_uplink() - var/amount = input("What would you like to set their crystal count to?", "Their current count is [guplink.uses]") as null|num + var/datum/component/uplink/guplink = M.find_syndicate_uplink() + var/amount = input("What would you like to set their crystal count to?", "Their current count is [guplink.telecrystals]") as null|num if(isnum(amount) && amount >= 0) to_chat(usr, "You have set [M]'s uplink telecrystals to [amount].") - guplink.uses = amount + guplink.telecrystals = amount if(href_list["removeuplink"]) M.take_uplink() @@ -133,6 +133,37 @@ else . += "The traitor was a smooth operator this round.
" +/datum/role/traitor/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/uses = 20) + . = FALSE + if (!istype(traitor_mob)) + return + + var/list/contents = recursive_type_check(traitor_mob, /obj/item/device) + + var/datum/component/uplink/new_uplink + + // Hide the uplink in a PDA if available, otherwise radio + var/obj/item/device/pda/found_pda = locate() in contents + if(found_pda) + new_uplink = found_pda.add_component(/datum/component/uplink) + traitor_mob.mind.store_memory("Uplink Passcode: [new_uplink.unlock_code] ([found_pda.name]).") + traitor_mob.mind.total_TC += new_uplink.telecrystals + to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [found_pda.name]. Simply enter the code \"[new_uplink.unlock_code]\" as its ringtone to unlock its hidden features.") + . = TRUE + else + var/obj/item/device/radio/found_radio = locate() in contents + if(found_radio) + new_uplink = found_radio.add_component(/datum/component/uplink) + traitor_mob.mind.store_memory("Uplink frequency: [format_frequency(new_uplink.unlock_frequency)] ([found_radio.name]).") + traitor_mob.mind.total_TC += new_uplink.telecrystals + to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [found_radio.name]. Simply dial the frequency [format_frequency(new_uplink.unlock_frequency)] to unlock its hidden features.") + . = TRUE + if (new_uplink) + uplink = new_uplink + new_uplink.job = traitor_mob.mind.assigned_role + else + to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you an uplink.") + //________________________________________________ @@ -239,4 +270,4 @@ if (confirm == "Yes" && M.stat == CONSCIOUS) ticker.StartThematic(linkedfaction.playlist) command_alert(/datum/command_alert/nuclear_operatives) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/datums/map_elements.dm b/code/datums/map_elements.dm index ec43144f739..9505a01fb2a 100644 --- a/code/datums/map_elements.dm +++ b/code/datums/map_elements.dm @@ -26,7 +26,7 @@ var/list/datum/map_element/map_elements = list() return FALSE return TRUE -/datum/map_element/proc/initialize(list/objects) //Called after loading the element. The "objects" list contains all spawned atoms +/datum/map_element/initialize(list/objects) //Called after loading the element. The "objects" list contains all spawned atoms map_elements.Add(src) if(!location && objects.len) diff --git a/code/datums/shuttle.dm b/code/datums/shuttle.dm index 0e2114c1f7e..cfc85665cf3 100644 --- a/code/datums/shuttle.dm +++ b/code/datums/shuttle.dm @@ -106,7 +106,7 @@ //initialize() proc - called automatically in proc/setup_shuttles() below. //Returns INIT_SUCCESS, INIT_NO_AREA, INIT_NO_START or INIT_NO_PORT, depending on whether there were any errors -/datum/shuttle/proc/initialize() +/datum/shuttle/initialize() . = INIT_SUCCESS src.docking_ports = list() src.docking_ports_aboard = list() diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 56cee9c9348..17583107920 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -41,8 +41,8 @@ var/list/uplink_items = list() var/list/jobs_exclusive = list() //If empty, does nothing. If not empty, ONLY jobs in this list can buy this item. var/list/jobs_excluded = list() //Jobs in this list cannot buy this item at all. var/list/roles_exclusive = list() //If empty, does nothing. If not empty, ONLY roles in this list can buy this item. - var/list/roles_excluded = list() //Roles in this list cannot buy this item at all. - + var/available_for_traitors = TRUE + var/available_for_nuke_ops = TRUE var/only_on_month //two-digit month as string var/only_on_day //two-digit day as string var/num_in_stock = 0 // Number of times this can be bought, globally. 0 is infinite @@ -62,19 +62,9 @@ var/list/uplink_items = list() return user_job && jobs_with_discount.len && jobs_with_discount.Find(user_job) /datum/uplink_item/proc/available_for_job(var/user_job) - return user_job && !(jobs_exclusive.len && !jobs_exclusive.Find(user_job)) && !(jobs_excluded.len && jobs_excluded.Find(user_job)) - -/datum/uplink_item/proc/available_for_role(var/list/roles) - if (roles_exclusive.len) - for (var/role in roles_exclusive) - if (role in roles) - return TRUE - return FALSE - else - for (var/role in roles_excluded) - if (role in roles) - return FALSE + if(!user_job) return TRUE + return !(jobs_exclusive.len && !jobs_exclusive.Find(user_job)) && !(jobs_excluded.len && jobs_excluded.Find(user_job)) //This will get called that is essentially a New() by default. //Use this to make New()s that have extra conditions, such as bundles @@ -82,23 +72,18 @@ var/list/uplink_items = list() /datum/uplink_item/proc/new_uplink_item(var/new_item, var/turf/location, mob/user) return new new_item(location) -/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U, mob/user) +/datum/uplink_item/proc/spawn_item(var/turf/loc, datum/component/uplink/U, mob/user) if(!available_for_job(U.job)) message_admins("[key_name(user)] tried to purchase \the [src.name] from their uplink despite not being available to their job! (Job: [U.job]) ([formatJumpTo(get_turf(U))])") return - if(!available_for_role(U.roles)) - var/dat = "" - for (var/role in roles_exclusive) - if (dat) - dat+= ", " - dat += role - message_admins("[key_name(user)] tried to purchase \the [src.name] from their uplink despite not being available to their role! (Role: [dat]) ([formatJumpTo(get_turf(U))])") + if(U.nuke_ops_inventory && !available_for_nuke_ops) + message_admins("[key_name(user)] tried to purchase \the [src.name] from their uplink despite being a nuclear operative") return - U.uses -= max(get_cost(U.job), 0) + U.telecrystals -= max(get_cost(U.job), 0) feedback_add_details("traitor_uplink_items_bought", name) return new_uplink_item(item, loc, user) -/datum/uplink_item/proc/buy(var/obj/item/device/uplink/hidden/U, var/mob/user) +/datum/uplink_item/proc/buy(datum/component/uplink/U, var/mob/user) if(!istype(U)) return 0 @@ -113,9 +98,10 @@ var/list/uplink_items = list() return 0 // If the uplink's holder is in the user's contents - if ((U.loc in user.contents || (in_range(U.loc, user) && istype(U.loc.loc, /turf)))) + var/obj/item/holder = U.parent + if ((holder in user.contents || (in_range(holder, user) && istype(holder.loc, /turf)))) user.set_machine(U) - if(get_cost(U.job) > U.uses) + if(get_cost(U.job) > U.telecrystals) return 0 var/obj/I = spawn_item(get_turf(user), U, user) @@ -154,8 +140,6 @@ var/list/uplink_items = list() R = user.mind.GetRole(CHALLENGER) if(R) R.uplink_items_bought += {" [bundlename] for [get_cost(U.job)] TC
"} - U.interact(user) - return 1 return 0 @@ -610,8 +594,7 @@ var/list/uplink_items = list() item = /obj/item/weapon/storage/box/syndicate cost = 0 -/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/device/uplink/U, user) - +/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/datum/component/uplink/U, user) var/list/buyable_items = get_uplink_items() var/list/possible_items = list() @@ -621,15 +604,15 @@ var/list/uplink_items = list() continue if(!I.available_for_job(U.job)) continue - if(!I.available_for_role(U.roles)) + if(!I.available_for_nuke_ops && U.nuke_ops_inventory) continue - if(I.get_cost(U.job, 0.5) > U.uses) + if(I.get_cost(U.job, 0.5) > U.telecrystals) continue possible_items += I if(possible_items.len) var/datum/uplink_item/I = pick(possible_items) - U.uses -= max(0, I.get_cost(U.job, 0.5)) + U.telecrystals -= max(0, I.get_cost(U.job, 0.5)) feedback_add_details("traitor_uplink_items_bought","RN") return new_uplink_item(I.item, loc, user) @@ -1128,7 +1111,7 @@ var/list/uplink_items = list() /datum/uplink_item/syndie_coop category = "Cooperative Cell" - roles_exclusive = list(TRAITOR) + available_for_nuke_ops = FALSE /datum/uplink_item/syndie_coop/elite_bundle name = "Elite Syndicate Bundle" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index a840ab00603..4aa1ba831a6 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -17,25 +17,6 @@ to_chat(viewers(user), "[user] wraps the cord of the [src.name] around \his neck! It looks like \he's trying to commit suicide.") return(SUICIDE_ACT_OXYLOSS) -/*/obj/item/weapon/syndicate_uplink - name = "station bounced radio" - desc = "Remain silent about this..." - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - var/temp = null - var/uses = 10.0 - var/selfdestruct = 0.0 - var/traitor_frequency = 0.0 - var/mob/currentUser = null - var/obj/item/device/radio/origradio = null - flags = FPRINT | CONDUCT | ONBELT - w_class = W_CLASS_SMALL - item_state = "radio" - throw_speed = 4 - throw_range = 20 - m_amt = 100 - origin_tech = Tc_MAGNETS + "=2;" + Tc_SYNDICATE + "=3"*/ - /obj/item/weapon/rsp name = "\improper Rapid-Seed-Producer (RSP)" desc = "A device used to rapidly deploy seeds." diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f9c5385139b..53f04daa134 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -872,7 +872,7 @@ its easier to just keep the beam vertical. if(uppertext(C.ckey) == uppertext(fingerprintslast)) return C.mob -/atom/proc/initialize() +/atom/initialize() flags |= ATOM_INITIALIZED /atom/proc/get_cell() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0c0010cbf71..e5906b266f2 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -47,7 +47,6 @@ var/armor_absorb = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. - var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc. var/list/species_fit = null //This object has a different appearance when worn by these species var/nonplant_seed_type @@ -281,11 +280,6 @@ /obj/item/attack_paw(var/mob/user) attack_hand(user) -// Due to storage type consolidation this should get used more now. -// I have cleaned it up a little, but it could probably use more. -Sayu -/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob) - return ..() - /obj/item/proc/talk_into(var/datum/speech/speech, var/channel=null) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 8dd29974784..759c1963bf1 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -612,7 +612,7 @@ var/global/msg_id = 0 aiPDA.photo.pixel_y = q.fields["pixel_y"] aiPDA.photo.blueprints = q.fields["blueprints"] break - + aiPDA.create_message(src, selected) aiPDA.photo = null @@ -658,7 +658,7 @@ var/global/msg_id = 0 photo.pixel_y = q.fields["pixel_y"] photo.blueprints = q.fields["blueprints"] break - + create_message(usr, selected) photo = null @@ -777,7 +777,8 @@ var/global/msg_id = 0 if (map_app && map_app.holomap) map_app.holomap.stopWatching() - if(active_uplink_check(user)) + . = ..() + if(.) return if(user.client) @@ -2111,13 +2112,14 @@ var/global/msg_id = 0 var/t = input(U, "Please enter new ringtone", name, ttone) as text if (in_range(U, src) && loc == U) if (t) - if(src.hidden_uplink && hidden_uplink.check_trigger(U, trim(lowertext(t)), trim(lowertext(lock_code)))) + if(invoke_event(/event/pda_change_ringtone, list("user" = U, "new_ringtone" = t))) to_chat(U, "The PDA softly beeps.") U << browse(null, "window=pda") src.mode = 0 else t = copytext(sanitize(t), 1, 20) ttone = t + return else U << browse(null, "window=pda") return @@ -2285,7 +2287,7 @@ var/global/msg_id = 0 else difficulty += 2 - if(P.hidden_uplink) + if(P.get_component(/datum/component/uplink)) U.show_message("An error flashes on your [src]; [pick(syndicate_code_response)]", 1) U << browse(null, "window=pda") create_message(null, P, null, null, pick(syndicate_code_phrase)) //friendly fire @@ -2492,7 +2494,7 @@ var/global/msg_id = 0 return var/obj/item/weapon/photo/current_photo = null - + if(photo) current_photo = photo @@ -2504,7 +2506,7 @@ var/global/msg_id = 0 if(current_photo) imglist["[msg_id]"] = current_photo.img P.imglist["[msg_id]"] = current_photo.img - + useMS.send_pda_message("[P.owner]","[owner]","[t]",imglist["[msg_id]"]) tnote["[msg_id]"] = "→ To [P.owner]:
[t]
" @@ -2623,8 +2625,8 @@ obj/item/device/pda/AltClick() // access to status display signals /obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob) - ..() - if(hidden_uplink && hidden_uplink.active && hidden_uplink.refund(user, C)) + . = ..() + if(.) return if(istype(C, /obj/item/weapon/cartridge) && !cartridge) if(user.drop_item(C, src)) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 27a096a50ff..15090300ad5 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -38,6 +38,9 @@ return TRUE /obj/item/device/multitool/attack_self(var/mob/user) + . = ..() + if(.) + return if(!buffer?.get() && !clone) // Can't enable cloning without buffer. return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 515ab9220ab..731a4423407 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -243,7 +243,7 @@ /obj/item/device/radio/headset/attackby(obj/item/weapon/W, mob/user) // ..() - if(hidden_uplink && hidden_uplink.active && hidden_uplink.refund(user, W)) + if(invoke_event(/event/attackby, list("attacker" = user, "item" = W))) return user.set_machine(src) if (!( W.is_screwdriver(user) || (istype(W, /obj/item/device/encryptionkey/ )))) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 3df4d98490d..4595880675b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -7,7 +7,6 @@ var/on = 1 // 0 for off var/last_transmission var/frequency = 1459 - var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies var/canhear_range = 3 // the range which mobs can hear this radio from var/obj/item/device/radio/patch_link = null var/datum/wires/radio/wires = null @@ -59,7 +58,7 @@ radio_list -= src remove_radio_all(src) //Just to be sure ..() - + /obj/item/device/radio/initialize() . = ..() frequency = COMMON_FREQ //common chat @@ -86,9 +85,6 @@ if(!on) return - if(active_uplink_check(user)) - return - var/dat = "[src]" dat += "Microphone: [broadcasting ? "Engaged" : "Disengaged"]
" @@ -122,12 +118,6 @@ [chan_name]: [list ? "Engaged" : "Disengaged"]
"} -/obj/item/device/radio/proc/check_traitor_uplink(frequency) - if(hidden_uplink) - if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) - usr << browse(null, "window=radio") - return 1 - /obj/item/device/radio/Topic(href, href_list) if (!isAdminGhost(usr) && (usr.stat || !on)) return @@ -147,17 +137,15 @@ var/new_frequency new_frequency = input(usr, "Set a new frequency (1200-1600 kHz).", src, frequency) as null|num new_frequency = sanitize_frequency(new_frequency, maxf) - set_frequency(new_frequency) - if (check_traitor_uplink(frequency)) - return + if(!invoke_event(/event/radio_new_frequency, list("user" = usr, "new_frequency" = new_frequency))) + set_frequency(new_frequency) else if (href_list["freq"]) var/new_frequency new_frequency = (frequency + text2num(href_list["freq"])) new_frequency = sanitize_frequency(new_frequency, maxf) - set_frequency(new_frequency) - if (check_traitor_uplink(frequency)) - return + if(!invoke_event(/event/radio_new_frequency, list("user" = usr, "new_frequency" = new_frequency))) + set_frequency(new_frequency) else if (href_list["talk"]) broadcasting = text2num(href_list["talk"]) @@ -508,8 +496,8 @@ interact(user) /obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if(hidden_uplink && hidden_uplink.active && hidden_uplink.refund(user, W)) + . = ..() + if(.) return user.set_machine(src) if (!(W.is_screwdriver(user))) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 32f773b4759..d18a33eae0f 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -6,296 +6,29 @@ A list of items and costs is stored under the datum of every game mode, alongsid */ -/obj/item/device/uplink - var/welcome // Welcoming menu message - var/uses // Number of crystals - // List of items not to shove in their hands. - var/list/purchase_log = list() - var/show_description = null - var/active = 0 - var/job = null - var/list/roles = list() -/obj/item/device/uplink/New() - ..() - if(ticker) - initialize() - return - -/obj/item/device/uplink/initialize() - if(ticker.mode) - welcome = "Syndicate Uplink Console" - uses = 20 - else - welcome = "THANKS FOR MAPPING IN THIS THING AND NOT CHECKING FOR RUNTIMES BUDDY" - uses = 90 // Because this is only happening on centcomm's snowflake uplink - -/obj/item/device/uplink/proc/refund(mob/living/carbon/human/user, obj/item/I) - if(!user || !I) - return - if (istype(I, /obj/item/stack/telecrystal)) - var/obj/item/stack/telecrystal/S = I - uses += S.amount - user.drop_item(S, src) - to_chat(user, "You insert [S.amount] telecrystal[S.amount > 1 ? "s" : ""] into the uplink.") - qdel(S) - if(!uplink_items) - get_uplink_items() - for(var/category in uplink_items) - for(var/item in uplink_items[category]) - var/datum/uplink_item/UI = item - var/path = UI.refund_path || UI.item - var/cost = UI.refund_amount || UI.cost - if(istype(I, path) && UI.refundable && I.check_uplink_validity()) - uses += cost - to_chat(user, "[I] refunded.") - qdel(I) - return TRUE - return FALSE - -//Let's build a menu! -/obj/item/device/uplink/proc/generate_menu(var/mob/user) - if(!job) - job = user.mind.assigned_role - roles = list() - for (var/role in user.mind.antag_roles) - var/datum/role/R = user.mind.antag_roles[role] - roles += R.id - - var/dat = list() - dat += "[src.welcome]
" - - dat += {"Tele-Crystals left: [src.uses]
-
- Request item:
- Each item costs a number of tele-crystals as indicated by the number following their name.

"} - var/list/buyable_items = get_uplink_items() - - // Loop through categories - var/index = 0 - for(var/category in buyable_items) - - index++ - dat += "[category]
" - - var/discounted_list = list() //These go on top. - var/jobexclusive_list = list() - var/nondiscounted_list = list() //These go on the bottom. - - var/i = 0 - // Loop through items in category - for(var/datum/uplink_item/item in buyable_items[category]) - i++ - - if(!item.available_for_job(job)) - continue - - var/itemcost = item.get_cost(job) - var/cost_text = "" - var/desc = "[item.desc]" - var/final_text = "" - if(itemcost > 0) - if(item.gives_discount(job) || item.jobs_exclusive.len) - cost_text = "([itemcost]!)" - else - cost_text = "([itemcost])" - if(itemcost <= uses) - final_text += "[item.name] [cost_text] " - else - final_text += "[item.name] [cost_text] " - if(item.refundable) - final_text += "\[R\]" - if(item.desc) - if(show_description == 2) - final_text += "\[-\]
[desc][item.refundable ? " Use this item on your uplink to refund it for [item.refund_amount || item.cost] TC.":""]" - else - final_text += "\[?\]" - final_text += "
" - - if(item.gives_discount(job)) - discounted_list += final_text - else if(item.jobs_exclusive.len) //If we don't match this thing's job, we already exited out, so we don't need to check again - jobexclusive_list += final_text - else - nondiscounted_list += final_text - - for(var/text in discounted_list|jobexclusive_list|nondiscounted_list) //Discounted first, nondiscounted later. - dat += text - - // Break up the categories, if it isn't the last. - if(buyable_items.len != index) - dat += "
" - - dat += "
" - if (uses) - dat += "Extract telecrystals
" - else - dat += "Extract telecrystals/
" - dat = jointext(dat,"") //Optimize BYOND's shittiness by making "dat" actually a list of strings and join it all together afterwards! Yes, I'm serious, this is actually a big deal - return dat - -// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button. -/obj/item/device/uplink/interact(mob/user as mob) - - var/dat = "" - dat += src.generate_menu(user) - - dat += {"Lock - "} - user << browse(dat, "window=hidden") - onclose(user, "hidden") - return - - -/obj/item/device/uplink/Topic(href, href_list) - ..() - - if (!is_holder_of(usr, src)) - message_admins("[key_name(usr)] tried to access [src], an unlocked PDA, despite not being its holder. ([formatJumpTo(get_turf(src))])") - return FALSE - - if(!active) - return - - if (href_list["buy_item"]) - - var/item = href_list["buy_item"] - var/list/split = splittext(item, ":") // throw away variable - - if(split.len == 2) - // Collect category and number - var/category = split[1] - var/number = text2num(split[2]) - - if(!job) //Should never happen unless the user somehow sends out a Topic() call before opening their uplink, but just in case. - job = usr.mind.assigned_role - var/list/buyable_items = get_uplink_items(job) - - var/list/uplink = buyable_items[category] - if(uplink && uplink.len >= number) - var/datum/uplink_item/I = uplink[number] - if(I) - I.buy(src, usr) - else - var/text = "[key_name(usr)] tried to purchase an uplink item that doesn't exist" - var/textalt = "[key_name(usr)] tried to purchase an uplink item that doesn't exist [item]" - message_admins(text) - log_game(textalt) - admin_log.Add(textalt) - - else if(href_list["show_desc"]) - show_description = text2num(href_list["show_desc"]) - interact(usr) - - else if(href_list["get_tc"]) - if (uses <= 0) - return - var/amount = input("How many telecrystals do you wish to withdraw?:", "Extract telecrystals", null) as num - if(!usr.Adjacent(src)) - return - amount = clamp(amount, 0, uses) - if (amount <= 0) - return - uses -= amount - var/obj/item/stack/telecrystal/R = new /obj/item/stack/telecrystal(usr, amount) - var/mob/living/carbon/human/H = usr - to_chat(usr, "You withdraw [amount] telecrystal[amount > 1 ? "s" : ""] from your uplink.") - H.put_in_hands(R) - -// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. -/* How to create an uplink in 3 easy steps! - - 1. All obj/item 's have a hidden_uplink var. By default it's null. Give the item one with "new(src)", it must be in it's contents. Feel free to add "uses". - - 2. Code in the triggers. Use check_trigger for this, I recommend closing the item's menu with "usr << browse(null, "window=windowname") if it returns true. - The var/value is the value that will be compared with the var/target. If they are equal it will activate the menu. - - 3. If you want the menu to stay until the users locks his uplink, add an active_uplink_check(mob/user as mob) in your interact/attack_hand proc. - Then check if it's true, if true return. This will stop the normal menu appearing and will instead show the uplink menu. -*/ - -/obj/item/device/uplink/hidden - name = "Hidden Uplink." - desc = "There is something wrong if you're examining this." - var/datum/role/traitor/associated_role - -/obj/item/device/uplink/hidden/Destroy() - var/obj/item/I = loc - I.hidden_uplink = null - if (associated_role) - associated_role.uplink = null - associated_role = null - ..() - -/obj/item/device/uplink/hidden/Topic(href, href_list) - ..() - if(href_list["lock"]) - toggle() - usr << browse(null, "window=hidden") - return 1 - -// Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. -/obj/item/device/uplink/hidden/proc/toggle() - active = !active - -// Directly trigger the uplink. Turn on if it isn't already. -/obj/item/device/uplink/hidden/proc/trigger(mob/user as mob) - if(!active) - toggle() - interact(user) - -// Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset. -// If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the -// current item's menu. -/obj/item/device/uplink/hidden/proc/check_trigger(mob/user as mob, var/value, var/target) - if(value == target) - trigger(user) - return 1 - return 0 - -// I placed this here because of how relevant it is. -// You place this in your uplinkable item to check if an uplink is active or not. -// If it is, it will display the uplink menu and return 1, else it'll return false. -// If it returns true, I recommend closing the item's normal menu with "user << browse(null, "window=name")" -/obj/item/proc/active_uplink_check(mob/user as mob) - // Activates the uplink if it's active - if(src.hidden_uplink) - if(src.hidden_uplink.active) - src.hidden_uplink.trigger(user) - return 1 - return 0 // PRESET UPLINKS // A collection of preset uplinks. -// -// Includes normal radio uplink, multitool uplink, -// implant uplink (not the implant tool) and a preset headset uplink. /obj/item/device/radio/uplink/New() - hidden_uplink = new(src) - icon_state = "radio" - -/obj/item/device/radio/uplink/attack_self(mob/user as mob) - if(hidden_uplink) - hidden_uplink.trigger(user) - + ..() + add_component(/datum/component/uplink) /obj/item/device/radio/uplink/nukeops/New() ..() - hidden_uplink.uses = 80 //haha fuck OOP - hidden_uplink.job = "Nuclear Operative" + var/datum/component/uplink/uplink_component = get_component(/datum/component/uplink) + uplink_component.telecrystals = 80 + uplink_component.locked = FALSE + uplink_component.lockable = FALSE + uplink_component.nuke_ops_inventory = TRUE /obj/item/device/multitool/uplink/New() - hidden_uplink = new(src) - -/obj/item/device/multitool/uplink/attack_self(mob/user as mob) - if(hidden_uplink) - hidden_uplink.trigger(user) - -/obj/item/device/radio/headset/uplink - traitor_frequency = 1445 + ..() + var/datum/component/uplink/uplink_comp = add_component(/datum/component/uplink) + uplink_comp.lockable = FALSE + uplink_comp.locked = FALSE /obj/item/device/radio/headset/uplink/New() ..() - hidden_uplink = new(src) - hidden_uplink.uses = 20 + add_component(/datum/component/uplink) diff --git a/code/game/objects/items/weapons/implants/exile2.dm b/code/game/objects/items/weapons/implants/exile2.dm index 82a81db9a18..8be693c9730 100644 --- a/code/game/objects/items/weapons/implants/exile2.dm +++ b/code/game/objects/items/weapons/implants/exile2.dm @@ -28,6 +28,7 @@ return dat /obj/item/weapon/implant/exile/implanted(mob/source, mob/user) + ..() theExile = source disablePhrase = stripped_input(user, "Choose a phrase that disables the implant:") var/list/replacechars = list("'" = "", "\"" = "", ">" = "", "<" = "", "(" = "", ")" = "") diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index d6fd1a48c41..d19ea61ca68 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -92,7 +92,7 @@ if(findtext(msg, phrase)) activate() -/obj/item/weapon/implant/explosive/trigger(emote, source as mob) +/obj/item/weapon/implant/explosive/trigger(emote, mob/source) if(emote == "deathgasp") activate() @@ -122,6 +122,7 @@ usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.", 0, 0) to_chat(usr, "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.") addHear() + source.register_event(/event/emote, src, .proc/trigger) return 1 /obj/item/weapon/implant/explosive/emp_act(severity) @@ -149,6 +150,7 @@ return 0 /obj/item/weapon/implant/explosive/handle_removal(var/mob/remover) + imp_in?.unregister_event(/event/emote, src, .proc/trigger) makeunusable(75) /obj/item/weapon/implant/explosive/proc/small_boom() @@ -263,6 +265,13 @@ the implant may become unstable and either pre-maturely inject the subject or si src.activate(src.reagents.total_volume) return +/obj/item/weapon/implant/chem/implanted(mob/source) + source.register_event(/event/emote, src, .proc/trigger) + return TRUE + +/obj/item/weapon/implant/explosive/handle_removal(mob/remover) + imp_in?.unregister_event(/event/emote, src, .proc/trigger) + makeunusable(75) /obj/item/weapon/implant/chem/activate(var/cause) if(malfunction == IMPLANT_MALFUNCTION_PERMANENT) @@ -446,11 +455,13 @@ the implant may become unstable and either pre-maturely inject the subject or si return /obj/item/weapon/implant/adrenalin/implanted(mob/source) - source.mind.store_memory("A implant can be activated by using the pale emote, say *pale to attempt to activate.", 0, 0) - to_chat(source, "The implanted freedom implant can be activated by using the pale emote, say *pale to attempt to activate.") - return 1 + source.register_event(/event/emote, src, .proc/trigger) + source.mind.store_memory("A implant can be activated by using the pale emote, say *pale to attempt to activate.", 0, 0) + to_chat(source, "The implanted freedom implant can be activated by using the pale emote, say *pale to attempt to activate.") + return 1 /obj/item/weapon/implant/adrenalin/handle_removal(var/mob/remover) + imp_in?.unregister_event(/event/emote, src, .proc/trigger) makeunusable(75) /obj/item/weapon/implant/death_alarm @@ -579,6 +590,7 @@ the implant may become unstable and either pre-maturely inject the subject or si qdel (src) /obj/item/weapon/implant/compressed/implanted(mob/source as mob) + source.register_event(/event/emote, src, .proc/trigger) src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") usr.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) to_chat(usr, "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.") @@ -588,6 +600,7 @@ the implant may become unstable and either pre-maturely inject the subject or si return 0 /obj/item/weapon/implant/compressed/handle_removal(var/mob/remover) + imp_in?.unregister_event(/event/emote, src, .proc/trigger) makeunusable(75) /obj/item/weapon/implant/cortical diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 194ca473f50..5b79453c2db 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -1,25 +1,27 @@ /obj/item/weapon/implant/uplink name = "uplink" desc = "Summon things." - var/activation_emote = "chuckle" + var/activation_emote /obj/item/weapon/implant/uplink/New() - activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - hidden_uplink = new(src) - hidden_uplink.uses = 10 ..() - return + var/datum/component/uplink/uplink_comp = add_component(/datum/component/uplink) + uplink_comp.telecrystals = 10 /obj/item/weapon/implant/uplink/implanted(mob/source) + source.register_event(/event/emote, src, .proc/trigger) activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) to_chat(source, "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.") return 1 /obj/item/weapon/implant/uplink/handle_removal(var/mob/remover) + imp_in?.register_event(/event/emote, src, .proc/trigger) makeunusable(75) -/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob) - if(hidden_uplink && usr == source) // Let's not have another people activate our uplink - hidden_uplink.check_trigger(source, emote, activation_emote) - return \ No newline at end of file +/obj/item/weapon/implant/uplink/trigger(emote, mob/source) + if(emote != activation_emote) + return + var/datum/component/uplink/uplink_comp = get_component(/datum/component/uplink) + uplink_comp.locked = FALSE + uplink_comp.tgui_interact(source) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index d36f2f12420..473fddcee75 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -85,6 +85,7 @@ var/global/list/reagents_to_log = list(FUEL, PLASMA, PACID, SACID, AMUTATIONTOXI verbs += /obj/proc/remove_pai /obj/attackby(obj/item/weapon/W, mob/user) + invoke_event(/event/attackby, list("attacker" = user, "item" = W)) if(can_take_pai && istype(W, /obj/item/device/paicard)) if(integratedpai) to_chat(user, "There's already a Personal AI inserted.") diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index b2f93a505f8..66f8aebb66b 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -195,8 +195,6 @@ return 0 // no updates, completely disabled (red visibility) else if (nano.user.restrained() || nano.user.lying) return 1 // update only (orange visibility) - else if (istype(instrumentObj, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI - return 2 // Will build in distance checks on the topics for sanity. else if (!(instrumentObj in view(4, nano.user))) // If the src object is not in visable, set status to 0 return 0 // no updates, completely disabled (red visibility) else if (dist <= 1) diff --git a/code/modules/components/component.dm b/code/modules/components/component.dm index 11a997b11c5..6242d341099 100644 --- a/code/modules/components/component.dm +++ b/code/modules/components/component.dm @@ -5,6 +5,7 @@ var/enabled=1 /datum/component/New(var/datum/component_container/CC) + ..() container=CC // Override to receive signals. diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 38b490b1fee..aae9333af9e 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -66,7 +66,7 @@ /datum/library_catalog var/list/cached_books = list() -/datum/library_catalog/proc/initialize() +/datum/library_catalog/initialize() var/newid=1 for(var/typepath in typesof(/obj/item/weapon/book/manual)-/obj/item/weapon/book/manual) var/obj/item/weapon/book/B = new typepath(null) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index fb1cc07e93f..b24397ac250 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -194,8 +194,6 @@ nanoui is used to open and update nano browser uis return STATUS_DISABLED // no updates, completely disabled (red visibility) else if (nano.user.restrained() || nano.user.lying) return STATUS_UPDATE // update only (orange visibility) - else if (istype(nano.src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI - return STATUS_INTERACTIVE // Will build in distance checks on the topics for sanity. else if (!(nano.src_object in view(4, nano.user))) // If the src object is not in visable, set status to 0 return STATUS_DISABLED // no updates, completely disabled (red visibility) else if (dist <= 1) diff --git a/code/modules/power/components.dm b/code/modules/power/components.dm index 59bc8b53c15..b2eb9d8b413 100644 --- a/code/modules/power/components.dm +++ b/code/modules/power/components.dm @@ -153,7 +153,7 @@ if(!C || !C.get_powernet()) return 0 - C.powernet.add_component(src) + C.powernet.add_connection(src) connected=1 return 1 @@ -306,7 +306,7 @@ if(!cable || !cable.get_powernet()) return 0 - cable.powernet.add_component(src) + cable.powernet.add_connection(src) connected=1 return 1 diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 4e4229824b7..bf00c939cb3 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -81,7 +81,7 @@ M.powernet = src nodes += M -/datum/powernet/proc/add_component(var/datum/power_connection/C) +/datum/powernet/proc/add_connection(var/datum/power_connection/C) if(C.powernet) // if M already has a powernet... if(C.powernet == src) return diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index 8152f241216..b63605e0326 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -48,7 +48,7 @@ * optional inline_html string Custom HTML to inject. * optional fancy bool If TRUE, will hide the window titlebar. */ -/datum/tgui_window/proc/initialize( +/datum/tgui_window/initialize( inline_assets = list(), inline_html = "", fancy = FALSE) diff --git a/tgui/packages/tgui/interfaces/Uplink.js b/tgui/packages/tgui/interfaces/Uplink.js new file mode 100644 index 00000000000..7fc54a0334d --- /dev/null +++ b/tgui/packages/tgui/interfaces/Uplink.js @@ -0,0 +1,198 @@ +import { createSearch, decodeHtmlEntities } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Box, Button, Flex, Input, Section, Table, Tabs, NoticeBox, Icon } from '../components'; +import { formatMoney } from '../format'; +import { Window } from '../layouts'; + +const MAX_SEARCH_RESULTS = 25; + +export const Uplink = (props, context) => { + const { data } = useBackend(context); + const { telecrystals } = data; + return ( + + + + + + ); +}; + +export const GenericUplink = (props, context) => { + const { + currencyAmount = 0, + currencySymbol = 'cr', + } = props; + const { act, data } = useBackend(context); + const { + compactMode, + lockable, + categories = [], + } = data; + const [ + searchText, + setSearchText, + ] = useLocalState(context, 'searchText', ''); + const [ + selectedCategory, + setSelectedCategory, + ] = useLocalState(context, 'category', categories[0]?.name); + const testSearch = createSearch(searchText, item => { + return item.name + item.desc; + }); + const items = searchText.length > 0 + // Flatten all categories and apply search to it + && categories + .flatMap(category => category.items || []) + .filter(testSearch) + .filter((item, i) => i < MAX_SEARCH_RESULTS) + // Select a category and show all items in it + || categories + .find(category => category.name === selectedCategory) + ?.items + // If none of that results in a list, return an empty list + || []; + return ( +
0 ? 'good' : 'bad'}> + {formatMoney(currencyAmount)} {currencySymbol} + + )} + buttons={( + <> + Search + setSearchText(value)} + mx={1} /> +
+ ); +}; + +const ItemList = (props, context) => { + const { + compactMode, + currencyAmount, + currencySymbol, + } = props; + const { act } = useBackend(context); + const [ + hoveredItem, + setHoveredItem, + ] = useLocalState(context, 'hoveredItem', {}); + const hoveredCost = hoveredItem && hoveredItem.cost || 0; + // Append extra hover data to items + const items = props.items.map(item => { + const notSameItem = hoveredItem && hoveredItem.name !== item.name; + const notEnoughHovered = currencyAmount - hoveredCost < item.cost; + const disabledDueToHovered = notSameItem && notEnoughHovered; + const disabled = currencyAmount < item.cost || disabledDueToHovered; + return { + ...item, + disabled, + }; + }); + if (compactMode) { + return ( + + {items.map(item => ( + + + {decodeHtmlEntities(item.name)} + + +
+ ); + } + return items.map(item => ( +
setHoveredItem(item)} + onmouseout={() => setHoveredItem({})} + onClick={() => act('buy', { + name: item.name, + })} /> + )}> + {decodeHtmlEntities(item.desc)} +
+ )); +}; diff --git a/tgui/public/tgui.bundle.js b/tgui/public/tgui.bundle.js index 5eb85738754..58067ed95a0 100644 --- a/tgui/public/tgui.bundle.js +++ b/tgui/public/tgui.bundle.js @@ -1 +1 @@ -!function(){var e={92179:function(e,t,n){"use strict";t.__esModule=!0,t.popperGenerator=v,t.createPopper=void 0;var r=d(n(30505)),o=d(n(43545)),i=d(n(46213)),a=d(n(32440)),u=(d(n(61131)),d(n(45700))),c=d(n(68369)),s=(d(n(38574)),d(n(25435)),d(n(22709)),d(n(36284))),l=d(n(19574));t.detectOverflow=l["default"];var f=n(67458);n(56728);function d(e){return e&&e.__esModule?e:{"default":e}}var p={placement:"bottom",modifiers:[],strategy:"absolute"};function h(){for(var e=arguments.length,t=new Array(e),n=0;n=0&&(0,l.isHTMLElement)(e)?(0,u["default"])(e):e;if(!(0,l.isElement)(n))return[];return t.filter((function(e){return(0,l.isElement)(e)&&(0,p["default"])(e,n)&&"body"!==(0,h["default"])(e)}))}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],c=o.reduce((function(t,n){var r=y(e,n);return t.top=(0,m.max)(r.top,t.top),t.right=(0,m.min)(r.right,t.right),t.bottom=(0,m.min)(r.bottom,t.bottom),t.left=(0,m.max)(r.left,t.left),t}),y(e,i));return c.width=c.right-c.left,c.height=c.bottom-c.top,c.x=c.left,c.y=c.top,c};var r=n(56728),o=g(n(78331)),i=g(n(68692)),a=g(n(46213)),u=g(n(32440)),c=g(n(58386)),s=g(n(61131)),l=n(67458),f=g(n(94294)),d=g(n(31613)),p=g(n(97607)),h=g(n(99624)),v=g(n(20935)),m=n(62836);function g(e){return e&&e.__esModule?e:{"default":e}}function y(e,t){return t===r.viewport?(0,v["default"])((0,o["default"])(e)):(0,l.isHTMLElement)(t)?function(e){var t=(0,f["default"])(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,v["default"])((0,i["default"])((0,c["default"])(e)))}},30505:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){void 0===n&&(n=!1);var l=(0,a.isHTMLElement)(t),f=(0,a.isHTMLElement)(t)&&function(e){var t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,r=t.height/e.offsetHeight||1;return 1!==n||1!==r}(t),d=(0,c["default"])(t),p=(0,r["default"])(e,f),h={scrollLeft:0,scrollTop:0},v={x:0,y:0};(l||!l&&!n)&&(("body"!==(0,i["default"])(t)||(0,s["default"])(d))&&(h=(0,o["default"])(t)),(0,a.isHTMLElement)(t)?((v=(0,r["default"])(t,!0)).x+=t.clientLeft,v.y+=t.clientTop):d&&(v.x=(0,u["default"])(d)));return{x:p.left+h.scrollLeft-v.x,y:p.top+h.scrollTop-v.y,width:p.width,height:p.height}};var r=l(n(94294)),o=l(n(71942)),i=l(n(99624)),a=n(67458),u=l(n(45471)),c=l(n(58386)),s=l(n(37229));function l(e){return e&&e.__esModule?e:{"default":e}}},61131:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,o["default"])(e).getComputedStyle(e)};var r,o=(r=n(31677))&&r.__esModule?r:{"default":r}},58386:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(((0,r.isElement)(e)?e.ownerDocument:e.document)||window.document).documentElement};var r=n(67458)},68692:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=(0,r["default"])(e),c=(0,a["default"])(e),s=null==(t=e.ownerDocument)?void 0:t.body,l=(0,u.max)(n.scrollWidth,n.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),f=(0,u.max)(n.scrollHeight,n.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),d=-c.scrollLeft+(0,i["default"])(e),p=-c.scrollTop;"rtl"===(0,o["default"])(s||n).direction&&(d+=(0,u.max)(n.clientWidth,s?s.clientWidth:0)-l);return{width:l,height:f,x:d,y:p}};var r=c(n(58386)),o=c(n(61131)),i=c(n(45471)),a=c(n(1255)),u=n(62836);function c(e){return e&&e.__esModule?e:{"default":e}}},50552:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},43545:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=e.offsetWidth,r=e.offsetHeight;Math.abs(t.width-n)<=1&&(n=t.width);Math.abs(t.height-r)<=1&&(r=t.height);return{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}};var r,o=(r=n(94294))&&r.__esModule?r:{"default":r}},99624:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e?(e.nodeName||"").toLowerCase():null}},71942:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return e!==(0,o["default"])(e)&&(0,i.isHTMLElement)(e)?(0,a["default"])(e):(0,r["default"])(e)};var r=u(n(1255)),o=u(n(31677)),i=n(67458),a=u(n(50552));function u(e){return e&&e.__esModule?e:{"default":e}}},32440:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=l(e);for(;n&&(0,u["default"])(n)&&"static"===(0,i["default"])(n).position;)n=l(n);if(n&&("html"===(0,o["default"])(n)||"body"===(0,o["default"])(n)&&"static"===(0,i["default"])(n).position))return t;return n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&(0,a.isHTMLElement)(e)){if("fixed"===(0,i["default"])(e).position)return null}var n=(0,c["default"])(e);for(;(0,a.isHTMLElement)(n)&&["html","body"].indexOf((0,o["default"])(n))<0;){var r=(0,i["default"])(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t};var r=s(n(31677)),o=s(n(99624)),i=s(n(61131)),a=n(67458),u=s(n(79130)),c=s(n(31613));function s(e){return e&&e.__esModule?e:{"default":e}}function l(e){return(0,a.isHTMLElement)(e)&&"fixed"!==(0,i["default"])(e).position?e.offsetParent:null}},31613:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){if("html"===(0,r["default"])(e))return e;return e.assignedSlot||e.parentNode||((0,i.isShadowRoot)(e)?e.host:null)||(0,o["default"])(e)};var r=a(n(99624)),o=a(n(58386)),i=n(67458);function a(e){return e&&e.__esModule?e:{"default":e}}},66055:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function c(e){if(["html","body","#document"].indexOf((0,i["default"])(e))>=0)return e.ownerDocument.body;if((0,a.isHTMLElement)(e)&&(0,o["default"])(e))return e;return c((0,r["default"])(e))};var r=u(n(31613)),o=u(n(37229)),i=u(n(99624)),a=n(67458);function u(e){return e&&e.__esModule?e:{"default":e}}},78331:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,r["default"])(e),n=(0,o["default"])(e),a=t.visualViewport,u=n.clientWidth,c=n.clientHeight,s=0,l=0;a&&(u=a.width,c=a.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=a.offsetLeft,l=a.offsetTop));return{width:u,height:c,x:s+(0,i["default"])(e),y:l}};var r=a(n(31677)),o=a(n(58386)),i=a(n(45471));function a(e){return e&&e.__esModule?e:{"default":e}}},31677:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}},1255:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}};var r,o=(r=n(31677))&&r.__esModule?r:{"default":r}},45471:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return(0,r["default"])((0,o["default"])(e)).left+(0,i["default"])(e).scrollLeft};var r=a(n(94294)),o=a(n(58386)),i=a(n(1255));function a(e){return e&&e.__esModule?e:{"default":e}}},67458:function(e,t,n){"use strict";t.__esModule=!0,t.isElement=function(e){var t=(0,o["default"])(e).Element;return e instanceof t||e instanceof Element},t.isHTMLElement=function(e){var t=(0,o["default"])(e).HTMLElement;return e instanceof t||e instanceof HTMLElement},t.isShadowRoot=function(e){if("undefined"==typeof ShadowRoot)return!1;var t=(0,o["default"])(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot};var r,o=(r=n(31677))&&r.__esModule?r:{"default":r}},37229:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=(0,o["default"])(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)};var r,o=(r=n(61131))&&r.__esModule?r:{"default":r}},79130:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return["table","td","th"].indexOf((0,o["default"])(e))>=0};var r,o=(r=n(99624))&&r.__esModule?r:{"default":r}},46213:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function c(e,t){var n;void 0===t&&(t=[]);var u=(0,r["default"])(e),s=u===(null==(n=e.ownerDocument)?void 0:n.body),l=(0,i["default"])(u),f=s?[l].concat(l.visualViewport||[],(0,a["default"])(u)?u:[]):u,d=t.concat(f);return s?d:d.concat(c((0,o["default"])(f)))};var r=u(n(66055)),o=u(n(31613)),i=u(n(31677)),a=u(n(37229));function u(e){return e&&e.__esModule?e:{"default":e}}},56728:function(e,t){"use strict";t.__esModule=!0,t.modifierPhases=t.afterWrite=t.write=t.beforeWrite=t.afterMain=t.main=t.beforeMain=t.afterRead=t.read=t.beforeRead=t.placements=t.variationPlacements=t.reference=t.popper=t.viewport=t.clippingParents=t.end=t.start=t.basePlacements=t.auto=t.left=t.right=t.bottom=t.top=void 0;t.top="top";var n="bottom";t.bottom=n;var r="right";t.right=r;var o="left";t.left=o;var i="auto";t.auto=i;var a=["top",n,r,o];t.basePlacements=a;var u="start";t.start=u;var c="end";t.end=c;t.clippingParents="clippingParents";t.viewport="viewport";t.popper="popper";t.reference="reference";var s=a.reduce((function(e,t){return e.concat([t+"-"+u,t+"-"+c])}),[]);t.variationPlacements=s;var l=[].concat(a,[i]).reduce((function(e,t){return e.concat([t,t+"-"+u,t+"-"+c])}),[]);t.placements=l;var f="beforeRead";t.beforeRead=f;var d="read";t.read=d;var p="afterRead";t.afterRead=p;var h="beforeMain";t.beforeMain=h;var v="main";t.main=v;var m="afterMain";t.afterMain=m;var g="beforeWrite";t.beforeWrite=g;var y="write";t.write=y;var b="afterWrite";t.afterWrite=b;var _=[f,d,p,h,v,m,g,y,b];t.modifierPhases=_},34739:function(e,t,n){"use strict";t.__esModule=!0;var r={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};t.createPopperLite=t.createPopper=t.createPopperBase=t.detectOverflow=t.popperGenerator=void 0;var o=n(56728);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===o[e]||(t[e]=o[e]))}));var i=n(18726);Object.keys(i).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===i[e]||(t[e]=i[e]))}));var a=n(92179);t.popperGenerator=a.popperGenerator,t.detectOverflow=a.detectOverflow,t.createPopperBase=a.createPopper;var u=n(48069);t.createPopper=u.createPopper;var c=n(39030);t.createPopperLite=c.createPopper},34559:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=(r=n(99624))&&r.__esModule?r:{"default":r},i=n(67458);var a={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},a=t.elements[e];(0,i.isHTMLElement)(a)&&(0,o["default"])(a)&&(Object.assign(a.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?a.removeAttribute(e):a.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],a=t.attributes[e]||{},u=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});(0,i.isHTMLElement)(r)&&(0,o["default"])(r)&&(Object.assign(r.style,u),Object.keys(a).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]};t["default"]=a},76340:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r=d(n(22709)),o=d(n(43545)),i=d(n(97607)),a=d(n(32440)),u=d(n(16615)),c=d(n(52534)),s=d(n(32055)),l=d(n(76294)),f=n(56728);n(67458);function d(e){return e&&e.__esModule?e:{"default":e}}var p=function(e,t){return e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e,(0,s["default"])("number"!=typeof e?e:(0,l["default"])(e,f.basePlacements))};var h={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,i=e.name,s=e.options,l=n.elements.arrow,d=n.modifiersData.popperOffsets,h=(0,r["default"])(n.placement),v=(0,u["default"])(h),m=[f.left,f.right].indexOf(h)>=0?"height":"width";if(l&&d){var g=p(s.padding,n),y=(0,o["default"])(l),b="y"===v?f.top:f.left,_="y"===v?f.bottom:f.right,w=n.rects.reference[m]+n.rects.reference[v]-d[v]-n.rects.popper[m],x=d[v]-n.rects.reference[v],E=(0,a["default"])(l),C=E?"y"===v?E.clientHeight||0:E.clientWidth||0:0,N=w/2-x/2,S=g[b],O=C-y[m]-g[_],k=C/2-y[m]/2+N,M=(0,c["default"])(S,k,O),I=v;n.modifiersData[i]=((t={})[I]=M,t.centerOffset=M-k,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&(0,i["default"])(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};t["default"]=h},11300:function(e,t,n){"use strict";t.__esModule=!0,t.mapToStyles=d,t["default"]=void 0;var r=n(56728),o=l(n(32440)),i=l(n(31677)),a=l(n(58386)),u=l(n(61131)),c=l(n(22709)),s=n(62836);function l(e){return e&&e.__esModule?e:{"default":e}}var f={top:"auto",right:"auto",bottom:"auto",left:"auto"};function d(e){var t,n=e.popper,c=e.popperRect,l=e.placement,d=e.offsets,p=e.position,h=e.gpuAcceleration,v=e.adaptive,m=e.roundOffsets,g=!0===m?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:(0,s.round)((0,s.round)(t*r)/r)||0,y:(0,s.round)((0,s.round)(n*r)/r)||0}}(d):"function"==typeof m?m(d):d,y=g.x,b=void 0===y?0:y,_=g.y,w=void 0===_?0:_,x=d.hasOwnProperty("x"),E=d.hasOwnProperty("y"),C=r.left,N=r.top,S=window;if(v){var O=(0,o["default"])(n),k="clientHeight",M="clientWidth";O===(0,i["default"])(n)&&(O=(0,a["default"])(n),"static"!==(0,u["default"])(O).position&&(k="scrollHeight",M="scrollWidth")),O=O,l===r.top&&(N=r.bottom,w-=O[k]-c.height,w*=h?1:-1),l===r.left&&(C=r.right,b-=O[M]-c.width,b*=h?1:-1)}var I,V=Object.assign({position:p},v&&f);return h?Object.assign({},V,((I={})[N]=E?"0":"",I[C]=x?"0":"",I.transform=(S.devicePixelRatio||1)<2?"translate("+b+"px, "+w+"px)":"translate3d("+b+"px, "+w+"px, 0)",I)):Object.assign({},V,((t={})[N]=E?w+"px":"",t[C]=x?b+"px":"",t.transform="",t))}var p={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,a=void 0===i||i,u=n.roundOffsets,s=void 0===u||u,l={placement:(0,c["default"])(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,d(Object.assign({},l,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:s})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,d(Object.assign({},l,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:s})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};t["default"]=p},27020:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=(r=n(31677))&&r.__esModule?r:{"default":r};var i={passive:!0};var a={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,a=r.scroll,u=void 0===a||a,c=r.resize,s=void 0===c||c,l=(0,o["default"])(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return u&&f.forEach((function(e){e.addEventListener("scroll",n.update,i)})),s&&l.addEventListener("resize",n.update,i),function(){u&&f.forEach((function(e){e.removeEventListener("scroll",n.update,i)})),s&&l.removeEventListener("resize",n.update,i)}},data:{}};t["default"]=a},45922:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r=l(n(70045)),o=l(n(22709)),i=l(n(28916)),a=l(n(19574)),u=l(n(31565)),c=n(56728),s=l(n(45412));function l(e){return e&&e.__esModule?e:{"default":e}}var f={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,l=e.name;if(!t.modifiersData[l]._skip){for(var f=n.mainAxis,d=void 0===f||f,p=n.altAxis,h=void 0===p||p,v=n.fallbackPlacements,m=n.padding,g=n.boundary,y=n.rootBoundary,b=n.altBoundary,_=n.flipVariations,w=void 0===_||_,x=n.allowedAutoPlacements,E=t.options.placement,C=(0,o["default"])(E),N=v||(C===E||!w?[(0,r["default"])(E)]:function(e){if((0,o["default"])(e)===c.auto)return[];var t=(0,r["default"])(e);return[(0,i["default"])(e),t,(0,i["default"])(t)]}(E)),S=[E].concat(N).reduce((function(e,n){return e.concat((0,o["default"])(n)===c.auto?(0,u["default"])(t,{placement:n,boundary:g,rootBoundary:y,padding:m,flipVariations:w,allowedAutoPlacements:x}):n)}),[]),O=t.rects.reference,k=t.rects.popper,M=new Map,I=!0,V=S[0],T=0;T=0,B=j?"width":"height",R=(0,a["default"])(t,{placement:A,boundary:g,rootBoundary:y,altBoundary:b,padding:m}),D=j?L?c.right:c.left:L?c.bottom:c.top;O[B]>k[B]&&(D=(0,r["default"])(D));var F=(0,r["default"])(D),K=[];if(d&&K.push(R[P]<=0),h&&K.push(R[D]<=0,R[F]<=0),K.every((function(e){return e}))){V=A,I=!1;break}M.set(A,K)}if(I)for(var Y=function(e){var t=S.find((function(t){var n=M.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return V=t,"break"},z=w?3:1;z>0;z--){if("break"===Y(z))break}t.placement!==V&&(t.modifiersData[l]._skip=!0,t.placement=V,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};t["default"]=f},82860:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=n(56728),i=(r=n(19574))&&r.__esModule?r:{"default":r};function a(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function u(e){return[o.top,o.right,o.bottom,o.left].some((function(t){return e[t]>=0}))}var c={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,c=t.modifiersData.preventOverflow,s=(0,i["default"])(t,{elementContext:"reference"}),l=(0,i["default"])(t,{altBoundary:!0}),f=a(s,r),d=a(l,o,c),p=u(f),h=u(d);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:d,isReferenceHidden:p,hasPopperEscaped:h},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":h})}};t["default"]=c},18726:function(e,t,n){"use strict";t.__esModule=!0,t.preventOverflow=t.popperOffsets=t.offset=t.hide=t.flip=t.eventListeners=t.computeStyles=t.arrow=t.applyStyles=void 0;var r=d(n(34559));t.applyStyles=r["default"];var o=d(n(76340));t.arrow=o["default"];var i=d(n(11300));t.computeStyles=i["default"];var a=d(n(27020));t.eventListeners=a["default"];var u=d(n(45922));t.flip=u["default"];var c=d(n(82860));t.hide=c["default"];var s=d(n(33310));t.offset=s["default"];var l=d(n(74371));t.popperOffsets=l["default"];var f=d(n(21532));function d(e){return e&&e.__esModule?e:{"default":e}}t.preventOverflow=f["default"]},33310:function(e,t,n){"use strict";t.__esModule=!0,t.distanceAndSkiddingToXY=a,t["default"]=void 0;var r,o=(r=n(22709))&&r.__esModule?r:{"default":r},i=n(56728);function a(e,t,n){var r=(0,o["default"])(e),a=[i.left,i.top].indexOf(r)>=0?-1:1,u="function"==typeof n?n(Object.assign({},t,{placement:e})):n,c=u[0],s=u[1];return c=c||0,s=(s||0)*a,[i.left,i.right].indexOf(r)>=0?{x:s,y:c}:{x:c,y:s}}var u={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,u=void 0===o?[0,0]:o,c=i.placements.reduce((function(e,n){return e[n]=a(n,t.rects,u),e}),{}),s=c[t.placement],l=s.x,f=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=f),t.modifiersData[r]=c}};t["default"]=u},74371:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r,o=(r=n(17175))&&r.__esModule?r:{"default":r};var i={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=(0,o["default"])({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};t["default"]=i},21532:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=void 0;var r=n(56728),o=h(n(22709)),i=h(n(16615)),a=h(n(82898)),u=h(n(52534)),c=h(n(43545)),s=h(n(32440)),l=h(n(19574)),f=h(n(45412)),d=h(n(41801)),p=n(62836);function h(e){return e&&e.__esModule?e:{"default":e}}var v={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,h=e.name,v=n.mainAxis,m=void 0===v||v,g=n.altAxis,y=void 0!==g&&g,b=n.boundary,_=n.rootBoundary,w=n.altBoundary,x=n.padding,E=n.tether,C=void 0===E||E,N=n.tetherOffset,S=void 0===N?0:N,O=(0,l["default"])(t,{boundary:b,rootBoundary:_,padding:x,altBoundary:w}),k=(0,o["default"])(t.placement),M=(0,f["default"])(t.placement),I=!M,V=(0,i["default"])(k),T=(0,a["default"])(V),A=t.modifiersData.popperOffsets,P=t.rects.reference,L=t.rects.popper,j="function"==typeof S?S(Object.assign({},t.rects,{placement:t.placement})):S,B={x:0,y:0};if(A){if(m||y){var R="y"===V?r.top:r.left,D="y"===V?r.bottom:r.right,F="y"===V?"height":"width",K=A[V],Y=A[V]+O[R],z=A[V]-O[D],U=C?-L[F]/2:0,W=M===r.start?P[F]:L[F],H=M===r.start?-L[F]:-P[F],$=t.elements.arrow,G=C&&$?(0,c["default"])($):{width:0,height:0},q=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:(0,d["default"])(),X=q[R],Q=q[D],J=(0,u["default"])(0,P[F],G[F]),Z=I?P[F]/2-U-J-X-j:W-J-X-j,ee=I?-P[F]/2+U+J+Q+j:H+J+Q+j,te=t.elements.arrow&&(0,s["default"])(t.elements.arrow),ne=te?"y"===V?te.clientTop||0:te.clientLeft||0:0,re=t.modifiersData.offset?t.modifiersData.offset[t.placement][V]:0,oe=A[V]+Z-re-ne,ie=A[V]+ee-re;if(m){var ae=(0,u["default"])(C?(0,p.min)(Y,oe):Y,K,C?(0,p.max)(z,ie):z);A[V]=ae,B[V]=ae-K}if(y){var ue="x"===V?r.top:r.left,ce="x"===V?r.bottom:r.right,se=A[T],le=se+O[ue],fe=se-O[ce],de=(0,u["default"])(C?(0,p.min)(le,oe):le,se,C?(0,p.max)(fe,ie):fe);A[T]=de,B[T]=de-se}}t.modifiersData[h]=B}},requiresIfExists:["offset"]};t["default"]=v},39030:function(e,t,n){"use strict";t.__esModule=!0,t.defaultModifiers=t.createPopper=void 0;var r=n(92179);t.popperGenerator=r.popperGenerator,t.detectOverflow=r.detectOverflow;var o=c(n(27020)),i=c(n(74371)),a=c(n(11300)),u=c(n(34559));function c(e){return e&&e.__esModule?e:{"default":e}}var s=[o["default"],i["default"],a["default"],u["default"]];t.defaultModifiers=s;var l=(0,r.popperGenerator)({defaultModifiers:s});t.createPopper=l},48069:function(e,t,n){"use strict";t.__esModule=!0;var r={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};t.defaultModifiers=t.createPopperLite=t.createPopper=void 0;var o=n(92179);t.popperGenerator=o.popperGenerator,t.detectOverflow=o.detectOverflow;var i=m(n(27020)),a=m(n(74371)),u=m(n(11300)),c=m(n(34559)),s=m(n(33310)),l=m(n(45922)),f=m(n(21532)),d=m(n(76340)),p=m(n(82860)),h=n(39030);t.createPopperLite=h.createPopper;var v=n(18726);function m(e){return e&&e.__esModule?e:{"default":e}}Object.keys(v).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===v[e]||(t[e]=v[e]))}));var g=[i["default"],a["default"],u["default"],c["default"],s["default"],l["default"],f["default"],d["default"],p["default"]];t.defaultModifiers=g;var y=(0,o.popperGenerator)({defaultModifiers:g});t.createPopperLite=t.createPopper=y},31565:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,u=n.placement,c=n.boundary,s=n.rootBoundary,l=n.padding,f=n.flipVariations,d=n.allowedAutoPlacements,p=void 0===d?o.placements:d,h=(0,r["default"])(u),v=h?f?o.variationPlacements:o.variationPlacements.filter((function(e){return(0,r["default"])(e)===h})):o.basePlacements,m=v.filter((function(e){return p.indexOf(e)>=0}));0===m.length&&(m=v);var g=m.reduce((function(t,n){return t[n]=(0,i["default"])(e,{placement:n,boundary:c,rootBoundary:s,padding:l})[(0,a["default"])(n)],t}),{});return Object.keys(g).sort((function(e,t){return g[e]-g[t]}))};var r=u(n(45412)),o=n(56728),i=u(n(19574)),a=u(n(22709));function u(e){return e&&e.__esModule?e:{"default":e}}},17175:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t,n=e.reference,u=e.element,c=e.placement,s=c?(0,r["default"])(c):null,l=c?(0,o["default"])(c):null,f=n.x+n.width/2-u.width/2,d=n.y+n.height/2-u.height/2;switch(s){case a.top:t={x:f,y:n.y-u.height};break;case a.bottom:t={x:f,y:n.y+n.height};break;case a.right:t={x:n.x+n.width,y:d};break;case a.left:t={x:n.x-u.width,y:d};break;default:t={x:n.x,y:n.y}}var p=s?(0,i["default"])(s):null;if(null!=p){var h="y"===p?"height":"width";switch(l){case a.start:t[p]=t[p]-(n[h]/2-u[h]/2);break;case a.end:t[p]=t[p]+(n[h]/2-u[h]/2)}}return t};var r=u(n(22709)),o=u(n(45412)),i=u(n(16615)),a=n(56728);function u(e){return e&&e.__esModule?e:{"default":e}}},68369:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=undefined,n(e())}))}))),t}}},19574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t){void 0===t&&(t={});var n=t,d=n.placement,p=void 0===d?e.placement:d,h=n.boundary,v=void 0===h?c.clippingParents:h,m=n.rootBoundary,g=void 0===m?c.viewport:m,y=n.elementContext,b=void 0===y?c.popper:y,_=n.altBoundary,w=void 0!==_&&_,x=n.padding,E=void 0===x?0:x,C=(0,l["default"])("number"!=typeof E?E:(0,f["default"])(E,c.basePlacements)),N=b===c.popper?c.reference:c.popper,S=e.elements.reference,O=e.rects.popper,k=e.elements[w?N:b],M=(0,o["default"])((0,s.isElement)(k)?k:k.contextElement||(0,i["default"])(e.elements.popper),v,g),I=(0,r["default"])(S),V=(0,a["default"])({reference:I,element:O,strategy:"absolute",placement:p}),T=(0,u["default"])(Object.assign({},O,V)),A=b===c.popper?T:I,P={top:M.top-A.top+C.top,bottom:A.bottom-M.bottom+C.bottom,left:M.left-A.left+C.left,right:A.right-M.right+C.right},L=e.modifiersData.offset;if(b===c.popper&&L){var j=L[p];Object.keys(P).forEach((function(e){var t=[c.right,c.bottom].indexOf(e)>=0?1:-1,n=[c.top,c.bottom].indexOf(e)>=0?"y":"x";P[e]+=j[n]*t}))}return P};var r=d(n(94294)),o=d(n(48162)),i=d(n(58386)),a=d(n(17175)),u=d(n(20935)),c=n(56728),s=n(67458),l=d(n(32055)),f=d(n(76294));function d(e){return e&&e.__esModule?e:{"default":e}}},76294:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}},41434:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=0?"x":"y"}},70045:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/left|right|bottom|top/g,(function(e){return n[e]}))};var n={left:"right",right:"left",bottom:"top",top:"bottom"}},28916:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.replace(/start|end/g,(function(e){return n[e]}))};var n={start:"end",end:"start"}},45412:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return e.split("-")[1]}},62836:function(e,t){"use strict";t.__esModule=!0,t.round=t.min=t.max=void 0;var n=Math.max;t.max=n;var r=Math.min;t.min=r;var o=Math.round;t.round=o},36284:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}},32055:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},(0,o["default"])(),e)};var r,o=(r=n(41801))&&r.__esModule?r:{"default":r}},45700:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){var t=function(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}(e);return r.modifierPhases.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])};var r=n(56728)},20935:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},25435:function(e,t){"use strict";t.__esModule=!0,t["default"]=function(e,t){var n=new Set;return e.filter((function(e){var r=t(e);if(!n.has(r))return n.add(r),!0}))}},38574:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e){e.forEach((function(t){Object.keys(t).forEach((function(n){switch(n){case"name":t.name;break;case"enabled":t.enabled;case"phase":o.modifierPhases.indexOf(t.phase);break;case"fn":t.fn;break;case"effect":t.effect;break;case"requires":Array.isArray(t.requires);break;case"requiresIfExists":Array.isArray(t.requiresIfExists)}t.requires&&t.requires.forEach((function(t){e.find((function(e){return e.name===t}))}))}))}))};(r=n(41434))&&r.__esModule;var r,o=n(56728)},52534:function(e,t,n){"use strict";t.__esModule=!0,t["default"]=function(e,t,n){return(0,r.max)(e,(0,r.min)(t,n))};var r=n(62836)},83923:function(e){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},1372:function(e,t,n){"use strict";var r=n(35611);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},36910:function(e,t,n){"use strict";var r=n(17657),o=n(83681),i=n(74217),a=r("unscopables"),u=Array.prototype;u[a]==undefined&&i.f(u,a,{configurable:!0,value:o(null)}),e.exports=function(e){u[a][e]=!0}},69953:function(e,t,n){"use strict";var r=n(37015).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},50997:function(e){"use strict";e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},63518:function(e,t,n){"use strict";var r=n(35611);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},32977:function(e){"use strict";e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},19216:function(e,t,n){"use strict";var r,o,i,a=n(32977),u=n(75592),c=n(84253),s=n(35611),l=n(28919),f=n(47953),d=n(52188),p=n(11807),h=n(74217).f,v=n(6863),m=n(18444),g=n(17657),y=n(41080),b=c.Int8Array,_=b&&b.prototype,w=c.Uint8ClampedArray,x=w&&w.prototype,E=b&&v(b),C=_&&v(_),N=Object.prototype,S=N.isPrototypeOf,O=g("toStringTag"),k=y("TYPED_ARRAY_TAG"),M=y("TYPED_ARRAY_CONSTRUCTOR"),I=a&&!!m&&"Opera"!==f(c.opera),V=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},A={BigInt64Array:8,BigUint64Array:8},P=function(e){if(!s(e))return!1;var t=f(e);return"DataView"===t||l(T,t)||l(A,t)},L=function(e){if(!s(e))return!1;var t=f(e);return l(T,t)||l(A,t)};for(r in T)(i=(o=c[r])&&o.prototype)?d(i,M,o):I=!1;for(r in A)(i=(o=c[r])&&o.prototype)&&d(i,M,o);if((!I||"function"!=typeof E||E===Function.prototype)&&(E=function(){throw TypeError("Incorrect invocation")},I))for(r in T)c[r]&&m(c[r],E);if((!I||!C||C===N)&&(C=E.prototype,I))for(r in T)c[r]&&m(c[r].prototype,C);if(I&&v(x)!==C&&m(x,C),u&&!l(C,O))for(r in V=!0,h(C,O,{get:function(){return s(this)?this[k]:undefined}}),T)c[r]&&d(c[r],k,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:I,TYPED_ARRAY_CONSTRUCTOR:M,TYPED_ARRAY_TAG:V&&k,aTypedArray:function(e){if(L(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(m&&!S.call(E,e))throw TypeError("Target is not a typed array constructor");return e},exportTypedArrayMethod:function(e,t,n){if(u){if(n)for(var r in T){var o=c[r];if(o&&l(o.prototype,e))try{delete o.prototype[e]}catch(i){}}C[e]&&!n||p(C,e,n?t:I&&_[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,o;if(u){if(m){if(n)for(r in T)if((o=c[r])&&l(o,e))try{delete o[e]}catch(i){}if(E[e]&&!n)return;try{return p(E,e,n?t:I&&E[e]||t)}catch(i){}}for(r in T)!(o=c[r])||o[e]&&!n||p(o,e,t)}},isView:P,isTypedArray:L,TypedArray:E,TypedArrayPrototype:C}},80246:function(e,t,n){"use strict";var r=n(84253),o=n(75592),i=n(32977),a=n(52188),u=n(3993),c=n(69691),s=n(50997),l=n(3997),f=n(39570),d=n(77559),p=n(16567),h=n(6863),v=n(18444),m=n(78870).f,g=n(74217).f,y=n(22051),b=n(29108),_=n(79947),w=_.get,x=_.set,E="ArrayBuffer",C="DataView",N="Wrong index",S=r.ArrayBuffer,O=S,k=r.DataView,M=k&&k.prototype,I=Object.prototype,V=r.RangeError,T=p.pack,A=p.unpack,P=function(e){return[255&e]},L=function(e){return[255&e,e>>8&255]},j=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},B=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},R=function(e){return T(e,23,4)},D=function(e){return T(e,52,8)},F=function(e,t){g(e.prototype,t,{get:function(){return w(this)[t]}})},K=function(e,t,n,r){var o=d(n),i=w(e);if(o+t>i.byteLength)throw V(N);var a=w(i.buffer).bytes,u=o+i.byteOffset,c=a.slice(u,u+t);return r?c:c.reverse()},Y=function(e,t,n,r,o,i){var a=d(n),u=w(e);if(a+t>u.byteLength)throw V(N);for(var c=w(u.buffer).bytes,s=a+u.byteOffset,l=r(+o),f=0;fH;)(z=W[H++])in O||a(O,z,S[z]);U.constructor=O}v&&h(M)!==I&&v(M,I);var $=new k(new O(2)),G=M.setInt8;$.setInt8(0,2147483648),$.setInt8(1,2147483649),!$.getInt8(0)&&$.getInt8(1)||u(M,{setInt8:function(e,t){G.call(this,e,t<<24>>24)},setUint8:function(e,t){G.call(this,e,t<<24>>24)}},{unsafe:!0})}else O=function(e){s(this,O,E);var t=d(e);x(this,{bytes:y.call(new Array(t),0),byteLength:t}),o||(this.byteLength=t)},k=function(e,t,n){s(this,k,C),s(e,O,C);var r=w(e).byteLength,i=l(t);if(i<0||i>r)throw V("Wrong offset");if(i+(n=n===undefined?r-i:f(n))>r)throw V("Wrong length");x(this,{buffer:e,byteLength:n,byteOffset:i}),o||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},o&&(F(O,"byteLength"),F(k,"buffer"),F(k,"byteLength"),F(k,"byteOffset")),u(k.prototype,{getInt8:function(e){return K(this,1,e)[0]<<24>>24},getUint8:function(e){return K(this,1,e)[0]},getInt16:function(e){var t=K(this,2,e,arguments.length>1?arguments[1]:undefined);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=K(this,2,e,arguments.length>1?arguments[1]:undefined);return t[1]<<8|t[0]},getInt32:function(e){return B(K(this,4,e,arguments.length>1?arguments[1]:undefined))},getUint32:function(e){return B(K(this,4,e,arguments.length>1?arguments[1]:undefined))>>>0},getFloat32:function(e){return A(K(this,4,e,arguments.length>1?arguments[1]:undefined),23)},getFloat64:function(e){return A(K(this,8,e,arguments.length>1?arguments[1]:undefined),52)},setInt8:function(e,t){Y(this,1,e,P,t)},setUint8:function(e,t){Y(this,1,e,P,t)},setInt16:function(e,t){Y(this,2,e,L,t,arguments.length>2?arguments[2]:undefined)},setUint16:function(e,t){Y(this,2,e,L,t,arguments.length>2?arguments[2]:undefined)},setInt32:function(e,t){Y(this,4,e,j,t,arguments.length>2?arguments[2]:undefined)},setUint32:function(e,t){Y(this,4,e,j,t,arguments.length>2?arguments[2]:undefined)},setFloat32:function(e,t){Y(this,4,e,R,t,arguments.length>2?arguments[2]:undefined)},setFloat64:function(e,t){Y(this,8,e,D,t,arguments.length>2?arguments[2]:undefined)}});b(O,E),b(k,C),e.exports={ArrayBuffer:O,DataView:k}},59571:function(e,t,n){"use strict";var r=n(12104),o=n(55205),i=n(39570),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),u=i(n.length),c=o(e,u),s=o(t,u),l=arguments.length>2?arguments[2]:undefined,f=a((l===undefined?u:o(l,u))-s,u-c),d=1;for(s0;)s in n?n[c]=n[s]:delete n[c],c+=d,s+=d;return n}},22051:function(e,t,n){"use strict";var r=n(12104),o=n(55205),i=n(39570);e.exports=function(e){for(var t=r(this),n=i(t.length),a=arguments.length,u=o(a>1?arguments[1]:undefined,n),c=a>2?arguments[2]:undefined,s=c===undefined?n:o(c,n);s>u;)t[u++]=e;return t}},90369:function(e,t,n){"use strict";var r=n(69033).forEach,o=n(37902)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:undefined)}},11955:function(e){"use strict";e.exports=function(e,t){for(var n=0,r=t.length,o=new e(r);r>n;)o[n]=t[n++];return o}},28213:function(e,t,n){"use strict";var r=n(74271),o=n(12104),i=n(32648),a=n(14195),u=n(39570),c=n(39241),s=n(3170);e.exports=function(e){var t,n,l,f,d,p,h=o(e),v="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:undefined,y=g!==undefined,b=s(h),_=0;if(y&&(g=r(g,m>2?arguments[2]:undefined,2)),b==undefined||v==Array&&a(b))for(n=new v(t=u(h.length));t>_;_++)p=y?g(h[_],_):h[_],c(n,_,p);else for(d=(f=b.call(h)).next,n=new v;!(l=d.call(f)).done;_++)p=y?i(f,g,[l.value,_],!0):l.value,c(n,_,p);return n.length=_,n}},25945:function(e,t,n){"use strict";var r=n(26553),o=n(39570),i=n(55205),a=function(e){return function(t,n,a){var u,c=r(t),s=o(c.length),l=i(a,s);if(e&&n!=n){for(;s>l;)if((u=c[l++])!=u)return!0}else for(;s>l;l++)if((e||l in c)&&c[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},69033:function(e,t,n){"use strict";var r=n(74271),o=n(50990),i=n(12104),a=n(39570),u=n(77454),c=[].push,s=function(e){var t=1==e,n=2==e,s=3==e,l=4==e,f=6==e,d=7==e,p=5==e||f;return function(h,v,m,g){for(var y,b,_=i(h),w=o(_),x=r(v,m,3),E=a(w.length),C=0,N=g||u,S=t?N(h,E):n||d?N(h,0):undefined;E>C;C++)if((p||C in w)&&(b=x(y=w[C],C,_),e))if(t)S[C]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return C;case 2:c.call(S,y)}else switch(e){case 4:return!1;case 7:c.call(S,y)}return f?-1:s||l?l:S}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterReject:s(7)}},41183:function(e,t,n){"use strict";var r=n(26553),o=n(3997),i=n(39570),a=n(37902),u=Math.min,c=[].lastIndexOf,s=!!c&&1/[1].lastIndexOf(1,-0)<0,l=a("lastIndexOf"),f=s||!l;e.exports=f?function(e){if(s)return c.apply(this,arguments)||0;var t=r(this),n=i(t.length),a=n-1;for(arguments.length>1&&(a=u(a,o(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:c},93537:function(e,t,n){"use strict";var r=n(69691),o=n(17657),i=n(12338),a=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},37902:function(e,t,n){"use strict";var r=n(69691);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},28249:function(e,t,n){"use strict";var r=n(83923),o=n(12104),i=n(50990),a=n(39570),u=function(e){return function(t,n,u,c){r(n);var s=o(t),l=i(s),f=a(s.length),d=e?f-1:0,p=e?-1:1;if(u<2)for(;;){if(d in l){c=l[d],d+=p;break}if(d+=p,e?d<0:f<=d)throw TypeError("Reduce of empty array with no initial value")}for(;e?d>=0:f>d;d+=p)d in l&&(c=n(c,l[d],d,s));return c}};e.exports={left:u(!1),right:u(!0)}},58737:function(e){"use strict";var t=Math.floor,n=function(e,t){for(var n,r,o=e.length,i=1;i0;)e[r]=e[--r];r!==i++&&(e[r]=n)}return e},r=function(e,t,n){for(var r=e.length,o=t.length,i=0,a=0,u=[];i1?arguments[1]:undefined,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),i(l.prototype,n?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return m(this,0===e?0:e,t)}}:{add:function(e){return m(this,e=0===e?0:e,e)}}),f&&r(l.prototype,"size",{get:function(){return p(this).size}}),l},setStrong:function(e,t,n){var r=t+" Iterator",o=v(t),i=v(r);s(e,t,(function(e,t){h(this,{type:r,target:e,state:o(e),kind:t,last:undefined})}),(function(){for(var e=i(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=undefined,{value:undefined,done:!0})}),n?"entries":"values",!n,!0),l(t)}}},57396:function(e,t,n){"use strict";var r=n(3993),o=n(40421).getWeakData,i=n(63518),a=n(35611),u=n(50997),c=n(56342),s=n(69033),l=n(28919),f=n(79947),d=f.set,p=f.getterFor,h=s.find,v=s.findIndex,m=0,g=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},b=function(e,t){return h(e.entries,(function(e){return e[0]===t}))};y.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var n=b(this,e);n?n[1]=t:this.entries.push([e,t])},"delete":function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,s){var f=e((function(e,r){u(e,f,t),d(e,{type:t,id:m++,frozen:undefined}),r!=undefined&&c(r,e[s],{that:e,AS_ENTRIES:n})})),h=p(t),v=function(e,t,n){var r=h(e),a=o(i(t),!0);return!0===a?g(r).set(t,n):a[r.id]=n,e};return r(f.prototype,{"delete":function(e){var t=h(this);if(!a(e))return!1;var n=o(e);return!0===n?g(t)["delete"](e):n&&l(n,t.id)&&delete n[t.id]},has:function(e){var t=h(this);if(!a(e))return!1;var n=o(e);return!0===n?g(t).has(e):n&&l(n,t.id)}}),r(f.prototype,n?{get:function(e){var t=h(this);if(a(e)){var n=o(e);return!0===n?g(t).get(e):n?n[t.id]:undefined}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),f}}},42006:function(e,t,n){"use strict";var r=n(56174),o=n(84253),i=n(41441),a=n(11807),u=n(40421),c=n(56342),s=n(50997),l=n(35611),f=n(69691),d=n(68762),p=n(29108),h=n(22285);e.exports=function(e,t,n){var v=-1!==e.indexOf("Map"),m=-1!==e.indexOf("Weak"),g=v?"set":"add",y=o[e],b=y&&y.prototype,_=y,w={},x=function(e){var t=b[e];a(b,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(m&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return m&&!l(e)?undefined:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(m&&!l(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(i(e,"function"!=typeof y||!(m||b.forEach&&!f((function(){(new y).entries().next()})))))_=n.getConstructor(t,e,v,g),u.enable();else if(i(e,!0)){var E=new _,C=E[g](m?{}:-0,1)!=E,N=f((function(){E.has(1)})),S=d((function(e){new y(e)})),O=!m&&f((function(){for(var e=new y,t=5;t--;)e[g](t,t);return!e.has(-0)}));S||((_=t((function(t,n){s(t,_,e);var r=h(new y,t,_);return n!=undefined&&c(n,r[g],{that:r,AS_ENTRIES:v}),r}))).prototype=b,b.constructor=_),(N||O)&&(x("delete"),x("has"),v&&x("get")),(O||C)&&x(g),m&&b.clear&&delete b.clear}return w[e]=_,r({global:!0,forced:_!=y},w),p(_,e),m||n.setStrong(_,e,v),_}},49957:function(e,t,n){"use strict";var r=n(28919),o=n(28482),i=n(22245),a=n(74217);e.exports=function(e,t){for(var n=o(t),u=a.f,c=i.f,s=0;s"+u+""}},38415:function(e,t,n){"use strict";var r=n(39881).IteratorPrototype,o=n(83681),i=n(39160),a=n(29108),u=n(82723),c=function(){return this};e.exports=function(e,t,n){var s=t+" Iterator";return e.prototype=o(r,{next:i(1,n)}),a(e,s,!1,!0),u[s]=c,e}},52188:function(e,t,n){"use strict";var r=n(75592),o=n(74217),i=n(39160);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},39160:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},39241:function(e,t,n){"use strict";var r=n(14613),o=n(74217),i=n(39160);e.exports=function(e,t,n){var a=r(t);a in e?o.f(e,a,i(0,n)):e[a]=n}},79873:function(e,t,n){"use strict";var r=n(69691),o=n(47497).start,i=Math.abs,a=Date.prototype,u=a.getTime,c=a.toISOString;e.exports=r((function(){return"0385-07-25T07:06:39.999Z"!=c.call(new Date(-50000000000001))}))||!r((function(){c.call(new Date(NaN))}))?function(){if(!isFinite(u.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),r=t<0?"-":t>9999?"+":"";return r+o(i(t),r?6:4,0)+"-"+o(e.getUTCMonth()+1,2,0)+"-"+o(e.getUTCDate(),2,0)+"T"+o(e.getUTCHours(),2,0)+":"+o(e.getUTCMinutes(),2,0)+":"+o(e.getUTCSeconds(),2,0)+"."+o(n,3,0)+"Z"}:c},57763:function(e,t,n){"use strict";var r=n(63518),o=n(28734);e.exports=function(e){if(r(this),"string"===e||"default"===e)e="string";else if("number"!==e)throw TypeError("Incorrect hint");return o(this,e)}},71179:function(e,t,n){"use strict";var r=n(56174),o=n(38415),i=n(6863),a=n(18444),u=n(29108),c=n(52188),s=n(11807),l=n(17657),f=n(1986),d=n(82723),p=n(39881),h=p.IteratorPrototype,v=p.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g="keys",y="values",b="entries",_=function(){return this};e.exports=function(e,t,n,l,p,w,x){o(n,t,l);var E,C,N,S=function(e){if(e===p&&V)return V;if(!v&&e in M)return M[e];switch(e){case g:case y:case b:return function(){return new n(this,e)}}return function(){return new n(this)}},O=t+" Iterator",k=!1,M=e.prototype,I=M[m]||M["@@iterator"]||p&&M[p],V=!v&&I||S(p),T="Array"==t&&M.entries||I;if(T&&(E=i(T.call(new e)),h!==Object.prototype&&E.next&&(f||i(E)===h||(a?a(E,h):"function"!=typeof E[m]&&c(E,m,_)),u(E,O,!0,!0),f&&(d[O]=_))),p==y&&I&&I.name!==y&&(k=!0,V=function(){return I.call(this)}),f&&!x||M[m]===V||c(M,m,V),d[t]=V,p)if(C={values:S(y),keys:w?V:S(g),entries:S(b)},x)for(N in C)(v||k||!(N in M))&&s(M,N,C[N]);else r({target:t,proto:!0,forced:v||k},C);return C}},55282:function(e,t,n){"use strict";var r=n(65781),o=n(28919),i=n(3444),a=n(74217).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||a(t,e,{value:i.f(e)})}},75592:function(e,t,n){"use strict";var r=n(69691);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},21477:function(e,t,n){"use strict";var r=n(84253),o=n(35611),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},20967:function(e,t,n){"use strict";var r=n(72319).match(/firefox\/(\d+)/i);e.exports=!!r&&+r[1]},46392:function(e){"use strict";e.exports="object"==typeof window},85749:function(e,t,n){"use strict";var r=n(72319);e.exports=/MSIE|Trident/.test(r)},20037:function(e,t,n){"use strict";var r=n(72319),o=n(84253);e.exports=/iphone|ipod|ipad/i.test(r)&&o.Pebble!==undefined},24542:function(e,t,n){"use strict";var r=n(72319);e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(r)},41488:function(e,t,n){"use strict";var r=n(77e3),o=n(84253);e.exports="process"==r(o.process)},47501:function(e,t,n){"use strict";var r=n(72319);e.exports=/web0s(?!.*chrome)/i.test(r)},72319:function(e,t,n){"use strict";var r=n(69808);e.exports=r("navigator","userAgent")||""},12338:function(e,t,n){"use strict";var r,o,i=n(84253),a=n(72319),u=i.process,c=i.Deno,s=u&&u.versions||c&&c.version,l=s&&s.v8;l?o=(r=l.split("."))[0]<4?1:r[0]+r[1]:a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),e.exports=o&&+o},12200:function(e,t,n){"use strict";var r=n(72319).match(/AppleWebKit\/(\d+)\./);e.exports=!!r&&+r[1]},23344:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},56174:function(e,t,n){"use strict";var r=n(84253),o=n(22245).f,i=n(52188),a=n(11807),u=n(30889),c=n(49957),s=n(41441);e.exports=function(e,t){var n,l,f,d,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||u(h,{}):(r[h]||{}).prototype)for(l in t){if(d=t[l],f=e.noTargetGet?(p=o(n,l))&&p.value:n[l],!s(v?l:h+(m?".":"#")+l,e.forced)&&f!==undefined){if(typeof d==typeof f)continue;c(d,f)}(e.sham||f&&f.sham)&&i(d,"sham",!0),a(n,l,d,e)}}},69691:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},68880:function(e,t,n){"use strict";n(12654);var r=n(11807),o=n(71841),i=n(69691),a=n(17657),u=n(52188),c=a("species"),s=RegExp.prototype;e.exports=function(e,t,n,l){var f=a(e),d=!i((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),p=d&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[c]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!d||!p||n){var h=/./[f],v=t(f,""[e],(function(e,t,n,r,i){var a=t.exec;return a===o||a===s.exec?d&&!i?{done:!0,value:h.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}));r(String.prototype,e,v[0]),r(s,f,v[1])}l&&u(s[f],"sham",!0)}},904:function(e,t,n){"use strict";var r=n(89999),o=n(39570),i=n(74271);e.exports=function a(e,t,n,u,c,s,l,f){for(var d,p=c,h=0,v=!!l&&i(l,f,3);h0&&r(d))p=a(e,t,d,o(d.length),p,s-1)-1;else{if(p>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[p]=d}p++}h++}return p}},7056:function(e,t,n){"use strict";var r=n(69691);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},74271:function(e,t,n){"use strict";var r=n(83923);e.exports=function(e,t,n){if(r(e),t===undefined)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},68719:function(e,t,n){"use strict";var r=n(83923),o=n(35611),i=[].slice,a={},u=function(e,t,n){if(!(t in a)){for(var r=[],o=0;o]*>)/g,u=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,c,s,l){var f=n+e.length,d=c.length,p=u;return s!==undefined&&(s=r(s),p=a),i.call(l,p,(function(r,i){var a;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(f);case"<":a=s[i.slice(1,-1)];break;default:var u=+i;if(0===u)return r;if(u>d){var l=o(u/10);return 0===l?r:l<=d?c[l-1]===undefined?i.charAt(1):c[l-1]+i.charAt(1):r}a=c[u-1]}return a===undefined?"":a}))}},84253:function(e,t,n){"use strict";var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},28919:function(e,t,n){"use strict";var r=n(12104),o={}.hasOwnProperty;e.exports=Object.hasOwn||function(e,t){return o.call(r(e),t)}},90311:function(e){"use strict";e.exports={}},21419:function(e,t,n){"use strict";var r=n(84253);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},2369:function(e,t,n){"use strict";var r=n(69808);e.exports=r("document","documentElement")},78251:function(e,t,n){"use strict";var r=n(75592),o=n(69691),i=n(21477);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},16567:function(e){"use strict";var t=Math.abs,n=Math.pow,r=Math.floor,o=Math.log,i=Math.LN2;e.exports={pack:function(e,a,u){var c,s,l,f=new Array(u),d=8*u-a-1,p=(1<>1,v=23===a?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===Infinity?(s=e!=e?1:0,c=p):(c=r(o(e)/i),e*(l=n(2,-c))<1&&(c--,l*=2),(e+=c+h>=1?v/l:v*n(2,1-h))*l>=2&&(c++,l/=2),c+h>=p?(s=0,c=p):c+h>=1?(s=(e*l-1)*n(2,a),c+=h):(s=e*n(2,h-1)*n(2,a),c=0));a>=8;f[g++]=255&s,s/=256,a-=8);for(c=c<0;f[g++]=255&c,c/=256,d-=8);return f[--g]|=128*m,f},unpack:function(e,t){var r,o=e.length,i=8*o-t-1,a=(1<>1,c=i-7,s=o-1,l=e[s--],f=127&l;for(l>>=7;c>0;f=256*f+e[s],s--,c-=8);for(r=f&(1<<-c)-1,f>>=-c,c+=t;c>0;r=256*r+e[s],s--,c-=8);if(0===f)f=1-u;else{if(f===a)return r?NaN:l?-Infinity:Infinity;r+=n(2,t),f-=u}return(l?-1:1)*r*n(2,f-t)}}},50990:function(e,t,n){"use strict";var r=n(69691),o=n(77e3),i="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==o(e)?i.call(e,""):Object(e)}:Object},22285:function(e,t,n){"use strict";var r=n(35611),o=n(18444);e.exports=function(e,t,n){var i,a;return o&&"function"==typeof(i=t.constructor)&&i!==n&&r(a=i.prototype)&&a!==n.prototype&&o(e,a),e}},89853:function(e,t,n){"use strict";var r=n(55935),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return o.call(e)}),e.exports=r.inspectSource},40421:function(e,t,n){"use strict";var r=n(56174),o=n(90311),i=n(35611),a=n(28919),u=n(74217).f,c=n(78870),s=n(59995),l=n(41080),f=n(7056),d=!1,p=l("meta"),h=0,v=Object.isExtensible||function(){return!0},m=function(e){u(e,p,{value:{objectID:"O"+h++,weakData:{}}})},g=e.exports={enable:function(){g.enable=function(){},d=!0;var e=c.f,t=[].splice,n={};n[p]=1,e(n).length&&(c.f=function(n){for(var r=e(n),o=0,i=r.length;od;d++)if((h=E(e[d]))&&h instanceof s)return h;return new s(!1)}l=f.call(e)}for(v=l.next;!(m=v.call(l)).done;){try{h=E(m.value)}catch(C){throw c(l),C}if("object"==typeof h&&h&&h instanceof s)return h}return new s(!1)}},61781:function(e,t,n){"use strict";var r=n(63518);e.exports=function(e){var t=e["return"];if(t!==undefined)return r(t.call(e)).value}},39881:function(e,t,n){"use strict";var r,o,i,a=n(69691),u=n(6863),c=n(52188),s=n(28919),l=n(17657),f=n(1986),d=l("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=u(u(i)))!==Object.prototype&&(r=o):p=!0);var h=r==undefined||a((function(){var e={};return r[d].call(e)!==e}));h&&(r={}),f&&!h||s(r,d)||c(r,d,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},82723:function(e){"use strict";e.exports={}},19997:function(e){"use strict";var t=Math.expm1,n=Math.exp;e.exports=!t||t(10)>22025.465794806718||t(10)<22025.465794806718||-2e-17!=t(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:n(e)-1}:t},43334:function(e,t,n){"use strict";var r=n(24305),o=Math.abs,i=Math.pow,a=i(2,-52),u=i(2,-23),c=i(2,127)*(2-u),s=i(2,-126);e.exports=Math.fround||function(e){var t,n,i=o(e),l=r(e);return ic||n!=n?l*Infinity:l*n}},83659:function(e){"use strict";var t=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:t(1+e)}},24305:function(e){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},80909:function(e,t,n){"use strict";var r,o,i,a,u,c,s,l,f=n(84253),d=n(22245).f,p=n(33453).set,h=n(24542),v=n(20037),m=n(47501),g=n(41488),y=f.MutationObserver||f.WebKitMutationObserver,b=f.document,_=f.process,w=f.Promise,x=d(f,"queueMicrotask"),E=x&&x.value;E||(r=function(){var e,t;for(g&&(e=_.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(n){throw o?a():i=undefined,n}}i=undefined,e&&e.enter()},h||g||m||!y||!b?!v&&w&&w.resolve?((s=w.resolve(undefined)).constructor=w,l=s.then,a=function(){l.call(s,r)}):a=g?function(){_.nextTick(r)}:function(){p.call(f,r)}:(u=!0,c=b.createTextNode(""),new y(r).observe(c,{characterData:!0}),a=function(){c.data=u=!u})),e.exports=E||function(e){var t={fn:e,next:undefined};i&&(i.next=t),o||(o=t,a()),i=t}},4302:function(e,t,n){"use strict";var r=n(84253);e.exports=r.Promise},54772:function(e,t,n){"use strict";var r=n(12338),o=n(69691);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},82911:function(e,t,n){"use strict";var r=n(84253),o=n(89853),i=r.WeakMap;e.exports="function"==typeof i&&/native code/.test(o(i))},82101:function(e,t,n){"use strict";var r=n(83923),o=function(e){var t,n;this.promise=new e((function(e,r){if(t!==undefined||n!==undefined)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},18774:function(e,t,n){"use strict";var r=n(86133);e.exports=function(e){if(r(e))throw TypeError("The method doesn't accept regular expressions");return e}},64630:function(e,t,n){"use strict";var r=n(84253).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},78025:function(e,t,n){"use strict";var r=n(84253),o=n(92082),i=n(84703).trim,a=n(65181),u=r.parseFloat,c=1/u(a+"-0")!=-Infinity;e.exports=c?function(e){var t=i(o(e)),n=u(t);return 0===n&&"-"==t.charAt(0)?-0:n}:u},55092:function(e,t,n){"use strict";var r=n(84253),o=n(92082),i=n(84703).trim,a=n(65181),u=r.parseInt,c=/^[+-]?0[Xx]/,s=8!==u(a+"08")||22!==u(a+"0x16");e.exports=s?function(e,t){var n=i(o(e));return u(n,t>>>0||(c.test(n)?16:10))}:u},64905:function(e,t,n){"use strict";var r=n(75592),o=n(69691),i=n(84547),a=n(21061),u=n(77659),c=n(12104),s=n(50990),l=Object.assign,f=Object.defineProperty;e.exports=!l||o((function(){if(r&&1!==l({b:1},l(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=l({},e)[n]||i(l({},t)).join("")!=o}))?function(e,t){for(var n=c(e),o=arguments.length,l=1,f=a.f,d=u.f;o>l;)for(var p,h=s(arguments[l++]),v=f?i(h).concat(f(h)):i(h),m=v.length,g=0;m>g;)p=v[g++],r&&!d.call(h,p)||(n[p]=h[p]);return n}:l},83681:function(e,t,n){"use strict";var r,o=n(63518),i=n(91543),a=n(23344),u=n(90311),c=n(2369),s=n(21477),l=n(85152),f=l("IE_PROTO"),d=function(){},p=function(e){return"