nexsys4 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(e,t,a,n,s,i,o,l,c){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});var u=Object.create,d=Object.defineProperty,m=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,g=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,a,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var s,i=p(t),o=0,l=i.length;o<l;o++)s=i[o],h.call(e,s)||s===a||d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(n=m(t,s))||n.enumerable});return e},__toESM=(e,t,a)=>(a=null!=e?u(g(e)):{},__copyProps(!t&&e&&e.__esModule?a:d(a,"default",{value:e,enumerable:!0}),e));let b=__toESM(a,1);a=__toESM(a);var y=Symbol.for("nexsys4.nexusClientOverrides.installed"),v=Symbol.for("nexsys4.nexusClientOverrides.originals"),S=200,resolveOverrideTargets=e=>({buffer:"function"==typeof e?.buffer?e.buffer():null,platform:"function"==typeof e?.platform?e.platform():null,datahandler:"function"==typeof e?.datahandler?e.datahandler():null}),getActiveNexSys=()=>globalThis.nexSys&&"object"==typeof globalThis.nexSys?globalThis.nexSys:null,getSystemSettings=(e=getActiveNexSys())=>e?.state?.system?.settings||e?.sys?.settings||{},isOverrideTabEnabled=(e=getActiveNexSys())=>Boolean(getSystemSettings(e).overrideTab),normalizeTargetQuery=e=>{const t=String(e??"").trim();return t?`${t.charAt(0).toUpperCase()}${t.slice(1).toLowerCase()}`:""},getInputArea=()=>globalThis.document?.getElementsByTagName?.("textarea")?.[0]??null,createTabCompletion=()=>({txt:null,qry:null,vals:null,index:0,reset(){this.txt=null,this.qry=null,this.vals=null,this.index=0},tc(){const e=getInputArea();if(!e)return;if(this.txt??=String(e.value??"").split(" "),this.qry??=normalizeTargetQuery(this.txt.at(-1)),!this.qry)return;const t=Array.isArray(globalThis.nexGui?.colors?.enemies)?globalThis.nexGui.colors.enemies:[],a=Array.isArray(globalThis.GMCP?.WhoList)?globalThis.GMCP.WhoList:[];this.vals??=[...new Set([...t.map(e=>String(e)),...a.map(e=>String(e?.name??"")).filter(e=>e.startsWith(this.qry))])],this.vals.length&&(this.index>this.vals.length-1?(this.txt[this.txt.length-1]=this.qry,this.index=0):(this.txt[this.txt.length-1]=this.vals[this.index],this.index+=1),e.value=this.txt.join(" "))}}),ensureTabCompletion=(e=getActiveNexSys())=>{if(e?.tabCompletion?.tc&&e?.tabCompletion?.reset)return e.tabCompletion;const t=createTabCompletion();return e&&"object"==typeof e&&(e.tabCompletion=t),t},renderCustomPrompt=(e,t={})=>{const a=e?.api?.prompt,n=t?.line;try{const e="function"==typeof a?.getCustomPrompt?a.getCustomPrompt():"function"==typeof a?.render?a.render(t):null;return"string"!=typeof e?null:(n?.parsed_line&&"object"==typeof n.parsed_line&&(n.parsed_line.formatted=()=>e),e)}catch(s){return console.error("nexSys4 custom prompt render failed",s),null}},createAddBlockOverride=()=>function add_block(e=[]){const t=getActiveNexSys();t?.prepend_line&&(e.unshift(t.prepend_line),t.prepend_line=!1);const a=Boolean(getSystemSettings(t).customPrompt);let n=0;for(let i=0;i<e.length;i+=1){const s=e[i];if(!s||s.gag)continue;if(!s.parsed_line&&!s.html_line)continue;const o=Boolean(s.is_prompt&&a&&s.parsed_line)?renderCustomPrompt(t,{line:s,source:"nexus-client-override"}):null;s.is_prompt&&0===n&&null===o?s.gag=!0:(!s.parsed_line||"function"!=typeof s.parsed_line.text||s.parsed_line.text()||0!==n&&i!==e.length-1||null!==o)&&("function"==typeof this._fill_tab_completion&&this._fill_tab_completion(s),n+=1,this.lineid+=1,s.id=this.lineid,this.lines.push(s),this.unread=!0)}const s=this.prune_lines?.()??!1;(n||s)&&this.on_lines_changed?.()},createProcessLinesOverride=()=>function process_lines(e=[]){if(this.gagged)return;if(!e.length)return;this.current_block=e;const t=this.reflexes?.();for(let a=0;a<e.length&&!(a>=1e3);a+=1)if(this.current_line=e[a],this.current_line.index=a,e[a]?.line&&String(e[a].line).indexOf(String.fromCharCode(7))>=0&&this.platform?.()?.beep?.(),!this.fullstop&&"function"==typeof t?.handle_triggers){const n=t.handle_triggers(e,a);Array.isArray(n)&&(e=n)}t?.run_function?.("onBlock",e,"ALL"),this.buffer?.()?.add_block?.(e),this.current_line=void 0,this.current_block=void 0},createOnKeyUpOverride=()=>function on_key_up(e){if(!this._nexus?.datahandler?.()?.is_connected?.())return!0;if(this.dialog_has_focus?.())return!0;const t=getActiveNexSys(),a=isOverrideTabEnabled(t),n=a?ensureTabCompletion(t):null;return this.tab_pressed?9!==e||(this.tab_pressed=!1,a?(n?.tc?.(),!1):(this.player_targetted||this._nexus?.datahandler?.()?.tab_target?.(!1),this.player_targetted=!1,!1)):(n?.reset?.(),!0)},createSendCommandOverride=e=>function send_command(t){const a=getActiveNexSys(),n=Date.now();if(a&&"object"==typeof a&&(a.sentCommands=[...(Array.isArray(a.sentCommands)?a.sentCommands:[]).slice(0,S-1),{cmd:t,time:n}]),"function"==typeof e)return e.call(this,t);this._socket&&(this._socket.send(`${t}\r\n`),this.last_send=n)},installNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e||e[y])return Boolean(e);const{buffer:t,platform:a,datahandler:n}=resolveOverrideTargets(e);return!!(t&&a&&n)&&(e[v]={buffer:t,platform:a,datahandler:n,process_lines:e.process_lines,add_block:t.add_block,on_key_up:a.on_key_up,send_command:n.send_command},e.process_lines=createProcessLinesOverride(),t.add_block=createAddBlockOverride(),a.on_key_up=createOnKeyUpOverride(),n.send_command=createSendCommandOverride(n.send_command),e[y]=!0,!0)},uninstallNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e?.[y])return!1;const t=e[v];if(!t)return delete e[y],!1;const a=t.buffer||resolveOverrideTargets(e).buffer,n=t.platform||resolveOverrideTargets(e).platform,s=t.datahandler||resolveOverrideTargets(e).datahandler;return e.process_lines=t.process_lines,a&&(a.add_block=t.add_block),n&&(n.on_key_up=t.on_key_up),s&&(s.send_command=t.send_command),delete e[v],delete e[y],!0},x=["send","sendGmcp","on","off","notice","getCommandSeparator","now","setTimeout","clearTimeout","getVariable","setVariable","emitLocal","raiseToEventStream"],C=Object.freeze({promptRender:["renderPrompt"],gmcpSnapshot:["getGMCP"],debugToggle:["setDebugEnabled","isDebugEnabled"],destroy:["destroy"]}),resolveAdapterCapabilities=e=>{const t=e?.capabilities&&"object"==typeof e.capabilities?e.capabilities:{},a={};return Object.entries(C).forEach(([n,s])=>{const i=Object.prototype.hasOwnProperty.call(t,n)?Boolean(t[n]):s.every(t=>"function"==typeof e?.[t]);if(i){const t=s.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter capability "${n}" requires methods: ${t.join(", ")}`)}a[n]=i}),Object.freeze(a)},assertAdapterContract=e=>{const t=x.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter missing required methods: ${t.join(", ")}`);return resolveAdapterCapabilities(e),e},k=["Char.Vitals","Char.Status","Char.Afflictions.List","Char.Afflictions.Add","Char.Afflictions.Remove","Char.Defences.List","Char.Defences.Add","Char.Defences.Remove","Char.Items.Add","Char.Items.Remove","Char.Items.Update","Char.Items.List","IRE.Rift.List","IRE.Rift.Change","Room.Info","IRE.Target.Info"],registerEventStreamBindings=({eventBus:e,emit:t,pushTrace:a,eventRegistrations:n})=>{if(!e?.registerEvent)return;const registerBinding=(t,s)=>{const i=`nexsys4-${t.replace(/\W+/g,"-")}`,callback=e=>s(e);e.registerEvent(t,callback,{id:i,tags:["nexsys4"]}),n.push({eventName:t,id:i}),a("register:eventStream",{eventName:t,id:i})};k.forEach(e=>{registerBinding(e,a=>{t("GmcpEvent",{tag:e,payload:a??null,rawTag:e})})}),registerBinding("PromptEvent",e=>{t("PromptEvent",{source:"eventstream-prompt",payload:e??null})})},registerStartupGag=({onLocalEvent:e,client:t,notice:a,isDebugEnabled:n})=>{if("function"!=typeof e)return;const gagBlock=()=>{n()||t?.current_block?.forEach(e=>e.gag=!0)};let s=null,i=null,o=null;i=e("CuringStartupBeginEvent",()=>{i?.(),i=null,s||(s=e("PromptEvent",gagBlock))}),o=e("CuringStartupCompleteEvent",()=>{o?.(),o=null,gagBlock(),s?.(),s=null,a("loaded using startup spam gag.")})},createTriggerPattern=e=>void 0!==e.regex?e.regex:e.text,resolveTriggerReason=(e,t={})=>"function"==typeof e.resolveReason?e.resolveReason(t):e.reason,resolveTriggerPayload=(e,t,a={})=>{const n={id:e,source:"text"},s=resolveTriggerReason(t,a);return void 0!==t.have&&(n.have=t.have),void 0!==s&&(n.reason=s),"function"==typeof t.resolvePayload&&Object.assign(n,t.resolvePayload(a,n)||{}),n},createBalanceTextTrigger=(e,t)=>({name:`${e}-${t.name}`,regex:createTriggerPattern(t),action:({args:a,emit:n})=>{n("BalanceStateTextEvent",resolveTriggerPayload(e,t,a?.groups))}}),createBalanceTextTriggersFromFamilies=(e=[])=>e.flatMap(({id:e,entries:t=[]})=>t.map(t=>createBalanceTextTrigger(e,t))),A=["a dolomite grain","a calcite mote","a bisemutum chip","an azurite mote","a magnesium chip","an aurum flake","a plumbum flake","a stannum flake","an arsenic pellet","a ferrum flake","an antimony flake","a cuprum flake","an argentum flake","a calamine crystal","a pinch of ground cinnabar","a pinch of realgar crystals","a quartz grain","a pinch of ground malachite","a quicksilver droplet","a potash crystal","a gypsum crystal"],E=["dolomite grains","calcite motes","bisemutum chips","azurite motes","magnesium chips","aurum flakes","plumbum flakes","stannum flakes","arsenic pellets","ferrum flakes","antimony flakes","cuprum flakes","argentum flakes","calamine crystals","pinches of ground cinnabar","pinches of ground realgar","quartz grains","pinches of ground malachite","quicksilver droplets","potash crystals","gypsum crystals"],_=["a bloodroot leaf","a piece of kelp","a goldenseal root","some prickly ash bark","some bayberry bark","a ginseng root","a ginger root","a bellwort flower","a lobelia seed","a hawthorn berry","a valerian leaf","a skullcap flower","slippery elm","a kola nut","sileris berry","some irid moss","a black cohosh root","a prickly pear","some myrrh gum","an echinacea root"],w=["bloodroot leaves","pieces of kelp","goldenseal roots","pieces of prickly ash bark","pieces of bayberry bark","ginseng roots","ginger roots","bellwort flowers","lobelia seeds","hawthorn berries","valerian leaves","skullcap flowers","slippery elms","kola nuts","sileris berries","pieces of irid moss","cohosh roots","prickly pears","myrrh gums","echinacea roots"],T={"a dolomite grain":"dolomite","a calcite mote":"calcite","a bisemutum chip":"bisemutum","an azurite mote":"azurite","a magnesium chip":"magnesium","an aurum flake":"aurum","a plumbum flake":"plumbum","a stannum flake":"stannum","an arsenic pellet":"arsenic","a ferrum flake":"ferrum","an antimony flake":"antimony","a cuprum flake":"cuprum","an argentum flake":"argentum","a calamine crystal":"calamine","a pinch of ground cinnabar":"cinnabar","a pinch of realgar crystals":"realgar","a quartz grain":"quartz","a pinch of ground malachite":"malachite","a quicksilver droplet":"quicksilver","a potash crystal":"potash","a gypsum crystal":"gypsum","a bloodroot leaf":"bloodroot","a piece of kelp":"kelp","a goldenseal root":"goldenseal","some prickly ash bark":"ash","some bayberry bark":"bayberry","a ginseng root":"ginseng","a ginger root":"ginger","a bellwort flower":"bellwort","a lobelia seed":"lobelia","a hawthorn berry":"hawthorn","a valerian leaf":"valerian","a skullcap flower":"skullcap","slippery elm":"elm","a kola nut":"kola","sileris berry":"sileris","some irid moss":"moss","a black cohosh root":"cohosh","a prickly pear":"pear","some myrrh gum":"myrrh","an echinacea root":"echinacea","dolomite grains":"dolomite","calcite motes":"calcite","bisemutum chips":"bisemutum","azurite motes":"azurite","magnesium chips":"magnesium","aurum flakes":"aurum","plumbum flakes":"plumbum","stannum flakes":"stannum","arsenic pellets":"arsenic","ferrum flakes":"ferrum","antimony flakes":"antimony","cuprum flakes":"cuprum","argentum flakes":"argentum","calamine crystals":"calamine","pinches of ground cinnabar":"cinnabar","pinches of ground realgar":"realgar","quartz grains":"quartz","pinches of ground malachite":"malachite","quicksilver droplets":"quicksilver","potash crystals":"potash","gypsum crystals":"gypsum","bloodroot leaves":"bloodroot","pieces of kelp":"kelp","goldenseal roots":"goldenseal","pieces of prickly ash bark":"ash","pieces of bayberry bark":"bayberry","ginseng roots":"ginseng","ginger roots":"ginger","bellwort flowers":"bellwort","lobelia seeds":"lobelia","hawthorn berries":"hawthorn","valerian leaves":"valerian","skullcap flowers":"skullcap","slippery elms":"elm","kola nuts":"kola","sileris berries":"sileris","pieces of irid moss":"moss","cohosh roots":"cohosh","prickly pears":"pear","myrrh gums":"myrrh","echinacea roots":"echinacea"},P={antimony:"ginger",argentum:"lobelia",arsenic:"bayberry",aurum:"kelp",bisemutum:"myrrh",calamine:"hawthorn",calcite:"pear",cinnabar:"elm",cuprum:"bellwort",dolomite:"echinacea",ferrum:"ginseng",gypsum:"cohosh",magnesium:"bloodroot",malachite:"skullcap",plumbum:"goldenseal",potash:"moss",quartz:"kola",quicksilver:"sileris",realgar:"valerian",stannum:"ash"},M={ash:"stannum",bayberry:"arsenic",bellwort:"cuprum",bloodroot:"magnesium",cohosh:"gypsum",echinacea:"dolomite",elm:"cinnabar",ginseng:"ferrum",ginger:"antimony",goldenseal:"plumbum",hawthorn:"calamine",kelp:"aurum",kola:"quartz",lobelia:"argentum",moss:"potash",myrrh:"bisemutum",pear:"calcite",sileris:"quicksilver",skullcap:"malachite",valerian:"realgar"},D={azurite:0,bisemutum:0,magnesium:0,plumbum:0,arsenic:0,potash:0,stannum:0,malachite:0,realgar:0,cinnabar:0,antimony:0,ferrum:0,quartz:0,quicksilver:0,aurum:0,calamine:0,cuprum:0,argentum:0,gypsum:0,calcite:0,dolomite:0,ginseng:0,bloodroot:0,kelp:0,hawthorn:0,lobelia:0,bellwort:0,ginger:0,bayberry:0,ash:0,goldenseal:0,moss:0,valerian:0,elm:0,skullcap:0,sileris:0,kola:0,cohosh:0,pear:0,myrrh:0,echinacea:0},escapeRegExp$1=e=>String(e||"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),buildAlternation=(e=[])=>e.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean).map(escapeRegExp$1).join("|"),exactEntry=(e,t,a,n)=>({name:e,text:t,have:a,reason:n}),regexEntry=(e,t,a,n)=>({name:e,regex:t,have:a,reason:n}),dynamicReasonEntry=(e,t,a,n)=>({name:e,regex:t,have:a,resolveReason:n}),dynamicPayloadEntry=(e,t,a)=>({name:e,regex:t,resolvePayload:a}),R=[..._,...A].filter(e=>"some irid moss"!==e&&"a potash crystal"!==e),O=new RegExp(`^You eat (?<item>${buildAlternation(R)})\\.$`),N=/^Balance used: (?<duration>\d+\.\d{1,2})s\.$/,L=/^Equilibrium used: (?<duration>\d+\.\d{1,2})s\.$/,normalizeConsumedHerb=e=>{const t=String(e||"").trim().toLowerCase();return T[t]||t},parseObservedDurationSeconds=(e={})=>Number.parseFloat(String(e.duration||"")),I=[{id:"balance",entries:[exactEntry("ready","You have recovered balance on all limbs.",!0,"ready"),dynamicPayloadEntry("used",N,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"equilibrium",entries:[exactEntry("ready","You have recovered equilibrium.",!0,"ready"),dynamicPayloadEntry("used",L,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"herb",entries:[exactEntry("ready","You may eat another plant or mineral.",!0,"ready"),dynamicReasonEntry("use",O,!1,e=>normalizeConsumedHerb(e?.item))]},{id:"focus",entries:[exactEntry("ready","Your mind is able to focus once again.",!0,"ready"),exactEntry("use","You focus your mind intently on curing your mental maladies.",!1,"focus"),regexEntry("shriek",/^A diminutive homunculus resembling \w+ turns its head towards you, its jaws opening wider than what seems possible\. The homunculus stares intently at you and lets out an ear-piercing shriek that disrupts your thoughts\.$/,!1,"shriek"),regexEntry("concussion",/^(?:The blow sets your head to spinning - you cannot concentrate on anything\.|\w+ swings (?:his|her) shield around, smashing your temple with a backhanded blow\.)$/,!1,"concussion"),exactEntry("failed","You concentrate, but your mind is too tired to focus.",!1,"failed")]},{id:"sip",entries:[exactEntry("ready","You may drink another health or mana elixir.",!0,"ready"),exactEntry("health","The elixir heals and soothes you.",!1,"health"),exactEntry("mana","Your mind feels stronger and more alert.",!1,"mana"),regexEntry("apply",/^You take some elixir from .+ and rub it into your .+\.$/,!1,"apply"),exactEntry("failed-elixir","The elixir flows down your throat without effect.",!1,"failed"),exactEntry("failed-health-elixir","The health elixir fizzles away without any discernable effect.",!1,"failed")]},{id:"moss",entries:[exactEntry("ready","You may eat another bit of irid moss or potash.",!0,"ready"),exactEntry("use","You feel your health and mana replenished.",!1,"consume"),exactEntry("failed","The potash slides down without effect.",!1,"failed")]},{id:"tree",entries:[exactEntry("ready","You may utilise the tree tattoo again.",!0,"ready"),exactEntry("use","You touch the tree of life tattoo.",!1,"touch"),exactEntry("failed","Your tree of life tattoo glows faintly for a moment then fades, leaving you unchanged.",!1,"failed")]},{id:"salve",entries:[exactEntry("ready","You may apply another salve to yourself.",!0,"ready"),exactEntry("failed","The salve dissolves and quickly disappears after you apply it.",!1,"failed"),regexEntry("restoration",/^\[Curing\]: APPLY RESTORATION TO \w+$/,!1,"restoration"),regexEntry("apply",/^(?:\[Curing\]: APPLY (?:MENDING|EPIDERMAL|CALORIC).*$|You take out some salve and quickly rub it on your(?:\s\w+)+\.)$/,!1,"apply")]},{id:"immunity",entries:[exactEntry("ready","Your system is able to absorb antidotes once again.",!0,"ready"),exactEntry("failed","The liquid reacts with the substance still present in your system, cancelling itself out.",!1,"failed"),exactEntry("use","[Curing]: SIP IMMUNITY",!1,"immunity")]},{id:"rebounding",entries:[exactEntry("aura","You feel an aura of rebounding surround you.",!0,"aura"),exactEntry("discharged","Your aura of weapons rebounding disappears.",!0,"discharged"),exactEntry("already-on","You puff on the pipe, but your existing aura of weapons rebounding negates any effect.",!0,"already-on"),exactEntry("malachite","You take a long drag of malachite off your pipe.",!1,"malachite"),exactEntry("malachite-no-period","You take a long drag of malachite off your pipe",!1,"malachite"),exactEntry("skullcap","You take a long drag of skullcap off your pipe.",!1,"skullcap")]},{id:"smoke",entries:[exactEntry("ready","Your lungs have recovered enough to smoke another mineral or plant.",!0,"ready"),exactEntry("failed","Your lungs have not yet recovered enough to allow you to smoke.",!1,"failed"),regexEntry("use",/^You take a long drag of/,!1,"smoke")]},{id:"dragonbreath",entries:[regexEntry("ready",/^Your \w+ summoning is complete\.$/,!0,"ready"),exactEntry("failed","You already have your breath summoned, Wyrm.",!1,"failed"),exactEntry("lightning","You feel your eyes begin to blaze as you summon lightning to your belly.",!1,"lightning"),exactEntry("fire","With an almost inaudible growl, you begin summoning a fiery inferno into your belly.",!1,"fire"),exactEntry("acid","With a great effort, you begin to summon caustic hell to your innards.",!1,"acid"),exactEntry("cold","Flaring your wings and head back, you begin summoning forth the icy cold of the pure, endless void into your belly.",!1,"cold"),exactEntry("venom","With a great shudder, you begin to summon forth the defiling, deadly wyrmvenom of legend.",!1,"venom"),exactEntry("psi","Calling upon the vast well of mental power at your disposal, you begin to summon a mind-rending blast of psi energy.",!1,"psi")]},{id:"deafness",entries:[exactEntry("ready","The aural world fades to silence.",!0,"ready"),exactEntry("calamine","You eat a calamine crystal.",!1,"calamine"),exactEntry("hawthorn","You eat a hawthorn berry.",!1,"hawthorn")]},{id:"deaf",entries:[exactEntry("already-on","You are already deaf.",!0,"already-on"),exactEntry("trance","The world about you falls silent as the deafness trance sinks upon you.",!0,"trance"),exactEntry("use","You stare straight ahead and concentrate on a distant focal point.",!1,"deaf")]},{id:"blind",entries:[exactEntry("already-on","You are already blind.",!0,"already-on"),exactEntry("ready","You open your eyes once more, and the world about you is darkness.",!0,"ready"),exactEntry("use","You close your eyes for a moment.",!1,"blind")]},{id:"speed",entries:[exactEntry("ready","Tiny tremours spread through your body as the world seems to slow down.",!0,"ready"),exactEntry("use","[Curing]: SIP SPEED",!1,"speed")]},{id:"sileris",entries:[exactEntry("quicksilver-ready","The quicksilver hardens into a supple metallic shell.",!0,"quicksilver"),exactEntry("berry-ready","The sileris berry juice hardens into a supple purple shell.",!0,"sileris"),exactEntry("quicksilver-use","You apply a quicksilver droplet to yourself.",!1,"quicksilver"),exactEntry("berry-use","You apply a sileris berry to yourself.",!1,"sileris")]},{id:"voice",entries:[exactEntry("ready","You have recovered voice balance.",!0,"ready")]},{id:"tremolo",entries:[exactEntry("ready","You may mangle a limb with the vibrato or tremolo once again.",!0,"ready"),regexEntry("arm-use",/^With a trilling vibrato you attack \w+'s broken (?:left|right) arm\. (?:He|She) screams in pain\.$/,!1,"arm"),regexEntry("leg-use",/^Using a heavy tremolo you brutally punish \w+'s already shattered (?:left|right) leg\.$/,!1,"leg")]},{id:"homunculus",entries:[exactEntry("ready","You may order your homunculus once more.",!0,"ready"),exactEntry("failed","You are unable to order your homunculus again so soon.",!1,"failed"),regexEntry("use",/^Focusing your mind on a diminutive homunculus resembling (?:\w+), you command it to disrupt (?:\w+)'s focus\. The homunculus turns towards (?:him|her) before letting out an ear-piercing shriek\.$/,!1,"shriek")]},{id:"fitness",entries:[exactEntry("ready","You may purge your lungs once again.",!0,"ready"),exactEntry("use","You inhale deeply, purging yourself of your asthmatic condition.",!1,"fitness"),exactEntry("failed","You may not purge your lungs again as of this time.",!1,"failed")]},{id:"bloodboil",entries:[exactEntry("ready","You may boil your blood once again.",!0,"ready"),exactEntry("use","You summon spirits of fire to burn off that which afflicts you.",!1,"bloodboil"),exactEntry("failed","You have not recovered enough to boil your blood again as of yet.",!1,"failed")]},{id:"dragonheal",entries:[exactEntry("ready","You may purge your great form of afflictions once again.",!0,"ready"),exactEntry("use","You let out a great keening, and cast the impurities from your form.",!1,"dragonheal"),exactEntry("failed-recovery","You have not yet recovered enough to purge your great form of afflictions.",!1,"failed"),exactEntry("failed-disjointed","Your mind and body are too disjointed to invoke your healing powers, wyrm.",!1,"failed")]},{id:"rage",entries:[exactEntry("ready","You may channel your rage to cure your afflictions once again.",!0,"ready"),exactEntry("use","You allow your pent-up rage to vent and your eyes flash dangerously.",!1,"rage")]},{id:"salt",entries:[exactEntry("use","Directing the energy of salt, you surround yourself with a primal aura, purging yourself of ailments.",!1,"salt"),exactEntry("ready","You may channel alchemical energy to heal yourself once again.",!0,"ready"),exactEntry("failed","You have not recovered enough to heal yourself with alchemical energy once again.",!1,"failed")]},{id:"shrugging",entries:[exactEntry("ready","Your body has recovered enough to shrug afflictions once again.",!0,"ready"),exactEntry("use","Focusing inward, you purge your body of afflictions.",!1,"shrugging"),exactEntry("failed","You may not shrug again so soon.",!1,"failed")]},{id:"fool",entries:[exactEntry("ready","You may heal another affliction.",!0,"ready"),exactEntry("use","You press the Fool tarot to your forehead.",!1,"fool"),exactEntry("failed","The Fool has no effect on you.",!1,"failed")]},{id:"writhe",entries:[regexEntry("free",/^You have writhed free\b/,!0,"ready"),exactEntry("no-affliction","You begin to writhe helplessly, throwing your body off balance.",!0,"no-affliction"),exactEntry("entangled","You begin to struggle free of your entanglement.",!1,"entangled"),exactEntry("transfixation","You begin trying to wrest your mind free of that which has transfixed it.",!1,"transfixation"),exactEntry("failed-entangled","You twist and turn as you attempt to escape from your entanglement.",!1,"failed"),exactEntry("failed-transfixation","You continue trying to wrest your mind free.",!1,"failed")]},{id:"impalewrithe",entries:[exactEntry("free-direct","With an heroic effort you manage to writhe yourself free from the weapon that impaled you.",!0,"impale"),exactEntry("use","You begin to writhe furiously to escape the blade that has impaled you.",!1,"impale"),regexEntry("free-swathe",/^With a vicious snarl \w+ carves a merciless swathe through your steaming guts\. You gurgle and choke as s?he withdraws (?:his|her) dripping blade, glistening with gore\.$/,!0,"impale"),regexEntry("free-wrench",/^Searing pain tears through your midsection as you wrench away from [A-Z][a-z]+, (?:his|her) weapon ripping unceremoniously through your innards\.$/,!0,"impale"),regexEntry("free-slide",/^With a snarl of contempt, \w+ allows you to slide free of (?:her|his) weapon\.$/,!0,"impale")]},{id:"alleviate",entries:[exactEntry("ready","You may purge your body of afflictions once again.",!0,"ready"),exactEntry("use","Applying your knowledge of anatomy, you massage pressure points with your fingers, and a flood of relief courses through your body.",!1,"alleviate"),exactEntry("no-afflictions","There are no pesky afflictions keeping you from your destiny, Warrior.",!1,"no-afflictions"),exactEntry("failed","You are too exhausted to purge your body of afflictions.",!1,"failed")]},{id:"slough",entries:[exactEntry("use","You allow your outer layers to slough away, their fires extinguished along with the impurities contaminating them.",!1,"slough"),exactEntry("ready","You may slough off the impurities that plague you once again.",!0,"ready"),exactEntry("failed","You may not slough off the impurities again quite yet.",!1,"failed")]}],createBalanceTextTriggers=()=>({group:"balance/text",triggers:createBalanceTextTriggersFromFamilies(I)}),parsePositiveInteger=(e,t=1)=>{const a=Number.parseInt(String(e??""),10);return Number.isFinite(a)&&a>0?a:t},cleanItemText=e=>String(e||"").trim(),emitInventoryDelta=({emit:e,item:t,delta:a,source:n="text-trigger"})=>{e("CacheInventoryDeltaTextEvent",{item:cleanItemText(t),delta:a,source:n})},createCacheTextTriggers=()=>({group:"cache/text",triggers:[{name:"rift-out",regex:/^You remove (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftOutTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),source:"text-trigger"})}},{name:"curative-consume",regex:/^You eat (?<item>.+?)\.$/,action:({args:e,emit:t})=>{t("CacheCurativeConsumedTextEvent",{item:cleanItemText((e?.groups||{}).item),amount:1,source:"text-trigger"})}},{name:"rift-in",regex:/^You store (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)(?<capacityMarker>, which is the maximum for that type of object)?\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftInTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),atCapacity:Boolean(a.capacityMarker),source:"text-trigger"})}},{name:"rift-full",regex:"You may not store any more of that type of thing.",action:({emit:e})=>{e("CacheRiftFullTextEvent",{source:"text-trigger"})}},{name:"inventory-empty",regex:/^You have no (?<item>.+?) in your inventory\.$/,action:({args:e,emit:t})=>{t("CacheInventoryEmptyTextEvent",{item:cleanItemText((e?.groups||{}).item),source:"text-trigger"})}},{name:"give-away",regex:/^You give (?<item>.+?) to .+\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}},{name:"receive",regex:/^.+ gives (?<item>.+?) to you\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:1})}},{name:"drop",regex:/^You drop (?<item>.+?)\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}}]}),shiftTrigger=(e,t)=>({name:e,regex:t,action:({emit:t})=>{t("AvoidPostureShiftedTextEvent",{type:e})}}),createAvoidPostureTriggers=()=>({group:"defense/avoidPosture",triggers:[shiftTrigger("physical",/^You prepare yourself to avoid the brunt of physical attacks\.$/),shiftTrigger("aoe",/^You prepare yourself to avoid the brunt of area of effect attacks\.$/),shiftTrigger("mental",/^You prepare yourself to avoid the brunt of mental based attacks\.$/),shiftTrigger("arcane",/^You prepare yourself to avoid the brunt of arcane based attacks\.$/),{name:"recovered",regex:/^You may once more shift your defensive posture\.$/,action:({emit:e})=>{e("AvoidPostureRecoveredTextEvent",{})}},{name:"blocked",regex:/^You have too recently shifted your defensive posture to do so again\.$/,action:({emit:e})=>{e("AvoidPostureBlockedTextEvent",{})}}]}),normalizeTextValue=e=>String(e||"").trim(),parseDelimitedEntries=e=>String(e||"").split(/[|,]/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),parseSpaceDelimitedEntries=e=>String(e||"").replace(/\s+\((\d+)\)/g,"($1)").trim().split(/\s+/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),buildLimbPayload=({args:e,client:t,source:a="text-trigger"})=>({limb:normalizeTextValue(e.groups?.limb),raw:normalizeTextValue(t?.current_line?.line),source:a}),createLimbTextTriggers=()=>({group:"limb/selfDamage",triggers:[{name:"carve-hit",regex:/^As .+? carves into you, you perceive that \w+ has dealt (?<amount>[\d.]+)% damage to your (?<limb>.+)\.$/,action:({args:e,client:t,emit:a})=>{a("LimbDamageTextEvent",{...buildLimbPayload({args:e,client:t}),amount:Number(e.groups?.amount)})}},{name:"crunch-hit",regex:/^As .+?'s? blow crunches into you, you perceive that \w+ has dealt (?<amount>[\d.]+)% damage to your (?<limb>.+)\.$/,action:({args:e,client:t,emit:a})=>{a("LimbDamageTextEvent",{...buildLimbPayload({args:e,client:t}),amount:Number(e.groups?.amount)})}},{name:"pain-subsides",regex:/^The pain plaguing your (?<limb>.+) subsides\.$/,action:({args:e,client:t,emit:a})=>{a("LimbResetTextEvent",buildLimbPayload({args:e,client:t}))}}]}),normalizeTag=e=>String(e||"").trim().toLowerCase(),normalizeCommandSeparator=e=>String(e??"").trim(),toNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toOptionalBooleanFromYesNo=e=>{if(null==e||""===e)return;if("boolean"==typeof e)return e;if("number"==typeof e)return 0!==e;const t=String(e).trim().toLowerCase();return!!["yes","1","true","on"].includes(t)||!["no","0","false","off"].includes(t)&&void 0},boolWord=e=>e?"on":"off",nowMs=()=>Date.now(),j={classQueue:{name:"class",type:"c!p!t!w",pre:["touch soul","stand"],post:[],exclusions:["fullQueue"]},freeQueue:{name:"free",type:"free",pre:["touch soul","stand"],post:[],exclusions:["fullQueue","shieldQueue","bloodcloakQueue"]},fullQueue:{name:"full",type:"ebc!w!p!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","shieldQueue","bloodcloakQueue","classQueue"]},shieldQueue:{name:"shield",type:"eb!w!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","fullQueue","bloodcloakQueue"]},shipQueue:{name:"ship",type:"s!w!t",pre:["touch soul","stand"],post:[],exclusions:[]},bloodcloakQueue:{name:"bloodcloak",type:"!teb",pre:["touch soul"],post:[],exclusions:["fullQueue","freeQueue","shieldQueue"]},battlerageQueue:{name:"battlerage",type:"!p!t!wu",pre:["touch soul"],post:[],exclusions:[]},stunQueue:{name:"stun",type:"!t",pre:["touch soul"],post:[],exclusions:[]}},escapeRegExp=e=>String(e).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),normalizeTriggerName=e=>String(e||"").replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,""),resolveSeparator=e=>normalizeCommandSeparator(e?.())||"|",splitCommands=(e,t)=>String(e||"").split(String(t||"|")||"|").map(e=>e.trim()).filter(Boolean),createQueueSentTrigger=([e,t],a)=>({name:`sent-${normalizeTriggerName(e)}`,regex:new RegExp(`^\\[System\\]: Added (?<commands>.+) to your ${escapeRegExp(t.type)} queue\\.$`),action:({args:n,client:s,emit:i})=>{const o=resolveSeparator(a),l=normalizeTextValue(n.groups?.commands);i("QueueSentTextEvent",{raw:normalizeTextValue(s?.current_line?.line),queueId:e,queueName:t.name,queueType:t.type,rawCommands:l,commands:splitCommands(l,o),separator:o,source:"text-trigger"})}}),createQueueTextTriggers=({getCommandSeparator:e}={})=>({group:"queue/text",triggers:Object.entries(j).map(t=>createQueueSentTrigger(t,e))}),createAffPrioritySnapshotTriggers=()=>({group:"serverside/affPrioritySnapshot",session:{name:"affPriorities",completionEvent:"ServersideAffPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"aff-priority-header",regex:/^Your affliction curing priorities(?::| for the priority set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideAffPrioSnapshotOpenTextEvent",{topic:"affPriorities",reason:"aff-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<prio>\d+):\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{const a=parseSpaceDelimitedEntries(e.groups.entries);return!!a.length&&(a.forEach(a=>{t("ServersideAffPrioTextEvent",{aff:a,prio:Number(e.groups.prio)})}),!0)}},{name:"close",closer:!0,closeReason:"aff-priority-terminal-line",regex:"Affs with priority 26 are ignored."}]}),createCuringSetSnapshotTriggers=()=>{let e=[],t="";const reset=()=>{e=[],t=""};return{group:"serverside/curingSetSnapshot",session:{name:"curingSets",completionEvent:"ServersideCuringSetSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"curingset-list-header",regex:"Your current curing sets",action:()=>{reset()}},{name:"set-line",regex:/^(?!-+$)(?<name>\S+)(?<current> \(current\))?$/,action:({args:a})=>{const n=String(a.groups?.name||"").trim();return!!n&&(e.push(n),a.groups?.current&&(t=n),!0)}},{name:"close",closer:!0,closeReason:"curingset-total-line",regex:/^You are using a total of (?<used>\d+) of your allowed (?<limit>\d+) curing sets\.$/,action:({args:a,emit:n})=>{n("ServersideCuringSetsTextEvent",{sets:[...e],activeSet:t,used:Number(a.groups.used),limit:Number(a.groups.limit)})}},{name:"empty",opener:!0,closer:!0,openReason:"curingset-empty-header",closeReason:"curingset-empty-line",regex:/^You have no sets defined/,action:({emit:e})=>{reset(),e("ServersideCuringSetsTextEvent",{sets:[],activeSet:"",used:0})}}]}},createCuringSetSwitchTriggers=()=>({group:"serverside/curingSetSwitch",triggers:[{name:"switched",regex:/^You will now cure using the (?<set>\S+) set\.$/,action:({args:e,emit:t})=>{t("ServersideCuringSetSwitchedTextEvent",{set:e.groups?.set||""})}}]}),createDefPrioritySnapshotTriggers=()=>({group:"serverside/defPrioritySnapshot",session:{name:"defPriorities",completionEvent:"ServersideDefPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"def-priority-header",regex:/^Your defence priorities(?::| for curing set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioSnapshotOpenTextEvent",{topic:"defPriorities",reason:"def-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<def>\w+)\s*: (?<prio>\d+)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio)})}}]}),createLivePriorityConfirmationTriggers=()=>({group:"serverside/livePriorityConfirmations",triggers:[{name:"aff-set",regex:/^You have set the '(?<aff>[^']+)' affliction to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideAffPrioTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}},{name:"def-set",regex:/^You have set the '(?<def>\w+)' defence to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}}]}),createLivePredictionConfirmationTriggers=()=>({group:"serverside/livePredictionConfirmations",triggers:[{name:"added",regex:/^You have added the (?<aff>\w+) affliction to your predicted afflictions list\.$/,action:({args:e,emit:t})=>{t("ServersidePredictionConfirmTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),status:"added",source:"live-confirmation"})}},{name:"already",regex:"You have already predicted that you have that affliction.",action:({emit:e})=>{e("ServersidePredictionConfirmTextEvent",{aff:"",status:"already",source:"live-confirmation"})}}]}),emitStatus$1=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},createLiveStatusConfirmationTriggers=()=>({group:"serverside/liveStatusConfirmations",triggers:[{name:"enabled",regex:/^Curing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"enabled",/^activated$/.test(e.groups.value))}},{name:"transmutation-on",regex:"You will now use transmutation cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!0)}},{name:"transmutation-off",regex:"You will now use concoction-based cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!1)}},{name:"sip-priority",regex:/^Curing will now prioritise (?<value>mana|health) over (?<other>mana|health)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-threshold",regex:/^(?<kind>Health|Mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"sipHealthAt":"sipManaAt",Number(e.groups.value))}},{name:"moss-threshold",regex:/^Moss (?<kind>health|mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"mossHealthAt":"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Automatic usage of focusing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focus",/^activated$/.test(e.groups.value))}},{name:"focus-over-herbs",regex:/^You will now prioritise (?<value>focus|herbs) over (?<other>focus|herbs)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focusOverHerbs",/^focus$/.test(e.groups.value))}},{name:"tree",regex:/^Automatic usage of the tree tattoo (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"tree",/^activated$/.test(e.groups.value)?"on":"off")}},{name:"clot-on",regex:"You will now attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!0)}},{name:"clot-off",regex:"You will no longer attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!1)}},{name:"clot-at",regex:/^Will clot above (?<value>\d+) bleeding\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAt",Number(e.groups.value))}},{name:"insomnia-on",regex:"You will now use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!0)}},{name:"insomnia-off",regex:"You will now not use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!1)}},{name:"fractures-above",regex:/^Will cure health based afflictions above (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^You will now use mana if above (?<value>\d+)% of your maximum mana reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"manaThreshold",Number(e.groups.value))}},{name:"batch-on",regex:"You will now attempt to cure multiple things at once.",action:({emit:e})=>{emitStatus$1(e,"batch",!0)}},{name:"batch-off",regex:"You will now cure one thing at a time.",action:({emit:e})=>{emitStatus$1(e,"batch",!1)}},{name:"clot-above",regex:/^You will now use corrupted clotting if above (?<value>\d+)% of your maximum health reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAbove",Number(e.groups.value))}}]}),createQueuePredictionTriggers=()=>({group:"serverside/queuePrediction",triggers:[{name:"queue-line",regex:/^CURING QUEUE(?:\s+LIST)?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersideQueueListTextEvent",{queue:parseDelimitedEntries(e.groups.entries)})}},{name:"predictions-line",regex:/^CURING PREDICTIONS?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersidePredictionsTextEvent",{predictions:parseDelimitedEntries(e.groups.entries).reduce((e,t)=>(e[t]=!0,e),{})})}}]}),emitStatus=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},isYes=e=>"Yes"===e,createStatusSnapshotTriggers=()=>({group:"serverside/statusSnapshot",session:{name:"status",completionEvent:"ServersideStatusSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"status-header",regex:"Curing Status:"},{name:"enabled",regex:/^Enabled:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"enabled",isYes(e.groups.value))}},{name:"reporting",regex:/^Reporting commands:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"reporting",isYes(e.groups.value))}},{name:"sipping",regex:/^Sipping:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipping",isYes(e.groups.value))}},{name:"afflictions",regex:/^Affliction Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"afflictions",isYes(e.groups.value))}},{name:"defences",regex:/^Defence Upkeep:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"defences",isYes(e.groups.value))}},{name:"transmutation",regex:/^Curing Method:\s+(?<value>\w+)$/,action:({args:e,emit:t})=>{emitStatus(t,"transmutation","transmutation"===String(e.groups.value||"").toLowerCase())}},{name:"fallback",regex:/^Fallback Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"fallback",isYes(e.groups.value))}},{name:"custom-aff-priority",regex:/^Custom Curing Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customAffPriority",isYes(e.groups.value))}},{name:"custom-def-priority",regex:/^Custom Defence Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customDefPriority",isYes(e.groups.value))}},{name:"sip-priority",regex:/^Health\/Mana Priority:\s+(?<value>Health|Mana)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-health-at",regex:/^Sip health at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipHealthAt",Number(e.groups.value))}},{name:"sip-mana-at",regex:/^Sip mana at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipManaAt",Number(e.groups.value))}},{name:"moss-health-at",regex:/^Eat moss below health:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossHealthAt",Number(e.groups.value))}},{name:"moss-mana-at",regex:/^Eat moss below mana:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Use focus:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focus",isYes(e.groups.value))}},{name:"focus-over-herbs",regex:/^Focus over herbs:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focusOverHerbs",isYes(e.groups.value))}},{name:"clot",regex:/^Use clot:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"clot",isYes(e.groups.value))}},{name:"tree",regex:/^Use tree:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"tree",isYes(e.groups.value)?"on":"off")}},{name:"clot-at",regex:/^Clot at:\s+(?<value>\d+) bleeding$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAt",Number(e.groups.value))}},{name:"insomnia",regex:/^Use insomnia:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"insomnia",isYes(e.groups.value))}},{name:"fractures-above",regex:/^Will cure fractures above:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^Will use mana above:\s+(?<value>\d+)% mana$/,action:({args:e,emit:t})=>{emitStatus(t,"manaThreshold",Number(e.groups.value))}},{name:"clot-health",regex:/^Will clot health until:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAbove",Number(e.groups.value))}},{name:"batch",regex:/^Batch actions:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"batch",isYes(e.groups.value))}},{name:"kaido-transmute",closer:!0,closeReason:"status-terminal-line",regex:/^Use Kaido Transmute:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"kaidoTransmute",isYes(e.groups.value))}}]}),q="transcendence",buildResourcePayload=({client:e,value:t})=>({key:q,value:t,min:0,max:100,source:"text-trigger",raw:normalizeTextValue(e?.current_line?.line)}),createCharacterResourceTriggers=()=>({group:"system/characterResource",triggers:[{name:"transcendence-progress",regex:/^Your body and mind continue to harmonise: you are (?<value>\d+) percent of the way to full transcendence\.$/,action:({args:e,client:t,emit:a})=>{a("CharacterResourceTextEvent",buildResourcePayload({client:t,value:Number(e.groups?.value)}))}},{name:"transcendence-achieved",regex:"You have achieved transcendence: your body and mind operate as one.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:100}))}},{name:"transcendence-harmony-lost",regex:"Your body and mind are no longer in harmony.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}},{name:"transcendence-fallen",regex:"Your body and mind fall out of their transcendent state.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}}]}),createSystemEventTriggers=()=>({group:"system/systemEvent",triggers:[{name:"line",regex:/^SystemEvent (?<eventName>.+)$/,action:({args:e,client:t,emit:a})=>{const n=normalizeTextValue(e.groups?.eventName);if(!n)return;const s=normalizeTextValue(t?.current_line?.line);a(n,{raw:s});const i=n.match(/^(?<queueName>[A-Za-z]+)QueueFired$/);i?.groups?.queueName&&a("QueueFiredTextEvent",{raw:s,queueName:i.groups.queueName})}},{name:"all-queues-cleared",regex:"[System]: All queued commands cleared.",action:({client:e,emit:t})=>{t("AllQueuesClearedTextEvent",{raw:normalizeTextValue(e?.current_line?.line)})}}]}),createSeparatorChangedTrigger=()=>({group:"system/separatorChanged",triggers:[{name:"separator-changed",regex:/^Your command separator is now:\s*(?<sep>\S+)\s*$/,action:({args:e,emit:t})=>{const a=String(e.groups?.sep||"").trim();a&&t("CommandSeparatorChangedTextEvent",{separator:a})}}]}),B=[createSystemEventTriggers,createSeparatorChangedTrigger,createCharacterResourceTriggers,createBalanceTextTriggers,createCacheTextTriggers,createAvoidPostureTriggers,createLimbTextTriggers,createQueueTextTriggers,createStatusSnapshotTriggers,createAffPrioritySnapshotTriggers,createDefPrioritySnapshotTriggers,createCuringSetSnapshotTriggers,createCuringSetSwitchTriggers,createLiveStatusConfirmationTriggers,createLivePriorityConfirmationTriggers,createLivePredictionConfirmationTriggers,createQueuePredictionTriggers],createTriggerCatalog=(e={})=>B.map(t=>t(e)),registerTextTriggers=({triggerApi:e,client:t,getCommandSeparator:a,emit:n,onLocalEvent:s,pushTrace:i,triggerIds:o,registerCleanup:l,registerTriggerGroupActivity:c,triggerSessions:u})=>{if(!e?.triggers?.add)return void i("register:nexAction:skipped",{reason:"trigger-api-unavailable"});const d="function"==typeof e.triggers.enable&&"function"==typeof e.triggers.disable,sessionToggleTag=e=>`session:${e}`,setSessionTriggers=(t,a)=>{if(!d)return;const n=sessionToggleTag(t);a?e.triggers.enable([n]):e.triggers.disable([n]),i(a?"session:enable":"session:disable",{session:t,tag:n})},resetSession=(e,t={})=>{const a=u[e];return!!a&&(a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"reset"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),i("session:reset",{session:e,...t}),!0)},beginSession=(e,t={})=>{const a=u[e];return!!a&&(setSessionTriggers(e,!0),a.active?(i("session:reopen",{session:e,...t}),!1):(a.active=!0,a.hasLines=!1,a.lastReason=String(t.reason||t.source||"begin"),a.lastOpenedAt=Date.now(),i("session:begin",{session:e,...t}),!0))},markSessionHasData=e=>{const t=u[e];t?.active&&!t.hasLines&&(t.hasLines=!0)},completeSession=(e,t={})=>{const a=u[e];if(!a?.active)return!1;const s=a.hasLines;return a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"complete"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),i("session:complete",{session:e,reason:a.lastReason,hadLines:s,completionEvent:t.completionEvent||""}),t.completionEvent&&n(t.completionEvent,{topic:e,reason:a.lastReason}),!0},registerTextTrigger=({id:a,group:s,regex:l,action:u,enabled:d=!0,tags:m=[],once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:C,onEnable:k})=>{e.triggers.add({id:a,regex:l,enabled:d,tags:m,once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:C,onEnable:k,action:e=>u({args:e,client:t,emit:n,pushTrace:i})}),o.push(a),c(s,"triggerCount"),i("register:nexAction",{id:a,group:s,enabled:d,regex:l instanceof RegExp?l.source:String(l)})};createTriggerCatalog({getCommandSeparator:a}).forEach(e=>{const t=e.session;t&&"function"==typeof s&&((t.resetEvents||[]).forEach(({event:a,reason:n})=>{l(s(a,()=>resetSession(t.name,{reason:n,event:a}))),c(e.group,"hookCount")}),(t.fallbackCloseEvents||[]).forEach(({event:a,reason:n})=>{l(s(a,()=>completeSession(t.name,{reason:n,completionEvent:t.completionEvent}))),c(e.group,"hookCount")})),e.triggers.forEach(a=>{const n=t?.name,s=Boolean(n&&!0===a.opener),i=Boolean(n&&!0===a.closer),o=["nexsys4","adapter","text",`group:${e.group}`],l=Boolean(n)&&!s,c=l?[sessionToggleTag(n)]:[],m=(!l||!d)&&(a.enabled??!0);registerTextTrigger({id:`nexsys4-${e.group.replace(/[\\/]+/g,"-")}-${a.name}`,group:e.group,regex:a.regex,enabled:m,tags:[...o,...c,...a.tags||[]],once:a.once,duration:a.duration,fg:a.fg,bg:a.bg,lines:a.lines,prompt:a.prompt,finalAction:a.finalAction,onRemove:a.onRemove,onDisable:a.onDisable,onEnable:a.onEnable,action:o=>{if(s)beginSession(n,{group:e.group,trigger:a.name,reason:a.openReason||"open"});else if(n&&!u[n]?.active)return;const l="function"==typeof a.action?a.action(o):void 0;return!n||s||i||!1===l||markSessionHasData(n),i&&completeSession(n,{reason:a.closeReason||"close",completionEvent:t.completionEvent}),l}})})})},$="",F="#c1bfff",z="#cf6dfc",G="#FFF2D7",H=`<span style="color:${F}">[-</span><span style="color:${z}">nexSys</span><span style="color:${F}">-] </span>`,U=Object.freeze({fg:G,bg:$}),V=Object.freeze({default:Object.freeze({default:Object.freeze({message:U})}),affGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +aff ",fg:"orange",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),affLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -aff ",fg:"orange",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),defGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +def ",fg:"purple",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),defLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -def ",fg:"purple",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),balanceRecovered:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" onBal ",fg:"brown",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),balanceLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" offBal ",fg:"brown",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),trackableGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" + ",fg:"white",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),trackableLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" - ",fg:"white",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),priority:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:"priority change: ",fg:"yellow",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),output:Object.freeze({default:Object.freeze({message:Object.freeze({fg:"red",bg:$})})})}),escapeHtml$1=e=>String(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;"),normalizeNoticeToken=(e,t="")=>String(e||t).trim().toLowerCase(),resolveNoticeStyle=(e={})=>{const t=String(e.category||"default").trim(),a=normalizeNoticeToken(e.action,"default"),n=V[t]||V.default;return n[a]||n.default||V.default.default},normalizeNoticePart=(e,t=U)=>"string"==typeof e?{text:e,fg:t.fg,bg:t.bg}:{text:String(e?.text||""),fg:String(e?.fg??t.fg??U.fg),bg:String(e?.bg??t.bg??U.bg)},buildNoticeParts=(e,t={})=>{const a=resolveNoticeStyle(t),n=a.message||U;if(Array.isArray(t.parts)&&t.parts.length)return t.parts.map(e=>normalizeNoticePart(e,n)).filter(e=>e.text);if(t.title)return[normalizeNoticePart({text:String(t.title),fg:t.titleFg??n.fg,bg:t.titleBg??n.bg},n),normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)].filter(e=>e.text);const s=[];return a.prefix?.text&&s.push(normalizeNoticePart(a.prefix,n)),s.push(normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)),s.filter(e=>e.text)},renderSpanStyle=e=>["white-space:pre-wrap",e.fg?`color:${escapeHtml$1(e.fg)}`:"",e.bg?`background-color:${escapeHtml$1(e.bg)}`:""].filter(Boolean).join(";"),renderNoticeHtml=(e,t={},a=[])=>`<span class="nexsys4-notice" style="white-space:pre-wrap;">${H}${t.html?String(t.html):(a.length?a:buildNoticeParts(e,t)).map(e=>`<span style="${renderSpanStyle(e)}">${escapeHtml$1(e.text)}</span>`).join("")}</span>`,createNoticeTransport=({client:e,emit:t,pushTrace:a})=>({notice(n,s={}){const i=String(n),o=buildNoticeParts(i,s);e.add_html_line(renderNoticeHtml(i,s,o)),a("notice",{message:i,context:s,parts:o}),t("NoticeEvent",{message:i,context:s,parts:o})}}),createTriggerSessionState=()=>({active:!1,hasLines:!1,lastReason:"idle",lastOpenedAt:0,lastClosedAt:0}),createAdapterDebugState=({debug:e=!1,traceLimit:t=200,now:a=()=>Date.now(),logLabel:n="nexSys4.adapter"}={})=>{let s=Boolean(e);const i=Math.max(1,Number(t||200)),o=[],l=new Map,c={status:createTriggerSessionState(),affPriorities:createTriggerSessionState(),defPriorities:createTriggerSessionState(),curingSets:createTriggerSessionState()},pushTrace=(e,t={})=>{if(!s)return null;const l={at:a(),type:e,detail:t};return o.push(l),o.length>i&&o.splice(0,o.length-i),console.log(`[${n}] ${e}`,t),l};return{pushTrace,triggerSessions:c,registerTriggerGroupActivity:(e,t="triggerCount")=>{const a=String(e||"").trim();if(!a)return null;const n=l.get(a)||{name:a,triggerCount:0,hookCount:0};return n[t]=Number(n[t]||0)+1,l.set(a,n),n},setDebugEnabled(e){s=Boolean(e),pushTrace("debug",{enabled:s})},isDebugEnabled:()=>s,snapshotTriggerGroups:()=>[...l.values()].map(e=>({...e})).sort((e,t)=>e.name.localeCompare(t.name)),snapshotTriggerSessions:()=>Object.entries(c).reduce((e,[t,a])=>(e[t]={...a},e),{}),snapshotRecentTrace:()=>[...o]}},createAdapterEventHub=({pushTrace:e=()=>{},errorLabel:t="nexSys4 adapter listener failed"}={})=>{const a=new Map,normalizeEventName=e=>String(e||"").trim(),on=(t,n)=>{const s=normalizeEventName(t);if(!s||"function"!=typeof n)return()=>{};let i=a.get(s);return i||(i=new Set,a.set(s,i)),i.add(n),e("on",{event:s,listenerCount:i.size}),()=>off(s,n)},off=(t,n)=>{const s=normalizeEventName(t),i=a.get(s);if(!s||!i)return!1;const o=i.delete(n);return i.size||a.delete(s),e("off",{event:s,removed:o,listenerCount:i.size}),o};return{emit:(n,s)=>{const i=normalizeEventName(n),o=a.get(i);if(!i||!o?.size)return i&&e("emit",{event:i,listenerCount:0,payload:s}),0;const l=[...o];return e("emit",{event:i,listenerCount:l.length,payload:s}),l.forEach(e=>{if(a.get(i)?.has(e))try{e(s)}catch(n){console.error(t,{event:i,error:n})}}),l.length},on,off,clear(){a.clear()}}},createAdapterLifecycle=({eventBus:e,triggerApi:t,pushTrace:a=()=>{},clearListeners:n=()=>{}}={})=>{const s=[],i=[],o=[],destroy=()=>{const l=o.length,c=s.length,u=[...i];o.splice(0).forEach(e=>{try{e()}catch(t){console.error("nexSys4 adapter cleanup failed",{error:t})}}),e?.removeListener&&s.forEach(({eventName:t,id:a})=>{e.removeListener(t,a)}),t?.triggers?.remove&&i.forEach(e=>t.triggers.remove(e)),a("destroy",{eventRegistrations:c,triggerIds:u,internalCleanupCount:l}),n()};return{eventRegistrations:s,triggerIds:i,registerCleanup:e=>"function"==typeof e?(o.push(e),e):()=>{},destroy}},summarizePromptContext=(e={})=>({source:e.source||"",hasLine:Boolean(e.line)}),createAdapterPromptSink=({emit:e,pushTrace:t})=>{const renderPrompt=(a,n={})=>{const s=String(a??""),i=n?.line;return i?.parsed_line&&"object"==typeof i.parsed_line&&(i.parsed_line.formatted=()=>s),e("PromptRendered",{prompt:s,context:n}),t("renderPrompt",{promptLength:s.length,context:summarizePromptContext(n)}),s};return{renderPrompt}},normalizeOutboundCommands=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[],normalizeGmcpRequests=e=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],createAdapterTransport=({client:e,emit:t,pushTrace:a,resolveSeparator:n}={})=>({send(s=[],i={}){const o=normalizeOutboundCommands(s);if(!o.length)return[];const l=o.join(n()||"|");return e?.send_commands&&e.send_commands(l,!1),a("send",{commands:o,payload:l,context:i}),t("OutboundCommandsEvent",{commands:o,payload:l,context:i}),o},sendGmcp(n=[],s={}){const i="function"==typeof e?.datahandler?e.datahandler():null;if("function"!=typeof i?.send_GMCP)return[];const o=normalizeGmcpRequests(n);if(!o.length)return[];const l=[];return o.forEach(e=>{try{i.send_GMCP(e),l.push(e)}catch(t){console.error("nexSys4 GMCP request failed",{request:e,error:t})}}),l.length&&(a("sendGmcp",{requests:l,context:s}),t("AdapterGmcpRequest",{requests:l,context:s})),l},getVariable(t){if(!e?.variables)return;const a=e.variables();return"function"==typeof a?.get?a.get(t):a?.vars?.[t]},setVariable(t,a){if(!e?.variables)return a;const n=e.variables();return"function"==typeof n?.set?(n.set(t,a),a):n?.vars?(n.vars[t]=a,a):a}}),createNexusAdapter=(e={})=>{const t=e.nexusclient||globalThis.nexusclient,monotonicNowMs=()=>globalThis.performance?.now?globalThis.performance.now():Date.now();let a=null;const resolveSeparator=()=>a||"",n=e.eventStream||globalThis.eventStream,s=e.nexAction||globalThis.nexAction,getGMCP=()=>e.GMCP||globalThis.GMCP,{pushTrace:i,triggerSessions:o,registerTriggerGroupActivity:l,setDebugEnabled:c,isDebugEnabled:u,snapshotTriggerGroups:d,snapshotTriggerSessions:m,snapshotRecentTrace:p}=createAdapterDebugState({debug:e.debug,traceLimit:e.traceLimit}),{emit:g,on:h,off:b,clear:y}=createAdapterEventHub({pushTrace:i}),{eventRegistrations:v,triggerIds:S,registerCleanup:x,destroy:C}=createAdapterLifecycle({eventBus:n,triggerApi:s,pushTrace:i,clearListeners:y}),{send:k,sendGmcp:A,getVariable:E,setVariable:_}=createAdapterTransport({client:t,emit:g,pushTrace:i,resolveSeparator}),normalizeEventName=e=>String(e||"").trim(),{notice:w}=createNoticeTransport({client:t,emit:g,pushTrace:i}),{renderPrompt:T}=createAdapterPromptSink({emit:g,pushTrace:i}),emitLocal=(e,t)=>{const a=normalizeEventName(e);return!!a&&(g(a,t),i("emit:local",{event:a,payload:t}),!0)},raiseToEventStream=(e,t)=>{const a=normalizeEventName(e);return!(!a||!n?.raiseEvent)&&(n.raiseEvent(a,t),i("emit:eventstream",{topic:a,payload:t}),!0)};s?.triggers?.remove&&s.triggers.remove(["nexsys4"]),n?.removeByTag&&n.removeByTag(["nexsys4"]),registerEventStreamBindings({eventBus:n,emit:g,pushTrace:i,eventRegistrations:v}),registerTextTriggers({triggerApi:s,client:t,getCommandSeparator:resolveSeparator,emit:g,onLocalEvent:h,pushTrace:i,triggerIds:S,registerCleanup:x,registerTriggerGroupActivity:l,triggerSessions:o}),!1!==e.startupGag&&registerStartupGag({onLocalEvent:h,client:t,notice:w,isDebugEnabled:u});const addOnceTrigger=({id:e,regex:a,action:n})=>s?.triggers?.add?(s.triggers.add({id:e,regex:a,enabled:!0,once:!0,tags:["nexsys4","probe",`probe:${e}`],action:e=>n({args:e,client:t,emit:g,pushTrace:i})}),S.push(e),i("probe-trigger:add",{id:e,regex:a instanceof RegExp?a.source:String(a)}),()=>{s?.triggers?.remove&&s.triggers.remove(e),i("probe-trigger:remove",{id:e})}):()=>{};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send:k,sendGmcp:A,on:h,off:b,notice:w,getCommandSeparator:()=>resolveSeparator(),setSeparator(e){a=normalizeCommandSeparator(e)||null},addOnceTrigger,now:monotonicNowMs,setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),renderPrompt:T,getVariable:E,setVariable:_,emitLocal,raiseToEventStream,destroy:C,getGMCP,setDebugEnabled:c,isDebugEnabled:u,debugInfo:()=>({debugEnabled:u(),startupGagEnabled:!1!==e.startupGag,separator:resolveSeparator(),eventRegistrations:v.map(e=>({...e})),triggerIds:[...S],triggerGroups:d(),triggerSessions:m(),hasEventStream:Boolean(n?.registerEvent),hasNexActionTriggers:Boolean(s?.triggers?.add),recentTrace:p()})}},createMockAdapter=(e={})=>{const t=new Map,a=new Map,n=new Map;let s=normalizeCommandSeparator(e.separator??"|");const i=[],o=[],l=[],c=[],u=[],d=[];let m=Boolean(e.debug);const p=Math.max(1,Number(e.traceLimit||200)),g=[],pushTrace=(e,t={})=>{const a={at:nowMs(),type:e,detail:t};g.push(a),g.length>p&&g.splice(0,g.length-p),m&&console.log(`[nexSys4.mockAdapter] ${e}`,t)},normalizeEventName=e=>String(e||"").trim(),emit=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s?.size)return n&&pushTrace("emit",{event:n,listenerCount:0,payload:a}),0;const i=[...s];return pushTrace("emit",{event:n,listenerCount:i.length,payload:a}),i.forEach(e=>{if(t.get(n)?.has(e))try{e(a)}catch(s){console.error("nexSys4 mock adapter listener failed",{event:n,error:s})}}),i.length},on=(e,a)=>{const n=normalizeEventName(e);if(!n||"function"!=typeof a)return()=>{};let s=t.get(n);return s||(s=new Set,t.set(n,s)),s.add(a),pushTrace("on",{event:n,listenerCount:s.size}),()=>off(n,a)},off=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s)return!1;const i=s.delete(a);return s.size||t.delete(n),pushTrace("off",{event:n,removed:i,listenerCount:s.size}),i},removeOnceTrigger=e=>{const t=String(e||"").trim();if(!t)return!1;const a=n.delete(t);return pushTrace("probe-trigger:remove",{id:t,removed:a}),a},addOnceTrigger=({id:e,regex:t,action:a}={})=>{const s=String(e||"").trim();return s&&t instanceof RegExp&&"function"==typeof a?(n.set(s,{regex:t,action:a}),pushTrace("probe-trigger:add",{id:s,regex:t.source}),()=>removeOnceTrigger(s)):()=>{}},fireText=(e,t={})=>{const a=String(e??"");pushTrace("fireText",{text:a,detail:t,triggerCount:n.size});const s=[];return[...n.entries()].forEach(([e,i])=>{i.regex.lastIndex=0;const o=i.regex.exec(a);o&&(n.delete(e),s.push(e),i.action({args:{raw:a,line:a,text:a,groups:o.groups||{},matches:[...o]},detail:t}))}),s};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send(e=[],t={}){const a=Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[];return a.length?(i.push({commands:a,context:t}),pushTrace("send",{commands:a,context:t}),emit("OutboundCommandsEvent",{commands:a,context:t}),a):[]},sendGmcp(e=[],t={}){const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)];return a.length?(u.push(...a),pushTrace("sendGmcp",{requests:a,context:t}),emit("AdapterGmcpRequest",{requests:a,context:t}),a):[]},on,off,emit,notice(e,t={}){o.push({message:String(e),context:t}),pushTrace("notice",{message:String(e),context:t})},getCommandSeparator:()=>s,setSeparator:e=>(s=normalizeCommandSeparator(e),pushTrace("setSeparator",{separator:s}),s),addOnceTrigger,fireText,now:()=>"function"==typeof e.now?e.now():nowMs(),setTimeout:(e,t)=>setTimeout(e,t),clearTimeout(e){clearTimeout(e)},renderPrompt(e,t={}){const a=String(e??""),n={prompt:a,context:t};return d.push(n),pushTrace("renderPrompt",{promptLength:a.length,source:t.source||"",hasLine:Boolean(t.line)}),emit("PromptRendered",n),a},getVariable:e=>a.get(e),setVariable:(e,t)=>(a.set(e,t),t),emitLocal(e,t){const a=String(e||"").trim();if(!a)return!1;const n={event:a,payload:t};return l.push(n),pushTrace("emit:local",n),emit(a,t),!0},raiseToEventStream(e,t){const a=String(e||"").trim();if(!a)return!1;const n={topic:a,payload:t};return c.push(n),pushTrace("emit:eventstream",n),!0},destroy(){t.clear(),n.clear()},getSentBatches:()=>i,getNotices:()=>o,getLocalEvents:()=>l,getEventStreamEvents:()=>c,getGmcpRequests:()=>u,getRenderedPrompts:()=>d,getGMCP:()=>e.gmcp||{},setDebugEnabled(e){m=Boolean(e),pushTrace("debug",{enabled:m})},isDebugEnabled:()=>m,debugInfo:()=>({debugEnabled:m,separator:s,recentTrace:[...g],sentBatchCount:i.length,gmcpRequests:[...u],renderedPromptCount:d.length})}},defineStringPrototypeHelper=(e,t)=>"function"!=typeof String.prototype[e]&&(Object.defineProperty(String.prototype,e,{configurable:!0,writable:!0,value:t}),!0),installStringPrototypeHelpers=()=>({toProperCase:defineStringPrototypeHelper("toProperCase",function toProperCase(){return this.replace(/\w\S*/g,function formatWord(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}),capitalize:defineStringPrototypeHelper("capitalize",function capitalize(){return this.charAt(0).toUpperCase()+this.slice(1)})}),Y={list:["accentato","addiction","aeon","agoraphobia","airfisted","amnesia","anorexia","asphyxiating","asthma","betrayal","blackout","blindness","blistered","bloodfire","bound","breathless","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","bruisedribs","burning","cadmuscurse","calcifiedskull","calcifiedtorso","claustrophobia","clumsiness","coldfate","concussion","condemned","conflagration","confusion","constricted","convergence","corruption","crackedribs","cremated","crescendo","crushedthroat","daeggerimpale","damagedhead","damagedleftarm","damagedleftleg","damagedrightarm","damagedrightleg","darkshade","dazed","dazzled","deadening","deafness","death","deathsickness","deepsleep","degenerate","dehydrated","dementia","demonstain","depression","deteriorate","diminished","disloyalty","disrupted","dissonance","dizziness","earworm","empoweredmannaz","empoweredloshre","enlightenment","enmesh","ensorcelled","entangled","epilepsy","fear","flamefisted","flushings","fratricide","frostbite","frozen","fulminated","generosity","grievouswounds","guilt","hamstrung","haemophilia","hallucinations","hatred","healthleech","heartseed","hecatecurse","hellsight","hindered","homunculusmercury","horror","hypersomnia","hypochondria","hypothermia","icebound","icefisted","impaled","impatience","indifference","inquisition","insomnia","internalbleeding","isolation","itching","justice","kaisurge","kkractlebrand","laceratedthroat","lapsingconsciousness","latched","lethargy","lightbind","loneliness","lovers","lovestruck","lullaby","manaleech","masochism","mildtrauma","mangledleftarm","mangledleftleg","mangledrightarm","mangledrightleg","mangledhead","mindclamp","mindravaged","muddled","mycalium","nausea","numbedleftarm","numbedrightarm","pacified","palpatarfeed","paralysis","paranoia","parasite","peace","penitence","petrified","phlogisticated","pinshot","pressure","prone","pyramides","pyre","rebbies","recklessness","reeling","retribution","revealed","sandfever","scalded","scrambledbrains","scytherus","selarnia","sensitivity","serioustrauma","shadowmadness","shivering","shyness","silenced","silver","skullfractures","slashedthroat","sleeping","slickness","slimeobscure","snared","solarburn","speechless","spiritburn","stridulating","stun","stupidity","stuttering","succumbed","temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine","tenderskin","tension","timeflux","timeloop","tonguetied","torntendons","transfixation","trueblind","unweavingbody","unweavingmind","unweavingspirit","vertigo","vinewreathed","vitiated","vitrified","voidfisted","voyria","waterbonds","weakenedmind","weariness","webbed","woeconstrained","whisperingmadness","wristfractures","unconsciousness","harmonic","bop","spiritwrack","bedevil","loki","moon","evileye","dragoncurse","swiftcurse"],prios:{aeon:4,concussion:4,crushedthroat:4,paralysis:4,peace:4,sleeping:5,grievouswounds:5,latched:5,dazzled:5,unweavingbody:5,unweavingmind:5,unweavingspirit:5,weariness:5,prone:5,timeloop:5,fulminated:5,spiritburn:6,heartseed:6,guilt:6,tenderskin:6,pyramides:6,parasite:6,hypochondria:6,pacified:6,depression:6,confusion:6,mindravaged:6,retribution:6,shadowmadness:6,whisperingmadness:6,hellsight:6,anorexia:7,scalded:7,mycalium:7,frostbite:7,flushings:7,rebbies:7,sandfever:7,asthma:7,healthleech:7,impatience:8,itching:8,fratricide:8,scytherus:8,clumsiness:8,kkractlebrand:8,damagedleftleg:8,darkshade:8,slickness:8,recklessness:8,dementia:8,icebound:8,bound:9,daeggerimpale:9,entangled:9,sensitivity:9,transfixation:9,webbed:9,tonguetied:9,haemophilia:9,lethargy:9,manaleech:9,dissonance:9,pyre:9,skullfractures:10,damagedrightleg:10,hypersomnia:10,earworm:10,crescendo:10,diminished:10,torntendons:11,brokenleftleg:11,brokenrightleg:11,hallucinations:11,calcifiedskull:12,calcifiedtorso:12,mangledleftleg:12,mangledrightleg:12,disrupted:12,mangledhead:12,voyria:12,crackedribs:12,hypothermia:13,impaled:13,brokenleftarm:13,brokenrightarm:13,indifference:13,addiction:13,nausea:13,deadening:13,frozen:13,shivering:13,mildtrauma:13,internalbleeding:13,stupidity:14,wristfractures:14,damagedleftarm:14,disloyalty:14,tension:15,damagedhead:15,dazed:15,burning:15,lovers:16,pressure:16,damagedrightarm:16,temperedcholeric:16,temperedmelancholic:16,temperedphlegmatic:16,temperedsanguine:16,mangledleftarm:17,mangledrightarm:17,agoraphobia:18,claustrophobia:18,generosity:18,justice:18,loneliness:18,vertigo:18,paranoia:19,serioustrauma:20,epilepsy:20,laceratedthroat:22,slashedthroat:22,stuttering:22,selarnia:23,fear:23,masochism:23,dizziness:25,shyness:25,stridulating:25,horror:26,bleeding:30,amnesia:30,blackout:30,insomnia:30,deafness:30,blindness:30,harmonic:100,bop:100,spiritwrack:100,bedevil:100,loki:100,moon:100,evileye:100,dragoncurse:100,swiftcurse:100},types:{countable:{pressure:{min:0,max:5},crescendo:{min:0,max:5},unweavingbody:{min:0,max:5},unweavingspirit:{min:0,max:5},unweavingmind:{min:0,max:5},burning:{min:0,max:5},horror:{min:0,max:5},pyre:{min:0,max:3},temperedcholeric:{min:0,max:8},temperedmelancholic:{min:0,max:8},temperedphlegmatic:{min:0,max:8},temperedsanguine:{min:0,max:8},torntendons:{min:0,max:6},crackedribs:{min:0,max:6},skullfractures:{min:0,max:6},wristfractures:{min:0,max:6}},nonServerside:{accentato:0,airfisted:0,asphyxiating:0,blistered:0,bloodfire:0,bruisedribs:0,cadmuscurse:0,coldfate:0,condemned:0,conflagration:0,constricted:0,convergence:0,corruption:0,cremated:0,death:0,deathsickness:0,deepsleep:0,degenerate:0,dehydrated:0,demonstain:0,deteriorate:0,empoweredloshre:0,empoweredmannaz:0,enlightenment:0,enmesh:0,ensorcelled:0,flamefisted:0,hamstrung:0,hatred:0,hecatecurse:0,hindered:0,homunculusmercury:0,icefisted:0,inquisition:0,isolation:0,kaisurge:0,lightbind:0,lullaby:0,mindclamp:0,muddled:0,numbedleftarm:0,numbedrightarm:0,palpatarfeed:0,petrified:0,phlogisticated:0,pinshot:0,revealed:0,scrambledbrains:0,silenced:0,silver:0,slimeobscure:0,solarburn:0,stun:0,timeflux:0,trueblind:0,vinewreathed:0,vitiated:0,vitrified:0,voidfisted:0,waterbonds:0,weakenedmind:0,unconsciousness:0},timed:{accentato:{length:20},aeon:{length:16},airfisted:{length:16},betrayal:{length:15},blackout:{length:20},blistered:{length:20},breathless:{length:3},bruisedribs:{length:30},cadmuscurse:{length:20},condemned:{length:20},constricted:{length:30},corruption:{length:45},dazzled:{length:60},dehydrated:{length:60},demonstain:{length:120},empoweredloshre:{length:12},empoweredmannaz:{length:20},enmesh:{length:5},ensorcelled:{length:20},flamefisted:{length:30},hamstrung:{length:9},heartseed:{length:11},hecatecurse:{length:16},icefisted:{length:30},inquisition:{length:30},lightbind:{length:22},lovestruck:{length:5},muddled:{length:12},numbedleftarm:{length:7.5},numbedrightarm:{length:7.5},palpatarfeed:{length:20},phlogisticated:{length:45},pinshot:{length:18},reeling:{length:20},revealed:{length:60},scalded:{length:20},scrambledbrains:{length:60},silver:{length:180},slimeobscure:{length:60},solarburn:{length:5},snared:{length:20},speechless:{length:300},stridulating:{length:15},stun:{length:3},succumbed:{length:30},timeflux:{length:60},trueblind:{length:6},unconsciousness:{length:10},vinewreathed:{length:30},vitrified:{length:45},voidfisted:{length:5},waterbonds:{length:30},weakenedmind:{length:60},woeconstrained:{length:30}},unknown:{moon:["stupidity","confusion","epilepsy","masochism","hypersomnia","hallucinations"],loki:["stupidity","clumsiness","recklessness","asthma","shyness","darkshade","paralysis","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","sensitivity","disloyalty","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","selarnia","slickness","scytherus"],evileye:["confusion","dizziness"],dragoncurse:["recklessness","clumsiness","epilepsy","dizziness","pacified","nausea","addiction","anorexia","generosity","disloyalty","sensitivity","vertigo","paranoia","stupidity","hypochondria","lethargy","shivering","frozen","impatience","paralysis","asthma","agoraphobia"],harmonic:["stupidity","recklessness"],bop:["stupidity","recklessness"],swiftcurse:["stupidity","clumsiness","recklessness","asthma","paralysis","deafness","sensitivity","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","impatience","claustrophobia","vertigo","agoraphobia","masochism","epilepsy","manaleech","pacified","dementia","healthleech"],bedevil:["stupidity","recklessness"]},uncurable:{bloodfire:!0,cadmuscurse:!0,conflagration:!0,death:!0,deathsickness:!0,deepsleep:!0,enlightenment:!0,isolation:!0,lullaby:!0,mindclamp:!0,palpatarfeed:!0,penitence:!0,scalded:!0,stun:!0,weakenedmind:!0}}},buildAffIndex=e=>{const t=new Set(e.list),a={};for(const[n,s]of Object.entries(e.prios))a[s]||(a[s]=[]),a[s].push(n);return Object.freeze({affSet:t,prioArrays:Object.freeze(a)})},Q=(buildAffIndex(Y),{herb:{length:1.6,aff_modifiers:{homunculusmercury:{multiplier:1,offset:.5}}},focus:{length:2.5,aff_modifiers:{weakenedmind:{multiplier:2,offset:.5},whisperingmadness:{multiplier:1.6,offset:0}}},sip:{length:4.5,aff_modifiers:{skullfractures:{multiplier:1,offset:1}}},moss:{length:6},tree:{length:15,aff_modifiers:{slimeobscure:{multiplier:1,offset:10}}},equilibrium:{length:20,aff_modifiers:{confusion:{multiplier:1.5,offset:0}}},balance:{length:20,aff_modifiers:{lethargy:{multiplier:1.25,offset:0}}},salve:{length:4,aff_modifiers:{timeflux:{multiplier:1.5,offset:0}}},immunity:{length:10},rebounding:{length:9},smoke:{length:1.5},dragonbreath:{length:1.5},deafness:{length:3},deaf:{length:6},blind:{length:6},speed:{length:6},wake:{length:20},sileris:{length:8},avoid:{length:30},free:{length:0},voice:{length:2.5},tremolo:{length:6},homunculus:{length:12},fitness:{length:10},bloodboil:{length:10},dragonheal:{length:20},rage:{length:10},salt:{length:10},shrugging:{length:10},alleviate:{length:10},slough:{length:10},fool:{length:40},writhe:{length:6},impalewrithe:{length:4},entity:{length:4},word:{length:5},anathema:{length:5},systemOutput:{length:1}}),W=["itching","paralysis","fear","brokenrightarm","brokenleftarm","brokenrightleg","brokenleftleg","lapsingconsciousness","aeon","lovers","confusion","epilepsy","pacified","blackout","dazed","justice","slashedthroat","hellsight","peace","dazzled","shyness","dizziness","slickness","asthma","nausea","selarnia","weariness","scytherus","fratricide","haemophilia","clumsiness","hallucinations","healthleech","dementia","recklessness","anorexia","masochism","impatience","stupidity","generosity","addiction","deadening","manaleech","stuttering","paranoia","agoraphobia","loneliness","claustrophobia","vertigo","hypersomnia","shivering","frozen","burning","sensitivity","hypochondria","lethargy","disloyalty","darkshade","voyria","dissonance","phlogisticated","silver","spiritburn","tenderskin","guilt","skullfractures","wristfractures","crackedribs","torntendons","indifference","retribution","shadowmadness","parasite","depression","timeloop","crushedthroat","tension","unweavingspirit","grievouswounds","pyramides","flushings","rebbies","mycalium","sandfever","crescendo","fulminated","frostbite"],K={ferrum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ferrum",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"],prio:0},magnesium:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat magnesium",order:["paralysis","slickness","pyramides"],prio:0},aurum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat aurum",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"],prio:0},calamine:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat calamine",order:["deafness"],delay:2.5,prio:0},argentum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat argentum",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"],prio:0},cuprum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat cuprum",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"],prio:0},antimony:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat antimony",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"],prio:0},arsenic:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat arsenic",prio:0},stannum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat stannum",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"],prio:0},plumbum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"],command:"eat plumbum",prio:0},calcite:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat calcite",prio:0},ginseng:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginseng",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"],prio:0},bloodroot:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bloodroot",order:["paralysis","slickness","pyramides"],prio:0},kelp:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat kelp",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"],prio:0},hawthorn:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat hawthorn",order:["deafness"],delay:2.5,prio:0},lobelia:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat lobelia",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"],prio:0},bellwort:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bellwort",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"],prio:0},ginger:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginger",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"],prio:0},bayberry:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bayberry",prio:0},ash:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ash",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"],prio:0},goldenseal:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat goldenseal",order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"],prio:0},pear:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat pear",prio:0},smoke:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","disloyalty","hellsight","manaleech","slickness","deadening","tension","unweavingspirit","earworm","dazed"],prio:0},cinnabar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"],prio:0},malachite:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke malachite",prio:0},realgar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke realgar",order:["disloyalty","hellsight","manaleech","slickness"],prio:0},elm:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke elm",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"],prio:0},skullcap:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke skullcap",prio:0},valerian:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke valerian",order:["disloyalty","hellsight","manaleech","slickness"],prio:0},caloric:{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply caloric",order:["frozen","shivering","frostbite"],prio:0},"epidermal to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to body",order:["anorexia","itching"],prio:0},"epidermal to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to head",order:["blindness","scalded","deafness","stuttering"],prio:0},"epidermal to ears":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to ears",order:["deafness"],prio:0},"mending to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to head",order:["crushedthroat","dazzled"],prio:0},"mending to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to arms",order:["brokenleftarm","brokenrightarm"],prio:0},"mending to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to legs",order:["brokenleftleg","brokenrightleg"],prio:0},"mending to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to torso",order:["burning"],prio:0},"mending to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to body",order:["selarnia"],prio:0},"restoration to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to head",order:["mangledhead","damagedhead","calcifiedskull","concussion","tonguetied","slashedthroat","laceratedthroat"],delay:4,prio:0},"restoration to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to torso",order:["hypothermia","heartseed","serioustrauma","mildtrauma","calcifiedtorso","internalbleeding"],delay:4,prio:0},"restoration to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to arms",order:["mangledleftarm","mangledrightarm","damagedleftarm","damagedrightarm"],delay:4,prio:0},"restoration to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to legs",order:["mangledleftleg","mangledrightleg","damagedleftleg","damagedrightleg"],delay:4,prio:0},focus:{bals_req:["focus"],bals_used:["focus"],blocks:["death","impatience","sleeping"],command:"focus",order:["stupidity","epilepsy","dizziness","shyness","claustrophobia","paranoia","confusion","hallucinations","dementia","pacified","peace","lovers","generosity","masochism","loneliness","vertigo","recklessness","agoraphobia","anorexia","stuttering"],prio:0},"health to head":{bals_req:["sip"],bals_used:["sip"],command:"apply health to head",order:["skullfractures"],prio:0},"health to torso":{bals_req:["sip"],bals_used:["sip"],command:"apply health to torso",order:["crackedribs","grievouswounds"],prio:0},"health to arms":{bals_req:["sip"],bals_used:["sip"],command:"apply health to arms",order:["wristfractures"],prio:0},"health to legs":{bals_req:["sip"],bals_used:["sip"],command:"apply health to legs",order:["torntendons","latched","kkractlebrand"],prio:0},concentrate:{blocks:["death","sleeping","confusion"],command:"concentrate",order:["disrupted"],prio:0},immunity:{bals_req:["immunity"],bals_used:["immunity"],blocks:["death","sleeping","anorexia"],command:"sip immunity",order:["voyria"],prio:0},stand:{bals_req:["balance","equilibrium"],blocks:["death","sleeping","paralysis","brokenrightleg","brokenleftleg","damagedleftleg","damagedrightleg","mangledrightleg","mangledleftleg","entangled","transfixation","impaled","webbed","bound"],command:"stand",order:["prone"],prio:0},tree:{bals_used:["tree"],bals_req:["tree"],blocks:["death","sleeping","paralysis",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],command:"touch tree",order:W,prio:0},health:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip health",prio:0},mana:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip mana",prio:0},potash:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat potash",prio:0},moss:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat moss",prio:0},fitness:{bals_req:["equilibrium","balance","fitness"],bals_used:["balance","fitness"],blocks:["death","weariness","sleeping"],skills:["Monk","Shikudo","Runewarden"],command:"fitness",order:["asthma"],prio:0},bloodboil:{bals_req:["equilibrium","balance","bloodboil"],bals_used:["equilibrium","bloodboil"],blocks:["death","haemophilia","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Magi"],command:"cast bloodboil",order:W,prio:0},restore:{bals_req:["balance","equilibrium"],bals_used:["equilibrium"],command:"restore",order:["brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","skullfractures","torntendons","wristfractures","crackedribs"],prio:0},dragonflex:{bals_req:["balance"],bals_used:["balance"],command:"dragonflex",skills:["Dragon"],order:["webbed","entangled"],prio:0},dragonheal:{bals_req:["balance","equilibrium"],bals_used:["equilibrium"],command:"dragonheal",skills:["Dragon"],blocks:["death","sleeping",["recklessness","weariness"]],order:W,prio:0},dwinnu:{bals_req:["voice"],bals_used:["voice"],command:"chant dwinnu",skills:["Bard"],order:["webbed","entangled"],prio:0},rage:{bals_req:["rage"],bals_used:["rage"],command:"rage",skills:["Runewarden"],order:["pacified","peace","lovers","generosity"],prio:95},"touch soul":{command:"touch soul",blocks:["death"],order:["amnesia"],prio:101},salt:{bals_req:["equilibrium","salt"],bals_used:["salt","equilibrium"],blocks:["death","stupidity","sleeping"],skills:["Alchemist"],command:"educe salt",order:W,prio:0},siphon:{bals_req:["angel"],bals_used:["angel"],blocks:["death","sleeping"],skills:["Apostate","Priest"],command:"educe salt",order:W,prio:0},shrugging:{bals_req:["equilibrium","balance","shrugging"],bals_used:["shrugging"],blocks:["death","weariness","sleeping"],skills:["Serpent"],command:"shrugging",order:W,prio:0},slough:{bals_req:["equilibrium","balance","slough"],bals_used:["slough","balance"],blocks:["death","weariness","sleeping"],skills:["Fire Elemental Lord"],command:"slough impurities",order:W,prio:0},fool:{bals_req:["equilibrium","balance","fool"],bals_used:["fool","balance"],blocks:["death","prone","paralysis","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Occultist"],command:"fling fool at me",order:W,prio:0},alleviate:{bals_req:["equilibrium","balance","alleviate"],bals_used:["alleviate","balance"],blocks:["death","paralysis","sleeping"],skills:["Blademaster"],command:"alleviate",order:W,prio:0}},normalizeCureCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],X=Object.freeze(Object.fromEntries(Object.entries(K).map(([e,t])=>[e,Object.freeze({...t,command:Object.freeze(normalizeCureCommand(t.command))})]))),J=Object.freeze(Object.entries(X).reduce((e,[t,a])=>((Array.isArray(a.order)?a.order:[]).forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e),{})),Z={acrobatics:{command:"acrobatics on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},airpocket:{command:["outr calcite","eat calcite"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},alertness:{static:!0,command:"alertness on",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},antiforce:{command:"intone gaiartha",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],serverside:!0},aria:{command:"sing aria at me",bals_req:["voice"],bals_used:["voice"],blocks:["death","sleeping"],skills:["Bard"]},arctar:{command:"command orb",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Occultist"],serverside:!1,preempt:!0},arrowcatching:{command:"arrowcatch on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},astronomy:{static:!0,command:"astronomy empower me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},"avoid physical":{command:"avoid physical",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid aoe","avoid mental","avoid arcane"]},"avoid aoe":{command:"avoid aoe",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid mental","avoid arcane"]},"avoid mental":{command:"avoid mental",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid arcane"]},"avoid arcane":{command:"avoid arcane",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid mental"]},balancing:{command:"balancing on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},belltattoo:{command:"touch bell",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0,preempt:!0},blindness:{command:["outr arsenic","eat arsenic"],bals_req:["herb"],bals_used:["herb"],blocks:["death","sleeping","anorexia"],serverside:!0},blocking:{command:"block d",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","prone"],serverside:!1,preempt:!0},bloodshield:{command:"activate bloodshield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],serverside:!0,preempt:!0},bodyaugment:{command:"intone mainaas",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},bodyblock:{static:!0,command:"bdb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},boostedregeneration:{command:"boost regeneration",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},bulk:{command:"mutate bulk",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},cloak:{command:"touch cloak",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},chargeshield:{static:!0,command:"cast chargeshield at me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},coldresist:{command:"activate cold resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},compoundmask:{command:["wear mask","secure mask"],bals_req:["free"],bals_used:["free"],skills:["Alchemist"],serverside:!1},consciousness:{command:"consciousness on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},constitution:{static:!0,command:"constitution",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},curseward:{static:!0,command:"curseward",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],serverside:!0},deafness:{command:["outr calamine","eat calamine"],bals_req:["herb","deafness"],bals_used:["herb","deafness"],blocks:["death","sleeping","anorexia"],serverside:!0},deathsight:{static:!0,command:"deathsight",bals_req:["balance","equilibrium"],bals_used:["free"],serverside:!0,preempt:!0},deflect:{command:"deflect",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","prone","sleeping"],skills:["Runewarden","Paladin","Infernal","Unnamable"],serverside:!0,preempt:!0},density:{command:"wear shackle",bals_req:["salve"],bals_used:["salve"],blocks:["death","slickness","sleeping"],serverside:!0},devilmark:{static:!0,command:"devilmark",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},diamondskin:{static:!0,command:"cast diamondskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},distortedaura:{static:!0,command:"distortaura",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},dragonarmour:{static:!0,command:"dragonarmour",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Dragon"],serverside:!0},dragonbreath:{command:"summon ice",bals_req:["balance","equilibrium","dragonbreath"],bals_used:["free","dragonbreath"],blocks:["death","prone","sleeping"],skills:["Dragon"],preempt:!0,serverside:!0},drunkensailor:{command:"drunkensailor",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},durability:{command:"intone tsuura",bals_req:["balance","equilibrium"],skills:["Depthswalker"],blocks:["death","sleeping","prone"],bals_used:["word"],serverside:!0},electricresist:{command:"activate electric resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},endure:{command:"endure",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0,preempt:!0},enhancedform:{command:["amalgamate enhancement","imbibe enhancement"],bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!1,preempt:!0},evadeblock:{command:"evb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},eyes:{command:"mutate eyes",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},fireresist:{command:"activate fire resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},fangbarrier:{command:"apply quicksilver",bals_req:["salve","sileris"],bals_used:["salve","sileris"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0},fireshroud:{command:"ignite shroud",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0,skills:["Fire Elemental Lord"]},fury:{command:"fury on",bals_req:["balance"],bals_used:["equilibrium"],skills:["Runewarden","Unnamable"],serverside:!0},flying:{command:"fly",bals_req:["balance, equilibrium"],bals_used:["balance"],blocks:["prone","death","sleeping","entangled","transfixation","impaled","webbed","bound"],serverside:!1,clientOnly:!0},ghost:{static:!0,command:"conjure ghost",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},gripping:{command:"grip",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Unnamable","Shikudo","Bard","Blademaster","Jester","Shaman"],serverside:!0,preempt:!0},groundwatch:{command:"groundwatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},"guarding right leg":{command:"guard right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left leg":{command:"guard left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding right leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding right arm":{command:"guard right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right leg","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left arm":{command:"guard left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding right leg","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding head":{command:"guard head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding right leg","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding torso":{command:"guard torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding right leg","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},heartsfury:{command:"heartsfury",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},heldbreath:{command:"hold breath",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","asthma","sleeping"],preempt:!0,serverside:!0},hiding:{command:"hide",bals_req:["equilibrium","balance"],bals_used:["balance"],skills:["Serpent"],serverside:!0},hypersight:{command:"hypersight on",bals_req:["balance"],bals_used:["equilibrium"],serverside:!0},immunity:{command:"immunity",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},insomnia:{command:"insomnia",bals_req:["free"],bals_used:["free"],blocks:["death","hypersomnia","sleeping"],serverside:!0,preempt:!0},insulation:{command:"apply caloric",bals_req:["salve"],bals_used:["salve"],blocks:["death","sleeping","slickness","hypothermia"],serverside:!0},insufflate:{command:["get phial from pack","amalgamate insufflate potency 4 stability 1","imbibe insufflate"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},ironform:{static:!0,command:["get phial from pack","amalgamate petrifying potency 4 stability 1","imbibe petrifying"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},joints:{command:"mutate joints",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},kaiboost:{command:"kai boost",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],preempt:!0,serverside:!0},kaitrance:{command:"kai trance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},kola:{command:["outr quartz","eat quartz"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},lay:{command:"sing lay",bals_req:["voice"],bals_used:["voice"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},levitating:{command:"sip levitation",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},lifevision:{static:!0,command:"lifevision",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},lipreading:{static:!0,command:"lipread",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},locketdeath:{command:"solicit locket for immortality",bals_req:["free"],bals_used:["free"],serverside:!1},magicresist:{command:"activate magic resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},blademastery:{command:"mastery on",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Unnamable"],preempt:!0,serverside:!0},meditate:{command:"meditate",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","impatience"],preempt:!1,serverside:!1},mercury:{static:!0,command:"educe mercury",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},metabolise:{command:"metabolise paralysis",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0},metawake:{command:"metawake on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping","lullaby"],serverside:!0,preempt:!0},mindcloak:{command:"mind cloak on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],preempt:!0,skills:["Monk","Shikudo"],serverside:!0},mindnet:{command:"mindnet on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},mindseye:{static:!0,command:"touch mindseye",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},morimbuul:{command:"ldeck draw morimbuul",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],serverside:!1,preempt:!1},mounted:{command:"",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],preempt:!0,serverside:!1,clientOnly:!0},mouths:{command:"mutate mouths",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},nightsight:{command:"nightsight",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},numbness:{command:"numb",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"]},"parrying right leg":{command:"parry right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","guarding right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left leg":{command:"parry left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","guarding right leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying right arm":{command:"parry right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","guarding right leg","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left arm":{command:"parry left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","guarding right leg","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying head":{command:"parry head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","guarding right leg","parrying left","parrying right","parrying centre"]},"parrying torso":{command:"parry torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","guarding right leg","parrying head","parrying left","parrying right","parrying centre"]},"parrying left":{command:"trueparry left",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Bard"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","guarding right leg","parrying right","parrying centre"]},"parrying right":{command:"trueparry right",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Bard"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","guarding right leg","parrying centre"]},"parrying centre":{command:"trueparry centre",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Bard"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","guarding right leg"]},pinchblock:{command:"pnb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},projectiles:{command:"projectiles on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],blocks:["death","sleeping","mounted"],preempt:!0,serverside:!0},poisonresist:{command:"sip venom",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},precision:{command:"intone trusad",bals_req:["balance","equilibrium"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},prismatic:{command:"strum lyre",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],serverside:!1},psitranscend:{command:"psi transcend",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],blocks:["death","sleeping"],serverside:!0},rebounding:{command:"smoke malachite",bals_req:["smoke","rebounding"],bals_used:["smoke","rebounding"],blocks:["death","asthma","sleeping"],serverside:!0},reflections:{command:"point wand235913 at me",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],preempt:!0,serverside:!1},regeneration:{command:"regeneration on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo"],blocks:["death","sleeping"],serverside:!0,preempt:!0},resistance:{command:"resistance",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Monk","Shikudo","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},scales:{static:!0,command:"scales",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0},secondsight:{static:!0,command:"secondsight",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},selfishness:{command:"selfishness",bals_req:["balance","equilibrium"],bals_used:["balance"],serverside:!0},shield:{command:"touch shield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},shintrance:{command:"shin trance",bals_req:["free"],bals_used:["free"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0,preempt:!0},shinclarity:{static:!0,command:"clarity",bals_req:["balance"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shinbinding:{static:!0,command:"shinbinding on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shipwarning:{command:"shipwarning on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0},shroud:{static:!0,command:"shroud",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Occultist","Serpent"],serverside:!0},softfocusing:{command:"softfocus on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0,preempt:!0},songbird:{command:"whistle for songbird",bals_req:["equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Bard"]},speed:{command:"sip speed",bals_req:["speed"],bals_used:["speed"],blocks:["death","anorexia","sleeping"],serverside:!0},splitmind:{command:"split mind",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},skysight:{command:"manifest skysight",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},skywatch:{command:"skywatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},stonefist:{static:!0,command:"cast stonefist",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},stoneskin:{static:!0,command:"cast stoneskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},sulphur:{static:!0,command:"educe sulphur",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},tekurastance:{command:"tekurastance",bals_req:["free"],bals_used:["balance"],skills:["Monk","Shikudo"]},telesense:{command:"telesense on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},temperance:{command:"sip frost",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},tempest:{command:"manifest tempest",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},mutatetentacles:{command:"mutate tentacles",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},thirdeye:{command:"thirdeye",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tin:{static:!0,command:"educe tin",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Alchemist"],serverside:!0},tentacles:{command:"tentacles",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Occultist"],serverside:!0},toughness:{command:"toughness",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},treewatch:{command:"treewatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tune:{command:"sing tune",bals_req:["voice"],bals_used:["voice"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},twoartsstance:{command:"twoartsstance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Blademaster"]},vigilance:{command:"vigilance on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},vitality:{command:"vitality on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},weathering:{command:"weathering on",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Infernal","Paladin","Monk","Shikudo","Blademaster","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},weaving:{static:!0,command:"weaving on",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0}},normalizeDefCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefPriority=(e,t)=>{const a=Number(e);return Number.isFinite(a)?a<0?0:a>26?26:a:0},ee=Object.freeze(Object.fromEntries(Object.entries(Z).map(([e,t])=>{const a=!1!==t.serverside;return[e,Object.freeze({...t,command:Object.freeze(normalizeDefCommand(t.command)),bals_req:Object.freeze(normalizeDefList(t.bals_req)),bals_used:Object.freeze(normalizeDefList(t.bals_used)),skills:Object.freeze(normalizeDefList(t.skills)),opps:Object.freeze(normalizeDefList(t.opps)),blocks:Object.freeze(t.blocks?[...t.blocks]:[]),serverside:a,preempt:!0===t.preempt,static:!0===t.static,clientOnly:!0===t.clientOnly,defaultPriority:normalizeDefPriority(t.defaultPriority,a)})]}))),te=Object.freeze(Object.keys(ee).reduce((e,t)=>(e[t]=Number(ee[t].defaultPriority),e),{})),buildDefBySkillIndex=()=>{const e=Object.entries(ee).reduce((e,[t,a])=>{const n=a.skills;return Array.isArray(n)&&n.forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e},{});return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.freeze([...t])])))},re=(buildDefBySkillIndex(),Object.freeze({CHAR_VITALS:"nexsys4.gmcp.char.vitals",CHAR_STATUS:"nexsys4.gmcp.char.status",CHAR_AFFLICTIONS_LIST:"nexsys4.gmcp.char.afflictions.list",CHAR_AFFLICTIONS_ADD:"nexsys4.gmcp.char.afflictions.add",CHAR_AFFLICTIONS_REMOVE:"nexsys4.gmcp.char.afflictions.remove",CHAR_DEFENCES_LIST:"nexsys4.gmcp.char.defences.list",CHAR_DEFENCES_ADD:"nexsys4.gmcp.char.defences.add",CHAR_DEFENCES_REMOVE:"nexsys4.gmcp.char.defences.remove",IRE_RIFT_LIST:"nexsys4.gmcp.ire.rift.list",IRE_RIFT_CHANGE:"nexsys4.gmcp.ire.rift.change",CHAR_ITEMS_LIST:"nexsys4.gmcp.char.items.list",CHAR_ITEMS_DELTA:"nexsys4.gmcp.char.items.delta",ROOM_INFO:"nexsys4.gmcp.room.info",TARGET_INFO:"nexsys4.gmcp.target.info"})),isRecord$4=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),normalizeLocation=e=>String(e??"inv").trim().toLowerCase()||"inv",mergeDefinedRecord=(...e)=>e.reduce((e,t)=>(Object.entries(isRecord$4(t)?t:{}).forEach(([t,a])=>{void 0!==a&&(e[t]=a)}),e),{}),mergeResourceStats=(e=[],t=[])=>{const a=new Map;return[...e,...t].forEach(e=>{const t=String(e?.key||"").trim().toLowerCase();t&&a.set(t,e)}),[...a.values()]},mergeBalancePatches=(e=[],t=[])=>[...Array.isArray(e)?e:[],...Array.isArray(t)?t:[]],mergeStatusPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,status:{...isRecord$4(a.status)?a.status:{},...isRecord$4(n.status)?n.status:{}}}},mergeVitalsPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{},s=isRecord$4(a.vitals)?a.vitals:{},i=isRecord$4(n.vitals)?n.vitals:{};return{...a,...n,vitals:{...s,...i,kind:i.kind||s.kind,vitals:mergeDefinedRecord(s.vitals,i.vitals),balances:mergeDefinedRecord(s.balances,i.balances),balancePatches:mergeBalancePatches(s.balancePatches,i.balancePatches),resourceStats:mergeResourceStats(Array.isArray(s.resourceStats)?s.resourceStats:[],Array.isArray(i.resourceStats)?i.resourceStats:[])}}},mergeTargetPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,target:mergeDefinedRecord(a.target,n.target)}},ae=new Map([[re.CHAR_STATUS,{keyFor:()=>re.CHAR_STATUS,merge:mergeStatusPayload}],[re.CHAR_VITALS,{keyFor:()=>re.CHAR_VITALS,merge:mergeVitalsPayload}],[re.CHAR_AFFLICTIONS_LIST,{keyFor:()=>re.CHAR_AFFLICTIONS_LIST,merge:(e,t)=>t}],[re.CHAR_DEFENCES_LIST,{keyFor:()=>re.CHAR_DEFENCES_LIST,merge:(e,t)=>t}],[re.CHAR_ITEMS_LIST,{keyFor:({payload:e}={})=>`${re.CHAR_ITEMS_LIST}:${normalizeLocation(e?.location)}`,merge:(e,t)=>t}],[re.IRE_RIFT_LIST,{keyFor:()=>re.IRE_RIFT_LIST,merge:(e,t)=>t}],[re.TARGET_INFO,{keyFor:()=>re.TARGET_INFO,merge:mergeTargetPayload}]]),ne=new Set([re.CHAR_AFFLICTIONS_ADD,re.CHAR_AFFLICTIONS_REMOVE,re.CHAR_DEFENCES_ADD,re.CHAR_DEFENCES_REMOVE,re.CHAR_ITEMS_DELTA,re.IRE_RIFT_CHANGE]),createGmcpBlockBuffer=({coalesce:e=!0}={})=>{const t=[];return{enqueue:(e={})=>{const a=String(e.topic||"").trim();a&&t.push({topic:a,payload:Object.prototype.hasOwnProperty.call(e,"payload")?e.payload:null})},flush:()=>{if(!e){const e=[...t];return t.length=0,e}const a=new Map,n=[],s=[];return t.forEach(e=>{const t=ae.get(e.topic);if(t){const n=t.keyFor(e),s=a.get(n);return void(s?a.set(n,{...s,payload:t.merge(s.payload,e.payload)}):a.set(n,e))}ne.has(e.topic)?s.push(e):n.push(e)}),t.length=0,[...a.values(),...n,...s]},size:()=>t.length}},createEventBus=({label:e="nexSys4.eventBus",debugEnabled:t=!1,traceLimit:a=200}={})=>{const n=new Map,s=new Set;let i=Boolean(t);const o=Math.max(1,Number(a||200)),l=[],pushTrace=(t,a={})=>{if(!i)return null;const n={at:Date.now(),type:t,detail:a};return l.push(n),l.length>o&&l.splice(0,l.length-o),console.log(`[${e}] ${t}`,a),n},on=(e,t)=>{const a=String(e||"").trim();if(!a||"function"!=typeof t)return()=>{};const s=n.get(a)||new Set;return s.add(t),n.set(a,s),pushTrace("on",{topic:a,listenerCount:s.size}),()=>off(a,t)},off=(e,t)=>{const a=String(e||"").trim(),s=n.get(a);if(!a||!s)return!1;const i=s.delete(t);return s.size||n.delete(a),pushTrace("off",{topic:a,removed:i,listenerCount:s.size}),i},onAny=e=>"function"!=typeof e?()=>{}:(s.add(e),pushTrace("onAny",{listenerCount:s.size}),()=>offAny(e)),offAny=e=>{const t=s.delete(e);return pushTrace("offAny",{removed:t,listenerCount:s.size}),t};return{on,off,onAny,offAny,emit:(e,t)=>{const a=String(e||"").trim();if(!a)return 0;const o=[...n.get(a)||[]],l=[...s];return i&&pushTrace("emit",{topic:a,listenerCount:o.length,anyListenerCount:l.length,payload:t}),o.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus handler failed",{topic:a,error:n})}}),l.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus global handler failed",{topic:a,error:n})}}),o.length+l.length},clear:()=>{n.clear(),s.clear()},setDebugEnabled(e){i=Boolean(e)},debugInfo:()=>({label:e,debugEnabled:i,topics:[...n.keys()],anyListenerCount:s.size,recentTrace:[...l]})}},se=Object.freeze({RUNTIME_STARTED:"nexsys4.runtime.started",RUNTIME_STOPPED:"nexsys4.runtime.stopped",RAW_GMCP:"nexsys4.raw.gmcp",SYSTEM_VITALS_CHANGED:"nexsys4.system.vitals.changed",SYSTEM_HEALTH_CHANGED:"nexsys4.system.health.changed",SYSTEM_MANA_CHANGED:"nexsys4.system.mana.changed",SYSTEM_RAGE_CHANGED:"nexsys4.system.rage.changed",SYSTEM_BLEED_CHANGED:"nexsys4.system.bleed.changed",SYSTEM_STATUS_CHANGED:"nexsys4.system.status.changed",SYSTEM_CLASS_CHANGED:"nexsys4.system.class.changed",SYSTEM_TARGET_CHANGED:"nexsys4.system.target.changed",SYSTEM_ROOM_CHANGED:"nexsys4.system.room.changed",SYSTEM_ROOM_ITEMS_CHANGED:"nexsys4.system.room_items.changed",SYSTEM_RUNTIME_CHANGED:"nexsys4.system.runtime.changed",SYSTEM_PAUSE_CHANGED:"nexsys4.system.pause.changed",SYSTEM_PAUSED:"nexsys4.system.paused",SYSTEM_UNPAUSED:"nexsys4.system.unpaused",SYSTEM_LOADED:"nexsys4.system.loaded",SYSTEM_SETTINGS_CHANGED:"nexsys4.system.settings.changed",SYSTEM_BASELINE_CHANGED:"nexsys4.system.baseline.changed",SYSTEM_DEATH_DETECTED:"nexsys4.system.death.detected",SYSTEM_MOUNT_CHANGED:"nexsys4.system.mount.changed",SYSTEM_WIELDED_CHANGED:"nexsys4.system.wielded.changed",UI_CONFIG_CHANGED:"nexsys4.ui.config.changed",AFF_GOT:"nexsys4.aff.got",AFF_LOST:"nexsys4.aff.lost",AFF_STACK_CHANGED:"nexsys4.aff.stack.changed",AFF_PRIORITY_CHANGED:"nexsys4.aff.priority.changed",DEF_GOT:"nexsys4.def.got",DEF_LOST:"nexsys4.def.lost",DEF_PRIORITY_CHANGED:"nexsys4.def.priority.changed",BALANCE_GOT:"nexsys4.balance.got",BALANCE_LOST:"nexsys4.balance.lost",BALANCE_RESET:"nexsys4.balance.reset",BALANCE_DURATION_OBSERVED:"nexsys4.balance.duration.observed",BALANCE_TIMER_RESTARTED:"nexsys4.balance.timer.restarted",EQBAL_GOT:"nexsys4.eqbal.got",LIMB_HIT:"nexsys4.limb.hit",LIMB_RESET:"nexsys4.limb.reset",LIMB_STAGE_CHANGED:"nexsys4.limb.stage.changed",LIMB_DECAY:"nexsys4.limb.decay",CACHE_AMOUNT_CHANGED:"nexsys4.cache.amount.changed",CACHE_INVENTORY_LIST:"nexsys4.cache.inventory.list",CACHE_RIFT_LIST:"nexsys4.cache.rift.list",CACHE_PRECACHE_CHANGED:"nexsys4.cache.precache.changed",ITEM_ROOM_ADDED:"nexsys4.item.room.added",ITEM_ROOM_REMOVED:"nexsys4.item.room.removed",ITEM_ROOM_UPDATED:"nexsys4.item.room.updated",ITEM_ROOM_LIST:"nexsys4.item.room.list",ITEM_INV_ADDED:"nexsys4.item.inv.added",ITEM_INV_REMOVED:"nexsys4.item.inv.removed",ITEM_INV_UPDATED:"nexsys4.item.inv.updated",ITEM_INV_LIST:"nexsys4.item.inv.list",QUEUE_UPDATED:"nexsys4.queue.updated",QUEUE_FLUSHED:"nexsys4.queue.flushed",QUEUE_DEFERRED:"nexsys4.queue.deferred",QUEUE_CLEARED:"nexsys4.queue.cleared",QUEUE_SENT:"nexsys4.queue.sent",QUEUE_FIRED:"nexsys4.queue.fired",QUEUE_FIRED_ACK:"nexsys4.queue.fired.ack",SERVERSIDE_AFF_PRIORITY_SET:"nexsys4.serverside.aff.priority.set",SERVERSIDE_DEF_PRIORITY_SET:"nexsys4.serverside.def.priority.set",SERVERSIDE_DIRTY:"nexsys4.serverside.dirty",SERVERSIDE_EVALUATED:"nexsys4.serverside.evaluated",SERVERSIDE_RULE_CHANGED:"nexsys4.serverside.rule.changed",RULE_ADDED:"nexsys4.rule.added",RULE_REMOVED:"nexsys4.rule.removed",RULE_ENABLED:"nexsys4.rule.enabled",RULE_DISABLED:"nexsys4.rule.disabled",RULE_PACK_LOADED:"nexsys4.rule.pack.loaded",RULE_PACK_UNLOADED:"nexsys4.rule.pack.unloaded",RULE_ORDER_CHANGED:"nexsys4.rule.order.changed",RULE_ACTIVATED:"nexsys4.rule.activated",RULE_DEACTIVATED:"nexsys4.rule.deactivated"}),ie=Object.freeze({IDLE:"IDLE",PROBING_SEPARATOR:"PROBING_SEPARATOR",BOOTING:"BOOTING",PROVISIONING_CURINGSET:"PROVISIONING_CURINGSET",AWAITING_SNAPSHOTS:"AWAITING_SNAPSHOTS",CAPTURING_SNAPSHOTS:"CAPTURING_SNAPSHOTS",RUNNING:"RUNNING",FAILED:"FAILED"}),isRuntimeReadyPhase=e=>e===ie.RUNNING,oe=Object.freeze({OUTPUT_COMPLETE:"SystemOutputCompleteEvent",STARTUP_BEGIN:"CuringStartupBeginEvent",STARTUP_COMPLETE:"CuringStartupCompleteEvent",STARTUP_FINALIZED:"CuringStartupFinalizedEvent",CURINGSET_READY:"CuringSetReadyEvent"}),le=Object.freeze(["IRE.Rift.Request","IRE.Time.Request","Char.Skills.Get","Char.Items.Inv","IRE.Time.Request","Comm.Channel.Players","IRE.Tasks.Request"]),buildStartupSnapshotCommands=()=>[`echo SystemEvent ${oe.STARTUP_BEGIN}`,"curing off","score","date","curing status","curing priority list","curing queue list","curing predictions","curing priority defence list","def","curing on",`echo SystemEvent ${oe.STARTUP_COMPLETE}`],buildStartupSnapshotBurst=()=>({gmcpRequests:[...le],commands:buildStartupSnapshotCommands()}),ce=Object.freeze(["status","affPriorities","defPriorities"]),normalizeTimeoutMs=(e,t=1e3)=>{const a=Number(e);return Number.isFinite(a)&&a>0?Math.floor(a):t},normalizeRetryCount=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)&&a>=0?Math.floor(a):t},createStartupCoordinator=({adapter:e,systemModel:t,serverside:a,persistence:n,seedBaselineFromObservedStartup:s=()=>{},noticeCenter:i,buildPersistenceSnapshot:o,startupTimeoutMs:l=1e3,maxStartupRetries:c=0,publishStartupPhase:u=()=>{},publishLoaded:d=()=>{},releaseStartupPause:m=()=>!1,setRuntimePhase:p=(e,a={})=>{t.setRuntime({phase:e,...a})}})=>{let g=!1,h=0,b=null,y=null;const v=normalizeTimeoutMs(l),S=normalizeRetryCount(c),clearConvergenceTimer=()=>{b&&(e.clearTimeout(b),b=null)},getMissingRequiredTopics=()=>{if("function"==typeof a.getMissingStartupFlags)return a.getMissingStartupFlags(ce);const e=a.getStartupStatus();return ce.filter(t=>!e.flags?.[t])},formatMissingRequiredTopics=(e=[])=>e.length?` Missing required captures: ${e.join(", ")}.`:"",startConvergenceTimer=()=>{clearConvergenceTimer(),b=e.setTimeout(()=>{if(g)return;const e=getMissingRequiredTopics();retryOrFail(e.length?`Startup snapshots did not converge within ${v}ms.`:`Startup closing fence did not arrive within ${v}ms.`,{phase:"snapshot-timeout-retry",source:"startup-timeout",missingRequired:e})},v)},complete=(e="startup-check")=>{clearConvergenceTimer(),p(ie.RUNNING,{startupFailureMessage:""}),s(),n.save(o()),u("startup-complete"),m({source:"startup-complete"}),d({source:"startup-complete",topic:se.SYSTEM_LOADED}),i.publish("output","startup complete",{source:e})},fail=(e,{source:t="startup-failed",missingRequired:a=[]}={})=>{clearConvergenceTimer(),g=!0;const n=`${e}${formatMissingRequiredTopics(a)}`;return p(ie.FAILED,{paused:!0,startupFailureMessage:n}),u("startup-failed"),i.publish("output",n,{force:!0,source:t,title:"startup failed: ",fg:"#fee2e2",bg:"#450a0a",titleFg:"#ffffff",titleBg:"#7f1d1d"}),!1},retryOrFail=(e,{phase:t,source:a,missingRequired:n=[]}={})=>!g&&(h>=S?fail(`${e} Exhausted ${S} startup retr${1===S?"y":"ies"}.`,{source:a,missingRequired:n}):(h+=1,requestSnapshots(y,t||"snapshot-retry",{source:a,retry:h,missingRequired:n}),!1)),requestSnapshots=(t,a="snapshot-request",n={})=>{if(y="function"==typeof t?t:y,"function"!=typeof y)return[];const s={source:"startup-snapshots",phase:a,attempt:h+1,retryCount:h,...n},{gmcpRequests:i,commands:o}=buildStartupSnapshotBurst();p(ie.AWAITING_SNAPSHOTS),u(a),e.sendGmcp(i,s);const l=y(o,s);return startConvergenceTimer(),l};return{reset:()=>{g=!1,h=0,clearConvergenceTimer(),a.resetStartupStatus?.(),p(ie.IDLE,{startupFailureMessage:""})},fail,requestSnapshots,handleFenceBegin:()=>!g&&(p(ie.CAPTURING_SNAPSHOTS),u("snapshot-begin"),!0),handleFenceComplete:(e="snapshot:complete:text")=>{if(g)return!1;u("snapshot-complete");const t=a.getStartupStatus();t.flags.queue||a.updateObservedQueue([]),t.flags.predictions||a.updateObservedPredictions({});const n=getMissingRequiredTopics();return n.length?retryOrFail("Startup closing fence arrived before required snapshots converged.",{phase:"snapshot-retry",source:e,missingRequired:n}):(g=!0,complete(e),!0)},dispose(){clearConvergenceTimer()},isResolved:()=>g}},ue="nexsys4-default",normalizeCommand=e=>String(e||"").trim().toLowerCase().replace(/\s+/g," "),isServersideCommand=e=>{const t=normalizeCommand(e);return t.startsWith("curing ")||t.startsWith("curingset ")},normalizeSetName=e=>String(e||"").trim().toLowerCase(),toNumberMaybe=e=>{if("number"==typeof e&&Number.isFinite(e))return e;const t=Number(e);return Number.isFinite(t)?t:e},normalizeBoolean=e=>{if("boolean"==typeof e)return e;const t=String(e||"").trim().toLowerCase();return!!["on","yes","true","activated","enabled"].includes(t)||!["off","no","false","disabled"].includes(t)&&Boolean(e)},normalizeStatusValue=(e,t)=>{switch(e){case"enabled":case"reporting":case"afflictions":case"defences":case"sipping":case"transmutation":case"focus":case"useVault":case"clot":case"fallback":case"kaidoTransmute":case"customAffPriority":case"customDefPriority":case"batch":case"insomnia":return normalizeBoolean(t);case"focusOverHerbs":{if("boolean"==typeof t)return t;const e=String(t||"").trim().toLowerCase();return!!["focus","first","yes","on","true"].includes(e)||!["herbs","second","no","off","false"].includes(e)&&Boolean(t)}case"tree":{if("custom"===t)return"custom";if("boolean"==typeof t)return t?"on":"off";const e=String(t||"").trim().toLowerCase();return["custom","on","off"].includes(e)?e:["yes","activated","enabled","true"].includes(e)?"on":["no","disabled","false"].includes(e)?"off":e||"off"}case"sipPriority":return"mana"===String(t||"").trim().toLowerCase()?"mana":"health";default:return toNumberMaybe(t)}},createServersideContext=({affModel:e,defModel:t,balanceModel:a,systemModel:n,trackables:s,cureTable:i={},now:o})=>{const l=n.getRoom().items||{};let c=null;const getSortedActiveAffs=()=>(null===c&&(c="function"==typeof e.currentSorted?e.currentSorted():[]),c),u=new Map,isTarget=e=>Array.isArray(e)?e.some(e=>isTarget(e)):"function"==typeof n.isTarget&&n.isTarget(e);return{haveAff:t=>e.haveAff(t),haveAffs:(t=[])=>e.haveAffs(t),haveAnAff:(t=[])=>e.haveAnAff(t),affCount:t=>Number(e.get?.(t)?.count||0),cureAffCount:t=>{const a=String(t||"");if(u.has(a))return u.get(a);const n=i?.[a]?.order;let s=0;if(Array.isArray(n))for(const i of n)e.haveAff(i)&&(s+=1);return u.set(a,s),s},affElapsed:t=>e.elapsed(t),sortedActiveAffs:getSortedActiveAffs,haveDef:e=>t.haveDef(e),haveDefs:(e=[])=>e.every(e=>t.haveDef(e)),haveADef:(e=[])=>e.some(e=>t.haveDef(e)),haveBal:e=>a.have(e),haveBals:(e=[])=>e.every(e=>a.have(e)),haveABal:(e=[])=>e.some(e=>a.have(e)),balElapsed:e=>a.elapsed(e),suspendCuring:(e={})=>({...e&&"object"==typeof e?e:{},suspendCuring:!0}),trackableElapsed:e=>{const t=s[e];return t?.have?o()-t.since:Number.POSITIVE_INFINITY},roomHasItem:e=>Boolean(l[e]),isTarget,isClass:e=>n.isClass(e)}},buildCountablePriorityDefaults=e=>"function"!=typeof e.getCountablePriorityNames?{}:e.getCountablePriorityNames().reduce((e,t)=>(e[t]=0,e),{}),normalizeServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26?t:0},isServersideAffPriorityNumber=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},canonicalAffPriority=e=>{const t=normalizeServersideAffPriority(e);return 26===t?0:t},buildBaselineAffPriorities=e=>({...e.list().reduce((t,a)=>(t[a]=normalizeServersideAffPriority(e.getPriority(a)),t),{}),...buildCountablePriorityDefaults(e)}),buildObservedAffPriorities=e=>({...e.list().reduce((e,t)=>(e[t]=0,e),{}),...buildCountablePriorityDefaults(e)}),buildBaselineDefPriorities=(e,t="")=>e.list().reduce((a,n)=>{const s=e.get(n);return!s?.serverside||s.static?a:e.isAvailableForClass(n,t)?(a[n]=e.getPriority(n),a):a},{}),buildObservedDefPriorities=(e,t="")=>e.list().reduce((a,n)=>e.get(n)?.serverside&&e.isAvailableForClass(n,t)?(a[n]=0,a):a,{}),buildBaselineCurePriorities=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Number(a.prio||0),e),{}),mergeWithResets=(e,t={})=>{const a={...e};return Object.entries(t).forEach(([t,n])=>{a[t]="RESET"!==n?n:e[t]}),a},createInitialServersideState=({baselineSettings:e,affModel:t,defModel:a,systemModel:n,cureTable:s})=>{const i=n?.getClass?.()||"",o=buildBaselineAffPriorities(t),l=buildBaselineDefPriorities(a,i),c=buildBaselineCurePriorities(s);return{baseline:{settings:{...e},affPriorities:o,defPriorities:l,curePriorities:c},sessionBaseline:{settings:{...e},affPriorities:{...o},defPriorities:{...l},curePriorities:{...c}},derived:{},desired:{},observed:{settings:{...e},affPriorities:buildObservedAffPriorities(t),defPriorities:buildObservedDefPriorities(a,i),curePriorities:buildBaselineCurePriorities(s),prioAff:null,manualQueue:[],predictions:{},prioritySet:""},pending:new Map,capture:{affPriorities:null,defPriorities:null,prioritySet:""},transient:{prioAff:null,manualQueue:[],predictions:{},predictionCommands:[],predictionRequests:[],staticDefRequests:{},fullPriorityReset:!1},diagnostics:{lastCommands:[],lastReasons:[],desyncCounter:0,recoveryCounter:0,commandRepeatCounter:0},curingsets:{sets:[],activeSet:"",priorSet:"",used:0,limit:0},startup:{flags:{status:!1,affPriorities:!1,defPriorities:!1,queue:!1,predictions:!1,curingsets:!1}},lastDiffCommands:[],rules:[],dirty:!0}},createCuringSetProvisioner=({adapter:e,serverside:t,dispatchCommands:a,setRuntimePhase:n=()=>{},publishStartupPhase:s=()=>{},options:i={}}={})=>{const o=`echo SystemEvent ${oe.CURINGSET_READY}`,l=Math.max(50,Number(i.curingSetProvisionTimeoutMs??i.startupTimeoutMs??1e3)),c=Math.max(1,Number(i.maxCuringSetProvisionAttempts??4));let u=!1,d=0,m=!1,p=null,g={onReady:()=>{},onAbort:()=>{}};const clearTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},settle=()=>{u=!1,clearTimer()},finishReady=()=>{const{onReady:e}=g;settle(),e({createdThisRun:m})},finishAbort=e=>{const{onAbort:t}=g;settle(),t(e)},sendProbe=(t,n)=>{clearTimer(),d+=1,a([...t,"curingset list",o],{source:"curingset-provision",reason:n,attempt:d}),p=e?.setTimeout?.(()=>{u&&finishAbort(`nexSys4 could not confirm its curing set within ${l}ms (no response from the game). Reload to retry.`)},l)},handleBarrier=()=>{if(!u)return;clearTimer();const e=t.getCuringSets?.()??{},a=(e.sets||[]).map(e=>normalizeSetName(e)),n=normalizeSetName(e.activeSet),s=Number(e.used||0),i=Number(e.limit||0),o=a.includes(ue);"nexsys4-default"!==n?d>=c?finishAbort(`nexSys4 could not secure its curing set after ${c} attempts. Reload to retry.`):o?sendProbe([`curingset switch ${ue}`],"switch"):i>0&&s>=i?finishAbort(`nexSys4 needs its own curing set but all ${i} slots are full. Delete a set or CURINGSET EXPAND (25cr), then reload.`):(m=!0,sendProbe([`curingset new ${ue}`,`curingset switch ${ue}`],"create")):finishReady()};return{start({onReady:e=()=>{},onAbort:t=()=>{}}={}){g={onReady:e,onAbort:t},u=!0,d=0,m=!1,n(ie.PROVISIONING_CURINGSET),s("provision-curingset"),sendProbe([],"list")},handleBarrier,wasCreatedThisRun:()=>m,isActive:()=>u,dispose(){settle()}}},de=Object.freeze({STARTED:"nexSys.start(): startup initiated.",ALREADY_STARTED:"nexSys.start(): runtime is already started.",STARTUP_PENDING:"nexSys.start(): runtime is already started; startup is still in progress.",STARTUP_FAILED:"nexSys.start(): runtime startup failed. Check the console and in-game notices.",SEPARATOR_PROBE:"nexSys.start(): command separator unknown; sending config to auto-detect. Startup will resume on capture."}),me=Object.freeze(["config","more","more"]),createRuntimeStartupOrchestrator=({adapter:e,systemModel:t,persistenceApi:a,startup:n,curingSetProvisioner:s,noticeCenter:i,syncDebugMode:o,isStarted:l,markStarted:c,setRuntimePhase:u,publishStartupPhase:d,attachEventWiring:m,promptPresenter:p,publishRuntimeStarted:g,hydrateCacheFromAdapterGmcp:h,commandDispatcher:b,debugOverride:y})=>{let v=null;const continueStartup=()=>{c(),u(ie.BOOTING,{startupFailureMessage:""}),d("init"),g(),m(),p.start(),h(),s.start({onReady:()=>{n.requestSnapshots(b.sendCommands)},onAbort:e=>{n.fail(e,{source:"curingset-provision"})}})};return{dispose(){v&&(v(),v=null),s?.dispose?.()},start(){if(l()){const e=t.getRuntime().phase;return e===ie.FAILED?de.STARTUP_FAILED:e===ie.RUNNING?de.ALREADY_STARTED:de.STARTUP_PENDING}if(v)return de.SEPARATOR_PROBE;t.setSettings({commandSeparator:void 0},{setBaseline:!0}),a.loadPersistence(),void 0!==y&&t.setSettings({debug:Boolean(y)},{setBaseline:!0}),n.reset();const s=normalizeCommandSeparator(t.getSettings().commandSeparator),c=normalizeCommandSeparator(e.getCommandSeparator()),m=s||c;return o(),m?(t.getSettings().commandSeparator!==m&&t.setSettings({commandSeparator:m},{setBaseline:!0}),c!==m&&e.setSeparator?.(m),continueStartup(),de.STARTED):(u(ie.PROBING_SEPARATOR),d("separator-probe"),i.publish("output","Command separator not configured. Sending config to auto-detect...",{source:"separator-probe"}),v=e.addOnceTrigger({id:"nexsys4-separator-probe",regex:/\bCommandSeparator\s+(?<sep>\S+)/,action:({args:a,client:n})=>{const s=normalizeCommandSeparator(String(a.groups?.sep||"").trim());s&&(n?.current_block?.forEach(e=>{e.gag=!0}),v=null,e.setSeparator(s),t.setSettings({commandSeparator:s},{setBaseline:!0}),continueStartup())}}),me.forEach(t=>{e.send([t],{source:"separator-probe"})}),de.SEPARATOR_PROBE)}}},pe=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],ge="nexsys4.parsed_gmcp_vitals",hasOwn$6=(e,t)=>Boolean(e)&&Object.prototype.hasOwnProperty.call(e,t),parseNumericVital=(e,t)=>{if(!hasOwn$6(e,t))return;const a=toNumber(e[t],NaN);return Number.isFinite(a)?a:void 0},parseResourceStat=e=>{const[t,a]=String(e).split(":");if(!t||void 0===a)return null;const n=t.trim().toLowerCase(),s=a.trim();if(!n)return null;const i=toNumber(s.endsWith("%")?s.slice(0,-1):s,NaN),o=toOptionalBooleanFromYesNo(s);return{key:n,value:Number.isFinite(i)?i:s,balanceState:Number.isFinite(i)?void 0:o}},toBalancePatches=(e={})=>Object.entries(e).filter(([,e])=>void 0!==e).map(([e,t])=>({id:e,have:t})),parseGmcpVitals=(e={})=>{const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},a=pe.reduce((e,a)=>({...e,[a]:parseNumericVital(t,a)}),{}),n={balance:toOptionalBooleanFromYesNo(t.bal),equilibrium:toOptionalBooleanFromYesNo(t.eq)};return{kind:ge,vitals:a,balances:n,balancePatches:toBalancePatches(n),resourceStats:(Array.isArray(t.charstats)?t.charstats:[]).map(parseResourceStat).filter(Boolean)}},toParsedGmcpVitals=(e={})=>"nexsys4.parsed_gmcp_vitals"!==e?.kind?parseGmcpVitals(e):{...e,balancePatches:Array.isArray(e.balancePatches)?e.balancePatches:toBalancePatches(e.balances||{})},hasOwn$5=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),isRecord$3=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),readFirstDefined=(e,t=[])=>{for(const a of t)if(hasOwn$5(e,a)&&void 0!==e[a]&&null!==e[a])return e[a]},parseAffName=(e={})=>{if("string"==typeof e)return e.toLowerCase();if(Array.isArray(e)){const t=e[0];if("string"==typeof t)return t.toLowerCase();const a=t&&"object"==typeof t?t:{};return String(a.affliction||a.defence||a.name||a.aff||a.def||"").toLowerCase()}const t=e&&"object"==typeof e?e:{};return String(t.affliction||t.defence||t.name||t.aff||t.def||"").toLowerCase()},parseRoomItems=(e={})=>Array.isArray(e?.items)?e.items.reduce((e,t)=>{const a=String(t?.name||t?.item||"").trim();return a?(e[a]=(e[a]||0)+1,e):e},{}):e?.items&&"object"==typeof e.items?{...e.items}:{},normalizeItemLocation$2=(e={},t=e?.item||e)=>String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),normalizeInventoryDeltaName=e=>"string"==typeof e?e:e?.name||e?.item||"",createInventoryDelta=(e,t={})=>{const a=t?.item||t,n=normalizeItemLocation$2(t,a);return{location:n,inventoryDelta:{id:a?.id??t?.id,location:n,name:normalizeInventoryDeltaName(a),icon:a?.icon??null,attrib:a?.attrib??null,amount:a?.amount??a?.count??a?.qty??t?.amount??t?.count,delta:a?.delta??t?.delta,action:e.split(".").pop(),direction:e.endsWith("remove")?"remove":e.endsWith("add")?"add":void 0},dirtyReason:`gmcp:${e}`}},hasInventoryIdentity=(e={})=>void 0!==e.id&&null!==e.id&&""!==e.id||Boolean(String(e.name||"").trim()),normalizeTargetRecord=(e={})=>{if(!isRecord$3(e))return{};const t={},a=readFirstDefined(e,["id","ID"]),n=readFirstDefined(e,["Text","text","short_desc"]),s=readFirstDefined(e,["HP","hp","hpperc"]);return void 0!==a&&(t.id=a),void 0!==n&&(t.text=n),void 0!==s&&(t.hp=s),t},createGmcpApplier=({emit:e=()=>{}}={})=>{const translate=(e={})=>{const t=[],emitTranslated=(e,a)=>{t.push({topic:e,payload:a})},a=normalizeTag(e.tag||e.rawTag||e.gmcp_method),n=e.payload;switch(a){case"char.vitals":emitTranslated(re.CHAR_VITALS,{vitals:parseGmcpVitals(n||{})});break;case"char.status":emitTranslated(re.CHAR_STATUS,{status:n||{}});break;case"char.afflictions.list":emitTranslated(re.CHAR_AFFLICTIONS_LIST,{afflictions:Array.isArray(n)?n:[]});break;case"char.afflictions.add":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_AFFLICTIONS_ADD,{name:e});break}case"char.afflictions.remove":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_AFFLICTIONS_REMOVE,{name:e});break}case"char.defences.list":emitTranslated(re.CHAR_DEFENCES_LIST,{defences:Array.isArray(n)?n:[]});break;case"char.defences.add":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_DEFENCES_ADD,{name:e});break}case"char.defences.remove":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_DEFENCES_REMOVE,{name:e});break}case"ire.rift.list":emitTranslated(re.IRE_RIFT_LIST,{rift:n||{}});break;case"ire.rift.change":emitTranslated(re.IRE_RIFT_CHANGE,{change:n||{}});break;case"char.items.list":emitTranslated(re.CHAR_ITEMS_LIST,{location:normalizeItemLocation$2(n),items:Array.isArray(n?.items)?n.items:[]});break;case"char.items.add":case"char.items.remove":case"char.items.update":{const e=createInventoryDelta(a,n||{}),t=hasInventoryIdentity(e.inventoryDelta)?e.inventoryDelta:null;emitTranslated(re.CHAR_ITEMS_DELTA,{inventoryDelta:t,dirtyReason:e.dirtyReason});break}case"room.info":emitTranslated(re.ROOM_INFO,{room:n||{},roomItems:parseRoomItems(n||{})});break;case"ire.target.info":emitTranslated(re.TARGET_INFO,{target:normalizeTargetRecord(n||{})})}return t};return{translate,apply(t){translate(t).forEach(({topic:t,payload:a})=>{e(t,a)})}}},fe=Object.freeze({inv:se.ITEM_INV_LIST,room:se.ITEM_ROOM_LIST}),he=Object.freeze({inv:Object.freeze({add:se.ITEM_INV_ADDED,remove:se.ITEM_INV_REMOVED,update:se.ITEM_INV_UPDATED}),room:Object.freeze({add:se.ITEM_ROOM_ADDED,remove:se.ITEM_ROOM_REMOVED,update:se.ITEM_ROOM_UPDATED})}),normalizeItemLocation$1=e=>String(e||"").trim().toLowerCase()||"inv",createItemTopicNotifier=({publishPublic:e=()=>{}}={})=>{const notifyList=(t,a)=>{const n=fe[normalizeItemLocation$1(t)];n&&e(n,{location:normalizeItemLocation$1(t),items:Array.isArray(a)?a:[]})},notifyDelta=t=>{const a=normalizeItemLocation$1(t.location),n=String(t.action||t.direction||"").trim().toLowerCase(),s=he[a]?.[n];s&&e(s,t)};return{notify({topic:e,payload:t}={}){e!==re.CHAR_ITEMS_DELTA?e===re.CHAR_ITEMS_LIST&&notifyList(t?.location,t?.items):t?.inventoryDelta&&notifyDelta(t.inventoryDelta)}}},be=Object.freeze(["physical","aoe","mental","arcane"]),ye="avoid",avoidDefId=e=>`avoid ${e}`,normalizeType=e=>String(e||"").trim().toLowerCase(),applyAvoidPostureShift=({defModel:e,balanceModel:t,type:a,source:n="text-avoid-shift"})=>{const s=normalizeType(a);if(!be.includes(s))return!1;const i=avoidDefId(s);return be.forEach(t=>{const a=avoidDefId(t);a!==i&&e.get(a)?.have&&e.setHave(a,!1,n)}),e.setHave(i,!0,n),t.lose(ye,`shift:${s}`),!0},applyAvoidPostureRecovered=({balanceModel:e,source:t="posture-ready"})=>e.gain(ye,t),applyAvoidPostureBlocked=({balanceModel:e,source:t="posture-blocked"})=>!!e.have(ye)&&e.lose(ye,t),fallbackClone=(e,t=new WeakMap)=>{if(null==e)return e;if("object"!=typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){const a=[];return t.set(e,a),e.forEach(e=>a.push(fallbackClone(e,t))),a}if(e instanceof Set){const a=new Set;return t.set(e,a),[...e].forEach(e=>a.add(fallbackClone(e,t))),a}if(e instanceof Map){const a=new Map;return t.set(e,a),[...e.entries()].forEach(([e,n])=>{a.set(fallbackClone(e,t),fallbackClone(n,t))}),a}const a={};return t.set(e,a),Object.entries(e).forEach(([e,n])=>{"function"!=typeof n&&(a[e]=fallbackClone(n,t))}),a},deepClone$1=e=>{if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return fallbackClone(e)}},deepMerge=(e,t)=>{const a=Array.isArray(e)?[...e]:{...e||{}};return Object.entries(t||{}).forEach(([e,t])=>{!t||"object"!=typeof t||Array.isArray(t)||!a[e]||"object"!=typeof a[e]||Array.isArray(a[e])?a[e]=t:a[e]=deepMerge(a[e],t)}),a},deepFreeze=e=>e&&"object"==typeof e?(Object.isFrozen(e)||(Object.freeze(e),Object.keys(e).forEach(t=>deepFreeze(e[t]))),e):e,createSnapshotCache=({getVersion:e=()=>0,buildSnapshot:t=()=>({})}={})=>{let a=NaN,n=null;return()=>{const s=e();return n&&a===s||(a=s,n=deepFreeze(t())),n}},ve=Object.freeze(["head","torso","leftarm","rightarm","leftleg","rightleg"]),Se=Object.freeze({healthy:0,damaged:1,broken:2,mangled:3}),xe=new Set(Object.keys(Se)),Ce=Object.freeze({head:"head",torso:"torso",leftarm:"leftarm",rightarm:"rightarm",leftleg:"leftleg",rightleg:"rightleg"}),ke={brokenleftarm:{limb:"leftarm",stage:"broken"},brokenrightarm:{limb:"rightarm",stage:"broken"},brokenleftleg:{limb:"leftleg",stage:"broken"},brokenrightleg:{limb:"rightleg",stage:"broken"},damagedhead:{limb:"head",stage:"damaged"},damagedleftarm:{limb:"leftarm",stage:"damaged"},damagedrightarm:{limb:"rightarm",stage:"damaged"},damagedleftleg:{limb:"leftleg",stage:"damaged"},damagedrightleg:{limb:"rightleg",stage:"damaged"},mangledhead:{limb:"head",stage:"mangled"},mangledleftarm:{limb:"leftarm",stage:"mangled"},mangledrightarm:{limb:"rightarm",stage:"mangled"},mangledleftleg:{limb:"leftleg",stage:"mangled"},mangledrightleg:{limb:"rightleg",stage:"mangled"},mildtrauma:{limb:"torso",stage:"damaged"},serioustrauma:{limb:"torso",stage:"mangled"}},normalizeLimbId=e=>{const t=String(e||"").trim().toLowerCase().replace(/\s+/g,"");return Ce[t]||t},buildAfflictionStageSnapshot=(e=[])=>{const t=ve.reduce((e,t)=>(e[t]="healthy",e),{});return e.forEach(e=>{const a=ke[String(e||"").trim().toLowerCase()];if(!a)return;const n=t[a.limb]||"healthy";(Se[a.stage]??0)>(Se[n]??0)&&(t[a.limb]=a.stage)}),t},createLimbModel=({now:e=Date.now,setTimeoutFn:t,clearTimeoutFn:a,damageResetMs:n=18e4}={})=>{const s=new Set;let i=0;const o=new Map,l=new Map,c=ve.reduce((t,a)=>(t[a]={id:a,percent:0,hits:0,stage:"healthy",updatedAt:e()},t),{}),emit=(e,t)=>{i+=1,t?.limb&&o.set(t.limb,(o.get(t.limb)??0)+1),s.forEach(a=>a(e,t))},cancelResetTimer=e=>{const t=l.get(e);null!=t&&(a(t),l.delete(e))},scheduleResetTimer=a=>{cancelResetTimer(a);const s=t(()=>{l.delete(a);const t=c[a];!t||t.percent<=0||(t.percent=0,t.hits=0,t.updatedAt=e(),emit("LimbDecay",{limb:a,value:deepClone$1(t)}))},n);l.set(a,s)},buildEntrySnapshot=(e={})=>({id:e.id,percent:e.percent,hits:e.hits,stage:e.stage,updatedAt:e.updatedAt}),u=new Map,getEntrySnapshot=e=>c[e]?(u.has(e)||u.set(e,createSnapshotCache({getVersion:()=>o.get(e)??0,buildSnapshot:()=>buildEntrySnapshot(c[e])})),u.get(e)()):null,d=createSnapshotCache({getVersion:()=>i,buildSnapshot:()=>ve.reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),setStage=(t,a,n="manual")=>{const s=normalizeLimbId(t),i=String(a||"").trim().toLowerCase();if(!c[s]||!xe.has(i))return!1;if(c[s].stage===i)return!1;const o=c[s],l=o.stage;return o.stage=i,o.percent=0,o.hits=0,o.updatedAt=e(),cancelResetTimer(s),emit("LimbStageChanged",{limb:s,stage:i,previousStage:l,source:n,value:deepClone$1(o)}),!0},applyAfflictionTransition=(e,t)=>{const a=ke[String(e||"").toLowerCase()];return!!a&&(t?(setStage(a.limb,a.stage,"affliction"),!0):"damaged"===a.stage?(setStage(a.limb,"healthy","affliction"),!0):"mangled"===a.stage?(setStage(a.limb,"damaged","affliction"),!0):"broken"===a.stage&&(setStage(a.limb,"healthy","affliction"),!0))},syncFromAfflictions=(e=[],t="affliction-list")=>{const a=buildAfflictionStageSnapshot(e);return ve.reduce((e,n)=>a[n]===c[n].stage?e:setStage(n,a[n],t)||e,!1)};return{onChange:e=>(s.add(e),()=>s.delete(e)),list:()=>[...ve],snapshot:()=>d(),hit:(t,a,n="manual")=>{const s=normalizeLimbId(t),i=Number(a);if(!c[s]||!Number.isFinite(i)||i<=0)return!1;const o=c[s],l=o.stage;o.percent=Math.max(0,o.percent+i),o.hits+=1,o.updatedAt=e();let u=null;return"healthy"===o.stage&&o.percent>=100?(o.stage="damaged",o.percent=0,o.hits=0,u="damaged",cancelResetTimer(s)):"damaged"===o.stage&&o.percent>=100?(o.stage="mangled",o.percent=0,o.hits=0,u="mangled",cancelResetTimer(s)):scheduleResetTimer(s),emit("LimbHit",{limb:s,amount:i,source:n,transition:u,previousStage:l,value:deepClone$1(o)}),u&&emit("LimbStageChanged",{limb:s,stage:o.stage,previousStage:l,source:n,value:deepClone$1(o)}),!0},reset:(t,a="manual")=>{const n=normalizeLimbId(t);if(!c[n])return!1;const s=c[n],i=s.stage;return(0!==s.percent||0!==s.hits||"healthy"!==i)&&(s.percent=0,s.hits=0,s.stage="healthy",s.updatedAt=e(),cancelResetTimer(n),emit("LimbReset",{limb:n,source:a,previousStage:i,value:deepClone$1(s)}),"healthy"!==i&&emit("LimbStageChanged",{limb:n,stage:"healthy",previousStage:i,source:a,value:deepClone$1(s)}),!0)},setStage,applyAfflictionTransition,syncFromAfflictions,dispose(){ve.forEach(cancelResetTimer)},get:e=>getEntrySnapshot(normalizeLimbId(e))}},buildLimbSnapshot=(e,t)=>{const a=e?.get?.(t);return a?{id:a.id,percent:a.percent,hits:a.hits,stage:a.stage}:null},didLimbChange=(e,t)=>Boolean(e&&t)&&(e.percent!==t.percent||e.hits!==t.hits||e.stage!==t.stage),syncTorsoTrauma=({affModel:e,serverside:t,stage:a,source:n,at:s})=>{switch(a){case"damaged":return e?.lose?.("serioustrauma",{source:n,at:s}),e?.got?.("mildtrauma",{source:n,at:s}),t?.removePrediction?.("serioustrauma"),t?.addPrediction?.("mildtrauma"),!0;case"mangled":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.got?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.addPrediction?.("serioustrauma"),!0;case"healthy":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.lose?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.removePrediction?.("serioustrauma"),!0;default:return!1}},buildObserveResult=(e,t,a,n=!1)=>({changed:didLimbChange(t,a)||n,traumaSynced:n,stageChanged:t?.stage!==a?.stage,limb:e,before:t,after:a}),applyObservedLimbHit=({limbModel:e,affModel:t,serverside:a,limb:n,amount:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return{changed:!1,traumaSynced:!1,stageChanged:!1,limb:l,before:null,after:null};e.hit(l,s,i);const u=buildLimbSnapshot(e,l),d=didLimbChange(c,u),m=c.stage!==u?.stage,p=!("torso"!==l||!m)&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o});return{changed:d||p,traumaSynced:p,stageChanged:m,limb:l,before:c,after:u}},applyObservedLimbReset=({limbModel:e,affModel:t,serverside:a,limb:n,source:s="manual",at:i})=>{const o=normalizeLimbId(n),l=buildLimbSnapshot(e,o);return l?(e.reset(o,s),buildObserveResult(o,l,buildLimbSnapshot(e,o),"torso"===o&&syncTorsoTrauma({affModel:t,serverside:a,stage:"healthy",source:s,at:i}))):{changed:!1,traumaSynced:!1,stageChanged:!1,limb:o,before:null,after:null}},applyObservedLimbStage=({limbModel:e,affModel:t,serverside:a,limb:n,stage:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return{changed:!1,traumaSynced:!1,stageChanged:!1,limb:l,before:null,after:null};e.setStage(l,s,i);const u=buildLimbSnapshot(e,l),d=c.stage!==u?.stage,m=!("torso"!==l||!d)&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o});return{changed:didLimbChange(c,u)||m,traumaSynced:m,stageChanged:d,limb:l,before:c,after:u}},Ae=new Set(["char.items.add","char.items.remove","char.items.update"]),registerAdapterEvents=({register:e,options:t,queueTranslatedGmcp:a,publishPublic:n,publishPublicScoped:s,markDirty:i,flushCycle:o,outputCycle:l,startup:c,curingSetProvisioner:u,curingSetGuard:d,curingMasterSwitch:m,queueController:p,serverside:g,balanceModel:h,defModel:b,adapter:y,systemModel:v,affModel:S,cacheModel:x,limbModel:C,savePersistence:k})=>{e("GmcpEvent",e=>{a(e);const s=normalizeTag(e?.tag||e?.rawTag||e?.gmcp_method);!0===t.publishRawGmcp&&n(se.RAW_GMCP,{source:"adapter-gmcp",tag:s,payload:e?.payload??e?.gmcp_args??null}),Ae.has(s)||i("gmcp-buffered")}),e("PromptEvent",()=>o("prompt")),e("ForcePopulateEvent",()=>o("force")),e("SystemOutputCompleteEvent",()=>{l.markComplete()&&o("output-complete")}),e(oe.CURINGSET_READY,()=>{u?.handleBarrier()}),e(oe.STARTUP_BEGIN,()=>{c.handleFenceBegin()}),e(oe.STARTUP_COMPLETE,()=>{c.handleFenceComplete("snapshot:complete:text")}),e("QueueFiredTextEvent",e=>{e?.queueName&&p.acknowledgeFired(e.queueName)}),e("QueueSentTextEvent",e=>{const t=e?.queueId||e?.queueName||e?.queueType;t&&p.acknowledgeSent(t,e)}),e("AllQueuesClearedTextEvent",()=>{p.listQueues().forEach(e=>{p.clear(e)})}),e("CommandSeparatorChangedTextEvent",({separator:e}={})=>{const t=normalizeCommandSeparator(e);t&&(y?.setSeparator(t),v?.setSettings({commandSeparator:t},{setBaseline:!0}),k?.())}),e("CharacterResourceTextEvent",(e={})=>{const t=String(e.key||"").trim().toLowerCase();t&&v?.updateResource?.(t,e.value,{numeric:!0,min:e.min,max:e.max,source:e.source||"text-trigger"})&&i(`text:resource:${t}`)}),e("BalanceStateTextEvent",e=>{const t=String(e?.id||"").trim().toLowerCase();if(!t)return;const a=String(e?.reason||e?.source||"text"),n=Number(e?.durationSeconds);if(!0!==e?.have){if(!1===e?.have){if(Number.isFinite(n)&&n>0)return void h.observeServerUse(t,n,{source:a});h.lose(t,a)}}else h.gain(t,a)}),e("AvoidPostureShiftedTextEvent",e=>{applyAvoidPostureShift({defModel:b,balanceModel:h,type:e?.type})&&i(`text:avoid:${String(e?.type||"").toLowerCase()}`)}),e("AvoidPostureRecoveredTextEvent",()=>{applyAvoidPostureRecovered({balanceModel:h})}),e("AvoidPostureBlockedTextEvent",()=>{applyAvoidPostureBlocked({balanceModel:h})}),e("CacheRiftOutTextEvent",(e={})=>{const t=x?.observeRiftOutText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-out:${t.name}`)}),e("CacheRiftInTextEvent",(e={})=>{const t=x?.observeRiftInText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-in:${t.name}`)}),e("CacheRiftFullTextEvent",(e={})=>{const t=x?.invalidateRiftSnapshot?.({source:e.source||"text-trigger"});y?.sendGmcp?.(["IRE.Rift.Request"],{source:"cache-rift-full-text"}),t&&i("text:cache-rift-resync")}),e("CacheInventoryEmptyTextEvent",(e={})=>{const t=x?.observeInventoryEmptyText?.({item:e.item,source:e.source||"text-trigger"});t?.name&&(i(`text:cache-empty:${t.name}`),y?.sendGmcp?.(["Char.Items.Inv"],{source:"cache-inventory-empty-text",item:e.item||"",name:t.name}))}),e("CacheCurativeConsumedTextEvent",(e={})=>{const t=x?.observeCurativeConsumedText?.({item:e.item,amount:e.amount,source:e.source||"text-trigger"});t?.name&&i(`text:cache-consume:${t.name}`)}),e("CacheInventoryDeltaTextEvent",(e={})=>{const t=x?.observeInventoryDeltaText?.({item:e.item,amount:e.amount,delta:e.delta,source:e.source||"text-trigger"});t?.name&&i(`text:cache-${t.delta>0?"add":"remove"}:${t.name}`)}),e("LimbDamageTextEvent",e=>{const t=applyObservedLimbHit({limbModel:C,affModel:S,serverside:g,limb:e?.limb,amount:e?.amount,source:String(e?.source||"text-trigger"),at:e?.at});t.changed&&"torso"===t.limb&&t.stageChanged&&i(`text-limb-torso:${t.after?.stage||"unknown"}`)}),e("LimbResetTextEvent",e=>{const t=applyObservedLimbReset({limbModel:C,affModel:S,serverside:g,limb:e?.limb,source:String(e?.source||"text-trigger"),at:e?.at});t.changed&&"torso"===t.limb&&i("text-limb-torso:healthy")}),e("ServersideStatusTextEvent",(e={})=>{"enabled"!==String(e.key||"").trim().toLowerCase()?g.parseStatusLine(e):m?.observeConfirmation(Boolean(e.value))}),e("ServersideStatusSnapshotCompleteTextEvent",()=>{g.markStartupCaptured("status")}),e("ServersideAffPrioSnapshotOpenTextEvent",e=>{g.beginObservedAffPrioritySnapshot(e?.set||"")}),e("ServersideAffPrioSnapshotCompleteTextEvent",()=>{g.completeObservedAffPrioritySnapshot()}),e("ServersideDefPrioSnapshotOpenTextEvent",e=>{g.beginObservedDefPrioritySnapshot(e?.set||"")}),e("ServersideDefPrioSnapshotCompleteTextEvent",()=>{g.completeObservedDefPrioritySnapshot()}),e("ServersideAffPrioTextEvent",e=>{if(!e?.aff)return;const t=Number(e.prio),a=g.updateObservedAffPriority(e.aff,t);if("live-confirmation"===e.source){const n="function"==typeof S?.normalizePriorityName?S.normalizePriorityName(e.aff):String(e.aff||"").toLowerCase();s(se.SERVERSIDE_AFF_PRIORITY_SET,{id:n,priority:t,source:"live-confirmation",accepted:a},n)}}),e("ServersideDefPrioTextEvent",e=>{if(!e?.def)return;const t=String(e.def||"").toLowerCase(),a=Number(e.prio),n=g.updateObservedDefPriority(t,a);"live-confirmation"===e.source&&s(se.SERVERSIDE_DEF_PRIORITY_SET,{id:t,priority:a,source:"live-confirmation",accepted:n},t)}),e("ServersideQueueListTextEvent",e=>{g.updateObservedQueue(e?.queue||[])}),e("ServersidePredictionsTextEvent",e=>{g.updateObservedPredictions(e?.predictions||{})}),e("ServersidePredictionConfirmTextEvent",(e={})=>{g.confirmPrediction?.(e.aff)}),e("ServersideCuringSetsTextEvent",e=>{g.observeCuringSets({sets:e?.sets||[],activeSet:e?.activeSet||"",used:e?.used,limit:e?.limit})}),e("ServersideCuringSetSwitchedTextEvent",e=>{d?.handleSwitched({set:e?.set||""})}),e("SnappedGotTrackableEvent",()=>{g.setTrackable("snapTrack",!0,{source:"text",label:"Snapped"}),y.setTimeout(()=>{g.setTrackable("snapTrack",!1,{source:"timer",label:"Snapped"})},8e3)})},Ee={short:{rl:"right leg",ll:"left leg",ra:"right arm",la:"left arm",h:"head",tt:"torso",c:"centre",l:"left",r:"right"},long:{"right leg":"rl","left leg":"ll","right arm":"ra","left arm":"la",head:"h",torso:"tt",centre:"c",left:"l",right:"r"}},_e=["e","w","s","n","ne","se","sw","nw","in","out","d","u"],we={e:"east",w:"west",s:"south",n:"north",ne:"northeast",se:"southeast",sw:"southwest",nw:"northwest",in:"in",out:"out",down:"down",d:"down",u:"up",up:"up"},Te={e:"west",w:"east",s:"north",n:"south",ne:"southwest",se:"northwest",sw:"northeast",nw:"southeast",in:"out",out:"in",down:"up",d:"up",u:"down",up:"down"},Pe={east:"e",west:"w",south:"s",north:"n",northeast:"ne",northwest:"nw",southeast:"se",southwest:"sw",in:"in",out:"out",down:"d",up:"up"},Me=["Alchemist","Apostate","Bard","Blademaster","Depthswalker","Dragon","Druid","Infernal","Jester","Magi","Monk","Shikudo","Occultist","Paladin","Pariah","Priest","Psion","Runewarden","Sentinel","Serpent","Shaman","Sylvan","Unnamable","Air Elemental Lord","Earth Elemental Lord","Fire Elemental Lord","Water Elemental Lord"],normalizeClassName=(e="")=>{const t=String(e||"").trim();return t?/\bdragon\b/i.test(t)?"Dragon":Me.find(e=>e.toLowerCase()===t.toLowerCase())||t:""},classesMatch=(e="",t="")=>normalizeClassName(e).toLowerCase()===normalizeClassName(t).toLowerCase(),classListIncludes=(e=[],t="")=>{const a=Array.isArray(e)?e:e?[e]:[];if(!a.length)return!0;const n=normalizeClassName(t).toLowerCase();return a.some(e=>normalizeClassName(e).toLowerCase()===n)},hasOwn$4=(e,t)=>Object.prototype.hasOwnProperty.call(e||{},t),normalizeCommandList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeStringList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizePrioritySeed=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},normalizeDefenseConfig=(e={})=>{const t=!1!==e.serverside;return deepFreeze({...deepClone$1(e),command:normalizeCommandList(e.command),bals_req:normalizeStringList(e.bals_req),bals_used:normalizeStringList(e.bals_used),blocks:deepClone$1(e.blocks||[]),skills:normalizeStringList(e.skills),opps:normalizeStringList(e.opps),serverside:t,preempt:!0===e.preempt,static:!0===e.static,clientOnly:!0===e.clientOnly,defaultPriority:normalizePrioritySeed(e.defaultPriority)})},createDefEntry=(e,t,a,n)=>({id:e,have:!1,lastChangeAt:0,order:t,seedStatic:a.static,defaultPriority:n,priorityOverride:null,command:a.command,bals_req:a.bals_req,bals_used:a.bals_used,blocks:a.blocks,skills:a.skills,opps:a.opps,serverside:a.serverside,preempt:a.preempt,static:a.static,clientOnly:a.clientOnly}),resolveDefensePriority=(e={})=>null===e.priorityOverride||void 0===e.priorityOverride?Number(e.defaultPriority??-1):Number(e.priorityOverride),matchesClass=(e=[],t="")=>!e||!e.length||(Array.isArray(t)?t.some(t=>classListIncludes(e,t)):classListIncludes(e,t)),isActiveStaticPriority=e=>{const t=Number(e);return Number.isFinite(t)&&t>0},createInitialDefenseState=({defTable:e={},defPrios:t={}}={})=>{const a=Object.keys(e),n={},s={};return a.forEach((a,i)=>{const o=normalizeDefenseConfig(e[a]),l=hasOwn$4(t,a)?normalizePrioritySeed(t[a]):o.defaultPriority;s[a]=l,n[a]=createDefEntry(a,i,o,l)}),{list:a,state:n,defaultPrios:s}},normalizeObservedDefenseId=e=>("string"==typeof e?e:String(e?.name||e?.id||e||"")).toLowerCase().replace(/\s*\(([^)]+)\)/g," $1").trim(),normalizeItemLocation=e=>String(e||"").trim().toLowerCase()||"inv",registerGmcpBridges=({registerGmcpListener:e,systemModel:t,balanceModel:a,affModel:n,defModel:s,cacheModel:i,limbModel:o,serverside:l,adapter:c,markDirty:u})=>{const requestInventoryResync=e=>{c?.sendGmcp?.(["Char.Items.Inv"],{source:e})};e(re.CHAR_VITALS,({vitals:e}={})=>{t.updateVitals(e),a.applyVitals(e),u("gmcp:vitals")}),e(re.CHAR_STATUS,({status:e}={})=>{t.updateStatus(e||{}),u("gmcp:status")}),e(re.CHAR_AFFLICTIONS_LIST,({afflictions:e}={})=>{const t=Array.isArray(e)?e:[];n.applyList(t),"function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted&&o.syncFromAfflictions(n.currentSorted(),"gmcp-list"),u("gmcp:aff-list")}),e(re.CHAR_AFFLICTIONS_ADD,({name:e}={})=>{e&&(n.got(e,{source:"gmcp-add"}),"function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"gmcp-add"):o.applyAfflictionTransition(e,!0),u(`gmcp:aff-add:${e}`))}),e(re.CHAR_AFFLICTIONS_REMOVE,({name:e}={})=>{e&&(n.lose(e,{source:"gmcp-remove"}),"function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"gmcp-remove"):o.applyAfflictionTransition(e,!1),l.getTransientPrioAff()===e&&l.clearPrioAff(),u(`gmcp:aff-remove:${e}`))}),e(re.CHAR_DEFENCES_LIST,({defences:e}={})=>{s.applyList(Array.isArray(e)?e:[],"gmcp-list"),u("gmcp:def-list")}),e(re.CHAR_DEFENCES_ADD,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);if(t){if(t.startsWith("parrying "))for(const e of s.list())e!==t&&e.startsWith("parrying ")&&s.get(e)?.have&&s.setHave(e,!1,"gmcp-parry-implied-remove");s.setHave(t,!0,"gmcp-add"),"mindseye"===t&&requestInventoryResync("cache-visibility-resync:mindseye"),u(`gmcp:def-add:${t}`)}}),e(re.CHAR_DEFENCES_REMOVE,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);t&&(s.setHave(t,!1,"gmcp-remove"),"blindness"===t&&requestInventoryResync("cache-visibility-resync:blindness"),u(`gmcp:def-remove:${t}`))}),e(re.IRE_RIFT_LIST,({rift:e}={})=>{i.observeRiftSnapshot?.(e||{}),u("gmcp:rift-list")}),e(re.IRE_RIFT_CHANGE,({change:e}={})=>{const t=i.observeRiftChange?.(e||{});t?.name&&u(`gmcp:rift-change:${t.name}`)}),e(re.CHAR_ITEMS_LIST,({items:e,location:a}={})=>{const n=normalizeItemLocation(a),s=Array.isArray(e)?e:[];if("inv"===n){i.observeInventorySnapshot?.(s);const toWieldedItem=e=>e?{id:e.id??null,name:String(e.name||""),icon:e.icon||null}:null;t.updateWielded("left",toWieldedItem(s.find(e=>"l"===e.attrib))),t.updateWielded("right",toWieldedItem(s.find(e=>"L"===e.attrib)))}u("gmcp:items-list")}),e(re.CHAR_ITEMS_DELTA,({inventoryDelta:e}={})=>{if(e){const a=normalizeItemLocation(e.location),n="inv"===a||"room"===a?i.observeItemDelta?.(e):null;if(n?.changed&&n.name&&u(`gmcp:room-pickup:${n.name}`),"inv"===a&&"update"===e.action){const{id:a,name:n,icon:s,attrib:i}=e,o=t.getChar().wielded;o.left?.id===a&&"l"!==i&&t.updateWielded("left",null),o.right?.id===a&&"L"!==i&&t.updateWielded("right",null),"l"===i?t.updateWielded("left",{id:a,name:n,icon:s}):"L"===i&&t.updateWielded("right",{id:a,name:n,icon:s})}}}),e(re.ROOM_INFO,({room:e,roomItems:a}={})=>{t.updateRoom(e||{}),t.setRoomItems(a||{}),u("gmcp:room-info")}),e(re.TARGET_INFO,({target:e}={})=>{t.updateTarget(e||{}),u("gmcp:target")})},normalizeBridgeSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),isSystemOutputBalance=(e={})=>"systemoutput"===normalizeBridgeSegment(e?.id),De=Object.freeze(["balance","equilibrium"]),getCounterpartEqbalBalance=e=>{const t=normalizeBridgeSegment(e);return De.includes(t)?"balance"===t?"equilibrium":"balance":null},buildEqbalRecoveredPayload=(e,t={})=>{const a=normalizeBridgeSegment(t?.id),n=getCounterpartEqbalBalance(a);return n&&e?.have?.(a)&&e.have(n)?{...t,id:"eqbal",have:!0,recoveredId:a,balances:{balance:Boolean(e.have("balance")),equilibrium:Boolean(e.have("equilibrium"))}}:null},getRecoveredBalanceSeconds=(e={})=>{const t=Number(e?.durationMs);if(Number.isFinite(t)&&t>0)return t/1e3;const a=Number(e?.lastLostAtMs),n=Number(e?.lastGotAtMs);return Number.isFinite(a)&&Number.isFinite(n)&&n>a?(n-a)/1e3:Number(e?.durationSeconds??e?.baseDurationSeconds)},formatBalanceNotice=(e={})=>{const t=String(e?.id||"").trim(),a=getRecoveredBalanceSeconds(e);return t?!Number.isFinite(a)||a<=0?t:`${t}(${a.toFixed(2)})`:""},isCountableAffliction=(e={})=>Number(e?.max)>1,formatAfflictionNotice=(e={})=>{const t=String(e?.name||"").trim();if(!t)return"";const a=Number(e?.count);return isCountableAffliction(e)&&Number.isFinite(a)?`${t}(${a})`:t},shouldEchoPriorityChange=(e={})=>["manual","public-api"].includes(String(e?.source||"").toLowerCase()),formatPriorityNotice=(e={},t)=>{const a=String(t||"").trim(),n=Number(e?.priority??e?.value),s=normalizeBridgeSegment(e?.domain),i=s&&"keepup"!==s?` (${s})`:!0===e?.static?" (static)":"";return a?Number.isFinite(n)?`${a} ${n}${i}`:`${a}${i}`:""},Re=Object.freeze({RuleAdded:se.RULE_ADDED,RuleRemoved:se.RULE_REMOVED,RuleEnabled:se.RULE_ENABLED,RuleDisabled:se.RULE_DISABLED,RulePackLoaded:se.RULE_PACK_LOADED,RulePackUnloaded:se.RULE_PACK_UNLOADED,RuleOrderChanged:se.RULE_ORDER_CHANGED}),Oe=Object.freeze({hp:{topic:se.SYSTEM_HEALTH_CHANGED,maxKey:"maxhp"},mp:{topic:se.SYSTEM_MANA_CHANGED,maxKey:"maxmp"},rage:{topic:se.SYSTEM_RAGE_CHANGED},bleed:{topic:se.SYSTEM_BLEED_CHANGED}}),buildVitalResourcePayload=(e={},t,{maxKey:a}={})=>{const n=e.changedFields?.[t];if(!n)return null;const s=n.current,i=n.previous;return{max:a?e.current?.[a]:s,current:s,previous:i,diff:s-i}},publishVitalResourceTopics=(e,t={})=>{Object.entries(Oe).forEach(([a,n])=>{const s=buildVitalResourcePayload(t,a,n);s&&e(n.topic,s)})},registerSystemModelBridge=({registerModelListener:e,publishPublic:t,syncDebugMode:a,systemModel:n,serverside:s,handleVitalsSideEffects:i})=>{e(n.onChange((e,n={})=>{switch(e){case"VitalsUpdated":t(se.SYSTEM_VITALS_CHANGED,n),publishVitalResourceTopics(t,n),i();break;case"StatusUpdated":t(se.SYSTEM_STATUS_CHANGED,n);break;case"ClassChanged":s.setBaselineFromRuntime(),t(se.SYSTEM_CLASS_CHANGED,n);break;case"TargetUpdated":t(se.SYSTEM_TARGET_CHANGED,n);break;case"RoomUpdated":t(se.SYSTEM_ROOM_CHANGED,n);break;case"RoomItemsUpdated":t(se.SYSTEM_ROOM_ITEMS_CHANGED,n);break;case"RuntimeStateChanged":t(se.SYSTEM_RUNTIME_CHANGED,n);break;case"PauseStateChanged":t(se.SYSTEM_PAUSE_CHANGED,n),t(n.paused?se.SYSTEM_PAUSED:se.SYSTEM_UNPAUSED,n);break;case"SettingsChanged":n.changedKeys?.includes("debug")&&a(),t(se.SYSTEM_SETTINGS_CHANGED,n);break;case"BaselineIntentChanged":t(se.SYSTEM_BASELINE_CHANGED,n);break;case"WieldedUpdated":t(se.SYSTEM_WIELDED_CHANGED,n);break;case"MountUpdated":t(se.SYSTEM_MOUNT_CHANGED,n);break;case"DeathDetected":t(se.SYSTEM_DEATH_DETECTED,n)}}))},registerAfflictionModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:s,affModel:i,serverside:o})=>{e(i.onChange((e,l={})=>{switch("AffGot"!==e&&"AffLost"!==e||"aeon"!==l?.name||s.setRuntime({aeonLocked:i.haveAff("aeon")}),e){case"AffGot":a(se.AFF_GOT,l,l.name),n.publish("affGot",formatAfflictionNotice(l),{...l,action:"got"});break;case"AffLost":a(se.AFF_LOST,l,l.name),n.publish("affLost",l.name,{...l,action:"lost"}),o.getTransientPrioAff()===l.name&&o.clearPrioAff();break;case"AffStackChanged":{a(se.AFF_STACK_CHANGED,l,l.name);const e=Number(l.count),t=Number(l.previousCount);if(Number.isFinite(e)&&Number.isFinite(t)&&e>0&&t>0&&e!==t){const a=e>t,s=Math.max(e,t);n.publish(a?"affGot":"affLost",formatAfflictionNotice({...l,count:s}),{...l,action:a?"got":"lost"})}break}case"AffPriorityChanged":t(se.AFF_PRIORITY_CHANGED,l),shouldEchoPriorityChange(l)&&n.publish("priority",formatPriorityNotice(l,l.name),{...l,action:"set",subject:"aff"})}}))},registerDefenseModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:s})=>{e(s.onChange((e,s={})=>{switch(e){case"DefGot":a(se.DEF_GOT,s,s.id),n.publish("defGot",s.id,{...s,action:"got"});break;case"DefLost":a(se.DEF_LOST,s,s.id),n.publish("defLost",s.id,{...s,action:"lost"});break;case"DefPriorityChanged":t(se.DEF_PRIORITY_CHANGED,s),shouldEchoPriorityChange(s)&&n.publish("priority",formatPriorityNotice(s,s.id),{...s,action:"set",subject:"def"})}}))},registerBalanceModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:s})=>{e(s.onChange((e,i={})=>{switch(e){case"BalanceGot":a(se.BALANCE_GOT,i,i.id);{const e=buildEqbalRecoveredPayload(s,i);e&&t(se.EQBAL_GOT,e)}isSystemOutputBalance(i)||n.publish("balanceRecovered",formatBalanceNotice(i),{...i,action:"got"});break;case"BalanceLost":a(se.BALANCE_LOST,i,i.id),n.publish("balanceLost",i.id,{...i,action:"lost"});break;case"BalanceReset":a(se.BALANCE_RESET,i,i.id);break;case"BalanceDurationObserved":a(se.BALANCE_DURATION_OBSERVED,i,i.id);break;case"BalanceLossTimerRestarted":t(se.BALANCE_TIMER_RESTARTED,i)}}))},registerLimbModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,limbModel:n})=>{e(n.onChange((e,n={})=>{switch(e){case"LimbHit":a(se.LIMB_HIT,n,n.limb);break;case"LimbReset":a(se.LIMB_RESET,n,n.limb);break;case"LimbStageChanged":a(se.LIMB_STAGE_CHANGED,n,n.limb);break;case"LimbDecay":t(se.LIMB_DECAY,n)}}))},registerCacheModelBridge=({registerModelListener:e,publishPublic:t,cacheModel:a})=>{e(a.onChange((e,a={})=>{switch(e){case"CacheAmountChanged":t(se.CACHE_AMOUNT_CHANGED,a);break;case"CacheInventoryListApplied":t(se.CACHE_INVENTORY_LIST,a);break;case"CacheRiftListApplied":t(se.CACHE_RIFT_LIST,a);break;case"CacheDesiredPrecacheChanged":t(se.CACHE_PRECACHE_CHANGED,a)}}))},registerQueueModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:s})=>{e(s.onChange((e,i={})=>{switch(e){case"QueueFlushed":t(se.QUEUE_FLUSHED,i),n.publish("output",`Queue sent: ${i.queueId}`,i);break;case"QueueDeferred":t(se.QUEUE_DEFERRED,i);break;case"QueueUpdated":t(se.QUEUE_UPDATED,i);break;case"QueueCleared":t(se.QUEUE_CLEARED,i);break;case"QueueSentAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueName||i.queueId;a(se.QUEUE_SENT,{...i,queueName:e},e);break}case"QueueFiredAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueId;t(se.QUEUE_FIRED_ACK,i),a(se.QUEUE_FIRED,{...i,queueName:e},e);break}}}))},registerServersideModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,serverside:s,runtimeControl:i,systemModel:o,onServersideDirty:l})=>{let c=new Set;const syncRuleSuspendPause=(e=[])=>{c=new Set((e||[]).filter(Boolean).map(e=>String(e)));const t=c.size>0;o?.getRuntime?.().rulesSuspended!==t&&(o?.setRuntime?.({rulesSuspended:t}),i?.syncCuringState?.({source:"rule-suspend"}))},addRuleSuspend=e=>{e&&!c.has(String(e))&&syncRuleSuspendPause([...c,String(e)])},removeRuleSuspend=e=>{if(!e||!c.has(String(e)))return;const t=new Set(c);t.delete(String(e)),syncRuleSuspendPause([...t])};e(s.onChange((e,s={})=>{const i=Re[e];if(i)t(i,s);else switch(e){case"TrackableGot":n.publish("trackableGot",s.label||s.name,{...s,action:"got"});break;case"TrackableLost":n.publish("trackableLost",s.label||s.name,{...s,action:"lost"});break;case"ServersideDirty":l?.(s),t(se.SERVERSIDE_DIRTY,s);break;case"ServersideEvaluated":syncRuleSuspendPause(s.suspendingRules||[],s.source),t(se.SERVERSIDE_EVALUATED,s);break;case"RuleSuspendActivated":addRuleSuspend(s.id);break;case"RuleSuspendDeactivated":removeRuleSuspend(s.id);break;case"RuleActivated":s.suspendsCuring&&addRuleSuspend(s.id),a(se.RULE_ACTIVATED,s,s.id);break;case"RuleDeactivated":s.suspendsCuring&&removeRuleSuspend(s.id),a(se.RULE_DEACTIVATED,s,s.id)}}))},registerModelEventBridges=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,syncDebugMode:s,systemModel:i,affModel:o,defModel:l,balanceModel:c,cacheModel:u,limbModel:d,queueController:m,serverside:p,runtimeControl:g,handleVitalsSideEffects:h,onServersideDirty:b})=>{registerSystemModelBridge({registerModelListener:e,publishPublic:t,syncDebugMode:s,systemModel:i,serverside:p,handleVitalsSideEffects:h}),registerAfflictionModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:i,affModel:o,serverside:p}),registerDefenseModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:l}),registerBalanceModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:c}),registerLimbModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,limbModel:d}),registerCacheModelBridge({registerModelListener:e,publishPublic:t,cacheModel:u}),registerQueueModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:m}),registerServersideModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,serverside:p,runtimeControl:g,systemModel:i,onServersideDirty:b})},Ne="Flying above ",Le=new Set(["dragon","air elemental lord","earth elemental lord","fire elemental lord","water elemental lord"]),registerCrossModelBridges=({registerModelListener:e,systemModel:t,defModel:a})=>{e(t.onChange((e,t={})=>{if("RoomUpdated"===e){const e=String(t?.current?.name||"").startsWith(Ne);return void a.setHave("flying",e,"room-info")}"ClassChanged"===e&&Le.has(String(t?.class||"").toLowerCase())&&a.setHave("mounted",!1,"class-change")}))},createRuntimeEventWiring=({adapter:e,internalEvents:t})=>{let a=[];const addUnsubscriber=e=>{"function"==typeof e&&a.push(e)},dispose=()=>{a.forEach(e=>{try{e()}catch(t){console.error("nexSys4 unsubscribe failure",t)}}),a=[]};return{attach:({options:a,queueTranslatedGmcp:n,publishPublic:s,publishPublicScoped:i,noticeCenter:o,syncDebugMode:l,systemModel:c,affModel:u,defModel:d,balanceModel:m,cacheModel:p,limbModel:g,queueController:h,serverside:b,markDirty:y,invalidateOutput:v,flushCycle:S,outputCycle:x,startup:C,curingSetProvisioner:k,curingSetGuard:A,curingMasterSwitch:E,runtimeControl:_,savePersistence:w})=>{dispose();const register=(t,a)=>{addUnsubscriber(e.on(t,a))},registerModelListener=e=>{addUnsubscriber(e)},registerGmcpListener=(e,a)=>{registerModelListener(t.on(e,a))};registerAdapterEvents({register,options:a,queueTranslatedGmcp:n,publishPublic:s,publishPublicScoped:i,markDirty:y,flushCycle:S,outputCycle:x,startup:C,curingSetProvisioner:k,curingSetGuard:A,curingMasterSwitch:E,runtimeControl:_,queueController:h,serverside:b,balanceModel:m,defModel:d,adapter:e,systemModel:c,affModel:u,cacheModel:p,limbModel:g,savePersistence:w}),register("OutboundCommandsEvent",(e={})=>{if("output-cycle"!==e?.context?.source)return;const t=Array.isArray(e.commands)?e.commands.filter(Boolean).map(e=>String(e)):[];if(!t.length)return;const a=c.getSettings().commandSeparator||"|";o.publish("output",`(${t.join(a)})`,{action:"commands",commands:t,source:e?.context?.cycleSource||e?.context?.source||"output-cycle"})}),registerGmcpBridges({registerGmcpListener,systemModel:c,balanceModel:m,affModel:u,defModel:d,cacheModel:p,limbModel:g,serverside:b,adapter:e,markDirty:y}),registerModelEventBridges({registerModelListener,publishPublic:s,publishPublicScoped:i,noticeCenter:o,syncDebugMode:l,systemModel:c,affModel:u,defModel:d,balanceModel:m,cacheModel:p,limbModel:g,queueController:h,serverside:b,runtimeControl:_,handleVitalsSideEffects:_.handleVitalsSideEffects,onServersideDirty:v}),registerCrossModelBridges({registerModelListener,systemModel:c,defModel:d})},dispose}},createRuntimeControlApi=({systemModel:e,serverside:t,queueController:a,noticeCenter:n,markDirty:s,onResume:i,dispatchCommands:o,curingMasterSwitch:l})=>{let c=!1;const buildSystemEventCommand=e=>e?`echo SystemEvent ${e}`:null,syncServersideCuring=(e,t={})=>{if("function"!=typeof o)return[];const a=e?"curing off":"curing on";if(e&&!1===l?.getObservedEnabled())return[];if(!e&&!0===l?.getObservedEnabled())return[];l?.markExpected(a);const n=buildSystemEventCommand(t.completionEvent);return o(n?[a,n]:[a],{source:t.source||(e?"runtime-pause":"runtime-unpause")})},syncCuringState=(t={})=>{const a=e.getRuntime();return syncServersideCuring(a.paused||a.rulesSuspended,t)},setPaused=(t,n={})=>{const o=Boolean(t),l=e.getRuntime();return l.paused===o?(n.forceCuringSync&&syncCuringState(n),!1):!(!o&&!isRuntimeReadyPhase(l.phase))&&(e.setRuntime({paused:o}),s(o?"paused":"unpaused"),syncCuringState(n),o||(a.flushDeferred(),i?.(n.source||"unpause")),!0)},ensureSlowModeRule=()=>{t.lifecycle.add({id:"runtime-slow-mode",pack:"runtime",evaluate:()=>e.getRuntime().slowMode?{settings:{sipHealthAt:30,sipManaAt:20,mossHealthAt:20,mossManaAt:20,batch:!1}}:null})};return{setPaused,syncCuringState,setSlowMode(t){const a=Boolean(t);return e.getRuntime().slowMode!==a&&(e.setRuntime({slowMode:a}),ensureSlowModeRule(),s(a?"slow-on":"slow-off"),!0)},handleVitalsSideEffects(){const t=e.getChar().dead;t&&!c&&(setPaused(!0,{source:"death-detected"}),n.publish("output","Death detected. Pausing nexSys runtime.",{source:"death-detected"})),!t&&c&&(setPaused(!1,{source:"death-recover"}),n.publish("output","Resurrection detected. Resuming nexSys runtime.",{source:"death-recover"})),c=t}}},Ie="curing on",je="curing off",createCuringMasterSwitch=({setPaused:e,noticeCenter:t})=>{let a=null,n=null;return{getObservedEnabled:()=>a,markExpected(e){const t=String(e||"").trim().toLowerCase();return(t===Ie||t===je)&&(n=t,!0)},observeConfirmation(s){const i=Boolean(s);return a=i,n===(i?Ie:je)?(n=null,{attributed:!0,enabled:i}):(n=null,i?e(!1,{source:"user-curing-on"}):(e(!0,{source:"user-curing-off"}),t.publish("output","Manual `curing off` detected. nexSys is paused and will not re-enable curing; send `curing on` to resume.",{source:"user-curing-off"})),{attributed:!1,enabled:i})}}},createCuringSetGuard=({serverside:e,systemModel:t,noticeCenter:a})=>{let n=!1,s=!1;const isRunningSession=()=>isRuntimeReadyPhase(t.getRuntime().phase),markNexsysSwitch=()=>{s=!0},unload=({remove:t=!0}={})=>{const a=e.getCuringSets?.()??{},s=(a.sets||[]).map(e=>normalizeSetName(e)).filter(Boolean),i=normalizeSetName(a.priorSet),o=i&&"nexsys4-default"!==i&&s.includes(i)?i:s.find(e=>e&&"nexsys4-default"!==e)||"",l=[];o&&(markNexsysSwitch(),e.switchCuringSet(o),l.push(`curingset switch ${o}`));const c=t||!o;return c&&(e.deleteCuringSet(ue),l.push(`curingset delete ${ue}`)),n=!1,{restoreTarget:o,removed:c,commands:l}};return{handleSwitched:({set:t}={})=>{const i=normalizeSetName(t);if(!i)return;const o=s;s=!1,e.observeActiveCuringSet?.(i),isRunningSession()&&("nexsys4-default"!==i?o||n||(n=!0,a.publish("output",`nexSys paused — curing set is now ${i}; nexSys operates only in ${ue} and will resume when you switch back.`,{source:"curingset-foreign",force:!0})):n&&(n=!1,a.publish("output",`nexSys resumed — curing set is back to ${ue}.`,{source:"curingset-foreign-resume",force:!0})))},markNexsysSwitch,unload,isForeignPaused:()=>n}},isRecord$2=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),isSupportedPersistenceSchemaVersion=e=>2===Number(e),createEmptyPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:{},affSettings:{defaults:{}},defSettings:{defaults:{},static:{}},cacheSettings:{precache:{}}}),qe=t.z.record(t.z.string(),t.z.unknown()).catch(()=>({})),Be=t.z.object({schemaVersion:t.z.coerce.number().refine(isSupportedPersistenceSchemaVersion),systemSettings:qe,affSettings:t.z.object({defaults:qe}).catch(()=>({defaults:{}})),defSettings:t.z.object({defaults:qe,static:qe}).catch(()=>({defaults:{},static:{}})),cacheSettings:t.z.object({precache:qe}).catch(()=>({precache:{}}))}),normalizePersistenceSnapshot=(e,{assumeCurrentVersion:t=!1}={})=>{const a=t&&isRecord$2(e)&&null==e.schemaVersion?{...e,schemaVersion:2}:e,n=Be.safeParse(a);return n.success?n.data:createEmptyPersistenceSnapshot()},createRuntimePersistenceApi=({persistence:e,systemModel:t,affModel:a,defModel:n,cacheModel:s,serverside:i,syncDebugMode:o,markDirty:l})=>{const c=0,u=26,d={hasStoredSnapshot:!1,sourceKey:e?.key||"nexSys4Settings"},sanitizeSystemSettings=(e={})=>{const{customPromptEnabled:t,prompt:a,...n}=e||{},s=normalizeCommandSeparator(n.commandSeparator);if(s?n.commandSeparator=s:delete n.commandSeparator,n.ss&&"object"==typeof n.ss){const{enabled:e,...t}=n.ss;n.ss=t}return n},normalizePersistedDefPriority=e=>{const t=Number(e);return Number.isInteger(t)?t<c?c:t>u?u:t:c},buildAffDefaultMap=()=>a.list().reduce((e,t)=>(e[t]=a.getDefaultPriority(t),e),{}),countablePriorityNameSet=()=>new Set(a.getCountablePriorityNames?.()||[]),buildDefDefaultMap=()=>Object.entries(n.getDefaultPriorities()).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),buildDefStaticOverrideMap=()=>({...n.getStaticOverrides?.()||{}}),buildCacheDefaultSnapshot=()=>s.getDesiredPrecache(),isValidServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},normalizeStoredAffDefaults=(e={})=>{const t=countablePriorityNameSet();return Object.entries(e).reduce((e,[n,s])=>{const i="function"==typeof a.normalizePriorityName?a.normalizePriorityName(n):String(n||"").trim().toLowerCase();if(!i)return e;if(t.has(i))return e;const o=a.getDefaultPriority(i);return isValidServersideAffPriority(o)&&!isValidServersideAffPriority(s)?(e[i]=o,e):(e[i]=s,e)},{})},normalizeStoredDefPriorities=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),normalizeStoredDefStatics=(e={})=>Object.entries(e).reduce((e,[t,a])=>(!0!==a&&!1!==a||(e[t]=a),e),{}),buildPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:sanitizeSystemSettings(t.getSettings()),affSettings:{defaults:buildAffDefaultMap()},defSettings:{defaults:buildDefDefaultMap(),static:buildDefStaticOverrideMap()},cacheSettings:{precache:buildCacheDefaultSnapshot()}}),applyStoredSnapshot=(e={})=>{const l=sanitizeSystemSettings(e.systemSettings||{});t.setSettings(l,{setBaseline:!0}),t.setBaselineIntent({ss:l.ss||{}});const c=e.affSettings?.defaults;c&&Object.entries(normalizeStoredAffDefaults(c)).forEach(([e,t])=>{a.setDefaultPriority(e,t,"persistence")});const u=normalizeStoredDefStatics(e.defSettings?.static);Object.entries(u).forEach(([e,t])=>{n.setStatic(e,t,"persistence")});const d=normalizeStoredDefPriorities(e.defSettings?.defaults);Object.entries(d).forEach(([e,t])=>{n.setDefaultPriority(e,t,"persistence")}),e.cacheSettings?.precache&&s.setDesiredPrecache(e.cacheSettings.precache),i.setBaselineFromRuntime(),o()},loadStoredSnapshot=()=>"function"==typeof e.read?e.read():{key:e?.key||"nexSys4Settings",exists:!1,snapshot:e.load()};return{buildPersistenceSnapshot,loadPersistence(){const{key:t,exists:a,snapshot:n}=loadStoredSnapshot();return d.hasStoredSnapshot=Boolean(a),d.sourceKey=t||e?.key||"nexSys4Settings",applyStoredSnapshot(n),{key:d.sourceKey,exists:d.hasStoredSnapshot,snapshot:n}},seedBaselineFromObservedStartup({skipObservedAdoption:e=!1}={}){if(d.hasStoredSnapshot)return!1;if(e)return!1;const s=i.getObserved?.()||{},l=sanitizeSystemSettings({ss:s.settings||{}});Object.keys(l).length&&t.setSettings(l,{setBaseline:!0});const c=countablePriorityNameSet();return Object.entries(s.affPriorities||{}).forEach(([e,t])=>{c.has(String(e||"").toLowerCase())||isValidServersideAffPriority(t)&&a.setDefaultPriority(e,t,"startup-observed-baseline")}),Object.entries(s.defPriorities||{}).forEach(([e,t])=>{n.get(e)&&n.setDefaultPriority(e,normalizePersistedDefPriority(t),"startup-observed-baseline")}),i.setBaselineFromRuntime(),o(),!0},savePersistence(){const t=buildPersistenceSnapshot();return e.save(t),i.setBaselineFromRuntime(),l("persistence-save"),t}}},evaluateBlockCondition=(e,t)=>Array.isArray(e)?e.every(e=>t(e)):t(e),isBlocked=(e=[],t)=>e.some(e=>evaluateBlockCondition(e,t)),isActiveDefensePriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=25},createDefensePlanner=({defModel:e,balanceModel:t,affModel:a,systemModel:n})=>({plan:({includeStaticIds:s=[]}={})=>{const i=n.getClass(),o=new Set(s),l=e.list().map(t=>e.get(t)).filter(Boolean).map(t=>({entry:t,priority:e.getPriority(t.id)})).sort((e,t)=>e.priority!==t.priority?e.priority-t.priority:e.entry.order-t.entry.order),c=new Set,u={serverside:[],client:[]};return l.forEach(({entry:n,priority:s})=>{if(!isActiveDefensePriority(s)||c.has(n.id)||n.have)return;if(!e.isAvailableForClass(n.id,i))return;if(n.static&&!o.has(n.id))return;if(isBlocked(n.blocks,e=>a.haveAff(e)))return;if(!n.bals_req.every(e=>t.have(e)))return;n.opps.forEach(e=>c.add(e));const l=n.serverside?u.serverside:u.client;n.command.forEach(e=>{l.push({source:"defense",defense:n.id,command:e,prio:s,serverside:n.serverside,preempt:n.preempt,static:n.static})})}),{serverside:u.serverside,client:u.client,all:[...u.serverside,...u.client]}}}),dedupeCommandIntents=(e=[])=>{const t=new Map,a=[];return e.forEach(e=>{const n=e?.command,s=t.get(n);if(s)return void(!0===e?.requiresCompletion&&(s.requiresCompletion=!0));const i={...e};t.set(n,i),a.push(i)}),a},createOutputPlanner=({systemModel:e,serverside:t,defensePlanner:a,precachePlanner:n})=>({plan({source:s="prompt",injectedCommands:i=[],suppressedServersideCommands:o=[]}={}){const l=e.getRuntime(),c=t.evaluate({emitCommands:!1,source:s}),u=o.length?c.commands.filter(e=>!o.includes(e)):c.commands,d=t.getStaticDefRequests(),m=[];a.plan({includeStaticIds:Object.keys(d)}).client.forEach(e=>m.push(e)),l.slowMode||l.aeonLocked||n.plan().forEach(e=>m.push(e)),u.forEach(e=>{m.push({source:"serverside",command:e,requiresCompletion:!0})}),i.forEach(e=>{m.push({source:"injected",command:e})});const p=dedupeCommandIntents(m);return{intents:p,commands:p.map(e=>e.command),serversideCommands:u}}}),createPrecachePlanner=({cacheModel:e})=>({plan:()=>e.getPrecacheCommands().map(e=>({source:"precache",command:e,requiresCompletion:!0}))}),createQueueState=()=>Object.entries(j).reduce((e,[t,a])=>(e[t]={...deepClone$1(a),id:t,items:[],prepend:[],pending:!1,lastSignature:"",deferred:!1},e),{}),splitCommandValue=(e,t="|")=>{const a=String(t||"|")||"|";return String(e).split(a).map(e=>e.trim()).filter(Boolean)},normalizeCommands=(e,t="|")=>e?Array.isArray(e)?e.flatMap(e=>null==e?[]:splitCommandValue(e,t)).filter(Boolean):splitCommandValue(e,t):[],hasQueuedItems=e=>e.items.length>0||e.prepend.length>0,buildLogicalCommands=e=>[`echo SystemEvent ${e.name}QueueFired`,...e.pre,...e.prepend,...e.items,...e.post].filter(Boolean),clearQueueState=e=>{e.items=[],e.prepend=[],e.pending=!1,e.lastSignature="",e.deferred=!1},resolveQueueId=(e,t)=>{if(e[t])return t;const a=String(t||"").replace(/QueueFired$/i,"").toLowerCase();return Object.keys(e).find(t=>{const n=e[t];return n.name.toLowerCase()===a||n.type.toLowerCase()===a})||null},hasLocalQueueState=(e={})=>(e.items||[]).length>0||(e.prepend||[]).length>0||e.pending||e.deferred||Boolean(e.lastSignature),clearLocalQueueState=e=>{if(!e)return!1;const t=hasLocalQueueState(e);return clearQueueState(e),t},markQueueDeferred=e=>{if(!e)return!1;const t=!e.deferred||!e.pending;return e.deferred=!0,e.pending=!0,t},markQueueAwaitingAck=(e,t)=>{if(!e)return!1;const a=e.lastSignature!==t||!0!==e.pending||!1!==e.deferred;return e.lastSignature=t,e.pending=!0,e.deferred=!1,a},createQueueMutationApi=({state:e,emit:t,flush:a,getSeparator:n,markStateChanged:s=()=>{}})=>{const resolveSeparator=()=>("function"==typeof n?n():"|")||"|",haveSameCommands=(e=[],t=[])=>e.length===t.length&&e.every((e,a)=>e===t[a]),clear=(a,n={})=>{const i=e[a];return!!i&&(!!clearLocalQueueState(i)&&(s(a),t("QueueCleared",{queueId:a,remote:Boolean(n.remote),command:n.command||null}),!0))};return{add(n,i,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(i,resolveSeparator());if(!c.length)return!1;const u=[];if(o.allowDuplicate)u.push(...c);else{const e=new Map;l.items.forEach(t=>{e.set(t,(e.get(t)||0)+1)}),c.forEach(t=>{const a=e.get(t)||0;a>0?e.set(t,a-1):u.push(t)})}return!!u.length&&(l.items.push(...u),s(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},addClear(n,i,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(i,resolveSeparator());return!(!c.length||haveSameCommands(l.items,c))&&(l.items=c,s(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},prepend(n,i,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(i,resolveSeparator());return!!c.length&&(!(!o.allowDuplicate&&c.every(e=>l.prepend.includes(e)))&&(l.prepend.unshift(...c),s(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0))},clear,setPreCommands(a,n=[]){const i=e[a];if(!i)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(i.pre,o)&&(i.pre=o,s(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(i)}),!0)},setPostCommands(a,n=[]){const i=e[a];if(!i)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(i.post,o)&&(i.post=o,s(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(i)}),!0)}}},chunkCommands=(e=[],t=20)=>{const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],n=Math.max(1,Number(t||20)),s=[];for(let i=0;i<a.length;i+=n)s.push(a.slice(i,i+n));return s},chunkCommandsWithTrailing=(e=[],{maxEntries:t=20,trailing:a=[]}={})=>{const n=chunkCommands(e,t),s=chunkCommands(a,t).flat();if(!s.length)return n;if(!n.length)return chunkCommands(s,t);const i=n[n.length-1];return i.length+s.length<=Math.max(1,Number(t||20))?(i.push(...s),n):[...n,...chunkCommands(s,t)]},createQueueFlushApi=({state:e,emit:t,send:a,getRuntimeState:n,getSeparator:s,maxEntriesPerSubmission:i,onQueueFired:o,markStateChanged:l=()=>{}})=>{const buildRemoteClearCommand=e=>`clearqueue ${e.type}`,buildStackPlan=(e=[])=>({type:"stackPlan",commands:e.filter(Boolean).map(e=>String(e))}),markExcludedQueuesCleared=(t=[])=>{t.forEach(t=>{const a=e[t];a&&clearLocalQueueState(a)&&l(t)})},deferQueue=(e,a)=>(markQueueDeferred(a)&&l(e),t("QueueDeferred",{queueId:e,queue:deepClone$1(a)}),[]),flush=(o,c={})=>{const u=e[o];if(!u||!hasQueuedItems(u))return[];const d=n?n():{paused:!1,phase:ie.RUNNING,settings:{}};if(!isRuntimeReadyPhase(d.phase))return deferQueue(o,u);const m=Boolean(d.settings?.queueWhilePaused);if((d.paused||d.rulesSuspended)&&!m)return deferQueue(o,u);const p=buildLogicalCommands(u),g=p.join("");if(!c.force&&g===u.lastSignature)return[];const h=[],b=[];u.exclusions.forEach(t=>{const a=e[t];a&&hasQueuedItems(a)&&(h.push(buildRemoteClearCommand(a)),b.push(t))});const y="function"==typeof s?s():"|",v=chunkCommands(p,Math.max(1,i-h.length)).map((e,t)=>buildStackPlan([`queue ${0===t?"addclear":"add"} ${u.type} ${e.join(y)}`])),S=[];return h.length>0&&S.push(buildStackPlan(h)),S.push(...v),markQueueAwaitingAck(u,g)&&l(o),markExcludedQueuesCleared(b),a(S,{source:"queue-controller",queueId:o,excludedIds:b}),t("QueueFlushed",{queueId:o,plans:S,signature:g}),S};return{flush,clearQueue:n=>{const s=e[n];if(!s)return!1;const i=buildRemoteClearCommand(s);clearLocalQueueState(s)&&l(n),t("QueueCleared",{queueId:n,remote:!0,command:i});const o=[buildStackPlan([i])];return a(o,{source:"queue-controller",queueId:n,remote:!0,action:"clear-queue"}),o},flushDeferred(){const t=[];return Object.keys(e).forEach(a=>{e[a].deferred&&flush(a,{force:!0}).length&&t.push(a)}),t},flushAll(){const t=[];return Object.keys(e).forEach(e=>{const a=flush(e);a.length&&t.push({queueId:e,plans:a})}),t},acknowledgeSent(a,n={}){const s=resolveQueueId(e,a);if(!s)return!1;const i=e[s];return t("QueueSentAcknowledged",{...n,queueId:s,queueType:i?.type||n.queueType||""}),!0},acknowledgeFired(a){const n=resolveQueueId(e,a);if(!n)return!1;const s=e[n],i=s?deepClone$1(s):null;return clearLocalQueueState(e[n])&&l(n),o?.({queueId:n,queue:i}),t("QueueFiredAcknowledged",{queueId:n}),!0}}},createQueueController=({send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n=20,onQueueFired:s}={})=>{const i=new Set,o=createQueueState();let l=0;const c=new Map,markStateChanged=e=>{l+=1,e&&c.set(e,(c.get(e)??0)+1)},emit=(e,t)=>{i.forEach(a=>a(e,t))},buildQueueSnapshot=(e={})=>({id:e.id,name:e.name,type:e.type,pre:[...e.pre||[]],post:[...e.post||[]],exclusions:[...e.exclusions||[]],items:[...e.items||[]],prepend:[...e.prepend||[]],pending:Boolean(e.pending),lastSignature:e.lastSignature||"",deferred:Boolean(e.deferred)}),u=new Map,getQueueSnapshot=e=>o[e]?(u.has(e)||u.set(e,createSnapshotCache({getVersion:()=>c.get(e)??0,buildSnapshot:()=>buildQueueSnapshot(o[e])})),u.get(e)()):null,d=createSnapshotCache({getVersion:()=>l,buildSnapshot:()=>Object.keys(o).reduce((e,t)=>(e[t]=getQueueSnapshot(t),e),{})}),m=createQueueFlushApi({state:o,emit,send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n,onQueueFired:s,markStateChanged}),p=createQueueMutationApi({state:o,emit,flush:m.flush,getSeparator:a,markStateChanged});return{onChange:e=>(i.add(e),()=>i.delete(e)),listQueues:()=>Object.keys(o),getQueue:e=>getQueueSnapshot(e),snapshot:()=>d(),add:p.add,addClear:p.addClear,prepend:p.prepend,clear:p.clear,clearQueue:m.clearQueue,flush:m.flush,flushAll:m.flushAll,flushDeferred:m.flushDeferred,acknowledgeSent:m.acknowledgeSent,acknowledgeFired:m.acknowledgeFired,setPreCommands:p.setPreCommands,setPostCommands:p.setPostCommands}},normalizeRule=(e,t="runtime")=>{if(!e?.id)throw new Error("Rule must include an id");if("function"!=typeof e.evaluate)throw new Error(`Rule "${e.id}" must expose evaluate(context)`);const a=Array.isArray(e.tags)?e.tags.map(e=>String(e).trim().toLowerCase()).filter(Boolean):[];return{id:String(e.id),enabled:!1!==e.enabled,terminal:!0===e.terminal,pack:e.pack||t,tags:a,meta:deepClone$1(e.meta||{}),evaluate:e.evaluate}},stripMasterSwitchSetting=(e={})=>{const{enabled:t,...a}=e||{};return a},mergeOverlay=(e,t={})=>t?(["affPriorities","defPriorities","curePriorities","settings","predictions"].forEach(a=>{if(!t[a])return;const n="settings"===a?stripMasterSwitchSetting(t[a]):t[a];e[a]={...e[a]||{},...n}}),void 0!==t.prioAff&&(e.prioAff=t.prioAff),Array.isArray(t.manualQueue)&&(e.manualQueue=[...t.manualQueue]),t.commands?.length&&(e.commands=[...e.commands||[],...t.commands]),e):e,createEmptyOverlay=()=>({affPriorities:{},defPriorities:{},curePriorities:{},settings:{},predictions:{},commands:[],prioAff:void 0,manualQueue:void 0}),diffRuleActivity=(e,t)=>{const a=[];return e.forEach((e,n)=>{t.has(n)||a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{e.has(n)||a.push({...t,from:!1,to:!0})}),a},diffRuleSuspension=(e,t)=>{const a=[];return e.forEach((e,n)=>{e.suspendsCuring&&!t.get(n)?.suspendsCuring&&a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{t.suspendsCuring&&!e.get(n)?.suspendsCuring&&a.push({...t,from:!1,to:!0})}),a},createRuleRegistry=(e=[])=>{const t=[],a=new Set,n=new Map,emit=(e,t)=>{a.forEach(a=>{try{a(e,t)}catch(n){console.error("nexSys4 rule registry listener failed",{event:e,error:n})}})},findIndex=e=>t.findIndex(t=>t.id===e),synthesizeDeactivation=(e,t)=>{const a=String(e);if(!n.has(a))return!1;const s=n.get(a);return n.delete(a),emit("RuleDeactivated",{...s,source:t}),!0},addRule=(e,a={})=>{const n=normalizeRule(e,a.pack);return!(findIndex(n.id)>=0)&&(Number.isInteger(a.index)&&a.index>=0&&a.index<t.length?t.splice(a.index,0,n):t.push(n),emit("RuleAdded",{id:n.id,pack:n.pack}),!0)},removeRule=e=>{const a=findIndex(e);if(a<0)return!1;synthesizeDeactivation(e,"removed");const[n]=t.splice(a,1);return emit("RuleRemoved",{id:n.id,pack:n.pack}),!0},setEnabled=(e,a)=>{const n=findIndex(e);return!(n<0)&&(t[n].enabled!==a&&(t[n].enabled=a,a||synthesizeDeactivation(e,"disabled"),emit(a?"RuleEnabled":"RuleDisabled",{id:e}),!0))},setPackEnabled=(e,a)=>{let n=!1;return t.forEach(t=>{t.pack===e&&(n=setEnabled(t.id,a)||n)}),n},loadPack=(e,t=[])=>{let a=!1;return t.forEach(t=>{a=addRule({...t,pack:e},{pack:e})||a}),a&&emit("RulePackLoaded",{packId:e}),a},unloadPack=e=>{const a=t.filter(t=>t.pack===e).map(e=>e.id);return!!a.length&&(a.forEach(e=>removeRule(e)),emit("RulePackUnloaded",{packId:e,count:a.length}),!0)},reorder=(e=[])=>{if(!Array.isArray(e)||!e.length)return!1;const a=new Set(t.map(e=>e.id)),n=new Set(e);if(e.length!==t.length||n.size!==t.length)return!1;if([...a].some(e=>!n.has(e)))return!1;const s=t.reduce((e,t)=>(e[t.id]=t,e),{});return t.length=0,e.forEach(e=>t.push(s[e])),emit("RuleOrderChanged",{order:[...e]}),!0},evaluate=(e={})=>{const a=createEmptyOverlay(),s=[],i=new Map;for(const n of t){if(!n.enabled)continue;const t=n.evaluate(e);if(t&&(s.push(n.id),i.set(n.id,{id:n.id,pack:n.pack,meta:n.meta,suspendsCuring:!0===t.suspendCuring}),mergeOverlay(a,t),n.terminal))break}a.commands=Array.from(new Set(a.commands||[]));const o=diffRuleActivity(n,i),l=diffRuleSuspension(n,i);return n.clear(),i.forEach((e,t)=>n.set(t,e)),{overlay:a,applied:s,transitions:o,suspendTransitions:l,suspendingRules:[...i.values()].filter(e=>e.suspendsCuring).map(e=>e.id)}};return e.forEach(e=>addRule(e,{pack:e.pack||"general"})),{onChange:e=>(a.add(e),()=>a.delete(e)),addRule,removeRule,enableRule:e=>setEnabled(e,!0),disableRule:e=>setEnabled(e,!1),enablePack:e=>setPackEnabled(e,!0),disablePack:e=>setPackEnabled(e,!1),loadPack,unloadPack,reorder,evaluate,list:()=>t.map(e=>({id:e.id,enabled:e.enabled,terminal:e.terminal,isActive:n.has(e.id),suspendsCuring:Boolean(n.get(e.id)?.suspendsCuring),pack:e.pack,tags:[...e.tags],meta:deepClone$1(e.meta)}))}},createSettingCommand=(e,t)=>Object.freeze({commandId:e,buildCommand:t}),$e=Object.freeze({afflictions:createSettingCommand("curing-afflictions",e=>`curing afflictions ${boolWord(e)}`),defences:createSettingCommand("curing-defences",e=>`curing defences ${boolWord(e)}`),sipping:createSettingCommand("curing-sipping",e=>`curing sipping ${boolWord(e)}`),transmutation:createSettingCommand("curing-transmutation",e=>`curing transmutation ${boolWord(e)}`),sipHealthAt:createSettingCommand("curing-siphealth",e=>`curing siphealth ${e}`),sipManaAt:createSettingCommand("curing-sipmana",e=>`curing sipmana ${e}`),mossHealthAt:createSettingCommand("curing-mosshealth",e=>`curing mosshealth ${e}`),mossManaAt:createSettingCommand("curing-mossmana",e=>`curing mossmana ${e}`),sipPriority:createSettingCommand("curing-priority-mode",e=>`curing priority ${String(e||"health").toLowerCase()}`),focus:createSettingCommand("curing-focus-enabled",e=>`curing focus ${boolWord(e)}`),focusOverHerbs:createSettingCommand("curing-focus-priority-mode",e=>"curing focus "+(e?"first":"second")),tree:createSettingCommand("curing-tree",e=>{const t=String(e||"on").toLowerCase();return["on","off","custom"].includes(t)?`curing tree ${t}`:null}),useVault:createSettingCommand("curing-usevault",e=>`curing usevault ${boolWord(e)}`),clot:createSettingCommand("curing-useclot",e=>`curing useclot ${boolWord(e)}`),clotAt:createSettingCommand("curing-clotat",e=>`curing clotat ${e}`),fallback:createSettingCommand("curing-fallback",e=>`curing fallback ${boolWord(e)}`),kaidoTransmute:createSettingCommand("curing-kaidotransmute",e=>e?"curing kaidotransmute":null),batch:createSettingCommand("curing-batch",e=>`curing batch ${boolWord(e)}`),fracturesAbove:createSettingCommand("curing-healthaffsabove",e=>`curing healthaffsabove ${e}`),manaThreshold:createSettingCommand("curing-manathreshold",e=>`curing manathreshold ${e}`)}),sameArray=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},mapDiff=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]),toGamePriorityToken=e=>isServersideAffPriorityNumber(e)?String(Number(e)):String(26),createServersideDiffPlanner=({baseline:e={},getBaseline:t,getAffPriorityCommandName:a,getDefPriorityTokens:n}={})=>{const resolveBaseline=()=>"function"==typeof t?t()||{}:e,resolveAffPriorityCommandName=e=>{if("function"==typeof a){const t=a(e);if(t)return String(t)}return String(e)},resolveDefPriorityTokens=(e,t)=>{if(!isServersideAffPriorityNumber(t))return["reset"];if("function"==typeof n){const a=n(e,Number(t));if(Array.isArray(a)&&a.length)return a.map(e=>String(e));if(null!=a&&!1!==a)return[String(a)]}return[String(Number(t))]},normalizeDesiredDefPriority=e=>"RESET"===e||void 0===e?0:isServersideAffPriorityNumber(e)?Number(e):0;return{build:({desired:e={},observed:t={}}={})=>{const a=resolveBaseline(),n=a.settings||{},s=a.affPriorities||{},i=[],o=[],l=e.settings||{};mapDiff(l,t.settings||{}).sort().forEach(e=>{const t=$e[e];if(!t)return;const a=t.buildCommand(l[e]);a&&(i.push(a),o.push(`settings:${e}`))});const c=e.affPriorities||{},u=t.affPriorities||{};!0===e.fullPriorityReset&&(i.push("curing priority reset"),o.push("aff-priority:reset-all"));const resolveDesiredAffPriority=e=>{const t=c[e];return"RESET"===t||void 0===t?s[e]??0:t},d=[...new Set([...Object.keys(c),...Object.keys(u)])].filter(e=>canonicalAffPriority(resolveDesiredAffPriority(e))!==canonicalAffPriority(u[e])).sort().map(e=>[e,toGamePriorityToken(resolveDesiredAffPriority(e))]);if(d.length){const e=d.flatMap(([e,t])=>[resolveAffPriorityCommandName(e),String(t)]);i.push(`curing priority ${e.join(" ")}`),d.forEach(([e])=>o.push(`aff-priority:${e}`))}const m=e.defPriorities||{},p=t.defPriorities||{},g=[...new Set([...Object.keys(m),...Object.keys(p)])].filter(e=>normalizeDesiredDefPriority(m[e])!==Number(p[e]??0)).sort().map(e=>{const t=m[e];return"RESET"===t||void 0===t?[e,["reset"],`def-priority-reset:${e}`]:isServersideAffPriorityNumber(t)?[e,resolveDefPriorityTokens(e,t),`def-priority:${e}`]:[e,["reset"],`def-priority-reset:${e}`]});if(g.length){const e=g.flatMap(([e,t])=>[e,...t]);i.push(`curing priority defence ${e.join(" ")}`),g.forEach(([,,e])=>o.push(e))}const h=e.prioAff;h!==t.prioAff&&(h?(i.push(`curing prioaff ${h}`),o.push(`prioaff:${h}`)):(i.push("curing prioaff none"),o.push("prioaff:clear")));const b=e.manualQueue||[];return sameArray(b,t.manualQueue||[])||(i.push("curing queue reset"),b.forEach((e,t)=>{i.push(`curing queue insert ${t+1} ${e}`)}),o.push("manual-queue:reconcile")),{commands:Array.from(new Set(i)),reasonCodes:o,baseSettings:n}},getBaseSettings:()=>resolveBaseline().settings||{},getBaseAff:()=>resolveBaseline().affPriorities||{},getBaseDef:()=>resolveBaseline().defPriorities||{}}},Fe=Object.freeze({BALANCE:"balance",EQUILIBRIUM:"equilibrium",ENTITY:"entity",FOCUS:"focus",FREE:"free",WRITHE:"writhe"}),emergencyClassRules=e=>{const t={},a=!e.haveBal(Fe.FOCUS)||e.haveAff("impatience");return t.fitness=e.isClass(["Runewarden","Monk","Blademaster","Infernal","Paladin","Sentinel","Druid"])&&e.haveAff("asthma")&&(e.haveAnAff(["slickness","hellsight"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity"])||e.haveAnAff(["damagedhead","mangledhead","damagedleftleg","damagedrightleg"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity","slickness","hellsight","disloyalty"]))?100:"RESET",t.dragonheal=e.isClass("Dragon")&&e.haveAffs(["asthma","slickness","anorexia"])&&a?100:"RESET",t.dragonflex="RESET",e.isClass("Dragon")&&(e.haveAffs(["entangled","webbed"])||e.haveAnAff(["entangled","webbed"])&&(e.haveBal(Fe.BALANCE)&&!e.haveBal(Fe.WRITHE)||e.haveAff("transfixation")))&&(t.dragonflex=100),t.bloodboil=e.isClass("Magi")&&e.haveAffs(["asthma","slickness"])&&(e.haveAnAff(["hypochondria","paralysis"])||e.haveAff("anorexia")&&a)?100:"RESET",t.dwinnu=e.isClass("Bard")&&(e.haveAffs(["webbed","entangled"])||e.haveAnAff(["webbed","entangled"])&&e.haveAff("transfixation"))?100:"RESET",t.salt=e.isClass("Alchemist")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","paralysis"]))?100:"RESET",t.shrugging=e.isClass("Serpent")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","paralysis"]))?100:"RESET",t.fool=e.isClass("Occultist")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","impatience"]))?100:"RESET",t.alleviate=e.isClass("Blademaster")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","impatience"]))?100:"RESET",t},createDefaultServersideRulePack=()=>[{id:"aeon-threshold-and-priority",pack:"general",evaluate:e=>e.haveAff("aeon")?{settings:{sipHealthAt:30,sipManaAt:10,mossHealthAt:0,mossManaAt:0,batch:!1,clotAt:5e3},affPriorities:{asthma:3,weariness:4,anorexia:5,impatience:7,paralysis:8}}:null},{id:"nonfunctional-legs-paralysis",pack:"general",evaluate:e=>e.haveAnAff(["brokenleftleg","damagedleftleg","mangledleftleg"])&&e.haveAnAff(["brokenrightleg","damagedrightleg","mangledrightleg"])?{affPriorities:{paralysis:25}}:null},{id:"kelp-paralysis-slickness",pack:"general",evaluate:e=>1==e.cureAffCount("kelp")&&e.haveAffs(["paralysis","asthma","slickness"])?{affPriorities:{asthma:1}}:null},{id:"scytherus-paralysis",pack:"general",evaluate:e=>e.haveAffs(["scytherus","paralysis"])?{affPriorities:{scytherus:2}}:null},{id:"confusion-disrupted",pack:"general",evaluate:e=>e.haveAffs(["confusion","disrupted"])&&(e.haveBal(Fe.FOCUS)||e.haveAff("impatience"))&&!e.haveAff("whisperingmadness")?{affPriorities:{confusion:2}}:null},{id:"impatience-snaptrack",pack:"general",evaluate:e=>e.haveAff("impatience")&&e.trackableElapsed("snapTrack")<8e3?{affPriorities:{impatience:2}}:null},{id:"hypochondria-impatience",pack:"general",evaluate:e=>e.haveAffs(["impatience","hypochondria"])?{affPriorities:{hypochondria:1}}:e.haveAff("hypochondria")&&e.trackableElapsed("snapTrack")<8e3?{affPriorities:{hypochondria:2}}:null},{id:"slickness-asthma-sensitivity-group",pack:"general",evaluate:e=>{const t=e.haveAnAff(["sensitivity","clumsiness","weariness","hypochondria"]);return e.haveAffs(["slickness","asthma"])&&t&&!e.haveAff("anorexia")?{affPriorities:{slickness:2}}:null}},{id:"asthma-hellsight-slickness",pack:"general",evaluate:e=>{const t=!e.haveAnAff(["sensitivity","clumsiness","weariness","hypochondria"]);return e.haveAffs(["slickness","asthma"])&&t||e.haveAffs(["hellsight","asthma"])?{affPriorities:{asthma:2}}:null}},{id:"darkshade-lightwall",pack:"general",evaluate:e=>e.haveAff("darkshade")&&e.affElapsed("darkshade")>1e4&&e.roomHasItem("a lightwall")?{affPriorities:{darkshade:2}}:null},{id:"prone-sensitivity-legdamage",pack:"general",evaluate:e=>e.haveAffs(["prone","sensitivity"])&&e.haveAnAff(["damagedleftleg","damagedrightleg"])?{affPriorities:{sensitivity:2}}:null},{id:"conflagration-burning",pack:"general",evaluate:e=>{if(!e.haveAff("conflagration")||!e.haveAnAff(["brokenleftleg","brokenrightleg","damagedleftleg","damagedrightleg","mangledleftleg","mangledrightleg"]))return null;const t=e.haveAnAff(["damagedleftleg","damagedrightleg","mangledleftleg","mangledrightleg"]);return e.haveAff("prone")&&!t?{affPriorities:{burning:7}}:{affPriorities:{burning:4}}}},{id:"class-emergency-cures",pack:"general",evaluate:e=>({curePriorities:emergencyClassRules(e)})}],ze=Object.freeze(["status","affPriorities","defPriorities"]),Ge=Object.freeze({reportingcommands:"reporting",afflictions:"afflictions",defences:"defences",sipping:"sipping",transmutation:"transmutation",siphealth:"sipHealthAt",siphealthat:"sipHealthAt",sipmana:"sipManaAt",sipmanaat:"sipManaAt",mosshealth:"mossHealthAt",mosshealthat:"mossHealthAt",mossmana:"mossManaAt",mossmanaat:"mossManaAt",priority:"sipPriority",sippriority:"sipPriority",focus:"focus",focusoverherbs:"focusOverHerbs",tree:"tree",usevault:"useVault",useclot:"clot",clot:"clot",clotat:"clotAt",clotabove:"clotAbove",fallback:"fallback",kaidotransmute:"kaidoTransmute",customcuringpriority:"customAffPriority",customdefencepriority:"customDefPriority",batch:"batch",healthaffsabove:"fracturesAbove",fracturesabove:"fracturesAbove",manathreshold:"manaThreshold",insomnia:"insomnia"}),He=Object.freeze(new Set(["status","enabled"])),createServersideObservationApi=({state:e,affModel:t,defModel:a,systemModel:n,emit:s,markDirty:i,replaceBucket:o,maybeResolveFullPriorityReset:l,normalizeAffPriorityName:c=e=>String(e||"").toLowerCase()})=>{const getMissingStartupFlags=(t=Object.keys(e.startup.flags))=>t.filter(t=>t in e.startup.flags&&!e.startup.flags[t]),u=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>({...e.startup.flags})}),d=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>{const e=u(),t=getMissingStartupFlags(ze);return{ready:Object.values(e).every(Boolean),requiredReady:0===t.length,missingRequired:t,flags:e}}}),markStartupCaptured=t=>t in e.startup.flags&&!e.startup.flags[t]&&(o("startup",{...e.startup,flags:{...e.startup.flags,[t]:!0}}),s("ServersideStartupSnapshotCaptured",{topic:t,flags:u()}),!0),updateObservedSetting=(t,a)=>{if(e.observed.settings[t]!==a){if(o("observed",{...e.observed,settings:{...e.observed.settings,[t]:a}}),e.startup.flags.status){const n=e.derived?.settings?.[t];void 0!==n&&"RESET"!==n||o("sessionBaseline",{...e.sessionBaseline,settings:{...e.sessionBaseline.settings,[t]:a}})}i(`observed-setting:${t}`)}},normalizeCaptureSetName=e=>String(e||"").trim().toLowerCase(),isCaptureSetOwned=e=>{const t=e||"";return""===t||"nexsys4-default"===t},completeObservedAffPrioritySnapshot=()=>{const t=e.capture.affPriorities,a=e.capture.prioritySet||"";if(e.capture.affPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,affPriorities:t,prioritySet:a}),l(),i("observed-aff-priority-snapshot")}return markStartupCaptured("affPriorities"),!0},completeObservedDefPrioritySnapshot=()=>{const t=e.capture.defPriorities,a=e.capture.prioritySet||"";if(e.capture.defPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,defPriorities:t,prioritySet:a}),i("observed-def-priority-snapshot")}return markStartupCaptured("defPriorities"),!0},updateObservedQueue=(t=[])=>{const a=t||[],n=e.observed.manualQueue,s=a.length===n.length&&a.every((e,t)=>e===n[t]);markStartupCaptured("queue"),s||(o("observed",{...e.observed,manualQueue:[...a]}),i("observed-manual-queue"))},updateObservedPredictions=(t={})=>{const a=t||{},n=e.observed.predictions,s=Object.keys(a),l=s.length===Object.keys(n).length&&s.every(e=>a[e]===n[e]);markStartupCaptured("predictions"),l||(o("observed",{...e.observed,predictions:{...a}}),i("observed-predictions"))},parseStatusLine=({key:e,value:t})=>{const a=String(e||"").trim();if(He.has(a.toLowerCase()))return;const n=Ge[a.toLowerCase()]||a;updateObservedSetting(n,normalizeStatusValue(n,t))};return{markStartupCaptured,resetStartupStatus:()=>{const t=Object.keys(e.startup.flags).reduce((e,t)=>(e[t]=!1,e),{});return e.capture.affPriorities=null,e.capture.defPriorities=null,o("startup",{...e.startup,flags:t}),s("ServersideStartupReset",{flags:u()}),!0},isStartupReady:()=>Object.values(e.startup.flags).every(Boolean),getStartupStatus:()=>d(),getMissingStartupFlags,beginObservedAffPrioritySnapshot:(a="")=>(e.capture.affPriorities=buildObservedAffPriorities(t),e.capture.prioritySet=normalizeCaptureSetName(a),!0),completeObservedAffPrioritySnapshot,updateObservedSetting,updateObservedAffPriority:(t,a)=>{const n=e.capture.affPriorities||e.observed.affPriorities,s=String(t||"").toLowerCase(),u=c(t);if(!u)return!1;if(!Object.prototype.hasOwnProperty.call(n,u))return!1;const d=normalizeServersideAffPriority(a);if(e.capture.affPriorities)return s&&s!==u&&delete n[s],n[u]=d,!0;const m={...e.observed.affPriorities};if(s&&s!==u&&delete m[s],m[u]=d,o("observed",{...e.observed,affPriorities:m}),l(),e.startup.flags.affPriorities){const t=e.derived?.affPriorities?.[u];void 0!==t&&"RESET"!==t||o("sessionBaseline",{...e.sessionBaseline,affPriorities:{...e.sessionBaseline.affPriorities,[u]:d}})}return i(`observed-aff-priority:${u}`),!0},beginObservedDefPrioritySnapshot:(t="")=>(e.capture.defPriorities=buildObservedDefPriorities(a,n.getClass()),e.capture.prioritySet=normalizeCaptureSetName(t),!0),completeObservedDefPrioritySnapshot,updateObservedDefPriority:(t,s)=>{const l=e.capture.defPriorities||e.observed.defPriorities,c=String(t||"").toLowerCase(),u=a.get(c);if(!u?.serverside)return!1;if(!a.isAvailableForClass(c,n.getClass()))return!1;const d="RESET"===String(s).toUpperCase()?0:Number(s);if(!Number.isFinite(d))return!1;if(e.capture.defPriorities)return l[c]=d,!0;if(o("observed",{...e.observed,defPriorities:{...e.observed.defPriorities,[c]:d}}),e.startup.flags.defPriorities){const t=e.derived?.defPriorities?.[c];if(void 0===t||"RESET"===t){const t={...e.sessionBaseline.defPriorities};u.static?delete t[c]:t[c]=d,o("sessionBaseline",{...e.sessionBaseline,defPriorities:t})}}return i(`observed-def-priority:${c}`),!0},updateObservedQueue,updateObservedPredictions,parseStatusLine}},createServersideTransientApi=({state:e,trackables:t,now:a,markDirty:n,emit:s,replaceBucket:i,normalizeAffName:o=e=>String(e||"").toLowerCase()})=>{const getPredictionCommands=()=>Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],getPredictionRequests=()=>Array.isArray(e.transient.predictionRequests)?e.transient.predictionRequests:[],normalizePredictionAff=e=>String(o(e)||"").trim().toLowerCase(),replaceTransient=t=>i("transient",{...e.transient,...t}),clearPredictionCommands=(e=new Set)=>{if(!e.size)return!1;const t=getPredictionCommands(),a=t.filter(t=>!e.has(normalizeCommand(t)));return a.length!==t.length&&replaceTransient({predictionCommands:a})},clearPredictionRequest=e=>{const t=getPredictionRequests();if(!t.length)return!1;const a=normalizePredictionAff(e),n=a?t.indexOf(a):0;if(n<0)return!1;const s=[...t];return s.splice(n,1),replaceTransient({predictionRequests:s})},queuePredictionCommand=e=>{const t=normalizePredictionAff(e);if(!t)return!1;const a=`curing predict ${t}`,s=normalizeCommand(a),i=getPredictionCommands(),o=getPredictionRequests();return!i.some(e=>normalizeCommand(e)===s)&&!o.includes(t)&&(replaceTransient({predictionCommands:[...i,a],predictionRequests:[...o,t]}),n(`prediction-request:${t}`),!0)};return{setTrackable(e,i,o={}){const l=String(e||"").trim();if(!l)return!1;t[l]||(t[l]={have:!1,since:0});const c=Boolean(i);if(t[l].have===c)return!1;const u=a();return t[l].have=c,t[l].since=c?u:0,s(c?"TrackableGot":"TrackableLost",{name:l,label:String(o.label||l),have:c,at:u,since:t[l].since,source:String(o.source||"manual")}),n(`trackable:${l}`),!0},setPrioAff(t){const a=t?o(t):null;return e.transient.prioAff!==a&&(i("transient",{...e.transient,prioAff:a}),n("prioaff"),!0)},clearPrioAff:()=>!!e.transient.prioAff&&(i("transient",{...e.transient,prioAff:null}),n("prioaff-clear"),!0),requestPriorityReset:()=>!e.transient.fullPriorityReset&&(i("transient",{...e.transient,fullPriorityReset:!0}),n("priority-reset-request"),!0),requestStaticDefPriorities(t={}){let a=!1;const s={...e.transient.staticDefRequests};return Object.entries(t||{}).forEach(([e,t])=>{const n=String(e||"").trim().toLowerCase(),i=Number(t);!n||!Number.isInteger(i)||i<1||i>25||s[n]!==i&&(s[n]=i,a=!0)}),a&&(i("transient",{...e.transient,staticDefRequests:s}),n("static-def-request")),a},clearStaticDefPriorities(t){const a=Array.isArray(t)?t.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean):Object.keys(e.transient.staticDefRequests);let s=e.transient.staticDefRequests;a.forEach(t=>{Object.prototype.hasOwnProperty.call(s,t)&&(s===e.transient.staticDefRequests&&(s={...e.transient.staticDefRequests}),delete s[t])});const o=i("transient",{...e.transient,staticDefRequests:s});return o&&n("static-def-clear"),o},addPrediction:e=>queuePredictionCommand(e),removePrediction(e){const t=normalizePredictionAff(e);if(!t)return!1;const a=clearPredictionCommands(new Set([normalizeCommand(`curing predict ${t}`)])),s=clearPredictionRequest(t);return a&&n(`prediction-cancel:${t}`),a||s},confirmPrediction:e=>clearPredictionRequest(e),manualQueueAdd(t){const a=String(t||"").toLowerCase();return!(!a||e.transient.manualQueue.includes(a))&&(i("transient",{...e.transient,manualQueue:[...e.transient.manualQueue,a]}),n("manual-queue-add"),!0)},manualQueueInsert(t,a){const s=String(a||"").toLowerCase(),o=Math.max(1,Math.min(20,Number(t||1)));if(!s||e.transient.manualQueue.includes(s))return!1;const l=[...e.transient.manualQueue];return l.splice(o-1,0,s),i("transient",{...e.transient,manualQueue:l}),n("manual-queue-insert"),!0},manualQueueRemove(t){const a=String(t||"").toLowerCase(),s=e.transient.manualQueue.indexOf(a);if(s<0)return!1;const o=[...e.transient.manualQueue];return o.splice(s,1),i("transient",{...e.transient,manualQueue:o}),n("manual-queue-remove"),!0},manualQueueReset:()=>!!e.transient.manualQueue.length&&(i("transient",{...e.transient,manualQueue:[]}),n("manual-queue-reset"),!0)}},shallowCopyDesired=e=>({settings:{...e.settings},affPriorities:{...e.affPriorities},defPriorities:{...e.defPriorities},curePriorities:{...e.curePriorities},manualQueue:[...e.manualQueue||[]],predictions:{...e.predictions},prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),injectedCommands:[...e.injectedCommands||[]],appliedRules:[...e.appliedRules||[]],suspendingRules:[...e.suspendingRules||[]]}),copyRuleTransitionPayload=(e,t)=>({id:e.id,pack:e.pack,meta:e.meta,source:t,suspendsCuring:!0===e.suspendsCuring}),areCommandSequencesEqual=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},createServersideEvaluationApi=({state:e,affModel:t,defModel:a,balanceModel:n,systemModel:s,cureTable:i,ruleRegistry:o,diffPlanner:l,sendCommands:c,emit:u,markDirty:d,replaceBucket:m,refreshRulesBucket:p,now:g,trackables:h,options:b})=>{const clearResolvedPending=()=>{const t=b.pendingTimeoutMs||12e3,a=g();let n=e.pending;for(const[s,i]of e.pending.entries())a-i>t&&(n===e.pending&&(n=new Map(e.pending)),n.delete(s));return m("pending",n)},clearSentPredictionCommands=(t=[])=>{const a=new Set(t.map(e=>normalizeCommand(e)));if(!a.size)return!1;const n=Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],s=n.filter(e=>!a.has(normalizeCommand(e)));return s.length!==n.length&&m("transient",{...e.transient,predictionCommands:s})},markPendingCommands=(t=[],a={})=>{const n=t.map(e=>normalizeCommand(e)).filter(e=>e&&isServersideCommand(e));if(n.length){const t=g(),a=new Map(e.pending);n.forEach(e=>a.set(e,t)),m("pending",a)}return n.length&&(u("ServersidePendingUpdated",{commands:[...n],context:{...a}}),clearSentPredictionCommands(n)),n},filterServersideDefPriorities=(e={})=>{const t=s.getClass();return Object.entries(e||{}).reduce((e,[n,s])=>{const i=a.get(n);return!i?.serverside||i.static?e:a.isAvailableForClass(n,t)?(e[n]=s,e):e},{})},buildRequestedStaticDefPriorities=()=>{const t=s.getClass(),n=e.transient.staticDefRequests||{};let i=n;const removeRequest=e=>{i===n&&(i={...n}),delete i[e]},o=Object.entries(n).reduce((e,[n,s])=>{const i=a.get(n);if(!i?.static)return removeRequest(n),e;if(a.haveDef(n)||!a.isAvailableForClass(n,t))return removeRequest(n),e;if(!i.serverside)return e;const o=a.getPriority(n),l=isServersideAffPriorityNumber(o)?o:s;return!isServersideAffPriorityNumber(l)||Number(l)>=26?(removeRequest(n),e):(e[n]=Number(l),e)},{});return i!==n&&m("transient",{...e.transient,staticDefRequests:i}),o},emitRuleTransitions=(e=[],t)=>{e.forEach(e=>{e.to||u("RuleDeactivated",{...copyRuleTransitionPayload(e,t)})}),e.forEach(e=>{e.to&&u("RuleActivated",{...copyRuleTransitionPayload(e,t)})})},emitRuleSuspendTransitions=(e=[],t)=>{e.forEach(e=>{e.to||u("RuleSuspendDeactivated",{...copyRuleTransitionPayload(e,t)})}),e.forEach(e=>{e.to&&u("RuleSuspendActivated",{...copyRuleTransitionPayload(e,t)})})},resolveDesired=()=>{const l=createServersideContext({affModel:t,defModel:a,balanceModel:n,systemModel:s,trackables:h,cureTable:i,now:g}),c=o.evaluate(l);return p?.(),m("derived",c.overlay),m("desired",{settings:{...e.sessionBaseline.settings,...c.overlay.settings},affPriorities:mergeWithResets(e.sessionBaseline.affPriorities,c.overlay.affPriorities),defPriorities:{...mergeWithResets(e.sessionBaseline.defPriorities,filterServersideDefPriorities(c.overlay.defPriorities)),...buildRequestedStaticDefPriorities()},curePriorities:mergeWithResets(e.sessionBaseline.curePriorities,c.overlay.curePriorities),manualQueue:Array.isArray(c.overlay.manualQueue)?[...c.overlay.manualQueue]:[...e.transient.manualQueue],predictions:{},prioAff:null!==e.transient.prioAff&&void 0!==e.transient.prioAff?e.transient.prioAff:c.overlay.prioAff||null,fullPriorityReset:e.transient.fullPriorityReset,injectedCommands:[...e.transient.predictionCommands||[],...c.overlay.commands||[]],appliedRules:c.applied,suspendingRules:c.suspendingRules||[]}),{desired:e.desired,evaluation:c}};return{markPendingCommands,maybeResolveFullPriorityReset:()=>!!e.transient.fullPriorityReset&&(!!Object.keys(e.sessionBaseline.affPriorities).every(t=>(e.observed.affPriorities[t]??e.sessionBaseline.affPriorities[t])===e.sessionBaseline.affPriorities[t])&&(m("transient",{...e.transient,fullPriorityReset:!1}),u("ServersideFullPriorityResetResolved",{fullPriorityReset:!1}),!0)),evaluate({emitCommands:t=!0,source:a="prompt"}={}){clearResolvedPending();const{desired:n,evaluation:s}=resolveDesired(),i=l.build({desired:n,observed:e.observed});let o=[...n.injectedCommands,...i.commands].filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));const d=Math.max(1,Number(b.maxCommandsPerCycle||40));let p=e.diagnostics.recoveryCounter;o.length>d&&(o=o.slice(0,d),p+=1);const g=(i.commands||[]).filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));let h=g.length&&areCommandSequencesEqual(e.lastDiffCommands||[],g)?e.diagnostics.commandRepeatCounter+1:0,y=e.diagnostics.desyncCounter;return h>=(b.desyncCommandRepeats||3)&&(y+=1,p+=1,o.push("curing status","curing priority list","curing priority defence list","curing queue list","curing predictions"),h=0),t&&o.length&&(c(o,{source:"serverside-reconcile",reasonCodes:i.reasonCodes,cycleSource:a}),markPendingCommands(o,{source:"serverside-reconcile",reasonCodes:i.reasonCodes,cycleSource:a})),e.lastDiffCommands=[...g],m("diagnostics",{...e.diagnostics,lastCommands:[...o],lastReasons:[...i.reasonCodes],desyncCounter:y,recoveryCounter:p,commandRepeatCounter:h}),e.dirty=!1,u("ServersideEvaluated",{source:a,desired:shallowCopyDesired(n),commands:[...o],reasons:[...i.reasonCodes],suspendingRules:[...s.suspendingRules||[]]}),emitRuleSuspendTransitions(s.suspendTransitions,a),emitRuleTransitions(s.transitions,a),{desired:shallowCopyDesired(n),commands:o,reasons:i.reasonCodes}},setBaselineFromRuntime(){const{enabled:n,...o}=s.getBaselineIntent().ss||{},l=s.getClass(),c={...e.baseline,settings:{...e.baseline.settings,...o},affPriorities:buildBaselineAffPriorities(t),defPriorities:buildBaselineDefPriorities(a,l),curePriorities:buildBaselineCurePriorities(i)};m("baseline",c);const u=buildObservedDefPriorities(a,l),p=Object.keys(u).reduce((t,a)=>(t[a]=e.observed.defPriorities[a]??u[a],t),{});m("observed",{...e.observed,defPriorities:p}),m("sessionBaseline",{settings:{...c.settings},affPriorities:{...c.affPriorities},defPriorities:{...c.defPriorities},curePriorities:{...c.curePriorities}}),d("baseline-refresh")},getCurePriority(t){const a=String(t||"").toLowerCase();return e.desired.curePriorities?.[a]??e.baseline.curePriorities[a]??0},observeOutbound:(e=[])=>markPendingCommands(e,{source:"observe-outbound"})}},createServersideCuringSetApi=({state:e,sendCommands:t,markPendingCommands:a,markDirty:n,markStartupCaptured:s,replaceBucket:i})=>{const issueCuringSetCommand=(e,n)=>{const s=normalizeCommand(e);return!!s&&(t([s],{source:"serverside-curingset",reason:n}),a([s],{source:"serverside-curingset",reason:n}),!0)};return{switchCuringSet(t){const a=normalizeSetName(t);if(!a)return!1;const s=issueCuringSetCommand(`curingset switch ${a}`,"switch");return s&&(i("curingsets",{...e.curingsets,activeSet:a}),n("curingset-switch")),s},deleteCuringSet(e){const t=normalizeSetName(e);return!!t&&issueCuringSetCommand(`curingset delete ${t}`,"delete")},observeActiveCuringSet(t){const a=normalizeSetName(t);if(!a||a===normalizeSetName(e.curingsets.activeSet))return!1;const s=i("curingsets",{...e.curingsets,activeSet:a});return s&&n("curingset-active"),s},observeCuringSets({sets:t=[],activeSet:a="",used:o,limit:l}={}){const c=[...new Set((t||[]).map(e=>normalizeSetName(e)).filter(Boolean))],u=normalizeSetName(a),d=Number(o),m=Number(l),p=Number.isFinite(d)?d:e.curingsets.used,g=Number.isFinite(m)?m:e.curingsets.limit,h=e.curingsets.priorSet||(u&&"nexsys4-default"!==u?u:"");i("curingsets",{...e.curingsets,sets:c,activeSet:u,priorSet:h,used:p,limit:g}),s("curingsets"),n("curingset-observed")}}},Ue=new Set(["RuleActivated","RuleDeactivated","RuleAdded","RuleRemoved","RuleEnabled","RuleDisabled","RulePackLoaded","RulePackUnloaded","RuleOrderChanged"]),Ve=Object.freeze(["baseline","sessionBaseline","derived","desired","observed","transient","pending","diagnostics","curingsets","startup","rules"]),areBucketValuesEqual=(e,t)=>{if(Object.is(e,t))return!0;if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t))return!(!Array.isArray(e)||!Array.isArray(t))&&(e.length===t.length&&e.every((e,a)=>areBucketValuesEqual(e,t[a])));if(e instanceof Map||t instanceof Map){if(!(e instanceof Map&&t instanceof Map))return!1;if(e.size!==t.size)return!1;const a=[...e.entries()],n=[...t.entries()];for(let e=0;e<a.length;e+=1){const[t,s]=a[e],[i,o]=n[e];if(!Object.is(t,i)||!areBucketValuesEqual(s,o))return!1}return!0}const a=Object.keys(e),n=Object.keys(t);return a.length===n.length&&a.every(a=>Object.prototype.hasOwnProperty.call(t,a)&&areBucketValuesEqual(e[a],t[a]))},createServersideController=({adapter:e,dispatchCommands:t,affModel:a,defModel:n,balanceModel:s,systemModel:i,cureTable:o={},options:l={}}={})=>{if("function"!=typeof t)throw new Error("createServersideController requires a dispatchCommands function.");const now=()=>e.now(),c=t,u={snapTrack:{have:!1,since:0}},{enabled:d,...m}=i.getBaselineIntent().ss||{},p=createInitialServersideState({baselineSettings:{afflictions:!0,defences:!0,sipping:!0,transmutation:!0,fallback:!0,kaidoTransmute:!1,...m},affModel:a,defModel:n,systemModel:i,cureTable:o}),g=new Set,emit=(e,t)=>{g.forEach(a=>a(e,t))},markDirty=(e="state-change")=>{p.dirty=!0,emit("ServersideDirty",{reason:e})},replaceBucket=(e,t)=>!areBucketValuesEqual(p[e],t)&&(p[e]=t,!0),h=createRuleRegistry(createDefaultServersideRulePack()),refreshRulesBucket=()=>replaceBucket("rules",h.list());refreshRulesBucket();const b=createServersideDiffPlanner({getBaseline:()=>p.baseline,getAffPriorityCommandName:"function"==typeof a?.formatPriorityCommandName?e=>a.formatPriorityCommandName(e):void 0,getDefPriorityTokens:(e,t)=>{const a=[String(Number(t))];return!0===n.get(e)?.preempt&&a.push("preempt"),a}}),y="function"==typeof a?.normalizeName?e=>a.normalizeName(e):e=>String(e||"").toLowerCase(),v="function"==typeof a?.normalizePriorityName?e=>a.normalizePriorityName(e):e=>String(e||"").toLowerCase(),S=createServersideEvaluationApi({state:p,affModel:a,defModel:n,balanceModel:s,systemModel:i,cureTable:o,ruleRegistry:h,diffPlanner:b,sendCommands:c,emit,markDirty,replaceBucket,refreshRulesBucket,now,trackables:u,options:l}),x=createServersideObservationApi({state:p,affModel:a,defModel:n,systemModel:i,emit,markDirty,replaceBucket,maybeResolveFullPriorityReset:S.maybeResolveFullPriorityReset,normalizeAffPriorityName:v}),C=createServersideTransientApi({state:p,trackables:u,now,markDirty,emit,replaceBucket,normalizeAffName:y}),k=createServersideCuringSetApi({state:p,sendCommands:c,markPendingCommands:S.markPendingCommands,markDirty,markStartupCaptured:x.markStartupCaptured,replaceBucket}),requestSnapshotSync=()=>c(["curing status","curing priority list","curing queue list","curing predictions","curingset list","curing priority defence list"],{source:"serverside-snapshot-sync"}),applyLifecycleChange=e=>(e&&markDirty("rule-lifecycle"),e);h.onChange((e,t)=>{refreshRulesBucket(),Ue.has(e)?emit(e,t):markDirty("rule-engine-change")});const copyRecord=(e={})=>({...e||{}}),copyArray=(e=[])=>[...e||[]],copyRuleOverlay=(e={})=>({affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),curePriorities:copyRecord(e.curePriorities),settings:copyRecord(e.settings),predictions:copyRecord(e.predictions),commands:copyArray(e.commands),prioAff:e.prioAff,manualQueue:Array.isArray(e.manualQueue)?[...e.manualQueue]:void 0}),copyDesiredSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),curePriorities:copyRecord(e.curePriorities),manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),injectedCommands:copyArray(e.injectedCommands),appliedRules:copyArray(e.appliedRules),suspendingRules:copyArray(e.suspendingRules)}),copyObservedSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),curePriorities:copyRecord(e.curePriorities),prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioritySet:e.prioritySet||""}),copyTransientSnapshot=(e={})=>({prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),staticDefRequests:copyRecord(e.staticDefRequests),fullPriorityReset:Boolean(e.fullPriorityReset)}),copyDiagnosticsSnapshot=(e={})=>({lastCommands:copyArray(e.lastCommands),lastReasons:copyArray(e.lastReasons),desyncCounter:Number(e.desyncCounter||0),recoveryCounter:Number(e.recoveryCounter||0),commandRepeatCounter:Number(e.commandRepeatCounter||0)}),copyCuringSetSnapshot=(e={})=>({sets:copyArray(e.sets),activeSet:e.activeSet||"",priorSet:e.priorSet||"",used:Number(e.used||0),limit:Number(e.limit||0)}),copyRulesSnapshot=(e=[])=>(e||[]).map(e=>({id:e.id,enabled:e.enabled,terminal:e.terminal,isActive:e.isActive,suspendsCuring:Boolean(e.suspendsCuring),pack:e.pack,tags:Array.isArray(e.tags)?[...e.tags]:[],meta:deepClone$1(e.meta||{})})),A=createSnapshotCache({getVersion:()=>p.baseline,buildSnapshot:()=>({settings:copyRecord(p.baseline.settings),affPriorities:copyRecord(p.baseline.affPriorities),defPriorities:copyRecord(p.baseline.defPriorities),curePriorities:copyRecord(p.baseline.curePriorities)})}),E=createSnapshotCache({getVersion:()=>p.sessionBaseline,buildSnapshot:()=>({settings:copyRecord(p.sessionBaseline.settings),affPriorities:copyRecord(p.sessionBaseline.affPriorities),defPriorities:copyRecord(p.sessionBaseline.defPriorities),curePriorities:copyRecord(p.sessionBaseline.curePriorities)})}),_=createSnapshotCache({getVersion:()=>p.derived,buildSnapshot:()=>copyRuleOverlay(p.derived)}),w=createSnapshotCache({getVersion:()=>p.desired,buildSnapshot:()=>copyDesiredSnapshot(p.desired)}),T=createSnapshotCache({getVersion:()=>p.observed,buildSnapshot:()=>copyObservedSnapshot(p.observed)}),P=createSnapshotCache({getVersion:()=>p.transient,buildSnapshot:()=>copyTransientSnapshot(p.transient)}),M=createSnapshotCache({getVersion:()=>p.pending,buildSnapshot:()=>[...p.pending.entries()]}),D=createSnapshotCache({getVersion:()=>p.diagnostics,buildSnapshot:()=>copyDiagnosticsSnapshot(p.diagnostics)}),R=createSnapshotCache({getVersion:()=>p.curingsets,buildSnapshot:()=>copyCuringSetSnapshot(p.curingsets)}),O={baseline:A,sessionBaseline:E,derived:_,desired:w,observed:T,transient:P,pending:M,diagnostics:D,curingsets:R,startup:createSnapshotCache({getVersion:()=>p.startup,buildSnapshot:()=>({flags:copyRecord(p.startup.flags)})}),rules:createSnapshotCache({getVersion:()=>p.rules,buildSnapshot:()=>copyRulesSnapshot(p.rules)})};let N=null;const getSnapshot=()=>{const e=Ve.reduce((e,t)=>(e[t]=O[t](),e),{});return N&&Ve.every(t=>N[t]===e[t])||(N=deepFreeze(e)),N},acknowledgeCommand=e=>acknowledgeCommands([e]),acknowledgeCommands=(e=[])=>{let t=p.pending;return e.forEach(e=>{const a=normalizeCommand(e);a&&t.has(a)&&(t===p.pending&&(t=new Map(p.pending)),t.delete(a))}),replaceBucket("pending",t)};return{onChange:e=>(g.add(e),()=>g.delete(e)),markDirty,evaluate:S.evaluate,isDirty:()=>p.dirty,getTransientPrioAff:()=>p.transient.prioAff,getStaticDefRequests:()=>P().staticDefRequests,getObserved:()=>T(),getCuringSets:()=>R(),snapshot:()=>getSnapshot(),isStartupReady:x.isStartupReady,getStartupStatus:x.getStartupStatus,getMissingStartupFlags:x.getMissingStartupFlags,markStartupCaptured:x.markStartupCaptured,resetStartupStatus:x.resetStartupStatus,setBaselineFromRuntime:S.setBaselineFromRuntime,getCurePriority:S.getCurePriority,requestSnapshotSync,beginObservedAffPrioritySnapshot:x.beginObservedAffPrioritySnapshot,completeObservedAffPrioritySnapshot:x.completeObservedAffPrioritySnapshot,updateObservedSetting:x.updateObservedSetting,updateObservedAffPriority:x.updateObservedAffPriority,beginObservedDefPrioritySnapshot:x.beginObservedDefPrioritySnapshot,completeObservedDefPrioritySnapshot:x.completeObservedDefPrioritySnapshot,updateObservedDefPriority:x.updateObservedDefPriority,updateObservedQueue:x.updateObservedQueue,updateObservedPredictions:x.updateObservedPredictions,parseStatusLine:x.parseStatusLine,setTrackable:C.setTrackable,setPrioAff:C.setPrioAff,clearPrioAff:C.clearPrioAff,requestPriorityReset:C.requestPriorityReset,requestStaticDefPriorities:C.requestStaticDefPriorities,clearStaticDefPriorities:C.clearStaticDefPriorities,addPrediction:C.addPrediction,removePrediction:C.removePrediction,manualQueueAdd:C.manualQueueAdd,manualQueueInsert:C.manualQueueInsert,manualQueueRemove:C.manualQueueRemove,manualQueueReset:C.manualQueueReset,confirmPrediction:C.confirmPrediction,switchCuringSet:k.switchCuringSet,deleteCuringSet:k.deleteCuringSet,observeCuringSets:k.observeCuringSets,observeActiveCuringSet:k.observeActiveCuringSet,acknowledgeCommand,acknowledgeCommands,markPendingCommands:S.markPendingCommands,observeOutbound:S.observeOutbound,lifecycle:{add:(e,t)=>applyLifecycleChange(h.addRule(e,t)),remove:e=>applyLifecycleChange(h.removeRule(e)),enable:e=>applyLifecycleChange(h.enableRule(e)),disable:e=>applyLifecycleChange(h.disableRule(e)),enablePack:e=>applyLifecycleChange(h.enablePack(e)),disablePack:e=>applyLifecycleChange(h.disablePack(e)),load:(e,t)=>applyLifecycleChange(h.loadPack(e,t)),unload:e=>applyLifecycleChange(h.unloadPack(e)),reorder:e=>applyLifecycleChange(h.reorder(e)),list:()=>h.list()}}},createCommandDispatcher=({adapter:e}={})=>{const t=[],a=200,isDebugEnabled=()=>"function"==typeof e?.isDebugEnabled&&e.isDebugEnabled(),normalizeCommands=(e=[])=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],resolveSeparator=()=>("function"==typeof e?.getCommandSeparator?e.getCommandSeparator():"|")||"|",normalizeStackPlan=e=>{if(e&&"object"==typeof e&&!Array.isArray(e)){if("stackPlan"!==e.type)return null;const t=normalizeCommands(e.commands);return t.length?{type:"stackPlan",commands:t}:null}const t=normalizeCommands(e);return t.length?{type:"stackPlan",commands:t}:null},normalizeStackPlans=(e=[])=>{if(Array.isArray(e))return e.map(normalizeStackPlan).filter(Boolean);const t=normalizeStackPlan(e);return t?[t]:[]},serializeStackPlan=e=>e.commands.join(resolveSeparator()),recordDispatch=({mode:n,commands:s=[],context:i={},stackIndex:o=1,stackCount:l=1,stackPlan:c=null}={})=>{const u=normalizeCommands(s);if(!u.length)return[];const d={mode:n,commands:[...u],context:{...i},at:e.now(),stackIndex:o,stackCount:l,stackPlan:c?{type:c.type,commands:[...c.commands]}:null};return t.push(d),!isDebugEnabled()&&t.length>a&&t.splice(0,t.length-a),u},sendCommands=(t=[],a={})=>{const n=recordDispatch({mode:"commands",commands:t,context:a});return n.length?(e.send(n,a),n):[]};return{send:sendCommands,sendCommands,sendStackPlan:(t=[],a={})=>{const n=normalizeStackPlans(t);return n.length?(n.forEach((t,s)=>{const i={...a,stackIndex:s+1,stackCount:n.length};recordDispatch({mode:"stack-plan",commands:t.commands,context:i,stackIndex:s+1,stackCount:n.length,stackPlan:t}),e.send(serializeStackPlan(t),i)}),n.map(e=>({type:e.type,commands:[...e.commands]}))):[]},normalizeCommands,history:()=>t.map(e=>({mode:e.mode,commands:[...e.commands],context:{...e.context},at:e.at,stackIndex:e.stackIndex,stackCount:e.stackCount,stackPlan:e.stackPlan?{type:e.stackPlan.type,commands:[...e.stackPlan.commands]}:null}))}},Ye=Object.freeze({freeQueue:[{balanceId:Fe.BALANCE,minDurationMs:250},{balanceId:Fe.EQUILIBRIUM,minDurationMs:250}],fullQueue:[{balanceId:Fe.BALANCE,minDurationMs:250},{balanceId:Fe.EQUILIBRIUM,minDurationMs:250}],classQueue:[{balanceId:Fe.ENTITY,minDurationMs:500}]}),createQueueFiredSideEffects=({balanceModel:e,now:t})=>({queueId:a})=>{const n=Ye[a]||[];if(!n.length)return[];const s=t();return n.filter(({balanceId:t,minDurationMs:a})=>!1===e.have(t)&&e.computeDurationMs(t)>Number(a||0)).map(({balanceId:t})=>(e.restartLossTimer(t,`queue-fired-resync:${a}`,s),t))},createDomainControllers=({adapter:e,seedData:t,options:a={},now:n,models:s})=>{const{systemModel:i,affModel:o,balanceModel:l,defModel:c,cacheModel:u}=s,d=createCommandDispatcher({adapter:e}),m=createQueueFiredSideEffects({balanceModel:l,now:n}),p=createQueueController({send:d.sendStackPlan,getRuntimeState:()=>{const e=i.getRuntime();return{paused:e.paused,phase:e.phase,settings:i.getSettings()}},getSeparator:()=>i.getSettings().commandSeparator,maxEntriesPerSubmission:Number(a.maxEntriesPerSubmission||20),onQueueFired:m}),g=createServersideController({adapter:e,dispatchCommands:d.sendCommands,affModel:o,defModel:c,balanceModel:l,systemModel:i,cureTable:t.cureTable,options:{maxCommandsPerCycle:Number(a.maxSsCommandsPerCycle||40)}}),h=createDefensePlanner({defModel:c,balanceModel:l,affModel:o,systemModel:i}),b=createPrecachePlanner({cacheModel:u});return{commandDispatcher:d,queueController:p,serverside:g,defensePlanner:h,precachePlanner:b,outputPlanner:createOutputPlanner({systemModel:i,serverside:g,defensePlanner:h,precachePlanner:b})}},secondsToMs$1=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds$1=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createBalanceState=(e={})=>{const t={};return Object.entries(e||{}).forEach(([e,a])=>{t[e]={id:e,have:!0,baseDurationMs:secondsToMs$1(a.length),config:deepFreeze(deepClone$1(a||{})),lastLostAtMs:0,lastGotAtMs:0,activeDurationMs:0,expectedReadyAtMs:0,lastRecoveredDurationMs:0,lastServerDurationMs:0,callbacks:{},timer:null}}),t},createBalancePayload=(e,t={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastServerDurationMs:e.lastServerDurationMs,...t}),createBalanceMutationApi=({state:e,emit:t,now:a,setTimeoutFn:n,clearTimeoutFn:s,computeDurationMs:i})=>{const clearTimer=e=>{e.timer&&(s?.(e.timer),e.timer=null)},normalizeDurationMs=(e={},t=0)=>Number.isFinite(Number(e.durationMs))?Math.max(0,Math.round(Number(e.durationMs))):Number.isFinite(Number(e.durationSeconds))?secondsToMs$1(e.durationSeconds):Math.max(0,Math.round(Number(t)||0)),o=1e3,scheduleRecovery=(e,t)=>{clearTimer(e),!n||e.have||e.expectedReadyAtMs<=0||(e.timer=n(()=>{gain(e.id,"timer",a())},Math.max(0,e.expectedReadyAtMs+o-t)))},applyServerDuration=(e,t)=>{e.lastServerDurationMs=t},emitDurationObserved=(e,a,n,s)=>{t("BalanceDurationObserved",createBalancePayload(e,{source:s,atMs:n,durationMs:a,durationSeconds:msToSeconds$1(a)}))},createTimingPayload=(e,t,a,n)=>createBalancePayload(e,{reason:t,atMs:a,durationMs:n,durationSeconds:msToSeconds$1(n)});function gain(n,s="manual",i=a()){const o=e[n];if(!o||o.have)return!1;const l=o.activeDurationMs;return o.have=!0,o.lastGotAtMs=i,o.lastRecoveredDurationMs=Math.max(0,i-o.lastLostAtMs),o.activeDurationMs=0,o.expectedReadyAtMs=0,clearTimer(o),o.callbacks.onStop?.(o),t("BalanceGot",createTimingPayload(o,s,i,o.lastRecoveredDurationMs||l)),!0}const lose=(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||!c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.have=!1,c.lastLostAtMs=o,c.activeDurationMs=u,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),c.callbacks.onStart?.(c),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLost",createTimingPayload(c,s,o,u)),!0},observeServerUse=(t,n,s={})=>{const i=e[t],o=secondsToMs$1(n);if(!i||o<=0)return!1;const l=s.atMs??s.at??a(),c=String(s.source||"serverside-duration");if(i.have){const e=lose(t,c,l,{durationMs:o,serverDuration:!0,autoRegain:s.autoRegain});return e&&emitDurationObserved(i,o,l,c),e}return applyServerDuration(i,o),i.activeDurationMs=o,i.expectedReadyAtMs=i.lastLostAtMs+o,!1!==s.autoRegain?scheduleRecovery(i,l):clearTimer(i),emitDurationObserved(i,o,l,c),!0};return{gain,lose,restartLossTimer:(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.lastLostAtMs=o,c.activeDurationMs=u,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLossTimerRestarted",createTimingPayload(c,s,o,u)),!0},observeServerUse,reset(n,s="reset"){const i=e[n];return!!i&&(clearTimer(i),i.have=!0,i.lastGotAtMs=a(),i.activeDurationMs=0,i.expectedReadyAtMs=0,i.callbacks.onReset?.(i),t("BalanceReset",createBalancePayload(i,{reason:s})),!0)},setCallback(t,a={}){const n=e[t];return!!n&&(n.callbacks={...n.callbacks,...a},!0)},applyVitals(t={}){const n=toParsedGmcpVitals(t);n.balancePatches.forEach(({id:e,have:t})=>{if(!e||void 0===t)return;const n=a();t?gain(e,"gmcp-vitals",n):lose(e,"gmcp-vitals",n)}),n.resourceStats.forEach(({key:t,balanceState:n})=>{e[t]&&void 0!==n&&(n?gain(t,"gmcp-charstat",a()):lose(t,"gmcp-charstat",a()))})},dispose(){Object.values(e).forEach(clearTimer)}}},createBalanceQueryApi=({state:e,now:t,haveAff:a,getVersion:n=()=>0,getEntryVersion:s=()=>n()})=>{const buildEntrySnapshot=(e={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,baseDurationSeconds:msToSeconds$1(e.baseDurationMs),config:e.config,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,activeDurationSeconds:msToSeconds$1(e.activeDurationMs),expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(e.lastRecoveredDurationMs),lastServerDurationMs:e.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(e.lastServerDurationMs)}),i=new Map,getEntrySnapshot=t=>e[t]?(i.has(t)||i.set(t,createSnapshotCache({getVersion:()=>s(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),i.get(t)()):null,o=createSnapshotCache({getVersion:n,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),computeDurationMs=t=>{const n=e[t];if(!n)return 0;let s=Number(n.baseDurationMs||0);const i=n.config.aff_modifiers||{};return Object.entries(i).forEach(([e,t])=>{if(!a(e))return;const n=Number(t.multiplier??1),i=secondsToMs$1(t.offset??0);s=Math.round(s*n+i)}),Math.max(0,s)},elapsedMs=(a,n=t())=>{const s=e[a];return s?s.have?Math.max(0,n-s.lastGotAtMs):Math.max(0,n-s.lastLostAtMs):0},remainingMs=(a,n=t())=>{const s=e[a];return!s||s.have?0:s.expectedReadyAtMs>0?Math.max(0,s.expectedReadyAtMs-n):Math.max(0,s.activeDurationMs-elapsedMs(a,n))},timing=(a,n=t())=>{const s=e[a];if(!s)return null;const i=elapsedMs(a,n),o=remainingMs(a,n),l=computeDurationMs(a);return{id:s.id,have:s.have,atMs:n,elapsedMs:i,elapsedSeconds:msToSeconds$1(i),remainingMs:o,remainingSeconds:msToSeconds$1(o),baseDurationMs:s.baseDurationMs,baseDurationSeconds:msToSeconds$1(s.baseDurationMs),computedDurationMs:l,computedDurationSeconds:msToSeconds$1(l),activeDurationMs:s.activeDurationMs,activeDurationSeconds:msToSeconds$1(s.activeDurationMs),expectedReadyAtMs:s.expectedReadyAtMs,lastLostAtMs:s.lastLostAtMs,lastGotAtMs:s.lastGotAtMs,lastRecoveredDurationMs:s.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(s.lastRecoveredDurationMs),lastServerDurationMs:s.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(s.lastServerDurationMs)}};return{list:()=>Object.keys(e),snapshot:()=>o(),get:e=>getEntrySnapshot(e),have:t=>Boolean(e[t]?.have),elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,a=t())=>msToSeconds$1(elapsedMs(e,a)),remaining:remainingMs,remainingMs,remainingSeconds:(e,a=t())=>msToSeconds$1(remainingMs(e,a)),timing,computeDuration:computeDurationMs,computeDurationMs,computeDurationSeconds:e=>msToSeconds$1(computeDurationMs(e))}},createBalanceModel=({balanceTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n,haveAff:s=()=>!1}={})=>{const i=createBalanceState(e),o=new Set;let l=0;const c=new Map,emit=(e,t)=>{l+=1,t?.id&&c.set(t.id,(c.get(t.id)??0)+1),o.forEach(a=>a(e,t))},u=createBalanceQueryApi({state:i,now:t,haveAff:s,getVersion:()=>l,getEntryVersion:e=>c.get(e)??0}),d=createBalanceMutationApi({state:i,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n,computeDurationMs:u.computeDurationMs});return{onChange:e=>(o.add(e),()=>o.delete(e)),list:u.list,snapshot:u.snapshot,get:u.get,have:u.have,elapsed:u.elapsed,elapsedMs:u.elapsedMs,elapsedSeconds:u.elapsedSeconds,remaining:u.remaining,remainingMs:u.remainingMs,remainingSeconds:u.remainingSeconds,timing:u.timing,computeDuration:u.computeDuration,computeDurationMs:u.computeDurationMs,computeDurationSeconds:u.computeDurationSeconds,gain:d.gain,lose:d.lose,restartLossTimer:d.restartLossTimer,observeServerUse:d.observeServerUse,reset:d.reset,setCallback:d.setCallback,applyVitals:d.applyVitals,dispose:d.dispose}},asSet=(e={})=>Array.isArray(e)?new Set(e.map(e=>String(e).toLowerCase())):new Set(Object.keys(e).map(e=>String(e).toLowerCase())),Qe=0,We=1,createAfflictionReference=(e,t={})=>{const a=String(e||"").trim().toLowerCase();if(!a)return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1};if(t[a])return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!0};const n=a.match(/^(.*?)(?:\s*\((\d+)\)|(\d+))$/),s=Number(n?.[2]??n?.[3]),i=n?.[1]?.trim();return n&&t[i]?{raw:a,name:i,count:s,hasExplicitCount:!0,isCountable:!0}:{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1}},normalizeAfflictionName=(e,t={})=>createAfflictionReference(e,t).name,normalizeAfflictionPriorityName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable&&a.hasExplicitCount&&Number(a.count)>1?`${a.name}${a.count}`:a.name},formatAfflictionPriorityCommandName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable?a.hasExplicitCount?`${a.name}${a.count}`:`${a.name}1`:a.name},createAffEntry=(e,t,a,n=null)=>({name:e,have:!1,count:0,min:Number(n?.min??Qe),max:Number(n?.max??We),since:0,lastChangeAt:0,order:t,defaultPriority:a,priorityOverride:null,timer:null}),createInitialAfflictionState=(e={})=>{const t=e.types?.countable||{},a=[...e.list||[]].reduce((e,a)=>{const n=normalizeAfflictionName(a,t);return n&&!e.includes(n)&&e.push(n),e},[]),n=Object.entries(e.prios||{}).reduce((e,[a,n])=>{const s=normalizeAfflictionName(a,t);return s&&(e[s]=n),e},{}),s={};return a.forEach((e,a)=>{s[e]=createAffEntry(e,a,n[e]??100,t[e]||null)}),{list:a,defaultPrios:n,state:s,timedConfig:e.types?.timed||{},countableConfig:t,uncurableSet:asSet(e.types?.uncurable||{})}},ensureAffEntry=(e,t,a={},n)=>{const s=normalizeAfflictionName(n,a);return e[s]||(e[s]=createAffEntry(s,Object.keys(e).length,t[s]??100,a[s]||null)),e[s]},toPriorityNumber=e=>{const t=Number(e);return Number.isFinite(t)?t:null},getPriorityValue=e=>e?e.priorityOverride??e.defaultPriority:null,getDefaultPriorityValue=e=>e?.defaultPriority??null,setPriorityValue=(e,t)=>e.priorityOverride===t?{changed:!1,priority:t}:(e.priorityOverride=t,{changed:!0,priority:t}),resetPriorityValue=e=>{const t=e.defaultPriority;return null===e.priorityOverride||void 0===e.priorityOverride?{changed:!1,priority:t}:(e.priorityOverride=null,{changed:!0,priority:t})},setDefaultPriorityValue=(e,t,{shouldSyncCurrentPriorityToDefault:a=e=>null===e.priorityOverride||void 0===e.priorityOverride,syncCurrentPriorityToDefault:n=()=>{}}={})=>{const s=e.defaultPriority;if(s===t)return{changed:!1,currentChanged:!1,priority:t,previousDefaultPriority:s};const i=a(e);return e.defaultPriority=t,i&&n(e,t),{changed:!0,currentChanged:i,priority:t,previousDefaultPriority:s}},createAfflictionPriorityApi=({state:e,defaultPrios:t,countableConfig:a,emit:n})=>{const getEntry=(n,{ensure:s=!1}={})=>s?ensureAffEntry(e,t,a,n):e[normalizeAfflictionName(n,a)]||null;return{ensureAff:e=>getEntry(e,{ensure:!0}),getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):100},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):100},setPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setPriorityValue(i,s);return!!o.changed&&(n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority}),!0)},resetPriority(e,t="manual"){const a=getEntry(e,{ensure:!0}),s=resetPriorityValue(a);return!!s.changed&&(n("AffPriorityChanged",{name:a.name,source:t,priority:s.priority,defaultPriority:a.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setDefaultPriorityValue(i,s);return!!o.changed&&(n("AffDefaultPriorityChanged",{name:i.name,source:a,priority:o.priority,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority,defaultChanged:!0}),!0)}}},createAfflictionLifecycleApi=({state:e,defaultPrios:t,timedConfig:a,countableConfig:n,emit:s,now:i,setTimeoutFn:o,clearTimeoutFn:l})=>{const clearTimer=e=>{e.timer&&(l?.(e.timer),e.timer=null)},emitAffGot=(e,t,a)=>{s("AffGot",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitAffLost=(e,t,a)=>{s("AffLost",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitStackChanged=(e,t,a)=>{s("AffStackChanged",{name:e.name,count:e.count,previousCount:a,min:e.min,max:e.max,have:e.have,at:t})},clampCount=(e,t)=>{const a=Number(t);return Number.isFinite(a)?Math.max(e.min,Math.min(e.max,a)):e.count},scheduleTimedExpiry=e=>{const t=a[e.name];if(!t)return;clearTimer(e);const n=Math.round(1e3*Number(t.length||0));n<=0||!o||(e.timer=o(()=>{lose(e.name,{source:"timed-expiry",at:i()})},n))},applyCountableState=(e,t,a={})=>{const n=a.at??i(),s=a.source||"manual",o=e.have,l=e.count;return e.count=clampCount(e,t),e.have=e.count>0,e.have&&!o&&(e.since=n),e.lastChangeAt=n,emitStackChanged(e,n,l),!o&&e.have?emitAffGot(e,n,s):o&&!e.have&&emitAffLost(e,n,s),o},got=(a,s={})=>{const o=createAfflictionReference(a,n),l=ensureAffEntry(e,t,n,o.name),c=s.at??i(),u=s.source||"manual",d=l.have;if(n[l.name]){const e=Number(s.count);return applyCountableState(l,Number.isFinite(e)?e:o.hasExplicitCount?o.count:l.count+Number(s.countDelta??1),{at:c,source:u}),l.have?scheduleTimedExpiry(l):clearTimer(l),!0}return!d&&(l.have=!0,l.count=1,l.since=c,l.lastChangeAt=c,scheduleTimedExpiry(l),emitAffGot(l,c,u),!0)},lose=(a,s={})=>{const o=ensureAffEntry(e,t,n,createAfflictionReference(a,n).name),l=s.at??i(),c=s.source||"manual",u=o.have;if(n[o.name]){const e=Number(s.count);return applyCountableState(o,Number.isFinite(e)?e:Number.isFinite(Number(s.countDelta))?o.count-Math.abs(Number(s.countDelta)):0,{at:l,source:c}),clearTimer(o),!0}return!!u&&(o.have=!1,o.count=0,o.lastChangeAt=l,clearTimer(o),emitAffLost(o,l,c),!0)};return{got,lose,applyList(t=[]){const a=new Set,s=new Map,i=new Set;(t||[]).forEach(e=>{const t=createAfflictionReference("string"==typeof e?e:String(e?.name||e?.affliction||e||""),n);if(t.name){if(n[t.name])return t.hasExplicitCount?(i.add(t.name),void s.set(t.name,Math.max(s.get(t.name)??0,t.count))):void(i.has(t.name)||s.set(t.name,(s.get(t.name)??0)+1));a.add(t.name)}}),Object.keys(e).forEach(t=>{n[t]?s.has(t)?got(t,{source:"gmcp-list",count:s.get(t)}):(e[t].have||e[t].count>0)&&lose(t,{source:"gmcp-list"}):a.has(t)?got(t,{source:"gmcp-list"}):e[t].have&&lose(t,{source:"gmcp-list"})})},dispose(){Object.values(e).forEach(clearTimer)}}},secondsToMs=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createAfflictionQueryApi=({state:e,list:t,timedConfig:a,countableConfig:n,uncurableSet:s,getPriority:i,now:o,getVersion:l=()=>0,getEntryVersion:c=()=>l()})=>{const buildEntrySnapshot=(e={})=>({name:e.name,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride}),u=new Map,getEntrySnapshot=t=>e[t]?(u.has(t)||u.set(t,createSnapshotCache({getVersion:()=>c(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),u.get(t)()):null,d=createSnapshotCache({getVersion:l,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),elapsedMs=(t,a=o())=>{const s=e[normalizeAfflictionName(t,n)];return s?.have?Math.max(0,a-s.since):0},durationMs=e=>{const t=a[normalizeAfflictionName(e,n)];return t?secondsToMs(t.length):0},remainingMs=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s],l=durationMs(s);return!i?.have||l<=0?0:Math.max(0,l-elapsedMs(s,a))},timing=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s];if(!i)return null;const l=elapsedMs(s,a),c=durationMs(s),u=remainingMs(s,a);return{name:s,have:i.have,atMs:a,sinceMs:i.since,lastChangeAtMs:i.lastChangeAt,elapsedMs:l,elapsedSeconds:msToSeconds(l),timedDurationMs:c,timedDurationSeconds:msToSeconds(c),remainingMs:u,remainingSeconds:msToSeconds(u)}};return{snapshot:()=>d(),get:e=>getEntrySnapshot(normalizeAfflictionName(e,n)),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],getCountablePriorityNames:()=>Object.entries(n).flatMap(([e,t])=>{const a=Math.max(0,Number(t?.max??0)),n=[];for(let s=2;s<=a;s+=1)n.push(`${e}${s}`);return n}),normalizeName:e=>normalizeAfflictionName(e,n),normalizePriorityName:e=>normalizeAfflictionPriorityName(e,n),formatPriorityCommandName:e=>formatAfflictionPriorityCommandName(e,n),haveAff(t){const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)},haveAffs:(t=[])=>t.every(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),haveAnAff:(t=[])=>t.some(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),currentSorted:()=>Object.values(e).filter(e=>e.have).sort((e,t)=>{const a=i(e.name),n=i(t.name);return a!==n?a-n:e.order-t.order}).map(e=>e.name),isCountable(e){const t=normalizeAfflictionName(e,n);return Boolean(n[t])},isTimed(e){const t=normalizeAfflictionName(e,n);return Boolean(a[t])},isUncurable(e){const t=normalizeAfflictionName(e,n);return s.has(t)},elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,t=o())=>msToSeconds(elapsedMs(e,t)),remaining:remainingMs,remainingMs,remainingSeconds:(e,t=o())=>msToSeconds(remainingMs(e,t)),timing}},createAfflictionModel=({affTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n}={})=>{const{list:s,defaultPrios:i,state:o,timedConfig:l,countableConfig:c,uncurableSet:u}=createInitialAfflictionState(e),d=new Set;let m=0;const p=new Map,emit=(e,t)=>{m+=1,t?.name&&p.set(t.name,(p.get(t.name)??0)+1),d.forEach(a=>a(e,t))},getEntryVersion=e=>p.get(e)??0,g=createAfflictionPriorityApi({state:o,defaultPrios:i,countableConfig:c,emit}),h=createAfflictionLifecycleApi({state:o,defaultPrios:i,timedConfig:l,countableConfig:c,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n}),b=createAfflictionQueryApi({state:o,list:s,timedConfig:l,countableConfig:c,uncurableSet:u,getPriority:g.getPriority,now:t,getVersion:()=>m,getEntryVersion});return{onChange:e=>(d.add(e),()=>d.delete(e)),snapshot:b.snapshot,get:b.get,list:b.list,getCountablePriorityNames:b.getCountablePriorityNames,normalizeName:b.normalizeName,normalizePriorityName:b.normalizePriorityName,formatPriorityCommandName:b.formatPriorityCommandName,got:h.got,lose:h.lose,applyList:h.applyList,setPriority:g.setPriority,resetPriority:g.resetPriority,getPriority:g.getPriority,getDefaultPriority:g.getDefaultPriority,setDefaultPriority:g.setDefaultPriority,haveAff:b.haveAff,haveAffs:b.haveAffs,haveAnAff:b.haveAnAff,currentSorted:b.currentSorted,isCountable:b.isCountable,isTimed:b.isTimed,isUncurable:b.isUncurable,elapsed:b.elapsed,elapsedMs:b.elapsedMs,elapsedSeconds:b.elapsedSeconds,remaining:b.remaining,remainingMs:b.remainingMs,remainingSeconds:b.remainingSeconds,timing:b.timing,dispose:h.dispose}},createDefenseLifecycleApi=({state:e,emit:t})=>{const consumeStaticPriority=(a,n="manual",s={})=>{const i=e[a];return!(!i?.static||!isActiveStaticPriority(resolveDefensePriority(i)))&&(i.priorityOverride=0,t("DefPriorityChanged",{id:a,value:0,source:n,consumed:!0,static:!0,defaultPriority:i.defaultPriority,...s}),!0)},setHave=(a,n,s="manual",i=Date.now())=>{const o=e[a];if(!o||o.have===n)return!1;o.have=n,o.lastChangeAt=i;const l={id:a,source:s,at:i,have:o.have,lastChangeAt:o.lastChangeAt,static:o.static,serverside:o.serverside,preempt:o.preempt};return t(n?"DefGot":"DefLost",l),n&&consumeStaticPriority(a,s,{triggeredByGain:!0}),!0};return{consumeStaticPriority,setHave,setStatic:(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=Boolean(n);if(i.static===o)return!1;const l=i.static,c=resolveDefensePriority(i);let u=!1,d=!1;return i.static=o,o&&i.have&&isActiveStaticPriority(c)?(i.priorityOverride=0,d=!0,u=resolveDefensePriority(i)!==c):o||0!==i.priorityOverride||(i.priorityOverride=null,u=resolveDefensePriority(i)!==c),t("DefStaticChanged",{id:a,value:o,previousValue:l,source:s,have:i.have,static:i.static,seedStatic:i.seedStatic,defaultPriority:i.defaultPriority,currentPriority:resolveDefensePriority(i),serverside:i.serverside,preempt:i.preempt}),u&&t("DefPriorityChanged",{id:a,value:resolveDefensePriority(i),source:s,static:i.static,defaultPriority:i.defaultPriority,staticChanged:!0,consumed:d}),!0},setCommand:(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=normalizeCommandList(n);return i.command=o,t("DefCommandChanged",{id:a,value:o,source:s}),!0},applyList(t=[],a="gmcp-list"){const n=new Set;(t||[]).forEach(e=>{const t=normalizeObservedDefenseId(e);t&&n.add(t)}),Object.keys(e).forEach(t=>{n.has(t)?(setHave(t,!0,a),e[t].static&&consumeStaticPriority(t,a,{observedActive:!0})):e[t].have&&!e[t].clientOnly&&setHave(t,!1,a)})}}},toDefensePriorityNumber=e=>{const t=toPriorityNumber(e);return null===t?null:t<0?0:t>26?26:t},createDefensePriorityApi=({state:e,emit:t,consumeStaticPriority:a})=>{const getEntry=t=>e[t]||null;return{getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):-1},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):-1},setPriority(e,n,s="manual"){const i=toDefensePriorityNumber(n);if(null===i)return!1;const o=getEntry(e);if(!o)return!1;if(o.static&&!0===o.have&&isActiveStaticPriority(i))return a(e,s,{ignoredWhileActive:!0});const l=setPriorityValue(o,i);return!!l.changed&&(t("DefPriorityChanged",{id:o.id,value:l.priority,source:s,static:o.static,defaultPriority:o.defaultPriority}),!0)},resetPriority(e,n="manual"){const s=getEntry(e);if(!s)return!1;if(s.static&&!0===s.have)return a(e,n,{reset:!0,ignoredWhileActive:!0});const i=resetPriorityValue(s);return!!i.changed&&(t("DefPriorityChanged",{id:s.id,value:i.priority,source:n,static:s.static,defaultPriority:s.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,a,n="manual"){const s=toDefensePriorityNumber(a);if(null===s)return!1;const i=getEntry(e);if(!i)return!1;const o=setDefaultPriorityValue(i,s);return!!o.changed&&(t("DefDefaultPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&t("DefPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,defaultPriority:i.defaultPriority,defaultChanged:!0}),!0)}}},createDefenseQueryApi=({state:e,list:t,getVersion:a=()=>0,getEntryVersion:n=()=>a()})=>{const buildDefEntrySnapshot=(e={})=>({id:e.id,have:e.have,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride,priority:resolveDefensePriority(e),command:e.command,bals_req:e.bals_req,bals_used:e.bals_used,blocks:e.blocks,skills:e.skills,opps:e.opps,serverside:e.serverside,preempt:e.preempt,static:e.static,clientOnly:e.clientOnly}),s=new Map,getDefSnapshot=t=>e[t]?(s.has(t)||s.set(t,createSnapshotCache({getVersion:()=>n(t),buildSnapshot:()=>buildDefEntrySnapshot(e[t])})),s.get(t)()):null,i=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=resolveDefensePriority(e[a]),t),{})}),o=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Number(e[a].defaultPriority??-1),t),{})}),l=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Boolean(e[a]?.static),t),{})}),c=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(Boolean(e[a]?.static)!==Boolean(e[a]?.seedStatic)&&(t[a]=Boolean(e[a]?.static)),t),{})}),u=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getDefSnapshot(t),e),{})});return{snapshot:()=>u(),get:e=>getDefSnapshot(e),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],isAvailableForClass:(t,a="")=>matchesClass(e[t]?.skills,a),haveDef:t=>Boolean(e[t]?.have),getPriority(t){const a=e[t];return a?resolveDefensePriority(a):-1},getDefaultPriority:t=>Number(e[t]?.defaultPriority??-1),getPriorities:()=>i(),getDefaultPriorities:()=>o(),getStatics:()=>l(),getStaticOverrides:()=>c(),isStatic:t=>Boolean(e[t]?.static)}},createDefenseModel=({defTable:e={},defPrios:t={}}={})=>{const{state:a,list:n}=createInitialDefenseState({defTable:e,defPrios:t}),s=new Set;let i=0;const o=new Map,emit=(e,t)=>{i+=1,t?.id&&o.set(t.id,(o.get(t.id)??0)+1),s.forEach(a=>a(e,t))},getEntryVersion=e=>o.get(e)??0,l=createDefenseLifecycleApi({state:a,emit}),c=createDefensePriorityApi({state:a,emit,consumeStaticPriority:l.consumeStaticPriority}),u=createDefenseQueryApi({state:a,list:n,getVersion:()=>i,getEntryVersion});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:u.snapshot,get:u.get,list:u.list,isAvailableForClass:u.isAvailableForClass,haveDef:u.haveDef,isStatic:u.isStatic,setStatic:l.setStatic,setCommand:l.setCommand,setHave:l.setHave,applyList:l.applyList,setPriority:c.setPriority,setDefaultPriority:c.setDefaultPriority,resetPriority:c.resetPriority,getPriority:c.getPriority,getDefaultPriority:c.getDefaultPriority,getDefaultPriorities:u.getDefaultPriorities,getPriorities:u.getPriorities,getStatics:u.getStatics,getStaticOverrides:u.getStaticOverrides}},Ke=1e4,Xe=["brokenleftarm","damagedleftarm","mangledleftarm"],Je=["brokenrightarm","damagedrightarm","mangledrightarm"],createCachePrecacheSupport=({state:e,haveAff:t=()=>!1}={})=>{const isPrecacheBlocked=()=>{const e=Xe.some(e=>t(e)),a=Je.some(e=>t(e));return!(!e||!a)},buildPrecacheCommands=()=>isPrecacheBlocked()?[]:e.hydration.inventoryKnown&&e.hydration.riftKnown?Object.entries(e.desiredPrecache).flatMap(([t,a])=>{const n=toNumber(e.inventory[t],0),s=toNumber(e.rift[t],0),i=Math.max(0,toNumber(e.riftCapacity,Ke)),o=Math.max(0,toNumber(a,0)),l=Math.max(0,o-n),c=Math.max(0,n-o),u=Math.min(l,s),d=Math.max(0,i-s);return u>0?[`outr ${u} ${t}`]:c>0&&d>0?[`inr ${Math.min(c,d)} ${t}`]:[]}):[];return{getPrecacheCommands:()=>buildPrecacheCommands(),isPrecacheBlocked,isHydrated:()=>e.hydration.inventoryKnown&&e.hydration.riftKnown,getTotal:t=>toNumber(e.inventory[t],0)+toNumber(e.rift[t],0)}},findCaseInsensitiveKey=(e={},t="")=>{if(!e||"object"!=typeof e)return null;const a=String(t).toLowerCase();return Object.keys(e).find(e=>String(e).toLowerCase()===a)||null},createCacheNameNormalizer=({cacheTable:e={},cacheNames:t={}}={})=>{const a=t.herb_name_to_herb||{},n=new Set(Object.keys(e)),toCount=(e,t=1)=>Math.max(0,toNumber(e,t)),resolveName=e=>{if(!e)return"";const t=String(e).trim().toLowerCase();return a[t]||t},resolveCountedName=e=>{const t=resolveName(e);if(n.has(t)||!t.endsWith("s"))return t;const a=resolveName(t.slice(0,-1));return n.has(a)?a:t},parseNameAndAmount=(e,t)=>{const a=String(e||"").trim().toLowerCase();if(!a)return{name:"",amount:Math.max(0,toNumber(t,1))};const s=a.match(/^a group of\s+(\d+)\s+(.+)$/);if(s){const[,e,a]=s,i=resolveCountedName(a);if(n.has(i))return{name:i,amount:toCount(t,toNumber(e,1))}}const i=a.match(/^(\d+)\s+(.+)$/);if(i){const[,e,a]=i,s=resolveCountedName(a);if(n.has(s))return{name:s,amount:toCount(t,toNumber(e,1))}}return{name:resolveCountedName(a),amount:toCount(t,1)}};return{resolveName,parseNameAndAmount,normalizeName:e=>parseNameAndAmount(e).name}},readGmcpPath=(e={},t=[])=>{const a=findCaseInsensitiveKey(e,t.join("."));if(a)return e[a];let n=e;for(const s of t){if(!n||"object"!=typeof n)return;const e=findCaseInsensitiveKey(n,s);if(!e)return;n=n[e]}return n},createCacheStateSupport=({state:e,emit:t=()=>{},cacheTable:a={},cacheNames:n={}}={})=>{const{parseNameAndAmount:s,normalizeName:i}=createCacheNameNormalizer({cacheTable:a,cacheNames:n}),o={invAddsById:new Map,roomRemovesById:new Map,appliedIds:new Set},normalizeItemId=e=>null==e||""===e?"":String(e),adjustInventoryAmount=(a,n,s="inventory-delta")=>!(!a||!(a in e.inventory))&&(e.inventory[a]=Math.max(0,e.inventory[a]+toNumber(n,0)),t("CacheAmountChanged",{bucket:"inventory",name:a,amount:e.inventory[a],source:s}),!0),parseInventoryEntry=(e={})=>{const t=e?.item||e,a=s(t?.name||t?.item||t,t?.amount??t?.count??t?.qty??e?.amount??e?.count??e?.qty);return{id:normalizeItemId(t?.id??e?.id),location:String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),name:a.name,amount:a.amount,icon:t?.icon??e?.icon,attrib:t?.attrib??e?.attrib}},storeInventoryCurative=(t={})=>{if(!t.id||!t.name||!(t.name in e.inventory))return!1;const a={name:t.name,amount:t.amount,location:t.location||"inv"};return void 0!==t.icon&&null!==t.icon&&(a.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(a.attrib=t.attrib),e.inventoryCurativesById[t.id]=a,!0},deleteInventoryCurative=t=>{const a=normalizeItemId(t);return!(!a||!(a in e.inventoryCurativesById))&&(delete e.inventoryCurativesById[a],!0)},deleteInventoryCurativesByName=t=>{let a=!1;return Object.entries(e.inventoryCurativesById).forEach(([n,s])=>{s?.name===t&&(delete e.inventoryCurativesById[n],a=!0)}),a},emitInventoryIdentityChanged=()=>{t("CacheInventoryIdentityChanged",{...e.inventoryCurativesById})},buildResult=({changed:e=!1,identityChanged:t=!1,name:a="",amount:n=0,delta:s=0,source:i=""}={})=>({changed:e,identityChanged:t,name:a,amount:n,delta:s,source:i}),readInventorySnapshot=(e={})=>{const t=readGmcpPath(e,["Char","Items","List"]);if(void 0!==t)return t;const a=readGmcpPath(e,["Items","Inv"]);return void 0!==a?{location:"inv",items:a}:void 0},setAmount=(a,n,s,o="manual")=>{const l=i(n);if(!l||!(l in e[a]))return!1;const c=Math.max(0,toNumber(s,e[a][l]));return e[a][l]=c,t("CacheAmountChanged",{bucket:a,name:l,amount:c,source:o}),!0},setRiftCapacity=(a,n="manual")=>{const s=toNumber(e.riftCapacity,Ke),i=Math.max(0,toNumber(a,s));return i!==e.riftCapacity&&(e.riftCapacity=i,t("CacheRiftCapacityChanged",{amount:i,source:n}),!0)},observeInventorySnapshot=(a=[])=>{const n={...e.inventory},s={};Object.keys(n).forEach(e=>{n[e]=0}),(a||[]).forEach(e=>{const t=parseInventoryEntry(e);if("inv"===t.location&&t.name&&t.name in n&&(n[t.name]+=t.amount,t.id)){const e={name:t.name,amount:t.amount,location:t.location};void 0!==t.icon&&null!==t.icon&&(e.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(e.attrib=t.attrib),s[t.id]=e}}),e.inventory=n,e.inventoryCurativesById=s,e.hydration.inventoryKnown=!0,t("CacheInventoryListApplied",{...e.inventory})},applyRoomPickupTransfer=t=>{if(!t||o.appliedIds.has(t))return null;const a=o.invAddsById.get(t),n=o.roomRemovesById.get(t);if(!a||!n)return null;const s=a.name&&a.name in e.inventory,i=Math.max(0,toNumber(a.amount,0)),l=n.name&&n.name in e.inventory,c=Math.max(0,toNumber(n.amount,0)),u=s&&i>0?a:l&&c>0?n:null;if(o.invAddsById.delete(t),o.roomRemovesById.delete(t),o.appliedIds.add(t),!u)return null;const d=Math.max(0,toNumber(u.amount,0));return!u.name||!(u.name in e.inventory)||d<=0?null:adjustInventoryAmount(u.name,d,"gmcp:room-pickup")?buildResult({changed:!0,name:u.name,amount:d,delta:d,source:"gmcp:room-pickup"}):null},observeRoomPickupCandidate=(e,t)=>{if(!e.id||o.appliedIds.has(e.id))return null;if("inv"===e.location&&"add"===t)o.invAddsById.set(e.id,e);else{if("room"!==e.location||"remove"!==t)return null;o.roomRemovesById.set(e.id,e)}return applyRoomPickupTransfer(e.id)},observeRiftSnapshot=(a={})=>{const n=a.items||a,i=Array.isArray(n)?n:Object.entries(n).map(([e,t])=>({name:e,amount:t})),o={...e.rift};Object.keys(o).forEach(e=>{o[e]=0}),i.forEach(e=>{const t=s(e.name||e.item||e,e.amount??e.count??e.qty??0);t.name&&t.name in o&&(o[t.name]=t.amount)}),e.rift=o,e.hydration.riftKnown=!0,t("CacheRiftListApplied",{...e.rift})},hydrateFromGmcp=(e={})=>{let t=!1;const a=readInventorySnapshot(e);void 0!==a&&(Array.isArray(a)?(observeInventorySnapshot(a),t=!0):"inv"===String(a?.location??a?.Location??"inv").toLowerCase()&&(observeInventorySnapshot(a?.items||[]),t=!0));const n=readGmcpPath(e,["IRE","Rift","List"]);return void 0!==n&&(observeRiftSnapshot(n||{}),t=!0),t};return{observeInventorySnapshot,observeItemDelta:(t={})=>{const a=parseInventoryEntry(t),n=String(t.action||"").toLowerCase(),s=String(t.direction||"").toLowerCase(),i=n||s;let o=!1;if("inv"===a.location){const t=a.id&&e.inventoryCurativesById[a.id]||null;"add"===i?a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):"remove"===i?(o=!!t&&deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):"update"===i?a.name&&a.name in e.inventory?(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):t&&(o=deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged())}const l=observeRoomPickupCandidate(a,i);return l?{...l,identityChanged:o}:buildResult({identityChanged:o})},observeRiftSnapshot,observeRiftChange:(t={})=>{const a=t.amount??t.count??t.qty;if(null==a||""===a)return!1;const n=s(t.name||t.item||t.desc||t,a);return!(!n.name||!(n.name in e.rift))&&(setAmount("rift",n.name,n.amount,"gmcp:rift-change"),{name:n.name,riftAmount:e.rift[n.name]})},observeRiftOutText:({item:t,name:a,amount:n=1,riftAmount:i}={})=>{const o=s(t||a,n);if(!o.name||!(o.name in e.inventory)||!(o.name in e.rift))return!1;const l=Math.max(0,toNumber(n,o.amount));return!(l<=0)&&(adjustInventoryAmount(o.name,l,"text:rift-out"),setAmount("rift",o.name,i,"text:rift-out"),{name:o.name,amount:l,riftAmount:e.rift[o.name]})},observeRiftInText:({item:t,name:a,amount:n=1,riftAmount:i,atCapacity:o=!1}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory)||!(l.name in e.rift))return!1;const c=Math.max(0,toNumber(n,l.amount));return!(c<=0)&&(adjustInventoryAmount(l.name,-c,"text:rift-in"),setAmount("rift",l.name,i,"text:rift-in"),o&&setRiftCapacity(i,"text:rift-in-max"),{name:l.name,amount:c,riftAmount:e.rift[l.name],riftCapacity:e.riftCapacity})},invalidateRiftSnapshot:({source:a="rift-resync"}={})=>!!e.hydration.riftKnown&&(e.hydration.riftKnown=!1,t("CacheRiftSnapshotInvalidated",{source:a}),!0),observeInventoryDeltaText:({item:t,name:a,amount:n,delta:i,source:o="text:inventory"}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory))return!1;const c=Math.max(0,toNumber(n,l.amount)),u=toNumber(i,0);if(c<=0||0===u)return!1;const d=u>0?c:-c;return adjustInventoryAmount(l.name,d,o),{name:l.name,amount:c,delta:d,inventoryAmount:e.inventory[l.name]}},observeInventoryEmptyText:({item:t,name:a,source:n="text:inventory-empty"}={})=>{const i=s(t||a,0);if(!i.name||!(i.name in e.inventory))return!1;const o=e.inventory[i.name],l=deleteInventoryCurativesByName(i.name);return l&&emitInventoryIdentityChanged(),setAmount("inventory",i.name,0,n),{changed:0!==o||l,identityChanged:l,name:i.name,amount:0,delta:-o,inventoryAmount:e.inventory[i.name],source:n}},observeCurativeConsumedText:({item:t,name:a,amount:n=1}={})=>{const i=s(t||a,n);if(!i.name||!(i.name in e.inventory))return!1;const o=Math.max(0,toNumber(n,i.amount));return!(o<=0)&&(adjustInventoryAmount(i.name,-o,"text:consume"),{name:i.name,amount:o,inventoryAmount:e.inventory[i.name]})},completeObservationBlock:()=>{o.invAddsById.clear(),o.roomRemovesById.clear(),o.appliedIds.clear()},hydrateFromGmcp,setDesiredPrecache:(a={})=>{Object.entries(a).forEach(([t,a])=>{t in e.desiredPrecache&&(e.desiredPrecache[t]=Math.max(0,toNumber(a,0)))}),t("CacheDesiredPrecacheChanged",{...e.desiredPrecache})}}},createCacheModel=({cacheTable:e={},cacheNames:t={},haveAff:a=()=>!1,haveDef:n=()=>!1}={})=>{const s=new Set;let i=0;const o={inventory:{...e},rift:{...e},riftCapacity:Ke,inventoryCurativesById:{},desiredPrecache:Object.keys(e).reduce((e,t)=>(e[t]=0,e),{}),hydration:{inventoryKnown:!1,riftKnown:!1}},emit=(e,t)=>{i+=1,s.forEach(a=>a(e,t))},l=createSnapshotCache({getVersion:()=>i,buildSnapshot:()=>({inventory:{...o.inventory},rift:{...o.rift},riftCapacity:o.riftCapacity,inventoryCurativesById:Object.entries(o.inventoryCurativesById).reduce((e,[t,a])=>(e[t]={...a},e),{}),desiredPrecache:{...o.desiredPrecache},hydration:{...o.hydration}})});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:()=>l(),...createCacheStateSupport({state:o,emit,cacheTable:e,cacheNames:t}),...createCachePrecacheSupport({state:o,haveAff:a,haveDef:n}),getDesiredPrecache:()=>({...o.desiredPrecache})}},Ze={loadOnLogin:!1,flushSafetyMs:250,maxSendPerChunk:20,queueWhilePaused:!1,overrideTab:!1,customPrompt:!0,debug:!1,notices:{affGot:!0,affLost:!0,defGot:!0,defLost:!0,balanceLost:!1,balanceRecovered:!1,trackableGot:!1,trackableLost:!1,priority:!0,output:!1},ss:{transmutation:!0,sipPriority:"health",sipHealthAt:80,sipManaAt:70,mossHealthAt:90,mossManaAt:80,focus:!0,focusOverHerbs:!0,tree:"on",clot:!0,clotAt:19,fracturesAbove:35,manaThreshold:10,batch:!0}},et={paused:!0,rulesSuspended:!1,slowMode:!1,aeonLocked:!1,phase:ie.IDLE,startupFailureMessage:""},tt={name:"",class:"",race:"",color:"",hp:0,maxhp:0,mp:0,maxmp:0,ep:0,maxep:0,wp:0,maxwp:0,bleed:0,rage:0,transcendence:0,dead:!1,mount:null,wielded:{left:null,right:null}},rt={id:"",text:"",isPlayer:null,hp:""},at={id:null,name:"",exits:{},items:{}},getChangedPatchKeys=(e={},t,a)=>Object.keys(e||{}).filter(e=>JSON.stringify(a[e])!==JSON.stringify(t[e])),createSystemConfigApi=({state:e,emit:t})=>({getRuntime:()=>e.runtime,getSettings:()=>e.settings,getBaselineIntent:()=>e.baselineIntent,setRuntime(a={}){const n=e.runtime,s=deepMerge(e.runtime,a),i=Object.keys(s).filter(e=>s[e]!==n[e]);if(!i.length)return!1;const o=n.paused;return e.runtime=s,e.runtime.paused!==o&&t("PauseStateChanged",{paused:e.runtime.paused}),t("RuntimeStateChanged",{current:e.runtime,changedKeys:i}),!0},setSettings(a={},n={}){const s=e.settings,i=deepMerge(e.settings,a),o=getChangedPatchKeys(a,s,i);return!!o.length&&(e.settings=i,n.setBaseline&&(e.baselineIntent=deepMerge(e.baselineIntent,a)),t("SettingsChanged",{current:e.settings,patch:a,changedKeys:o}),!0)},setBaselineIntent(a={}){const n=e.baselineIntent,s=deepMerge(e.baselineIntent,a),i=getChangedPatchKeys(a,n,s);return!!i.length&&(e.baselineIntent=s,t("BaselineIntentChanged",{current:e.baselineIntent,patch:a,changedKeys:i}),!0)}}),shallowEqualRecord=(e={},t={})=>{const a=Object.keys(e||{}),n=Object.keys(t||{});return a.length===n.length&&a.every(a=>e[a]===t[a])},collectChangedFields=(e={})=>{const t={};return Object.entries(e).forEach(([e,[a,n]])=>{a!==n&&(t[e]={previous:a,current:n})}),t},nt=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],normalizeResourceKey=e=>String(e||"").trim().toLowerCase(),hasOwn$3=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),normalizeResourceValue=(e,t={})=>{if(!t.numeric)return{valid:!0,value:e};const a=Number(e);if(!Number.isFinite(a))return{valid:!1,value:void 0};const n=Number(t.min),s=Number(t.max);let i=a;return Number.isFinite(n)&&i<n&&(i=n),Number.isFinite(s)&&i>s&&(i=s),{valid:!0,value:i}},isDragonClass=(e="")=>/\bdragon\b/i.test(String(e||"")),getDragonColor=(e="")=>{const t=String(e||"").trim().split(/\s+/).filter(Boolean),a=t.findIndex(e=>"dragon"===e.toLowerCase()),n=a>0?t[a-1]:"";return n?n[0].toUpperCase()+n.slice(1).toLowerCase():""},normalizeStatusClass=({className:e="",race:t="",classProvided:a=!1,raceProvided:n=!1}={})=>{const s=String(e||"").trim(),i=String(t||"").trim(),o=isDragonClass(s),l=isDragonClass(i);return o||!a&&n&&l?{className:"Dragon",color:getDragonColor(s)||getDragonColor(i)}:{className:normalizeClassName(s),color:""}},createSystemCharacterApi=({state:e,emit:t})=>({updateVitals(a={}){const n=toParsedGmcpVitals(a),s=n.resourceStats.filter(({balanceState:e})=>void 0===e),i={dead:e.char.dead};nt.forEach(t=>{i[t]=e.char[t]}),s.forEach(({key:t})=>{t in i||(i[t]=e.char[t])}),nt.forEach(t=>{void 0!==n.vitals[t]&&(e.char[t]=n.vitals[t])}),s.forEach(({key:t,value:a})=>{e.char[t]=a}),e.char.dead=e.char.hp<=0;const o={dead:[i.dead,e.char.dead]};nt.forEach(t=>{o[t]=[i[t],e.char[t]]}),s.forEach(({key:t})=>{o[t]=[i[t],e.char[t]]});const l=collectChangedFields(o);return!!Object.keys(l).length&&(t("VitalsUpdated",{current:e.char,hpDiff:e.char.hp-i.hp,mpDiff:e.char.mp-i.mp,changedFields:l}),e.char.dead&&!i.dead&&t("DeathDetected",{hp:e.char.hp,previousHp:i.hp}),!0)},updateResource(a,n,s={}){const i=normalizeResourceKey(a);if(!i)return!1;const o=normalizeResourceValue(n,s);if(!o.valid)return!1;const l=e.char[i];return!Object.is(l,o.value)&&(e.char[i]=o.value,t("VitalsUpdated",{current:e.char,hpDiff:0,mpDiff:0,changedFields:{[i]:{previous:l,current:o.value}},source:String(s.source||"manual")}),!0)},updateStatus(a={}){const n={name:e.char.name,class:e.char.class,race:e.char.race,color:e.char.color};hasOwn$3(a,"name")&&(e.char.name=a.name??""),hasOwn$3(a,"race")&&(e.char.race=a.race??"");const s=hasOwn$3(a,"class"),i=hasOwn$3(a,"race");if(s||i){const t=normalizeStatusClass({className:s?a.class:e.char.class,race:e.char.race,classProvided:s,raceProvided:i});e.char.class=t.className,e.char.color=t.color}const o=collectChangedFields({name:[n.name,e.char.name],class:[n.class,e.char.class],race:[n.race,e.char.race],color:[n.color,e.char.color]});return!!Object.keys(o).length&&(n.class!==e.char.class&&t("ClassChanged",{class:e.char.class,previousClass:n.class}),t("StatusUpdated",{current:e.char,changedFields:o}),!0)},updateWielded(a,n){if("left"!==a&&"right"!==a)return!1;const s=e.char.wielded[a],i=n?{id:n.id??null,name:String(n.name||""),icon:n.icon||null}:null;return(null!==s||null!==i)&&((!s||!i||s.id!==i.id||s.name!==i.name)&&(e.char.wielded[a]=i,t("WieldedUpdated",{side:a,current:i,previous:s}),!0))},updateMount(a){const n=e.char.mount,s=a?{name:String(a.name||""),id:a.id??null}:null;return n!==s&&((!n||!s||n.name!==s.name||n.id!==s.id)&&(e.char.mount=s,t("MountUpdated",{current:s,previous:n}),!0))},getChar:()=>e.char,getClass:()=>e.char.class,checkClass:t=>classesMatch(e.char.class,t),isClass:t=>void 0===t||!!t&&(Array.isArray(t)?t.some(t=>classesMatch(e.char.class,t)):classesMatch(e.char.class,t))}),st=["Text","text","short_desc"],hasOwn$2=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),getProvidedValue=(e,t,a,n="")=>{for(const s of t)if(hasOwn$2(e,s))return e[s]??n;return a},deriveIsPlayer=e=>"-1"===String(e),createSystemTargetApi=({state:e,emit:t})=>({updateTarget(a={}){const n=e.target,s={id:getProvidedValue(a,["id","ID"],n.id),text:getProvidedValue(a,st,n.text),hp:getProvidedValue(a,["HP","hp","hpperc"],n.hp)};if(s.isPlayer=deriveIsPlayer(s.id),s.id===n.id&&s.text===n.text&&s.hp===n.hp&&s.isPlayer===n.isPlayer)return!1;e.target=s;const i=st.some(e=>hasOwn$2(a,e)),o=s.id!==n.id||s.text!==n.text;return!(!i||!o)&&(t("TargetUpdated",{current:e.target,changedFields:collectChangedFields({id:[n.id,s.id],text:[n.text,s.text],isPlayer:[n.isPlayer,s.isPlayer],hp:[n.hp,s.hp]})}),!0)},isTarget(t){if(null==t)return!1;const a=String(t).toLowerCase();return e.target.text.toLowerCase()===a||String(e.target.id).toLowerCase()===a}}),hasOwn$1=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),createSystemRoomApi=({state:e,emit:t})=>({getRoom:()=>e.room,updateRoom(a={}){const n=e.room,s={id:hasOwn$1(a,"num")?a.num:n.id,name:hasOwn$1(a,"name")?a.name??"":n.name,exits:hasOwn$1(a,"exits")?{...a.exits??{}}:n.exits,items:n.items},i=collectChangedFields({id:[n.id,s.id],name:[n.name,s.name]});return shallowEqualRecord(n.exits,s.exits)||(i.exits={previous:n.exits,current:s.exits}),!!Object.keys(i).length&&(e.room=s,t("RoomUpdated",{current:e.room,changedFields:i}),!0)},setRoomItems(a={}){const n={...a};return!shallowEqualRecord(e.room.items,n)&&(e.room.items=n,t("RoomItemsUpdated",{current:e.room.items}),!0)}}),createSystemModel=(e={})=>{const t={settings:deepMerge(Ze,e.settings||{}),baselineIntent:deepMerge(Ze,e.baselineIntent||{}),runtime:deepMerge(et,e.runtime||{}),char:deepMerge(tt,e.char||{}),target:deepMerge(rt,e.target||{}),room:deepMerge(at,e.room||{})};t.runtime={...t.runtime};const a=new Set;let n=0;const emit=(e,t)=>{n+=1,a.forEach(a=>a(e,t))},s=createSystemConfigApi({state:t,emit}),i=createSystemCharacterApi({state:t,emit}),o=createSystemTargetApi({state:t,emit}),l=createSystemRoomApi({state:t,emit}),copySettingsBucket=(e={})=>({...e,notices:{...e.notices||{}},ss:{...e.ss||{}}}),copyCharSnapshot=(e={})=>({...e,mount:e.mount?{...e.mount}:null,wielded:{left:e.wielded?.left?{...e.wielded.left}:null,right:e.wielded?.right?{...e.wielded.right}:null}}),copyTargetSnapshot=(e={})=>({...e}),copyRoomSnapshot=(e={})=>({...e,exits:{...e.exits||{}},items:{...e.items||{}}}),c=createSnapshotCache({getVersion:()=>n,buildSnapshot:()=>({settings:copySettingsBucket(t.settings),baselineIntent:copySettingsBucket(t.baselineIntent),runtime:{...t.runtime},char:copyCharSnapshot(t.char),target:copyTargetSnapshot(t.target),room:copyRoomSnapshot(t.room)})});return{onChange:e=>(a.add(e),()=>a.delete(e)),snapshot:()=>c(),getRuntime:s.getRuntime,getSettings:s.getSettings,getBaselineIntent:s.getBaselineIntent,setRuntime:s.setRuntime,setSettings:s.setSettings,setBaselineIntent:s.setBaselineIntent,updateVitals:i.updateVitals,updateResource:i.updateResource,updateStatus:i.updateStatus,updateWielded:i.updateWielded,updateMount:i.updateMount,getChar:i.getChar,getClass:i.getClass,checkClass:i.checkClass,isClass:i.isClass,updateTarget:o.updateTarget,isTarget:o.isTarget,getRoom:l.getRoom,updateRoom:l.updateRoom,setRoomItems:l.setRoomItems}},createModels=({adapter:e,seedData:t,options:a={},now:n})=>{const s=Boolean(a.debug),i=createSystemModel({settings:{debug:s},baselineIntent:{debug:s}}),o=createAfflictionModel({affTable:t.affTable,now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),l=createBalanceModel({balanceTable:t.balanceTable,haveAff:e=>o.haveAff(e),now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),c=createDefenseModel({defTable:t.defTable,defPrios:t.defPrios});return{systemModel:i,affModel:o,balanceModel:l,defModel:c,cacheModel:createCacheModel({cacheTable:t.cacheTable,cacheNames:t.cacheNames,haveAff:e=>o.haveAff(e),haveDef:e=>c.haveDef(e)}),limbModel:createLimbModel({now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout})}},it="parry",ot=25,resetParryPriorities=e=>{Object.keys(Ee.long).forEach(t=>{e.setDefaultPriority(`parrying ${t}`,0,it),e.get(`guarding ${t}`)&&e.setDefaultPriority(`guarding ${t}`,0,it)})},createCombatDomainService=({affModel:e,defModel:t,limbModel:a,systemModel:n,queueController:s,serverside:i})=>({observeLimbHit:({limb:t,amount:n,source:s="manual",at:o}={})=>applyObservedLimbHit({limbModel:a,affModel:e,serverside:i,limb:t,amount:n,source:s,at:o}),observeLimbReset:({limb:t,source:n="manual",at:s}={})=>applyObservedLimbReset({limbModel:a,affModel:e,serverside:i,limb:t,source:n,at:s}),observeLimbStage:({limb:t,stage:n,source:s="manual",at:o}={})=>applyObservedLimbStage({limbModel:a,affModel:e,serverside:i,limb:t,stage:n,source:s,at:o}),parry(e){resetParryPriorities(t);const a=Ee.short[e]||e,i=t.get(`guarding ${a}`);let o;return i&&n.isClass(i.skills)?(t.setDefaultPriority(`guarding ${a}`,ot,it),o=`guard ${a}`):(t.setDefaultPriority(`parrying ${a}`,ot,it),n.isClass("Dragon")?(t.setCommand(`parrying ${a}`,`clawparry ${a}`,it),o=`clawparry ${a}`):(t.setCommand(`parrying ${a}`,`parry ${a}`,it),o=`parry ${a}`)),s.prepend("freeQueue",o),{limbName:a,command:o}}}),isRecordValue=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),hasSupportedSchemaVersion=e=>isRecordValue(e)&&isSupportedPersistenceSchemaVersion(e.schemaVersion),createPersistenceStore=({adapter:e,key:t="nexSys4Settings",noticeCenter:a}={})=>{let n=!1;const noticeSchemaResetIfNeeded=e=>{n||!isRecordValue(e)||null==e.schemaVersion||isSupportedPersistenceSchemaVersion(e.schemaVersion)||(n=!0,a?.publish?.("persistence","Saved nexSys4 settings were in an older format and have been reset to defaults.",{force:!0}))},read=()=>{const a=e.getVariable(t);return noticeSchemaResetIfNeeded(a),{key:t,exists:hasSupportedSchemaVersion(a),snapshot:deepClone$1(normalizePersistenceSnapshot(a))}},load=()=>read().snapshot,save=(a={})=>{const n=deepClone$1(normalizePersistenceSnapshot(a,{assumeCurrentVersion:!0}));return e.setVariable(t,n),deepClone$1(n)};return{key:t,read,load,save}},createNoticeCenter=({adapter:e,systemModel:t})=>({publish:(a,n,s={})=>{const i=t.getSettings().notices||{},{force:o=!1,...l}=s;(o||!1!==i[a])&&e.notice(String(n),{category:a,...l})}}),lt=Object.freeze({PLANNED:"planned",SENT:"sent",AWAITING_COMPLETION:"awaiting-completion",COMPLETED:"completed",EXPIRED:"expired",RECOVERING:"recovering"}),createOutputCycle=({adapter:e,dispatchCommands:t,systemModel:a,serverside:n,outputPlanner:s,noticeCenter:i,options:o={}}={})=>{const now=()=>e?.now?.()??Date.now();let l=[],c="",u=1,d=null,m=null,p=null,g=[];const h=`echo SystemEvent ${oe.OUTPUT_COMPLETE}`,b=Math.max(50,Number(o.outputCompletionTimeoutMs||1e3)),y=Math.max(0,Number(o.maxOutputRecoveryAttempts??2)),clearCompletionTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},recordBatchState=(e,t,a={})=>{if(!e)return null;const n=now();return e.state=t,e.stateHistory.push({state:t,at:n}),Object.assign(e,a),e},snapshotBatch=e=>e?{id:e.id,source:e.source,state:e.state,stateHistory:e.stateHistory.map(e=>({...e})),completionRequired:e.completionRequired,recoveryAttempts:e.recoveryAttempts,maxRecoveryAttempts:e.maxRecoveryAttempts,commands:[...e.commands],dispatchedCommands:[...e.dispatchedCommands],serversideCommands:[...e.serversideCommands],batchCount:e.batchCount,createdAt:e.createdAt,sentAt:e.sentAt??null,completedAt:e.completedAt??null,expiredAt:e.expiredAt??null,lastRecoveryAt:e.lastRecoveryAt??null}:null,storeLastBatch=e=>{m=snapshotBatch(e)},createBatch=({source:e,intents:t=[],commands:a,serversideCommands:n,maxCommands:s})=>{const i=t.some(e=>!0===e?.requiresCompletion),o=i?a.filter(e=>e!==h):[...a],l=i?chunkCommandsWithTrailing(o,{maxEntries:s,trailing:[h]}):chunkCommands(o,s);return{id:u++,source:e,state:lt.PLANNED,stateHistory:[{state:lt.PLANNED,at:now()}],completionRequired:i,recoveryAttempts:0,maxRecoveryAttempts:y,commands:[...o],dispatchedCommands:i?[...o,h]:[...o],serversideCommands:[...n],batches:l,batchCount:l.length,createdAt:now(),observedOutbound:!1}},dispatchBatchBatches=(e,a,n={})=>{a.forEach((s,i)=>{t(s,{source:n.source||"output-cycle",cycleSource:e.source,batch:i+1,batchCount:a.length,outputBatchId:e.id,outputBatchState:e.state,recoveryAttempt:n.recoveryAttempt||0})})},scheduleCompletionTimeout=t=>{clearCompletionTimer(),p=e?.setTimeout?.(()=>{if(d&&d.id===t.id&&d.completionRequired){if(recordBatchState(d,lt.EXPIRED,{expiredAt:now()}),c="",d.recoveryAttempts>=d.maxRecoveryAttempts)return i?.publish?.("output",`Output completion confirmation expired after ${d.maxRecoveryAttempts} recovery probe(s).`,{force:!0}),storeLastBatch(d),d=null,void clearCompletionTimer();d.recoveryAttempts+=1,recordBatchState(d,lt.RECOVERING,{lastRecoveryAt:now()}),dispatchBatchBatches(d,[[h]],{source:"output-cycle-recovery",recoveryAttempt:d.recoveryAttempts}),scheduleCompletionTimeout(d)}},b)};return{planAndSend:({source:e="prompt"}={})=>{const t=a.getRuntime(),i=a.getSettings();if(t.paused||t.rulesSuspended)return t.rulesSuspended&&n.evaluate({emitCommands:!1,source:`${e}:rule-suspend-check`}),[];const o=n.getCuringSets?.().activeSet||"";if(o&&"nexsys4-default"!==o)return[];if(d)return[];const u="output-complete"===e?[...g]:[];g=[];const m=s.plan({source:e,injectedCommands:l,suppressedServersideCommands:u});if(a.getRuntime().paused||a.getRuntime().rulesSuspended)return l=[],[];if(!m.commands.length)return l=[],[];const p=Math.max(1,Number(i.maxSendPerChunk||20)),h=createBatch({source:e,intents:m.intents,commands:m.commands,serversideCommands:m.serversideCommands,maxCommands:p}),b=h.dispatchedCommands.join("");return b===c?[]:(h.serversideCommands.length&&!h.observedOutbound&&(n.observeOutbound(h.serversideCommands),h.observedOutbound=!0),recordBatchState(h,lt.SENT,{sentAt:now()}),dispatchBatchBatches(h,h.batches),c=b,h.completionRequired?(d=h,recordBatchState(d,lt.AWAITING_COMPLETION),scheduleCompletionTimeout(d)):(recordBatchState(h,lt.COMPLETED,{completedAt:now()}),storeLastBatch(h)),l=[],m.commands)},markComplete:()=>!!d&&(clearCompletionTimer(),g=[...d.serversideCommands],d.serversideCommands.length&&n.acknowledgeCommands(d.serversideCommands),recordBatchState(d,lt.COMPLETED,{completedAt:now()}),storeLastBatch(d),d=null,!0),isWaitingForCompletion:()=>d?.state===lt.AWAITING_COMPLETION||d?.state===lt.RECOVERING,isBlockingOutput:()=>Boolean(d),getLifecycleState:()=>({activeBatch:snapshotBatch(d),lastBatch:snapshotBatch(m)}),invalidate(){c=""},injectCommands(e=[]){l=[...l,...e.filter(Boolean)]},dispose(){clearCompletionTimer(),d=null,g=[]}}},ct="nexSysSettings",isRecord$1=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),mergeLegacyDefPriorities=(e={},t={})=>{const a={};return new Set([...Object.keys(e),...Object.keys(t)]).forEach(n=>{const s=Number(t[n])||0;a[n]=s>0?s:Number(e[n])||0}),a},ut={customPrompt:"customPrompt",overrideTab:"overrideTab",loadOnLogin:"loadOnLogin",queueWhilePaused:"queueWhilePaused"},dt={echoOutput:"output",echoAffGot:"affGot",echoAffLost:"affLost",echoDefGot:"defGot",echoDefLost:"defLost",echoBalanceGot:"balanceRecovered",echoBalanceLost:"balanceLost",echoTrackableGot:"trackableGot",echoTrackableLost:"trackableLost",echoPrioritySet:"priority"},mt={sipPriority:"sipPriority",sipHealthAt:"sipHealthAt",sipManaAt:"sipManaAt",mossHealthAt:"mossHealthAt",mossManaAt:"mossManaAt",focus:"focus",focusOverHerbs:"focusOverHerbs",tree:"tree",clot:"clot",clotAt:"clotAt",insomnia:"insomnia",fracturesAbove:"fracturesAbove",manaAbilitiesAbove:"manaThreshold",clotAbove:"clotAbove",batch:"batch"},transformSystemSettings=(e={})=>{const t={};Object.entries(ut).forEach(([a,n])=>{void 0!==e[a]&&(t[n]=e[a])});const a={};Object.entries(dt).forEach(([t,n])=>{void 0!==e[t]&&(a[n]=Boolean(e[t]))}),Object.keys(a).length&&(t.notices=a);const n={};return Object.entries(mt).forEach(([t,a])=>{void 0!==e[t]&&(n[a]=normalizeStatusValue(a,e[t]))}),void 0!==e.curingMethod&&(n.transmutation="Transmutation"===e.curingMethod),Object.keys(n).length&&(t.ss=n),t},transformLegacySettings=(e={})=>({systemSettings:transformSystemSettings(e.systemSettings||{}),defSettings:{defaults:mergeLegacyDefPriorities(e.defSettings?.keepup,e.defSettings?.static)},cacheSettings:{precache:{...e.cacheSettings||{}}}}),importLegacySettings=({adapter:e,persistence:t,noticeCenter:a,legacyKey:n=ct}={})=>{if(t.read().exists)return!1;const s=e.getVariable(n);return!!isRecord$1(s)&&(t.save(transformLegacySettings(s)),a?.publish?.("persistence","Imported curing, defence, and cache settings from your original nexSys installation.",{force:!0}),!0)},createRuntimeServices=({adapter:e,options:t={},models:a,controllers:n})=>{const{systemModel:s,affModel:i,defModel:o,limbModel:l}=a,{commandDispatcher:c,queueController:u,serverside:d,defensePlanner:m,precachePlanner:p,outputPlanner:g}=n,h=createNoticeCenter({adapter:e,systemModel:s}),b=createPersistenceStore({adapter:e,key:t.persistenceKey||"nexSys4Settings",noticeCenter:h});return importLegacySettings({adapter:e,persistence:b,noticeCenter:h}),{persistence:b,combatService:createCombatDomainService({affModel:i,defModel:o,limbModel:l,systemModel:s,queueController:u,serverside:d}),noticeCenter:h,defensePlanner:m,precachePlanner:p,outputCycle:createOutputCycle({adapter:e,dispatchCommands:c.sendCommands,systemModel:s,serverside:d,outputPlanner:g,noticeCenter:h,options:t})}},createRuntimeDependencies=({adapter:e,seedData:t,options:a={}})=>{const now=()=>e.now(),n=createModels({adapter:e,seedData:t,options:a,now}),s=createDomainControllers({adapter:e,seedData:t,options:a,now,models:n}),i=createRuntimeServices({adapter:e,options:a,models:n,controllers:s});return{now,...s,...n,...i}},createRuntimeFlushCoordinator=({adapter:e,systemModel:t,serverside:a,outputCycle:n,flushGmcpBuffer:s})=>{const now=()=>e?.now?.()??Date.now(),i={started:!1,safetyTimer:null,dirty:!1,flushing:!1,dirtyAt:null},clearSafetyTimer=()=>{i.safetyTimer&&(e.clearTimeout(i.safetyTimer),i.safetyTimer=null)},isRuntimeReady=()=>isRuntimeReadyPhase(t.getRuntime().phase),hasPendingSafetyWork=()=>{const e="function"!=typeof a.isDirty||a.isDirty();return i.dirty&&e},scheduleSafetyFlush=()=>{const a=t.getSettings(),n=Number(a.flushSafetyMs||120),s=Number(a.flushSafetyMaxWaitMs||500),o=now();i.dirtyAt||(i.dirtyAt=o),clearSafetyTimer();const l=o-i.dirtyAt,c=l>=s?0:Math.min(n,s-l);i.safetyTimer=e.setTimeout(()=>{i.safetyTimer=null,hasPendingSafetyWork()?(i.dirtyAt=null,flushCycle("safety-flush")):i.dirtyAt=null},c)},invalidateOutput=()=>{i.dirty=!0,n.invalidate?.()},markDirty=(e="dirty")=>{if(invalidateOutput(),a.markDirty(e),!isRuntimeReady())return clearSafetyTimer(),void(i.dirtyAt=null);i.flushing||n.isBlockingOutput?.()||scheduleSafetyFlush()},flushCycle=(e="prompt")=>{if(!i.started||i.flushing)return[];if(clearSafetyTimer(),!isRuntimeReady())return[];i.flushing=!0;try{if(s(),t.getRuntime().paused)return i.dirty=!1,[];const a=n.planAndSend({source:e});return i.dirty=n.isBlockingOutput()&&0===a.length,i.dirty||(i.dirtyAt=null),a}finally{i.flushing=!1}};return{start(){i.started=!0},stop(){i.started=!1,i.dirty=!1,i.flushing=!1,i.dirtyAt=null,clearSafetyTimer()},isStarted:()=>i.started,isFlushing:()=>i.flushing,invalidateOutput,markDirty,flushCycle}},cell=(e="",t="",a="")=>({text:e,fg:t,bg:a}),createDefaultCureColors=()=>({antimony:{fg:"olive",bg:""},argentum:{fg:"royalblue",bg:""},arsenic:{fg:"",bg:""},aurum:{fg:"ForestGreen",bg:""},azurite:{fg:"",bg:""},bisemutum:{fg:"",bg:""},calamine:{fg:"",bg:""},calcite:{fg:"slategray",bg:""},cinnabar:{fg:"greenyellow",bg:""},cuprum:{fg:"DeepSkyBlue",bg:""},ferrum:{fg:"DarkOrange",bg:""},gypsum:{fg:"",bg:""},magnesium:{fg:"Red",bg:""},plumbum:{fg:"Gold",bg:""},potash:{fg:"",bg:""},quartz:{fg:"",bg:""},quicksilver:{fg:"",bg:""},realgar:{fg:"firebrick",bg:""},stannum:{fg:"Tan",bg:""},caloric:{fg:"darkseagreen",bg:""},mending:{fg:"orchid",bg:""},epidermal:{fg:"sienna",bg:""},restoration:{fg:"darkviolet",bg:""},health:{fg:"lightpink",bg:""},writhe:{fg:"PaleGoldenRod",bg:"darkslategray"}}),createDefaultVars=()=>({blackout:!1,paused:cell("","red"),retard:cell("","blue"),aeon:cell("","red"),h:cell("0","green"),m:cell("0","green"),e:cell("0","green"),w:cell("0","green"),maxh:cell(""),maxm:cell(""),maxe:cell(""),maxw:cell(""),ph:cell("100%","green"),pm:cell("100%","green"),pe:cell("100%"),pw:cell("100%"),diffh:cell("","green"),diffm:cell("","green"),diffhp:cell("","green"),diffmp:cell("","green"),target:cell("","pink"),targetHP:cell("","green"),eq:cell(""),bal:cell(""),c:cell(""),k:cell(""),d:cell(""),b:cell(""),shield:cell("","cyan"),prismatic:cell("","magenta"),rage:cell("","red"),karma:cell("","green"),transcendence:cell("","cyan"),essence:cell("","purple"),kai:cell("","blue")}),createDefaultAffs=(e=createDefaultCureColors())=>({addiction:{text:"add",...e.ferrum},aeon:{text:"ae",...e.cinnabar},agoraphobia:{text:"agor",...e.argentum},amnesia:{text:"amn",fg:"",bg:""},anorexia:{text:"ANO",...e.epidermal},asthma:{text:"AST",...e.aurum},blackout:{text:"bo",fg:"",bg:""},blindness:{text:"unb",...e.arsenic},bound:{text:"bnd",...e.writhe},brokenleftarm:{text:"la1",...e.mending},brokenleftleg:{text:"ll1",...e.mending},brokenrightarm:{text:"ra1",...e.mending},brokenrightleg:{text:"rl1",...e.mending},bruisedribs:{text:"ribs",fg:"",bg:""},burning:{text:"burn",...e.mending},calcifiedskull:{text:"calh",...e.restoration},calcifiedtorso:{text:"calt",...e.restoration},claustrophobia:{text:"clau",...e.stannum},clumsiness:{text:"clu",...e.aurum},concussion:{text:"conc",...e.restoration},confusion:{text:"con",...e.stannum},corruption:{text:"corr",fg:"",bg:""},crackedribs:{text:"cr",...e.health},crushedthroat:{text:"cru",...e.mending},daeggerimpale:{text:"daeg",...e.writhe},damage:{text:"dmg",fg:"tomato",bg:""},damagedleftarm:{text:"la2",...e.restoration},damagedleftleg:{text:"ll2",...e.restoration},damagedrightarm:{text:"ra2",...e.restoration},damagedrightleg:{text:"rl2",...e.restoration},damagedhead:{text:"hd2",...e.restoration},darkshade:{text:"dark",...e.ferrum},dazed:{text:"dzd",...e.cinnabar},dazzled:{text:"dzl",...e.mending},deadening:{text:"dea",...e.cinnabar},deafness:{text:"und",...e.calamine},dehydrated:{text:"deh",fg:"",bg:""},dementia:{text:"dem",...e.stannum},depression:{text:"dep",...e.plumbum},deteriorate:{text:"det",fg:"",bg:""},disloyalty:{text:"disl",...e.realgar},disrupted:{text:"disr",fg:"",bg:""},dissonance:{text:"disso",...e.plumbum},dizziness:{text:"diz",...e.plumbum},enscorcelled:{text:"ensor",fg:"",bg:""},entangled:{text:"entgl",...e.writhe},epilepsy:{text:"epi",...e.plumbum},fear:{text:"fear",fg:"",bg:""},flushings:{text:"flush",...e.ferrum},fratricide:{text:"frat",...e.ferrum},frozen:{text:"frz",...e.caloric},generosity:{text:"gen",...e.cuprum},grievouswounds:{text:"grv",...e.health},guilt:{text:"gui",...e.argentum},haemophilia:{text:"haem",...e.ferrum},hallucinations:{text:"hall",...e.stannum},hamstrung:{text:"hms",fg:"",bg:""},healthleech:{text:"hthl",...e.aurum},heartseed:{text:"heart",...e.restoration},hellsight:{text:"hell",...e.realgar},horror:{text:"hor",...e.plumbum},hypersomnia:{text:"hypers",...e.stannum},hypochondria:{text:"hypoch",...e.lobelia},hypothermia:{text:"hypoth",...e.restoration},icefisted:{text:"ice",fg:"",bg:""},impaled:{text:"impl",...e.writhe},impatience:{text:"IMPAT",...e.plumbum},indifference:{text:"ind",...e.cuprum},insomnia:{text:"insomnia",fg:"",bg:""},itching:{text:"itch",...e.epidermal},justice:{text:"just",...e.cuprum},kkractlebrand:{text:"kkr",...e.health},laceratedthroat:{text:"lac2",...e.restoration},latched:{text:"latch",...e.health},lethargy:{text:"let",...e.ferrum},lightbind:{text:"light",fg:"",bg:""},loneliness:{text:"lon",...e.argentum},lovers:{text:"love",...e.cuprum},manaleech:{text:"man",...e.realgar},mangledleftarm:{text:"la3",...e.restoration},mangledleftleg:{text:"ll3",...e.restoration},mangledrightarm:{text:"ra3",...e.restoration},mangledrightleg:{text:"rl3",...e.restoration},mangledhead:{text:"hd3",...e.restoration},masochism:{text:"maso",...e.argentum},mildtrauma:{text:"tor1",...e.restoration},mycalium:{text:"myc",...e.plumbum},nausea:{text:"nau",...e.ferrum},numbedleftarm:{text:"nbla",fg:"",bg:""},numbedrightarm:{text:"nbra",fg:"",bg:""},pacified:{text:"pac",...e.cuprum},paralysis:{text:"PAR",...e.magnesium},paranoia:{text:"prn",...e.stannum},parasite:{text:"prs",...e.aurum},peace:{text:"pea",...e.cuprum},phlogisticated:{text:"phlog",fg:"",bg:""},pinshot:{text:"psh",fg:"",bg:""},pressure:{text:"pres",...e.calcite},prone:{text:"pr",fg:"",bg:""},pyramides:{text:"pyra",...e.magnesium},pyre:{text:"pyre",...e.cuprum},rebbies:{text:"reb",...e.aurum},recklessness:{text:"reck",...e.argentum},retardation:{text:"ret",fg:"",bg:""},retribution:{text:"retr",...e.cuprum},revealed:{text:"rev",fg:"",bg:""},sandfever:{text:"sand",...e.plumbum},scalded:{text:"scald",...e.epidermal},scytherus:{text:"scy",...e.ferrum},selarnia:{text:"sel",...e.mending},sensitivity:{text:"sen",...e.aurum},serioustrauma:{text:"tor2",...e.restoration},shadowmadness:{text:"shad",...e.plumbum},shivering:{text:"shiv",...e.caloric},shyness:{text:"shy",...e.plumbum},skullfractures:{text:"sf",...e.health},slashedthroat:{text:"lac1",...e.epidermal},sleeping:{text:"slp",fg:"",bg:""},slickness:{text:"SLI",...e.magnesium},slimeobscure:{text:"nkh",fg:"",bg:""},spiritburn:{text:"spirB",...e.argentum},spiritwrack:{text:"spirW",fg:"",bg:""},stupidity:{text:"st",...e.plumbum},stuttering:{text:"stut",...e.epidermal},homunculusmercury:{text:"merc",fg:"",bg:""},temperedcholeric:{text:"choH",...e.antimony},temperedmelancholic:{text:"melaH",...e.antimony},temperedphlegmatic:{text:"phleH",...e.antimony},temperedsanguine:{text:"sanH",...e.antimony},tenderskin:{text:"tend",...e.argentum},tension:{text:"tens",...e.cinnabar},timeflux:{text:"tmfx",fg:"",bg:""},timeloop:{text:"tmlp",...e.cuprum},tonguetied:{text:"tngt",...e.restoration},torntendons:{text:"tt",...e.health},transfixation:{text:"trfx",...e.writhe},unweavingbody:{text:"unwB",...e.ferrum},unweavingspirit:{text:"unwS",...e.cinnabar},unweavingmind:{text:"unwM",...e.plumbum},vertigo:{text:"vert",...e.argentum},vitrified:{text:"vitri",fg:"",bg:""},voidfisted:{text:"void",fg:"",bg:""},voyria:{text:"voy",fg:"",bg:""},weariness:{text:"wea",...e.aurum},webbed:{text:"web",...e.writhe},whisperingmadness:{text:"mad",...e.argentum},wristfractures:{text:"wf",...e.health}}),createDefaultPromptState=()=>{const e=createDefaultCureColors();return{vars:createDefaultVars(),affs:createDefaultAffs(e),cureColors:e}},pt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},escapeHtml=e=>String(e??"").replace(/[&<>"']/g,e=>pt[e]),renderChunk=(e,t="",a="")=>{if(""===e||null==e)return"";const n=[];return t&&n.push(`color:${t}`),a&&n.push(`background-color:${a}`),`<span${n.length?` style="${n.join(";")}"`:""}>${escapeHtml(e)}</span>`},createPromptBuilder=({vars:e,affs:t,cureColors:a,renderAffsHtml:n,renderDiffHtml:s,renderTargetHtml:i,renderVarHtml:o,renderChunkHtml:l=renderChunk})=>{const c=[],u={vars:e,affs:t,cureColors:a,add(t,a,n){if(""===t||null==t)return u;const s="string"==typeof t?e[t]:null;return s&&"object"==typeof s&&"text"in s?c.push("function"==typeof o?o(t):l(s.text,s.fg,s.bg)):c.push(l(t,a,n)),u},addHTML:e=>(e&&c.push(String(e)),u),addAffs:()=>(c.push(n()),u),addDiff:()=>(c.push(s()),u),addTarget:()=>(c.push(i()),u),toHTML:()=>`<span class="nexsys-prompt">${c.join("")}</span>`};return u},gt=new Set(["diffh","diffm","diffhp","diffmp"]),ft=new Set(["target","targetHP"]),getCellSignature=(e={})=>`${String(e.text??"")}\0${String(e.fg??"")}\0${String(e.bg??"")}`,createPromptRenderer=({state:e,getComposer:t,getSortedAffNames:a,getAffSnapshot:n,renderChunkHtml:s=renderChunk})=>{const i=new Map,o=new Map,l=new Map,c=new Map;let u="",d="",m="",p="",g=!0,h=!0,b=!0,y=!0,v=null,S=Boolean(e.vars.blackout),x=[];const markPromptDirty=()=>{y=!0},markVarsDirty=(t=[])=>{Array.isArray(t)&&t.length&&(t.forEach(t=>{const a=e.vars[t];a&&"object"==typeof a&&"text"in a&&o.delete(t),gt.has(t)&&(h=!0),ft.has(t)&&(b=!0)}),y=!0)},syncExternalVarMutations=()=>{let t=!1;const a=new Set;Object.keys(e.vars||{}).forEach(n=>{a.add(n);const s=e.vars[n];if(!s||"object"!=typeof s||!("text"in s))return void((o.has(n)||i.has(n))&&(o.delete(n),i.delete(n),t=!0));const l=getCellSignature(s);o.get(n)!==l&&(o.delete(n),i.delete(n),t=!0,gt.has(n)&&(h=!0),ft.has(n)&&(b=!0))}),[...o.keys()].forEach(e=>{a.has(e)||(o.delete(e),i.delete(e),t=!0,gt.has(e)&&(h=!0),ft.has(e)&&(b=!0))});const n=Boolean(e.vars.blackout);n!==S&&(S=n,t=!0),t&&(y=!0)},syncExternalAffMutations=()=>{if(g||!x.length)return;let t=!1;x.forEach(a=>{const n=getCellSignature(e.affs[a]||{});l.get(a)!==n&&(t=!0)}),t&&(g=!0,y=!0)},syncExternalCureColorMutations=()=>{let t=!1;const a=new Set;Object.keys(e.cureColors||{}).forEach(n=>{a.add(n);const s=getCellSignature(e.cureColors[n]||{});c.get(n)!==s&&(t=!0)}),[...c.keys()].forEach(e=>{a.has(e)||(t=!0)}),t&&(y=!0)},renderVarHtml=t=>{const a=e.vars[t];if(!a||"object"!=typeof a||!("text"in a))return"";const n=getCellSignature(a);return o.get(t)===n&&i.has(t)||(i.set(t,s(a.text,a.fg,a.bg)),o.set(t,n)),i.get(t)||""},buildAffsHtml=()=>{const t=a()||[],{affs:i}=e;if(x=[...t],l.clear(),!t.length)return'<span class="nexsys-prompt-affs mono"></span>';const o=[s("[","brown")];for(let e=0;e<t.length;e+=1){const a=t[e],c=i[a]||{text:a,fg:"",bg:""},u="function"==typeof n&&n(a)||{},d=Number(u.max)>1&&Number.isFinite(Number(u.count))?`(${Number(u.count)})`:"";l.set(a,getCellSignature(i[a]||{}));const m=e<t.length-1?" ":"";o.push(s(`${c.text}${d}${m}`,c.fg,c.bg))}return o.push(s("]","brown")),`<span class="nexsys-prompt-affs mono">${o.join("")}</span>`},renderAffsHtml=()=>(g&&(u=buildAffsHtml(),g=!1),u),renderDiffHtml=()=>{if(h){const t=e.vars.diffh||{},a=e.vars.diffhp||{},n=e.vars.diffm||{},i=e.vars.diffmp||{},o=[];t.text&&(o.push(s(`${t.text}h`,t.fg,t.bg)),a.text&&o.push(s(`(${a.text})`,a.fg,a.bg))),n.text&&(o.length&&o.push(s(", ")),o.push(s(`${n.text}m`,n.fg,n.bg)),i.text&&o.push(s(`(${i.text})`,i.fg,i.bg))),d=o.join(""),h=!1}return d},renderTargetHtml=()=>{if(b){const t=e.vars.target||{},a=e.vars.targetHP||{},n=[];(t.text||a.text)&&(n.push(s(" [")),t.text&&n.push(renderVarHtml("target")),t.text&&a.text&&n.push(s(": ")),a.text&&n.push(renderVarHtml("targetHP")),n.push(s("] "))),m=n.join(""),b=!1}return m},resetTransients=()=>{const{vars:t}=e,a=["diffh","diffm","diffhp","diffmp"].filter(e=>{const a=t[e];return!(!a||""===a.text)&&(a.text="",!0)});a.length&&markVarsDirty(a)};return{render(){const a=t();if("function"!=typeof a)return"";if(syncExternalVarMutations(),syncExternalAffMutations(),syncExternalCureColorMutations(),!y&&a===v)return p;const n=createPromptBuilder({vars:e.vars,affs:e.affs,cureColors:e.cureColors,renderAffsHtml,renderDiffHtml,renderTargetHtml,renderVarHtml,renderChunkHtml:s});try{a(n)}catch(i){return console.error("nexSys4 prompt compose error",i),""}return p=n.toHTML(),y=!1,v=a,Object.keys(e.cureColors||{}).forEach(t=>{c.set(t,getCellSignature(e.cureColors[t]||{}))}),[...c.keys()].forEach(t=>{t in(e.cureColors||{})||c.delete(t)}),resetTransients(),p},markAffsDirty(){g=!0,y=!0},isAffDirty:()=>g,markDiffDirty(){h=!0,y=!0},markTargetDirty(){b=!0,y=!0},markVarsDirty,markPromptDirty,isPromptDirty:()=>y}},defaultCompose=e=>{const{vars:t}=e;t.blackout?e.add("-","reset"):(e.add("paused"),e.add("aeon"),e.add("retard"),e.add("h"),e.add(`(${t.ph.text}), `,t.h.fg,t.h.bg),e.add("m"),e.add(`(${t.pm.text}) `,t.m.fg,t.m.bg),t.rage.text&&Number(t.rage.text)>0&&e.add(`${t.rage.text}R `,t.rage.fg,t.rage.bg),t.karma.text&&e.add(`${t.karma.text}K `,t.karma.fg,t.karma.bg),e.add("eq"),e.add("bal"),e.add("|"),e.add("c"),e.add("k"),e.add("d"),e.add("b"),e.add(" "),e.addAffs(),e.addDiff())},ht=new Set(["diffh","diffm","diffhp","diffmp"]),bt=new Set(["target","targetHP"]),yt=Object.freeze(["deafness","blindness","insomnia"]),clampPct=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>100?100:t:0},colorGradation=e=>{const t=clampPct(e),a=t<75?50:Math.abs(t-100)/2+25;return`hsl(${(1.2*t).toFixed(0)}, 100%, ${a}%)`},colorPercentage=e=>{const t=Number(e)||0;return t>75?"green":t>=33?"yellow":"red"},createPromptPresenter=({publicEvents:e,affModel:t,defModel:a,balanceModel:n,systemModel:s,renderPrompt:i}={})=>{const o=createDefaultPromptState();let l=defaultCompose;const isPromptDefTracked=e=>"function"==typeof a?.get?Boolean(a.get(e)):"function"==typeof a?.haveDef,c=yt.filter(isPromptDefTracked),u=new Set(c),haveDef=e=>Boolean(a?.haveDef?.(e)),d=createPromptRenderer({state:o,getComposer:()=>l,getSortedAffNames:()=>{const e=t?.currentSorted&&t.currentSorted()||[],a=new Set,n=[];return e.forEach(e=>{u.has(e)||a.has(e)||(a.add(e),n.push(e))}),c.forEach(e=>{haveDef(e)||a.has(e)||(a.add(e),n.push(e))}),n},getAffSnapshot:e=>t?.get?.(e)||null}),isRecord=e=>e&&"object"==typeof e&&!Array.isArray(e),isCellLike=e=>isRecord(e)&&("text"in e||"fg"in e||"bg"in e),normalizeCellField=e=>null==e?"":String(e),getVarRegion=e=>ht.has(e)?"diff":bt.has(e)?"target":"",ensureVarCell=e=>{const t=o.vars[e];if(t&&"object"==typeof t&&"text"in t)return t;if(e in o.vars)return null;const a={text:"",fg:"",bg:""};return o.vars[e]=a,d.markPromptDirty(),a},applyCell=(e,t={},a={})=>{const n=a.create?ensureVarCell(e):o.vars[e];if(!n||"object"!=typeof n||!("text"in n))return!1;let s=!1;if("text"in t){const e=normalizeCellField(t.text);n.text!==e&&(n.text=e,s=!0)}if("fg"in t){const e=normalizeCellField(t.fg);n.fg!==e&&(n.fg=e,s=!0)}if("bg"in t){const e=normalizeCellField(t.bg);n.bg!==e&&(n.bg=e,s=!0)}return!!s&&(d.markVarsDirty([e]),"diff"===a.region&&d.markDiffDirty(),"target"===a.region&&d.markTargetDirty(),!0)},applyFlag=(e,t)=>{const a=Boolean(t);return o.vars[e]!==a&&(o.vars[e]=a,d.markPromptDirty(),!0)},updateBalanceGlyphs=()=>{applyCell("eq",{text:n?.have?.(Fe.EQUILIBRIUM)?"e":""}),applyCell("bal",{text:n?.have?.(Fe.BALANCE)?"x":""})},updateDefGlyphs=()=>{applyCell("c",{text:haveDef("cloak")?"c":""}),applyCell("k",{text:haveDef("kola")?"k":""}),applyCell("d",{text:haveDef("deafness")?"d":""}),applyCell("b",{text:haveDef("blindness")?"b":""}),applyCell("shield",{text:haveDef("shield")?"(":""}),applyCell("prismatic",{text:haveDef("prismatic")?"[":""})},pctOf=(e,t)=>{const a=Number(e)||0,n=Number(t)||0;return n>0?100*a/n:0},onVitals=(e={})=>{const t=e.current||s?.snapshot?.().char||{},a=pctOf(t.hp,t.maxhp),n=pctOf(t.mp,t.maxmp),i=pctOf(t.ep,t.maxep),o=pctOf(t.wp,t.maxwp);applyCell("h",{text:t.hp??"",fg:colorGradation(a)}),applyCell("m",{text:t.mp??"",fg:colorGradation(n)}),applyCell("e",{text:t.ep??"",fg:colorGradation(i)}),applyCell("w",{text:t.wp??"",fg:colorGradation(o)}),applyCell("maxh",{text:t.maxhp??""}),applyCell("maxm",{text:t.maxmp??""}),applyCell("maxe",{text:t.maxep??""}),applyCell("maxw",{text:t.maxwp??""}),applyCell("ph",{text:`${a.toFixed(1)}%`}),applyCell("pm",{text:`${n.toFixed(1)}%`}),applyCell("pe",{text:`${i.toFixed(1)}%`}),applyCell("pw",{text:`${o.toFixed(1)}%`});const l=Number(e.hpDiff||0),c=Number(e.mpDiff||0),u=Number(t.maxhp)||0,d=Number(t.maxmp)||0;if(l){const e=l<0?"red":"green";applyCell("diffh",{text:`${l>0?"+":""}${l}`,fg:e},{region:"diff"}),applyCell("diffhp",{text:u?`${(l/u*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}if(c){const e=c<0?"red":"green";applyCell("diffm",{text:`${c>0?"+":""}${c}`,fg:e},{region:"diff"}),applyCell("diffmp",{text:d?`${(c/d*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}"karma"in t&&applyCell("karma",{text:t.karma??""}),"rage"in t&&applyCell("rage",{text:t.rage??""}),"transcendence"in t&&applyCell("transcendence",{text:t.transcendence??""}),"essence"in t&&applyCell("essence",{text:t.essence??""}),"kai"in t&&applyCell("kai",{text:t.kai??""}),applyFlag("blackout",t.dead)},onRuntimeChange=()=>{const e=s?.snapshot?.().runtime||{};applyCell("retard",{text:e.slowMode?"(r)":""}),applyCell("paused",{text:e.paused?"(p)":""}),applyCell("aeon",{text:e.aeonLocked?"(a)":""})},onTargetChange=()=>{const e=s?.snapshot?.().target||{};applyCell("target",{text:e.text||""},{region:"target"}),applyCell("targetHP",{text:e.hp||""},{region:"target"});const t=parseInt(e.hp,10);Number.isFinite(t)&&applyCell("targetHP",{fg:colorGradation(t)},{region:"target"})},onAffEvent=(e={})=>{"aeon"===e?.name&&applyCell("aeon",{text:t?.haveAff?.("aeon")?"(a)":""}),d.markAffsDirty()},onDefEvent=(e={})=>{updateDefGlyphs(),u.has(e?.id)&&d.markAffsDirty()},onBalanceEvent=()=>updateBalanceGlyphs(),m=[];let p=!1;const subscribe=(t,a)=>{if(!e||"function"!=typeof e.on)return;const n=e.on(t,a);"function"==typeof n&&m.push(n)};return{start:()=>{p||(p=!0,subscribe(se.SYSTEM_VITALS_CHANGED,onVitals),subscribe(se.SYSTEM_RUNTIME_CHANGED,onRuntimeChange),subscribe(se.SYSTEM_PAUSE_CHANGED,onRuntimeChange),subscribe(se.SYSTEM_TARGET_CHANGED,onTargetChange),subscribe(se.AFF_GOT,onAffEvent),subscribe(se.AFF_LOST,onAffEvent),subscribe(se.AFF_STACK_CHANGED,onAffEvent),subscribe(se.AFF_PRIORITY_CHANGED,()=>d.markAffsDirty()),subscribe(se.DEF_GOT,onDefEvent),subscribe(se.DEF_LOST,onDefEvent),subscribe(se.BALANCE_GOT,onBalanceEvent),subscribe(se.BALANCE_LOST,onBalanceEvent),subscribe(se.BALANCE_RESET,onBalanceEvent),subscribe(se.BALANCE_TIMER_RESTARTED,onBalanceEvent),updateDefGlyphs(),updateBalanceGlyphs(),onRuntimeChange())},stop:()=>{m.forEach(e=>{try{e()}catch(t){console.error("nexSys4 prompt presenter unsubscribe failed",t)}}),m.length=0,p=!1},render:(e={})=>{const t=d.render();return"function"==typeof i?i(t,e):t},markAffsDirty:()=>d.markAffsDirty(),markPromptDirty:()=>d.markPromptDirty(),patchVars:(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{const n=o.vars[e],s=getVarRegion(e);"boolean"!=typeof n?"boolean"!=typeof a||void 0!==n?t=applyCell(e,isCellLike(a)?a:{text:a},{create:!0,region:s})||t:o.vars[e]!==a&&(o.vars[e]=a,d.markPromptDirty(),t=!0):t=applyFlag(e,a)||t}),t},patchAffs:(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.affs&&(delete o.affs[e],t=!0));const n=isCellLike(a)?a:{text:a},s=o.affs[e],i=s&&"object"==typeof s?s:o.affs[e]={text:"",fg:"",bg:""};["text","fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t&&d.markAffsDirty(),t},patchCureColors:(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.cureColors&&(delete o.cureColors[e],t=!0));const n=isRecord(a)?a:{fg:a},s=o.cureColors[e],i=s&&"object"==typeof s?s:o.cureColors[e]={fg:"",bg:""};["fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t&&d.markPromptDirty(),t},colorGradation,colorPercentage,get vars(){return o.vars},get affs(){return o.affs},get cureColors(){return o.cureColors},get compose(){return l},set compose(e){l="function"==typeof e?e:defaultCompose,d.markPromptDirty()},_state:o,_onVitals:onVitals,_onAffEvent:onAffEvent,_onDefEvent:onDefEvent,_onBalanceEvent:onBalanceEvent,_onRuntimeChange:onRuntimeChange,_onTargetChange:onTargetChange}},vt=Object.freeze({INTERNAL:"internal",JS:"js",EVENTSTREAM:"eventstream"}),St=Object.freeze({STABLE:"stable",EXPERIMENTAL:"experimental",DEPRECATED:"deprecated"}),xt=/^nexsys4(\.[a-z0-9_-]+)+$/,Ct=Object.freeze(Object.values(vt)),kt=Object.freeze(Object.values(St)),At=Object.freeze({[vt.INTERNAL]:Object.freeze([null,vt.INTERNAL]),[vt.JS]:Object.freeze([null,vt.INTERNAL,vt.JS]),[vt.EVENTSTREAM]:Object.freeze([null,vt.INTERNAL,vt.JS,vt.EVENTSTREAM])}),topicEntry=(e,t,a={})=>{const n=a.scopedAudience??null,s={audience:e,scopedAudience:n,stability:a.stability??St.STABLE,description:t};return null!=n&&a.scopedPayloadKey&&(s.scopedPayloadKey=a.scopedPayloadKey),Object.freeze(s)},eventStreamTopic=(e,t={})=>topicEntry(vt.EVENTSTREAM,e,t),jsTopic=(e,t={})=>topicEntry(vt.JS,e,t),scopedEventStreamTopic=(e,t)=>eventStreamTopic(e,{scopedAudience:vt.EVENTSTREAM,scopedPayloadKey:t}),isScopedAudienceAllowed=(e,t)=>{const a=At[e];return Array.isArray(a)&&a.includes(t)},validateRegistryEntry=(e,t)=>{if(!xt.test(e))throw new Error(`Invalid topic registry key "${e}": expected lowercase dotted nexsys4.* form.`);if(!t||"object"!=typeof t||Array.isArray(t))throw new Error(`Invalid registry entry for "${e}": expected an object.`);if(!Ct.includes(t.audience))throw new Error(`Invalid audience for "${e}": received "${t.audience}".`);if(!("scopedAudience"in t))throw new Error(`Missing scopedAudience metadata for "${e}".`);if(null!=t.scopedAudience&&!Ct.includes(t.scopedAudience))throw new Error(`Invalid scopedAudience for "${e}": received "${t.scopedAudience}".`);if(!isScopedAudienceAllowed(t.audience,t.scopedAudience??null))throw new Error(`Invalid scopedAudience for "${e}": "${t.scopedAudience}" exceeds base audience "${t.audience}".`);if(null!=t.scopedAudience&&("string"!=typeof t.scopedPayloadKey||!t.scopedPayloadKey.trim()))throw new Error(`Missing scopedPayloadKey for scoped topic "${e}".`);if(!kt.includes(t.stability))throw new Error(`Invalid stability for "${e}": received "${t.stability}".`);if("string"!=typeof t.description||!t.description.trim())throw new Error(`Invalid description for "${e}": expected a non-empty string.`)},validateTopicRegistry=(e,t=Object.values(se))=>{if(!e||"object"!=typeof e||Array.isArray(e))throw new Error("Invalid topic registry: expected an object.");for(const a of t)if(!Object.prototype.hasOwnProperty.call(e,a))throw new Error(`Missing registry entry for "${a}".`);for(const a of Object.keys(e)){if(!t.includes(a))throw new Error(`Unexpected registry entry for "${a}".`);validateRegistryEntry(a,e[a])}return!0},Et=Object.freeze({[se.RUNTIME_STARTED]:eventStreamTopic("Runtime startup completed."),[se.RUNTIME_STOPPED]:eventStreamTopic("Runtime shutdown completed."),[se.RAW_GMCP]:eventStreamTopic("Raw GMCP payload observed at the adapter boundary."),[se.SYSTEM_VITALS_CHANGED]:eventStreamTopic("Character vitals changed."),[se.SYSTEM_HEALTH_CHANGED]:eventStreamTopic("Health changed."),[se.SYSTEM_MANA_CHANGED]:eventStreamTopic("Mana changed."),[se.SYSTEM_RAGE_CHANGED]:eventStreamTopic("Rage changed."),[se.SYSTEM_BLEED_CHANGED]:eventStreamTopic("Bleed changed."),[se.SYSTEM_STATUS_CHANGED]:eventStreamTopic("Character status snapshot changed."),[se.SYSTEM_CLASS_CHANGED]:eventStreamTopic("Character class changed."),[se.SYSTEM_TARGET_CHANGED]:eventStreamTopic("Current target changed."),[se.SYSTEM_ROOM_CHANGED]:eventStreamTopic("Current room changed."),[se.SYSTEM_ROOM_ITEMS_CHANGED]:eventStreamTopic("Visible room items changed."),[se.SYSTEM_RUNTIME_CHANGED]:jsTopic("Runtime implementation state changed."),[se.SYSTEM_PAUSE_CHANGED]:eventStreamTopic("Runtime pause state changed."),[se.SYSTEM_PAUSED]:eventStreamTopic("Runtime paused."),[se.SYSTEM_UNPAUSED]:eventStreamTopic("Runtime unpaused."),[se.SYSTEM_LOADED]:eventStreamTopic("Startup game-state initialization completed."),[se.SYSTEM_SETTINGS_CHANGED]:jsTopic("Runtime settings changed."),[se.SYSTEM_BASELINE_CHANGED]:jsTopic("Baseline intent changed."),[se.SYSTEM_DEATH_DETECTED]:eventStreamTopic("Death was detected from character state."),[se.SYSTEM_MOUNT_CHANGED]:eventStreamTopic("Mounted state changed."),[se.SYSTEM_WIELDED_CHANGED]:eventStreamTopic("Wielded equipment changed."),[se.UI_CONFIG_CHANGED]:jsTopic("Configuration dialog open state changed."),[se.AFF_GOT]:scopedEventStreamTopic("Affliction became active.","name"),[se.AFF_LOST]:scopedEventStreamTopic("Affliction was cured or removed.","name"),[se.AFF_STACK_CHANGED]:scopedEventStreamTopic("Affliction stack count changed.","name"),[se.AFF_PRIORITY_CHANGED]:jsTopic("Affliction priority changed."),[se.DEF_GOT]:scopedEventStreamTopic("Defence became active.","id"),[se.DEF_LOST]:scopedEventStreamTopic("Defence expired or was removed.","id"),[se.DEF_PRIORITY_CHANGED]:jsTopic("Defence priority changed."),[se.BALANCE_GOT]:scopedEventStreamTopic("Balance became available.","id"),[se.BALANCE_LOST]:scopedEventStreamTopic("Balance was consumed or lost.","id"),[se.BALANCE_RESET]:scopedEventStreamTopic("Balance timing was reset.","id"),[se.BALANCE_DURATION_OBSERVED]:scopedEventStreamTopic("Observed balance recovery duration changed.","id"),[se.BALANCE_TIMER_RESTARTED]:jsTopic("Balance loss timer was restarted without a state flip."),[se.EQBAL_GOT]:eventStreamTopic("Balance and equilibrium are both available."),[se.LIMB_HIT]:scopedEventStreamTopic("Limb damage was recorded.","limb"),[se.LIMB_RESET]:scopedEventStreamTopic("Limb tracking was reset.","limb"),[se.LIMB_STAGE_CHANGED]:scopedEventStreamTopic("Limb damage stage changed.","limb"),[se.LIMB_DECAY]:jsTopic("Limb damage counter reset after 3 minutes of no hits."),[se.CACHE_AMOUNT_CHANGED]:eventStreamTopic("Cached item counts changed."),[se.CACHE_INVENTORY_LIST]:eventStreamTopic("Inventory cache snapshot applied."),[se.CACHE_RIFT_LIST]:eventStreamTopic("Rift cache snapshot applied."),[se.CACHE_PRECACHE_CHANGED]:jsTopic("Desired precache state changed."),[se.ITEM_ROOM_ADDED]:eventStreamTopic("An item appeared in the current room."),[se.ITEM_ROOM_REMOVED]:eventStreamTopic("An item left the current room."),[se.ITEM_ROOM_UPDATED]:eventStreamTopic("A current-room item changed."),[se.ITEM_ROOM_LIST]:eventStreamTopic("Current-room item list snapshot received."),[se.ITEM_INV_ADDED]:eventStreamTopic("An item was added to inventory."),[se.ITEM_INV_REMOVED]:eventStreamTopic("An item was removed from inventory."),[se.ITEM_INV_UPDATED]:eventStreamTopic("An inventory item changed."),[se.ITEM_INV_LIST]:eventStreamTopic("Inventory item list snapshot received."),[se.QUEUE_UPDATED]:jsTopic("Queue contents changed."),[se.QUEUE_FLUSHED]:jsTopic("Queue flush decision completed."),[se.QUEUE_DEFERRED]:jsTopic("Queue execution was deferred."),[se.QUEUE_CLEARED]:jsTopic("Queue contents were cleared."),[se.QUEUE_SENT]:scopedEventStreamTopic("A queue submission was accepted by the server.","queueName"),[se.QUEUE_FIRED]:scopedEventStreamTopic("A queue fire was acknowledged for a named queue.","queueName"),[se.QUEUE_FIRED_ACK]:eventStreamTopic("Queue fire acknowledgement was recorded."),[se.SERVERSIDE_AFF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside affliction priority confirmation was observed.","id"),[se.SERVERSIDE_DEF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside defence priority confirmation was observed.","id"),[se.SERVERSIDE_DIRTY]:jsTopic("Serverside reconciliation dirty flag changed."),[se.SERVERSIDE_EVALUATED]:jsTopic("Serverside evaluation completed."),[se.SERVERSIDE_RULE_CHANGED]:jsTopic("Legacy generic serverside rule-change signal reserved for compatibility."),[se.RULE_ADDED]:jsTopic("Serverside rule was added to the registry."),[se.RULE_REMOVED]:jsTopic("Serverside rule was removed from the registry."),[se.RULE_ENABLED]:jsTopic("Serverside rule was enabled."),[se.RULE_DISABLED]:jsTopic("Serverside rule was disabled."),[se.RULE_PACK_LOADED]:jsTopic("Serverside rule pack was loaded."),[se.RULE_PACK_UNLOADED]:jsTopic("Serverside rule pack was unloaded."),[se.RULE_ORDER_CHANGED]:jsTopic("Serverside rule evaluation order changed."),[se.RULE_ACTIVATED]:scopedEventStreamTopic("Serverside rule became active.","id"),[se.RULE_DEACTIVATED]:scopedEventStreamTopic("Serverside rule stopped being active.","id")});validateTopicRegistry(Et);var buildExactTopicSet=e=>new Set(Object.keys(e||{})),buildScopedBaseMap=e=>{const t=new Map;return Object.entries(e||{}).forEach(([e,a])=>{null!=a?.scopedAudience&&t.set(e,a.scopedAudience)}),t},createEventStreamPublisher=({adapter:e,registry:t,globallyEnabled:a,rawGmcpEnabled:n})=>{const s=buildExactTopicSet(t),i=buildScopedBaseMap(t),resolveAudience=e=>{const a=String(e||"").trim();if(!a)return null;if(s.has(a))return t[a].audience;const n=a.lastIndexOf(".");if(n<0)return null;const o=a.slice(0,n);return i.get(o)??null},isAllowed=(e,t)=>!!a&&(t===vt.EVENTSTREAM&&!(e===se.RAW_GMCP&&!n)),evaluate=(t,a)=>{const n=String(t||"").trim();return!!isAllowed(n,resolveAudience(n))&&("function"==typeof e?.raiseToEventStream&&e.raiseToEventStream(n,a))};return{attach:e=>e&&"function"==typeof e.onAny?e.onAny((e,t)=>{evaluate(t,e)}):()=>{},evaluate,resolveAudience,debugInfo:()=>({globallyEnabled:Boolean(a),rawGmcpEnabled:Boolean(n),exactTopicCount:s.size,scopedBaseCount:i.size})}},normalizeScopedTopicSegment=e=>{const t=String(e||"").trim().toLowerCase();return t?t.replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""):""},normalizePublishedPayload=(e={})=>e&&"object"==typeof e&&!Array.isArray(e)?e:{value:e},normalizeMessage=(e,t={},a)=>{const n=normalizePublishedPayload(t);return{...n,topic:e,at:n.at??a()}},createRuntimeEventPorts=({adapter:e,internalEvents:t,publicEvents:a,now:n})=>{const publishPublic=(e,t={})=>{const s=normalizeMessage(e,t,n);return a.emit(e,s),s},publishPublicScoped=(e,t={},a)=>{const n=publishPublic(e,t),s=normalizeScopedTopicSegment(a);return s?(publishPublic(`${e}.${s}`,n),n):n};return{publishPublic,publishPublicScoped,publishInternal:(e,a={})=>{const s=normalizeMessage(e,a,n);return t.emit(e,s),s},publishAdapterLocal:(t,a={})=>("function"==typeof e?.emitLocal&&e.emitLocal(t,a),a)}},createRuntimeEngine=({adapter:e,seedData:t,options:a={}})=>{const n=resolveAdapterCapabilities(e),{now:s,commandDispatcher:i,systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m,persistence:p,queueController:g,serverside:h,combatService:b,noticeCenter:y,defensePlanner:v,precachePlanner:S,outputPlanner:x,outputCycle:C}=createRuntimeDependencies({adapter:e,seedData:t,options:a}),k=createGmcpBlockBuffer({coalesce:!1!==a.coalesceGmcp}),A=createEventBus({label:"nexSys4.internal"}),E=createEventBus({label:"nexSys4.public"}),_=createPromptPresenter({publicEvents:E,affModel:l,defModel:u,balanceModel:c,systemModel:o,renderPrompt:(t,a={})=>n.promptRender?e.renderPrompt(t,a):t}),w=createEventStreamPublisher({adapter:e,registry:Et,globallyEnabled:!1!==a.publishToEventStream,rawGmcpEnabled:!0===a.publishRawGmcp}),T=createRuntimeEventPorts({adapter:e,internalEvents:A,publicEvents:E,now:s});w.attach(E);const setRuntimePhase=(e,t={})=>o.setRuntime({phase:e,...t}),syncDebugMode=()=>{const t=Boolean(o.getSettings().debug);return n.debugToggle&&e.setDebugEnabled(t),A.setDebugEnabled?.(t),E.setDebugEnabled?.(t),t},P=T.publishPublic,M=T.publishPublicScoped,D=T.publishAdapterLocal,publishStartupPhase=e=>D("StartupPhaseEvent",{phase:e});let R;const O=createCuringSetProvisioner({adapter:e,serverside:h,dispatchCommands:i.sendCommands,setRuntimePhase,publishStartupPhase,options:a}),N=createStartupCoordinator({adapter:e,systemModel:o,serverside:h,persistence:p,seedBaselineFromObservedStartup:()=>$.seedBaselineFromObservedStartup({skipObservedAdoption:O.wasCreatedThisRun()}),noticeCenter:y,buildPersistenceSnapshot:()=>$.buildPersistenceSnapshot(),startupTimeoutMs:a.startupTimeoutMs,maxStartupRetries:a.maxStartupRetries,startupFinalizeTimeoutMs:a.startupFinalizeTimeoutMs,maxStartupFinalizeRecoveryAttempts:a.maxStartupFinalizeRecoveryAttempts,publishStartupPhase,publishLoaded:e=>P(se.SYSTEM_LOADED,e),releaseStartupPause:e=>R.setPaused(!1,e),setRuntimePhase}),L=createGmcpApplier({emit:(e,t)=>A.emit(e,t)}),I=createItemTopicNotifier({publishPublic:P}),queueTranslatedGmcp=e=>{L.translate(e).forEach(e=>{I.notify(e),k.enqueue(e)})},hydrateCacheFromAdapterGmcp=()=>{if(!n.gmcpSnapshot)return!1;const t=e.getGMCP();return!(!t||"object"!=typeof t)&&(d.hydrateFromGmcp?.(t)??!1)},j=createRuntimeFlushCoordinator({adapter:e,systemModel:o,serverside:h,outputCycle:C,flushGmcpBuffer:()=>{k.flush().forEach(({topic:e,payload:t})=>{A.emit(e,t)}),d.completeObservationBlock?.({source:"runtime-flush"})}}),q=createCuringMasterSwitch({setPaused:(e,t)=>R.setPaused(e,t),noticeCenter:y,now:s,options:a});R=createRuntimeControlApi({systemModel:o,serverside:h,queueController:g,noticeCenter:y,curingMasterSwitch:q,dispatchCommands:i.sendCommands,markDirty:j.markDirty,onResume:e=>{j.isFlushing()||j.flushCycle(e)}});const B=createCuringSetGuard({serverside:h,systemModel:o,runtimeControl:R,noticeCenter:y}),$=createRuntimePersistenceApi({persistence:p,systemModel:o,affModel:l,defModel:u,cacheModel:d,serverside:h,syncDebugMode,markDirty:j.markDirty}),F=createRuntimeEventWiring({adapter:e,internalEvents:A}),z=createRuntimeStartupOrchestrator({adapter:e,systemModel:o,persistenceApi:$,startup:N,curingSetProvisioner:O,noticeCenter:y,syncDebugMode,isStarted:j.isStarted,markStarted:j.start,setRuntimePhase,publishStartupPhase,attachEventWiring:()=>{F.attach({options:a,queueTranslatedGmcp,publishPublic:P,publishPublicScoped:M,noticeCenter:y,syncDebugMode,systemModel:o,affModel:l,defModel:u,balanceModel:c,cacheModel:d,limbModel:m,queueController:g,serverside:h,markDirty:j.markDirty,invalidateOutput:j.invalidateOutput,flushCycle:j.flushCycle,outputCycle:C,startup:N,curingSetProvisioner:O,curingSetGuard:B,curingMasterSwitch:q,runtimeControl:R,savePersistence:$.savePersistence})},promptPresenter:_,publishRuntimeStarted:()=>P(se.RUNTIME_STARTED,{source:"runtime-start"}),hydrateCacheFromAdapterGmcp,runtimeControl:R,commandDispatcher:i,debugOverride:a.bootstrapDebugOverride}),stop=()=>{z.dispose(),j.isStarted()&&(P(se.RUNTIME_STOPPED,{source:"runtime-stop"}),j.stop(),N.dispose?.(),C.dispose?.(),F.dispose(),setRuntimePhase(ie.IDLE,{paused:!0,startupFailureMessage:""}),_.stop(),l.dispose?.(),c.dispose?.(),m.dispose(),A.clear(),E.clear(),w.attach(E),n.destroy&&e.destroy())};let G=null;const snapshot=()=>{const e=o.snapshot(),t=l.snapshot(),a=c.snapshot(),n=u.snapshot(),s=d.snapshot(),i=m.snapshot(),p=g.snapshot(),b=h.snapshot();return G&&G.system===e&&G.affs===t&&G.balances===a&&G.defs===n&&G.cache===s&&G.limbs===i&&G.queues===p&&G.serverside===b||(G={system:e,affs:t,balances:a,defs:n,cache:s,limbs:i,queues:p,serverside:b}),G};return{start:z.start,stop,flushCycle:j.flushCycle,savePersistence:$.savePersistence,setPaused:R.setPaused,setSlowMode:R.setSlowMode,setConfigOpen:(e,t="runtime-ui")=>P(se.UI_CONFIG_CHANGED,{open:Boolean(e),source:t}),get paused(){return o.getRuntime().paused},snapshot,adapter:e,models:{systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m},services:{combat:b},planners:{defensePlanner:v,precachePlanner:S,outputPlanner:x,outputCycle:C},queueController:g,serverside:h,curingSetGuard:B,noticeCenter:y,persistence:p,commandDispatcher:i,promptPresenter:_,topics:se,onEvent:(e,t)=>E.on(e,t),offEvent:(e,t)=>E.off(e,t),markDirty:j.markDirty,ingestGmcp(e,t){queueTranslatedGmcp({tag:e,payload:t}),!0===a.publishRawGmcp&&P(se.RAW_GMCP,{source:"manual-gmcp",tag:String(e||"").trim().toLowerCase(),payload:t}),j.markDirty(`manual-gmcp:${e}`)},evaluateNow:(e="manual")=>j.flushCycle(e),addOutputCommands(e=[]){C.injectCommands(Array.isArray(e)?e:[e]),j.markDirty("manual-output-inject")},dispatchCommands:i.sendCommands,debugInfo:()=>({adapter:e.debugInfo?.()??null,internalEvents:A.debugInfo?.()??null,publicEvents:E.debugInfo?.()??null,eventStreamPublisher:w.debugInfo?.()??null})}},toArray=e=>Array.isArray(e)?e:[e],normalizeQueueKey=e=>String(e||"").trim(),createPublicCommandApi=({runtime:e})=>{const t=e.queueController,a=t.listQueues().map(e=>({queueId:e,meta:t.getQueue(e)||{}})),n=new Map,s=new Map,resolveQueueId=e=>{const t=normalizeQueueKey(e);return s.get(t)||t},getQueueHandle=e=>{const t=resolveQueueId(e);return n.get(t)||null},inspectQueue=e=>t.getQueue(resolveQueueId(e)),addQueue=(e,a,n)=>t.add(resolveQueueId(e),a,n),addClearQueue=(e,a,n)=>t.addClear(resolveQueueId(e),a,n),prependQueue=(e,a,n)=>t.prepend(resolveQueueId(e),a,n),clearLocalQueue=e=>t.clear(resolveQueueId(e)),clearGameQueue=e=>t.clearQueue(resolveQueueId(e)),flushQueue=(e,a)=>t.flush(resolveQueueId(e),a),isQueued=(e,t)=>{if(!t)return!1;const a=inspectQueue(e);return!!a&&(a.items.includes(t)||a.prepend.includes(t))};a.forEach(({queueId:e,meta:t})=>{n.set(e,{get id(){return e},get queueId(){return e},get name(){return inspectQueue(e)?.name||t.name||""},get type(){return inspectQueue(e)?.type||t.type||""},get exclusions(){return inspectQueue(e)?.exclusions||t.exclusions||[]},inspect:()=>inspectQueue(e),state:()=>inspectQueue(e),add:(t,a)=>addQueue(e,t,a),addClear:(t,a)=>addClearQueue(e,t,a),prepend:(t,a)=>prependQueue(e,t,a),clear:()=>clearLocalQueue(e),clearQueue:()=>clearGameQueue(e),flush:t=>flushQueue(e,t),isQueued:t=>isQueued(e,t)}),s.set(e,e),t.name&&s.set(t.name,e)});const i={controller:t,listQueues:()=>t.listQueues(),inspect:e=>inspectQueue(e),get:e=>getQueueHandle(e),add:(e,t,a)=>addQueue(e,t,a),addClear:(e,t,a)=>addClearQueue(e,t,a),prepend:(e,t,a)=>prependQueue(e,t,a),clear:e=>clearLocalQueue(e),clearQueue:e=>clearGameQueue(e),flush:(e,t)=>flushQueue(e,t),flushAll:()=>t.flushAll(),isQueued:(e,t)=>isQueued(e,t)},o={listQueues:()=>i.listQueues(),inspect:e=>i.inspect(e),get:e=>i.get(e)},l={};return a.forEach(({queueId:e,meta:t})=>{const a=n.get(e);a&&(l[e]=a,o[e]=a,t.name&&(o[t.name]=a))}),{queue:i,queues:o,...l,sendCmd:(t,a={})=>e.dispatchCommands([t],{source:"public-api",...a}),setTarget(t){const a=String(t??"").trim();if(!a)return{target:"",dispatched:!1,dispatchResult:null};const n=e.dispatchCommands(["settarget "+a],{source:"set-target"});return{target:a,dispatched:Boolean(n),dispatchResult:n}},sendInline:(t=[],a={})=>e.dispatchCommands(toArray(t),{source:"public-api-inline",...a}),addOutput(t=[]){e.addOutputCommands(toArray(t))},evaluateNow:(t="public-api")=>e.evaluateNow(t)}},_t="nexSys4",wt="https://unpkg.com/nexsys4/dist/nexSys4.nxs",Tt="khaseem",Pt=Object.freeze(["nexSys4.userSettings"]),Mt=1e4,Dt=Object.freeze({fg:"red"}),toLowerName=e=>String(e??"").trim().toLowerCase(),safeCall=e=>{try{return e()}catch{return null}},clonePackageItem=e=>{if(!e||"object"!=typeof e)return null;if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return e}},getReflexes=e=>safeCall(()=>e?.reflexes?.())??null,getPackageRegistry=e=>{const t=safeCall(()=>e?.packages?.());if("function"==typeof t?.get)return t;const a=safeCall(()=>getReflexes(e)?.packages?.());return"function"==typeof a?.get?a:null},getInstalledPackage=(e,t)=>safeCall(()=>getPackageRegistry(e)?.get(t))??null,findGroupByName=(e,t)=>{if(!Array.isArray(e))return null;const a=toLowerName(t);return e.find(e=>toLowerName(e?.name)===a)??null},capturePreservedGroups=(e,t)=>t.map(t=>{const a=findGroupByName(e?.items,t);return a?{name:t,data:clonePackageItem(a)}:null}).filter(Boolean),applyPreservedGroup=(e,t,a)=>{const n=findGroupByName(e?.items,t.name);n&&t.data&&("function"!=typeof n.apply?"object"==typeof n&&Object.assign(n,clonePackageItem(t.data)):n.apply(t.data,a))},enableShippedGroups=(e,t)=>{if(!Array.isArray(e?.items))return;const a=new Set(t.map(toLowerName));e.items.filter(e=>"group"===e?.type&&!a.has(toLowerName(e.name))).forEach(e=>{e.enabled=!0})},reportUpdateError=({adapter:e,consoleObj:t,message:a,nexusClient:n})=>{t.error(a),"function"!=typeof e?.notice?n?.display?.(a):e.notice(a,Dt)},createAbortSignal=({AbortControllerCtor:e,setTimeoutFn:t,timeoutMs:a})=>{if(!e||a<=0)return{signal:void 0,timeout:null};const n=new e,s=t(()=>n.abort(),a);return{signal:n.signal,timeout:s}},updateNxs=async({adapter:e=null,clearTimeoutFn:t=clearTimeout,consoleObj:a=console,fetchFn:n=globalThis.fetch,nexusClient:s=globalThis.nexusclient,packageName:i=_t,preservedGroupNames:o=Pt,setTimeoutFn:l=setTimeout,skipCharacterName:c=Tt,timeoutMs:u=Mt,url:d=wt}={})=>{if(c&&toLowerName(s?.charname)===toLowerName(c))return null;let m=null;try{if("function"!=typeof n)throw new Error("fetch is not available.");const e=getInstalledPackage(s,i);if(!e||"function"!=typeof e.apply)throw new Error(`${i} package is not installed in Nexus.`);const t=capturePreservedGroups(e,o),{signal:a,timeout:c}=createAbortSignal({AbortControllerCtor:globalThis.AbortController,setTimeoutFn:l,timeoutMs:u});m=c;const p=await n(d,{cache:"no-store",...a?{signal:a}:{}});if(!p?.ok)throw new Error(`${i} update failed: ${p?.status??"unknown"} ${p?.statusText??""}`.trim());const g=await p.json(),h=getReflexes(s);e.apply(g,h);const b=getInstalledPackage(s,i)??e;return t.forEach(e=>applyPreservedGroup(b,e,h)),enableShippedGroups(b,o),g}catch(p){return reportUpdateError({adapter:e,consoleObj:a,message:"AbortError"===p?.name?`${i} update timed out. Check your connection.`:`${i} update error: ${p?.message??String(p)}`,nexusClient:s}),null}finally{null!==m&&t(m)}},createPublicControlApi=({runtime:e,getModels:t})=>{const applySettings=(a={})=>(t().systemModel.setSettings(a,{setBaseline:!0}),e.savePersistence());return{pause:()=>e.setPaused(!0),unpause:()=>e.setPaused(!1),pauseToggle:()=>e.setPaused(!e.paused),setSlowMode:t=>e.setSlowMode(t),slowOn:()=>e.setSlowMode(!0),slowOff:()=>e.setSlowMode(!1),applySettings,setDebug:e=>applySettings({debug:Boolean(e)}),debugOn:()=>applySettings({debug:!0}),debugOff:()=>applySettings({debug:!1}),debug:()=>({runtime:e.snapshot(),internals:e.debugInfo?.()??null}),start:e.start,stop:e.stop,updateNxs:(t={})=>updateNxs({adapter:e.adapter,...t})}},resolveAudienceFor=(e,t)=>{const a=String(e||"").trim();if(!a)return null;if(Object.prototype.hasOwnProperty.call(t,a))return t[a].audience;const n=a.lastIndexOf(".");return n<0?null:t[a.slice(0,n)]?.scopedAudience??null},isPublicAudience=e=>e===vt.JS||e===vt.EVENTSTREAM,defaultIsDevMode=()=>{try{const e=globalThis.process?.env?.NODE_ENV;return!!e&&"production"!==e}catch{return!1}},defaultWarn=e=>{console.warn(e)},createPublicEventApi=({runtime:e,registry:t=Et,isDevMode:a=defaultIsDevMode,warn:n=defaultWarn})=>{const s={on(s,i){const o=String(s||"").trim();return o&&"function"==typeof i?isPublicAudience(resolveAudienceFor(o,t))?e.onEvent(o,i):(a()&&n(`[nexSys4] topic "${o}" is not a public topic`),()=>{}):()=>{}},off(t,a){const n=String(t||"").trim();return!!n&&e.offEvent(n,a)}};return{events:s,on:s.on,off:s.off}},createPublicMutationApi=({runtime:e,getModels:t})=>{const a=e.services.combat,normalizeServersidePriority=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},samePriorityMaps=(e={},t={})=>{const a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(const n of a)if(normalizeServersidePriority(e?.[n])!==normalizeServersidePriority(t?.[n]))return!1;return!0},resetPriorities=(e=[],t,a="public-api")=>{let n=!1;return e.forEach(e=>{t(e,a)&&(n=!0)}),n},buildAffPriorityTarget=e=>{const t=e.list().reduce((t,a)=>(t[a]=normalizeServersidePriority(e.getPriority?.(a)),t),{});return e.getCountablePriorityNames?.().forEach(e=>{t[e]=0}),t},buildDefPriorityTarget=(e,t)=>{const a=t.snapshot?.().char?.class||"";return e.list().reduce((t,n)=>{const s=e.get(n);return!s?.serverside||s.static?t:"function"!=typeof e.isAvailableForClass||e.isAvailableForClass(n,a)?(t[n]=normalizeServersidePriority(e.getPriority?.(n)),t):t},{})},restorePersistedPriorities=({restoreAffs:a=!1,restoreDefs:n=!1,reason:s})=>{const{affModel:i,defModel:o,systemModel:l}=t();let c=!1;a&&(c=resetPriorities(i.list(),(e,t)=>i.resetPriority(e,t))||c),n&&(c=resetPriorities(o.list(),(e,t)=>o.resetPriority(e,t))||c);const u=e.serverside.snapshot?.(),d=a?buildAffPriorityTarget(i):null,m=n?buildDefPriorityTarget(o,l):null,p=Boolean(u&&(a&&!samePriorityMaps(u.sessionBaseline?.affPriorities,d)||n&&!samePriorityMaps(u.sessionBaseline?.defPriorities,m)));return!(!c&&!p)&&(refreshServersideBaseline(),e.markDirty(s),!0)},refreshServersideBaseline=()=>{e.serverside.setBaselineFromRuntime?.()},applyMutation=(t,a)=>!!t&&(refreshServersideBaseline(),e.markDirty(a),!0),applyDirtyOnly=(t,a)=>!!t&&(e.markDirty(a),!0);return{updateAffPriority:(e,a)=>applyMutation(t().affModel.setPriority(e,a,"public-api"),"api-aff-priority"),updateAffDefault:(e,a)=>applyMutation(t().affModel.setDefaultPriority(e,a,"public-api"),"api-aff-default"),resetAffPriority:e=>applyMutation(t().affModel.resetPriority(e,"public-api"),"api-aff-priority-reset"),resetAllAffPriorities:()=>restorePersistedPriorities({restoreAffs:!0,reason:"api-aff-priority-reset-all"}),updateDefPriority:(e,a)=>applyMutation(t().defModel.setPriority(e,a,"public-api"),"api-def-priority"),updateDefDefault:(e,a)=>applyMutation(t().defModel.setDefaultPriority(e,a,"public-api"),"api-def-default"),updateDefStatic:(e,a)=>applyMutation(t().defModel.setStatic(e,a,"public-api"),"api-def-static"),updateDefCommand:(e,a)=>applyMutation(t().defModel.setCommand(e,a,"public-api"),"api-def-command"),resetDefPriority:e=>applyMutation(t().defModel.resetPriority(e,"public-api"),"api-def-priority-reset"),resetAllDefPriorities:()=>restorePersistedPriorities({restoreDefs:!0,reason:"api-def-priority-reset-all"}),resetAllPriorities:()=>restorePersistedPriorities({restoreAffs:!0,restoreDefs:!0,reason:"api-priority-reset-all"}),defup(){const a=t().defModel,n={};let s=!1;for(const e of a.list()){const t=a.get(e);if(!t||t.have)continue;a.resetPriority(e,"defup")&&(s=!0);const i=a.get(e),o=normalizeServersidePriority(a.getPriority(e));i?.static&&o>=1&&o<=25&&(n[e]=o)}const i=e.serverside.requestStaticDefPriorities?.(n)??!1;return(s||i)&&(refreshServersideBaseline(),e.markDirty("api-defup")),s||i},defoff(){const a=t().defModel;let n=!1;for(const e of a.list()){const t=a.get(e);t&&!t.have&&(a.setPriority(e,0,"defoff")&&(n=!0))}const s=e.serverside.clearStaticDefPriorities?.()??!1;return(n||s)&&(refreshServersideBaseline(),e.markDirty("api-defoff")),n||s},setPrecache:(a={})=>(t().cacheModel.setDesiredPrecache(a),e.markDirty("api-precache"),e.savePersistence()),prioAff:t=>applyDirtyOnly(e.serverside.setPrioAff(t),"api-prioaff"),clearPrioAff:()=>applyDirtyOnly(e.serverside.clearPrioAff(),"api-prioaff-clear"),parry(t){a.parry(t),refreshServersideBaseline(),e.markDirty("api-parry")}}},Rt="public-observe",freezeHandles=(e=[],t)=>Object.freeze(e.reduce((e,a)=>(e[a]=Object.freeze(t(a)),e),{})),getObserveSource=(e={})=>String(e?.source||Rt),getObserveAt=(e={})=>e?.atMs??e?.at,getAffSnapshotState=(e,t)=>({have:e.haveAff(t),count:e.get(t)?.count??0}),didAffStateChange=(e,t)=>e.have!==t.have||e.count!==t.count,createPublicObserveApi=({runtime:e,getModels:t})=>{const a=t(),n=a.affModel,s=a.defModel,i=a.balanceModel,o=a.limbModel,l=a.systemModel,c=e.services.combat,u=freezeHandles(n.list?.()||[],t=>({got(a={}){const s=getAffSnapshotState(n,t);return n.got(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&("function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"affliction"):o?.applyAfflictionTransition?.(t,!0),e.markDirty(`api-observe-aff-got:${t}`),!0)},lost(a={}){const s=getAffSnapshotState(n,t);return n.lose(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&("function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"affliction"):o?.applyAfflictionTransition?.(t,!1),e.markDirty(`api-observe-aff-lost:${t}`),!0)}})),d=freezeHandles(s.list?.()||[],t=>({got:(a={})=>!!s.setHave(t,!0,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-got:${t}`),!0),lost:(a={})=>!!s.setHave(t,!1,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-lost:${t}`),!0)})),m=freezeHandles(i.list?.()||[],t=>{const observeServerUse=(a,n={})=>{const s=i.observeServerUse(t,a,{...n,source:getObserveSource({...n,source:n.source||"server-duration-observe"})});return s&&e.markDirty(`api-observe-balance-used:${t}`),s};return{got(a={}){const n=i.gain(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-got:${t}`),n},lost(a={}){const n=i.lose(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-lost:${t}`),n},used:observeServerUse,serverUsed:observeServerUse,observeServerUse}}),createObservedLimbHit=(e,t={},a)=>c.observeLimbHit({limb:e,amount:a,source:getObserveSource(t),at:getObserveAt(t)}),createObservedLimbReset=(e,t={})=>c.observeLimbReset({limb:e,source:getObserveSource(t),at:getObserveAt(t)}),createObservedLimbStage=(e,t,a={})=>c.observeLimbStage({limb:e,stage:t,source:getObserveSource(a),at:getObserveAt(a)}),p=freezeHandles(o?.list?.()||[],t=>({hit(a,n={}){const s=createObservedLimbHit(t,n,a);return s.changed&&"torso"===s.limb&&s.stageChanged&&e.markDirty(`api-observe-limb-torso:${s.after?.stage||"unknown"}`),s.changed},reset(a={}){const n=createObservedLimbReset(t,a);return n.changed&&"torso"===n.limb&&e.markDirty("api-observe-limb-torso:healthy"),n.changed},setStage(a,n={}){const s=createObservedLimbStage(t,a,n);return s.changed&&"torso"===s.limb&&s.stageChanged&&e.markDirty(`api-observe-limb-torso:${s.after?.stage||"unknown"}`),s.changed}})),markObservedLimbResult=t=>(t.changed&&"torso"===t.limb&&t.stageChanged?e.markDirty(`api-observe-limb-torso:${t.after?.stage||"unknown"}`):t.changed&&"torso"===t.limb&&"healthy"===t.after?.stage?e.markDirty("api-observe-limb-torso:healthy"):t.changed&&e.markDirty(`api-observe-limb:${t.limb}`),t.changed),g=Object.freeze({...p,get(e){if(!e)return null;const t=o?.get?.(e);return t?.id&&p[t.id]||null},list:()=>Object.keys(p),hit:(e,t,a={})=>markObservedLimbResult(createObservedLimbHit(e,a,t)),reset:(e,t={})=>markObservedLimbResult(createObservedLimbReset(e,t)),setStage:(e,t,a={})=>markObservedLimbResult(createObservedLimbStage(e,t,a))}),h=Object.freeze({set(t={}){const a=l.updateMount({name:String(t.name||""),id:t.id??null});return a&&e.markDirty("api-observe-mount-set"),a},clear(){const t=l.updateMount(null);return t&&e.markDirty("api-observe-mount-clear"),t}});return{observe:Object.freeze({affs:u,defs:d,balances:m,limbs:g,mount:h})}},createPublicPromptApi=({runtime:e,control:t})=>{const a=e?.promptPresenter;if(!a)return{prompt:null};const getSystemModel=()=>e?.models?.systemModel;let n=null;return n={colorGradation:a.colorGradation,colorPercentage:a.colorPercentage,render:e=>a.render(e),getCustomPrompt:()=>a.render({source:"legacy-getCustomPrompt"}),markAffsDirty:()=>a.markAffsDirty(),markPromptDirty:()=>a.markPromptDirty?.(),patchVars:(e={})=>(a.patchVars?.(e),n),patchAffs:(e={})=>(a.patchAffs?.(e),n),patchCureColors:(e={})=>(a.patchCureColors?.(e),n),applyPreset:e=>"function"==typeof e?(e(n),a.markPromptDirty?.(),n):(!e||"object"!=typeof e||Array.isArray(e)||("cureColors"in e&&n.patchCureColors(e.cureColors),"affs"in e&&n.patchAffs(e.affs),"vars"in e&&n.patchVars(e.vars),"compose"in e&&(n.compose=e.compose),"enabled"in e&&(n.enabled=e.enabled)),n),get vars(){return a.vars},get affs(){return a.affs},get cureColors(){return a.cureColors},get compose(){return a.compose},set compose(e){a.compose=e},get enabled(){const e=getSystemModel()?.snapshot?.().settings||{};return Boolean(e.customPrompt)},set enabled(e){t?.applySettings?.({customPrompt:Boolean(e)})}},{prompt:n}},createPublicLineApi=({lineUtils:e={}})=>({replace:e.replace,replaceHTML:e.replaceHTML,replaceWord:e.replaceWord,replaceWordHTML:e.replaceWordHTML,nextLine:e.nextLine,checkLine:e.checkLine,prevLine:e.prevLine,prependNotice:e.prependNotice,say:e.say}),normalizeScopedSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),createPublicRulesApi=({runtime:e})=>({add:(t,a)=>e.serverside.lifecycle.add(t,a),remove:t=>e.serverside.lifecycle.remove(t),enable:t=>e.serverside.lifecycle.enable(t),disable:t=>e.serverside.lifecycle.disable(t),enablePack:t=>e.serverside.lifecycle.enablePack(t),disablePack:t=>e.serverside.lifecycle.disablePack(t),load:(t,a)=>e.serverside.lifecycle.load(t,a),unload:t=>e.serverside.lifecycle.unload(t),reorder:t=>e.serverside.lifecycle.reorder(t),list:()=>e.serverside.lifecycle.list(),bindTransition(t,a={}){const n=normalizeScopedSegment(t);if(!n)return()=>{};const s=e.topics||{},i=[];return"function"==typeof a.onActivate&&i.push(e.onEvent(`${s.RULE_ACTIVATED||"nexsys4.rule.activated"}.${n}`,a.onActivate)),"function"==typeof a.onDeactivate&&i.push(e.onEvent(`${s.RULE_DEACTIVATED||"nexsys4.rule.deactivated"}.${n}`,a.onDeactivate)),()=>{i.forEach(e=>e?.())}}}),createPublicServersideApi=({runtime:e})=>({predictions:{add:t=>e.serverside.addPrediction(t),remove:t=>e.serverside.removePrediction(t)},ssQueue:{add:t=>e.serverside.manualQueueAdd(t),insert:(t,a)=>e.serverside.manualQueueInsert(t,a),remove:t=>e.serverside.manualQueueRemove(t),reset:()=>e.serverside.manualQueueReset()},ss:{syncSnapshots:()=>e.serverside.requestSnapshotSync(),startupStatus:()=>e.serverside.getStartupStatus(),unload:(t={})=>e.curingSetGuard.unload(t)}}),createPublicStateApi=({runtime:e,getModels:t})=>{const{systemModel:a,affModel:n,defModel:s,balanceModel:i,limbModel:o}=t();return{snapshot:e.snapshot,getTarget:()=>a.snapshot().target,topics:e.topics,haveAff:e=>n.haveAff(e),affElapsedMs:e=>n.elapsedMs(e),affElapsedSeconds:e=>n.elapsedSeconds(e),affRemainingMs:e=>n.remainingMs(e),affRemainingSeconds:e=>n.remainingSeconds(e),affTiming:e=>n.timing(e),haveAffs:e=>n.haveAffs(toArray(e)),haveAnAff:e=>n.haveAnAff(toArray(e)),haveDef:e=>s.haveDef(e),haveDefs:e=>toArray(e).every(e=>s.haveDef(e)),haveAnyDef:e=>toArray(e).some(e=>s.haveDef(e)),haveBal:e=>i.have(e),haveBals:e=>toArray(e).every(e=>i.have(e)),haveAnyBal:e=>toArray(e).some(e=>i.have(e)),balElapsedMs:e=>i.elapsedMs(e),balElapsedSeconds:e=>i.elapsedSeconds(e),balRemainingMs:e=>i.remainingMs(e),balRemainingSeconds:e=>i.remainingSeconds(e),balTiming:e=>i.timing(e),getLimb:e=>o?.get?.(e)||null,listLimbs:()=>o?.list?.()||[],getClass:()=>a.getClass(),checkClass:e=>a.checkClass(e),isClass:e=>a.isClass(e),isTarget:e=>a.isTarget(e)}},isRecord=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),cloneAndFreezeCells=(e={})=>{const t={};for(const[a,n]of Object.entries(e))t[a]=isRecord(n)?Object.freeze({...n}):n;return Object.freeze(t)},buildPromptSnapshot=e=>e?Object.freeze({vars:cloneAndFreezeCells(e.vars),affs:cloneAndFreezeCells(e.affs),cureColors:cloneAndFreezeCells(e.cureColors)}):null,createPublicApi=({runtime:e,lineUtils:t={}})=>{const getModels=()=>e.models,a=createPublicStateApi({runtime:e,getModels}),n=createPublicEventApi({runtime:e}),s=createPublicControlApi({runtime:e,getModels}),i=createPublicCommandApi({runtime:e}),o=createPublicMutationApi({runtime:e,getModels}),l=createPublicObserveApi({runtime:e,getModels}),c=createPublicRulesApi({runtime:e}),u=createPublicServersideApi({runtime:e}),d=createPublicPromptApi({runtime:e,control:s}),m=createPublicLineApi({lineUtils:t}),{systemModel:p,affModel:g,defModel:h,balanceModel:b,limbModel:y,cacheModel:v}=getModels(),S=Object.freeze(Object.create(null,{system:{enumerable:!0,get:()=>p.snapshot()},target:{enumerable:!0,get:()=>p.snapshot().target},class:{enumerable:!0,get:()=>p.snapshot().char.class},affs:{enumerable:!0,get:()=>g.snapshot()},defs:{enumerable:!0,get:()=>h.snapshot()},balances:{enumerable:!0,get:()=>b.snapshot()},limbs:{enumerable:!0,get:()=>y.snapshot()},queue:{enumerable:!0,get:()=>e.queueController.snapshot()},cache:{enumerable:!0,get:()=>v.snapshot()},prompt:{enumerable:!0,get:()=>buildPromptSnapshot(e.promptPresenter)},serverside:{enumerable:!0,get:()=>e.serverside.snapshot()}})),x=Object.freeze({on:n.events.on,off:n.events.off,topics:e.topics}),C=Object.freeze({affs:l.observe.affs,defs:l.observe.defs,balances:l.observe.balances,limbs:l.observe.limbs,mount:Object.freeze({set:l.observe.mount.set,reset:l.observe.mount.clear})}),k=Object.freeze({openConfig:(t="api.ui.openConfig")=>e.setConfigOpen(!0,t),closeConfig:(t="api.ui.closeConfig")=>e.setConfigOpen(!1,t),setConfigOpen:(t,a="api.ui.setConfigOpen")=>e.setConfigOpen(Boolean(t),a)}),A={...i.queue,...i.queues,list:i.queue.listQueues};return{state:S,api:{affs:{have:a.haveAff,haveAll:a.haveAffs,haveAny:a.haveAnAff,elapsedMs:a.affElapsedMs,elapsedSeconds:a.affElapsedSeconds,remainingMs:a.affRemainingMs,remainingSeconds:a.affRemainingSeconds,timing:a.affTiming,setPriority:o.updateAffPriority,setDefaultPriority:o.updateAffDefault,resetPriority:o.resetAffPriority,resetAllPriorities:o.resetAllAffPriorities},defs:{have:a.haveDef,haveAll:a.haveDefs,haveAny:a.haveAnyDef,setPriority:o.updateDefPriority,setDefaultPriority:o.updateDefDefault,setStatic:o.updateDefStatic,setCommand:o.updateDefCommand,resetPriority:o.resetDefPriority,resetAllPriorities:o.resetAllDefPriorities,defup:o.defup,defoff:o.defoff,parry:o.parry},balances:{have:a.haveBal,haveAll:a.haveBals,haveAny:a.haveAnyBal,elapsedMs:a.balElapsedMs,elapsedSeconds:a.balElapsedSeconds,remainingMs:a.balRemainingMs,remainingSeconds:a.balRemainingSeconds,timing:a.balTiming},limbs:{get:a.getLimb,list:a.listLimbs},target:{get:a.getTarget,set:i.setTarget,is:a.isTarget},class:{get:a.getClass,is:a.isClass,check:a.checkClass},command:{send:i.sendCmd,sendInline:i.sendInline,addOutput:i.addOutput,evaluateNow:i.evaluateNow},queue:A,rules:c,prompt:d.prompt,observe:C,ui:k,line:m,control:{...s},ss:{predictions:u.predictions,queue:{add:u.ssQueue.add,insert:u.ssQueue.insert,remove:u.ssQueue.remove,clear:u.ssQueue.reset},syncSnapshots:u.ss.syncSnapshots,startupStatus:u.ss.startupStatus,unload:u.ss.unload,precache:{set:o.setPrecache},prioAff:{set:o.prioAff,reset:o.clearPrioAff}}},events:x}},generateChunk=(e,t,a)=>{const n=document.createElement("span");return n.style.color=t,n.style.backgroundColor=a,n.textContent=e,n},cloneTrustedHtmlNodes=e=>{const t=document.createElement("template");return t.innerHTML=String(e??""),[...t.content.childNodes].map(e=>e.cloneNode(!0))},replaceWordNodes=(e,t,a)=>{const n=String(t??"");if(!n)return!1;const s=document.createTreeWalker(e,globalThis.NodeFilter?.SHOW_TEXT??4),i=[];for(;s.nextNode();)i.push(s.currentNode);let o=!1;return i.forEach(e=>{const t=e?.textContent||"";if(!e?.parentNode||!t.includes(n))return;const s=document.createDocumentFragment();let i=0;for(;i<t.length;){const e=t.indexOf(n,i);if(-1===e){s.append(t.slice(i));break}e>i&&s.append(t.slice(i,e)),a().forEach(e=>s.appendChild(e)),i=e+n.length,o=!0}e.replaceWith(s)}),o},updateCurrentFormattedLine=e=>{const t=document.createElement("span");t.innerHTML=globalThis.nexusclient.current_line.parsed_line.formatted();const a=e(t);return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.innerHTML,a},replace$1=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.outerHTML,!0},replaceHTML=e=>(globalThis.nexusclient.current_line.parsed_line.formatted=()=>e,!0),replaceWord=(e,t,a,n)=>updateCurrentFormattedLine(s=>replaceWordNodes(s,e,()=>[generateChunk(t,a,n)])),replaceWordHTML=(e,t)=>updateCurrentFormattedLine(a=>replaceWordNodes(a,e,()=>cloneTrustedHtmlNodes(t))),matchPattern=(e,t)=>"string"==typeof t?e.includes(t):t instanceof RegExp&&t.test(e),prevLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n<=0)&&matchPattern(t[n-1].parsed_line.text(),e)},nextLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n>=t.length-1)&&matchPattern(t[n+1].parsed_line.text(),e)},checkLine=(e,t)=>{const{current_block:a,current_line:n}=globalThis.nexusclient,s=a.indexOf(n)+t;return!(s<0||s>a.length-1)&&matchPattern(a[s].parsed_line.text(),e)},prependNotice=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexSys.prepend_line={timestamp:globalThis.nexusclient.current_block[1].timestamp,timestamp_ms:globalThis.nexusclient.current_block[1].timestamp_ms,parsed_line:{text:()=>t.outerHTML,formatted:()=>t.outerHTML}},t.outerHTML},say=e=>{const t=new SpeechSynthesisUtterance;t.voice=globalThis.speechSynthesis.getVoices().find(e=>"Google UK English Female"===e.voiceURI)||globalThis.speechSynthesis.getVoices().find(e=>"en-US"===e.lang),t.rate=1.1,t.pitch=1.3,t.text=e,globalThis.speechSynthesis.speaking&&globalThis.speechSynthesis.cancel(),setTimeout(()=>globalThis.speechSynthesis.speak(t),10)},Ot={affTable:Y,balanceTable:Q,cacheTable:D,cacheNames:{herb_name_to_herb:T,mineral_to_herb:P,herb_to_mineral:M,herb_names:_,herb_names_group:w,mineral_names:A,mineral_names_group:E},cureTable:X,defTable:ee,defPrios:te},Nt=Object.freeze({affCount:Array.isArray(Y?.list)?Y.list.length:0,cureCount:Object.keys(X||{}).length,defCount:Object.keys(ee||{}).length,balanceCount:Object.keys(Q||{}).length,cacheCount:Object.keys(D||{}).length}),createNexSys=({adapter:e,adapterType:t="nexus",options:a={}}={})=>{installStringPrototypeHelpers();const n={...a.adapterOptions||{}};void 0===n.debug&&(n.debug=a.debug??!1),void 0===n.startupGag&&(n.startupGag=a.startupGag??!0);const s=assertAdapterContract(e||("mock"===t?createMockAdapter(n):createNexusAdapter(n))),i=createRuntimeEngine({adapter:s,seedData:Ot,options:a}),{state:o,api:l,events:c}=createPublicApi({runtime:i,lineUtils:{replace:replace$1,replaceHTML,replaceWord,replaceWordHTML,nextLine,checkLine,prependNotice,prevLine,say}});return{version:"1.2.2",seedMeta:Nt,tables:{limbs:Ee,dirs:_e,dirMap:we,oppdirs:Te,shortDirs:Pe,classList:Me},adapter:s,runtime:i,state:o,api:l,events:c}},clearGlobalNexSys=()=>{if("undefined"==typeof globalThis)return;const e=globalThis.nexSys,t=e?.api?.control?.stop;if(e&&"function"==typeof t)try{t()}catch(a){console.error("nexSys4 failed to stop the existing global runtime during reinstall",a)}try{delete globalThis.nexSys}catch{globalThis.nexSys=void 0}},installGlobalNexSys=(e={})=>{clearGlobalNexSys();const t=createNexSys(e);return globalThis.nexSys=t,t.api.control.start(),t},Lt=Object.freeze({coalesceGmcp:!0,publishToEventStream:!0,publishRawGmcp:!1,debug:!1,startupTimeoutMs:2500,maxStartupRetries:3,maxEntriesPerSubmission:20,pendingTimeoutMs:12e3,desyncCommandRepeats:3,maxSsCommandsPerCycle:40}),bootstrapNexus$1=(e={})=>{const{forceNew:t,...a}=e,n=Object.prototype.hasOwnProperty.call(a,"debug");return uninstallNexusClientOverrides(),installNexusClientOverrides(),installGlobalNexSys({adapterType:"nexus",options:{...Lt,...a,bootstrapDebugOverride:n?Boolean(a.debug):void 0}})},It=Symbol.for("nexsys4.startup.installed"),jt="font_stacks_original",getNexusclient=()=>globalThis.nexusclient&&"object"==typeof globalThis.nexusclient?globalThis.nexusclient:null,mountGui=e=>{if(!globalThis.ReactDOM||!globalThis.React)return!1;document.getElementById("modal-root")||document.body.appendChild(Object.assign(document.createElement("div"),{id:"modal-root"})),document.getElementById("nexsys-modal")?.remove();const t=Object.assign(document.createElement("div"),{id:"nexsys-modal"});return document.getElementById("modal-root").appendChild(t),globalThis.ReactDOM.createRoot(t).render(globalThis.React.createElement(e.component,{nexSys:e})),!0},injectFonts=()=>{const e=document.getElementsByTagName("head")[0],t=document.createElement("link");t.rel="stylesheet",t.href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap",e.appendChild(t);const a=document.createElement("link");a.rel="stylesheet",a.href="https://fonts.googleapis.com/css?family=Roboto%20Mono:300,400,500,700&display=swap",e.appendChild(a)},patchFontStacks=e=>{const t=e.settings();if(void 0!==t[jt])return;const a=document.getElementsByTagName("head")[0],n=document.getElementById("nexSysCSS")||document.createElement("style");n.id="nexSysCSS",n.parentNode||a.appendChild(n),t[jt]=t.font_stacks,t.font_stacks=function(){return n.textContent=`.timestamp {font-family: ${t.font_stack}}`,[{name:"RobotoMono",stack:"Roboto Mono,Consolas,monospace"},{name:"Consolas",stack:"Consolas,RobotoMono,monospace"},{name:"Verdana",stack:"Verdana, Geneva, sans-serif"},{name:"Lucida",stack:"'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Geneva, Verdana, sans-serif"},{name:"Arial",stack:"Arial, 'Helvetica Neue', Helvetica, sans-serif"},{name:"Futura",stack:"Futura, 'Trebuchet MS', Arial, sans-serif"},{name:"Book Antiqua",stack:"'Book Antiqua', Palatino, 'Palatino Linotype', 'Palatino LT STD', Georgia, serif"},...t[jt]()]}},initializeSettings=e=>{void 0===e.variables().vars.nexSys4Settings&&(e.variables().vars.nexSys4Settings={})},startupNexus=()=>{const e=getNexusclient();return!!e&&(e[It]||(injectFonts(),patchFontStacks(e),initializeSettings(e),e[It]=!0),mountGui(globalThis.nexSys),!0)},qt=(0,b.createContext)(null);function useNexSys(){return(0,b.useContext)(qt)}var Bt=__commonJSMin(e=>{var t=Symbol.for("react.transitional.element");Symbol.for("react.fragment");function jsxProd(e,a,n){var s=null;if(void 0!==n&&(s=""+n),void 0!==a.key&&(s=""+a.key),"key"in a)for(var i in n={},a)"key"!==i&&(n[i]=a[i]);else n=a;return a=n.ref,{$$typeof:t,type:e,key:s,ref:void 0!==a?a:null,props:n}}e.jsx=jsxProd,e.jsxs=jsxProd}),$t=__commonJSMin((e,t)=>{t.exports=Bt()})();function NexSysProvider({nexSys:e,children:t}){return(0,$t.jsx)(qt.Provider,{value:e,children:t})}var Ft={ink900:"#121310",ink800:"#191a16",ink700:"#20211b",ink600:"#26271f",textStrong:"#efe5ce",text:"#d4cbb6",textDim:"#a49b87",textFaint:"#7b7460",brassDeep:"#9a7433",brass:"#cba362",brassBright:"#e0c384",brassContrast:"#241a08",oxblood:"#c4776c",verdigris:"#7fa196"},zt="203, 163, 98",Gt={border:`rgba(${zt}, 0.18)`,borderStrong:`rgba(${zt}, 0.34)`,selectFill:`rgba(${zt}, 0.13)`,shadow:"rgba(0, 0, 0, 0.42)",dragShadow:"rgba(0, 0, 0, 0.55)"},Ht=(Ft.ink900,Ft.ink800,Ft.ink700,Ft.ink600,Ft.textStrong,Ft.text,Ft.textDim,Ft.textFaint,Ft.brass,Ft.brassBright,Ft.brassDeep,Ft.brassContrast,Ft.verdigris,Ft.oxblood,Gt.border,Gt.borderStrong,Ft.brass,Gt.selectFill,Gt.shadow,Gt.dragShadow,{radius:5}),Ut=(Ft.ink900,Ft.ink800,Ft.ink700,Ft.ink600,Ft.textStrong,Ft.text,Ft.textDim,Ft.textFaint,Ft.brassDeep,Ft.brass,Ft.brassBright,Ft.oxblood,Ft.verdigris,Gt.border,Gt.borderStrong,Gt.selectFill,Gt.shadow,'"Roboto Mono", ui-monospace, "Cascadia Code", "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", monospace'),Vt=(()=>(0,s.createTheme)({palette:{mode:"dark",primary:{main:Ft.brass,light:Ft.brassBright,dark:Ft.brassDeep,contrastText:Ft.brassContrast},secondary:{main:Ft.verdigris},error:{main:Ft.oxblood},success:{main:Ft.verdigris},info:{main:Ft.verdigris},warning:{main:Ft.brassBright},divider:Gt.border,background:{default:Ft.ink900,paper:Ft.ink700,deep:Ft.ink900,surface:Ft.ink800,panel:Ft.ink700,raised:Ft.ink600},text:{primary:Ft.textStrong,secondary:Ft.textDim,disabled:Ft.textFaint},border:{main:Gt.border,strong:Gt.borderStrong},select:{line:Ft.brass,fill:Gt.selectFill},action:{hover:Gt.selectFill,selected:Gt.selectFill}},shape:{borderRadius:Ht.radius},typography:{fontFamily:Ut,fontSize:13,button:{textTransform:"none",fontWeight:700},subtitle1:{fontWeight:700,letterSpacing:"0.01em"},subtitle2:{fontWeight:700,letterSpacing:"0.01em"},overline:{letterSpacing:"0.14em"}},components:{MuiCssBaseline:{styleOverrides:{body:{fontFamily:Ut}}},MuiTypography:{styleOverrides:{root:{fontFamily:Ut}}},MuiPaper:{styleOverrides:{root:{backgroundImage:"none"}}},MuiSwitch:{defaultProps:{size:"small"}},MuiSelect:{defaultProps:{size:"small"}},MuiTextField:{defaultProps:{size:"small"}},MuiPopover:{styleOverrides:{paper:{backgroundColor:Ft.ink600,backgroundImage:"none",border:`1px solid ${Gt.borderStrong}`}}},MuiTooltip:{styleOverrides:{tooltip:{backgroundColor:Ft.ink600,color:Ft.textStrong,border:`1px solid ${Gt.borderStrong}`,fontFamily:Ut,fontSize:"0.72rem"},arrow:{color:Ft.ink600}}},MuiLinearProgress:{styleOverrides:{determinate:{transition:"none",backgroundColor:Gt.selectFill},bar:{transition:"none",backgroundColor:Ft.brass}}},MuiDialog:{styleOverrides:{paper:({theme:e})=>({backgroundColor:e.palette.background.surface,backgroundImage:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius})}},MuiDialogTitle:{styleOverrides:{root:({theme:e})=>({"&&":{backgroundColor:e.palette.background.surface,color:e.palette.text.primary,borderBottom:`1px solid ${e.palette.divider}`}})}}}}))(),Yt=!1;function useDialogOpen(e){const[t,a]=(0,b.useState)(Yt);return(0,b.useEffect)(()=>e?.events?.on?.(se.UI_CONFIG_CHANGED,({open:e})=>{a(Boolean(e))})??void 0,[e]),[t,a]}var cloneSettings=(e={})=>(0,i.produce)(e,()=>{}),toFiniteNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toPriority=e=>toFiniteNumber(e,0),toConfigPriority=e=>Math.max(0,Math.min(26,toPriority(e))),toQuantity=e=>Math.max(0,toFiniteNumber(e,0)),isBlankInput=e=>""===e,toDraftConfigPriority=(e,t=0)=>{if(isBlankInput(e))return"";const a=Number(e);return Number.isFinite(a)?Math.max(0,Math.min(26,a)):t},normalizePriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a),e),{}),buildAffPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toPriority(a?.defaultPriority),e),{}),buildDefPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a?.defaultPriority),e),{}),buildDefStaticDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Boolean(a?.static),e),{}),buildPrecacheDraft=(e={})=>Object.entries(e?.desiredPrecache??{}).reduce((e,[t,a])=>(e[t]=toQuantity(a),e),{}),buildDraft=(e={})=>({settings:cloneSettings(e.system?.settings??{}),affPriorities:buildAffPriorityDraft(e.affs??{}),defPriorities:buildDefPriorityDraft(e.defs??{}),defStatics:buildDefStaticDraft(e.defs??{}),desiredPrecache:buildPrecacheDraft(e.cache??{})}),keysChangedFrom=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]);function useSettingsForm(e){const[t]=(0,b.useState)(()=>buildDraft(e?.runtime?.snapshot?.()??{})),[a,n]=(0,b.useState)(()=>t.settings),[s,o]=(0,b.useState)(()=>t.affPriorities),[l,c]=(0,b.useState)(()=>t.defPriorities),[u,d]=(0,b.useState)(()=>t.defStatics),[m,p]=(0,b.useState)(()=>t.desiredPrecache);return{pending:a,set:(0,b.useCallback)((e,t)=>{n(a=>a?(0,i.produce)(a,a=>{const n=e.split(".");let s=a;for(let e=0;e<n.length-1;e+=1)s[n[e]]&&"object"==typeof s[n[e]]||(s[n[e]]={}),s=s[n[e]];s[n[n.length-1]]=t}):a)},[]),affPriorities:s,setAffPriority:(0,b.useCallback)((e,t)=>{o(a=>({...a,[e]:toConfigPriority(t)}))},[]),defPriorities:l,setDefPriority:(0,b.useCallback)((e,t)=>{c(a=>{const n=a?.[e]??0;return{...a,[e]:toDraftConfigPriority(t,n)}})},[]),defStatics:u,setDefStatic:(0,b.useCallback)((e,t)=>{d(a=>({...a,[e]:Boolean(t)}))},[]),desiredPrecache:m,setPrecache:(0,b.useCallback)((e,t)=>{p(a=>({...a,[e]:toQuantity(t)}))},[]),commit:(0,b.useCallback)(()=>{if(!e)return;const n=t;keysChangedFrom(s,n.affPriorities).forEach(t=>{e.api?.affs?.setDefaultPriority?.(t,s[t])});const i=normalizePriorityDraft(l);keysChangedFrom(i,n.defPriorities).forEach(t=>{e.api?.defs?.setDefaultPriority?.(t,i[t])}),keysChangedFrom(u,n.defStatics).forEach(t=>{e.api?.defs?.setStatic?.(t,u[t])});const o=keysChangedFrom(m,n.desiredPrecache).reduce((e,t)=>(e[t]=m[t]??0,e),{});Object.keys(o).length&&e.api?.ss?.precache?.set?.(o),a&&e.api?.control?.applySettings?.(a)},[a,s,l,u,m,t,e])}}function LabelledSwitch({label:e,checked:t,onChange:a}){return(0,$t.jsx)(n.FormControlLabel,{control:(0,$t.jsx)(n.Switch,{checked:Boolean(t),onChange:e=>a(e.target.checked),size:"small"}),label:e,sx:{ml:0,mr:0,gap:.5,alignItems:"center",userSelect:"none","& .MuiSwitch-root":{mr:.5},"& .MuiFormControlLabel-label":{fontSize:11,lineHeight:1.25}}})}function ThresholdSlider({label:e,value:t,onChange:a,min:s=0,max:i=100,step:o=5,unit:l="%"}){return(0,$t.jsxs)(n.Box,{sx:{mb:1},children:[(0,$t.jsxs)(n.Typography,{variant:"body2",sx:{mb:.5,fontSize:11,lineHeight:1.3},children:[e,": ",t,l]}),(0,$t.jsx)(n.Slider,{value:t,min:s,max:i,step:o,onChange:(e,t)=>a(t),size:"small",sx:{color:"primary.main"}})]})}var Qt="50px",Wt={minWidth:95,height:25,px:1,fontSize:11,lineHeight:1};function SectionHeader({children:e}){return(0,$t.jsx)(n.Typography,{variant:"overline",sx:{display:"block",color:"primary.main",mt:2,mb:.5,fontWeight:700},children:e})}function SystemSettingsTab({pending:e,set:t}){return e?(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",columnGap:{xs:2,md:Qt},rowGap:2,pt:1},children:[(0,$t.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,$t.jsx)(SectionHeader,{children:"nexSys Config"}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,$t.jsx)(LabelledSwitch,{label:"Load on login",checked:!!e.loadOnLogin,onChange:e=>t("loadOnLogin",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Queue while paused",checked:e.queueWhilePaused,onChange:e=>t("queueWhilePaused",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Override Tab target",checked:e.overrideTab,onChange:e=>t("overrideTab",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Custom Prompt",checked:e.customPrompt,onChange:e=>t("customPrompt",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Debug output",checked:e.debug,onChange:e=>t("debug",e)})]}),(0,$t.jsx)(SectionHeader,{children:"Notices (Echo)"}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,$t.jsx)(LabelledSwitch,{label:"Affliction gained",checked:e.notices?.affGot,onChange:e=>t("notices.affGot",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Affliction lost",checked:e.notices?.affLost,onChange:e=>t("notices.affLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Defence gained",checked:e.notices?.defGot,onChange:e=>t("notices.defGot",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Defence lost",checked:e.notices?.defLost,onChange:e=>t("notices.defLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Balance lost",checked:e.notices?.balanceLost,onChange:e=>t("notices.balanceLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Balance recovered",checked:e.notices?.balanceRecovered,onChange:e=>t("notices.balanceRecovered",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Trackable gained",checked:e.notices?.trackableGot,onChange:e=>t("notices.trackableGot",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Trackable lost",checked:e.notices?.trackableLost,onChange:e=>t("notices.trackableLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Priority changes",checked:e.notices?.priority,onChange:e=>t("notices.priority",e)}),(0,$t.jsx)(LabelledSwitch,{label:"General output",checked:e.notices?.output,onChange:e=>t("notices.output",e)})]})]}),(0,$t.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:190},width:{xs:"100%",md:190},minWidth:0},children:[(0,$t.jsx)(SectionHeader,{children:"Curing Method"}),(0,$t.jsxs)(n.Box,{sx:{mb:1},children:[(0,$t.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Curing type"}),(0,$t.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.transmutation?"transmutation":"concoctions",onChange:(e,a)=>a&&t("ss.transmutation","transmutation"===a),sx:{"& .MuiToggleButton-root":Wt},children:[(0,$t.jsx)(n.ToggleButton,{value:"transmutation",children:"Transmutation"}),(0,$t.jsx)(n.ToggleButton,{value:"concoctions",children:"Concoctions"})]})]}),(0,$t.jsxs)(n.Box,{sx:{mb:1},children:[(0,$t.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Sip priority"}),(0,$t.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.sipPriority??"health",onChange:(e,a)=>a&&t("ss.sipPriority",a),sx:{"& .MuiToggleButton-root":Wt},children:[(0,$t.jsx)(n.ToggleButton,{value:"health",children:"Health"}),(0,$t.jsx)(n.ToggleButton,{value:"mana",children:"Mana"})]})]}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column",mt:1},children:[(0,$t.jsx)(LabelledSwitch,{label:"Batching",checked:e.ss?.batch,onChange:e=>t("ss.batch",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Tree Tattoo",checked:"on"===e.ss?.tree,onChange:e=>t("ss.tree",e?"on":"off")}),(0,$t.jsx)(LabelledSwitch,{label:"Focus",checked:e.ss?.focus,onChange:e=>t("ss.focus",e)}),e.ss?.focus&&(0,$t.jsx)(LabelledSwitch,{label:"Focus over Herbs",checked:e.ss?.focusOverHerbs,onChange:e=>t("ss.focusOverHerbs",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Blood clotting",checked:e.ss?.clot,onChange:e=>t("ss.clot",e)}),e.ss?.clot&&(0,$t.jsx)(n.Box,{sx:{ml:1,mt:2,mb:.5},children:(0,$t.jsx)(n.TextField,{label:"Clot above",value:e.ss?.clotAt??"",onChange:e=>t("ss.clotAt",Number(e.target.value)||0),type:"number",size:"small",sx:{width:100,maxWidth:"100%"},slotProps:{htmlInput:{min:0}}})})]})]}),(0,$t.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,$t.jsx)(SectionHeader,{children:"Thresholds"}),(0,$t.jsx)(ThresholdSlider,{label:"Sip health at",value:e.ss?.sipHealthAt??0,onChange:e=>t("ss.sipHealthAt",e)}),(0,$t.jsx)(ThresholdSlider,{label:"Sip mana at",value:e.ss?.sipManaAt??0,onChange:e=>t("ss.sipManaAt",e)}),(0,$t.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,$t.jsx)(ThresholdSlider,{label:"Moss health at",value:e.ss?.mossHealthAt??0,onChange:e=>t("ss.mossHealthAt",e)}),(0,$t.jsx)(ThresholdSlider,{label:"Moss mana at",value:e.ss?.mossManaAt??0,onChange:e=>t("ss.mossManaAt",e)}),(0,$t.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,$t.jsx)(ThresholdSlider,{label:"Cure fractures above",value:e.ss?.fracturesAbove??0,onChange:e=>t("ss.fracturesAbove",e)}),(0,$t.jsx)(ThresholdSlider,{label:"Use mana abilities above",value:e.ss?.manaThreshold??0,onChange:e=>t("ss.manaThreshold",e)})]})]}):null}function useNexSysSnapshot(e){return(0,b.useSyncExternalStore)((0,b.useCallback)(t=>{const a=e.events.topics,n=[a.SYSTEM_SETTINGS_CHANGED,a.SYSTEM_STATUS_CHANGED,a.SYSTEM_CLASS_CHANGED,a.AFF_PRIORITY_CHANGED,a.DEF_PRIORITY_CHANGED,a.CACHE_PRECACHE_CHANGED,a.SYSTEM_RUNTIME_CHANGED];return n.forEach(a=>e.events.on(a,t)),()=>n.forEach(a=>e.events.off(a,t))},[e]),e.runtime.snapshot,e.runtime.snapshot)}var Kt=Object.freeze({}),Xt=new Set(Object.keys(Y?.types?.nonServerside??{}));function buildColumns(e,t={}){return(0,i.produce)({},a=>{for(let e=0;e<=25;e++)a[`col-${e}`]={id:`col-${e}`,label:0===e?"Ignored 26":`Prio ${e}`,priority:e,affs:[]};for(const[n,s]of Object.entries(e)){if(Xt.has(n))continue;const e=Number(t[n]??s.defaultPriority??0);!Number.isFinite(e)||e>26||a[`col-${Math.max(0,Math.min(25,26===e?0:e))}`].affs.push(n)}})}function findContainer(e,t){return t[e]?e:Object.keys(t).find(a=>t[a].affs.includes(e))??null}function useAffPriorities(e,t={}){const[a,n]=(0,b.useState)(null),[s,c]=(0,b.useState)(null),u=(0,b.useRef)(null),d=useNexSysSnapshot(e)?.affs??Kt,{affPriorities:m=Kt,setAffPriority:p}=t,g=(0,b.useMemo)(()=>buildColumns(d,m),[d,m]);return{columns:s??g,activeId:a,sensors:(0,o.useSensors)((0,o.useSensor)(o.PointerSensor,{activationConstraint:{distance:4}}),(0,o.useSensor)(o.KeyboardSensor,{coordinateGetter:l.sortableKeyboardCoordinates})),onDragStart:(0,b.useCallback)(({active:e})=>{n(String(e.id));const t=(0,i.produce)(g,()=>{});u.current=t,c(t)},[g]),onDragOver:(0,b.useCallback)(({active:e,over:t})=>{if(!t)return;const a=String(e.id),n=String(t.id),s=u.current;if(!s)return;const o=findContainer(a,s),d=findContainer(n,s);if(!o||!d)return;let m;if(o===d){const e=s[o].affs,t=e.indexOf(a),c=e.indexOf(n);if(-1===t||-1===c||t===c)return;m=(0,i.produce)(s,a=>{a[o].affs=(0,l.arrayMove)(e,t,c)})}else m=(0,i.produce)(s,e=>{const t=e[o].affs,s=e[d].affs;if(-1===t.indexOf(a))return;const i=s.indexOf(n),l=-1===i?s.length:i;e[o].affs=t.filter(e=>e!==a),e[d].affs=[...s.slice(0,l),a,...s.slice(l)]});u.current=m,c(m)},[]),onDragEnd:(0,b.useCallback)(({active:e,over:t})=>{n(null);const a=u.current;if(u.current=null,c(null),!t||!a)return;const s=String(e.id),i=findContainer(s,a);if(!i)return;const o=a[i]?.priority??0;o!==(g[findContainer(s,g)]?.priority??0)&&p?.(s,o)},[g,p]),onDragCancel:(0,b.useCallback)(()=>{n(null),u.current=null,c(null)},[])}}var Jt={antimony:"olive",argentum:"royalblue",aurum:"ForestGreen",calcite:"slategray",cinnabar:"greenyellow",cuprum:"DeepSkyBlue",ferrum:"DarkOrange",magnesium:"Red",plumbum:"Gold",realgar:"firebrick",stannum:"Tan",caloric:"darkseagreen",mending:"orchid",epidermal:"sienna",restoration:"darkviolet",health:"lightpink",writhe:"PaleGoldenRod"},Zt={ginseng:"ferrum",bloodroot:"magnesium",kelp:"aurum",hawthorn:"calamine",lobelia:"argentum",bellwort:"cuprum",ginger:"antimony",bayberry:"arsenic",ash:"stannum",goldenseal:"plumbum",pear:"calcite",elm:"cinnabar",valerian:"realgar",skullcap:"azurite",moss:"potash",kola:"quartz",sileris:"quicksilver",cohosh:"gypsum"};function resolveCureColor(e){if(e in Jt)return Jt[e]??null;const t=Zt[e];if(t)return Jt[t]??null;const a=e.match(/^(caloric|mending|epidermal|restoration|health)\b/);return a?Jt[a[1]]??null:null}var er=["bound","daeggerimpale","entangled","impaled","transfixation","webbed","icebound"],tr={};for(const[On,Nn]of Object.entries(J))for(const e of Nn){const t=resolveCureColor(e);if(t){tr[On]=t;break}}for(const On of er)tr[On]||(tr[On]=Jt.writhe);function getAffColor(e){return tr[e]??null}function AffChip({name:e,isDragging:t=!1}){const a=getAffColor(e);return(0,$t.jsx)(n.Chip,{label:e,size:"small",sx:{fontSize:13,height:22,mb:.25,padding:.5,opacity:t?.4:1,cursor:"grab",bgcolor:"background.deep",color:a??"text.secondary",border:"1px solid",borderColor:a??"divider","& .MuiChip-label":{px:.75},"&:active":{cursor:"grabbing"}}})}function SortableAffChip({name:e}){const{attributes:t,listeners:a,setNodeRef:s,transform:i,transition:o,isDragging:u}=(0,l.useSortable)({id:e});return(0,$t.jsx)(n.Box,{ref:s,...t,...a,sx:{transform:c.CSS.Transform.toString(i),transition:o,touchAction:"none"},children:(0,$t.jsx)(AffChip,{name:e,isDragging:u})})}function PriorityColumn({column:e}){const t=0===e.priority,{setNodeRef:a}=(0,o.useDroppable)({id:e.id});return(0,$t.jsxs)(n.Box,{sx:{minWidth:125,maxWidth:125,border:"1px solid",borderColor:t?"divider":"border.strong",borderRadius:1,p:.5,bgcolor:t?"background.deep":"select.fill",flexShrink:0},children:[(0,$t.jsx)(n.Typography,{variant:"caption",sx:{display:"block",textAlign:"center",fontWeight:700,color:t?"text.secondary":"primary.main",mb:.5,fontSize:13},children:e.label}),(0,$t.jsx)(l.SortableContext,{items:e.affs,strategy:l.verticalListSortingStrategy,children:(0,$t.jsx)(n.Box,{ref:a,sx:{minHeight:28,display:"flex",flexDirection:"column"},children:e.affs.map(e=>(0,$t.jsx)(SortableAffChip,{name:e},e))})})]})}function AffPrioritiesTab({settingsForm:e}){const{columns:t,activeId:a,sensors:s,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u}=useAffPriorities(useNexSys(),e);return(0,$t.jsx)(n.Box,{sx:{py:1},children:(0,$t.jsx)(n.Box,{sx:{display:"inline-flex",gap:.75,alignItems:"flex-start"},children:(0,$t.jsxs)(o.DndContext,{sensors:s,collisionDetection:o.closestCorners,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u,children:[Object.keys(t).map(e=>(0,$t.jsx)(PriorityColumn,{column:t[e]},e)),(0,$t.jsx)(o.DragOverlay,{children:a?(0,$t.jsx)(AffChip,{name:a}):null})]})})})}function r(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(a=r(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function clsx(){for(var e,t,a=0,n="",s=arguments.length;a<s;a++)(e=arguments[a])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}function composeClasses(e,t,a=void 0){const n={};for(const s in e){const i=e[s];let o="",l=!0;for(let e=0;e<i.length;e+=1){const n=i[e];n&&(o+=(!0===l?"":" ")+t(n),l=!1,a&&a[n]&&(o+=" "+a[n]))}n[s]=o}return n}function formatMuiErrorMessage(e,...t){const a=new URL(`https://mui.com/production-error/?code=${e}`);return t.forEach(e=>a.searchParams.append("args[]",e)),`Minified MUI error #${e}; visit ${a} for the full message.`}function capitalize$1(e){if("string"!=typeof e)throw new Error(formatMuiErrorMessage(7));return e.charAt(0).toUpperCase()+e.slice(1)}var rr=capitalize$1;function fastDeepAssign(e,t){const a=Array.isArray(t),n=Array.isArray(e);return isPrimitive(t)?t:isPrimitiveOrBuiltIn(e)?clone(t):a&&n?mergeArray(e,t):a!==n?clone(t):mergeObject(e,t)}function cloneArray(e){let t=0;const a=e.length,n=new Array(a);for(t=0;t<a;t+=1)n[t]=clone(e[t]);return n}function cloneObject(e){const t={};for(const a in e)t[a]=clone(e[a]);return t}function mergeArray(e,t){const a=e.length;for(let n=0;n<t.length;n+=1)e[a+n]=clone(t[n]);return e}function isMergeableObject(e){return!("object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date)}function isPrimitive(e){return"object"!=typeof e||null===e}function isPrimitiveOrBuiltIn(e){return"object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date}function clone(e){return isMergeableObject(e)?Array.isArray(e)?cloneArray(e):cloneObject(e):e}function mergeObject(e,t){for(const a in t)e[a]=a in e?fastDeepAssign(e[a],t[a]):clone(t[a]);return e}function isObjectEmpty(e){if(null==e)return!0;for(const t in e)return!1;return!0}var ar=__commonJSMin(e=>{Symbol.for("react.transitional.element"),Symbol.for("react.portal");var t=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),i=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),m=(Symbol.for("react.view_transition"),Symbol.for("react.client.reference"));e.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===t||e===n||e===a||e===l||e===c||"object"==typeof e&&null!==e&&(e.$$typeof===d||e.$$typeof===u||e.$$typeof===i||e.$$typeof===s||e.$$typeof===o||e.$$typeof===m||void 0!==e.getModuleId)}}),nr=__commonJSMin((e,t)=>{t.exports=ar()})();function isPlainObject(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}function deepClone(e){if(b.isValidElement(e)||(0,nr.isValidElementType)(e)||!isPlainObject(e))return e;const t={};return Object.keys(e).forEach(a=>{t[a]=deepClone(e[a])}),t}function deepmerge(e,t,a={clone:!0}){const n=a.clone?{...e}:e;return isPlainObject(e)&&isPlainObject(t)&&Object.keys(t).forEach(s=>{b.isValidElement(t[s])||(0,nr.isValidElementType)(t[s])?n[s]=t[s]:isPlainObject(t[s])&&Object.prototype.hasOwnProperty.call(e,s)&&isPlainObject(e[s])?n[s]=deepmerge(e[s],t[s],a):a.clone?n[s]=isPlainObject(t[s])?deepClone(t[s]):t[s]:n[s]=t[s]}),n}var sr=/min-width:\s*([0-9.]+)/;function sortContainerQueries(e,t){if(!e.containerQueries||!hasContainerQuery(t))return t;const a=[];for(const s in t)s.startsWith("@container")&&a.push(s);a.sort((e,t)=>+(e.match(sr)?.[1]||0)-+(t.match(sr)?.[1]||0));const n=t;for(let s=0;s<a.length;s+=1){const e=a[s],t=n[e];delete n[e],n[e]=t}return n}function hasContainerQuery(e){for(const t in e)if(t.startsWith("@container"))return!0;return!1}function isCqShorthand(e,t){return"@"===t||t.startsWith("@")&&(e.some(e=>t.startsWith(`@${e}`))||!!t.match(/^@\d/))}function getContainerQuery(e,t){const a=t.match(/^@([^/]+)?\/?(.+)?$/);if(!a)return null;const[,n,s]=a,i=Number.isNaN(+n)?n||0:+n;return e.containerQueries(s).up(i)}function cssContainerQueries(e){const toContainerQuery=(e,t)=>e.replace("@media",t?`@container ${t}`:"@container");function attachCq(t,a){t.up=(...t)=>toContainerQuery(e.breakpoints.up(...t),a),t.down=(...t)=>toContainerQuery(e.breakpoints.down(...t),a),t.between=(...t)=>toContainerQuery(e.breakpoints.between(...t),a),t.only=(...t)=>toContainerQuery(e.breakpoints.only(...t),a),t.not=(...t)=>{const n=toContainerQuery(e.breakpoints.not(...t),a);return n.includes("not all and")?n.replace("not all and ","").replace("min-width:","width<").replace("max-width:","width>").replace("and","or"):n}}const t={},containerQueries=e=>(attachCq(t,e),t);return attachCq(containerQueries),{...e,containerQueries}}var sortBreakpointsValues=e=>{const t=Object.keys(e).map(t=>({key:t,val:e[t]}))||[];return t.sort((e,t)=>e.val-t.val),t.reduce((e,t)=>({...e,[t.key]:t.val}),{})};function createBreakpoints(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:a="px",step:n=5,...s}=e,i=sortBreakpointsValues(t),o=Object.keys(i);function up(e){return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a})`}function down(e){return`@media (max-width:${("number"==typeof t[e]?t[e]:e)-n/100}${a})`}function between(e,s){const i=o.indexOf(s);return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a}) and (max-width:${(-1!==i&&"number"==typeof t[o[i]]?t[o[i]]:s)-n/100}${a})`}function only(e){return o.indexOf(e)+1<o.length?between(e,o[o.indexOf(e)+1]):up(e)}function not(e){const t=o.indexOf(e);return 0===t?up(o[1]):t===o.length-1?down(o[t]):between(e,o[o.indexOf(e)+1]).replace("@media","@media not all and")}const l=[];for(let c=0;c<o.length;c+=1)l.push(up(o[c]));return{keys:o,values:i,up,down,between,only,not,unit:a,internal_mediaKeys:l,...s}}var ir={},or={xs:0,sm:600,md:900,lg:1200,xl:1536},lr=createBreakpoints({values:or}),cr={containerQueries:e=>({up:t=>{let a="number"==typeof t?t:or[t]||t;return"number"==typeof a&&(a=`${a}px`),e?`@container ${e} (min-width:${a})`:`@container (min-width:${a})`}})};function handleBreakpoints(e,t,a){const n={};return iterateBreakpoints(n,e.theme,t,(e,t,s)=>{const i=a(t,s);e?n[e]=i:fastDeepAssign(n,i)})}function iterateBreakpoints(e,t,a,n){if(t??=ir,Array.isArray(a)){const s=t.breakpoints??lr;for(let t=0;t<a.length;t+=1)buildBreakpoint(e,s.up(s.keys[t]),a[t],void 0,n);return e}if("object"==typeof a){const s=t.breakpoints??lr,i=s.values??or;for(const o in a)if(isCqShorthand(s.keys,o)){const s=getContainerQuery(t.containerQueries?t:cr,o);s&&buildBreakpoint(e,s,a[o],o,n)}else if(o in i)buildBreakpoint(e,s.up(o),a[o],o,n);else{const t=o;e[t]=a[t]}return e}return n(void 0,a),e}function buildBreakpoint(e,t,a,n,s){e[t]??={},s(t,a,n)}function createEmptyBreakpointObject(e=lr){const{internal_mediaKeys:t}=e,a={};for(let n=0;n<t.length;n+=1)a[t[n]]={};return a}function removeUnusedBreakpoints(e,t){const a=e.internal_mediaKeys;for(let n=0;n<a.length;n+=1){const e=a[n];isObjectEmpty(t[e])&&delete t[e]}return t}function hasBreakpoint(e,t){if(Array.isArray(t))return!0;if("object"==typeof t&&null!==t){for(let n=0;n<e.keys.length;n+=1)if(e.keys[n]in t)return!0;const a=Object.keys(t);for(let t=0;t<a.length;t+=1)if(isCqShorthand(e.keys,a[t]))return!0}return!1}function getStyleValue2(e,t,a,n){let s;return s="function"==typeof e?e(a):Array.isArray(e)?e[a]||a:"string"==typeof a&&getPath(e,a,!0,n)||a,t&&(s=t(s,a,e)),s}function getPath(e,t,a=!0,n=void 0){if(!e||!t)return null;const s=t.split(".");if(e.vars&&a){const t=getPathImpl(e.vars,s,n);if(null!=t)return t}return getPathImpl(e,s,n)}function getPathImpl(e,t,a=void 0){let n,s=e,i=0;for(;i<t.length;){if(null==s)return s;n=s,s=s[t[i]],i+=1}if(a&&void 0===s){const e=t[t.length-1],s=`${a}${"default"===e?"":capitalize$1(e)}`;return n?.[s]}return s}function style$1(e){const{prop:t,cssProperty:a=e.prop,themeKey:n,transform:s}=e,fn=e=>{if(null==e[t])return null;const i=e[t],o=getPath(e.theme,n)||{};return handleBreakpoints(e,i,e=>{const n=getStyleValue2(o,s,e,t);return!1===a?n:{[a]:n}})};return fn.propTypes={},fn.filterProps=[t],fn}var ur={internal_cache:{}},dr={m:"margin",p:"padding"},mr={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},pr={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},gr={};for(const On in dr)gr[On]=[dr[On]];for(const On in dr)for(const e in mr){const t=dr[On],a=mr[e],n=Array.isArray(a)?a.map(e=>t+e):[t+a];gr[On+e]=n}for(const On in pr)gr[On]=gr[pr[On]];var fr=new Set(["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"]),hr=new Set(["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"]),br=new Set([...fr,...hr]);function createUnaryUnit(e,t,a,n){const s=getPath(e,t,!0)??a;return"number"==typeof s||"string"==typeof s?e=>"string"==typeof e?e:"string"==typeof s?s.startsWith("var(")&&0===e?0:s.startsWith("var(")&&1===e?s:`calc(${e} * ${s})`:s*e:Array.isArray(s)?e=>{if("string"==typeof e)return e;const t=s[Math.abs(e)];return e>=0?t:"number"==typeof t?-t:"string"==typeof t&&t.startsWith("var(")?`calc(-1 * ${t})`:`-${t}`}:"function"==typeof s?s:()=>{}}function createUnarySpacing(e){return createUnaryUnit(e,"spacing",8,"spacing")}function getValue(e,t){return"string"==typeof t||null==t?t:e(t)}var yr=[""];function style(e,t){const a=e.theme??ur,n=a?.internal_cache?.unarySpacing??createUnarySpacing(a),s={};for(const i in e){if(!t.has(i))continue;const a=gr[i]??(yr[0]=i,yr),o=e[i];iterateBreakpoints(s,e.theme,o,(e,t)=>{const i=e?s[e]:s;for(let s=0;s<a.length;s+=1)i[a[s]]=getValue(n,t)})}return s}function margin(e){return style(e,fr)}function padding(e){return style(e,hr)}function spacing(e){return style(e,br)}function compose(...e){const t=e.reduce((e,t)=>(t.filterProps.forEach(a=>{e[a]=t}),e),{}),fn=e=>{const a={};for(const n in e)t[n]&&fastDeepAssign(a,t[n](e));return a};return fn.propTypes={},fn.filterProps=e.reduce((e,t)=>e.concat(t.filterProps),[]),fn}function borderTransform(e){return"number"!=typeof e?e:`${e}px solid`}function createBorderStyle(e,t){return style$1({prop:e,themeKey:"borders",transform:t})}margin.propTypes={},margin.filterProps=fr,padding.propTypes={},padding.filterProps=hr,spacing.propTypes={},spacing.filterProps=br;var vr=createBorderStyle("border",borderTransform),Sr=createBorderStyle("borderTop",borderTransform),xr=createBorderStyle("borderRight",borderTransform),Cr=createBorderStyle("borderBottom",borderTransform),kr=createBorderStyle("borderLeft",borderTransform),Ar=createBorderStyle("borderColor"),Er=createBorderStyle("borderTopColor"),_r=createBorderStyle("borderRightColor"),wr=createBorderStyle("borderBottomColor"),Tr=createBorderStyle("borderLeftColor"),Pr=createBorderStyle("outline",borderTransform),Mr=createBorderStyle("outlineColor"),borderRadius=e=>{if(void 0!==e.borderRadius&&null!==e.borderRadius){const t=createUnaryUnit(e.theme,"shape.borderRadius",4,"borderRadius"),styleFromPropValue=e=>({borderRadius:getValue(t,e)});return handleBreakpoints(e,e.borderRadius,styleFromPropValue)}return null};borderRadius.propTypes={},borderRadius.filterProps=["borderRadius"];compose(vr,Sr,xr,Cr,kr,Ar,Er,_r,wr,Tr,borderRadius,Pr,Mr);var gap=e=>{if(void 0!==e.gap&&null!==e.gap){const t=createUnaryUnit(e.theme,"spacing",8,"gap"),styleFromPropValue=e=>({gap:getValue(t,e)});return handleBreakpoints(e,e.gap,styleFromPropValue)}return null};gap.propTypes={},gap.filterProps=["gap"];var columnGap=e=>{if(void 0!==e.columnGap&&null!==e.columnGap){const t=createUnaryUnit(e.theme,"spacing",8,"columnGap"),styleFromPropValue=e=>({columnGap:getValue(t,e)});return handleBreakpoints(e,e.columnGap,styleFromPropValue)}return null};columnGap.propTypes={},columnGap.filterProps=["columnGap"];var rowGap=e=>{if(void 0!==e.rowGap&&null!==e.rowGap){const t=createUnaryUnit(e.theme,"spacing",8,"rowGap"),styleFromPropValue=e=>({rowGap:getValue(t,e)});return handleBreakpoints(e,e.rowGap,styleFromPropValue)}return null};rowGap.propTypes={},rowGap.filterProps=["rowGap"];compose(gap,columnGap,rowGap,style$1({prop:"gridColumn"}),style$1({prop:"gridRow"}),style$1({prop:"gridAutoFlow"}),style$1({prop:"gridAutoColumns"}),style$1({prop:"gridAutoRows"}),style$1({prop:"gridTemplateColumns"}),style$1({prop:"gridTemplateRows"}),style$1({prop:"gridTemplateAreas"}),style$1({prop:"gridArea"}));function paletteTransform(e,t){return"grey"===t?t:e}compose(style$1({prop:"color",themeKey:"palette",transform:paletteTransform}),style$1({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:paletteTransform}),style$1({prop:"backgroundColor",themeKey:"palette",transform:paletteTransform}));function sizingTransform(e){return e<=1&&0!==e?100*e+"%":e}var Dr=style$1({prop:"width",transform:sizingTransform}),maxWidth=e=>{if(void 0!==e.maxWidth&&null!==e.maxWidth){const styleFromPropValue=t=>{const a=e.theme?.breakpoints?.values?.[t]||or[t];return a?"px"!==e.theme?.breakpoints?.unit?{maxWidth:`${a}${e.theme.breakpoints.unit}`}:{maxWidth:a}:{maxWidth:sizingTransform(t)}};return handleBreakpoints(e,e.maxWidth,styleFromPropValue)}return null};maxWidth.filterProps=["maxWidth"];var Rr=style$1({prop:"minWidth",transform:sizingTransform}),Or=style$1({prop:"height",transform:sizingTransform}),Nr=style$1({prop:"maxHeight",transform:sizingTransform}),Lr=style$1({prop:"minHeight",transform:sizingTransform}),Ir=(style$1({prop:"size",cssProperty:"width",transform:sizingTransform}),style$1({prop:"size",cssProperty:"height",transform:sizingTransform}),compose(Dr,maxWidth,Rr,Or,Nr,Lr,style$1({prop:"boxSizing"})),{border:{themeKey:"borders",transform:borderTransform},borderTop:{themeKey:"borders",transform:borderTransform},borderRight:{themeKey:"borders",transform:borderTransform},borderBottom:{themeKey:"borders",transform:borderTransform},borderLeft:{themeKey:"borders",transform:borderTransform},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:borderTransform},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:borderRadius},color:{themeKey:"palette",transform:paletteTransform},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:paletteTransform},backgroundColor:{themeKey:"palette",transform:paletteTransform},p:{style:padding},pt:{style:padding},pr:{style:padding},pb:{style:padding},pl:{style:padding},px:{style:padding},py:{style:padding},padding:{style:padding},paddingTop:{style:padding},paddingRight:{style:padding},paddingBottom:{style:padding},paddingLeft:{style:padding},paddingX:{style:padding},paddingY:{style:padding},paddingInline:{style:padding},paddingInlineStart:{style:padding},paddingInlineEnd:{style:padding},paddingBlock:{style:padding},paddingBlockStart:{style:padding},paddingBlockEnd:{style:padding},m:{style:margin},mt:{style:margin},mr:{style:margin},mb:{style:margin},ml:{style:margin},mx:{style:margin},my:{style:margin},margin:{style:margin},marginTop:{style:margin},marginRight:{style:margin},marginBottom:{style:margin},marginLeft:{style:margin},marginX:{style:margin},marginY:{style:margin},marginInline:{style:margin},marginInlineStart:{style:margin},marginInlineEnd:{style:margin},marginBlock:{style:margin},marginBlockStart:{style:margin},marginBlockEnd:{style:margin},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:gap},rowGap:{style:rowGap},columnGap:{style:columnGap},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:sizingTransform},maxWidth:{style:maxWidth},minWidth:{transform:sizingTransform},height:{transform:sizingTransform},maxHeight:{transform:sizingTransform},minHeight:{transform:sizingTransform},boxSizing:{},font:{themeKey:"font"},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}}),jr={};function unstable_createStyleFunctionSx(){function styleFunctionSx(e){if(!e.sx)return null;const{sx:t,theme:a=jr,nested:n}=e,s=a.unstable_sxConfig??Ir,i={sx:null,theme:a,nested:!0};function process(t){let o=t;if("function"==typeof t)o=t(a);else if("object"!=typeof t)return t;if(!o)return null;const l=a.breakpoints??lr,c=createEmptyBreakpointObject(l);for(const n in o){const t=callIfFn(o[n],a);null!=t&&("object"==typeof t?s[n]?setThemeValue(c,n,t,a,s):hasBreakpoint(l,t)?iterateBreakpoints(c,e.theme,t,(e,t)=>{c[e][n]=t}):(i.sx=t,c[n]=styleFunctionSx(i)):setThemeValue(c,n,t,a,s))}return!n&&a.modularCssLayers?{"@layer sx":sortContainerQueries(a,removeUnusedBreakpoints(l,c))}:sortContainerQueries(a,removeUnusedBreakpoints(l,c))}return Array.isArray(t)?t.map(process):process(t)}return styleFunctionSx.filterProps=["sx"],styleFunctionSx}var qr=unstable_createStyleFunctionSx();function setThemeValue(e,t,a,n,s){const i=s[t];if(!i)return void(e[t]=a);if(null==a)return;const{themeKey:o}=i;if("typography"===o&&"inherit"===a)return void(e[t]=a);const{style:l}=i;if(l)return void fastDeepAssign(e,l({[t]:a,theme:n}));const{cssProperty:c=t,transform:u}=i,d=getPath(n,o);iterateBreakpoints(e,n,a,(a,n)=>{const s=getStyleValue2(d,u,n,t);!1===c?fastDeepAssign(a?e[a]:e,s):a?e[a][c]=s:e[c]=s})}function callIfFn(e,t){return"function"==typeof e?e(t):e}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)({}).hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},_extends.apply(null,arguments)}var Br=!1;function sheetForTag(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}function createStyleElement(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}var $r=function(){function StyleSheet(e){var t=this;this._insertTag=function(e){var a;a=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,a),t.tags.push(e)},this.isSpeedy=void 0===e.speedy?!Br:e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var e=StyleSheet.prototype;return e.hydrate=function hydrate(e){e.forEach(this._insertTag)},e.insert=function insert(e){this.ctr%(this.isSpeedy?65e3:1)==0&&this._insertTag(createStyleElement(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var a=sheetForTag(t);try{a.insertRule(e,a.cssRules.length)}catch(n){}}else t.appendChild(document.createTextNode(e));this.ctr++},e.flush=function flush(){this.tags.forEach(function(e){var t;return null==(t=e.parentNode)?void 0:t.removeChild(e)}),this.tags=[],this.ctr=0},StyleSheet}(),Fr="-ms-",zr="-moz-",Gr="-webkit-",Hr="comm",Ur="rule",Vr="decl",Yr="@import",Qr="@keyframes",Wr="@layer",Kr=Math.abs,Xr=String.fromCharCode,Jr=Object.assign;function hash(e,t){return 45^charat(e,0)?(((t<<2^charat(e,0))<<2^charat(e,1))<<2^charat(e,2))<<2^charat(e,3):0}function trim(e){return e.trim()}function match(e,t){return(e=t.exec(e))?e[0]:e}function replace(e,t,a){return e.replace(t,a)}function indexof(e,t){return e.indexOf(t)}function charat(e,t){return 0|e.charCodeAt(t)}function substr(e,t,a){return e.slice(t,a)}function strlen(e){return e.length}function sizeof(e){return e.length}function append(e,t){return t.push(e),e}function combine(e,t){return e.map(t).join("")}var Zr=1,ea=1,ta=0,ra=0,aa=0,na="";function node(e,t,a,n,s,i,o){return{value:e,root:t,parent:a,type:n,props:s,children:i,line:Zr,column:ea,length:o,return:""}}function copy(e,t){return Jr(node("",null,null,"",null,null,0),e,{length:-e.length},t)}function char(){return aa}function prev(){return aa=ra>0?charat(na,--ra):0,ea--,10===aa&&(ea=1,Zr--),aa}function next(){return aa=ra<ta?charat(na,ra++):0,ea++,10===aa&&(ea=1,Zr++),aa}function peek(){return charat(na,ra)}function caret(){return ra}function slice(e,t){return substr(na,e,t)}function token(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function alloc(e){return Zr=ea=1,ta=strlen(na=e),ra=0,[]}function dealloc(e){return na="",e}function delimit(e){return trim(slice(ra-1,delimiter(91===e?e+2:40===e?e+1:e)))}function whitespace(e){for(;(aa=peek())&&aa<33;)next();return token(e)>2||token(aa)>3?"":" "}function escaping(e,t){for(;--t&&next()&&!(aa<48||aa>102||aa>57&&aa<65||aa>70&&aa<97););return slice(e,caret()+(t<6&&32==peek()&&32==next()))}function delimiter(e){for(;next();)switch(aa){case e:return ra;case 34:case 39:34!==e&&39!==e&&delimiter(aa);break;case 40:41===e&&delimiter(e);break;case 92:next()}return ra}function commenter(e,t){for(;next()&&e+aa!==57&&(e+aa!==84||47!==peek()););return"/*"+slice(t,ra-1)+"*"+Xr(47===e?e:next())}function identifier(e){for(;!token(peek());)next();return slice(e,ra)}function compile(e){return dealloc(parse("",null,null,null,[""],e=alloc(e),0,[0],e))}function parse(e,t,a,n,s,i,o,l,c){for(var u=0,d=0,m=o,p=0,g=0,h=0,b=1,y=1,v=1,S=0,x="",C=s,k=i,A=n,E=x;y;)switch(h=S,S=next()){case 40:if(108!=h&&58==charat(E,m-1)){-1!=indexof(E+=replace(delimit(S),"&","&\f"),"&\f")&&(v=-1);break}case 34:case 39:case 91:E+=delimit(S);break;case 9:case 10:case 13:case 32:E+=whitespace(h);break;case 92:E+=escaping(caret()-1,7);continue;case 47:switch(peek()){case 42:case 47:append(comment(commenter(next(),caret()),t,a),c);break;default:E+="/"}break;case 123*b:l[u++]=strlen(E)*v;case 125*b:case 59:case 0:switch(S){case 0:case 125:y=0;case 59+d:-1==v&&(E=replace(E,/\f/g,"")),g>0&&strlen(E)-m&&append(g>32?declaration(E+";",n,a,m-1):declaration(replace(E," ","")+";",n,a,m-2),c);break;case 59:E+=";";default:if(append(A=ruleset(E,t,a,u,d,s,l,x,C=[],k=[],m),i),123===S)if(0===d)parse(E,t,A,A,C,i,m,l,k);else switch(99===p&&110===charat(E,3)?100:p){case 100:case 108:case 109:case 115:parse(e,A,A,n&&append(ruleset(e,A,A,0,0,s,l,x,s,C=[],m),k),s,k,m,l,n?C:k);break;default:parse(E,A,A,A,[""],k,0,l,k)}}u=d=g=0,b=v=1,x=E="",m=o;break;case 58:m=1+strlen(E),g=h;default:if(b<1)if(123==S)--b;else if(125==S&&0==b++&&125==prev())continue;switch(E+=Xr(S),S*b){case 38:v=d>0?1:(E+="\f",-1);break;case 44:l[u++]=(strlen(E)-1)*v,v=1;break;case 64:45===peek()&&(E+=delimit(next())),p=peek(),d=m=strlen(x=E+=identifier(caret())),S++;break;case 45:45===h&&2==strlen(E)&&(b=0)}}return i}function ruleset(e,t,a,n,s,i,o,l,c,u,d){for(var m=s-1,p=0===s?i:[""],g=sizeof(p),h=0,b=0,y=0;h<n;++h)for(var v=0,S=substr(e,m+1,m=Kr(b=o[h])),x=e;v<g;++v)(x=trim(b>0?p[v]+" "+S:replace(S,/&\f/g,p[v])))&&(c[y++]=x);return node(e,t,a,0===s?Ur:l,c,u,d)}function comment(e,t,a){return node(e,t,a,Hr,Xr(char()),substr(e,2,-2),0)}function declaration(e,t,a,n){return node(e,t,a,Vr,substr(e,0,n),substr(e,n+1,-1),n)}function serialize(e,t){for(var a="",n=sizeof(e),s=0;s<n;s++)a+=t(e[s],s,e,t)||"";return a}function stringify(e,t,a,n){switch(e.type){case Wr:if(e.children.length)break;case Yr:case Vr:return e.return=e.return||e.value;case Hr:return"";case Qr:return e.return=e.value+"{"+serialize(e.children,n)+"}";case Ur:e.value=e.props.join(",")}return strlen(a=serialize(e.children,n))?e.return=e.value+"{"+a+"}":""}function middleware(e){var t=sizeof(e);return function(a,n,s,i){for(var o="",l=0;l<t;l++)o+=e[l](a,n,s,i)||"";return o}}function rulesheet(e){return function(t){t.root||(t=t.return)&&e(t)}}function memoize(e){var t=Object.create(null);return function(a){return void 0===t[a]&&(t[a]=e(a)),t[a]}}var sa=function identifierWithPointTracking(e,t,a){for(var n=0,s=0;n=s,s=peek(),38===n&&12===s&&(t[a]=1),!token(s);)next();return slice(e,ra)},ia=function toRules(e,t){var a=-1,n=44;do{switch(token(n)){case 0:38===n&&12===peek()&&(t[a]=1),e[a]+=sa(ra-1,t,a);break;case 2:e[a]+=delimit(n);break;case 4:if(44===n){e[++a]=58===peek()?"&\f":"",t[a]=e[a].length;break}default:e[a]+=Xr(n)}}while(n=next());return e},oa=function getRules(e,t){return dealloc(ia(alloc(e),t))},la=new WeakMap,ca=function compat(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,a=e.parent,n=e.column===a.column&&e.line===a.line;"rule"!==a.type;)if(!(a=a.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||la.get(a))&&!n){la.set(e,!0);for(var s=[],i=oa(t,s),o=a.props,l=0,c=0;l<i.length;l++)for(var u=0;u<o.length;u++,c++)e.props[c]=s[l]?i[l].replace(/&\f/g,o[u]):o[u]+" "+i[l]}}},ua=function removeLabel(e){if("decl"===e.type){var t=e.value;108===t.charCodeAt(0)&&98===t.charCodeAt(2)&&(e.return="",e.value="")}};function prefix(e,t){switch(hash(e,t)){case 5103:return Gr+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Gr+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Gr+e+zr+e+Fr+e+e;case 6828:case 4268:return Gr+e+Fr+e+e;case 6165:return Gr+e+Fr+"flex-"+e+e;case 5187:return Gr+e+replace(e,/(\w+).+(:[^]+)/,Gr+"box-$1$2"+Fr+"flex-$1$2")+e;case 5443:return Gr+e+Fr+"flex-item-"+replace(e,/flex-|-self/,"")+e;case 4675:return Gr+e+Fr+"flex-line-pack"+replace(e,/align-content|flex-|-self/,"")+e;case 5548:return Gr+e+Fr+replace(e,"shrink","negative")+e;case 5292:return Gr+e+Fr+replace(e,"basis","preferred-size")+e;case 6060:return Gr+"box-"+replace(e,"-grow","")+Gr+e+Fr+replace(e,"grow","positive")+e;case 4554:return Gr+replace(e,/([^-])(transform)/g,"$1"+Gr+"$2")+e;case 6187:return replace(replace(replace(e,/(zoom-|grab)/,Gr+"$1"),/(image-set)/,Gr+"$1"),e,"")+e;case 5495:case 3959:return replace(e,/(image-set\([^]*)/,Gr+"$1$`$1");case 4968:return replace(replace(e,/(.+:)(flex-)?(.*)/,Gr+"box-pack:$3"+Fr+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Gr+e+e;case 4095:case 3583:case 4068:case 2532:return replace(e,/(.+)-inline(.+)/,Gr+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(strlen(e)-1-t>6)switch(charat(e,t+1)){case 109:if(45!==charat(e,t+4))break;case 102:return replace(e,/(.+:)(.+)-([^]+)/,"$1"+Gr+"$2-$3$1"+zr+(108==charat(e,t+3)?"$3":"$2-$3"))+e;case 115:return~indexof(e,"stretch")?prefix(replace(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==charat(e,t+1))break;case 6444:switch(charat(e,strlen(e)-3-(~indexof(e,"!important")&&10))){case 107:return replace(e,":",":"+Gr)+e;case 101:return replace(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+Gr+(45===charat(e,14)?"inline-":"")+"box$3$1"+Gr+"$2$3$1"+Fr+"$2box$3")+e}break;case 5936:switch(charat(e,t+11)){case 114:return Gr+e+Fr+replace(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Gr+e+Fr+replace(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Gr+e+Fr+replace(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return Gr+e+Fr+e+e}return e}var da=[function prefixer(e,t,a,n){if(e.length>-1&&!e.return)switch(e.type){case Vr:e.return=prefix(e.value,e.length);break;case Qr:return serialize([copy(e,{value:replace(e.value,"@","@"+Gr)})],n);case Ur:if(e.length)return combine(e.props,function(t){switch(match(t,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return serialize([copy(e,{props:[replace(t,/:(read-\w+)/,":"+zr+"$1")]})],n);case"::placeholder":return serialize([copy(e,{props:[replace(t,/:(plac\w+)/,":"+Gr+"input-$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,":"+zr+"$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,Fr+"input-$1")]})],n)}return""})}}],ma=function createCache(e){var t=e.key;if("css"===t){var a=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(a,function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))})}var n,s,i=e.stylisPlugins||da,o={},l=[];n=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),function(e){for(var t=e.getAttribute("data-emotion").split(" "),a=1;a<t.length;a++)o[t[a]]=!0;l.push(e)});var c,u=[ca,ua],d=[stringify,rulesheet(function(e){c.insert(e)})],m=middleware(u.concat(i,d)),p=function stylis(e){return serialize(compile(e),m)};s=function insert(e,t,a,n){c=a,p(e?e+"{"+t.styles+"}":t.styles),n&&(g.inserted[t.name]=!0)};var g={key:t,sheet:new $r({key:t,container:n,nonce:e.nonce,speedy:e.speedy,prepend:e.prepend,insertionPoint:e.insertionPoint}),nonce:e.nonce,inserted:o,registered:{},insert:s};return g.sheet.hydrate(l),g},pa=!0;function getRegisteredStyles(e,t,a){var n="";return a.split(" ").forEach(function(a){void 0!==e[a]?t.push(e[a]+";"):a&&(n+=a+" ")}),n}var ga=function registerStyles(e,t,a){var n=e.key+"-"+t.name;!1!==a&&!1!==pa||void 0!==e.registered[n]||(e.registered[n]=t.styles)},fa=function insertStyles(e,t,a){ga(e,t,a);var n=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var s=t;do{e.insert(t===s?"."+n:"",s,e.sheet,!0),s=s.next}while(void 0!==s)}};function murmur2(e){for(var t,a=0,n=0,s=e.length;s>=4;++n,s-=4)t=1540483477*(65535&(t=255&e.charCodeAt(n)|(255&e.charCodeAt(++n))<<8|(255&e.charCodeAt(++n))<<16|(255&e.charCodeAt(++n))<<24))+(59797*(t>>>16)<<16),a=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&a)+(59797*(a>>>16)<<16);switch(s){case 3:a^=(255&e.charCodeAt(n+2))<<16;case 2:a^=(255&e.charCodeAt(n+1))<<8;case 1:a=1540483477*(65535&(a^=255&e.charCodeAt(n)))+(59797*(a>>>16)<<16)}return(((a=1540483477*(65535&(a^=a>>>13))+(59797*(a>>>16)<<16))^a>>>15)>>>0).toString(36)}var ha={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,scale:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},ba=!1,ya=/[A-Z]|^ms/g,va=/_EMO_([^_]+?)_([^]*?)_EMO_/g,Sa=function isCustomProperty(e){return 45===e.charCodeAt(1)},xa=function isProcessableValue(e){return null!=e&&"boolean"!=typeof e},Ca=memoize(function(e){return Sa(e)?e:e.replace(ya,"-$&").toLowerCase()}),ka=function processStyleValue(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(va,function(e,t,a){return Ea={name:t,styles:a,next:Ea},t})}return 1===ha[e]||Sa(e)||"number"!=typeof t||0===t?t:t+"px"},Aa="Component selectors can only be used in conjunction with @emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware compiler transform.";function handleInterpolation(e,t,a){if(null==a)return"";var n=a;if(void 0!==n.__emotion_styles)return n;switch(typeof a){case"boolean":return"";case"object":var s=a;if(1===s.anim)return Ea={name:s.name,styles:s.styles,next:Ea},s.name;var i=a;if(void 0!==i.styles){var o=i.next;if(void 0!==o)for(;void 0!==o;)Ea={name:o.name,styles:o.styles,next:Ea},o=o.next;return i.styles+";"}return createStringFromObject(e,t,a);case"function":if(void 0!==e){var l=Ea,c=a(e);return Ea=l,handleInterpolation(e,t,c)}}var u=a;if(null==t)return u;var d=t[u];return void 0!==d?d:u}function createStringFromObject(e,t,a){var n="";if(Array.isArray(a))for(var s=0;s<a.length;s++)n+=handleInterpolation(e,t,a[s])+";";else for(var i in a){var o=a[i];if("object"!=typeof o){var l=o;null!=t&&void 0!==t[l]?n+=i+"{"+t[l]+"}":xa(l)&&(n+=Ca(i)+":"+ka(i,l)+";")}else{if("NO_COMPONENT_SELECTOR"===i&&ba)throw new Error(Aa);if(!Array.isArray(o)||"string"!=typeof o[0]||null!=t&&void 0!==t[o[0]]){var c=handleInterpolation(e,t,o);switch(i){case"animation":case"animationName":n+=Ca(i)+":"+c+";";break;default:n+=i+"{"+c+"}"}}else for(var u=0;u<o.length;u++)xa(o[u])&&(n+=Ca(i)+":"+ka(i,o[u])+";")}}return n}var Ea,_a=/label:\s*([^\s;{]+)\s*(;|$)/g;function serializeStyles(e,t,a){if(1===e.length&&"object"==typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var n=!0,s="";Ea=void 0;var i=e[0];null==i||void 0===i.raw?(n=!1,s+=handleInterpolation(a,t,i)):s+=i[0];for(var o=1;o<e.length;o++)s+=handleInterpolation(a,t,e[o]),n&&(s+=i[o]);_a.lastIndex=0;for(var l,c="";null!==(l=_a.exec(s));)c+="-"+l[1];return{name:murmur2(s)+c,styles:s,next:Ea}}var wa=function syncFallback(e){return e()},Ta=!!a.useInsertionEffect&&a.useInsertionEffect,Pa=Ta||wa,Ma=(Ta||a.useLayoutEffect,a.createContext("undefined"!=typeof HTMLElement?ma({key:"css"}):null)),Da=(Ma.Provider,function withEmotionCache(e){return(0,a.forwardRef)(function(t,n){return e(t,(0,a.useContext)(Ma),n)})}),Ra=a.createContext({}),Oa=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,Na=!1,La=memoize(function(e){return Oa.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91}),Ia=function testOmitPropsOnComponent(e){return"theme"!==e},ja=function getDefaultShouldForwardProp(e){return"string"==typeof e&&e.charCodeAt(0)>96?La:Ia},qa=function composeShouldForwardProps(e,t,a){var n;if(t){var s=t.shouldForwardProp;n=e.__emotion_forwardProp&&s?function(t){return e.__emotion_forwardProp(t)&&s(t)}:s}return"function"!=typeof n&&a&&(n=e.__emotion_forwardProp),n},Ba=function Insertion(e){var t=e.cache,a=e.serialized,n=e.isStringTag;return ga(t,a,n),Pa(function(){return fa(t,a,n)}),null},$a=function createStyled(e,t){var n,s,i=e.__emotion_real===e,o=i&&e.__emotion_base||e;void 0!==t&&(n=t.label,s=t.target);var l=qa(e,t,i),c=l||ja(o),u=!c("as");return function(){var d=arguments,m=i&&void 0!==e.__emotion_styles?e.__emotion_styles.slice(0):[];if(void 0!==n&&m.push("label:"+n+";"),null==d[0]||void 0===d[0].raw)m.push.apply(m,d);else{var p=d[0];m.push(p[0]);for(var g=d.length,h=1;h<g;h++)m.push(d[h],p[h])}var b=Da(function(e,t,n){var i=u&&e.as||o,d="",p=[],g=e;if(null==e.theme){for(var h in g={},e)g[h]=e[h];g.theme=a.useContext(Ra)}"string"==typeof e.className?d=getRegisteredStyles(t.registered,p,e.className):null!=e.className&&(d=e.className+" ");var b=serializeStyles(m.concat(p),t.registered,g);d+=t.key+"-"+b.name,void 0!==s&&(d+=" "+s);var y=u&&void 0===l?ja(i):c,v={};for(var S in e)u&&"as"===S||y(S)&&(v[S]=e[S]);return v.className=d,n&&(v.ref=n),a.createElement(a.Fragment,null,a.createElement(Ba,{cache:t,serialized:b,isStringTag:"string"==typeof i}),a.createElement(i,v))});return b.displayName=void 0!==n?n:"Styled("+("string"==typeof o?o:o.displayName||o.name||"Component")+")",b.defaultProps=e.defaultProps,b.__emotion_real=b,b.__emotion_base=o,b.__emotion_styles=m,b.__emotion_forwardProp=l,Object.defineProperty(b,"toString",{value:function value(){return void 0===s&&Na?"NO_COMPONENT_SELECTOR":"."+s}}),b.withComponent=function(e,a){return createStyled(e,_extends({},t,a,{shouldForwardProp:qa(b,a,!0)})).apply(void 0,m)},b}},Fa=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],za=$a.bind(null);function styled$1(e,t){return za(e,t)}function internal_mutateStyles(e,t){Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))}Fa.forEach(function(e){za[e]=za(e)});var Ga=[];function internal_serializeStyles(e){return Ga[0]=e,serializeStyles(Ga)}var Ha={borderRadius:4};function createSpacing(e=8,t=createUnarySpacing({spacing:e})){if(e.mui)return e;const spacing=(...e)=>(0===e.length?[1]:e).map(e=>{const a=t(e);return"number"==typeof a?`${a}px`:a}).join(" ");return spacing.mui=!0,spacing}function applyStyles(e,t){const a=this;if(a.vars){if(!a.colorSchemes?.[e]||"function"!=typeof a.getColorSchemeSelector)return{};let n=a.getColorSchemeSelector(e);return"&"===n?t:((n.includes("data-")||n.includes("."))&&(n=`*:where(${n.replace(/\s*&$/,"")}) &`),{[n]:t})}return a.palette.mode===e?t:{}}function createTheme$1(e={},...t){const{breakpoints:a={},palette:n={},spacing:s,shape:i={},...o}=e;let l=deepmerge({breakpoints:createBreakpoints(a),direction:"ltr",components:{},palette:{mode:"light",...n},spacing:createSpacing(s),shape:{...Ha,...i}},o);return l=cssContainerQueries(l),l.applyStyles=applyStyles,l=t.reduce((e,t)=>deepmerge(e,t),l),l.unstable_sxConfig={...Ir,...o?.unstable_sxConfig},l.unstable_sx=function sx(e){return qr({sx:e,theme:this})},l.internal_cache={},l}var defaultGenerator=e=>e,Ua=(()=>{let e=defaultGenerator;return{configure(t){e=t},generate:t=>e(t),reset(){e=defaultGenerator}}})(),Va={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function generateUtilityClass(e,t,a="Mui"){const n=Va[t];return n?`${a}-${n}`:`${Ua.generate(e)}-${t}`}function generateUtilityClasses(e,t,a="Mui"){const n={};return t.forEach(t=>{n[t]=generateUtilityClass(e,t,a)}),n}function preprocessStyles(e){const{variants:t,...a}=e,n={variants:t,style:internal_serializeStyles(a),isProcessed:!0};return n.style===a||t&&t.forEach(e=>{"function"!=typeof e.style&&(e.style=internal_serializeStyles(e.style))}),n}var Ya=createTheme$1();function shouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}function shallowLayer(e,t){return t&&e&&"object"==typeof e&&e.styles&&!e.styles.startsWith("@layer")&&(e.styles=`@layer ${t}{${String(e.styles)}}`),e}function defaultOverridesResolver(e){return e?(t,a)=>a[e]:null}function attachTheme(e,t,a){e.theme=isObjectEmpty(e.theme)?a:e.theme[t]||e.theme}function processStyle(e,t,a){const n="function"==typeof t?t(e):t;if(Array.isArray(n))return n.flatMap(t=>processStyle(e,t,a));if(Array.isArray(n?.variants)){let t;if(n.isProcessed)t=a?shallowLayer(n.style,a):n.style;else{const{variants:e,...s}=n;t=a?shallowLayer(internal_serializeStyles(s),a):s}return processStyleVariants(e,n.variants,[t],a)}return n?.isProcessed?a?shallowLayer(internal_serializeStyles(n.style),a):n.style:a?shallowLayer(internal_serializeStyles(n),a):n}function processStyleVariants(e,t,a=[],n=void 0){let s;e:for(let i=0;i<t.length;i+=1){const o=t[i];if("function"==typeof o.props){if(s??={...e,...e.ownerState,ownerState:e.ownerState},!o.props(s))continue}else for(const t in o.props)if(e[t]!==o.props[t]&&e.ownerState?.[t]!==o.props[t])continue e;"function"==typeof o.style?(s??={...e,...e.ownerState,ownerState:e.ownerState},a.push(n?shallowLayer(internal_serializeStyles(o.style(s)),n):o.style(s))):a.push(n?shallowLayer(internal_serializeStyles(o.style),n):o.style)}return a}function createStyled(e={}){const{themeId:t,defaultTheme:a=Ya,rootShouldForwardProp:n=shouldForwardProp,slotShouldForwardProp:s=shouldForwardProp}=e;function styleAttachTheme(e){attachTheme(e,t,a)}const styled=(e,t={})=>{internal_mutateStyles(e,e=>e.filter(e=>e!==qr));const{name:a,slot:i,skipVariantsResolver:o,skipSx:l,overridesResolver:c=defaultOverridesResolver(lowercaseFirstLetter(i)),...u}=t,d=a&&a.startsWith("Mui")||i?"components":"custom",m=void 0!==o?o:i&&"Root"!==i&&"root"!==i||!1,p=l||!1;let g=shouldForwardProp;"Root"===i||"root"===i?g=n:i?g=s:isStringTag(e)&&(g=void 0);const h=styled$1(e,{shouldForwardProp:g,label:generateStyledLabel(a,i),...u}),transformStyle=e=>{if(e.__emotion_real===e)return e;if("function"==typeof e)return function styleFunctionProcessor(t){return processStyle(t,e,t.theme.modularCssLayers?d:void 0)};if(isPlainObject(e)){const t=preprocessStyles(e);return function styleObjectProcessor(e){return t.variants?processStyle(e,t,e.theme.modularCssLayers?d:void 0):e.theme.modularCssLayers?shallowLayer(t.style,d):t.style}}return e},muiStyledResolver=(...t)=>{const n=[],s=t.map(transformStyle),i=[];if(n.push(styleAttachTheme),a&&c&&i.push(function styleThemeOverrides(e){const t=e.theme.components?.[a]?.styleOverrides;if(!t)return null;const n={};for(const a in t)n[a]=processStyle(e,t[a],e.theme.modularCssLayers?"theme":void 0);return c(e,n)}),a&&!m&&i.push(function styleThemeVariants(e){const t=e.theme?.components?.[a]?.variants;return t?processStyleVariants(e,t,[],e.theme.modularCssLayers?"theme":void 0):null}),p||i.push(qr),Array.isArray(s[0])){const e=s.shift(),t=new Array(n.length).fill(""),a=new Array(i.length).fill("");let o;o=[...t,...e,...a],o.raw=[...t,...e.raw,...a],n.unshift(o)}const o=h(...n,...s,...i);return e.muiName&&(o.muiName=e.muiName),o};return h.withConfig&&(muiStyledResolver.withConfig=h.withConfig),muiStyledResolver};return styled}function generateStyledLabel(e,t){let a;return a}function isStringTag(e){return"string"==typeof e&&e.charCodeAt(0)>96}function lowercaseFirstLetter(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}function resolveProps(e,t,a=!1){const n={...t};for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)){const i=s;if("components"===i||"slots"===i)n[i]={...e[i],...n[i]};else if("componentsProps"===i||"slotProps"===i){const s=e[i],o=t[i];if(o)if(s){n[i]={...o};for(const e in s)if(Object.prototype.hasOwnProperty.call(s,e)){const t=e;n[i][t]=resolveProps(s[t],o[t],a)}}else n[i]=o;else n[i]=s||{}}else"className"===i&&a&&void 0!==t.className?n.className=clsx(e?.className,t?.className):"style"===i&&a&&t.style?n.style={...e?.style,...t?.style}:void 0===n[i]&&(n[i]=e[i])}return n}function clamp(e,t=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(t,Math.min(e,a))}function clampWrapper(e,t=0,a=1){return clamp(e,t,a)}function hexToRgb(e){e=e.slice(1);const t=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let a=e.match(t);return a&&1===a[0].length&&(a=a.map(e=>e+e)),a?`rgb${4===a.length?"a":""}(${a.map((e,t)=>t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3).join(", ")})`:""}function decomposeColor(e){if(e.type)return e;if("#"===e.charAt(0))return decomposeColor(hexToRgb(e));const t=e.indexOf("("),a=e.substring(0,t);if(!["rgb","rgba","hsl","hsla","color"].includes(a))throw new Error(formatMuiErrorMessage(9,e));let n,s=e.substring(t+1,e.length-1);if("color"===a){if(s=s.split(" "),n=s.shift(),4===s.length&&"/"===s[3].charAt(0)&&(s[3]=s[3].slice(1)),!["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].includes(n))throw new Error(formatMuiErrorMessage(10,n))}else s=s.split(",");return s=s.map(e=>parseFloat(e)),{type:a,values:s,colorSpace:n}}var colorChannel=e=>{const t=decomposeColor(e);return t.values.slice(0,3).map((e,a)=>t.type.includes("hsl")&&0!==a?`${e}%`:e).join(" ")},private_safeColorChannel=(e,t)=>{try{return colorChannel(e)}catch(a){return e}};function recomposeColor(e){const{type:t,colorSpace:a}=e;let{values:n}=e;return t.includes("rgb")?n=n.map((e,t)=>t<3?parseInt(e,10):e):t.includes("hsl")&&(n[1]=`${n[1]}%`,n[2]=`${n[2]}%`),n=t.includes("color")?`${a} ${n.join(" ")}`:`${n.join(", ")}`,`${t}(${n})`}function hslToRgb(e){e=decomposeColor(e);const{values:t}=e,a=t[0],n=t[1]/100,s=t[2]/100,i=n*Math.min(s,1-s),f=(e,t=(e+a/30)%12)=>s-i*Math.max(Math.min(t-3,9-t,1),-1);let o="rgb";const l=[Math.round(255*f(0)),Math.round(255*f(8)),Math.round(255*f(4))];return"hsla"===e.type&&(o+="a",l.push(t[3])),recomposeColor({type:o,values:l})}function getLuminance(e){let t="hsl"===(e=decomposeColor(e)).type||"hsla"===e.type?decomposeColor(hslToRgb(e)).values:e.values;return t=t.map(t=>("color"!==e.type&&(t/=255),t<=.03928?t/12.92:((t+.055)/1.055)**2.4)),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function getContrastRatio(e,t){const a=getLuminance(e),n=getLuminance(t);return(Math.max(a,n)+.05)/(Math.min(a,n)+.05)}function alpha(e,t){return e=decomposeColor(e),t=clampWrapper(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),"color"===e.type?e.values[3]=`/${t}`:e.values[3]=t,recomposeColor(e)}function private_safeAlpha(e,t,a){try{return alpha(e,t)}catch(n){return e}}function darken(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]*=1-t;else if(e.type.includes("rgb")||e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]*=1-t;return recomposeColor(e)}function private_safeDarken(e,t,a){try{return darken(e,t)}catch(n){return e}}function lighten(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]+=(100-e.values[2])*t;else if(e.type.includes("rgb"))for(let a=0;a<3;a+=1)e.values[a]+=(255-e.values[a])*t;else if(e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]+=(1-e.values[a])*t;return recomposeColor(e)}function private_safeLighten(e,t,a){try{return lighten(e,t)}catch(n){return e}}function emphasize(e,t=.15){return getLuminance(e)>.5?darken(e,t):lighten(e,t)}function private_safeEmphasize(e,t,a){try{return emphasize(e,t)}catch(n){return e}}var Qa=b.createContext(void 0);function getThemeProps(e){const{theme:t,name:a,props:n}=e;if(!t||!t.components||!t.components[a])return n;const s=t.components[a];return s.defaultProps?resolveProps(s.defaultProps,n,t.components.mergeClassNameAndStyle):s.styleOverrides||s.variants?n:resolveProps(s,n,t.components.mergeClassNameAndStyle)}function useDefaultProps$1({props:e,name:t}){return getThemeProps({props:e,name:t,theme:{components:b.useContext(Qa)}})}var Wa={theme:void 0};function unstable_memoTheme(e){let t,a;return function styleMemoized(n){let s=t;return void 0!==s&&n.theme===a||(Wa.theme=n.theme,s=preprocessStyles(e(Wa)),t=s,a=n.theme),s}}function createGetCssVar$1(e=""){function appendVar(...t){if(!t.length)return"";const a=t[0];return"string"!=typeof a||a.match(/(#|\(|\)|(-?(\d*\.)?\d+)(px|em|%|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc))|^(-?(\d*\.)?\d+)$|(\d+ \d+ \d+)/)?`, ${a}`:`, var(--${e?`${e}-`:""}${a}${appendVar(...t.slice(1))})`}return(t,...a)=>`var(--${e?`${e}-`:""}${t}${appendVar(...a)})`}var assignNestedKeys=(e,t,a,n=[])=>{let s=e;t.forEach((e,i)=>{i===t.length-1?Array.isArray(s)?s[Number(e)]=a:s&&"object"==typeof s&&(s[e]=a):s&&"object"==typeof s&&(s[e]||(s[e]=n.includes(e)?[]:{}),s=s[e])})},walkObjectDeep=(e,t,a)=>{function recurse(e,n=[],s=[]){Object.entries(e).forEach(([e,i])=>{(!a||a&&!a([...n,e]))&&null!=i&&("object"==typeof i&&Object.keys(i).length>0?recurse(i,[...n,e],Array.isArray(i)?[...s,e]:s):t([...n,e],i,s))})}recurse(e)},getCssValue=(e,t)=>"number"==typeof t?["lineHeight","fontWeight","opacity","zIndex"].some(t=>e.includes(t))||e[e.length-1].toLowerCase().includes("opacity")?t:`${t}px`:t;function cssVarsParser(e,t){const{prefix:a,shouldSkipGeneratingVar:n}=t||{},s={},i={},o={};return walkObjectDeep(e,(e,t,l)=>{if(!("string"!=typeof t&&"number"!=typeof t||n&&n(e,t))){const n=`--${a?`${a}-`:""}${e.join("-")}`,c=getCssValue(e,t);Object.assign(s,{[n]:c}),assignNestedKeys(i,e,`var(${n})`,l),assignNestedKeys(o,e,`var(${n}, ${c})`,l)}},e=>"vars"===e[0]),{css:s,vars:i,varsWithDefaults:o}}function prepareCssVars(e,t={}){const{getSelector:a=defaultGetSelector,disableCssColorScheme:n,colorSchemeSelector:s,enableContrastVars:i}=t,{colorSchemes:o={},components:l,defaultColorScheme:c="light",...u}=e,{vars:d,css:m,varsWithDefaults:p}=cssVarsParser(u,t);let g=p;const h={},{[c]:b,...y}=o;if(Object.entries(y||{}).forEach(([e,a])=>{const{vars:n,css:s,varsWithDefaults:i}=cssVarsParser(a,t);g=deepmerge(g,i),h[e]={css:s,vars:n}}),b){const{css:e,vars:a,varsWithDefaults:n}=cssVarsParser(b,t);g=deepmerge(g,n),h[c]={css:e,vars:a}}function defaultGetSelector(t,a){let n=s;if("class"===s&&(n=".%s"),"data"===s&&(n="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(n=`[${s}="%s"]`),t){if("media"===n)return e.defaultColorScheme===t?":root":{[`@media (prefers-color-scheme: ${o[t]?.palette?.mode||t})`]:{":root":a}};if(n)return e.defaultColorScheme===t?`:root, ${n.replace("%s",String(t))}`:n.replace("%s",String(t))}return":root"}return{vars:g,generateThemeVars:()=>{let e={...d};return Object.entries(h).forEach(([,{vars:t}])=>{e=deepmerge(e,t)}),e},generateStyleSheets:()=>{const t=[],s=e.defaultColorScheme||"light";function insertStyleSheet(e,a){Object.keys(a).length&&t.push("string"==typeof e?{[e]:{...a}}:e)}insertStyleSheet(a(void 0,{...m}),m);const{[s]:l,...c}=h;if(l){const{css:e}=l,t=o[s]?.palette?.mode,i=!n&&t?{colorScheme:t,...e}:{...e};insertStyleSheet(a(s,{...i}),i)}return Object.entries(c).forEach(([e,{css:t}])=>{const s=o[e]?.palette?.mode,i=!n&&s?{colorScheme:s,...t}:{...t};insertStyleSheet(a(e,{...i}),i)}),i&&t.push({":root":{"--__l-threshold":"0.7","--__l":"clamp(0, (l / var(--__l-threshold) - 1) * -infinity, 1)","--__a":"clamp(0.87, (l / var(--__l-threshold) - 1) * -infinity, 1)"}}),t}}}function createGetColorSchemeSelector(e){return function getColorSchemeSelector(t){return"media"===e?`@media (prefers-color-scheme: ${t})`:e?e.startsWith("data-")&&!e.includes("%s")?`[${e}="${t}"] &`:"class"===e?`.${t} &`:"data"===e?`[data-${t}] &`:`${e.replace("%s",t)} &`:"&"}}var Ka={black:"#000",white:"#fff"},Xa={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},Ja={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},Za={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},en={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},tn={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},rn={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},an={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"};function getLight(){return{text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:Ka.white,default:Ka.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}}}var nn=getLight();function getDark(){return{text:{primary:Ka.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:Ka.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}}}var sn=getDark();function addLightOrDark(e,t,a,n){const s=n.light||n,i=n.dark||1.5*n;e[t]||(e.hasOwnProperty(a)?e[t]=e[a]:"light"===t?e.light=lighten(e.main,s):"dark"===t&&(e.dark=darken(e.main,i)))}function mixLightOrDark(e,t,a,n,s){const i=s.light||s,o=s.dark||1.5*s;t[a]||(t.hasOwnProperty(n)?t[a]=t[n]:"light"===a?t.light=`color-mix(in ${e}, ${t.main}, #fff ${(100*i).toFixed(0)}%)`:"dark"===a&&(t.dark=`color-mix(in ${e}, ${t.main}, #000 ${(100*o).toFixed(0)}%)`))}function getDefaultPrimary(e="light"){return"dark"===e?{main:tn[200],light:tn[50],dark:tn[400]}:{main:tn[700],light:tn[400],dark:tn[800]}}function getDefaultSecondary(e="light"){return"dark"===e?{main:Ja[200],light:Ja[50],dark:Ja[400]}:{main:Ja[500],light:Ja[300],dark:Ja[700]}}function getDefaultError(e="light"){return"dark"===e?{main:Za[500],light:Za[300],dark:Za[700]}:{main:Za[700],light:Za[400],dark:Za[800]}}function getDefaultInfo(e="light"){return"dark"===e?{main:rn[400],light:rn[300],dark:rn[700]}:{main:rn[700],light:rn[500],dark:rn[900]}}function getDefaultSuccess(e="light"){return"dark"===e?{main:an[400],light:an[300],dark:an[700]}:{main:an[800],light:an[500],dark:an[900]}}function getDefaultWarning(e="light"){return"dark"===e?{main:en[400],light:en[300],dark:en[700]}:{main:"#ed6c02",light:en[500],dark:en[900]}}function contrastColor(e){return`oklch(from ${e} var(--__l) 0 h / var(--__a))`}function createPalette(e){const{mode:t="light",contrastThreshold:a=3,tonalOffset:n=.2,colorSpace:s,...i}=e,o=e.primary||getDefaultPrimary(t),l=e.secondary||getDefaultSecondary(t),c=e.error||getDefaultError(t),u=e.info||getDefaultInfo(t),d=e.success||getDefaultSuccess(t),m=e.warning||getDefaultWarning(t);function getContrastText(e){return s?contrastColor(e):getContrastRatio(e,sn.text.primary)>=a?sn.text.primary:nn.text.primary}const augmentColor=({color:e,name:t,mainShade:a=500,lightShade:i=300,darkShade:o=700})=>{if(!(e={...e}).main&&e[a]&&(e.main=e[a]),!e.hasOwnProperty("main"))throw new Error(formatMuiErrorMessage(11,t?` (${t})`:"",a));if("string"!=typeof e.main)throw new Error(formatMuiErrorMessage(12,t?` (${t})`:"",JSON.stringify(e.main)));return s?(mixLightOrDark(s,e,"light",i,n),mixLightOrDark(s,e,"dark",o,n)):(addLightOrDark(e,"light",i,n),addLightOrDark(e,"dark",o,n)),e.contrastText||(e.contrastText=getContrastText(e.main)),e};let p;return"light"===t?p=getLight():"dark"===t&&(p=getDark()),deepmerge({common:{...Ka},mode:t,primary:augmentColor({color:o,name:"primary"}),secondary:augmentColor({color:l,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:augmentColor({color:c,name:"error"}),warning:augmentColor({color:m,name:"warning"}),info:augmentColor({color:u,name:"info"}),success:augmentColor({color:d,name:"success"}),grey:Xa,contrastThreshold:a,getContrastText,augmentColor,tonalOffset:n,...p},i)}function prepareTypographyVars(e){const t={};return Object.entries(e).forEach(e=>{const[a,n]=e;"object"==typeof n&&(t[a]=`${n.fontStyle?`${n.fontStyle} `:""}${n.fontVariant?`${n.fontVariant} `:""}${n.fontWeight?`${n.fontWeight} `:""}${n.fontStretch?`${n.fontStretch} `:""}${n.fontSize||""}${n.lineHeight?`/${n.lineHeight} `:""}${n.fontFamily||""}`)}),t}function createMixins(e,t){return{toolbar:{minHeight:56,[e.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[e.up("sm")]:{minHeight:64}},...t}}function round(e){return Math.round(1e5*e)/1e5}var ln={textTransform:"uppercase"},cn='"Roboto", "Helvetica", "Arial", sans-serif';function createTypography(e,t){const{fontFamily:a=cn,fontSize:n=14,fontWeightLight:s=300,fontWeightRegular:i=400,fontWeightMedium:o=500,fontWeightBold:l=700,htmlFontSize:c=16,allVariants:u,pxToRem:d,...m}="function"==typeof t?t(e):t,p=n/14,g=d||(e=>e/c*p+"rem"),buildVariant=(e,t,n,s,i)=>({fontFamily:a,fontWeight:e,fontSize:g(t),lineHeight:n,...a===cn?{letterSpacing:`${round(s/t)}em`}:{},...i,...u});return deepmerge({htmlFontSize:c,pxToRem:g,fontFamily:a,fontSize:n,fontWeightLight:s,fontWeightRegular:i,fontWeightMedium:o,fontWeightBold:l,h1:buildVariant(s,96,1.167,-1.5),h2:buildVariant(s,60,1.2,-.5),h3:buildVariant(i,48,1.167,0),h4:buildVariant(i,34,1.235,.25),h5:buildVariant(i,24,1.334,0),h6:buildVariant(o,20,1.6,.15),subtitle1:buildVariant(i,16,1.75,.15),subtitle2:buildVariant(o,14,1.57,.1),body1:buildVariant(i,16,1.5,.15),body2:buildVariant(i,14,1.43,.15),button:buildVariant(o,14,1.75,.4,ln),caption:buildVariant(i,12,1.66,.4),overline:buildVariant(i,12,2.66,1,ln),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}},m,{clone:!1})}var un=.2,dn=.14,mn=.12;function createShadow(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${un})`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${dn})`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${mn})`].join(",")}var pn=["none",createShadow(0,2,1,-1,0,1,1,0,0,1,3,0),createShadow(0,3,1,-2,0,2,2,0,0,1,5,0),createShadow(0,3,3,-2,0,3,4,0,0,1,8,0),createShadow(0,2,4,-1,0,4,5,0,0,1,10,0),createShadow(0,3,5,-1,0,5,8,0,0,1,14,0),createShadow(0,3,5,-1,0,6,10,0,0,1,18,0),createShadow(0,4,5,-2,0,7,10,1,0,2,16,1),createShadow(0,5,5,-3,0,8,10,1,0,3,14,2),createShadow(0,5,6,-3,0,9,12,1,0,3,16,2),createShadow(0,6,6,-3,0,10,14,1,0,4,18,3),createShadow(0,6,7,-4,0,11,15,1,0,4,20,3),createShadow(0,7,8,-4,0,12,17,2,0,5,22,4),createShadow(0,7,8,-4,0,13,19,2,0,5,24,4),createShadow(0,7,9,-4,0,14,21,2,0,5,26,4),createShadow(0,8,9,-5,0,15,22,2,0,6,28,5),createShadow(0,8,10,-5,0,16,24,2,0,6,30,5),createShadow(0,8,11,-5,0,17,26,2,0,6,32,5),createShadow(0,9,11,-5,0,18,28,2,0,7,34,6),createShadow(0,9,12,-6,0,19,29,2,0,7,36,6),createShadow(0,10,13,-6,0,20,31,3,0,8,38,7),createShadow(0,10,13,-6,0,21,33,3,0,8,40,7),createShadow(0,10,14,-6,0,22,35,3,0,8,42,7),createShadow(0,11,14,-7,0,23,36,3,0,9,44,8),createShadow(0,11,15,-7,0,24,38,3,0,9,46,8)],gn={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},hn={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function formatMs(e){return`${Math.round(e)}ms`}function getAutoHeightDuration(e){if(!e)return 0;const t=e/36;return Math.min(Math.round(10*(4+15*t**.25+t/5)),3e3)}function createTransitions(e){const t={...gn,...e.easing},a={...hn,...e.duration};return{getAutoHeightDuration,create:(e=["all"],n={})=>{const{duration:s=a.standard,easing:i=t.easeInOut,delay:o=0,...l}=n;return(Array.isArray(e)?e:[e]).map(e=>`${e} ${"string"==typeof s?s:formatMs(s)} ${i} ${"string"==typeof o?o:formatMs(o)}`).join(",")},...e,easing:t,duration:a}}var bn={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500};function isSerializable(e){return isPlainObject(e)||void 0===e||"string"==typeof e||"boolean"==typeof e||"number"==typeof e||Array.isArray(e)}function stringifyTheme(e={}){const t={...e};function serializeTheme(e){const t=Object.entries(e);for(let a=0;a<t.length;a++){const[n,s]=t[a];!isSerializable(s)||n.startsWith("unstable_")||n.startsWith("internal_")?delete e[n]:isPlainObject(s)&&(e[n]={...s},serializeTheme(e[n]))}}return serializeTheme(t),`import { unstable_createBreakpoints as createBreakpoints, createTransitions } from '@mui/material/styles';\n\nconst theme = ${JSON.stringify(t,null,2)};\n\ntheme.breakpoints = createBreakpoints(theme.breakpoints || {});\ntheme.transitions = createTransitions(theme.transitions || {});\n\nexport default theme;`}function coefficientToPercentage(e){return"number"==typeof e?`${(100*e).toFixed(0)}%`:`calc((${e}) * 100%)`}var parseAddition=e=>{if(!Number.isNaN(+e))return+e;const t=e.match(/\d*\.?\d+/g);if(!t)return 0;let a=0;for(let n=0;n<t.length;n+=1)a+=+t[n];return a};function attachColorManipulators(e){Object.assign(e,{alpha(t,a){const n=this||e;return n.colorSpace?`oklch(from ${t} l c h / ${"string"==typeof a?`calc(${a})`:a})`:n.vars?`rgba(${t.replace(/var\(--([^,\s)]+)(?:,[^)]+)?\)+/g,"var(--$1Channel)")} / ${"string"==typeof a?`calc(${a})`:a})`:alpha(t,parseAddition(a))},lighten(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #fff ${coefficientToPercentage(a)})`:lighten(t,a)},darken(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #000 ${coefficientToPercentage(a)})`:darken(t,a)}})}function createThemeNoVars(e={},...t){const{breakpoints:a,mixins:n={},spacing:s,palette:i={},transitions:o={},typography:l={},shape:c,colorSpace:u,...d}=e;if(e.vars&&void 0===e.generateThemeVars)throw new Error(formatMuiErrorMessage(22));const m=createPalette({...i,colorSpace:u}),p=createTheme$1(e);let g=deepmerge(p,{mixins:createMixins(p.breakpoints,n),palette:m,shadows:pn.slice(),typography:createTypography(m,l),transitions:createTransitions(o),zIndex:{...bn}});return g=deepmerge(g,d),g=t.reduce((e,t)=>deepmerge(e,t),g),g.unstable_sxConfig={...Ir,...d?.unstable_sxConfig},g.unstable_sx=function sx(e){return qr({sx:e,theme:this})},g.toRuntimeSource=stringifyTheme,attachColorManipulators(g),g}function getOverlayAlpha(e){let t;return t=e<1?5.11916*e**2:4.5*Math.log(e+1)+2,Math.round(10*t)/1e3}var yn=[...Array(25)].map((e,t)=>{if(0===t)return"none";const a=getOverlayAlpha(t);return`linear-gradient(rgba(255 255 255 / ${a}), rgba(255 255 255 / ${a}))`});function getOpacity(e){return{inputPlaceholder:"dark"===e?.5:.42,inputUnderline:"dark"===e?.7:.42,switchTrackDisabled:"dark"===e?.2:.12,switchTrack:"dark"===e?.3:.38}}function getOverlays(e){return"dark"===e?yn:[]}function createColorScheme(e){const{palette:t={mode:"light"},opacity:a,overlays:n,colorSpace:s,...i}=e,o=createPalette({...t,colorSpace:s});return{palette:o,opacity:{...getOpacity(o.mode),...a},overlays:n||getOverlays(o.mode),...i}}function shouldSkipGeneratingVar(e){return!!e[0].match(/(cssVarPrefix|colorSchemeSelector|modularCssLayers|rootSelector|typography|mixins|breakpoints|direction|transitions)/)||!!e[0].match(/sxConfig$/)||"palette"===e[0]&&!!e[1]?.match(/(mode|contrastThreshold|tonalOffset)/)}var excludeVariablesFromRoot=e=>[...[...Array(25)].map((t,a)=>`--${e?`${e}-`:""}overlays-${a}`),`--${e?`${e}-`:""}palette-AppBar-darkBg`,`--${e?`${e}-`:""}palette-AppBar-darkColor`],createGetSelector_default=e=>(t,a)=>{const n=e.rootSelector||":root",s=e.colorSchemeSelector;let i=s;if("class"===s&&(i=".%s"),"data"===s&&(i="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(i=`[${s}="%s"]`),e.defaultColorScheme===t){if("dark"===t){const s={};return excludeVariablesFromRoot(e.cssVarPrefix).forEach(e=>{s[e]=a[e],delete a[e]}),"media"===i?{[n]:a,"@media (prefers-color-scheme: dark)":{[n]:s}}:i?{[i.replace("%s",t)]:s,[`${n}, ${i.replace("%s",t)}`]:a}:{[n]:{...a,...s}}}if(i&&"media"!==i)return`${n}, ${i.replace("%s",String(t))}`}else if(t){if("media"===i)return{[`@media (prefers-color-scheme: ${String(t)})`]:{[n]:a}};if(i)return i.replace("%s",String(t))}return n};function assignNode(e,t){t.forEach(t=>{e[t]||(e[t]={})})}function setColor(e,t,a){!e[t]&&a&&(e[t]=a)}function toRgb(e){return"string"==typeof e&&e.startsWith("hsl")?hslToRgb(e):e}function setColorChannel(e,t){`${t}Channel`in e||(e[`${t}Channel`]=private_safeColorChannel(toRgb(e[t]),`MUI: Can't create \`palette.${t}Channel\` because \`palette.${t}\` is not one of these formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().\nTo suppress this warning, you need to explicitly provide the \`palette.${t}Channel\` as a string (in rgb format, for example "12 12 12") or undefined if you want to remove the channel token.`))}function getSpacingVal(e){return"number"==typeof e?`${e}px`:"string"==typeof e||"function"==typeof e||Array.isArray(e)?e:"8px"}var silent=e=>{try{return e()}catch(t){}},createGetCssVar=(e="mui")=>createGetCssVar$1(e);function attachColorScheme$1(e,t,a,n,s){if(!a)return;a=!0===a?{}:a;const i="dark"===s?"dark":"light";if(!n)return void(t[s]=createColorScheme({...a,palette:{mode:i,...a?.palette},colorSpace:e}));const{palette:o,...l}=createThemeNoVars({...n,palette:{mode:i,...a?.palette},colorSpace:e});return t[s]={...a,palette:o,opacity:{...getOpacity(i),...a?.opacity},overlays:a?.overlays||getOverlays(i)},l}function createThemeWithVars(e={},...t){const{colorSchemes:a={light:!0},defaultColorScheme:n,disableCssColorScheme:s=!1,cssVarPrefix:i="mui",nativeColor:o=!1,shouldSkipGeneratingVar:l=shouldSkipGeneratingVar,colorSchemeSelector:c=(a.light&&a.dark?"media":void 0),rootSelector:u=":root",...d}=e,m=Object.keys(a)[0],p=n||(a.light&&"light"!==m?"light":m),g=createGetCssVar(i),{[p]:h,light:b,dark:y,...v}=a,S={...v};let x,C=h;if(("dark"===p&&!("dark"in a)||"light"===p&&!("light"in a))&&(C=!0),!C)throw new Error(formatMuiErrorMessage(21,p));o&&(x="oklch");const k=attachColorScheme$1(x,S,C,d,p);b&&!S.light&&attachColorScheme$1(x,S,b,void 0,"light"),y&&!S.dark&&attachColorScheme$1(x,S,y,void 0,"dark");let A={defaultColorScheme:p,...k,cssVarPrefix:i,colorSchemeSelector:c,rootSelector:u,getCssVar:g,colorSchemes:S,font:{...prepareTypographyVars(k.typography),...k.font},spacing:getSpacingVal(d.spacing)};Object.keys(A.colorSchemes).forEach(e=>{const t=A.colorSchemes[e].palette,setCssVarColor=e=>{const a=e.split("-"),n=a[1],s=a[2];return g(e,t[n][s])};function colorMix(e,t,a){if(x){let n;return e===private_safeAlpha&&(n=`transparent ${(100*(1-a)).toFixed(0)}%`),e===private_safeDarken&&(n=`#000 ${(100*a).toFixed(0)}%`),e===private_safeLighten&&(n=`#fff ${(100*a).toFixed(0)}%`),`color-mix(in ${x}, ${t}, ${n})`}return e(t,a)}if("light"===t.mode&&(setColor(t.common,"background","#fff"),setColor(t.common,"onBackground","#000")),"dark"===t.mode&&(setColor(t.common,"background","#000"),setColor(t.common,"onBackground","#fff")),assignNode(t,["Alert","AppBar","Avatar","Button","Chip","FilledInput","LinearProgress","Skeleton","Slider","SnackbarContent","SpeedDialAction","StepConnector","StepContent","Switch","TableCell","Tooltip"]),"light"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-main")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-main")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.main))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.main))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.main))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.main))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-100")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-400")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-300")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-A100")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-400")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-700")),setColor(t.FilledInput,"bg","rgba(0, 0, 0, 0.06)"),setColor(t.FilledInput,"hoverBg","rgba(0, 0, 0, 0.09)"),setColor(t.FilledInput,"disabledBg","rgba(0, 0, 0, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.LinearProgress,"successBg",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.main,.62)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.11):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.11)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Slider,"errorTrack",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Slider,"infoTrack",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Slider,"successTrack",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Slider,"warningTrack",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62));const e=x?colorMix(private_safeDarken,o?g("palette-background-default"):t.background.default,.6825):private_safeEmphasize(t.background.default,.8);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?sn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-400")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-400")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-common-white")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-100")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62)),setColor(t.TableCell,"border",colorMix(private_safeLighten,private_safeAlpha(o?g("palette-divider"):t.divider,1),.88)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}if("dark"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-dark")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-dark")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-dark")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-dark")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.dark))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.dark))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.dark))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.dark))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-900")),setColor(t.AppBar,"darkBg",setCssVarColor("palette-background-paper")),setColor(t.AppBar,"darkColor",setCssVarColor("palette-text-primary")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-600")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-800")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-300")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-300")),setColor(t.FilledInput,"bg","rgba(255, 255, 255, 0.09)"),setColor(t.FilledInput,"hoverBg","rgba(255, 255, 255, 0.13)"),setColor(t.FilledInput,"disabledBg","rgba(255, 255, 255, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.LinearProgress,"successBg",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeDarken,o?g("palette-warning-main"):t.warning.main,.5)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.13):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.13)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.Slider,"errorTrack",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.Slider,"infoTrack",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.Slider,"successTrack",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.Slider,"warningTrack",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.5));const e=x?colorMix(private_safeLighten,o?g("palette-background-default"):t.background.default,.985):private_safeEmphasize(t.background.default,.98);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?nn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-600")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-600")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-grey-300")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-600")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.55)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.55)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.55)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.55)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.55)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.55)),setColor(t.TableCell,"border",colorMix(private_safeDarken,private_safeAlpha(o?g("palette-divider"):t.divider,1),.68)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}o||(setColorChannel(t.background,"default"),setColorChannel(t.background,"paper"),setColorChannel(t.common,"background"),setColorChannel(t.common,"onBackground"),setColorChannel(t,"divider")),Object.keys(t).forEach(e=>{const a=t[e];"tonalOffset"!==e&&!o&&a&&"object"==typeof a&&(a.main&&setColor(t[e],"mainChannel",private_safeColorChannel(toRgb(a.main))),a.light&&setColor(t[e],"lightChannel",private_safeColorChannel(toRgb(a.light))),a.dark&&setColor(t[e],"darkChannel",private_safeColorChannel(toRgb(a.dark))),a.contrastText&&setColor(t[e],"contrastTextChannel",private_safeColorChannel(toRgb(a.contrastText))),"text"===e&&(setColorChannel(t[e],"primary"),setColorChannel(t[e],"secondary")),"action"===e&&(a.active&&setColorChannel(t[e],"active"),a.selected&&setColorChannel(t[e],"selected")))})}),A=t.reduce((e,t)=>deepmerge(e,t),A);const E={prefix:i,disableCssColorScheme:s,shouldSkipGeneratingVar:l,getSelector:createGetSelector_default(A),enableContrastVars:o},{vars:_,generateThemeVars:w,generateStyleSheets:T}=prepareCssVars(A,E);return A.vars=_,Object.entries(A.colorSchemes[A.defaultColorScheme]).forEach(([e,t])=>{A[e]=t}),A.generateThemeVars=w,A.generateStyleSheets=T,A.generateSpacing=function generateSpacing(){return createSpacing(d.spacing,createUnarySpacing(this))},A.getColorSchemeSelector=createGetColorSchemeSelector(c),A.spacing=A.generateSpacing(),A.shouldSkipGeneratingVar=l,A.unstable_sxConfig={...Ir,...d?.unstable_sxConfig},A.unstable_sx=function sx(e){return qr({sx:e,theme:this})},A.internal_cache={},A.toRuntimeSource=stringifyTheme,A}function attachColorScheme(e,t,a){e.colorSchemes&&a&&(e.colorSchemes[t]={...!0!==a&&a,palette:createPalette({...!0===a?{}:a.palette,mode:t})})}function createTheme(e={},...t){const{palette:a,cssVariables:n=!1,colorSchemes:s=(a?void 0:{light:!0}),defaultColorScheme:i=a?.mode,...o}=e,l=i||"light",c=s?.[l],u={...s,...a?{[l]:{..."boolean"!=typeof c&&c,palette:a}}:void 0};if(!1===n){if(!("colorSchemes"in e))return createThemeNoVars(e,...t);let n=a;"palette"in e||u[l]&&(!0!==u[l]?n=u[l].palette:"dark"===l&&(n={mode:"dark"}));const s=createThemeNoVars({...e,palette:n},...t);return s.defaultColorScheme=l,s.colorSchemes=u,"light"===s.palette.mode&&(s.colorSchemes.light={...!0!==u.light&&u.light,palette:s.palette},attachColorScheme(s,"dark",u.dark)),"dark"===s.palette.mode&&(s.colorSchemes.dark={...!0!==u.dark&&u.dark,palette:s.palette},attachColorScheme(s,"light",u.light)),s}return a||"light"in u||"light"!==l||(u.light=!0),createThemeWithVars({...o,colorSchemes:u,defaultColorScheme:l,..."boolean"!=typeof n&&n},...t)}function slotShouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}var vn=createStyled({themeId:"$$material",defaultTheme:createTheme(),rootShouldForwardProp:e=>slotShouldForwardProp(e)&&"classes"!==e}),Sn=unstable_memoTheme;function useDefaultProps(e){return useDefaultProps$1(e)}function getSvgIconUtilityClass(e){return generateUtilityClass("MuiSvgIcon",e)}generateUtilityClasses("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);var useUtilityClasses=e=>{const{color:t,fontSize:a,classes:n}=e;return composeClasses({root:["root","inherit"!==t&&`color${rr(t)}`,`fontSize${rr(a)}`]},getSvgIconUtilityClass,n)},xn=vn("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,"inherit"!==a.color&&t[`color${rr(a.color)}`],t[`fontSize${rr(a.fontSize)}`]]}})(Sn(({theme:e})=>({userSelect:"none",width:"1em",height:"1em",display:"inline-block",flexShrink:0,transition:e.transitions?.create?.("fill",{duration:(e.vars??e).transitions?.duration?.shorter}),variants:[{props:e=>!e.hasSvgAsChild,style:{fill:"currentColor"}},{props:{fontSize:"inherit"},style:{fontSize:"inherit"}},{props:{fontSize:"small"},style:{fontSize:e.typography?.pxToRem?.(20)||"1.25rem"}},{props:{fontSize:"medium"},style:{fontSize:e.typography?.pxToRem?.(24)||"1.5rem"}},{props:{fontSize:"large"},style:{fontSize:e.typography?.pxToRem?.(35)||"2.1875rem"}},...Object.entries((e.vars??e).palette).filter(([,e])=>e&&e.main).map(([t])=>({props:{color:t},style:{color:(e.vars??e).palette?.[t]?.main}})),{props:{color:"action"},style:{color:(e.vars??e).palette?.action?.active}},{props:{color:"disabled"},style:{color:(e.vars??e).palette?.action?.disabled}},{props:{color:"inherit"},style:{color:void 0}}]}))),Cn=b.forwardRef(function SvgIcon(e,t){const a=useDefaultProps({props:e,name:"MuiSvgIcon"}),{children:n,className:s,color:i="inherit",component:o="svg",fontSize:l="medium",htmlColor:c,inheritViewBox:u=!1,titleAccess:d,viewBox:m="0 0 24 24",...p}=a,g=b.isValidElement(n)&&"svg"===n.type,h={...a,color:i,component:o,fontSize:l,instanceFontSize:e.fontSize,inheritViewBox:u,viewBox:m,hasSvgAsChild:g},y={};return u||(y.viewBox=m),(0,$t.jsxs)(xn,{as:o,className:clsx(useUtilityClasses(h).root,s),focusable:"false",color:c,"aria-hidden":!d||void 0,role:d?"img":void 0,ref:t,...y,...p,...g&&n.props,ownerState:h,children:[g?n.props.children:n,d?(0,$t.jsx)("title",{children:d}):null]})});function createSvgIcon(e,t){function Component(t,a){return(0,$t.jsx)(Cn,{"data-testid":void 0,ref:a,...t,children:e})}return Component.muiName=Cn.muiName,b.memo(b.forwardRef(Component))}Cn.muiName="SvgIcon";var kn=createSvgIcon((0,$t.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25"}),"HelpOutlined"),An=Object.freeze({}),En=Object.freeze({}),getDefaultClassFilter=(e="")=>{const t=normalizeClassName(e);return Me.includes(t)?t:"all"};function useDefPriorities(e,t={}){const a=useNexSysSnapshot(e)??An,n=a.defs??En,s=a.system?.char?.class??"",{defPriorities:i=En,defStatics:o=En,setDefPriority:l,setDefStatic:c}=t,u=(0,b.useMemo)(()=>getDefaultClassFilter(s),[s]),[d,m]=(0,b.useState)(null),p=d??u,g=(0,b.useMemo)(()=>["all",...Me],[]),h=(0,b.useMemo)(()=>Object.entries(n).reduce((e,[t,a])=>(e[t]={...a,defaultPriority:i[t]??a.defaultPriority,static:o[t]??a.static},e),{}),[n,i,o]),y=(0,b.useMemo)(()=>Object.entries(h).filter(([,e])=>!0===e.serverside),[h]),v=(0,b.useMemo)(()=>"all"===p?y.map(([e])=>e):y.filter(([,e])=>classListIncludes(e.skills,p)).map(([e])=>e),[y,p]),S=(0,b.useCallback)((e,t)=>{c?.(e,t)},[c]),x=(0,b.useCallback)((e,t)=>{l?.(e,t)},[l]);return{defList:v,defsState:h,classFilter:p,setClassFilter:(0,b.useCallback)(e=>{m(e)},[]),classOptions:g,updateStatic:S,updatePriority:x}}function defNameColor(e){const t=e?.bals_used??[],a=e?.bals_req??[],n=["balance","equilibrium"];return t.some(e=>n.includes(e))?"error.main":a.some(e=>n.includes(e))?"warning.main":"success.main"}var _n=(0,$t.jsxs)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:[(0,$t.jsxs)(n.Box,{children:[(0,$t.jsx)(n.Box,{component:"span",sx:{color:"error.main",fontWeight:700},children:"Consumes balance"}),": These skills use eq or bal to activate and should have the lowest priority."]}),(0,$t.jsxs)(n.Box,{children:[(0,$t.jsx)(n.Box,{component:"span",sx:{color:"warning.main",fontWeight:700},children:"Requires balance"}),": These skills are free to use but require eq or bal to activate and should have the middle priority."]}),(0,$t.jsxs)(n.Box,{children:[(0,$t.jsx)(n.Box,{component:"span",sx:{color:"success.main",fontWeight:700},children:"Free action"}),": These skills are free to use and should likely have the highest priority."]})]}),wn=(0,$t.jsx)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:"Checked defences are player-controlled and only raised by the manual defence-up action. Unchecked defences are kept up by server-side curing."}),Tn={py:.25,px:.75,border:"none"},Pn={py:.5,px:.75,border:"none",borderBottom:"1px solid",borderColor:"divider",bgcolor:"background.panel",color:"text.primary",fontWeight:700,fontSize:13,whiteSpace:"nowrap"};function HelpIcon(){return(0,$t.jsx)(kn,{sx:{fontSize:14,verticalAlign:"middle",ml:.25,opacity:.7}})}function DefRow({name:e,def:t,updateStatic:a,updatePriority:s}){const i=defNameColor(t);return(0,$t.jsxs)(n.TableRow,{sx:{"& td":Tn},children:[(0,$t.jsx)(n.TableCell,{padding:"checkbox",sx:{...Tn,width:36},children:(0,$t.jsx)(n.Checkbox,{size:"small",checked:Boolean(t?.static),onChange:t=>a(e,t.target.checked),sx:{p:.25}})}),(0,$t.jsx)(n.TableCell,{sx:{width:100},children:(0,$t.jsx)(n.Typography,{variant:"body2",sx:{color:i,fontSize:13},children:e})}),(0,$t.jsx)(n.TableCell,{sx:{width:50},children:(0,$t.jsx)(n.TextField,{value:t?.defaultPriority??0,onChange:t=>s(e,t.target.value),type:"number",size:"small",sx:{width:56},slotProps:{htmlInput:{min:0,max:26,style:{padding:"2px 6px",fontSize:13}}}})})]})}function DefHalfTable({defNames:e,defsState:t,updateStatic:a,updatePriority:s}){return(0,$t.jsx)(n.TableContainer,{sx:{flex:1},children:(0,$t.jsxs)(n.Table,{size:"small",stickyHeader:!0,sx:{tableLayout:"fixed"},children:[(0,$t.jsx)(n.TableHead,{children:(0,$t.jsxs)(n.TableRow,{children:[(0,$t.jsx)(n.TableCell,{padding:"checkbox",sx:{...Pn,width:36},children:(0,$t.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:wn,children:(0,$t.jsxs)("span",{children:["Defup",(0,$t.jsx)(HelpIcon,{})]})})}),(0,$t.jsx)(n.TableCell,{sx:{...Pn,width:100},children:(0,$t.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:_n,children:(0,$t.jsxs)("span",{children:["Name ",(0,$t.jsx)(HelpIcon,{})]})})}),(0,$t.jsx)(n.TableCell,{sx:{...Pn,width:70},children:"Priority"})]})}),(0,$t.jsx)(n.TableBody,{children:e.map(e=>(0,$t.jsx)(DefRow,{name:e,def:t[e],updateStatic:a,updatePriority:s},e))})]})})}function DefPrioritiesTab({settingsForm:e}){const{defList:t,defsState:a,classFilter:s,setClassFilter:i,classOptions:o,updateStatic:l,updatePriority:c}=useDefPriorities(useNexSys(),e),[u,d]=(0,b.useMemo)(()=>{const e=Math.ceil(t.length/2);return[t.slice(0,e),t.slice(e)]},[t]);return(0,$t.jsxs)(n.Box,{sx:{pt:1},children:[(0,$t.jsxs)(n.FormControl,{size:"small",sx:{mb:1.5,minWidth:180},children:[(0,$t.jsx)(n.InputLabel,{children:"Class"}),(0,$t.jsx)(n.Select,{value:s,label:"Class",onChange:e=>i(e.target.value),children:o.map(e=>(0,$t.jsx)(n.MenuItem,{value:e,children:"all"===e?"All Classes":e},e))})]}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",gap:1,alignItems:"flex-start"},children:[(0,$t.jsx)(DefHalfTable,{defNames:u,defsState:a,updateStatic:l,updatePriority:c}),d.length>0&&(0,$t.jsx)(DefHalfTable,{defNames:d,defsState:a,updateStatic:l,updatePriority:c})]})]})}var Mn=Object.freeze({}),Dn=_.map(e=>T[e]).filter(Boolean).map(e=>({herb:e,mineral:M[e]??null}));function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function usePrecache(e,t={}){const a=useNexSysSnapshot(e),{desiredPrecache:n,setPrecache:s}=t,i=n??a?.cache?.desiredPrecache??Mn;return{pairs:(0,b.useMemo)(()=>Dn.map(({herb:e,mineral:t})=>({herb:e,herbLabel:capitalize(e),herbQty:i[e]??0,mineral:t,mineralLabel:t?capitalize(t):null,mineralQty:t?i[t]??0:0})),[i]),update:(0,b.useCallback)((e,t)=>{s?.(e,Math.max(0,t))},[s])}}function QuantityControl({label:e,value:t,onIncrement:a,onDecrement:s,compact:i=!1}){return(0,$t.jsxs)(n.Box,{sx:{display:"flex",alignItems:"center",gap:1,mb:i?0:.5},children:[(0,$t.jsxs)(n.ButtonGroup,{size:"small",variant:"outlined",children:[(0,$t.jsx)(n.Button,{onClick:s,disabled:t<=0,sx:{minWidth:28,px:.5,fontSize:12},children:"−"}),(0,$t.jsx)(n.Button,{disableRipple:!0,disableFocusRipple:!0,sx:{minWidth:36,px:.5,cursor:"default",pointerEvents:"none",fontSize:12,color:"text.primary",borderColor:"divider"},children:t}),(0,$t.jsx)(n.Button,{onClick:a,sx:{minWidth:28,px:.5,fontSize:12},children:"+"})]}),(0,$t.jsx)(n.Typography,{variant:"body2",children:e})]})}function PairRow({pair:e,update:t}){return(0,$t.jsxs)(n.Box,{sx:{display:"flex",gap:.5},children:[(0,$t.jsx)(n.Box,{sx:{flex:1},children:(0,$t.jsx)(QuantityControl,{compact:!0,label:e.herbLabel,value:e.herbQty,onIncrement:()=>t(e.herb,e.herbQty+1),onDecrement:()=>t(e.herb,e.herbQty-1)})}),(0,$t.jsx)(n.Box,{sx:{flex:1},children:e.mineral?(0,$t.jsx)(QuantityControl,{compact:!0,label:e.mineralLabel,value:e.mineralQty,onIncrement:()=>t(e.mineral,e.mineralQty+1),onDecrement:()=>t(e.mineral,e.mineralQty-1)}):(0,$t.jsx)(n.Box,{sx:{height:28}})})]})}function PrecacheTab({settingsForm:e}){const{pairs:t,update:a}=usePrecache(useNexSys(),e);return(0,$t.jsxs)(n.Box,{sx:{pt:1},children:[(0,$t.jsxs)(n.Box,{sx:{display:"flex",gap:.5,mb:.25},children:[(0,$t.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Herb"}),(0,$t.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Mineral"})]}),t.map(e=>(0,$t.jsx)(PairRow,{pair:e,update:a},e.herb))]})}function ColorSettingsTab(){return(0,$t.jsx)(n.Box,{sx:{pt:2},children:(0,$t.jsx)(n.Typography,{variant:"body2",color:"text.secondary",children:"Color settings are not yet implemented."})})}var Rn=["System","Aff Priorities","Defences","Precache","Colors"];function ConfigTabs({settingsForm:e}){const[t,a]=(0,b.useState)(0),{pending:s,set:i}=e;return(0,$t.jsxs)(n.Box,{sx:{width:"100%"},children:[(0,$t.jsx)(n.Tabs,{value:t,onChange:(e,t)=>a(t),variant:"scrollable",scrollButtons:"auto",sx:{borderBottom:"1px solid",borderColor:"divider",mb:1,"& .MuiTab-root":{fontSize:11,minHeight:36,py:.5}},children:Rn.map(e=>(0,$t.jsx)(n.Tab,{label:e},e))}),(0,$t.jsxs)(n.Box,{sx:{overflowX:"auto",overflowY:"visible"},children:[0===t&&(0,$t.jsx)(SystemSettingsTab,{pending:s,set:i}),1===t&&(0,$t.jsx)(AffPrioritiesTab,{settingsForm:e}),2===t&&(0,$t.jsx)(DefPrioritiesTab,{settingsForm:e}),3===t&&(0,$t.jsx)(PrecacheTab,{settingsForm:e}),4===t&&(0,$t.jsx)(ColorSettingsTab,{})]})]})}function ConfigDialogContent({nexSys:e,onClose:t}){const a=useSettingsForm(e),handleSave=()=>{a.commit(),e?.api?.ui?.closeConfig("ui.save"),t()},handleCancel=()=>{e?.api?.ui?.closeConfig("ui.cancel"),t()};return(0,$t.jsxs)(n.Dialog,{open:!0,onClose:handleCancel,maxWidth:"md",slotProps:{paper:{sx:{width:{xs:"calc(100% - 24px)",md:900},maxWidth:"calc(100% - 24px)",bgcolor:"background.surface",color:"text.primary",backgroundImage:"none",border:"1px solid",borderColor:"divider"}}},children:[(0,$t.jsxs)(n.DialogTitle,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",bgcolor:"background.surface",color:"text.primary",pb:.5,borderBottom:"1px solid",borderColor:"divider"},children:[(0,$t.jsx)(n.Typography,{component:"span",variant:"h6",sx:{fontSize:14,color:"primary.main",fontWeight:700},children:"nexSys4 Configuration"}),(0,$t.jsx)(n.Typography,{component:"span",variant:"caption",sx:{color:"text.secondary"},children:"v1.0.4"})]}),(0,$t.jsx)(n.DialogContent,{sx:{"&.MuiDialogContent-root":{p:0,overflowY:"auto",overflowX:"hidden"}},children:(0,$t.jsx)(n.Box,{sx:{px:2,pt:2,pb:0},children:(0,$t.jsx)(ConfigTabs,{settingsForm:a})})}),(0,$t.jsxs)(n.DialogActions,{sx:{borderTop:"1px solid",borderColor:"divider",px:2,py:1},children:[(0,$t.jsx)(n.Button,{onClick:handleCancel,size:"small",sx:{fontSize:11},children:"Cancel"}),(0,$t.jsx)(n.Button,{onClick:handleSave,variant:"contained",size:"small",sx:{fontSize:11},children:"Save"})]})]})}function ConfigDialog(){const e=useNexSys(),[t,a]=useDialogOpen(e);return(0,$t.jsx)(s.ThemeProvider,{theme:Vt,children:t?(0,$t.jsx)(ConfigDialogContent,{nexSys:e,onClose:()=>a(!1)}):null})}function NexSysGuiApp({nexSys:e}){return(0,$t.jsx)(NexSysProvider,{nexSys:e,children:(0,$t.jsx)(ConfigDialog,{})})}var bootstrapNexus=(e={})=>{const t=bootstrapNexus$1(e);return t.component=NexSysGuiApp,startupNexus(),t.api.control.updateNxs(),t};e.bootstrapNexus=bootstrapNexus}(globalThis.nexSys=globalThis.nexSys||{},nexRuntime.zod,React,nexRuntime.mui,nexRuntime.muiStyles,nexRuntime.immer,nexRuntime.dndCore,nexRuntime.dndSortable,nexRuntime.dndUtilities);
1
+ !function(e,t,a,n,s,i,o,l,c){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});var u=Object.create,d=Object.defineProperty,m=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,g=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,a,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var s,i=p(t),o=0,l=i.length;o<l;o++)s=i[o],h.call(e,s)||s===a||d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(n=m(t,s))||n.enumerable});return e},__toESM=(e,t,a)=>(a=null!=e?u(g(e)):{},__copyProps(!t&&e&&e.__esModule?a:d(a,"default",{value:e,enumerable:!0}),e));let b=__toESM(a,1);a=__toESM(a);var y=Symbol.for("nexsys4.nexusClientOverrides.installed"),v=Symbol.for("nexsys4.nexusClientOverrides.originals"),S=200,resolveOverrideTargets=e=>({buffer:"function"==typeof e?.buffer?e.buffer():null,platform:"function"==typeof e?.platform?e.platform():null,datahandler:"function"==typeof e?.datahandler?e.datahandler():null}),getActiveNexSys=()=>globalThis.nexSys&&"object"==typeof globalThis.nexSys?globalThis.nexSys:null,getSystemSettings=(e=getActiveNexSys())=>e?.state?.system?.settings||e?.sys?.settings||{},isOverrideTabEnabled=(e=getActiveNexSys())=>Boolean(getSystemSettings(e).overrideTab),normalizeTargetQuery=e=>{const t=String(e??"").trim();return t?`${t.charAt(0).toUpperCase()}${t.slice(1).toLowerCase()}`:""},getInputArea=()=>globalThis.document?.getElementsByTagName?.("textarea")?.[0]??null,createTabCompletion=()=>({txt:null,qry:null,vals:null,index:0,reset(){this.txt=null,this.qry=null,this.vals=null,this.index=0},tc(){const e=getInputArea();if(!e)return;if(this.txt??=String(e.value??"").split(" "),this.qry??=normalizeTargetQuery(this.txt.at(-1)),!this.qry)return;const t=Array.isArray(globalThis.nexGui?.colors?.enemies)?globalThis.nexGui.colors.enemies:[],a=Array.isArray(globalThis.GMCP?.WhoList)?globalThis.GMCP.WhoList:[];this.vals??=[...new Set([...t.map(e=>String(e)),...a.map(e=>String(e?.name??"")).filter(e=>e.startsWith(this.qry))])],this.vals.length&&(this.index>this.vals.length-1?(this.txt[this.txt.length-1]=this.qry,this.index=0):(this.txt[this.txt.length-1]=this.vals[this.index],this.index+=1),e.value=this.txt.join(" "))}}),ensureTabCompletion=(e=getActiveNexSys())=>{if(e?.tabCompletion?.tc&&e?.tabCompletion?.reset)return e.tabCompletion;const t=createTabCompletion();return e&&"object"==typeof e&&(e.tabCompletion=t),t},renderCustomPrompt=(e,t={})=>{const a=e?.api?.prompt,n=t?.line;try{const e="function"==typeof a?.getCustomPrompt?a.getCustomPrompt():"function"==typeof a?.render?a.render(t):null;return"string"!=typeof e?null:(n?.parsed_line&&"object"==typeof n.parsed_line&&(n.parsed_line.formatted=()=>e),e)}catch(s){return console.error("nexSys4 custom prompt render failed",s),null}},createAddBlockOverride=()=>function add_block(e=[]){const t=getActiveNexSys();t?.prepend_line&&(e.unshift(t.prepend_line),t.prepend_line=!1);const a=Boolean(getSystemSettings(t).customPrompt);let n=0;for(let i=0;i<e.length;i+=1){const s=e[i];if(!s||s.gag)continue;if(!s.parsed_line&&!s.html_line)continue;const o=Boolean(s.is_prompt&&a&&s.parsed_line)?renderCustomPrompt(t,{line:s,source:"nexus-client-override"}):null;s.is_prompt&&0===n&&null===o?s.gag=!0:(!s.parsed_line||"function"!=typeof s.parsed_line.text||s.parsed_line.text()||0!==n&&i!==e.length-1||null!==o)&&("function"==typeof this._fill_tab_completion&&this._fill_tab_completion(s),n+=1,this.lineid+=1,s.id=this.lineid,this.lines.push(s),this.unread=!0)}const s=this.prune_lines?.()??!1;(n||s)&&this.on_lines_changed?.()},createProcessLinesOverride=()=>function process_lines(e=[]){if(this.gagged)return;if(!e.length)return;this.current_block=e;const t=this.reflexes?.();for(let a=0;a<e.length&&!(a>=1e3);a+=1)if(this.current_line=e[a],this.current_line.index=a,e[a]?.line&&String(e[a].line).indexOf(String.fromCharCode(7))>=0&&this.platform?.()?.beep?.(),!this.fullstop&&"function"==typeof t?.handle_triggers){const n=t.handle_triggers(e,a);Array.isArray(n)&&(e=n)}t?.run_function?.("onBlock",e,"ALL"),this.buffer?.()?.add_block?.(e),this.current_line=void 0,this.current_block=void 0},createOnKeyUpOverride=()=>function on_key_up(e){if(!this._nexus?.datahandler?.()?.is_connected?.())return!0;if(this.dialog_has_focus?.())return!0;const t=getActiveNexSys(),a=isOverrideTabEnabled(t),n=a?ensureTabCompletion(t):null;return this.tab_pressed?9!==e||(this.tab_pressed=!1,a?(n?.tc?.(),!1):(this.player_targetted||this._nexus?.datahandler?.()?.tab_target?.(!1),this.player_targetted=!1,!1)):(n?.reset?.(),!0)},createSendCommandOverride=e=>function send_command(t){const a=getActiveNexSys(),n=Date.now();if(a&&"object"==typeof a&&(a.sentCommands=[...(Array.isArray(a.sentCommands)?a.sentCommands:[]).slice(0,S-1),{cmd:t,time:n}]),"function"==typeof e)return e.call(this,t);this._socket&&(this._socket.send(`${t}\r\n`),this.last_send=n)},installNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e||e[y])return Boolean(e);const{buffer:t,platform:a,datahandler:n}=resolveOverrideTargets(e);return!!(t&&a&&n)&&(e[v]={buffer:t,platform:a,datahandler:n,process_lines:e.process_lines,add_block:t.add_block,on_key_up:a.on_key_up,send_command:n.send_command},e.process_lines=createProcessLinesOverride(),t.add_block=createAddBlockOverride(),a.on_key_up=createOnKeyUpOverride(),n.send_command=createSendCommandOverride(n.send_command),e[y]=!0,!0)},uninstallNexusClientOverrides=({nexusclient:e=globalThis.nexusclient}={})=>{if(!e?.[y])return!1;const t=e[v];if(!t)return delete e[y],!1;const a=t.buffer||resolveOverrideTargets(e).buffer,n=t.platform||resolveOverrideTargets(e).platform,s=t.datahandler||resolveOverrideTargets(e).datahandler;return e.process_lines=t.process_lines,a&&(a.add_block=t.add_block),n&&(n.on_key_up=t.on_key_up),s&&(s.send_command=t.send_command),delete e[v],delete e[y],!0},x=["send","sendGmcp","on","off","notice","getCommandSeparator","now","setTimeout","clearTimeout","getVariable","setVariable","emitLocal","raiseToEventStream"],C=Object.freeze({promptRender:["renderPrompt"],gmcpSnapshot:["getGMCP"],debugToggle:["setDebugEnabled","isDebugEnabled"],destroy:["destroy"]}),resolveAdapterCapabilities=e=>{const t=e?.capabilities&&"object"==typeof e.capabilities?e.capabilities:{},a={};return Object.entries(C).forEach(([n,s])=>{const i=Object.prototype.hasOwnProperty.call(t,n)?Boolean(t[n]):s.every(t=>"function"==typeof e?.[t]);if(i){const t=s.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter capability "${n}" requires methods: ${t.join(", ")}`)}a[n]=i}),Object.freeze(a)},assertAdapterContract=e=>{const t=x.filter(t=>"function"!=typeof e?.[t]);if(t.length)throw new Error(`nexSys4 adapter missing required methods: ${t.join(", ")}`);return resolveAdapterCapabilities(e),e},k=["Char.Vitals","Char.Status","Char.Afflictions.List","Char.Afflictions.Add","Char.Afflictions.Remove","Char.Defences.List","Char.Defences.Add","Char.Defences.Remove","Char.Items.Add","Char.Items.Remove","Char.Items.Update","Char.Items.List","IRE.Rift.List","IRE.Rift.Change","Room.Info","IRE.Target.Info"],registerEventStreamBindings=({eventBus:e,emit:t,pushTrace:a,eventRegistrations:n})=>{if(!e?.registerEvent)return;const registerBinding=(t,s)=>{const i=`nexsys4-${t.replace(/\W+/g,"-")}`,callback=e=>s(e);e.registerEvent(t,callback,{id:i,tags:["nexsys4"]}),n.push({eventName:t,id:i}),a("register:eventStream",{eventName:t,id:i})};k.forEach(e=>{registerBinding(e,a=>{t("GmcpEvent",{tag:e,payload:a??null,rawTag:e})})}),registerBinding("PromptEvent",e=>{t("PromptEvent",{source:"eventstream-prompt",payload:e??null})})},registerStartupGag=({onLocalEvent:e,client:t,notice:a,isDebugEnabled:n})=>{if("function"!=typeof e)return;const gagBlock=()=>{n()||t?.current_block?.forEach(e=>e.gag=!0)};let s=null,i=null,o=null;i=e("CuringStartupBeginEvent",()=>{i?.(),i=null,s||(s=e("PromptEvent",gagBlock))}),o=e("CuringStartupCompleteEvent",()=>{o?.(),o=null,gagBlock(),s?.(),s=null,a("loaded using startup spam gag.")})},createTriggerPattern=e=>void 0!==e.regex?e.regex:e.text,resolveTriggerReason=(e,t={})=>"function"==typeof e.resolveReason?e.resolveReason(t):e.reason,resolveTriggerPayload=(e,t,a={})=>{const n={id:e,source:"text"},s=resolveTriggerReason(t,a);return void 0!==t.have&&(n.have=t.have),void 0!==s&&(n.reason=s),"function"==typeof t.resolvePayload&&Object.assign(n,t.resolvePayload(a,n)||{}),n},createBalanceTextTrigger=(e,t)=>({name:`${e}-${t.name}`,regex:createTriggerPattern(t),action:({args:a,emit:n})=>{n("BalanceStateTextEvent",resolveTriggerPayload(e,t,a?.groups))}}),createBalanceTextTriggersFromFamilies=(e=[])=>e.flatMap(({id:e,entries:t=[]})=>t.map(t=>createBalanceTextTrigger(e,t))),A=["a dolomite grain","a calcite mote","a bisemutum chip","an azurite mote","a magnesium chip","an aurum flake","a plumbum flake","a stannum flake","an arsenic pellet","a ferrum flake","an antimony flake","a cuprum flake","an argentum flake","a calamine crystal","a pinch of ground cinnabar","a pinch of realgar crystals","a quartz grain","a pinch of ground malachite","a quicksilver droplet","a potash crystal","a gypsum crystal"],E=["dolomite grains","calcite motes","bisemutum chips","azurite motes","magnesium chips","aurum flakes","plumbum flakes","stannum flakes","arsenic pellets","ferrum flakes","antimony flakes","cuprum flakes","argentum flakes","calamine crystals","pinches of ground cinnabar","pinches of ground realgar","quartz grains","pinches of ground malachite","quicksilver droplets","potash crystals","gypsum crystals"],_=["a bloodroot leaf","a piece of kelp","a goldenseal root","some prickly ash bark","some bayberry bark","a ginseng root","a ginger root","a bellwort flower","a lobelia seed","a hawthorn berry","a valerian leaf","a skullcap flower","slippery elm","a kola nut","sileris berry","some irid moss","a black cohosh root","a prickly pear","some myrrh gum","an echinacea root"],w=["bloodroot leaves","pieces of kelp","goldenseal roots","pieces of prickly ash bark","pieces of bayberry bark","ginseng roots","ginger roots","bellwort flowers","lobelia seeds","hawthorn berries","valerian leaves","skullcap flowers","slippery elms","kola nuts","sileris berries","pieces of irid moss","cohosh roots","prickly pears","myrrh gums","echinacea roots"],T={"a dolomite grain":"dolomite","a calcite mote":"calcite","a bisemutum chip":"bisemutum","an azurite mote":"azurite","a magnesium chip":"magnesium","an aurum flake":"aurum","a plumbum flake":"plumbum","a stannum flake":"stannum","an arsenic pellet":"arsenic","a ferrum flake":"ferrum","an antimony flake":"antimony","a cuprum flake":"cuprum","an argentum flake":"argentum","a calamine crystal":"calamine","a pinch of ground cinnabar":"cinnabar","a pinch of realgar crystals":"realgar","a quartz grain":"quartz","a pinch of ground malachite":"malachite","a quicksilver droplet":"quicksilver","a potash crystal":"potash","a gypsum crystal":"gypsum","a bloodroot leaf":"bloodroot","a piece of kelp":"kelp","a goldenseal root":"goldenseal","some prickly ash bark":"ash","some bayberry bark":"bayberry","a ginseng root":"ginseng","a ginger root":"ginger","a bellwort flower":"bellwort","a lobelia seed":"lobelia","a hawthorn berry":"hawthorn","a valerian leaf":"valerian","a skullcap flower":"skullcap","slippery elm":"elm","a kola nut":"kola","sileris berry":"sileris","some irid moss":"moss","a black cohosh root":"cohosh","a prickly pear":"pear","some myrrh gum":"myrrh","an echinacea root":"echinacea","dolomite grains":"dolomite","calcite motes":"calcite","bisemutum chips":"bisemutum","azurite motes":"azurite","magnesium chips":"magnesium","aurum flakes":"aurum","plumbum flakes":"plumbum","stannum flakes":"stannum","arsenic pellets":"arsenic","ferrum flakes":"ferrum","antimony flakes":"antimony","cuprum flakes":"cuprum","argentum flakes":"argentum","calamine crystals":"calamine","pinches of ground cinnabar":"cinnabar","pinches of ground realgar":"realgar","quartz grains":"quartz","pinches of ground malachite":"malachite","quicksilver droplets":"quicksilver","potash crystals":"potash","gypsum crystals":"gypsum","bloodroot leaves":"bloodroot","pieces of kelp":"kelp","goldenseal roots":"goldenseal","pieces of prickly ash bark":"ash","pieces of bayberry bark":"bayberry","ginseng roots":"ginseng","ginger roots":"ginger","bellwort flowers":"bellwort","lobelia seeds":"lobelia","hawthorn berries":"hawthorn","valerian leaves":"valerian","skullcap flowers":"skullcap","slippery elms":"elm","kola nuts":"kola","sileris berries":"sileris","pieces of irid moss":"moss","cohosh roots":"cohosh","prickly pears":"pear","myrrh gums":"myrrh","echinacea roots":"echinacea"},P={antimony:"ginger",argentum:"lobelia",arsenic:"bayberry",aurum:"kelp",bisemutum:"myrrh",calamine:"hawthorn",calcite:"pear",cinnabar:"elm",cuprum:"bellwort",dolomite:"echinacea",ferrum:"ginseng",gypsum:"cohosh",magnesium:"bloodroot",malachite:"skullcap",plumbum:"goldenseal",potash:"moss",quartz:"kola",quicksilver:"sileris",realgar:"valerian",stannum:"ash"},M={ash:"stannum",bayberry:"arsenic",bellwort:"cuprum",bloodroot:"magnesium",cohosh:"gypsum",echinacea:"dolomite",elm:"cinnabar",ginseng:"ferrum",ginger:"antimony",goldenseal:"plumbum",hawthorn:"calamine",kelp:"aurum",kola:"quartz",lobelia:"argentum",moss:"potash",myrrh:"bisemutum",pear:"calcite",sileris:"quicksilver",skullcap:"malachite",valerian:"realgar"},D={azurite:0,bisemutum:0,magnesium:0,plumbum:0,arsenic:0,potash:0,stannum:0,malachite:0,realgar:0,cinnabar:0,antimony:0,ferrum:0,quartz:0,quicksilver:0,aurum:0,calamine:0,cuprum:0,argentum:0,gypsum:0,calcite:0,dolomite:0,ginseng:0,bloodroot:0,kelp:0,hawthorn:0,lobelia:0,bellwort:0,ginger:0,bayberry:0,ash:0,goldenseal:0,moss:0,valerian:0,elm:0,skullcap:0,sileris:0,kola:0,cohosh:0,pear:0,myrrh:0,echinacea:0},escapeRegExp$1=e=>String(e||"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),buildAlternation=(e=[])=>e.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean).map(escapeRegExp$1).join("|"),exactEntry=(e,t,a,n)=>({name:e,text:t,have:a,reason:n}),regexEntry=(e,t,a,n)=>({name:e,regex:t,have:a,reason:n}),dynamicReasonEntry=(e,t,a,n)=>({name:e,regex:t,have:a,resolveReason:n}),dynamicPayloadEntry=(e,t,a)=>({name:e,regex:t,resolvePayload:a}),R=[..._,...A].filter(e=>"some irid moss"!==e&&"a potash crystal"!==e),O=new RegExp(`^You eat (?<item>${buildAlternation(R)})\\.$`),N=/^Balance used: (?<duration>\d+\.\d{1,2})s\.$/,L=/^Equilibrium used: (?<duration>\d+\.\d{1,2})s\.$/,normalizeConsumedHerb=e=>{const t=String(e||"").trim().toLowerCase();return T[t]||t},parseObservedDurationSeconds=(e={})=>Number.parseFloat(String(e.duration||"")),I=[{id:"balance",entries:[exactEntry("ready","You have recovered balance on all limbs.",!0,"ready"),dynamicPayloadEntry("used",N,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"equilibrium",entries:[exactEntry("ready","You have recovered equilibrium.",!0,"ready"),dynamicPayloadEntry("used",L,e=>({have:!1,reason:"used",durationSeconds:parseObservedDurationSeconds(e)}))]},{id:"herb",entries:[exactEntry("ready","You may eat another plant or mineral.",!0,"ready"),dynamicReasonEntry("use",O,!1,e=>normalizeConsumedHerb(e?.item))]},{id:"focus",entries:[exactEntry("ready","Your mind is able to focus once again.",!0,"ready"),exactEntry("use","You focus your mind intently on curing your mental maladies.",!1,"focus"),regexEntry("shriek",/^A diminutive homunculus resembling \w+ turns its head towards you, its jaws opening wider than what seems possible\. The homunculus stares intently at you and lets out an ear-piercing shriek that disrupts your thoughts\.$/,!1,"shriek"),regexEntry("concussion",/^(?:The blow sets your head to spinning - you cannot concentrate on anything\.|\w+ swings (?:his|her) shield around, smashing your temple with a backhanded blow\.)$/,!1,"concussion"),exactEntry("failed","You concentrate, but your mind is too tired to focus.",!1,"failed")]},{id:"sip",entries:[exactEntry("ready","You may drink another health or mana elixir.",!0,"ready"),exactEntry("health","The elixir heals and soothes you.",!1,"health"),exactEntry("mana","Your mind feels stronger and more alert.",!1,"mana"),regexEntry("apply",/^You take some elixir from .+ and rub it into your .+\.$/,!1,"apply"),exactEntry("failed-elixir","The elixir flows down your throat without effect.",!1,"failed"),exactEntry("failed-health-elixir","The health elixir fizzles away without any discernable effect.",!1,"failed")]},{id:"moss",entries:[exactEntry("ready","You may eat another bit of irid moss or potash.",!0,"ready"),exactEntry("use","You feel your health and mana replenished.",!1,"consume"),exactEntry("failed","The potash slides down without effect.",!1,"failed")]},{id:"tree",entries:[exactEntry("ready","You may utilise the tree tattoo again.",!0,"ready"),exactEntry("use","You touch the tree of life tattoo.",!1,"touch"),exactEntry("failed","Your tree of life tattoo glows faintly for a moment then fades, leaving you unchanged.",!1,"failed")]},{id:"salve",entries:[exactEntry("ready","You may apply another salve to yourself.",!0,"ready"),exactEntry("failed","The salve dissolves and quickly disappears after you apply it.",!1,"failed"),regexEntry("restoration",/^\[Curing\]: APPLY RESTORATION TO \w+$/,!1,"restoration"),regexEntry("apply",/^(?:\[Curing\]: APPLY (?:MENDING|EPIDERMAL|CALORIC).*$|You take out some salve and quickly rub it on your(?:\s\w+)+\.)$/,!1,"apply")]},{id:"immunity",entries:[exactEntry("ready","Your system is able to absorb antidotes once again.",!0,"ready"),exactEntry("failed","The liquid reacts with the substance still present in your system, cancelling itself out.",!1,"failed"),exactEntry("use","[Curing]: SIP IMMUNITY",!1,"immunity")]},{id:"rebounding",entries:[exactEntry("aura","You feel an aura of rebounding surround you.",!0,"aura"),exactEntry("discharged","Your aura of weapons rebounding disappears.",!0,"discharged"),exactEntry("already-on","You puff on the pipe, but your existing aura of weapons rebounding negates any effect.",!0,"already-on"),exactEntry("malachite","You take a long drag of malachite off your pipe.",!1,"malachite"),exactEntry("malachite-no-period","You take a long drag of malachite off your pipe",!1,"malachite"),exactEntry("skullcap","You take a long drag of skullcap off your pipe.",!1,"skullcap")]},{id:"smoke",entries:[exactEntry("ready","Your lungs have recovered enough to smoke another mineral or plant.",!0,"ready"),exactEntry("failed","Your lungs have not yet recovered enough to allow you to smoke.",!1,"failed"),regexEntry("use",/^You take a long drag of/,!1,"smoke")]},{id:"dragonbreath",entries:[regexEntry("ready",/^Your \w+ summoning is complete\.$/,!0,"ready"),exactEntry("failed","You already have your breath summoned, Wyrm.",!1,"failed"),exactEntry("lightning","You feel your eyes begin to blaze as you summon lightning to your belly.",!1,"lightning"),exactEntry("fire","With an almost inaudible growl, you begin summoning a fiery inferno into your belly.",!1,"fire"),exactEntry("acid","With a great effort, you begin to summon caustic hell to your innards.",!1,"acid"),exactEntry("cold","Flaring your wings and head back, you begin summoning forth the icy cold of the pure, endless void into your belly.",!1,"cold"),exactEntry("venom","With a great shudder, you begin to summon forth the defiling, deadly wyrmvenom of legend.",!1,"venom"),exactEntry("psi","Calling upon the vast well of mental power at your disposal, you begin to summon a mind-rending blast of psi energy.",!1,"psi")]},{id:"deafness",entries:[exactEntry("ready","The aural world fades to silence.",!0,"ready"),exactEntry("calamine","You eat a calamine crystal.",!1,"calamine"),exactEntry("hawthorn","You eat a hawthorn berry.",!1,"hawthorn")]},{id:"deaf",entries:[exactEntry("already-on","You are already deaf.",!0,"already-on"),exactEntry("trance","The world about you falls silent as the deafness trance sinks upon you.",!0,"trance"),exactEntry("use","You stare straight ahead and concentrate on a distant focal point.",!1,"deaf")]},{id:"blind",entries:[exactEntry("already-on","You are already blind.",!0,"already-on"),exactEntry("ready","You open your eyes once more, and the world about you is darkness.",!0,"ready"),exactEntry("use","You close your eyes for a moment.",!1,"blind")]},{id:"speed",entries:[exactEntry("ready","Tiny tremours spread through your body as the world seems to slow down.",!0,"ready"),exactEntry("use","[Curing]: SIP SPEED",!1,"speed")]},{id:"sileris",entries:[exactEntry("quicksilver-ready","The quicksilver hardens into a supple metallic shell.",!0,"quicksilver"),exactEntry("berry-ready","The sileris berry juice hardens into a supple purple shell.",!0,"sileris"),exactEntry("quicksilver-use","You apply a quicksilver droplet to yourself.",!1,"quicksilver"),exactEntry("berry-use","You apply a sileris berry to yourself.",!1,"sileris")]},{id:"voice",entries:[exactEntry("ready","You have recovered voice balance.",!0,"ready")]},{id:"tremolo",entries:[exactEntry("ready","You may mangle a limb with the vibrato or tremolo once again.",!0,"ready"),regexEntry("arm-use",/^With a trilling vibrato you attack \w+'s broken (?:left|right) arm\. (?:He|She) screams in pain\.$/,!1,"arm"),regexEntry("leg-use",/^Using a heavy tremolo you brutally punish \w+'s already shattered (?:left|right) leg\.$/,!1,"leg")]},{id:"homunculus",entries:[exactEntry("ready","You may order your homunculus once more.",!0,"ready"),exactEntry("failed","You are unable to order your homunculus again so soon.",!1,"failed"),regexEntry("use",/^Focusing your mind on a diminutive homunculus resembling (?:\w+), you command it to disrupt (?:\w+)'s focus\. The homunculus turns towards (?:him|her) before letting out an ear-piercing shriek\.$/,!1,"shriek")]},{id:"fitness",entries:[exactEntry("ready","You may purge your lungs once again.",!0,"ready"),exactEntry("use","You inhale deeply, purging yourself of your asthmatic condition.",!1,"fitness"),exactEntry("failed","You may not purge your lungs again as of this time.",!1,"failed")]},{id:"bloodboil",entries:[exactEntry("ready","You may boil your blood once again.",!0,"ready"),exactEntry("use","You summon spirits of fire to burn off that which afflicts you.",!1,"bloodboil"),exactEntry("failed","You have not recovered enough to boil your blood again as of yet.",!1,"failed")]},{id:"dragonheal",entries:[exactEntry("ready","You may purge your great form of afflictions once again.",!0,"ready"),exactEntry("use","You let out a great keening, and cast the impurities from your form.",!1,"dragonheal"),exactEntry("failed-recovery","You have not yet recovered enough to purge your great form of afflictions.",!1,"failed"),exactEntry("failed-disjointed","Your mind and body are too disjointed to invoke your healing powers, wyrm.",!1,"failed")]},{id:"rage",entries:[exactEntry("ready","You may channel your rage to cure your afflictions once again.",!0,"ready"),exactEntry("use","You allow your pent-up rage to vent and your eyes flash dangerously.",!1,"rage")]},{id:"salt",entries:[exactEntry("use","Directing the energy of salt, you surround yourself with a primal aura, purging yourself of ailments.",!1,"salt"),exactEntry("ready","You may channel alchemical energy to heal yourself once again.",!0,"ready"),exactEntry("failed","You have not recovered enough to heal yourself with alchemical energy once again.",!1,"failed")]},{id:"shrugging",entries:[exactEntry("ready","Your body has recovered enough to shrug afflictions once again.",!0,"ready"),exactEntry("use","Focusing inward, you purge your body of afflictions.",!1,"shrugging"),exactEntry("failed","You may not shrug again so soon.",!1,"failed")]},{id:"fool",entries:[exactEntry("ready","You may heal another affliction.",!0,"ready"),exactEntry("use","You press the Fool tarot to your forehead.",!1,"fool"),exactEntry("failed","The Fool has no effect on you.",!1,"failed")]},{id:"writhe",entries:[regexEntry("free",/^You have writhed free\b/,!0,"ready"),exactEntry("no-affliction","You begin to writhe helplessly, throwing your body off balance.",!0,"no-affliction"),exactEntry("entangled","You begin to struggle free of your entanglement.",!1,"entangled"),exactEntry("transfixation","You begin trying to wrest your mind free of that which has transfixed it.",!1,"transfixation"),exactEntry("failed-entangled","You twist and turn as you attempt to escape from your entanglement.",!1,"failed"),exactEntry("failed-transfixation","You continue trying to wrest your mind free.",!1,"failed")]},{id:"impalewrithe",entries:[exactEntry("free-direct","With an heroic effort you manage to writhe yourself free from the weapon that impaled you.",!0,"impale"),exactEntry("use","You begin to writhe furiously to escape the blade that has impaled you.",!1,"impale"),regexEntry("free-swathe",/^With a vicious snarl \w+ carves a merciless swathe through your steaming guts\. You gurgle and choke as s?he withdraws (?:his|her) dripping blade, glistening with gore\.$/,!0,"impale"),regexEntry("free-wrench",/^Searing pain tears through your midsection as you wrench away from [A-Z][a-z]+, (?:his|her) weapon ripping unceremoniously through your innards\.$/,!0,"impale"),regexEntry("free-slide",/^With a snarl of contempt, \w+ allows you to slide free of (?:her|his) weapon\.$/,!0,"impale")]},{id:"alleviate",entries:[exactEntry("ready","You may purge your body of afflictions once again.",!0,"ready"),exactEntry("use","Applying your knowledge of anatomy, you massage pressure points with your fingers, and a flood of relief courses through your body.",!1,"alleviate"),exactEntry("no-afflictions","There are no pesky afflictions keeping you from your destiny, Warrior.",!1,"no-afflictions"),exactEntry("failed","You are too exhausted to purge your body of afflictions.",!1,"failed")]},{id:"slough",entries:[exactEntry("use","You allow your outer layers to slough away, their fires extinguished along with the impurities contaminating them.",!1,"slough"),exactEntry("ready","You may slough off the impurities that plague you once again.",!0,"ready"),exactEntry("failed","You may not slough off the impurities again quite yet.",!1,"failed")]}],createBalanceTextTriggers=()=>({group:"balance/text",triggers:createBalanceTextTriggersFromFamilies(I)}),parsePositiveInteger=(e,t=1)=>{const a=Number.parseInt(String(e??""),10);return Number.isFinite(a)&&a>0?a:t},cleanItemText=e=>String(e||"").trim(),emitInventoryDelta=({emit:e,item:t,delta:a,source:n="text-trigger"})=>{e("CacheInventoryDeltaTextEvent",{item:cleanItemText(t),delta:a,source:n})},createCacheTextTriggers=()=>({group:"cache/text",triggers:[{name:"rift-out",regex:/^You remove (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftOutTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),source:"text-trigger"})}},{name:"curative-consume",regex:/^You eat (?<item>.+?)\.$/,action:({args:e,emit:t})=>{t("CacheCurativeConsumedTextEvent",{item:cleanItemText((e?.groups||{}).item),amount:1,source:"text-trigger"})}},{name:"rift-in",regex:/^You store (?<amount>\d+) (?<item>.+?), bringing the total in the rift to (?<riftAmount>\d+)(?<capacityMarker>, which is the maximum for that type of object)?\.$/,action:({args:e,emit:t})=>{const a=e?.groups||{};t("CacheRiftInTextEvent",{item:cleanItemText(a.item),amount:parsePositiveInteger(a.amount),riftAmount:parsePositiveInteger(a.riftAmount,0),atCapacity:Boolean(a.capacityMarker),source:"text-trigger"})}},{name:"rift-full",regex:"You may not store any more of that type of thing.",action:({emit:e})=>{e("CacheRiftFullTextEvent",{source:"text-trigger"})}},{name:"inventory-empty",regex:/^You have no (?<item>.+?) in your inventory\.$/,action:({args:e,emit:t})=>{t("CacheInventoryEmptyTextEvent",{item:cleanItemText((e?.groups||{}).item),source:"text-trigger"})}},{name:"give-away",regex:/^You give (?<item>.+?) to .+\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}},{name:"receive",regex:/^.+ gives (?<item>.+?) to you\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:1})}},{name:"drop",regex:/^You drop (?<item>.+?)\.$/,action:({args:e,emit:t})=>{emitInventoryDelta({emit:t,item:e?.groups?.item,delta:-1})}}]}),shiftTrigger=(e,t)=>({name:e,regex:t,action:({emit:t})=>{t("AvoidPostureShiftedTextEvent",{type:e})}}),createAvoidPostureTriggers=()=>({group:"defense/avoidPosture",triggers:[shiftTrigger("physical",/^You prepare yourself to avoid the brunt of physical attacks\.$/),shiftTrigger("aoe",/^You prepare yourself to avoid the brunt of area of effect attacks\.$/),shiftTrigger("mental",/^You prepare yourself to avoid the brunt of mental based attacks\.$/),shiftTrigger("arcane",/^You prepare yourself to avoid the brunt of arcane based attacks\.$/),{name:"recovered",regex:/^You may once more shift your defensive posture\.$/,action:({emit:e})=>{e("AvoidPostureRecoveredTextEvent",{})}},{name:"blocked",regex:/^You have too recently shifted your defensive posture to do so again\.$/,action:({emit:e})=>{e("AvoidPostureBlockedTextEvent",{})}}]}),normalizeTextValue=e=>String(e||"").trim(),parseDelimitedEntries=e=>String(e||"").split(/[|,]/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),parseSpaceDelimitedEntries=e=>String(e||"").replace(/\s+\((\d+)\)/g,"($1)").trim().split(/\s+/).map(e=>e.trim().toLowerCase().replace(/^,+|,+$/g,"")).filter(Boolean),buildLimbPayload=({args:e,client:t,source:a="text-trigger"})=>({limb:normalizeTextValue(e.groups?.limb),raw:normalizeTextValue(t?.current_line?.line),source:a}),createLimbTextTriggers=()=>({group:"limb/selfDamage",triggers:[{name:"carve-hit",regex:/^As .+? carves into you, you perceive that \w+ has dealt (?<amount>[\d.]+)% damage to your (?<limb>.+)\.$/,action:({args:e,client:t,emit:a})=>{a("LimbDamageTextEvent",{...buildLimbPayload({args:e,client:t}),amount:Number(e.groups?.amount)})}},{name:"crunch-hit",regex:/^As .+?'s? blow crunches into you, you perceive that \w+ has dealt (?<amount>[\d.]+)% damage to your (?<limb>.+)\.$/,action:({args:e,client:t,emit:a})=>{a("LimbDamageTextEvent",{...buildLimbPayload({args:e,client:t}),amount:Number(e.groups?.amount)})}},{name:"pain-subsides",regex:/^The pain plaguing your (?<limb>.+) subsides\.$/,action:({args:e,client:t,emit:a})=>{a("LimbResetTextEvent",buildLimbPayload({args:e,client:t}))}}]}),normalizeTag=e=>String(e||"").trim().toLowerCase(),normalizeCommandSeparator=e=>String(e??"").trim(),toNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toOptionalBooleanFromYesNo=e=>{if(null==e||""===e)return;if("boolean"==typeof e)return e;if("number"==typeof e)return 0!==e;const t=String(e).trim().toLowerCase();return!!["yes","1","true","on"].includes(t)||!["no","0","false","off"].includes(t)&&void 0},boolWord=e=>e?"on":"off",nowMs=()=>Date.now(),j={classQueue:{name:"class",type:"c!p!t!w",pre:["touch soul","stand"],post:[],exclusions:["fullQueue"]},freeQueue:{name:"free",type:"free",pre:["touch soul","stand"],post:[],exclusions:["fullQueue","shieldQueue","bloodcloakQueue"]},fullQueue:{name:"full",type:"ebc!w!p!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","shieldQueue","bloodcloakQueue","classQueue"]},shieldQueue:{name:"shield",type:"eb!w!t",pre:["touch soul","stand"],post:[],exclusions:["freeQueue","fullQueue","bloodcloakQueue"]},shipQueue:{name:"ship",type:"s!w!t",pre:["touch soul","stand"],post:[],exclusions:[]},bloodcloakQueue:{name:"bloodcloak",type:"!teb",pre:["touch soul"],post:[],exclusions:["fullQueue","freeQueue","shieldQueue"]},battlerageQueue:{name:"battlerage",type:"!p!t!wu",pre:["touch soul"],post:[],exclusions:[]},stunQueue:{name:"stun",type:"!t",pre:["touch soul"],post:[],exclusions:[]}},escapeRegExp=e=>String(e).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),normalizeTriggerName=e=>String(e||"").replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,""),resolveSeparator=e=>normalizeCommandSeparator(e?.())||"|",splitCommands=(e,t)=>String(e||"").split(String(t||"|")||"|").map(e=>e.trim()).filter(Boolean),createQueueSentTrigger=([e,t],a)=>({name:`sent-${normalizeTriggerName(e)}`,regex:new RegExp(`^\\[System\\]: Added (?<commands>.+) to your ${escapeRegExp(t.type)} queue\\.$`),action:({args:n,client:s,emit:i})=>{const o=resolveSeparator(a),l=normalizeTextValue(n.groups?.commands);i("QueueSentTextEvent",{raw:normalizeTextValue(s?.current_line?.line),queueId:e,queueName:t.name,queueType:t.type,rawCommands:l,commands:splitCommands(l,o),separator:o,source:"text-trigger"})}}),createQueueTextTriggers=({getCommandSeparator:e}={})=>({group:"queue/text",triggers:Object.entries(j).map(t=>createQueueSentTrigger(t,e))}),createAffPrioritySnapshotTriggers=()=>({group:"serverside/affPrioritySnapshot",session:{name:"affPriorities",completionEvent:"ServersideAffPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"aff-priority-header",regex:/^Your affliction curing priorities(?::| for the priority set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideAffPrioSnapshotOpenTextEvent",{topic:"affPriorities",reason:"aff-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<prio>\d+):\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{const a=parseSpaceDelimitedEntries(e.groups.entries);return!!a.length&&(a.forEach(a=>{t("ServersideAffPrioTextEvent",{aff:a,prio:Number(e.groups.prio)})}),!0)}},{name:"close",closer:!0,closeReason:"aff-priority-terminal-line",regex:"Affs with priority 26 are ignored."}]}),createCuringSetSnapshotTriggers=()=>{let e=[],t="";const reset=()=>{e=[],t=""};return{group:"serverside/curingSetSnapshot",session:{name:"curingSets",completionEvent:"ServersideCuringSetSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"curingset-list-header",regex:"Your current curing sets",action:()=>{reset()}},{name:"set-line",regex:/^(?!-+$)(?<name>\S+)(?<current> \(current\))?$/,action:({args:a})=>{const n=String(a.groups?.name||"").trim();return!!n&&(e.push(n),a.groups?.current&&(t=n),!0)}},{name:"close",closer:!0,closeReason:"curingset-total-line",regex:/^You are using a total of (?<used>\d+) of your allowed (?<limit>\d+) curing sets\.$/,action:({args:a,emit:n})=>{n("ServersideCuringSetsTextEvent",{sets:[...e],activeSet:t,used:Number(a.groups.used),limit:Number(a.groups.limit)})}},{name:"empty",opener:!0,closer:!0,openReason:"curingset-empty-header",closeReason:"curingset-empty-line",regex:/^You have no sets defined/,action:({emit:e})=>{reset(),e("ServersideCuringSetsTextEvent",{sets:[],activeSet:"",used:0})}}]}},createCuringSetSwitchTriggers=()=>({group:"serverside/curingSetSwitch",triggers:[{name:"switched",regex:/^You will now cure using the (?<set>\S+) set\.$/,action:({args:e,emit:t})=>{t("ServersideCuringSetSwitchedTextEvent",{set:e.groups?.set||""})}}]}),createDefPrioritySnapshotTriggers=()=>({group:"serverside/defPrioritySnapshot",session:{name:"defPriorities",completionEvent:"ServersideDefPrioSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"def-priority-header",regex:/^Your defence priorities(?::| for curing set (?<set>\S+):)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioSnapshotOpenTextEvent",{topic:"defPriorities",reason:"def-priority-header",set:e.groups?.set||""})}},{name:"line",regex:/^(?<def>\w+)\s*: (?<prio>\d+)$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio)})}}]}),createLivePriorityConfirmationTriggers=()=>({group:"serverside/livePriorityConfirmations",triggers:[{name:"aff-set",regex:/^You have set the '(?<aff>[^']+)' affliction to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideAffPrioTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}},{name:"def-set",regex:/^You have set the '(?<def>\w+)' defence to the (?<prio>\d+) priority\.$/,action:({args:e,emit:t})=>{t("ServersideDefPrioTextEvent",{def:String(e.groups.def||"").toLowerCase(),prio:Number(e.groups.prio),source:"live-confirmation"})}}]}),createLivePredictionConfirmationTriggers=()=>({group:"serverside/livePredictionConfirmations",triggers:[{name:"added",regex:/^You have added the (?<aff>\w+) affliction to your predicted afflictions list\.$/,action:({args:e,emit:t})=>{t("ServersidePredictionConfirmTextEvent",{aff:String(e.groups.aff||"").toLowerCase(),status:"added",source:"live-confirmation"})}},{name:"already",regex:"You have already predicted that you have that affliction.",action:({emit:e})=>{e("ServersidePredictionConfirmTextEvent",{aff:"",status:"already",source:"live-confirmation"})}}]}),emitStatus$1=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},createLiveStatusConfirmationTriggers=()=>({group:"serverside/liveStatusConfirmations",triggers:[{name:"enabled",regex:/^Curing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"enabled",/^activated$/.test(e.groups.value))}},{name:"transmutation-on",regex:"You will now use transmutation cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!0)}},{name:"transmutation-off",regex:"You will now use concoction-based cures.",action:({emit:e})=>{emitStatus$1(e,"transmutation",!1)}},{name:"sip-priority",regex:/^Curing will now prioritise (?<value>mana|health) over (?<other>mana|health)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-threshold",regex:/^(?<kind>Health|Mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"sipHealthAt":"sipManaAt",Number(e.groups.value))}},{name:"moss-threshold",regex:/^Moss (?<kind>health|mana) curing threshold set to (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"health"===String(e.groups.kind||"").toLowerCase()?"mossHealthAt":"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Automatic usage of focusing (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focus",/^activated$/.test(e.groups.value))}},{name:"focus-over-herbs",regex:/^You will now prioritise (?<value>focus|herbs) over (?<other>focus|herbs)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"focusOverHerbs",/^focus$/.test(e.groups.value))}},{name:"tree",regex:/^Automatic usage of the tree tattoo (?<value>activated|disabled)\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"tree",/^activated$/.test(e.groups.value)?"on":"off")}},{name:"clot-on",regex:"You will now attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!0)}},{name:"clot-off",regex:"You will no longer attempt to clot your wounds.",action:({emit:e})=>{emitStatus$1(e,"clot",!1)}},{name:"clot-at",regex:/^Will clot above (?<value>\d+) bleeding\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAt",Number(e.groups.value))}},{name:"insomnia-on",regex:"You will now use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!0)}},{name:"insomnia-off",regex:"You will now not use the insomnia ability.",action:({emit:e})=>{emitStatus$1(e,"insomnia",!1)}},{name:"fractures-above",regex:/^Will cure health based afflictions above (?<value>\d+)%\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^You will now use mana if above (?<value>\d+)% of your maximum mana reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"manaThreshold",Number(e.groups.value))}},{name:"batch-on",regex:"You will now attempt to cure multiple things at once.",action:({emit:e})=>{emitStatus$1(e,"batch",!0)}},{name:"batch-off",regex:"You will now cure one thing at a time.",action:({emit:e})=>{emitStatus$1(e,"batch",!1)}},{name:"clot-above",regex:/^You will now use corrupted clotting if above (?<value>\d+)% of your maximum health reserves\.$/,action:({args:e,emit:t})=>{emitStatus$1(t,"clotAbove",Number(e.groups.value))}}]}),createQueuePredictionTriggers=()=>({group:"serverside/queuePrediction",triggers:[{name:"queue-line",regex:/^CURING QUEUE(?:\s+LIST)?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersideQueueListTextEvent",{queue:parseDelimitedEntries(e.groups.entries)})}},{name:"predictions-line",regex:/^CURING PREDICTIONS?\s*:\s*(?<entries>.*)$/,action:({args:e,emit:t})=>{t("ServersidePredictionsTextEvent",{predictions:parseDelimitedEntries(e.groups.entries).reduce((e,t)=>(e[t]=!0,e),{})})}}]}),emitStatus=(e,t,a)=>{e("ServersideStatusTextEvent",{key:t,value:a})},isYes=e=>"Yes"===e,createStatusSnapshotTriggers=()=>({group:"serverside/statusSnapshot",session:{name:"status",completionEvent:"ServersideStatusSnapshotCompleteTextEvent",fallbackCloseEvents:[{event:"PromptEvent",reason:"prompt"},{event:"CuringStartupCompleteEvent",reason:"startup-complete"}],resetEvents:[{event:"CuringStartupBeginEvent",reason:"startup-begin"}]},triggers:[{name:"open",opener:!0,openReason:"status-header",regex:"Curing Status:"},{name:"enabled",regex:/^Enabled:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"enabled",isYes(e.groups.value))}},{name:"reporting",regex:/^Reporting commands:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"reporting",isYes(e.groups.value))}},{name:"sipping",regex:/^Sipping:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipping",isYes(e.groups.value))}},{name:"afflictions",regex:/^Affliction Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"afflictions",isYes(e.groups.value))}},{name:"defences",regex:/^Defence Upkeep:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"defences",isYes(e.groups.value))}},{name:"transmutation",regex:/^Curing Method:\s+(?<value>\w+)$/,action:({args:e,emit:t})=>{emitStatus(t,"transmutation","transmutation"===String(e.groups.value||"").toLowerCase())}},{name:"fallback",regex:/^Fallback Curing:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"fallback",isYes(e.groups.value))}},{name:"custom-aff-priority",regex:/^Custom Curing Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customAffPriority",isYes(e.groups.value))}},{name:"custom-def-priority",regex:/^Custom Defence Priority:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"customDefPriority",isYes(e.groups.value))}},{name:"sip-priority",regex:/^Health\/Mana Priority:\s+(?<value>Health|Mana)$/,action:({args:e,emit:t})=>{emitStatus(t,"sipPriority",String(e.groups.value||"").toLowerCase())}},{name:"sip-health-at",regex:/^Sip health at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipHealthAt",Number(e.groups.value))}},{name:"sip-mana-at",regex:/^Sip mana at:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"sipManaAt",Number(e.groups.value))}},{name:"moss-health-at",regex:/^Eat moss below health:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossHealthAt",Number(e.groups.value))}},{name:"moss-mana-at",regex:/^Eat moss below mana:\s+(?<value>\d+)%$/,action:({args:e,emit:t})=>{emitStatus(t,"mossManaAt",Number(e.groups.value))}},{name:"focus",regex:/^Use focus:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focus",isYes(e.groups.value))}},{name:"focus-over-herbs",regex:/^Focus over herbs:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"focusOverHerbs",isYes(e.groups.value))}},{name:"clot",regex:/^Use clot:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"clot",isYes(e.groups.value))}},{name:"tree",regex:/^Use tree:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"tree",isYes(e.groups.value)?"on":"off")}},{name:"clot-at",regex:/^Clot at:\s+(?<value>\d+) bleeding$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAt",Number(e.groups.value))}},{name:"insomnia",regex:/^Use insomnia:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"insomnia",isYes(e.groups.value))}},{name:"fractures-above",regex:/^Will cure fractures above:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"fracturesAbove",Number(e.groups.value))}},{name:"mana-threshold",regex:/^Will use mana above:\s+(?<value>\d+)% mana$/,action:({args:e,emit:t})=>{emitStatus(t,"manaThreshold",Number(e.groups.value))}},{name:"clot-health",regex:/^Will clot health until:\s+(?<value>\d+)% health$/,action:({args:e,emit:t})=>{emitStatus(t,"clotAbove",Number(e.groups.value))}},{name:"batch",regex:/^Batch actions:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"batch",isYes(e.groups.value))}},{name:"kaido-transmute",closer:!0,closeReason:"status-terminal-line",regex:/^Use Kaido Transmute:\s+(?<value>Yes|No)$/,action:({args:e,emit:t})=>{emitStatus(t,"kaidoTransmute",isYes(e.groups.value))}}]}),q="transcendence",buildResourcePayload=({client:e,value:t})=>({key:q,value:t,min:0,max:100,source:"text-trigger",raw:normalizeTextValue(e?.current_line?.line)}),createCharacterResourceTriggers=()=>({group:"system/characterResource",triggers:[{name:"transcendence-progress",regex:/^Your body and mind continue to harmonise: you are (?<value>\d+) percent of the way to full transcendence\.$/,action:({args:e,client:t,emit:a})=>{a("CharacterResourceTextEvent",buildResourcePayload({client:t,value:Number(e.groups?.value)}))}},{name:"transcendence-achieved",regex:"You have achieved transcendence: your body and mind operate as one.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:100}))}},{name:"transcendence-harmony-lost",regex:"Your body and mind are no longer in harmony.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}},{name:"transcendence-fallen",regex:"Your body and mind fall out of their transcendent state.",action:({client:e,emit:t})=>{t("CharacterResourceTextEvent",buildResourcePayload({client:e,value:0}))}}]}),createSystemEventTriggers=()=>({group:"system/systemEvent",triggers:[{name:"line",regex:/^SystemEvent (?<eventName>.+)$/,action:({args:e,client:t,emit:a})=>{const n=normalizeTextValue(e.groups?.eventName);if(!n)return;const s=normalizeTextValue(t?.current_line?.line);a(n,{raw:s});const i=n.match(/^(?<queueName>[A-Za-z]+)QueueFired$/);i?.groups?.queueName&&a("QueueFiredTextEvent",{raw:s,queueName:i.groups.queueName})}},{name:"all-queues-cleared",regex:"[System]: All queued commands cleared.",action:({client:e,emit:t})=>{t("AllQueuesClearedTextEvent",{raw:normalizeTextValue(e?.current_line?.line)})}}]}),createSeparatorChangedTrigger=()=>({group:"system/separatorChanged",triggers:[{name:"separator-changed",regex:/^Your command separator is now:\s*(?<sep>\S+)\s*$/,action:({args:e,emit:t})=>{const a=String(e.groups?.sep||"").trim();a&&t("CommandSeparatorChangedTextEvent",{separator:a})}}]}),B=[createSystemEventTriggers,createSeparatorChangedTrigger,createCharacterResourceTriggers,createBalanceTextTriggers,createCacheTextTriggers,createAvoidPostureTriggers,createLimbTextTriggers,createQueueTextTriggers,createStatusSnapshotTriggers,createAffPrioritySnapshotTriggers,createDefPrioritySnapshotTriggers,createCuringSetSnapshotTriggers,createCuringSetSwitchTriggers,createLiveStatusConfirmationTriggers,createLivePriorityConfirmationTriggers,createLivePredictionConfirmationTriggers,createQueuePredictionTriggers],createTriggerCatalog=(e={})=>B.map(t=>t(e)),registerTextTriggers=({triggerApi:e,client:t,getCommandSeparator:a,emit:n,onLocalEvent:s,pushTrace:i,triggerIds:o,registerCleanup:l,registerTriggerGroupActivity:c,triggerSessions:u})=>{if(!e?.triggers?.add)return void i("register:nexAction:skipped",{reason:"trigger-api-unavailable"});const d="function"==typeof e.triggers.enable&&"function"==typeof e.triggers.disable,sessionToggleTag=e=>`session:${e}`,setSessionTriggers=(t,a)=>{if(!d)return;const n=sessionToggleTag(t);a?e.triggers.enable([n]):e.triggers.disable([n]),i(a?"session:enable":"session:disable",{session:t,tag:n})},resetSession=(e,t={})=>{const a=u[e];return!!a&&(a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"reset"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),i("session:reset",{session:e,...t}),!0)},beginSession=(e,t={})=>{const a=u[e];return!!a&&(setSessionTriggers(e,!0),a.active?(i("session:reopen",{session:e,...t}),!1):(a.active=!0,a.hasLines=!1,a.lastReason=String(t.reason||t.source||"begin"),a.lastOpenedAt=Date.now(),i("session:begin",{session:e,...t}),!0))},markSessionHasData=e=>{const t=u[e];t?.active&&!t.hasLines&&(t.hasLines=!0)},completeSession=(e,t={})=>{const a=u[e];if(!a?.active)return!1;const s=a.hasLines;return a.active=!1,a.hasLines=!1,a.lastReason=String(t.reason||"complete"),a.lastClosedAt=Date.now(),setSessionTriggers(e,!1),i("session:complete",{session:e,reason:a.lastReason,hadLines:s,completionEvent:t.completionEvent||""}),t.completionEvent&&n(t.completionEvent,{topic:e,reason:a.lastReason}),!0},registerTextTrigger=({id:a,group:s,regex:l,action:u,enabled:d=!0,tags:m=[],once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:C,onEnable:k})=>{e.triggers.add({id:a,regex:l,enabled:d,tags:m,once:p,duration:g,fg:h,bg:b,lines:y,prompt:v,finalAction:S,onRemove:x,onDisable:C,onEnable:k,action:e=>u({args:e,client:t,emit:n,pushTrace:i})}),o.push(a),c(s,"triggerCount"),i("register:nexAction",{id:a,group:s,enabled:d,regex:l instanceof RegExp?l.source:String(l)})};createTriggerCatalog({getCommandSeparator:a}).forEach(e=>{const t=e.session;t&&"function"==typeof s&&((t.resetEvents||[]).forEach(({event:a,reason:n})=>{l(s(a,()=>resetSession(t.name,{reason:n,event:a}))),c(e.group,"hookCount")}),(t.fallbackCloseEvents||[]).forEach(({event:a,reason:n})=>{l(s(a,()=>completeSession(t.name,{reason:n,completionEvent:t.completionEvent}))),c(e.group,"hookCount")})),e.triggers.forEach(a=>{const n=t?.name,s=Boolean(n&&!0===a.opener),i=Boolean(n&&!0===a.closer),o=["nexsys4","adapter","text",`group:${e.group}`],l=Boolean(n)&&!s,c=l?[sessionToggleTag(n)]:[],m=(!l||!d)&&(a.enabled??!0);registerTextTrigger({id:`nexsys4-${e.group.replace(/[\\/]+/g,"-")}-${a.name}`,group:e.group,regex:a.regex,enabled:m,tags:[...o,...c,...a.tags||[]],once:a.once,duration:a.duration,fg:a.fg,bg:a.bg,lines:a.lines,prompt:a.prompt,finalAction:a.finalAction,onRemove:a.onRemove,onDisable:a.onDisable,onEnable:a.onEnable,action:o=>{if(s)beginSession(n,{group:e.group,trigger:a.name,reason:a.openReason||"open"});else if(n&&!u[n]?.active)return;const l="function"==typeof a.action?a.action(o):void 0;return!n||s||i||!1===l||markSessionHasData(n),i&&completeSession(n,{reason:a.closeReason||"close",completionEvent:t.completionEvent}),l}})})})},$="",F="#c1bfff",z="#cf6dfc",G="#FFF2D7",H=`<span style="color:${F}">[-</span><span style="color:${z}">nexSys</span><span style="color:${F}">-] </span>`,U=Object.freeze({fg:G,bg:$}),V=Object.freeze({default:Object.freeze({default:Object.freeze({message:U})}),affGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +aff ",fg:"orange",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),affLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -aff ",fg:"orange",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),defGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" +def ",fg:"purple",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),defLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" -def ",fg:"purple",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),balanceRecovered:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" onBal ",fg:"brown",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),balanceLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" offBal ",fg:"brown",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),trackableGot:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" + ",fg:"white",bg:$}),message:Object.freeze({fg:"green",bg:$})})}),trackableLost:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:" - ",fg:"white",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),priority:Object.freeze({default:Object.freeze({prefix:Object.freeze({text:"priority change: ",fg:"yellow",bg:$}),message:Object.freeze({fg:"red",bg:$})})}),output:Object.freeze({default:Object.freeze({message:Object.freeze({fg:"red",bg:$})})})}),escapeHtml$1=e=>String(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;"),normalizeNoticeToken=(e,t="")=>String(e||t).trim().toLowerCase(),resolveNoticeStyle=(e={})=>{const t=String(e.category||"default").trim(),a=normalizeNoticeToken(e.action,"default"),n=V[t]||V.default;return n[a]||n.default||V.default.default},normalizeNoticePart=(e,t=U)=>"string"==typeof e?{text:e,fg:t.fg,bg:t.bg}:{text:String(e?.text||""),fg:String(e?.fg??t.fg??U.fg),bg:String(e?.bg??t.bg??U.bg)},buildNoticeParts=(e,t={})=>{const a=resolveNoticeStyle(t),n=a.message||U;if(Array.isArray(t.parts)&&t.parts.length)return t.parts.map(e=>normalizeNoticePart(e,n)).filter(e=>e.text);if(t.title)return[normalizeNoticePart({text:String(t.title),fg:t.titleFg??n.fg,bg:t.titleBg??n.bg},n),normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)].filter(e=>e.text);const s=[];return a.prefix?.text&&s.push(normalizeNoticePart(a.prefix,n)),s.push(normalizeNoticePart({text:String(e),fg:t.fg??n.fg,bg:t.bg??n.bg},n)),s.filter(e=>e.text)},renderSpanStyle=e=>["white-space:pre-wrap",e.fg?`color:${escapeHtml$1(e.fg)}`:"",e.bg?`background-color:${escapeHtml$1(e.bg)}`:""].filter(Boolean).join(";"),renderNoticeHtml=(e,t={},a=[])=>`<span class="nexsys4-notice" style="white-space:pre-wrap;">${H}${t.html?String(t.html):(a.length?a:buildNoticeParts(e,t)).map(e=>`<span style="${renderSpanStyle(e)}">${escapeHtml$1(e.text)}</span>`).join("")}</span>`,createNoticeTransport=({client:e,emit:t,pushTrace:a})=>({notice(n,s={}){const i=String(n),o=buildNoticeParts(i,s);e.add_html_line(renderNoticeHtml(i,s,o)),a("notice",{message:i,context:s,parts:o}),t("NoticeEvent",{message:i,context:s,parts:o})}}),createTriggerSessionState=()=>({active:!1,hasLines:!1,lastReason:"idle",lastOpenedAt:0,lastClosedAt:0}),createAdapterDebugState=({debug:e=!1,traceLimit:t=200,now:a=()=>Date.now(),logLabel:n="nexSys4.adapter"}={})=>{let s=Boolean(e);const i=Math.max(1,Number(t||200)),o=[],l=new Map,c={status:createTriggerSessionState(),affPriorities:createTriggerSessionState(),defPriorities:createTriggerSessionState(),curingSets:createTriggerSessionState()},pushTrace=(e,t={})=>{if(!s)return null;const l={at:a(),type:e,detail:t};return o.push(l),o.length>i&&o.splice(0,o.length-i),console.log(`[${n}] ${e}`,t),l};return{pushTrace,triggerSessions:c,registerTriggerGroupActivity:(e,t="triggerCount")=>{const a=String(e||"").trim();if(!a)return null;const n=l.get(a)||{name:a,triggerCount:0,hookCount:0};return n[t]=Number(n[t]||0)+1,l.set(a,n),n},setDebugEnabled(e){s=Boolean(e),pushTrace("debug",{enabled:s})},isDebugEnabled:()=>s,snapshotTriggerGroups:()=>[...l.values()].map(e=>({...e})).sort((e,t)=>e.name.localeCompare(t.name)),snapshotTriggerSessions:()=>Object.entries(c).reduce((e,[t,a])=>(e[t]={...a},e),{}),snapshotRecentTrace:()=>[...o]}},createAdapterEventHub=({pushTrace:e=()=>{},errorLabel:t="nexSys4 adapter listener failed"}={})=>{const a=new Map,normalizeEventName=e=>String(e||"").trim(),on=(t,n)=>{const s=normalizeEventName(t);if(!s||"function"!=typeof n)return()=>{};let i=a.get(s);return i||(i=new Set,a.set(s,i)),i.add(n),e("on",{event:s,listenerCount:i.size}),()=>off(s,n)},off=(t,n)=>{const s=normalizeEventName(t),i=a.get(s);if(!s||!i)return!1;const o=i.delete(n);return i.size||a.delete(s),e("off",{event:s,removed:o,listenerCount:i.size}),o};return{emit:(n,s)=>{const i=normalizeEventName(n),o=a.get(i);if(!i||!o?.size)return i&&e("emit",{event:i,listenerCount:0,payload:s}),0;const l=[...o];return e("emit",{event:i,listenerCount:l.length,payload:s}),l.forEach(e=>{if(a.get(i)?.has(e))try{e(s)}catch(n){console.error(t,{event:i,error:n})}}),l.length},on,off,clear(){a.clear()}}},createAdapterLifecycle=({eventBus:e,triggerApi:t,pushTrace:a=()=>{},clearListeners:n=()=>{}}={})=>{const s=[],i=[],o=[],destroy=()=>{const l=o.length,c=s.length,u=[...i];o.splice(0).forEach(e=>{try{e()}catch(t){console.error("nexSys4 adapter cleanup failed",{error:t})}}),e?.removeListener&&s.forEach(({eventName:t,id:a})=>{e.removeListener(t,a)}),t?.triggers?.remove&&i.forEach(e=>t.triggers.remove(e)),a("destroy",{eventRegistrations:c,triggerIds:u,internalCleanupCount:l}),n()};return{eventRegistrations:s,triggerIds:i,registerCleanup:e=>"function"==typeof e?(o.push(e),e):()=>{},destroy}},summarizePromptContext=(e={})=>({source:e.source||"",hasLine:Boolean(e.line)}),createAdapterPromptSink=({emit:e,pushTrace:t})=>{const renderPrompt=(a,n={})=>{const s=String(a??""),i=n?.line;return i?.parsed_line&&"object"==typeof i.parsed_line&&(i.parsed_line.formatted=()=>s),e("PromptRendered",{prompt:s,context:n}),t("renderPrompt",{promptLength:s.length,context:summarizePromptContext(n)}),s};return{renderPrompt}},normalizeOutboundCommands=e=>Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[],normalizeGmcpRequests=e=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],shouldPreventExpansion=e=>"boolean"==typeof e?e:Boolean(e?.preventExpansion),createAdapterTransport=({client:e,emit:t,pushTrace:a,resolveSeparator:n}={})=>({send(s=[],i={}){const o=normalizeOutboundCommands(s);if(!o.length)return[];const l=o.join(n()||"|");return e?.send_commands&&e.send_commands(l,shouldPreventExpansion(i)),a("send",{commands:o,payload:l,context:i}),t("OutboundCommandsEvent",{commands:o,payload:l,context:i}),o},sendGmcp(n=[],s={}){const i="function"==typeof e?.datahandler?e.datahandler():null;if("function"!=typeof i?.send_GMCP)return[];const o=normalizeGmcpRequests(n);if(!o.length)return[];const l=[];return o.forEach(e=>{try{i.send_GMCP(e),l.push(e)}catch(t){console.error("nexSys4 GMCP request failed",{request:e,error:t})}}),l.length&&(a("sendGmcp",{requests:l,context:s}),t("AdapterGmcpRequest",{requests:l,context:s})),l},getVariable(t){if(!e?.variables)return;const a=e.variables();return"function"==typeof a?.get?a.get(t):a?.vars?.[t]},setVariable(t,a){if(!e?.variables)return a;const n=e.variables();return"function"==typeof n?.set?(n.set(t,a),a):n?.vars?(n.vars[t]=a,a):a}}),createNexusAdapter=(e={})=>{const t=e.nexusclient||globalThis.nexusclient,monotonicNowMs=()=>globalThis.performance?.now?globalThis.performance.now():Date.now();let a=null;const resolveSeparator=()=>a||"",n=e.eventStream||globalThis.eventStream,s=e.nexAction||globalThis.nexAction,getGMCP=()=>e.GMCP||globalThis.GMCP,{pushTrace:i,triggerSessions:o,registerTriggerGroupActivity:l,setDebugEnabled:c,isDebugEnabled:u,snapshotTriggerGroups:d,snapshotTriggerSessions:m,snapshotRecentTrace:p}=createAdapterDebugState({debug:e.debug,traceLimit:e.traceLimit}),{emit:g,on:h,off:b,clear:y}=createAdapterEventHub({pushTrace:i}),{eventRegistrations:v,triggerIds:S,registerCleanup:x,destroy:C}=createAdapterLifecycle({eventBus:n,triggerApi:s,pushTrace:i,clearListeners:y}),{send:k,sendGmcp:A,getVariable:E,setVariable:_}=createAdapterTransport({client:t,emit:g,pushTrace:i,resolveSeparator}),normalizeEventName=e=>String(e||"").trim(),{notice:w}=createNoticeTransport({client:t,emit:g,pushTrace:i}),{renderPrompt:T}=createAdapterPromptSink({emit:g,pushTrace:i}),emitLocal=(e,t)=>{const a=normalizeEventName(e);return!!a&&(g(a,t),i("emit:local",{event:a,payload:t}),!0)},raiseToEventStream=(e,t)=>{const a=normalizeEventName(e);return!(!a||!n?.raiseEvent)&&(n.raiseEvent(a,t),i("emit:eventstream",{topic:a,payload:t}),!0)};s?.triggers?.remove&&s.triggers.remove(["nexsys4"]),n?.removeByTag&&n.removeByTag(["nexsys4"]),registerEventStreamBindings({eventBus:n,emit:g,pushTrace:i,eventRegistrations:v}),registerTextTriggers({triggerApi:s,client:t,getCommandSeparator:resolveSeparator,emit:g,onLocalEvent:h,pushTrace:i,triggerIds:S,registerCleanup:x,registerTriggerGroupActivity:l,triggerSessions:o}),!1!==e.startupGag&&registerStartupGag({onLocalEvent:h,client:t,notice:w,isDebugEnabled:u});const addOnceTrigger=({id:e,regex:a,action:n})=>s?.triggers?.add?(s.triggers.add({id:e,regex:a,enabled:!0,once:!0,tags:["nexsys4","probe",`probe:${e}`],action:e=>n({args:e,client:t,emit:g,pushTrace:i})}),S.push(e),i("probe-trigger:add",{id:e,regex:a instanceof RegExp?a.source:String(a)}),()=>{s?.triggers?.remove&&s.triggers.remove(e),i("probe-trigger:remove",{id:e})}):()=>{};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send:k,sendGmcp:A,on:h,off:b,notice:w,getCommandSeparator:()=>resolveSeparator(),setSeparator(e){a=normalizeCommandSeparator(e)||null},addOnceTrigger,now:monotonicNowMs,setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),renderPrompt:T,getVariable:E,setVariable:_,emitLocal,raiseToEventStream,destroy:C,getGMCP,setDebugEnabled:c,isDebugEnabled:u,debugInfo:()=>({debugEnabled:u(),startupGagEnabled:!1!==e.startupGag,separator:resolveSeparator(),eventRegistrations:v.map(e=>({...e})),triggerIds:[...S],triggerGroups:d(),triggerSessions:m(),hasEventStream:Boolean(n?.registerEvent),hasNexActionTriggers:Boolean(s?.triggers?.add),recentTrace:p()})}},createMockAdapter=(e={})=>{const t=new Map,a=new Map,n=new Map;let s=normalizeCommandSeparator(e.separator??"|");const i=[],o=[],l=[],c=[],u=[],d=[];let m=Boolean(e.debug);const p=Math.max(1,Number(e.traceLimit||200)),g=[],pushTrace=(e,t={})=>{const a={at:nowMs(),type:e,detail:t};g.push(a),g.length>p&&g.splice(0,g.length-p),m&&console.log(`[nexSys4.mockAdapter] ${e}`,t)},normalizeEventName=e=>String(e||"").trim(),emit=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s?.size)return n&&pushTrace("emit",{event:n,listenerCount:0,payload:a}),0;const i=[...s];return pushTrace("emit",{event:n,listenerCount:i.length,payload:a}),i.forEach(e=>{if(t.get(n)?.has(e))try{e(a)}catch(s){console.error("nexSys4 mock adapter listener failed",{event:n,error:s})}}),i.length},on=(e,a)=>{const n=normalizeEventName(e);if(!n||"function"!=typeof a)return()=>{};let s=t.get(n);return s||(s=new Set,t.set(n,s)),s.add(a),pushTrace("on",{event:n,listenerCount:s.size}),()=>off(n,a)},off=(e,a)=>{const n=normalizeEventName(e),s=t.get(n);if(!n||!s)return!1;const i=s.delete(a);return s.size||t.delete(n),pushTrace("off",{event:n,removed:i,listenerCount:s.size}),i},removeOnceTrigger=e=>{const t=String(e||"").trim();if(!t)return!1;const a=n.delete(t);return pushTrace("probe-trigger:remove",{id:t,removed:a}),a},addOnceTrigger=({id:e,regex:t,action:a}={})=>{const s=String(e||"").trim();return s&&t instanceof RegExp&&"function"==typeof a?(n.set(s,{regex:t,action:a}),pushTrace("probe-trigger:add",{id:s,regex:t.source}),()=>removeOnceTrigger(s)):()=>{}},fireText=(e,t={})=>{const a=String(e??"");pushTrace("fireText",{text:a,detail:t,triggerCount:n.size});const s=[];return[...n.entries()].forEach(([e,i])=>{i.regex.lastIndex=0;const o=i.regex.exec(a);o&&(n.delete(e),s.push(e),i.action({args:{raw:a,line:a,text:a,groups:o.groups||{},matches:[...o]},detail:t}))}),s};return{capabilities:Object.freeze({promptRender:!0,gmcpSnapshot:!0,debugToggle:!0,destroy:!0}),send(e=[],t={}){const a=Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):"string"==typeof e&&e?[e]:[];return a.length?(i.push({commands:a,context:t}),pushTrace("send",{commands:a,context:t}),emit("OutboundCommandsEvent",{commands:a,context:t}),a):[]},sendGmcp(e=[],t={}){const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)];return a.length?(u.push(...a),pushTrace("sendGmcp",{requests:a,context:t}),emit("AdapterGmcpRequest",{requests:a,context:t}),a):[]},on,off,emit,notice(e,t={}){o.push({message:String(e),context:t}),pushTrace("notice",{message:String(e),context:t})},getCommandSeparator:()=>s,setSeparator:e=>(s=normalizeCommandSeparator(e),pushTrace("setSeparator",{separator:s}),s),addOnceTrigger,fireText,now:()=>"function"==typeof e.now?e.now():nowMs(),setTimeout:(e,t)=>setTimeout(e,t),clearTimeout(e){clearTimeout(e)},renderPrompt(e,t={}){const a=String(e??""),n={prompt:a,context:t};return d.push(n),pushTrace("renderPrompt",{promptLength:a.length,source:t.source||"",hasLine:Boolean(t.line)}),emit("PromptRendered",n),a},getVariable:e=>a.get(e),setVariable:(e,t)=>(a.set(e,t),t),emitLocal(e,t){const a=String(e||"").trim();if(!a)return!1;const n={event:a,payload:t};return l.push(n),pushTrace("emit:local",n),emit(a,t),!0},raiseToEventStream(e,t){const a=String(e||"").trim();if(!a)return!1;const n={topic:a,payload:t};return c.push(n),pushTrace("emit:eventstream",n),!0},destroy(){t.clear(),n.clear()},getSentBatches:()=>i,getNotices:()=>o,getLocalEvents:()=>l,getEventStreamEvents:()=>c,getGmcpRequests:()=>u,getRenderedPrompts:()=>d,getGMCP:()=>e.gmcp||{},setDebugEnabled(e){m=Boolean(e),pushTrace("debug",{enabled:m})},isDebugEnabled:()=>m,debugInfo:()=>({debugEnabled:m,separator:s,recentTrace:[...g],sentBatchCount:i.length,gmcpRequests:[...u],renderedPromptCount:d.length})}},defineStringPrototypeHelper=(e,t)=>"function"!=typeof String.prototype[e]&&(Object.defineProperty(String.prototype,e,{configurable:!0,writable:!0,value:t}),!0),installStringPrototypeHelpers=()=>({toProperCase:defineStringPrototypeHelper("toProperCase",function toProperCase(){return this.replace(/\w\S*/g,function formatWord(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}),capitalize:defineStringPrototypeHelper("capitalize",function capitalize(){return this.charAt(0).toUpperCase()+this.slice(1)})}),Y={list:["accentato","addiction","aeon","agoraphobia","airfisted","amnesia","anorexia","asphyxiating","asthma","betrayal","blackout","blindness","blistered","bloodfire","bound","breathless","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","bruisedribs","burning","cadmuscurse","calcifiedskull","calcifiedtorso","claustrophobia","clumsiness","coldfate","concussion","condemned","conflagration","confusion","constricted","convergence","corruption","crackedribs","cremated","crescendo","crushedthroat","daeggerimpale","damagedhead","damagedleftarm","damagedleftleg","damagedrightarm","damagedrightleg","darkshade","dazed","dazzled","deadening","deafness","death","deathsickness","deepsleep","degenerate","dehydrated","dementia","demonstain","depression","deteriorate","diminished","disloyalty","disrupted","dissonance","dizziness","earworm","empoweredmannaz","empoweredloshre","enlightenment","enmesh","ensorcelled","entangled","epilepsy","fear","flamefisted","flushings","fratricide","frostbite","frozen","fulminated","generosity","grievouswounds","guilt","hamstrung","haemophilia","hallucinations","hatred","healthleech","heartseed","hecatecurse","hellsight","hindered","homunculusmercury","horror","hypersomnia","hypochondria","hypothermia","icebound","icefisted","impaled","impatience","indifference","inquisition","insomnia","internalbleeding","isolation","itching","justice","kaisurge","kkractlebrand","laceratedthroat","lapsingconsciousness","latched","lethargy","lightbind","loneliness","lovers","lovestruck","lullaby","manaleech","masochism","mildtrauma","mangledleftarm","mangledleftleg","mangledrightarm","mangledrightleg","mangledhead","mindclamp","mindravaged","muddled","mycalium","nausea","numbedleftarm","numbedrightarm","pacified","palpatarfeed","paralysis","paranoia","parasite","peace","penitence","petrified","phlogisticated","pinshot","pressure","prone","pyramides","pyre","rebbies","recklessness","reeling","retribution","revealed","sandfever","scalded","scrambledbrains","scytherus","selarnia","sensitivity","serioustrauma","shadowmadness","shivering","shyness","silenced","silver","skullfractures","slashedthroat","sleeping","slickness","slimeobscure","snared","solarburn","speechless","spiritburn","stridulating","stun","stupidity","stuttering","succumbed","temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine","tenderskin","tension","timeflux","timeloop","tonguetied","torntendons","transfixation","trueblind","unweavingbody","unweavingmind","unweavingspirit","vertigo","vinewreathed","vitiated","vitrified","voidfisted","voyria","waterbonds","weakenedmind","weariness","webbed","woeconstrained","whisperingmadness","wristfractures","unconsciousness","harmonic","bop","spiritwrack","bedevil","loki","moon","evileye","dragoncurse","swiftcurse"],prios:{aeon:4,concussion:4,crushedthroat:4,paralysis:4,peace:4,sleeping:5,grievouswounds:5,latched:5,dazzled:5,unweavingbody:5,unweavingmind:5,unweavingspirit:5,weariness:5,prone:5,timeloop:5,fulminated:5,spiritburn:6,heartseed:6,guilt:6,tenderskin:6,pyramides:6,parasite:6,hypochondria:6,pacified:6,depression:6,confusion:6,mindravaged:6,retribution:6,shadowmadness:6,whisperingmadness:6,hellsight:6,anorexia:7,scalded:7,mycalium:7,frostbite:7,flushings:7,rebbies:7,sandfever:7,asthma:7,healthleech:7,impatience:8,itching:8,fratricide:8,scytherus:8,clumsiness:8,kkractlebrand:8,damagedleftleg:8,darkshade:8,slickness:8,recklessness:8,dementia:8,icebound:8,bound:9,daeggerimpale:9,entangled:9,sensitivity:9,transfixation:9,webbed:9,tonguetied:9,haemophilia:9,lethargy:9,manaleech:9,dissonance:9,pyre:9,skullfractures:10,damagedrightleg:10,hypersomnia:10,earworm:10,crescendo:10,diminished:10,torntendons:11,brokenleftleg:11,brokenrightleg:11,hallucinations:11,calcifiedskull:12,calcifiedtorso:12,mangledleftleg:12,mangledrightleg:12,disrupted:12,mangledhead:12,voyria:12,crackedribs:12,hypothermia:13,impaled:13,brokenleftarm:13,brokenrightarm:13,indifference:13,addiction:13,nausea:13,deadening:13,frozen:13,shivering:13,mildtrauma:13,internalbleeding:13,stupidity:14,wristfractures:14,damagedleftarm:14,disloyalty:14,tension:15,damagedhead:15,dazed:15,burning:15,lovers:16,pressure:16,damagedrightarm:16,temperedcholeric:16,temperedmelancholic:16,temperedphlegmatic:16,temperedsanguine:16,mangledleftarm:17,mangledrightarm:17,agoraphobia:18,claustrophobia:18,generosity:18,justice:18,loneliness:18,vertigo:18,paranoia:19,serioustrauma:20,epilepsy:20,laceratedthroat:22,slashedthroat:22,stuttering:22,selarnia:23,fear:23,masochism:23,dizziness:25,shyness:25,stridulating:25,horror:26,bleeding:30,amnesia:30,blackout:30,insomnia:30,deafness:30,blindness:30,harmonic:100,bop:100,spiritwrack:100,bedevil:100,loki:100,moon:100,evileye:100,dragoncurse:100,swiftcurse:100},types:{countable:{pressure:{min:0,max:5},crescendo:{min:0,max:5},unweavingbody:{min:0,max:5},unweavingspirit:{min:0,max:5},unweavingmind:{min:0,max:5},burning:{min:0,max:5},horror:{min:0,max:5},pyre:{min:0,max:3},temperedcholeric:{min:0,max:8},temperedmelancholic:{min:0,max:8},temperedphlegmatic:{min:0,max:8},temperedsanguine:{min:0,max:8},torntendons:{min:0,max:6},crackedribs:{min:0,max:6},skullfractures:{min:0,max:6},wristfractures:{min:0,max:6}},nonServerside:{accentato:0,airfisted:0,asphyxiating:0,blistered:0,bloodfire:0,bruisedribs:0,cadmuscurse:0,coldfate:0,condemned:0,conflagration:0,constricted:0,convergence:0,corruption:0,cremated:0,death:0,deathsickness:0,deepsleep:0,degenerate:0,dehydrated:0,demonstain:0,deteriorate:0,empoweredloshre:0,empoweredmannaz:0,enlightenment:0,enmesh:0,ensorcelled:0,flamefisted:0,hamstrung:0,hatred:0,hecatecurse:0,hindered:0,homunculusmercury:0,icefisted:0,inquisition:0,isolation:0,kaisurge:0,lightbind:0,lullaby:0,mindclamp:0,muddled:0,numbedleftarm:0,numbedrightarm:0,palpatarfeed:0,petrified:0,phlogisticated:0,pinshot:0,revealed:0,scrambledbrains:0,silenced:0,silver:0,slimeobscure:0,solarburn:0,stun:0,timeflux:0,trueblind:0,vinewreathed:0,vitiated:0,vitrified:0,voidfisted:0,waterbonds:0,weakenedmind:0,unconsciousness:0},timed:{accentato:{length:20},aeon:{length:16},airfisted:{length:16},betrayal:{length:15},blackout:{length:20},blistered:{length:20},breathless:{length:3},bruisedribs:{length:30},cadmuscurse:{length:20},condemned:{length:20},constricted:{length:30},corruption:{length:45},dazzled:{length:60},dehydrated:{length:60},demonstain:{length:120},empoweredloshre:{length:12},empoweredmannaz:{length:20},enmesh:{length:5},ensorcelled:{length:20},flamefisted:{length:30},hamstrung:{length:9},heartseed:{length:11},hecatecurse:{length:16},icefisted:{length:30},inquisition:{length:30},lightbind:{length:22},lovestruck:{length:5},muddled:{length:12},numbedleftarm:{length:7.5},numbedrightarm:{length:7.5},palpatarfeed:{length:20},phlogisticated:{length:45},pinshot:{length:18},reeling:{length:20},revealed:{length:60},scalded:{length:20},scrambledbrains:{length:60},silver:{length:180},slimeobscure:{length:60},solarburn:{length:5},snared:{length:20},speechless:{length:300},stridulating:{length:15},stun:{length:3},succumbed:{length:30},timeflux:{length:60},trueblind:{length:6},unconsciousness:{length:10},vinewreathed:{length:30},vitrified:{length:45},voidfisted:{length:5},waterbonds:{length:30},weakenedmind:{length:60},woeconstrained:{length:30}},unknown:{moon:["stupidity","confusion","epilepsy","masochism","hypersomnia","hallucinations"],loki:["stupidity","clumsiness","recklessness","asthma","shyness","darkshade","paralysis","brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","sensitivity","disloyalty","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","selarnia","slickness","scytherus"],evileye:["confusion","dizziness"],dragoncurse:["recklessness","clumsiness","epilepsy","dizziness","pacified","nausea","addiction","anorexia","generosity","disloyalty","sensitivity","vertigo","paranoia","stupidity","hypochondria","lethargy","shivering","frozen","impatience","paralysis","asthma","agoraphobia"],harmonic:["stupidity","recklessness"],bop:["stupidity","recklessness"],swiftcurse:["stupidity","clumsiness","recklessness","asthma","paralysis","deafness","sensitivity","nausea","weariness","dizziness","anorexia","voyria","haemophilia","addiction","impatience","claustrophobia","vertigo","agoraphobia","masochism","epilepsy","manaleech","pacified","dementia","healthleech"],bedevil:["stupidity","recklessness"]},uncurable:{bloodfire:!0,cadmuscurse:!0,conflagration:!0,death:!0,deathsickness:!0,deepsleep:!0,enlightenment:!0,isolation:!0,lullaby:!0,mindclamp:!0,palpatarfeed:!0,penitence:!0,scalded:!0,stun:!0,weakenedmind:!0}}},buildAffIndex=e=>{const t=new Set(e.list),a={};for(const[n,s]of Object.entries(e.prios))a[s]||(a[s]=[]),a[s].push(n);return Object.freeze({affSet:t,prioArrays:Object.freeze(a)})},Q=(buildAffIndex(Y),{herb:{length:1.6,aff_modifiers:{homunculusmercury:{multiplier:1,offset:.5}}},focus:{length:2.5,aff_modifiers:{weakenedmind:{multiplier:2,offset:.5},whisperingmadness:{multiplier:1.6,offset:0}}},sip:{length:4.5,aff_modifiers:{skullfractures:{multiplier:1,offset:1}}},moss:{length:6},tree:{length:15,aff_modifiers:{slimeobscure:{multiplier:1,offset:10}}},equilibrium:{length:20,aff_modifiers:{confusion:{multiplier:1.5,offset:0}}},balance:{length:20,aff_modifiers:{lethargy:{multiplier:1.25,offset:0}}},salve:{length:4,aff_modifiers:{timeflux:{multiplier:1.5,offset:0}}},immunity:{length:10},rebounding:{length:9},smoke:{length:1.5},dragonbreath:{length:1.5},deafness:{length:3},deaf:{length:6},blind:{length:6},speed:{length:6},wake:{length:20},sileris:{length:8},avoid:{length:30},free:{length:0},voice:{length:2.5},tremolo:{length:6},homunculus:{length:12},fitness:{length:10},bloodboil:{length:10},dragonheal:{length:20},rage:{length:10},salt:{length:10},shrugging:{length:10},alleviate:{length:10},slough:{length:10},fool:{length:40},writhe:{length:6},impalewrithe:{length:4},entity:{length:4},word:{length:5},anathema:{length:5},systemOutput:{length:1}}),W=["itching","paralysis","fear","brokenrightarm","brokenleftarm","brokenrightleg","brokenleftleg","lapsingconsciousness","aeon","lovers","confusion","epilepsy","pacified","blackout","dazed","justice","slashedthroat","hellsight","peace","dazzled","shyness","dizziness","slickness","asthma","nausea","selarnia","weariness","scytherus","fratricide","haemophilia","clumsiness","hallucinations","healthleech","dementia","recklessness","anorexia","masochism","impatience","stupidity","generosity","addiction","deadening","manaleech","stuttering","paranoia","agoraphobia","loneliness","claustrophobia","vertigo","hypersomnia","shivering","frozen","burning","sensitivity","hypochondria","lethargy","disloyalty","darkshade","voyria","dissonance","phlogisticated","silver","spiritburn","tenderskin","guilt","skullfractures","wristfractures","crackedribs","torntendons","indifference","retribution","shadowmadness","parasite","depression","timeloop","crushedthroat","tension","unweavingspirit","grievouswounds","pyramides","flushings","rebbies","mycalium","sandfever","crescendo","fulminated","frostbite"],K={ferrum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ferrum",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"],prio:0},magnesium:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat magnesium",order:["paralysis","slickness","pyramides"],prio:0},aurum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat aurum",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"],prio:0},calamine:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat calamine",order:["deafness"],delay:2.5,prio:0},argentum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat argentum",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"],prio:0},cuprum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat cuprum",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"],prio:0},antimony:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat antimony",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"],prio:0},arsenic:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat arsenic",prio:0},stannum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat stannum",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"],prio:0},plumbum:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"],command:"eat plumbum",prio:0},calcite:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat calcite",prio:0},ginseng:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginseng",order:["darkshade","haemophilia","lethargy","addiction","scytherus","nausea","flushings","unweavingbody"],prio:0},bloodroot:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bloodroot",order:["paralysis","slickness","pyramides"],prio:0},kelp:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat kelp",order:["clumsiness","healthleech","sensitivity","weariness","asthma","rebbies","parasite"],prio:0},hawthorn:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat hawthorn",order:["deafness"],delay:2.5,prio:0},lobelia:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat lobelia",order:["horror","fratricide","masochism","loneliness","vertigo","recklessness","agoraphobia","guilt","whisperingmadness","spiritburn","tenderskin","hypochondria"],prio:0},bellwort:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bellwort",order:["pacified","peace","lovers","justice","generosity","indifference","retribution","pyre","timeloop","stridulating","diminished"],prio:0},ginger:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ginger",order:["temperedcholeric","temperedmelancholic","temperedphlegmatic","temperedsanguine"],prio:0},bayberry:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat bayberry",prio:0},ash:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat ash",order:["claustrophobia","paranoia","confusion","hypersomnia","hallucinations","dementia","crescendo"],prio:0},goldenseal:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],command:"eat goldenseal",order:["stupidity","epilepsy","dizziness","shyness","impatience","dissonance","depression","sandfever","mycalium","shadowmadness","unweavingmind","fulminated"],prio:0},pear:{bals_used:["herb"],bals_req:["herb"],blocks:["death","anorexia","sleeping"],order:["pressure"],command:"eat pear",prio:0},smoke:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","disloyalty","hellsight","manaleech","slickness","deadening","tension","unweavingspirit","earworm","dazed"],prio:0},cinnabar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke cinnabar",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"],prio:0},malachite:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke malachite",prio:0},realgar:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke realgar",order:["disloyalty","hellsight","manaleech","slickness"],prio:0},elm:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke elm",order:["aeon","deadening","tension","unweavingspirit","earworm","dazed"],prio:0},skullcap:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke skullcap",prio:0},valerian:{bals_used:["smoke"],bals_req:["smoke"],blocks:["death","asthma","sleeping"],command:"smoke valerian",order:["disloyalty","hellsight","manaleech","slickness"],prio:0},caloric:{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply caloric",order:["frozen","shivering","frostbite"],prio:0},"epidermal to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to body",order:["anorexia","itching"],prio:0},"epidermal to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to head",order:["blindness","scalded","deafness","stuttering"],prio:0},"epidermal to ears":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply epidermal to ears",order:["deafness"],prio:0},"mending to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to head",order:["crushedthroat","dazzled"],prio:0},"mending to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to arms",order:["brokenleftarm","brokenrightarm"],prio:0},"mending to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to legs",order:["brokenleftleg","brokenrightleg"],prio:0},"mending to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to torso",order:["burning"],prio:0},"mending to body":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply mending to body",order:["selarnia"],prio:0},"restoration to head":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to head",order:["mangledhead","damagedhead","calcifiedskull","concussion","tonguetied","slashedthroat","laceratedthroat"],delay:4,prio:0},"restoration to torso":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to torso",order:["hypothermia","heartseed","serioustrauma","mildtrauma","calcifiedtorso","internalbleeding"],delay:4,prio:0},"restoration to arms":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to arms",order:["mangledleftarm","mangledrightarm","damagedleftarm","damagedrightarm"],delay:4,prio:0},"restoration to legs":{bals_used:["salve"],bals_req:["salve"],blocks:["death","slickness","sleeping"],command:"apply restoration to legs",order:["mangledleftleg","mangledrightleg","damagedleftleg","damagedrightleg"],delay:4,prio:0},focus:{bals_req:["focus"],bals_used:["focus"],blocks:["death","impatience","sleeping"],command:"focus",order:["stupidity","epilepsy","dizziness","shyness","claustrophobia","paranoia","confusion","hallucinations","dementia","pacified","peace","lovers","generosity","masochism","loneliness","vertigo","recklessness","agoraphobia","anorexia","stuttering"],prio:0},"health to head":{bals_req:["sip"],bals_used:["sip"],command:"apply health to head",order:["skullfractures"],prio:0},"health to torso":{bals_req:["sip"],bals_used:["sip"],command:"apply health to torso",order:["crackedribs","grievouswounds"],prio:0},"health to arms":{bals_req:["sip"],bals_used:["sip"],command:"apply health to arms",order:["wristfractures"],prio:0},"health to legs":{bals_req:["sip"],bals_used:["sip"],command:"apply health to legs",order:["torntendons","latched","kkractlebrand"],prio:0},concentrate:{blocks:["death","sleeping","confusion"],command:"concentrate",order:["disrupted"],prio:0},immunity:{bals_req:["immunity"],bals_used:["immunity"],blocks:["death","sleeping","anorexia"],command:"sip immunity",order:["voyria"],prio:0},stand:{bals_req:["balance","equilibrium"],blocks:["death","sleeping","paralysis","brokenrightleg","brokenleftleg","damagedleftleg","damagedrightleg","mangledrightleg","mangledleftleg","entangled","transfixation","impaled","webbed","bound"],command:"stand",order:["prone"],prio:0},tree:{bals_used:["tree"],bals_req:["tree"],blocks:["death","sleeping","paralysis",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],command:"touch tree",order:W,prio:0},health:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip health",prio:0},mana:{bals_req:["sip"],bals_used:["sip"],blocks:["death","sleeping","anorexia"],command:"sip mana",prio:0},potash:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat potash",prio:0},moss:{bals_req:["moss"],bals_used:["moss"],blocks:["death","sleeping","anorexia"],command:"eat moss",prio:0},fitness:{bals_req:["equilibrium","balance","fitness"],bals_used:["balance","fitness"],blocks:["death","weariness","sleeping"],skills:["Monk","Shikudo","Runewarden"],command:"fitness",order:["asthma"],prio:0},bloodboil:{bals_req:["equilibrium","balance","bloodboil"],bals_used:["equilibrium","bloodboil"],blocks:["death","haemophilia","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Magi"],command:"cast bloodboil",order:W,prio:0},restore:{bals_req:["balance","equilibrium"],bals_used:["equilibrium"],command:"restore",order:["brokenleftarm","brokenrightarm","brokenleftleg","brokenrightleg","skullfractures","torntendons","wristfractures","crackedribs"],prio:0},dragonflex:{bals_req:["balance"],bals_used:["balance"],command:"dragonflex",skills:["Dragon"],order:["webbed","entangled"],prio:0},dragonheal:{bals_req:["balance","equilibrium"],bals_used:["equilibrium"],command:"dragonheal",skills:["Dragon"],blocks:["death","sleeping",["recklessness","weariness"]],order:W,prio:0},dwinnu:{bals_req:["voice"],bals_used:["voice"],command:"chant dwinnu",skills:["Bard"],order:["webbed","entangled"],prio:0},rage:{bals_req:["rage"],bals_used:["rage"],command:"rage",skills:["Runewarden"],order:["pacified","peace","lovers","generosity"],prio:95},"touch soul":{command:"touch soul",blocks:["death"],order:["amnesia"],prio:101},salt:{bals_req:["equilibrium","salt"],bals_used:["salt","equilibrium"],blocks:["death","stupidity","sleeping"],skills:["Alchemist"],command:"educe salt",order:W,prio:0},siphon:{bals_req:["angel"],bals_used:["angel"],blocks:["death","sleeping"],skills:["Apostate","Priest"],command:"educe salt",order:W,prio:0},shrugging:{bals_req:["equilibrium","balance","shrugging"],bals_used:["shrugging"],blocks:["death","weariness","sleeping"],skills:["Serpent"],command:"shrugging",order:W,prio:0},slough:{bals_req:["equilibrium","balance","slough"],bals_used:["slough","balance"],blocks:["death","weariness","sleeping"],skills:["Fire Elemental Lord"],command:"slough impurities",order:W,prio:0},fool:{bals_req:["equilibrium","balance","fool"],bals_used:["fool","balance"],blocks:["death","prone","paralysis","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound"],skills:["Occultist"],command:"fling fool at me",order:W,prio:0},alleviate:{bals_req:["equilibrium","balance","alleviate"],bals_used:["alleviate","balance"],blocks:["death","paralysis","sleeping"],skills:["Blademaster"],command:"alleviate",order:W,prio:0}},normalizeCureCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],X=Object.freeze(Object.fromEntries(Object.entries(K).map(([e,t])=>[e,Object.freeze({...t,command:Object.freeze(normalizeCureCommand(t.command))})]))),J=Object.freeze(Object.entries(X).reduce((e,[t,a])=>((Array.isArray(a.order)?a.order:[]).forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e),{})),Z={acrobatics:{command:"acrobatics on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},airpocket:{command:["outr calcite","eat calcite"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},alertness:{static:!0,command:"alertness on",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},antiforce:{command:"intone gaiartha",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],serverside:!0},aria:{command:"sing aria at me",bals_req:["voice"],bals_used:["voice"],blocks:["death","sleeping"],skills:["Bard"]},arctar:{command:"command orb",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Occultist"],serverside:!1,preempt:!0},arrowcatching:{command:"arrowcatch on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},astronomy:{static:!0,command:"astronomy empower me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},"avoid physical":{command:"avoid physical",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid aoe","avoid mental","avoid arcane"]},"avoid aoe":{command:"avoid aoe",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid mental","avoid arcane"]},"avoid mental":{command:"avoid mental",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid arcane"]},"avoid arcane":{command:"avoid arcane",bals_req:["balance","equilibrium","avoid"],bals_used:["avoid"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0,opps:["avoid physical","avoid aoe","avoid mental"]},balancing:{command:"balancing on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},belltattoo:{command:"touch bell",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0,preempt:!0},blindness:{command:["outr arsenic","eat arsenic"],bals_req:["herb"],bals_used:["herb"],blocks:["death","sleeping","anorexia"],serverside:!0},blocking:{command:"block d",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","prone"],serverside:!1,preempt:!0},bloodshield:{command:"activate bloodshield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],serverside:!0,preempt:!0},bodyaugment:{command:"intone mainaas",bals_req:["balance","equilibrium"],bals_used:["word"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},bodyblock:{static:!0,command:"bdb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},boostedregeneration:{command:"boost regeneration",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},bulk:{command:"mutate bulk",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},cloak:{command:"touch cloak",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["prone","death","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},chargeshield:{static:!0,command:"cast chargeshield at me",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},coldresist:{command:"activate cold resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},compoundmask:{command:["wear mask","secure mask"],bals_req:["free"],bals_used:["free"],skills:["Alchemist"],serverside:!1},consciousness:{command:"consciousness on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},constitution:{static:!0,command:"constitution",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},curseward:{static:!0,command:"curseward",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],serverside:!0},deafness:{command:["outr calamine","eat calamine"],bals_req:["herb","deafness"],bals_used:["herb","deafness"],blocks:["death","sleeping","anorexia"],serverside:!0},deathsight:{static:!0,command:"deathsight",bals_req:["balance","equilibrium"],bals_used:["free"],serverside:!0,preempt:!0},deflect:{command:"deflect",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","prone","sleeping"],skills:["Runewarden","Paladin","Infernal","Unnamable"],serverside:!0,preempt:!0},density:{command:"wear shackle",bals_req:["salve"],bals_used:["salve"],blocks:["death","slickness","sleeping"],serverside:!0},devilmark:{static:!0,command:"devilmark",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},diamondskin:{static:!0,command:"cast diamondskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},distortedaura:{static:!0,command:"distortaura",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Occultist"],serverside:!0},dragonarmour:{static:!0,command:"dragonarmour",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],skills:["Dragon"],serverside:!0},dragonbreath:{command:"summon ice",bals_req:["balance","equilibrium","dragonbreath"],bals_used:["free","dragonbreath"],blocks:["death","prone","sleeping"],skills:["Dragon"],preempt:!0,serverside:!0},drunkensailor:{command:"drunkensailor",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},durability:{command:"intone tsuura",bals_req:["balance","equilibrium"],skills:["Depthswalker"],blocks:["death","sleeping","prone"],bals_used:["word"],serverside:!0},electricresist:{command:"activate electric resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},endure:{command:"endure",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0,preempt:!0},enhancedform:{command:["amalgamate enhancement","imbibe enhancement"],bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!1,preempt:!0},evadeblock:{command:"evb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},eyes:{command:"mutate eyes",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},fireresist:{command:"activate fire resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},fangbarrier:{command:"apply quicksilver",bals_req:["salve","sileris"],bals_used:["salve","sileris"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0},fireshroud:{command:"ignite shroud",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","slickness","paralysis","sleeping"],serverside:!0,skills:["Fire Elemental Lord"]},fury:{command:"fury on",bals_req:["balance"],bals_used:["equilibrium"],skills:["Runewarden","Unnamable"],serverside:!0},flying:{command:"fly",bals_req:["balance, equilibrium"],bals_used:["balance"],blocks:["prone","death","sleeping","entangled","transfixation","impaled","webbed","bound"],serverside:!1,clientOnly:!0},ghost:{static:!0,command:"conjure ghost",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},gripping:{command:"grip",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Unnamable","Shikudo","Bard","Blademaster","Jester","Shaman"],serverside:!0,preempt:!0},groundwatch:{command:"groundwatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},"guarding right leg":{command:"guard right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left leg":{command:"guard left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding right leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding right arm":{command:"guard right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right leg","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding left arm":{command:"guard left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding right leg","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding head":{command:"guard head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding right leg","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"guarding torso":{command:"guard torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Monk"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding right leg","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},heartsfury:{command:"heartsfury",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},heldbreath:{command:"hold breath",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","asthma","sleeping"],preempt:!0,serverside:!0},hiding:{command:"hide",bals_req:["equilibrium","balance"],bals_used:["balance"],skills:["Serpent"],serverside:!0},hypersight:{command:"hypersight on",bals_req:["balance"],bals_used:["equilibrium"],serverside:!0},immunity:{command:"immunity",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0},insomnia:{command:"insomnia",bals_req:["free"],bals_used:["free"],blocks:["death","hypersomnia","sleeping"],serverside:!0,preempt:!0},insulation:{command:"apply caloric",bals_req:["salve"],bals_used:["salve"],blocks:["death","sleeping","slickness","hypothermia"],serverside:!0},insufflate:{command:["get phial from pack","amalgamate insufflate potency 4 stability 1","imbibe insufflate"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},ironform:{static:!0,command:["get phial from pack","amalgamate petrifying potency 4 stability 1","imbibe petrifying"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Alchemist"],preempt:!0,serverside:!1},joints:{command:"mutate joints",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},kaiboost:{command:"kai boost",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],preempt:!0,serverside:!0},kaitrance:{command:"kai trance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo"],serverside:!0,preempt:!0},kola:{command:["outr quartz","eat quartz"],bals_req:["free"],bals_used:["free"],blocks:["death","sleeping","anorexia"],serverside:!0,preempt:!0},lay:{command:"sing lay",bals_req:["voice"],bals_used:["voice"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},levitating:{command:"sip levitation",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},lifevision:{static:!0,command:"lifevision",bals_req:["equilibrium"],bals_used:["equilibrium"],serverside:!0},lipreading:{static:!0,command:"lipread",bals_req:["equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},locketdeath:{command:"solicit locket for immortality",bals_req:["free"],bals_used:["free"],serverside:!1},magicresist:{command:"activate magic resistance",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!0},blademastery:{command:"mastery on",bals_req:["balance","equilibrium"],bals_used:["free"],skills:["Runewarden","Unnamable"],preempt:!0,serverside:!0},meditate:{command:"meditate",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","impatience"],preempt:!1,serverside:!1},mercury:{static:!0,command:"educe mercury",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},metabolise:{command:"metabolise paralysis",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],serverside:!1,clientOnly:!0},metawake:{command:"metawake on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping","lullaby"],serverside:!0,preempt:!0},mindcloak:{command:"mind cloak on",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],preempt:!0,skills:["Monk","Shikudo"],serverside:!0},mindnet:{command:"mindnet on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},mindseye:{static:!0,command:"touch mindseye",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},morimbuul:{command:"ldeck draw morimbuul",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],serverside:!1,preempt:!1},mounted:{command:"",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],preempt:!0,serverside:!1,clientOnly:!0},mouths:{command:"mutate mouths",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},nightsight:{command:"nightsight",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},numbness:{command:"numb",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"]},"parrying right leg":{command:"parry right leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","guarding right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left leg":{command:"parry left leg",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","guarding right leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying right arm":{command:"parry right arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","guarding right leg","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying left arm":{command:"parry left arm",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","guarding right leg","parrying right arm","parrying torso","parrying head","parrying left","parrying right","parrying centre"]},"parrying head":{command:"parry head",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","guarding right leg","parrying left","parrying right","parrying centre"]},"parrying torso":{command:"parry torso",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","guarding right leg","parrying head","parrying left","parrying right","parrying centre"]},"parrying left":{command:"trueparry left",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Bard"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","guarding right leg","parrying right","parrying centre"]},"parrying right":{command:"trueparry right",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Bard"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","guarding right leg","parrying centre"]},"parrying centre":{command:"trueparry centre",bals_req:["balance","equilibrium"],bals_used:["free"],preempt:!0,skills:["Bard"],serverside:!1,opps:["guarding left leg","guarding left arm","guarding right arm","guarding torso","guarding head","parrying right leg","parrying left leg","parrying left arm","parrying right arm","parrying torso","parrying head","parrying left","parrying right","guarding right leg"]},pinchblock:{command:"pnb",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping"],skills:["Monk"],serverside:!0},projectiles:{command:"projectiles on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],blocks:["death","sleeping","mounted"],preempt:!0,serverside:!0},poisonresist:{command:"sip venom",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},precision:{command:"intone trusad",bals_req:["balance","equilibrium"],blocks:["death","sleeping","prone"],skills:["Depthswalker"],bals_used:["word"],serverside:!0},prismatic:{command:"strum lyre",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping"],serverside:!1},psitranscend:{command:"psi transcend",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Psion"],blocks:["death","sleeping"],serverside:!0},rebounding:{command:"smoke malachite",bals_req:["smoke","rebounding"],bals_used:["smoke","rebounding"],blocks:["death","asthma","sleeping"],serverside:!0},reflections:{command:"point wand235913 at me",bals_req:["balance","equilibrium"],bals_used:["free"],blocks:["death","sleeping"],preempt:!0,serverside:!1},regeneration:{command:"regeneration on",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo"],blocks:["death","sleeping"],serverside:!0,preempt:!0},resistance:{command:"resistance",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Paladin","Infernal","Monk","Shikudo","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},scales:{static:!0,command:"scales",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0},secondsight:{static:!0,command:"secondsight",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Serpent"],serverside:!0},selfishness:{command:"selfishness",bals_req:["balance","equilibrium"],bals_used:["balance"],serverside:!0},shield:{command:"touch shield",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","prone","sleeping",["brokenleftarm","brokenrightarm"],["brokenleftarm","damagedrightarm"],["brokenleftarm","mangledrightarm"],["damagedleftarm","brokenrightarm"],["damagedleftarm","damagedrightarm"],["damagedleftarm","mangledrightarm"],["mangledleftarm","brokenrightarm"],["mangledleftarm","damagedrightarm"],["mangledleftarm","mangledrightarm"],"entangled","transfixation","impaled","webbed","bound","icefisted"],serverside:!0},shintrance:{command:"shin trance",bals_req:["free"],bals_used:["free"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0,preempt:!0},shinclarity:{static:!0,command:"clarity",bals_req:["balance"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shinbinding:{static:!0,command:"shinbinding on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Blademaster"],blocks:["death","sleeping"],serverside:!0},shipwarning:{command:"shipwarning on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0},shroud:{static:!0,command:"shroud",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Occultist","Serpent"],serverside:!0},softfocusing:{command:"softfocus on",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],serverside:!0,preempt:!0},songbird:{command:"whistle for songbird",bals_req:["equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Bard"]},speed:{command:"sip speed",bals_req:["speed"],bals_used:["speed"],blocks:["death","anorexia","sleeping"],serverside:!0},splitmind:{command:"split mind",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},skysight:{command:"manifest skysight",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},skywatch:{command:"skywatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},stonefist:{static:!0,command:"cast stonefist",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},stoneskin:{static:!0,command:"cast stoneskin",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Magi"],serverside:!0},sulphur:{static:!0,command:"educe sulphur",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping"],skills:["Alchemist"],serverside:!0},tekurastance:{command:"tekurastance",bals_req:["free"],bals_used:["balance"],skills:["Monk","Shikudo"]},telesense:{command:"telesense on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},temperance:{command:"sip frost",bals_req:["free"],bals_used:["free"],blocks:["death","anorexia","sleeping"],serverside:!0,preempt:!0},tempest:{command:"manifest tempest",bals_req:["balance","equilibrium"],bals_used:["balance"],blocks:["death","sleeping","stunned","prone","paralysis","entangled","transfixation","impaled","webbed","bound"],skills:["Air Elemental Lord"],serverside:!0},mutatetentacles:{command:"mutate tentacles",bals_req:["anathema"],bals_used:["anathema"],blocks:["death","sleeping","prone"],skills:["Unnamable"],serverside:!0},thirdeye:{command:"thirdeye",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tin:{static:!0,command:"educe tin",bals_req:["balance"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Alchemist"],serverside:!0},tentacles:{command:"tentacles",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],blocks:["death","sleeping","prone"],skills:["Occultist"],serverside:!0},toughness:{command:"toughness",bals_req:["free"],bals_used:["free"],skills:["Monk","Shikudo","Blademaster"],serverside:!0,preempt:!0},treewatch:{command:"treewatch on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},tune:{command:"sing tune",bals_req:["voice"],bals_used:["voice"],blocks:["death","sleeping"],skills:["Bard"],serverside:!0},twoartsstance:{command:"twoartsstance",bals_req:["free"],bals_used:["free"],blocks:["death","sleeping"],skills:["Blademaster"]},vigilance:{command:"vigilance on",bals_req:["free"],bals_used:["free"],serverside:!0,preempt:!0},vitality:{command:"vitality on",bals_req:["balance","equilibrium"],bals_used:["equilibrium"],skills:["Monk","Shikudo"],serverside:!0},weathering:{command:"weathering on",bals_req:["free"],bals_used:["free"],skills:["Runewarden","Infernal","Paladin","Monk","Shikudo","Blademaster","Unnamable"],blocks:["death","sleeping"],serverside:!0,preempt:!0},weaving:{static:!0,command:"weaving on",bals_req:["balance","equilibrium"],bals_used:["balance"],skills:["Serpent"],serverside:!0}},normalizeDefCommand=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeDefPriority=(e,t)=>{const a=Number(e);return Number.isFinite(a)?a<0?0:a>26?26:a:0},ee=Object.freeze(Object.fromEntries(Object.entries(Z).map(([e,t])=>{const a=!1!==t.serverside;return[e,Object.freeze({...t,command:Object.freeze(normalizeDefCommand(t.command)),bals_req:Object.freeze(normalizeDefList(t.bals_req)),bals_used:Object.freeze(normalizeDefList(t.bals_used)),skills:Object.freeze(normalizeDefList(t.skills)),opps:Object.freeze(normalizeDefList(t.opps)),blocks:Object.freeze(t.blocks?[...t.blocks]:[]),serverside:a,preempt:!0===t.preempt,static:!0===t.static,clientOnly:!0===t.clientOnly,defaultPriority:normalizeDefPriority(t.defaultPriority,a)})]}))),te=Object.freeze(Object.keys(ee).reduce((e,t)=>(e[t]=Number(ee[t].defaultPriority),e),{})),buildDefBySkillIndex=()=>{const e=Object.entries(ee).reduce((e,[t,a])=>{const n=a.skills;return Array.isArray(n)&&n.forEach(a=>{e[a]||(e[a]=[]),e[a].push(t)}),e},{});return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.freeze([...t])])))},re=(buildDefBySkillIndex(),Object.freeze({CHAR_VITALS:"nexsys4.gmcp.char.vitals",CHAR_STATUS:"nexsys4.gmcp.char.status",CHAR_AFFLICTIONS_LIST:"nexsys4.gmcp.char.afflictions.list",CHAR_AFFLICTIONS_ADD:"nexsys4.gmcp.char.afflictions.add",CHAR_AFFLICTIONS_REMOVE:"nexsys4.gmcp.char.afflictions.remove",CHAR_DEFENCES_LIST:"nexsys4.gmcp.char.defences.list",CHAR_DEFENCES_ADD:"nexsys4.gmcp.char.defences.add",CHAR_DEFENCES_REMOVE:"nexsys4.gmcp.char.defences.remove",IRE_RIFT_LIST:"nexsys4.gmcp.ire.rift.list",IRE_RIFT_CHANGE:"nexsys4.gmcp.ire.rift.change",CHAR_ITEMS_LIST:"nexsys4.gmcp.char.items.list",CHAR_ITEMS_DELTA:"nexsys4.gmcp.char.items.delta",ROOM_INFO:"nexsys4.gmcp.room.info",TARGET_INFO:"nexsys4.gmcp.target.info"})),isRecord$4=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),normalizeLocation=e=>String(e??"inv").trim().toLowerCase()||"inv",mergeDefinedRecord=(...e)=>e.reduce((e,t)=>(Object.entries(isRecord$4(t)?t:{}).forEach(([t,a])=>{void 0!==a&&(e[t]=a)}),e),{}),mergeResourceStats=(e=[],t=[])=>{const a=new Map;return[...e,...t].forEach(e=>{const t=String(e?.key||"").trim().toLowerCase();t&&a.set(t,e)}),[...a.values()]},mergeBalancePatches=(e=[],t=[])=>[...Array.isArray(e)?e:[],...Array.isArray(t)?t:[]],mergeStatusPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,status:{...isRecord$4(a.status)?a.status:{},...isRecord$4(n.status)?n.status:{}}}},mergeVitalsPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{},s=isRecord$4(a.vitals)?a.vitals:{},i=isRecord$4(n.vitals)?n.vitals:{};return{...a,...n,vitals:{...s,...i,kind:i.kind||s.kind,vitals:mergeDefinedRecord(s.vitals,i.vitals),balances:mergeDefinedRecord(s.balances,i.balances),balancePatches:mergeBalancePatches(s.balancePatches,i.balancePatches),resourceStats:mergeResourceStats(Array.isArray(s.resourceStats)?s.resourceStats:[],Array.isArray(i.resourceStats)?i.resourceStats:[])}}},mergeTargetPayload=(e={},t={})=>{const a=isRecord$4(e)?e:{},n=isRecord$4(t)?t:{};return{...a,...n,target:mergeDefinedRecord(a.target,n.target)}},ae=new Map([[re.CHAR_STATUS,{keyFor:()=>re.CHAR_STATUS,merge:mergeStatusPayload}],[re.CHAR_VITALS,{keyFor:()=>re.CHAR_VITALS,merge:mergeVitalsPayload}],[re.CHAR_AFFLICTIONS_LIST,{keyFor:()=>re.CHAR_AFFLICTIONS_LIST,merge:(e,t)=>t}],[re.CHAR_DEFENCES_LIST,{keyFor:()=>re.CHAR_DEFENCES_LIST,merge:(e,t)=>t}],[re.CHAR_ITEMS_LIST,{keyFor:({payload:e}={})=>`${re.CHAR_ITEMS_LIST}:${normalizeLocation(e?.location)}`,merge:(e,t)=>t}],[re.IRE_RIFT_LIST,{keyFor:()=>re.IRE_RIFT_LIST,merge:(e,t)=>t}],[re.TARGET_INFO,{keyFor:()=>re.TARGET_INFO,merge:mergeTargetPayload}]]),ne=new Set([re.CHAR_AFFLICTIONS_ADD,re.CHAR_AFFLICTIONS_REMOVE,re.CHAR_DEFENCES_ADD,re.CHAR_DEFENCES_REMOVE,re.CHAR_ITEMS_DELTA,re.IRE_RIFT_CHANGE]),createGmcpBlockBuffer=({coalesce:e=!0}={})=>{const t=[];return{enqueue:(e={})=>{const a=String(e.topic||"").trim();a&&t.push({topic:a,payload:Object.prototype.hasOwnProperty.call(e,"payload")?e.payload:null})},flush:()=>{if(!e){const e=[...t];return t.length=0,e}const a=new Map,n=[],s=[];return t.forEach(e=>{const t=ae.get(e.topic);if(t){const n=t.keyFor(e),s=a.get(n);return void(s?a.set(n,{...s,payload:t.merge(s.payload,e.payload)}):a.set(n,e))}ne.has(e.topic)?s.push(e):n.push(e)}),t.length=0,[...a.values(),...n,...s]},size:()=>t.length}},createEventBus=({label:e="nexSys4.eventBus",debugEnabled:t=!1,traceLimit:a=200}={})=>{const n=new Map,s=new Set;let i=Boolean(t);const o=Math.max(1,Number(a||200)),l=[],pushTrace=(t,a={})=>{if(!i)return null;const n={at:Date.now(),type:t,detail:a};return l.push(n),l.length>o&&l.splice(0,l.length-o),console.log(`[${e}] ${t}`,a),n},on=(e,t)=>{const a=String(e||"").trim();if(!a||"function"!=typeof t)return()=>{};const s=n.get(a)||new Set;return s.add(t),n.set(a,s),pushTrace("on",{topic:a,listenerCount:s.size}),()=>off(a,t)},off=(e,t)=>{const a=String(e||"").trim(),s=n.get(a);if(!a||!s)return!1;const i=s.delete(t);return s.size||n.delete(a),pushTrace("off",{topic:a,removed:i,listenerCount:s.size}),i},onAny=e=>"function"!=typeof e?()=>{}:(s.add(e),pushTrace("onAny",{listenerCount:s.size}),()=>offAny(e)),offAny=e=>{const t=s.delete(e);return pushTrace("offAny",{removed:t,listenerCount:s.size}),t};return{on,off,onAny,offAny,emit:(e,t)=>{const a=String(e||"").trim();if(!a)return 0;const o=[...n.get(a)||[]],l=[...s];return i&&pushTrace("emit",{topic:a,listenerCount:o.length,anyListenerCount:l.length,payload:t}),o.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus handler failed",{topic:a,error:n})}}),l.forEach(e=>{try{e(t,a)}catch(n){console.error("nexSys4 event bus global handler failed",{topic:a,error:n})}}),o.length+l.length},clear:()=>{n.clear(),s.clear()},setDebugEnabled(e){i=Boolean(e)},debugInfo:()=>({label:e,debugEnabled:i,topics:[...n.keys()],anyListenerCount:s.size,recentTrace:[...l]})}},se=Object.freeze({RUNTIME_STARTED:"nexsys4.runtime.started",RUNTIME_STOPPED:"nexsys4.runtime.stopped",RAW_GMCP:"nexsys4.raw.gmcp",SYSTEM_VITALS_CHANGED:"nexsys4.system.vitals.changed",SYSTEM_HEALTH_CHANGED:"nexsys4.system.health.changed",SYSTEM_MANA_CHANGED:"nexsys4.system.mana.changed",SYSTEM_RAGE_CHANGED:"nexsys4.system.rage.changed",SYSTEM_BLEED_CHANGED:"nexsys4.system.bleed.changed",SYSTEM_STATUS_CHANGED:"nexsys4.system.status.changed",SYSTEM_CLASS_CHANGED:"nexsys4.system.class.changed",SYSTEM_TARGET_CHANGED:"nexsys4.system.target.changed",SYSTEM_ROOM_CHANGED:"nexsys4.system.room.changed",SYSTEM_ROOM_ITEMS_CHANGED:"nexsys4.system.room_items.changed",SYSTEM_RUNTIME_CHANGED:"nexsys4.system.runtime.changed",SYSTEM_PAUSE_CHANGED:"nexsys4.system.pause.changed",SYSTEM_PAUSED:"nexsys4.system.paused",SYSTEM_UNPAUSED:"nexsys4.system.unpaused",SYSTEM_LOADED:"nexsys4.system.loaded",SYSTEM_SETTINGS_CHANGED:"nexsys4.system.settings.changed",SYSTEM_BASELINE_CHANGED:"nexsys4.system.baseline.changed",SYSTEM_DEATH_DETECTED:"nexsys4.system.death.detected",SYSTEM_MOUNT_CHANGED:"nexsys4.system.mount.changed",SYSTEM_WIELDED_CHANGED:"nexsys4.system.wielded.changed",UI_CONFIG_CHANGED:"nexsys4.ui.config.changed",AFF_GOT:"nexsys4.aff.got",AFF_LOST:"nexsys4.aff.lost",AFF_STACK_CHANGED:"nexsys4.aff.stack.changed",AFF_PRIORITY_CHANGED:"nexsys4.aff.priority.changed",DEF_GOT:"nexsys4.def.got",DEF_LOST:"nexsys4.def.lost",DEF_PRIORITY_CHANGED:"nexsys4.def.priority.changed",BALANCE_GOT:"nexsys4.balance.got",BALANCE_LOST:"nexsys4.balance.lost",BALANCE_RESET:"nexsys4.balance.reset",BALANCE_DURATION_OBSERVED:"nexsys4.balance.duration.observed",BALANCE_TIMER_RESTARTED:"nexsys4.balance.timer.restarted",EQBAL_GOT:"nexsys4.eqbal.got",LIMB_HIT:"nexsys4.limb.hit",LIMB_RESET:"nexsys4.limb.reset",LIMB_STAGE_CHANGED:"nexsys4.limb.stage.changed",LIMB_DECAY:"nexsys4.limb.decay",CACHE_AMOUNT_CHANGED:"nexsys4.cache.amount.changed",CACHE_INVENTORY_LIST:"nexsys4.cache.inventory.list",CACHE_RIFT_LIST:"nexsys4.cache.rift.list",CACHE_PRECACHE_CHANGED:"nexsys4.cache.precache.changed",ITEM_ROOM_ADDED:"nexsys4.item.room.added",ITEM_ROOM_REMOVED:"nexsys4.item.room.removed",ITEM_ROOM_UPDATED:"nexsys4.item.room.updated",ITEM_ROOM_LIST:"nexsys4.item.room.list",ITEM_INV_ADDED:"nexsys4.item.inv.added",ITEM_INV_REMOVED:"nexsys4.item.inv.removed",ITEM_INV_UPDATED:"nexsys4.item.inv.updated",ITEM_INV_LIST:"nexsys4.item.inv.list",QUEUE_UPDATED:"nexsys4.queue.updated",QUEUE_FLUSHED:"nexsys4.queue.flushed",QUEUE_DEFERRED:"nexsys4.queue.deferred",QUEUE_CLEARED:"nexsys4.queue.cleared",QUEUE_SENT:"nexsys4.queue.sent",QUEUE_FIRED:"nexsys4.queue.fired",QUEUE_FIRED_ACK:"nexsys4.queue.fired.ack",SERVERSIDE_AFF_PRIORITY_SET:"nexsys4.serverside.aff.priority.set",SERVERSIDE_DEF_PRIORITY_SET:"nexsys4.serverside.def.priority.set",SERVERSIDE_DIRTY:"nexsys4.serverside.dirty",SERVERSIDE_EVALUATED:"nexsys4.serverside.evaluated",SERVERSIDE_RULE_CHANGED:"nexsys4.serverside.rule.changed",RULE_ADDED:"nexsys4.rule.added",RULE_REMOVED:"nexsys4.rule.removed",RULE_ENABLED:"nexsys4.rule.enabled",RULE_DISABLED:"nexsys4.rule.disabled",RULE_PACK_LOADED:"nexsys4.rule.pack.loaded",RULE_PACK_UNLOADED:"nexsys4.rule.pack.unloaded",RULE_ORDER_CHANGED:"nexsys4.rule.order.changed",RULE_ACTIVATED:"nexsys4.rule.activated",RULE_DEACTIVATED:"nexsys4.rule.deactivated"}),ie=Object.freeze({IDLE:"IDLE",PROBING_SEPARATOR:"PROBING_SEPARATOR",BOOTING:"BOOTING",PROVISIONING_CURINGSET:"PROVISIONING_CURINGSET",AWAITING_SNAPSHOTS:"AWAITING_SNAPSHOTS",CAPTURING_SNAPSHOTS:"CAPTURING_SNAPSHOTS",RUNNING:"RUNNING",FAILED:"FAILED"}),isRuntimeReadyPhase=e=>e===ie.RUNNING,oe=Object.freeze({OUTPUT_COMPLETE:"SystemOutputCompleteEvent",STARTUP_BEGIN:"CuringStartupBeginEvent",STARTUP_COMPLETE:"CuringStartupCompleteEvent",STARTUP_FINALIZED:"CuringStartupFinalizedEvent",CURINGSET_READY:"CuringSetReadyEvent"}),le=Object.freeze(["IRE.Rift.Request","IRE.Time.Request","Char.Skills.Get","Char.Items.Inv","IRE.Time.Request","Comm.Channel.Players","IRE.Tasks.Request"]),buildStartupSnapshotCommands=()=>[`echo SystemEvent ${oe.STARTUP_BEGIN}`,"curing off","score","date","curing status","curing priority list","curing queue list","curing predictions","curing priority defence list","def","curing on",`echo SystemEvent ${oe.STARTUP_COMPLETE}`],buildStartupSnapshotBurst=()=>({gmcpRequests:[...le],commands:buildStartupSnapshotCommands()}),ce=Object.freeze(["status","affPriorities","defPriorities"]),normalizeTimeoutMs=(e,t=1e3)=>{const a=Number(e);return Number.isFinite(a)&&a>0?Math.floor(a):t},normalizeRetryCount=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)&&a>=0?Math.floor(a):t},createStartupCoordinator=({adapter:e,systemModel:t,serverside:a,persistence:n,seedBaselineFromObservedStartup:s=()=>{},noticeCenter:i,buildPersistenceSnapshot:o,startupTimeoutMs:l=1e3,maxStartupRetries:c=0,publishStartupPhase:u=()=>{},publishLoaded:d=()=>{},releaseStartupPause:m=()=>!1,setRuntimePhase:p=(e,a={})=>{t.setRuntime({phase:e,...a})}})=>{let g=!1,h=0,b=null,y=null;const v=normalizeTimeoutMs(l),S=normalizeRetryCount(c),clearConvergenceTimer=()=>{b&&(e.clearTimeout(b),b=null)},getMissingRequiredTopics=()=>{if("function"==typeof a.getMissingStartupFlags)return a.getMissingStartupFlags(ce);const e=a.getStartupStatus();return ce.filter(t=>!e.flags?.[t])},formatMissingRequiredTopics=(e=[])=>e.length?` Missing required captures: ${e.join(", ")}.`:"",startConvergenceTimer=()=>{clearConvergenceTimer(),b=e.setTimeout(()=>{if(g)return;const e=getMissingRequiredTopics();retryOrFail(e.length?`Startup snapshots did not converge within ${v}ms.`:`Startup closing fence did not arrive within ${v}ms.`,{phase:"snapshot-timeout-retry",source:"startup-timeout",missingRequired:e})},v)},complete=(e="startup-check")=>{clearConvergenceTimer(),p(ie.RUNNING,{startupFailureMessage:""}),s(),n.save(o()),u("startup-complete"),m({source:"startup-complete"}),d({source:"startup-complete",topic:se.SYSTEM_LOADED}),i.publish("output","startup complete",{source:e})},fail=(e,{source:t="startup-failed",missingRequired:a=[]}={})=>{clearConvergenceTimer(),g=!0;const n=`${e}${formatMissingRequiredTopics(a)}`;return p(ie.FAILED,{paused:!0,startupFailureMessage:n}),u("startup-failed"),i.publish("output",n,{force:!0,source:t,title:"startup failed: ",fg:"#fee2e2",bg:"#450a0a",titleFg:"#ffffff",titleBg:"#7f1d1d"}),!1},retryOrFail=(e,{phase:t,source:a,missingRequired:n=[]}={})=>!g&&(h>=S?fail(`${e} Exhausted ${S} startup retr${1===S?"y":"ies"}.`,{source:a,missingRequired:n}):(h+=1,requestSnapshots(y,t||"snapshot-retry",{source:a,retry:h,missingRequired:n}),!1)),requestSnapshots=(t,a="snapshot-request",n={})=>{if(y="function"==typeof t?t:y,"function"!=typeof y)return[];const s={source:"startup-snapshots",phase:a,attempt:h+1,retryCount:h,...n},{gmcpRequests:i,commands:o}=buildStartupSnapshotBurst();p(ie.AWAITING_SNAPSHOTS),u(a),e.sendGmcp(i,s);const l=y(o,s);return startConvergenceTimer(),l};return{reset:()=>{g=!1,h=0,clearConvergenceTimer(),a.resetStartupStatus?.(),p(ie.IDLE,{startupFailureMessage:""})},fail,requestSnapshots,handleFenceBegin:()=>!g&&(p(ie.CAPTURING_SNAPSHOTS),u("snapshot-begin"),!0),handleFenceComplete:(e="snapshot:complete:text")=>{if(g)return!1;u("snapshot-complete");const t=a.getStartupStatus();t.flags.queue||a.updateObservedQueue([]),t.flags.predictions||a.updateObservedPredictions({});const n=getMissingRequiredTopics();return n.length?retryOrFail("Startup closing fence arrived before required snapshots converged.",{phase:"snapshot-retry",source:e,missingRequired:n}):(g=!0,complete(e),!0)},dispose(){clearConvergenceTimer()},isResolved:()=>g}},ue="nexsys4-default",normalizeCommand=e=>String(e||"").trim().toLowerCase().replace(/\s+/g," "),isServersideCommand=e=>{const t=normalizeCommand(e);return t.startsWith("curing ")||t.startsWith("curingset ")},normalizeSetName=e=>String(e||"").trim().toLowerCase(),toNumberMaybe=e=>{if("number"==typeof e&&Number.isFinite(e))return e;const t=Number(e);return Number.isFinite(t)?t:e},normalizeBoolean=e=>{if("boolean"==typeof e)return e;const t=String(e||"").trim().toLowerCase();return!!["on","yes","true","activated","enabled"].includes(t)||!["off","no","false","disabled"].includes(t)&&Boolean(e)},normalizeStatusValue=(e,t)=>{switch(e){case"enabled":case"reporting":case"afflictions":case"defences":case"sipping":case"transmutation":case"focus":case"useVault":case"clot":case"fallback":case"kaidoTransmute":case"customAffPriority":case"customDefPriority":case"batch":case"insomnia":return normalizeBoolean(t);case"focusOverHerbs":{if("boolean"==typeof t)return t;const e=String(t||"").trim().toLowerCase();return!!["focus","first","yes","on","true"].includes(e)||!["herbs","second","no","off","false"].includes(e)&&Boolean(t)}case"tree":{if("custom"===t)return"custom";if("boolean"==typeof t)return t?"on":"off";const e=String(t||"").trim().toLowerCase();return["custom","on","off"].includes(e)?e:["yes","activated","enabled","true"].includes(e)?"on":["no","disabled","false"].includes(e)?"off":e||"off"}case"sipPriority":return"mana"===String(t||"").trim().toLowerCase()?"mana":"health";default:return toNumberMaybe(t)}},createServersideContext=({affModel:e,defModel:t,balanceModel:a,systemModel:n,trackables:s,cureTable:i={},now:o})=>{const l=n.getRoom().items||{};let c=null;const getSortedActiveAffs=()=>(null===c&&(c="function"==typeof e.currentSorted?e.currentSorted():[]),c),u=new Map,isTarget=e=>Array.isArray(e)?e.some(e=>isTarget(e)):"function"==typeof n.isTarget&&n.isTarget(e);return{haveAff:t=>e.haveAff(t),haveAffs:(t=[])=>e.haveAffs(t),haveAnAff:(t=[])=>e.haveAnAff(t),affCount:t=>Number(e.get?.(t)?.count||0),cureAffCount:t=>{const a=String(t||"");if(u.has(a))return u.get(a);const n=i?.[a]?.order;let s=0;if(Array.isArray(n))for(const i of n)e.haveAff(i)&&(s+=1);return u.set(a,s),s},affElapsed:t=>e.elapsed(t),sortedActiveAffs:getSortedActiveAffs,haveDef:e=>t.haveDef(e),haveDefs:(e=[])=>e.every(e=>t.haveDef(e)),haveADef:(e=[])=>e.some(e=>t.haveDef(e)),haveBal:e=>a.have(e),haveBals:(e=[])=>e.every(e=>a.have(e)),haveABal:(e=[])=>e.some(e=>a.have(e)),balElapsed:e=>a.elapsed(e),suspendCuring:(e={})=>({...e&&"object"==typeof e?e:{},suspendCuring:!0}),trackableElapsed:e=>{const t=s[e];return t?.have?o()-t.since:Number.POSITIVE_INFINITY},roomHasItem:e=>Boolean(l[e]),isTarget,isClass:e=>n.isClass(e)}},buildCountablePriorityDefaults=e=>"function"!=typeof e.getCountablePriorityNames?{}:e.getCountablePriorityNames().reduce((e,t)=>(e[t]=0,e),{}),normalizeServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26?t:0},isServersideAffPriorityNumber=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},canonicalAffPriority=e=>{const t=normalizeServersideAffPriority(e);return 26===t?0:t},buildBaselineAffPriorities=e=>({...e.list().reduce((t,a)=>(t[a]=normalizeServersideAffPriority(e.getPriority(a)),t),{}),...buildCountablePriorityDefaults(e)}),buildObservedAffPriorities=e=>({...e.list().reduce((e,t)=>(e[t]=0,e),{}),...buildCountablePriorityDefaults(e)}),buildBaselineDefPriorities=(e,t="")=>e.list().reduce((a,n)=>{const s=e.get(n);return!s?.serverside||s.static?a:e.isAvailableForClass(n,t)?(a[n]=e.getPriority(n),a):a},{}),buildObservedDefPriorities=(e,t="")=>e.list().reduce((a,n)=>e.get(n)?.serverside&&e.isAvailableForClass(n,t)?(a[n]=0,a):a,{}),buildBaselineCurePriorities=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Number(a.prio||0),e),{}),mergeWithResets=(e,t={})=>{const a={...e};return Object.entries(t).forEach(([t,n])=>{a[t]="RESET"!==n?n:e[t]}),a},createInitialServersideState=({baselineSettings:e,affModel:t,defModel:a,systemModel:n,cureTable:s})=>{const i=n?.getClass?.()||"",o=buildBaselineAffPriorities(t),l=buildBaselineDefPriorities(a,i),c=buildBaselineCurePriorities(s);return{baseline:{settings:{...e},affPriorities:o,defPriorities:l,curePriorities:c},sessionBaseline:{settings:{...e},affPriorities:{...o},defPriorities:{...l},curePriorities:{...c}},derived:{},desired:{},observed:{settings:{...e},affPriorities:buildObservedAffPriorities(t),defPriorities:buildObservedDefPriorities(a,i),curePriorities:buildBaselineCurePriorities(s),prioAff:null,manualQueue:[],predictions:{},prioritySet:""},pending:new Map,capture:{affPriorities:null,defPriorities:null,prioritySet:""},transient:{prioAff:null,manualQueue:[],predictions:{},predictionCommands:[],predictionRequests:[],staticDefRequests:{},fullPriorityReset:!1},diagnostics:{lastCommands:[],lastReasons:[],desyncCounter:0,recoveryCounter:0,commandRepeatCounter:0},curingsets:{sets:[],activeSet:"",priorSet:"",used:0,limit:0},startup:{flags:{status:!1,affPriorities:!1,defPriorities:!1,queue:!1,predictions:!1,curingsets:!1}},lastDiffCommands:[],rules:[],dirty:!0}},createCuringSetProvisioner=({adapter:e,serverside:t,dispatchCommands:a,setRuntimePhase:n=()=>{},publishStartupPhase:s=()=>{},options:i={}}={})=>{const o=`echo SystemEvent ${oe.CURINGSET_READY}`,l=Math.max(50,Number(i.curingSetProvisionTimeoutMs??i.startupTimeoutMs??1e3)),c=Math.max(1,Number(i.maxCuringSetProvisionAttempts??4));let u=!1,d=0,m=!1,p=null,g={onReady:()=>{},onAbort:()=>{}};const clearTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},settle=()=>{u=!1,clearTimer()},finishReady=()=>{const{onReady:e}=g;settle(),e({createdThisRun:m})},finishAbort=e=>{const{onAbort:t}=g;settle(),t(e)},sendProbe=(t,n)=>{clearTimer(),d+=1,a([...t,"curingset list",o],{source:"curingset-provision",reason:n,attempt:d}),p=e?.setTimeout?.(()=>{u&&finishAbort(`nexSys4 could not confirm its curing set within ${l}ms (no response from the game). Reload to retry.`)},l)},handleBarrier=()=>{if(!u)return;clearTimer();const e=t.getCuringSets?.()??{},a=(e.sets||[]).map(e=>normalizeSetName(e)),n=normalizeSetName(e.activeSet),s=Number(e.used||0),i=Number(e.limit||0),o=a.includes(ue);"nexsys4-default"!==n?d>=c?finishAbort(`nexSys4 could not secure its curing set after ${c} attempts. Reload to retry.`):o?sendProbe([`curingset switch ${ue}`],"switch"):i>0&&s>=i?finishAbort(`nexSys4 needs its own curing set but all ${i} slots are full. Delete a set or CURINGSET EXPAND (25cr), then reload.`):(m=!0,sendProbe([`curingset new ${ue}`,`curingset switch ${ue}`],"create")):finishReady()};return{start({onReady:e=()=>{},onAbort:t=()=>{}}={}){g={onReady:e,onAbort:t},u=!0,d=0,m=!1,n(ie.PROVISIONING_CURINGSET),s("provision-curingset"),sendProbe([],"list")},handleBarrier,wasCreatedThisRun:()=>m,isActive:()=>u,dispose(){settle()}}},de=Object.freeze({STARTED:"nexSys.start(): startup initiated.",ALREADY_STARTED:"nexSys.start(): runtime is already started.",STARTUP_PENDING:"nexSys.start(): runtime is already started; startup is still in progress.",STARTUP_FAILED:"nexSys.start(): runtime startup failed. Check the console and in-game notices.",SEPARATOR_PROBE:"nexSys.start(): command separator unknown; sending config to auto-detect. Startup will resume on capture."}),me=Object.freeze(["config","more","more"]),createRuntimeStartupOrchestrator=({adapter:e,systemModel:t,persistenceApi:a,startup:n,curingSetProvisioner:s,noticeCenter:i,syncDebugMode:o,isStarted:l,markStarted:c,setRuntimePhase:u,publishStartupPhase:d,attachEventWiring:m,promptPresenter:p,publishRuntimeStarted:g,hydrateCacheFromAdapterGmcp:h,commandDispatcher:b,debugOverride:y})=>{let v=null;const continueStartup=()=>{c(),u(ie.BOOTING,{startupFailureMessage:""}),d("init"),g(),m(),p.start(),h(),s.start({onReady:()=>{n.requestSnapshots(b.sendCommands)},onAbort:e=>{n.fail(e,{source:"curingset-provision"})}})};return{dispose(){v&&(v(),v=null),s?.dispose?.()},start(){if(l()){const e=t.getRuntime().phase;return e===ie.FAILED?de.STARTUP_FAILED:e===ie.RUNNING?de.ALREADY_STARTED:de.STARTUP_PENDING}if(v)return de.SEPARATOR_PROBE;t.setSettings({commandSeparator:void 0},{setBaseline:!0}),a.loadPersistence(),void 0!==y&&t.setSettings({debug:Boolean(y)},{setBaseline:!0}),n.reset();const s=normalizeCommandSeparator(t.getSettings().commandSeparator),c=normalizeCommandSeparator(e.getCommandSeparator()),m=s||c;return o(),m?(t.getSettings().commandSeparator!==m&&t.setSettings({commandSeparator:m},{setBaseline:!0}),c!==m&&e.setSeparator?.(m),continueStartup(),de.STARTED):(u(ie.PROBING_SEPARATOR),d("separator-probe"),i.publish("output","Command separator not configured. Sending config to auto-detect...",{source:"separator-probe"}),v=e.addOnceTrigger({id:"nexsys4-separator-probe",regex:/\bCommandSeparator\s+(?<sep>\S+)/,action:({args:a,client:n})=>{const s=normalizeCommandSeparator(String(a.groups?.sep||"").trim());s&&(n?.current_block?.forEach(e=>{e.gag=!0}),v=null,e.setSeparator(s),t.setSettings({commandSeparator:s},{setBaseline:!0}),continueStartup())}}),me.forEach(t=>{e.send([t],{source:"separator-probe"})}),de.SEPARATOR_PROBE)}}},pe=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],ge="nexsys4.parsed_gmcp_vitals",hasOwn$6=(e,t)=>Boolean(e)&&Object.prototype.hasOwnProperty.call(e,t),parseNumericVital=(e,t)=>{if(!hasOwn$6(e,t))return;const a=toNumber(e[t],NaN);return Number.isFinite(a)?a:void 0},parseResourceStat=e=>{const[t,a]=String(e).split(":");if(!t||void 0===a)return null;const n=t.trim().toLowerCase(),s=a.trim();if(!n)return null;const i=toNumber(s.endsWith("%")?s.slice(0,-1):s,NaN),o=toOptionalBooleanFromYesNo(s);return{key:n,value:Number.isFinite(i)?i:s,balanceState:Number.isFinite(i)?void 0:o}},toBalancePatches=(e={})=>Object.entries(e).filter(([,e])=>void 0!==e).map(([e,t])=>({id:e,have:t})),parseGmcpVitals=(e={})=>{const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},a=pe.reduce((e,a)=>({...e,[a]:parseNumericVital(t,a)}),{}),n={balance:toOptionalBooleanFromYesNo(t.bal),equilibrium:toOptionalBooleanFromYesNo(t.eq)};return{kind:ge,vitals:a,balances:n,balancePatches:toBalancePatches(n),resourceStats:(Array.isArray(t.charstats)?t.charstats:[]).map(parseResourceStat).filter(Boolean)}},toParsedGmcpVitals=(e={})=>"nexsys4.parsed_gmcp_vitals"!==e?.kind?parseGmcpVitals(e):{...e,balancePatches:Array.isArray(e.balancePatches)?e.balancePatches:toBalancePatches(e.balances||{})},hasOwn$5=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),isRecord$3=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),readFirstDefined=(e,t=[])=>{for(const a of t)if(hasOwn$5(e,a)&&void 0!==e[a]&&null!==e[a])return e[a]},parseAffName=(e={})=>{if("string"==typeof e)return e.toLowerCase();if(Array.isArray(e)){const t=e[0];if("string"==typeof t)return t.toLowerCase();const a=t&&"object"==typeof t?t:{};return String(a.affliction||a.defence||a.name||a.aff||a.def||"").toLowerCase()}const t=e&&"object"==typeof e?e:{};return String(t.affliction||t.defence||t.name||t.aff||t.def||"").toLowerCase()},parseRoomItems=(e={})=>Array.isArray(e?.items)?e.items.reduce((e,t)=>{const a=String(t?.name||t?.item||"").trim();return a?(e[a]=(e[a]||0)+1,e):e},{}):e?.items&&"object"==typeof e.items?{...e.items}:{},normalizeItemLocation$2=(e={},t=e?.item||e)=>String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),normalizeInventoryDeltaName=e=>"string"==typeof e?e:e?.name||e?.item||"",createInventoryDelta=(e,t={})=>{const a=t?.item||t,n=normalizeItemLocation$2(t,a);return{location:n,inventoryDelta:{id:a?.id??t?.id,location:n,name:normalizeInventoryDeltaName(a),icon:a?.icon??null,attrib:a?.attrib??null,amount:a?.amount??a?.count??a?.qty??t?.amount??t?.count,delta:a?.delta??t?.delta,action:e.split(".").pop(),direction:e.endsWith("remove")?"remove":e.endsWith("add")?"add":void 0},dirtyReason:`gmcp:${e}`}},hasInventoryIdentity=(e={})=>void 0!==e.id&&null!==e.id&&""!==e.id||Boolean(String(e.name||"").trim()),normalizeTargetRecord=(e={})=>{if(!isRecord$3(e))return{};const t={},a=readFirstDefined(e,["id","ID"]),n=readFirstDefined(e,["Text","text","short_desc"]),s=readFirstDefined(e,["HP","hp","hpperc"]);return void 0!==a&&(t.id=a),void 0!==n&&(t.text=n),void 0!==s&&(t.hp=s),t},createGmcpApplier=({emit:e=()=>{}}={})=>{const translate=(e={})=>{const t=[],emitTranslated=(e,a)=>{t.push({topic:e,payload:a})},a=normalizeTag(e.tag||e.rawTag||e.gmcp_method),n=e.payload;switch(a){case"char.vitals":emitTranslated(re.CHAR_VITALS,{vitals:parseGmcpVitals(n||{})});break;case"char.status":emitTranslated(re.CHAR_STATUS,{status:n||{}});break;case"char.afflictions.list":emitTranslated(re.CHAR_AFFLICTIONS_LIST,{afflictions:Array.isArray(n)?n:[]});break;case"char.afflictions.add":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_AFFLICTIONS_ADD,{name:e});break}case"char.afflictions.remove":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_AFFLICTIONS_REMOVE,{name:e});break}case"char.defences.list":emitTranslated(re.CHAR_DEFENCES_LIST,{defences:Array.isArray(n)?n:[]});break;case"char.defences.add":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_DEFENCES_ADD,{name:e});break}case"char.defences.remove":{const e=parseAffName(n);e&&emitTranslated(re.CHAR_DEFENCES_REMOVE,{name:e});break}case"ire.rift.list":emitTranslated(re.IRE_RIFT_LIST,{rift:n||{}});break;case"ire.rift.change":emitTranslated(re.IRE_RIFT_CHANGE,{change:n||{}});break;case"char.items.list":emitTranslated(re.CHAR_ITEMS_LIST,{location:normalizeItemLocation$2(n),items:Array.isArray(n?.items)?n.items:[]});break;case"char.items.add":case"char.items.remove":case"char.items.update":{const e=createInventoryDelta(a,n||{}),t=hasInventoryIdentity(e.inventoryDelta)?e.inventoryDelta:null;emitTranslated(re.CHAR_ITEMS_DELTA,{inventoryDelta:t,dirtyReason:e.dirtyReason});break}case"room.info":emitTranslated(re.ROOM_INFO,{room:n||{},roomItems:parseRoomItems(n||{})});break;case"ire.target.info":emitTranslated(re.TARGET_INFO,{target:normalizeTargetRecord(n||{})})}return t};return{translate,apply(t){translate(t).forEach(({topic:t,payload:a})=>{e(t,a)})}}},fe=Object.freeze({inv:se.ITEM_INV_LIST,room:se.ITEM_ROOM_LIST}),he=Object.freeze({inv:Object.freeze({add:se.ITEM_INV_ADDED,remove:se.ITEM_INV_REMOVED,update:se.ITEM_INV_UPDATED}),room:Object.freeze({add:se.ITEM_ROOM_ADDED,remove:se.ITEM_ROOM_REMOVED,update:se.ITEM_ROOM_UPDATED})}),normalizeItemLocation$1=e=>String(e||"").trim().toLowerCase()||"inv",createItemTopicNotifier=({publishPublic:e=()=>{}}={})=>{const notifyList=(t,a)=>{const n=fe[normalizeItemLocation$1(t)];n&&e(n,{location:normalizeItemLocation$1(t),items:Array.isArray(a)?a:[]})},notifyDelta=t=>{const a=normalizeItemLocation$1(t.location),n=String(t.action||t.direction||"").trim().toLowerCase(),s=he[a]?.[n];s&&e(s,t)};return{notify({topic:e,payload:t}={}){e!==re.CHAR_ITEMS_DELTA?e===re.CHAR_ITEMS_LIST&&notifyList(t?.location,t?.items):t?.inventoryDelta&&notifyDelta(t.inventoryDelta)}}},be=Object.freeze(["physical","aoe","mental","arcane"]),ye="avoid",avoidDefId=e=>`avoid ${e}`,normalizeType=e=>String(e||"").trim().toLowerCase(),applyAvoidPostureShift=({defModel:e,balanceModel:t,type:a,source:n="text-avoid-shift"})=>{const s=normalizeType(a);if(!be.includes(s))return!1;const i=avoidDefId(s);return be.forEach(t=>{const a=avoidDefId(t);a!==i&&e.get(a)?.have&&e.setHave(a,!1,n)}),e.setHave(i,!0,n),t.lose(ye,`shift:${s}`),!0},applyAvoidPostureRecovered=({balanceModel:e,source:t="posture-ready"})=>e.gain(ye,t),applyAvoidPostureBlocked=({balanceModel:e,source:t="posture-blocked"})=>!!e.have(ye)&&e.lose(ye,t),fallbackClone=(e,t=new WeakMap)=>{if(null==e)return e;if("object"!=typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){const a=[];return t.set(e,a),e.forEach(e=>a.push(fallbackClone(e,t))),a}if(e instanceof Set){const a=new Set;return t.set(e,a),[...e].forEach(e=>a.add(fallbackClone(e,t))),a}if(e instanceof Map){const a=new Map;return t.set(e,a),[...e.entries()].forEach(([e,n])=>{a.set(fallbackClone(e,t),fallbackClone(n,t))}),a}const a={};return t.set(e,a),Object.entries(e).forEach(([e,n])=>{"function"!=typeof n&&(a[e]=fallbackClone(n,t))}),a},deepClone$1=e=>{if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return fallbackClone(e)}},deepMerge=(e,t)=>{const a=Array.isArray(e)?[...e]:{...e||{}};return Object.entries(t||{}).forEach(([e,t])=>{!t||"object"!=typeof t||Array.isArray(t)||!a[e]||"object"!=typeof a[e]||Array.isArray(a[e])?a[e]=t:a[e]=deepMerge(a[e],t)}),a},deepFreeze=e=>e&&"object"==typeof e?(Object.isFrozen(e)||(Object.freeze(e),Object.keys(e).forEach(t=>deepFreeze(e[t]))),e):e,createSnapshotCache=({getVersion:e=()=>0,buildSnapshot:t=()=>({})}={})=>{let a=NaN,n=null;return()=>{const s=e();return n&&a===s||(a=s,n=deepFreeze(t())),n}},ve=Object.freeze(["head","torso","leftarm","rightarm","leftleg","rightleg"]),Se=Object.freeze({healthy:0,damaged:1,broken:2,mangled:3}),xe=new Set(Object.keys(Se)),Ce=Object.freeze({head:"head",torso:"torso",leftarm:"leftarm",rightarm:"rightarm",leftleg:"leftleg",rightleg:"rightleg"}),ke={brokenleftarm:{limb:"leftarm",stage:"broken"},brokenrightarm:{limb:"rightarm",stage:"broken"},brokenleftleg:{limb:"leftleg",stage:"broken"},brokenrightleg:{limb:"rightleg",stage:"broken"},damagedhead:{limb:"head",stage:"damaged"},damagedleftarm:{limb:"leftarm",stage:"damaged"},damagedrightarm:{limb:"rightarm",stage:"damaged"},damagedleftleg:{limb:"leftleg",stage:"damaged"},damagedrightleg:{limb:"rightleg",stage:"damaged"},mangledhead:{limb:"head",stage:"mangled"},mangledleftarm:{limb:"leftarm",stage:"mangled"},mangledrightarm:{limb:"rightarm",stage:"mangled"},mangledleftleg:{limb:"leftleg",stage:"mangled"},mangledrightleg:{limb:"rightleg",stage:"mangled"},mildtrauma:{limb:"torso",stage:"damaged"},serioustrauma:{limb:"torso",stage:"mangled"}},normalizeLimbId=e=>{const t=String(e||"").trim().toLowerCase().replace(/\s+/g,"");return Ce[t]||t},buildAfflictionStageSnapshot=(e=[])=>{const t=ve.reduce((e,t)=>(e[t]="healthy",e),{});return e.forEach(e=>{const a=ke[String(e||"").trim().toLowerCase()];if(!a)return;const n=t[a.limb]||"healthy";(Se[a.stage]??0)>(Se[n]??0)&&(t[a.limb]=a.stage)}),t},createLimbModel=({now:e=Date.now,setTimeoutFn:t,clearTimeoutFn:a,damageResetMs:n=18e4}={})=>{const s=new Set;let i=0;const o=new Map,l=new Map,c=ve.reduce((t,a)=>(t[a]={id:a,percent:0,hits:0,stage:"healthy",updatedAt:e()},t),{}),emit=(e,t)=>{i+=1,t?.limb&&o.set(t.limb,(o.get(t.limb)??0)+1),s.forEach(a=>a(e,t))},cancelResetTimer=e=>{const t=l.get(e);null!=t&&(a(t),l.delete(e))},scheduleResetTimer=a=>{cancelResetTimer(a);const s=t(()=>{l.delete(a);const t=c[a];!t||t.percent<=0||(t.percent=0,t.hits=0,t.updatedAt=e(),emit("LimbDecay",{limb:a,value:deepClone$1(t)}))},n);l.set(a,s)},buildEntrySnapshot=(e={})=>({id:e.id,percent:e.percent,hits:e.hits,stage:e.stage,updatedAt:e.updatedAt}),u=new Map,getEntrySnapshot=e=>c[e]?(u.has(e)||u.set(e,createSnapshotCache({getVersion:()=>o.get(e)??0,buildSnapshot:()=>buildEntrySnapshot(c[e])})),u.get(e)()):null,d=createSnapshotCache({getVersion:()=>i,buildSnapshot:()=>ve.reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),setStage=(t,a,n="manual")=>{const s=normalizeLimbId(t),i=String(a||"").trim().toLowerCase();if(!c[s]||!xe.has(i))return!1;if(c[s].stage===i)return!1;const o=c[s],l=o.stage;return o.stage=i,o.percent=0,o.hits=0,o.updatedAt=e(),cancelResetTimer(s),emit("LimbStageChanged",{limb:s,stage:i,previousStage:l,source:n,value:deepClone$1(o)}),!0},applyAfflictionTransition=(e,t)=>{const a=ke[String(e||"").toLowerCase()];return!!a&&(t?(setStage(a.limb,a.stage,"affliction"),!0):"damaged"===a.stage?(setStage(a.limb,"healthy","affliction"),!0):"mangled"===a.stage?(setStage(a.limb,"damaged","affliction"),!0):"broken"===a.stage&&(setStage(a.limb,"healthy","affliction"),!0))},syncFromAfflictions=(e=[],t="affliction-list")=>{const a=buildAfflictionStageSnapshot(e);return ve.reduce((e,n)=>a[n]===c[n].stage?e:setStage(n,a[n],t)||e,!1)};return{onChange:e=>(s.add(e),()=>s.delete(e)),list:()=>[...ve],snapshot:()=>d(),hit:(t,a,n="manual")=>{const s=normalizeLimbId(t),i=Number(a);if(!c[s]||!Number.isFinite(i)||i<=0)return!1;const o=c[s],l=o.stage;o.percent=Math.max(0,o.percent+i),o.hits+=1,o.updatedAt=e();let u=null;return"healthy"===o.stage&&o.percent>=100?(o.stage="damaged",o.percent=0,o.hits=0,u="damaged",cancelResetTimer(s)):"damaged"===o.stage&&o.percent>=100?(o.stage="mangled",o.percent=0,o.hits=0,u="mangled",cancelResetTimer(s)):scheduleResetTimer(s),emit("LimbHit",{limb:s,amount:i,source:n,transition:u,previousStage:l,value:deepClone$1(o)}),u&&emit("LimbStageChanged",{limb:s,stage:o.stage,previousStage:l,source:n,value:deepClone$1(o)}),!0},reset:(t,a="manual")=>{const n=normalizeLimbId(t);if(!c[n])return!1;const s=c[n],i=s.stage;return(0!==s.percent||0!==s.hits||"healthy"!==i)&&(s.percent=0,s.hits=0,s.stage="healthy",s.updatedAt=e(),cancelResetTimer(n),emit("LimbReset",{limb:n,source:a,previousStage:i,value:deepClone$1(s)}),"healthy"!==i&&emit("LimbStageChanged",{limb:n,stage:"healthy",previousStage:i,source:a,value:deepClone$1(s)}),!0)},setStage,applyAfflictionTransition,syncFromAfflictions,dispose(){ve.forEach(cancelResetTimer)},get:e=>getEntrySnapshot(normalizeLimbId(e))}},buildLimbSnapshot=(e,t)=>{const a=e?.get?.(t);return a?{id:a.id,percent:a.percent,hits:a.hits,stage:a.stage}:null},didLimbChange=(e,t)=>Boolean(e&&t)&&(e.percent!==t.percent||e.hits!==t.hits||e.stage!==t.stage),syncTorsoTrauma=({affModel:e,serverside:t,stage:a,source:n,at:s})=>{switch(a){case"damaged":return e?.lose?.("serioustrauma",{source:n,at:s}),e?.got?.("mildtrauma",{source:n,at:s}),t?.removePrediction?.("serioustrauma"),t?.addPrediction?.("mildtrauma"),!0;case"mangled":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.got?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.addPrediction?.("serioustrauma"),!0;case"healthy":return e?.lose?.("mildtrauma",{source:n,at:s}),e?.lose?.("serioustrauma",{source:n,at:s}),t?.removePrediction?.("mildtrauma"),t?.removePrediction?.("serioustrauma"),!0;default:return!1}},buildObserveResult=(e,t,a,n=!1)=>({changed:didLimbChange(t,a)||n,traumaSynced:n,stageChanged:t?.stage!==a?.stage,limb:e,before:t,after:a}),applyObservedLimbHit=({limbModel:e,affModel:t,serverside:a,limb:n,amount:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return{changed:!1,traumaSynced:!1,stageChanged:!1,limb:l,before:null,after:null};e.hit(l,s,i);const u=buildLimbSnapshot(e,l),d=didLimbChange(c,u),m=c.stage!==u?.stage,p=!("torso"!==l||!m)&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o});return{changed:d||p,traumaSynced:p,stageChanged:m,limb:l,before:c,after:u}},applyObservedLimbReset=({limbModel:e,affModel:t,serverside:a,limb:n,source:s="manual",at:i})=>{const o=normalizeLimbId(n),l=buildLimbSnapshot(e,o);return l?(e.reset(o,s),buildObserveResult(o,l,buildLimbSnapshot(e,o),"torso"===o&&syncTorsoTrauma({affModel:t,serverside:a,stage:"healthy",source:s,at:i}))):{changed:!1,traumaSynced:!1,stageChanged:!1,limb:o,before:null,after:null}},applyObservedLimbStage=({limbModel:e,affModel:t,serverside:a,limb:n,stage:s,source:i="manual",at:o})=>{const l=normalizeLimbId(n),c=buildLimbSnapshot(e,l);if(!c)return{changed:!1,traumaSynced:!1,stageChanged:!1,limb:l,before:null,after:null};e.setStage(l,s,i);const u=buildLimbSnapshot(e,l),d=c.stage!==u?.stage,m=!("torso"!==l||!d)&&syncTorsoTrauma({affModel:t,serverside:a,stage:u?.stage,source:i,at:o});return{changed:didLimbChange(c,u)||m,traumaSynced:m,stageChanged:d,limb:l,before:c,after:u}},Ae=new Set(["char.items.add","char.items.remove","char.items.update"]),registerAdapterEvents=({register:e,options:t,queueTranslatedGmcp:a,publishPublic:n,publishPublicScoped:s,markDirty:i,flushCycle:o,outputCycle:l,startup:c,curingSetProvisioner:u,curingSetGuard:d,curingMasterSwitch:m,queueController:p,serverside:g,balanceModel:h,defModel:b,adapter:y,systemModel:v,affModel:S,cacheModel:x,limbModel:C,savePersistence:k})=>{e("GmcpEvent",e=>{a(e);const s=normalizeTag(e?.tag||e?.rawTag||e?.gmcp_method);!0===t.publishRawGmcp&&n(se.RAW_GMCP,{source:"adapter-gmcp",tag:s,payload:e?.payload??e?.gmcp_args??null}),Ae.has(s)||i("gmcp-buffered")}),e("PromptEvent",()=>o("prompt")),e("ForcePopulateEvent",()=>o("force")),e("SystemOutputCompleteEvent",()=>{l.markComplete()&&o("output-complete")}),e(oe.CURINGSET_READY,()=>{u?.handleBarrier()}),e(oe.STARTUP_BEGIN,()=>{c.handleFenceBegin()}),e(oe.STARTUP_COMPLETE,()=>{c.handleFenceComplete("snapshot:complete:text")}),e("QueueFiredTextEvent",e=>{e?.queueName&&p.acknowledgeFired(e.queueName)}),e("QueueSentTextEvent",e=>{const t=e?.queueId||e?.queueName||e?.queueType;t&&p.acknowledgeSent(t,e)}),e("AllQueuesClearedTextEvent",()=>{p.listQueues().forEach(e=>{p.clear(e)})}),e("CommandSeparatorChangedTextEvent",({separator:e}={})=>{const t=normalizeCommandSeparator(e);t&&(y?.setSeparator(t),v?.setSettings({commandSeparator:t},{setBaseline:!0}),k?.())}),e("CharacterResourceTextEvent",(e={})=>{const t=String(e.key||"").trim().toLowerCase();t&&v?.updateResource?.(t,e.value,{numeric:!0,min:e.min,max:e.max,source:e.source||"text-trigger"})&&i(`text:resource:${t}`)}),e("BalanceStateTextEvent",e=>{const t=String(e?.id||"").trim().toLowerCase();if(!t)return;const a=String(e?.reason||e?.source||"text"),n=Number(e?.durationSeconds);if(!0!==e?.have){if(!1===e?.have){if(Number.isFinite(n)&&n>0)return void h.observeServerUse(t,n,{source:a});h.lose(t,a)}}else h.gain(t,a)}),e("AvoidPostureShiftedTextEvent",e=>{applyAvoidPostureShift({defModel:b,balanceModel:h,type:e?.type})&&i(`text:avoid:${String(e?.type||"").toLowerCase()}`)}),e("AvoidPostureRecoveredTextEvent",()=>{applyAvoidPostureRecovered({balanceModel:h})}),e("AvoidPostureBlockedTextEvent",()=>{applyAvoidPostureBlocked({balanceModel:h})}),e("CacheRiftOutTextEvent",(e={})=>{const t=x?.observeRiftOutText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-out:${t.name}`)}),e("CacheRiftInTextEvent",(e={})=>{const t=x?.observeRiftInText?.({item:e.item,amount:e.amount,riftAmount:e.riftAmount,atCapacity:e.atCapacity,source:e.source||"text-trigger"});t?.name&&i(`text:cache-rift-in:${t.name}`)}),e("CacheRiftFullTextEvent",(e={})=>{const t=x?.invalidateRiftSnapshot?.({source:e.source||"text-trigger"});y?.sendGmcp?.(["IRE.Rift.Request"],{source:"cache-rift-full-text"}),t&&i("text:cache-rift-resync")}),e("CacheInventoryEmptyTextEvent",(e={})=>{const t=x?.observeInventoryEmptyText?.({item:e.item,source:e.source||"text-trigger"});t?.name&&(i(`text:cache-empty:${t.name}`),y?.sendGmcp?.(["Char.Items.Inv"],{source:"cache-inventory-empty-text",item:e.item||"",name:t.name}))}),e("CacheCurativeConsumedTextEvent",(e={})=>{const t=x?.observeCurativeConsumedText?.({item:e.item,amount:e.amount,source:e.source||"text-trigger"});t?.name&&i(`text:cache-consume:${t.name}`)}),e("CacheInventoryDeltaTextEvent",(e={})=>{const t=x?.observeInventoryDeltaText?.({item:e.item,amount:e.amount,delta:e.delta,source:e.source||"text-trigger"});t?.name&&i(`text:cache-${t.delta>0?"add":"remove"}:${t.name}`)}),e("LimbDamageTextEvent",e=>{const t=applyObservedLimbHit({limbModel:C,affModel:S,serverside:g,limb:e?.limb,amount:e?.amount,source:String(e?.source||"text-trigger"),at:e?.at});t.changed&&"torso"===t.limb&&t.stageChanged&&i(`text-limb-torso:${t.after?.stage||"unknown"}`)}),e("LimbResetTextEvent",e=>{const t=applyObservedLimbReset({limbModel:C,affModel:S,serverside:g,limb:e?.limb,source:String(e?.source||"text-trigger"),at:e?.at});t.changed&&"torso"===t.limb&&i("text-limb-torso:healthy")}),e("ServersideStatusTextEvent",(e={})=>{"enabled"!==String(e.key||"").trim().toLowerCase()?g.parseStatusLine(e):m?.observeConfirmation(Boolean(e.value))}),e("ServersideStatusSnapshotCompleteTextEvent",()=>{g.markStartupCaptured("status")}),e("ServersideAffPrioSnapshotOpenTextEvent",e=>{g.beginObservedAffPrioritySnapshot(e?.set||"")}),e("ServersideAffPrioSnapshotCompleteTextEvent",()=>{g.completeObservedAffPrioritySnapshot()}),e("ServersideDefPrioSnapshotOpenTextEvent",e=>{g.beginObservedDefPrioritySnapshot(e?.set||"")}),e("ServersideDefPrioSnapshotCompleteTextEvent",()=>{g.completeObservedDefPrioritySnapshot()}),e("ServersideAffPrioTextEvent",e=>{if(!e?.aff)return;const t=Number(e.prio),a=g.updateObservedAffPriority(e.aff,t);if("live-confirmation"===e.source){const n="function"==typeof S?.normalizePriorityName?S.normalizePriorityName(e.aff):String(e.aff||"").toLowerCase();s(se.SERVERSIDE_AFF_PRIORITY_SET,{id:n,priority:t,source:"live-confirmation",accepted:a},n)}}),e("ServersideDefPrioTextEvent",e=>{if(!e?.def)return;const t=String(e.def||"").toLowerCase(),a=Number(e.prio),n=g.updateObservedDefPriority(t,a);"live-confirmation"===e.source&&s(se.SERVERSIDE_DEF_PRIORITY_SET,{id:t,priority:a,source:"live-confirmation",accepted:n},t)}),e("ServersideQueueListTextEvent",e=>{g.updateObservedQueue(e?.queue||[])}),e("ServersidePredictionsTextEvent",e=>{g.updateObservedPredictions(e?.predictions||{})}),e("ServersidePredictionConfirmTextEvent",(e={})=>{g.confirmPrediction?.(e.aff)}),e("ServersideCuringSetsTextEvent",e=>{g.observeCuringSets({sets:e?.sets||[],activeSet:e?.activeSet||"",used:e?.used,limit:e?.limit})}),e("ServersideCuringSetSwitchedTextEvent",e=>{d?.handleSwitched({set:e?.set||""})}),e("SnappedGotTrackableEvent",()=>{g.setTrackable("snapTrack",!0,{source:"text",label:"Snapped"}),y.setTimeout(()=>{g.setTrackable("snapTrack",!1,{source:"timer",label:"Snapped"})},8e3)})},Ee={short:{rl:"right leg",ll:"left leg",ra:"right arm",la:"left arm",h:"head",tt:"torso",c:"centre",l:"left",r:"right"},long:{"right leg":"rl","left leg":"ll","right arm":"ra","left arm":"la",head:"h",torso:"tt",centre:"c",left:"l",right:"r"}},_e=["e","w","s","n","ne","se","sw","nw","in","out","d","u"],we={e:"east",w:"west",s:"south",n:"north",ne:"northeast",se:"southeast",sw:"southwest",nw:"northwest",in:"in",out:"out",down:"down",d:"down",u:"up",up:"up"},Te={e:"west",w:"east",s:"north",n:"south",ne:"southwest",se:"northwest",sw:"northeast",nw:"southeast",in:"out",out:"in",down:"up",d:"up",u:"down",up:"down"},Pe={east:"e",west:"w",south:"s",north:"n",northeast:"ne",northwest:"nw",southeast:"se",southwest:"sw",in:"in",out:"out",down:"d",up:"up"},Me=["Alchemist","Apostate","Bard","Blademaster","Depthswalker","Dragon","Druid","Infernal","Jester","Magi","Monk","Shikudo","Occultist","Paladin","Pariah","Priest","Psion","Runewarden","Sentinel","Serpent","Shaman","Sylvan","Unnamable","Air Elemental Lord","Earth Elemental Lord","Fire Elemental Lord","Water Elemental Lord"],normalizeClassName=(e="")=>{const t=String(e||"").trim();return t?/\bdragon\b/i.test(t)?"Dragon":Me.find(e=>e.toLowerCase()===t.toLowerCase())||t:""},classesMatch=(e="",t="")=>normalizeClassName(e).toLowerCase()===normalizeClassName(t).toLowerCase(),classListIncludes=(e=[],t="")=>{const a=Array.isArray(e)?e:e?[e]:[];if(!a.length)return!0;const n=normalizeClassName(t).toLowerCase();return a.some(e=>normalizeClassName(e).toLowerCase()===n)},hasOwn$4=(e,t)=>Object.prototype.hasOwnProperty.call(e||{},t),normalizeCommandList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizeStringList=e=>Array.isArray(e)?e.filter(Boolean):e?[e]:[],normalizePrioritySeed=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},normalizeDefenseConfig=(e={})=>{const t=!1!==e.serverside;return deepFreeze({...deepClone$1(e),command:normalizeCommandList(e.command),bals_req:normalizeStringList(e.bals_req),bals_used:normalizeStringList(e.bals_used),blocks:deepClone$1(e.blocks||[]),skills:normalizeStringList(e.skills),opps:normalizeStringList(e.opps),serverside:t,preempt:!0===e.preempt,static:!0===e.static,clientOnly:!0===e.clientOnly,defaultPriority:normalizePrioritySeed(e.defaultPriority)})},createDefEntry=(e,t,a,n)=>({id:e,have:!1,lastChangeAt:0,order:t,seedStatic:a.static,defaultPriority:n,priorityOverride:null,command:a.command,bals_req:a.bals_req,bals_used:a.bals_used,blocks:a.blocks,skills:a.skills,opps:a.opps,serverside:a.serverside,preempt:a.preempt,static:a.static,clientOnly:a.clientOnly}),resolveDefensePriority=(e={})=>null===e.priorityOverride||void 0===e.priorityOverride?Number(e.defaultPriority??-1):Number(e.priorityOverride),matchesClass=(e=[],t="")=>!e||!e.length||(Array.isArray(t)?t.some(t=>classListIncludes(e,t)):classListIncludes(e,t)),isActiveStaticPriority=e=>{const t=Number(e);return Number.isFinite(t)&&t>0},createInitialDefenseState=({defTable:e={},defPrios:t={}}={})=>{const a=Object.keys(e),n={},s={};return a.forEach((a,i)=>{const o=normalizeDefenseConfig(e[a]),l=hasOwn$4(t,a)?normalizePrioritySeed(t[a]):o.defaultPriority;s[a]=l,n[a]=createDefEntry(a,i,o,l)}),{list:a,state:n,defaultPrios:s}},normalizeObservedDefenseId=e=>("string"==typeof e?e:String(e?.name||e?.id||e||"")).toLowerCase().replace(/\s*\(([^)]+)\)/g," $1").trim(),normalizeItemLocation=e=>String(e||"").trim().toLowerCase()||"inv",registerGmcpBridges=({registerGmcpListener:e,systemModel:t,balanceModel:a,affModel:n,defModel:s,cacheModel:i,limbModel:o,serverside:l,adapter:c,markDirty:u})=>{const requestInventoryResync=e=>{c?.sendGmcp?.(["Char.Items.Inv"],{source:e})};e(re.CHAR_VITALS,({vitals:e}={})=>{t.updateVitals(e),a.applyVitals(e),u("gmcp:vitals")}),e(re.CHAR_STATUS,({status:e}={})=>{t.updateStatus(e||{}),u("gmcp:status")}),e(re.CHAR_AFFLICTIONS_LIST,({afflictions:e}={})=>{const t=Array.isArray(e)?e:[];n.applyList(t),"function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted&&o.syncFromAfflictions(n.currentSorted(),"gmcp-list"),u("gmcp:aff-list")}),e(re.CHAR_AFFLICTIONS_ADD,({name:e}={})=>{e&&(n.got(e,{source:"gmcp-add"}),"function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"gmcp-add"):o.applyAfflictionTransition(e,!0),u(`gmcp:aff-add:${e}`))}),e(re.CHAR_AFFLICTIONS_REMOVE,({name:e}={})=>{e&&(n.lose(e,{source:"gmcp-remove"}),"function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"gmcp-remove"):o.applyAfflictionTransition(e,!1),l.getTransientPrioAff()===e&&l.clearPrioAff(),u(`gmcp:aff-remove:${e}`))}),e(re.CHAR_DEFENCES_LIST,({defences:e}={})=>{s.applyList(Array.isArray(e)?e:[],"gmcp-list"),u("gmcp:def-list")}),e(re.CHAR_DEFENCES_ADD,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);if(t){if(t.startsWith("parrying "))for(const e of s.list())e!==t&&e.startsWith("parrying ")&&s.get(e)?.have&&s.setHave(e,!1,"gmcp-parry-implied-remove");s.setHave(t,!0,"gmcp-add"),"mindseye"===t&&requestInventoryResync("cache-visibility-resync:mindseye"),u(`gmcp:def-add:${t}`)}}),e(re.CHAR_DEFENCES_REMOVE,({name:e}={})=>{if(!e)return;const t=normalizeObservedDefenseId(e);t&&(s.setHave(t,!1,"gmcp-remove"),"blindness"===t&&requestInventoryResync("cache-visibility-resync:blindness"),u(`gmcp:def-remove:${t}`))}),e(re.IRE_RIFT_LIST,({rift:e}={})=>{i.observeRiftSnapshot?.(e||{}),u("gmcp:rift-list")}),e(re.IRE_RIFT_CHANGE,({change:e}={})=>{const t=i.observeRiftChange?.(e||{});t?.name&&u(`gmcp:rift-change:${t.name}`)}),e(re.CHAR_ITEMS_LIST,({items:e,location:a}={})=>{const n=normalizeItemLocation(a),s=Array.isArray(e)?e:[];if("inv"===n){i.observeInventorySnapshot?.(s);const toWieldedItem=e=>e?{id:e.id??null,name:String(e.name||""),icon:e.icon||null}:null;t.updateWielded("left",toWieldedItem(s.find(e=>"l"===e.attrib))),t.updateWielded("right",toWieldedItem(s.find(e=>"L"===e.attrib)))}u("gmcp:items-list")}),e(re.CHAR_ITEMS_DELTA,({inventoryDelta:e}={})=>{if(e){const a=normalizeItemLocation(e.location),n="inv"===a||"room"===a?i.observeItemDelta?.(e):null;if(n?.changed&&n.name&&u(`gmcp:room-pickup:${n.name}`),"inv"===a&&"update"===e.action){const{id:a,name:n,icon:s,attrib:i}=e,o=t.getChar().wielded;o.left?.id===a&&"l"!==i&&t.updateWielded("left",null),o.right?.id===a&&"L"!==i&&t.updateWielded("right",null),"l"===i?t.updateWielded("left",{id:a,name:n,icon:s}):"L"===i&&t.updateWielded("right",{id:a,name:n,icon:s})}}}),e(re.ROOM_INFO,({room:e,roomItems:a}={})=>{t.updateRoom(e||{}),t.setRoomItems(a||{}),u("gmcp:room-info")}),e(re.TARGET_INFO,({target:e}={})=>{t.updateTarget(e||{}),u("gmcp:target")})},normalizeBridgeSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),isSystemOutputBalance=(e={})=>"systemoutput"===normalizeBridgeSegment(e?.id),De=Object.freeze(["balance","equilibrium"]),getCounterpartEqbalBalance=e=>{const t=normalizeBridgeSegment(e);return De.includes(t)?"balance"===t?"equilibrium":"balance":null},buildEqbalRecoveredPayload=(e,t={})=>{const a=normalizeBridgeSegment(t?.id),n=getCounterpartEqbalBalance(a);return n&&e?.have?.(a)&&e.have(n)?{...t,id:"eqbal",have:!0,recoveredId:a,balances:{balance:Boolean(e.have("balance")),equilibrium:Boolean(e.have("equilibrium"))}}:null},getRecoveredBalanceSeconds=(e={})=>{const t=Number(e?.durationMs);if(Number.isFinite(t)&&t>0)return t/1e3;const a=Number(e?.lastLostAtMs),n=Number(e?.lastGotAtMs);return Number.isFinite(a)&&Number.isFinite(n)&&n>a?(n-a)/1e3:Number(e?.durationSeconds??e?.baseDurationSeconds)},formatBalanceNotice=(e={})=>{const t=String(e?.id||"").trim(),a=getRecoveredBalanceSeconds(e);return t?!Number.isFinite(a)||a<=0?t:`${t}(${a.toFixed(2)})`:""},isCountableAffliction=(e={})=>Number(e?.max)>1,formatAfflictionNotice=(e={})=>{const t=String(e?.name||"").trim();if(!t)return"";const a=Number(e?.count);return isCountableAffliction(e)&&Number.isFinite(a)?`${t}(${a})`:t},shouldEchoPriorityChange=(e={})=>["manual","public-api"].includes(String(e?.source||"").toLowerCase()),formatPriorityNotice=(e={},t)=>{const a=String(t||"").trim(),n=Number(e?.priority??e?.value),s=normalizeBridgeSegment(e?.domain),i=s&&"keepup"!==s?` (${s})`:!0===e?.static?" (static)":"";return a?Number.isFinite(n)?`${a} ${n}${i}`:`${a}${i}`:""},Re=Object.freeze({RuleAdded:se.RULE_ADDED,RuleRemoved:se.RULE_REMOVED,RuleEnabled:se.RULE_ENABLED,RuleDisabled:se.RULE_DISABLED,RulePackLoaded:se.RULE_PACK_LOADED,RulePackUnloaded:se.RULE_PACK_UNLOADED,RuleOrderChanged:se.RULE_ORDER_CHANGED}),Oe=Object.freeze({hp:{topic:se.SYSTEM_HEALTH_CHANGED,maxKey:"maxhp"},mp:{topic:se.SYSTEM_MANA_CHANGED,maxKey:"maxmp"},rage:{topic:se.SYSTEM_RAGE_CHANGED},bleed:{topic:se.SYSTEM_BLEED_CHANGED}}),buildVitalResourcePayload=(e={},t,{maxKey:a}={})=>{const n=e.changedFields?.[t];if(!n)return null;const s=n.current,i=n.previous;return{max:a?e.current?.[a]:s,current:s,previous:i,diff:s-i}},publishVitalResourceTopics=(e,t={})=>{Object.entries(Oe).forEach(([a,n])=>{const s=buildVitalResourcePayload(t,a,n);s&&e(n.topic,s)})},registerSystemModelBridge=({registerModelListener:e,publishPublic:t,syncDebugMode:a,systemModel:n,serverside:s,handleVitalsSideEffects:i})=>{e(n.onChange((e,n={})=>{switch(e){case"VitalsUpdated":t(se.SYSTEM_VITALS_CHANGED,n),publishVitalResourceTopics(t,n),i();break;case"StatusUpdated":t(se.SYSTEM_STATUS_CHANGED,n);break;case"ClassChanged":s.setBaselineFromRuntime(),t(se.SYSTEM_CLASS_CHANGED,n);break;case"TargetUpdated":t(se.SYSTEM_TARGET_CHANGED,n);break;case"RoomUpdated":t(se.SYSTEM_ROOM_CHANGED,n);break;case"RoomItemsUpdated":t(se.SYSTEM_ROOM_ITEMS_CHANGED,n);break;case"RuntimeStateChanged":t(se.SYSTEM_RUNTIME_CHANGED,n);break;case"PauseStateChanged":t(se.SYSTEM_PAUSE_CHANGED,n),t(n.paused?se.SYSTEM_PAUSED:se.SYSTEM_UNPAUSED,n);break;case"SettingsChanged":n.changedKeys?.includes("debug")&&a(),t(se.SYSTEM_SETTINGS_CHANGED,n);break;case"BaselineIntentChanged":t(se.SYSTEM_BASELINE_CHANGED,n);break;case"WieldedUpdated":t(se.SYSTEM_WIELDED_CHANGED,n);break;case"MountUpdated":t(se.SYSTEM_MOUNT_CHANGED,n);break;case"DeathDetected":t(se.SYSTEM_DEATH_DETECTED,n)}}))},registerAfflictionModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:s,affModel:i,serverside:o})=>{e(i.onChange((e,l={})=>{switch("AffGot"!==e&&"AffLost"!==e||"aeon"!==l?.name||s.setRuntime({aeonLocked:i.haveAff("aeon")}),e){case"AffGot":a(se.AFF_GOT,l,l.name),n.publish("affGot",formatAfflictionNotice(l),{...l,action:"got"});break;case"AffLost":a(se.AFF_LOST,l,l.name),n.publish("affLost",l.name,{...l,action:"lost"}),o.getTransientPrioAff()===l.name&&o.clearPrioAff();break;case"AffStackChanged":{a(se.AFF_STACK_CHANGED,l,l.name);const e=Number(l.count),t=Number(l.previousCount);if(Number.isFinite(e)&&Number.isFinite(t)&&e>0&&t>0&&e!==t){const a=e>t,s=Math.max(e,t);n.publish(a?"affGot":"affLost",formatAfflictionNotice({...l,count:s}),{...l,action:a?"got":"lost"})}break}case"AffPriorityChanged":t(se.AFF_PRIORITY_CHANGED,l),shouldEchoPriorityChange(l)&&n.publish("priority",formatPriorityNotice(l,l.name),{...l,action:"set",subject:"aff"})}}))},registerDefenseModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:s})=>{e(s.onChange((e,s={})=>{switch(e){case"DefGot":a(se.DEF_GOT,s,s.id),n.publish("defGot",s.id,{...s,action:"got"});break;case"DefLost":a(se.DEF_LOST,s,s.id),n.publish("defLost",s.id,{...s,action:"lost"});break;case"DefPriorityChanged":t(se.DEF_PRIORITY_CHANGED,s),shouldEchoPriorityChange(s)&&n.publish("priority",formatPriorityNotice(s,s.id),{...s,action:"set",subject:"def"})}}))},registerBalanceModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:s})=>{e(s.onChange((e,i={})=>{switch(e){case"BalanceGot":a(se.BALANCE_GOT,i,i.id);{const e=buildEqbalRecoveredPayload(s,i);e&&t(se.EQBAL_GOT,e)}isSystemOutputBalance(i)||n.publish("balanceRecovered",formatBalanceNotice(i),{...i,action:"got"});break;case"BalanceLost":a(se.BALANCE_LOST,i,i.id),n.publish("balanceLost",i.id,{...i,action:"lost"});break;case"BalanceReset":a(se.BALANCE_RESET,i,i.id);break;case"BalanceDurationObserved":a(se.BALANCE_DURATION_OBSERVED,i,i.id);break;case"BalanceLossTimerRestarted":t(se.BALANCE_TIMER_RESTARTED,i)}}))},registerLimbModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,limbModel:n})=>{e(n.onChange((e,n={})=>{switch(e){case"LimbHit":a(se.LIMB_HIT,n,n.limb);break;case"LimbReset":a(se.LIMB_RESET,n,n.limb);break;case"LimbStageChanged":a(se.LIMB_STAGE_CHANGED,n,n.limb);break;case"LimbDecay":t(se.LIMB_DECAY,n)}}))},registerCacheModelBridge=({registerModelListener:e,publishPublic:t,cacheModel:a})=>{e(a.onChange((e,a={})=>{switch(e){case"CacheAmountChanged":t(se.CACHE_AMOUNT_CHANGED,a);break;case"CacheInventoryListApplied":t(se.CACHE_INVENTORY_LIST,a);break;case"CacheRiftListApplied":t(se.CACHE_RIFT_LIST,a);break;case"CacheDesiredPrecacheChanged":t(se.CACHE_PRECACHE_CHANGED,a)}}))},registerQueueModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:s})=>{e(s.onChange((e,i={})=>{switch(e){case"QueueFlushed":t(se.QUEUE_FLUSHED,i),n.publish("output",`Queue sent: ${i.queueId}`,i);break;case"QueueDeferred":t(se.QUEUE_DEFERRED,i);break;case"QueueUpdated":t(se.QUEUE_UPDATED,i);break;case"QueueCleared":t(se.QUEUE_CLEARED,i);break;case"QueueSentAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueName||i.queueId;a(se.QUEUE_SENT,{...i,queueName:e},e);break}case"QueueFiredAcknowledged":{const e=s.getQueue(i.queueId)?.name||i.queueId;t(se.QUEUE_FIRED_ACK,i),a(se.QUEUE_FIRED,{...i,queueName:e},e);break}}}))},registerServersideModelBridge=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,serverside:s,runtimeControl:i,systemModel:o,onServersideDirty:l})=>{let c=new Set;const syncRuleSuspendPause=(e=[])=>{c=new Set((e||[]).filter(Boolean).map(e=>String(e)));const t=c.size>0;o?.getRuntime?.().rulesSuspended!==t&&(o?.setRuntime?.({rulesSuspended:t}),i?.syncCuringState?.({source:"rule-suspend"}))},addRuleSuspend=e=>{e&&!c.has(String(e))&&syncRuleSuspendPause([...c,String(e)])},removeRuleSuspend=e=>{if(!e||!c.has(String(e)))return;const t=new Set(c);t.delete(String(e)),syncRuleSuspendPause([...t])};e(s.onChange((e,s={})=>{const i=Re[e];if(i)t(i,s);else switch(e){case"TrackableGot":n.publish("trackableGot",s.label||s.name,{...s,action:"got"});break;case"TrackableLost":n.publish("trackableLost",s.label||s.name,{...s,action:"lost"});break;case"ServersideDirty":l?.(s),t(se.SERVERSIDE_DIRTY,s);break;case"ServersideEvaluated":syncRuleSuspendPause(s.suspendingRules||[],s.source),t(se.SERVERSIDE_EVALUATED,s);break;case"RuleSuspendActivated":addRuleSuspend(s.id);break;case"RuleSuspendDeactivated":removeRuleSuspend(s.id);break;case"RuleActivated":s.suspendsCuring&&addRuleSuspend(s.id),a(se.RULE_ACTIVATED,s,s.id);break;case"RuleDeactivated":s.suspendsCuring&&removeRuleSuspend(s.id),a(se.RULE_DEACTIVATED,s,s.id)}}))},registerModelEventBridges=({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,syncDebugMode:s,systemModel:i,affModel:o,defModel:l,balanceModel:c,cacheModel:u,limbModel:d,queueController:m,serverside:p,runtimeControl:g,handleVitalsSideEffects:h,onServersideDirty:b})=>{registerSystemModelBridge({registerModelListener:e,publishPublic:t,syncDebugMode:s,systemModel:i,serverside:p,handleVitalsSideEffects:h}),registerAfflictionModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,systemModel:i,affModel:o,serverside:p}),registerDefenseModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,defModel:l}),registerBalanceModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,balanceModel:c}),registerLimbModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,limbModel:d}),registerCacheModelBridge({registerModelListener:e,publishPublic:t,cacheModel:u}),registerQueueModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,queueController:m}),registerServersideModelBridge({registerModelListener:e,publishPublic:t,publishPublicScoped:a,noticeCenter:n,serverside:p,runtimeControl:g,systemModel:i,onServersideDirty:b})},Ne="Flying above ",Le=new Set(["dragon","air elemental lord","earth elemental lord","fire elemental lord","water elemental lord"]),registerCrossModelBridges=({registerModelListener:e,systemModel:t,defModel:a})=>{e(t.onChange((e,t={})=>{if("RoomUpdated"===e){const e=String(t?.current?.name||"").startsWith(Ne);return void a.setHave("flying",e,"room-info")}"ClassChanged"===e&&Le.has(String(t?.class||"").toLowerCase())&&a.setHave("mounted",!1,"class-change")}))},createRuntimeEventWiring=({adapter:e,internalEvents:t})=>{let a=[];const addUnsubscriber=e=>{"function"==typeof e&&a.push(e)},dispose=()=>{a.forEach(e=>{try{e()}catch(t){console.error("nexSys4 unsubscribe failure",t)}}),a=[]};return{attach:({options:a,queueTranslatedGmcp:n,publishPublic:s,publishPublicScoped:i,noticeCenter:o,syncDebugMode:l,systemModel:c,affModel:u,defModel:d,balanceModel:m,cacheModel:p,limbModel:g,queueController:h,serverside:b,markDirty:y,invalidateOutput:v,flushCycle:S,outputCycle:x,startup:C,curingSetProvisioner:k,curingSetGuard:A,curingMasterSwitch:E,runtimeControl:_,savePersistence:w})=>{dispose();const register=(t,a)=>{addUnsubscriber(e.on(t,a))},registerModelListener=e=>{addUnsubscriber(e)},registerGmcpListener=(e,a)=>{registerModelListener(t.on(e,a))};registerAdapterEvents({register,options:a,queueTranslatedGmcp:n,publishPublic:s,publishPublicScoped:i,markDirty:y,flushCycle:S,outputCycle:x,startup:C,curingSetProvisioner:k,curingSetGuard:A,curingMasterSwitch:E,runtimeControl:_,queueController:h,serverside:b,balanceModel:m,defModel:d,adapter:e,systemModel:c,affModel:u,cacheModel:p,limbModel:g,savePersistence:w}),register("OutboundCommandsEvent",(e={})=>{if("output-cycle"!==e?.context?.source)return;const t=Array.isArray(e.commands)?e.commands.filter(Boolean).map(e=>String(e)):[];if(!t.length)return;const a=c.getSettings().commandSeparator||"|";o.publish("output",`(${t.join(a)})`,{action:"commands",commands:t,source:e?.context?.cycleSource||e?.context?.source||"output-cycle"})}),registerGmcpBridges({registerGmcpListener,systemModel:c,balanceModel:m,affModel:u,defModel:d,cacheModel:p,limbModel:g,serverside:b,adapter:e,markDirty:y}),registerModelEventBridges({registerModelListener,publishPublic:s,publishPublicScoped:i,noticeCenter:o,syncDebugMode:l,systemModel:c,affModel:u,defModel:d,balanceModel:m,cacheModel:p,limbModel:g,queueController:h,serverside:b,runtimeControl:_,handleVitalsSideEffects:_.handleVitalsSideEffects,onServersideDirty:v}),registerCrossModelBridges({registerModelListener,systemModel:c,defModel:d})},dispose}},createRuntimeControlApi=({systemModel:e,serverside:t,queueController:a,noticeCenter:n,markDirty:s,onResume:i,dispatchCommands:o,curingMasterSwitch:l})=>{let c=!1;const buildSystemEventCommand=e=>e?`echo SystemEvent ${e}`:null,syncServersideCuring=(e,t={})=>{if("function"!=typeof o)return[];const a=e?"curing off":"curing on";if(e&&!1===l?.getObservedEnabled())return[];if(!e&&!0===l?.getObservedEnabled())return[];l?.markExpected(a);const n=buildSystemEventCommand(t.completionEvent);return o(n?[a,n]:[a],{source:t.source||(e?"runtime-pause":"runtime-unpause")})},syncCuringState=(t={})=>{const a=e.getRuntime();return syncServersideCuring(a.paused||a.rulesSuspended,t)},setPaused=(t,n={})=>{const o=Boolean(t),l=e.getRuntime();return l.paused===o?(n.forceCuringSync&&syncCuringState(n),!1):!(!o&&!isRuntimeReadyPhase(l.phase))&&(e.setRuntime({paused:o}),s(o?"paused":"unpaused"),syncCuringState(n),o||(a.flushDeferred(),i?.(n.source||"unpause")),!0)},ensureSlowModeRule=()=>{t.lifecycle.add({id:"runtime-slow-mode",pack:"runtime",evaluate:()=>e.getRuntime().slowMode?{settings:{sipHealthAt:30,sipManaAt:20,mossHealthAt:20,mossManaAt:20,batch:!1}}:null})};return{setPaused,syncCuringState,setSlowMode(t){const a=Boolean(t);return e.getRuntime().slowMode!==a&&(e.setRuntime({slowMode:a}),ensureSlowModeRule(),s(a?"slow-on":"slow-off"),!0)},handleVitalsSideEffects(){const t=e.getChar().dead;t&&!c&&(setPaused(!0,{source:"death-detected"}),n.publish("output","Death detected. Pausing nexSys runtime.",{source:"death-detected"})),!t&&c&&(setPaused(!1,{source:"death-recover"}),n.publish("output","Resurrection detected. Resuming nexSys runtime.",{source:"death-recover"})),c=t}}},Ie="curing on",je="curing off",createCuringMasterSwitch=({setPaused:e,noticeCenter:t})=>{let a=null,n=null;return{getObservedEnabled:()=>a,markExpected(e){const t=String(e||"").trim().toLowerCase();return(t===Ie||t===je)&&(n=t,!0)},observeConfirmation(s){const i=Boolean(s);return a=i,n===(i?Ie:je)?(n=null,{attributed:!0,enabled:i}):(n=null,i?e(!1,{source:"user-curing-on"}):(e(!0,{source:"user-curing-off"}),t.publish("output","Manual `curing off` detected. nexSys is paused and will not re-enable curing; send `curing on` to resume.",{source:"user-curing-off"})),{attributed:!1,enabled:i})}}},createCuringSetGuard=({serverside:e,systemModel:t,noticeCenter:a})=>{let n=!1,s=!1;const isRunningSession=()=>isRuntimeReadyPhase(t.getRuntime().phase),markNexsysSwitch=()=>{s=!0},unload=({remove:t=!0}={})=>{const a=e.getCuringSets?.()??{},s=(a.sets||[]).map(e=>normalizeSetName(e)).filter(Boolean),i=normalizeSetName(a.priorSet),o=i&&"nexsys4-default"!==i&&s.includes(i)?i:s.find(e=>e&&"nexsys4-default"!==e)||"",l=[];o&&(markNexsysSwitch(),e.switchCuringSet(o),l.push(`curingset switch ${o}`));const c=t||!o;return c&&(e.deleteCuringSet(ue),l.push(`curingset delete ${ue}`)),n=!1,{restoreTarget:o,removed:c,commands:l}};return{handleSwitched:({set:t}={})=>{const i=normalizeSetName(t);if(!i)return;const o=s;s=!1,e.observeActiveCuringSet?.(i),isRunningSession()&&("nexsys4-default"!==i?o||n||(n=!0,a.publish("output",`nexSys paused — curing set is now ${i}; nexSys operates only in ${ue} and will resume when you switch back.`,{source:"curingset-foreign",force:!0})):n&&(n=!1,a.publish("output",`nexSys resumed — curing set is back to ${ue}.`,{source:"curingset-foreign-resume",force:!0})))},markNexsysSwitch,unload,isForeignPaused:()=>n}},isRecord$2=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),isSupportedPersistenceSchemaVersion=e=>2===Number(e),createEmptyPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:{},affSettings:{defaults:{}},defSettings:{defaults:{},static:{}},cacheSettings:{precache:{}}}),qe=t.z.record(t.z.string(),t.z.unknown()).catch(()=>({})),Be=t.z.object({schemaVersion:t.z.coerce.number().refine(isSupportedPersistenceSchemaVersion),systemSettings:qe,affSettings:t.z.object({defaults:qe}).catch(()=>({defaults:{}})),defSettings:t.z.object({defaults:qe,static:qe}).catch(()=>({defaults:{},static:{}})),cacheSettings:t.z.object({precache:qe}).catch(()=>({precache:{}}))}),normalizePersistenceSnapshot=(e,{assumeCurrentVersion:t=!1}={})=>{const a=t&&isRecord$2(e)&&null==e.schemaVersion?{...e,schemaVersion:2}:e,n=Be.safeParse(a);return n.success?n.data:createEmptyPersistenceSnapshot()},createRuntimePersistenceApi=({persistence:e,systemModel:t,affModel:a,defModel:n,cacheModel:s,serverside:i,syncDebugMode:o,markDirty:l})=>{const c=0,u=26,d={hasStoredSnapshot:!1,sourceKey:e?.key||"nexSys4Settings"},sanitizeSystemSettings=(e={})=>{const{customPromptEnabled:t,prompt:a,...n}=e||{},s=normalizeCommandSeparator(n.commandSeparator);if(s?n.commandSeparator=s:delete n.commandSeparator,n.ss&&"object"==typeof n.ss){const{enabled:e,...t}=n.ss;n.ss=t}return n},normalizePersistedDefPriority=e=>{const t=Number(e);return Number.isInteger(t)?t<c?c:t>u?u:t:c},buildAffDefaultMap=()=>a.list().reduce((e,t)=>(e[t]=a.getDefaultPriority(t),e),{}),countablePriorityNameSet=()=>new Set(a.getCountablePriorityNames?.()||[]),buildDefDefaultMap=()=>Object.entries(n.getDefaultPriorities()).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),buildDefStaticOverrideMap=()=>({...n.getStaticOverrides?.()||{}}),buildCacheDefaultSnapshot=()=>s.getDesiredPrecache(),isValidServersideAffPriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=26},normalizeStoredAffDefaults=(e={})=>{const t=countablePriorityNameSet();return Object.entries(e).reduce((e,[n,s])=>{const i="function"==typeof a.normalizePriorityName?a.normalizePriorityName(n):String(n||"").trim().toLowerCase();if(!i)return e;if(t.has(i))return e;const o=a.getDefaultPriority(i);return isValidServersideAffPriority(o)&&!isValidServersideAffPriority(s)?(e[i]=o,e):(e[i]=s,e)},{})},normalizeStoredDefPriorities=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=normalizePersistedDefPriority(a),e),{}),normalizeStoredDefStatics=(e={})=>Object.entries(e).reduce((e,[t,a])=>(!0!==a&&!1!==a||(e[t]=a),e),{}),buildPersistenceSnapshot=()=>({schemaVersion:2,systemSettings:sanitizeSystemSettings(t.getSettings()),affSettings:{defaults:buildAffDefaultMap()},defSettings:{defaults:buildDefDefaultMap(),static:buildDefStaticOverrideMap()},cacheSettings:{precache:buildCacheDefaultSnapshot()}}),applyStoredSnapshot=(e={})=>{const l=sanitizeSystemSettings(e.systemSettings||{});t.setSettings(l,{setBaseline:!0}),t.setBaselineIntent({ss:l.ss||{}});const c=e.affSettings?.defaults;c&&Object.entries(normalizeStoredAffDefaults(c)).forEach(([e,t])=>{a.setDefaultPriority(e,t,"persistence")});const u=normalizeStoredDefStatics(e.defSettings?.static);Object.entries(u).forEach(([e,t])=>{n.setStatic(e,t,"persistence")});const d=normalizeStoredDefPriorities(e.defSettings?.defaults);Object.entries(d).forEach(([e,t])=>{n.setDefaultPriority(e,t,"persistence")}),e.cacheSettings?.precache&&s.setDesiredPrecache(e.cacheSettings.precache),i.setBaselineFromRuntime(),o()},loadStoredSnapshot=()=>"function"==typeof e.read?e.read():{key:e?.key||"nexSys4Settings",exists:!1,snapshot:e.load()};return{buildPersistenceSnapshot,loadPersistence(){const{key:t,exists:a,snapshot:n}=loadStoredSnapshot();return d.hasStoredSnapshot=Boolean(a),d.sourceKey=t||e?.key||"nexSys4Settings",applyStoredSnapshot(n),{key:d.sourceKey,exists:d.hasStoredSnapshot,snapshot:n}},seedBaselineFromObservedStartup({skipObservedAdoption:e=!1}={}){if(d.hasStoredSnapshot)return!1;if(e)return!1;const s=i.getObserved?.()||{},l=sanitizeSystemSettings({ss:s.settings||{}});Object.keys(l).length&&t.setSettings(l,{setBaseline:!0});const c=countablePriorityNameSet();return Object.entries(s.affPriorities||{}).forEach(([e,t])=>{c.has(String(e||"").toLowerCase())||isValidServersideAffPriority(t)&&a.setDefaultPriority(e,t,"startup-observed-baseline")}),Object.entries(s.defPriorities||{}).forEach(([e,t])=>{n.get(e)&&n.setDefaultPriority(e,normalizePersistedDefPriority(t),"startup-observed-baseline")}),i.setBaselineFromRuntime(),o(),!0},savePersistence(){const t=buildPersistenceSnapshot();return e.save(t),i.setBaselineFromRuntime(),l("persistence-save"),t}}},evaluateBlockCondition=(e,t)=>Array.isArray(e)?e.every(e=>t(e)):t(e),isBlocked=(e=[],t)=>e.some(e=>evaluateBlockCondition(e,t)),isActiveDefensePriority=e=>{const t=Number(e);return Number.isInteger(t)&&t>=1&&t<=25},createDefensePlanner=({defModel:e,balanceModel:t,affModel:a,systemModel:n})=>({plan:({includeStaticIds:s=[]}={})=>{const i=n.getClass(),o=new Set(s),l=e.list().map(t=>e.get(t)).filter(Boolean).map(t=>({entry:t,priority:e.getPriority(t.id)})).sort((e,t)=>e.priority!==t.priority?e.priority-t.priority:e.entry.order-t.entry.order),c=new Set,u={serverside:[],client:[]};return l.forEach(({entry:n,priority:s})=>{if(!isActiveDefensePriority(s)||c.has(n.id)||n.have)return;if(!e.isAvailableForClass(n.id,i))return;if(n.static&&!o.has(n.id))return;if(isBlocked(n.blocks,e=>a.haveAff(e)))return;if(!n.bals_req.every(e=>t.have(e)))return;n.opps.forEach(e=>c.add(e));const l=n.serverside?u.serverside:u.client;n.command.forEach(e=>{l.push({source:"defense",defense:n.id,command:e,prio:s,serverside:n.serverside,preempt:n.preempt,static:n.static})})}),{serverside:u.serverside,client:u.client,all:[...u.serverside,...u.client]}}}),dedupeCommandIntents=(e=[])=>{const t=new Map,a=[];return e.forEach(e=>{const n=e?.command,s=t.get(n);if(s)return void(!0===e?.requiresCompletion&&(s.requiresCompletion=!0));const i={...e};t.set(n,i),a.push(i)}),a},createOutputPlanner=({systemModel:e,serverside:t,defensePlanner:a,precachePlanner:n})=>({plan({source:s="prompt",injectedCommands:i=[],suppressedServersideCommands:o=[]}={}){const l=e.getRuntime(),c=t.evaluate({emitCommands:!1,source:s}),u=o.length?c.commands.filter(e=>!o.includes(e)):c.commands,d=t.getStaticDefRequests(),m=[];a.plan({includeStaticIds:Object.keys(d)}).client.forEach(e=>m.push(e)),l.slowMode||l.aeonLocked||n.plan().forEach(e=>m.push(e)),u.forEach(e=>{m.push({source:"serverside",command:e,requiresCompletion:!0})}),i.forEach(e=>{m.push({source:"injected",command:e})});const p=dedupeCommandIntents(m);return{intents:p,commands:p.map(e=>e.command),serversideCommands:u}}}),createPrecachePlanner=({cacheModel:e})=>({plan:()=>e.getPrecacheCommands().map(e=>({source:"precache",command:e,requiresCompletion:!0}))}),createQueueState=()=>Object.entries(j).reduce((e,[t,a])=>(e[t]={...deepClone$1(a),id:t,items:[],prepend:[],pending:!1,lastSignature:"",deferred:!1},e),{}),splitCommandValue=(e,t="|")=>{const a=String(t||"|")||"|";return String(e).split(a).map(e=>e.trim()).filter(Boolean)},normalizeCommands=(e,t="|")=>e?Array.isArray(e)?e.flatMap(e=>null==e?[]:splitCommandValue(e,t)).filter(Boolean):splitCommandValue(e,t):[],hasQueuedItems=e=>e.items.length>0||e.prepend.length>0,buildLogicalCommands=e=>[`echo SystemEvent ${e.name}QueueFired`,...e.pre,...e.prepend,...e.items,...e.post].filter(Boolean),clearQueueState=e=>{e.items=[],e.prepend=[],e.pending=!1,e.lastSignature="",e.deferred=!1},resolveQueueId=(e,t)=>{if(e[t])return t;const a=String(t||"").replace(/QueueFired$/i,"").toLowerCase();return Object.keys(e).find(t=>{const n=e[t];return n.name.toLowerCase()===a||n.type.toLowerCase()===a})||null},hasLocalQueueState=(e={})=>(e.items||[]).length>0||(e.prepend||[]).length>0||e.pending||e.deferred||Boolean(e.lastSignature),clearLocalQueueState=e=>{if(!e)return!1;const t=hasLocalQueueState(e);return clearQueueState(e),t},markQueueDeferred=e=>{if(!e)return!1;const t=!e.deferred||!e.pending;return e.deferred=!0,e.pending=!0,t},markQueueAwaitingAck=(e,t)=>{if(!e)return!1;const a=e.lastSignature!==t||!0!==e.pending||!1!==e.deferred;return e.lastSignature=t,e.pending=!0,e.deferred=!1,a},createQueueMutationApi=({state:e,emit:t,flush:a,getSeparator:n,markStateChanged:s=()=>{}})=>{const resolveSeparator=()=>("function"==typeof n?n():"|")||"|",haveSameCommands=(e=[],t=[])=>e.length===t.length&&e.every((e,a)=>e===t[a]),clear=(a,n={})=>{const i=e[a];return!!i&&(!!clearLocalQueueState(i)&&(s(a),t("QueueCleared",{queueId:a,remote:Boolean(n.remote),command:n.command||null}),!0))};return{add(n,i,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(i,resolveSeparator());if(!c.length)return!1;const u=[];if(o.allowDuplicate)u.push(...c);else{const e=new Map;l.items.forEach(t=>{e.set(t,(e.get(t)||0)+1)}),c.forEach(t=>{const a=e.get(t)||0;a>0?e.set(t,a-1):u.push(t)})}return!!u.length&&(l.items.push(...u),s(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},addClear(n,i,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(i,resolveSeparator());return!(!c.length||haveSameCommands(l.items,c))&&(l.items=c,s(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0)},prepend(n,i,o={}){const l=e[n];if(!l)return!1;const c=normalizeCommands(i,resolveSeparator());return!!c.length&&(!(!o.allowDuplicate&&c.every(e=>l.prepend.includes(e)))&&(l.prepend.unshift(...c),s(n),t("QueueUpdated",{queueId:n,queue:deepClone$1(l)}),!1!==o.autoFlush&&a(n),!0))},clear,setPreCommands(a,n=[]){const i=e[a];if(!i)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(i.pre,o)&&(i.pre=o,s(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(i)}),!0)},setPostCommands(a,n=[]){const i=e[a];if(!i)return!1;const o=normalizeCommands(n,resolveSeparator());return!haveSameCommands(i.post,o)&&(i.post=o,s(a),t("QueueUpdated",{queueId:a,queue:deepClone$1(i)}),!0)}}},chunkCommands=(e=[],t=20)=>{const a=Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],n=Math.max(1,Number(t||20)),s=[];for(let i=0;i<a.length;i+=n)s.push(a.slice(i,i+n));return s},chunkCommandsWithTrailing=(e=[],{maxEntries:t=20,trailing:a=[]}={})=>{const n=chunkCommands(e,t),s=chunkCommands(a,t).flat();if(!s.length)return n;if(!n.length)return chunkCommands(s,t);const i=n[n.length-1];return i.length+s.length<=Math.max(1,Number(t||20))?(i.push(...s),n):[...n,...chunkCommands(s,t)]},createQueueFlushApi=({state:e,emit:t,send:a,getRuntimeState:n,getSeparator:s,maxEntriesPerSubmission:i,onQueueFired:o,markStateChanged:l=()=>{}})=>{const buildRemoteClearCommand=e=>`clearqueue ${e.type}`,buildStackPlan=(e=[])=>({type:"stackPlan",commands:e.filter(Boolean).map(e=>String(e))}),markExcludedQueuesCleared=(t=[])=>{t.forEach(t=>{const a=e[t];a&&clearLocalQueueState(a)&&l(t)})},deferQueue=(e,a)=>(markQueueDeferred(a)&&l(e),t("QueueDeferred",{queueId:e,queue:deepClone$1(a)}),[]),flush=(o,c={})=>{const u=e[o];if(!u||!hasQueuedItems(u))return[];const d=n?n():{paused:!1,phase:ie.RUNNING,settings:{}};if(!isRuntimeReadyPhase(d.phase))return deferQueue(o,u);const m=Boolean(d.settings?.queueWhilePaused);if((d.paused||d.rulesSuspended)&&!m)return deferQueue(o,u);const p=buildLogicalCommands(u),g=p.join("");if(!c.force&&g===u.lastSignature)return[];const h=[],b=[];u.exclusions.forEach(t=>{const a=e[t];a&&hasQueuedItems(a)&&(h.push(buildRemoteClearCommand(a)),b.push(t))});const y="function"==typeof s?s():"|",v=chunkCommands(p,Math.max(1,i-h.length)).map((e,t)=>buildStackPlan([`queue ${0===t?"addclear":"add"} ${u.type} ${e.join(y)}`])),S=[];return h.length>0&&S.push(buildStackPlan(h)),S.push(...v),markQueueAwaitingAck(u,g)&&l(o),markExcludedQueuesCleared(b),a(S,{source:"queue-controller",queueId:o,excludedIds:b}),t("QueueFlushed",{queueId:o,plans:S,signature:g}),S};return{flush,clearQueue:n=>{const s=e[n];if(!s)return!1;const i=buildRemoteClearCommand(s);clearLocalQueueState(s)&&l(n),t("QueueCleared",{queueId:n,remote:!0,command:i});const o=[buildStackPlan([i])];return a(o,{source:"queue-controller",queueId:n,remote:!0,action:"clear-queue"}),o},flushDeferred(){const t=[];return Object.keys(e).forEach(a=>{e[a].deferred&&flush(a,{force:!0}).length&&t.push(a)}),t},flushAll(){const t=[];return Object.keys(e).forEach(e=>{const a=flush(e);a.length&&t.push({queueId:e,plans:a})}),t},acknowledgeSent(a,n={}){const s=resolveQueueId(e,a);if(!s)return!1;const i=e[s];return t("QueueSentAcknowledged",{...n,queueId:s,queueType:i?.type||n.queueType||""}),!0},acknowledgeFired(a){const n=resolveQueueId(e,a);if(!n)return!1;const s=e[n],i=s?deepClone$1(s):null;return clearLocalQueueState(e[n])&&l(n),o?.({queueId:n,queue:i}),t("QueueFiredAcknowledged",{queueId:n}),!0}}},createQueueController=({send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n=20,onQueueFired:s}={})=>{const i=new Set,o=createQueueState();let l=0;const c=new Map,markStateChanged=e=>{l+=1,e&&c.set(e,(c.get(e)??0)+1)},emit=(e,t)=>{i.forEach(a=>a(e,t))},buildQueueSnapshot=(e={})=>({id:e.id,name:e.name,type:e.type,pre:[...e.pre||[]],post:[...e.post||[]],exclusions:[...e.exclusions||[]],items:[...e.items||[]],prepend:[...e.prepend||[]],pending:Boolean(e.pending),lastSignature:e.lastSignature||"",deferred:Boolean(e.deferred)}),u=new Map,getQueueSnapshot=e=>o[e]?(u.has(e)||u.set(e,createSnapshotCache({getVersion:()=>c.get(e)??0,buildSnapshot:()=>buildQueueSnapshot(o[e])})),u.get(e)()):null,d=createSnapshotCache({getVersion:()=>l,buildSnapshot:()=>Object.keys(o).reduce((e,t)=>(e[t]=getQueueSnapshot(t),e),{})}),m=createQueueFlushApi({state:o,emit,send:e,getRuntimeState:t,getSeparator:a,maxEntriesPerSubmission:n,onQueueFired:s,markStateChanged}),p=createQueueMutationApi({state:o,emit,flush:m.flush,getSeparator:a,markStateChanged});return{onChange:e=>(i.add(e),()=>i.delete(e)),listQueues:()=>Object.keys(o),getQueue:e=>getQueueSnapshot(e),snapshot:()=>d(),add:p.add,addClear:p.addClear,prepend:p.prepend,clear:p.clear,clearQueue:m.clearQueue,flush:m.flush,flushAll:m.flushAll,flushDeferred:m.flushDeferred,acknowledgeSent:m.acknowledgeSent,acknowledgeFired:m.acknowledgeFired,setPreCommands:p.setPreCommands,setPostCommands:p.setPostCommands}},normalizeRule=(e,t="runtime")=>{if(!e?.id)throw new Error("Rule must include an id");if("function"!=typeof e.evaluate)throw new Error(`Rule "${e.id}" must expose evaluate(context)`);const a=Array.isArray(e.tags)?e.tags.map(e=>String(e).trim().toLowerCase()).filter(Boolean):[];return{id:String(e.id),enabled:!1!==e.enabled,terminal:!0===e.terminal,pack:e.pack||t,tags:a,meta:deepClone$1(e.meta||{}),evaluate:e.evaluate}},stripMasterSwitchSetting=(e={})=>{const{enabled:t,...a}=e||{};return a},mergeOverlay=(e,t={})=>t?(["affPriorities","defPriorities","curePriorities","settings","predictions"].forEach(a=>{if(!t[a])return;const n="settings"===a?stripMasterSwitchSetting(t[a]):t[a];e[a]={...e[a]||{},...n}}),void 0!==t.prioAff&&(e.prioAff=t.prioAff),Array.isArray(t.manualQueue)&&(e.manualQueue=[...t.manualQueue]),t.commands?.length&&(e.commands=[...e.commands||[],...t.commands]),e):e,createEmptyOverlay=()=>({affPriorities:{},defPriorities:{},curePriorities:{},settings:{},predictions:{},commands:[],prioAff:void 0,manualQueue:void 0}),diffRuleActivity=(e,t)=>{const a=[];return e.forEach((e,n)=>{t.has(n)||a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{e.has(n)||a.push({...t,from:!1,to:!0})}),a},diffRuleSuspension=(e,t)=>{const a=[];return e.forEach((e,n)=>{e.suspendsCuring&&!t.get(n)?.suspendsCuring&&a.push({...e,from:!0,to:!1})}),t.forEach((t,n)=>{t.suspendsCuring&&!e.get(n)?.suspendsCuring&&a.push({...t,from:!1,to:!0})}),a},createRuleRegistry=(e=[])=>{const t=[],a=new Set,n=new Map,emit=(e,t)=>{a.forEach(a=>{try{a(e,t)}catch(n){console.error("nexSys4 rule registry listener failed",{event:e,error:n})}})},findIndex=e=>t.findIndex(t=>t.id===e),synthesizeDeactivation=(e,t)=>{const a=String(e);if(!n.has(a))return!1;const s=n.get(a);return n.delete(a),emit("RuleDeactivated",{...s,source:t}),!0},addRule=(e,a={})=>{const n=normalizeRule(e,a.pack);return!(findIndex(n.id)>=0)&&(Number.isInteger(a.index)&&a.index>=0&&a.index<t.length?t.splice(a.index,0,n):t.push(n),emit("RuleAdded",{id:n.id,pack:n.pack}),!0)},removeRule=e=>{const a=findIndex(e);if(a<0)return!1;synthesizeDeactivation(e,"removed");const[n]=t.splice(a,1);return emit("RuleRemoved",{id:n.id,pack:n.pack}),!0},setEnabled=(e,a)=>{const n=findIndex(e);return!(n<0)&&(t[n].enabled!==a&&(t[n].enabled=a,a||synthesizeDeactivation(e,"disabled"),emit(a?"RuleEnabled":"RuleDisabled",{id:e}),!0))},setPackEnabled=(e,a)=>{let n=!1;return t.forEach(t=>{t.pack===e&&(n=setEnabled(t.id,a)||n)}),n},loadPack=(e,t=[])=>{let a=!1;return t.forEach(t=>{a=addRule({...t,pack:e},{pack:e})||a}),a&&emit("RulePackLoaded",{packId:e}),a},unloadPack=e=>{const a=t.filter(t=>t.pack===e).map(e=>e.id);return!!a.length&&(a.forEach(e=>removeRule(e)),emit("RulePackUnloaded",{packId:e,count:a.length}),!0)},reorder=(e=[])=>{if(!Array.isArray(e)||!e.length)return!1;const a=new Set(t.map(e=>e.id)),n=new Set(e);if(e.length!==t.length||n.size!==t.length)return!1;if([...a].some(e=>!n.has(e)))return!1;const s=t.reduce((e,t)=>(e[t.id]=t,e),{});return t.length=0,e.forEach(e=>t.push(s[e])),emit("RuleOrderChanged",{order:[...e]}),!0},evaluate=(e={})=>{const a=createEmptyOverlay(),s=[],i=new Map;for(const n of t){if(!n.enabled)continue;const t=n.evaluate(e);if(t&&(s.push(n.id),i.set(n.id,{id:n.id,pack:n.pack,meta:n.meta,suspendsCuring:!0===t.suspendCuring}),mergeOverlay(a,t),n.terminal))break}a.commands=Array.from(new Set(a.commands||[]));const o=diffRuleActivity(n,i),l=diffRuleSuspension(n,i);return n.clear(),i.forEach((e,t)=>n.set(t,e)),{overlay:a,applied:s,transitions:o,suspendTransitions:l,suspendingRules:[...i.values()].filter(e=>e.suspendsCuring).map(e=>e.id)}};return e.forEach(e=>addRule(e,{pack:e.pack||"general"})),{onChange:e=>(a.add(e),()=>a.delete(e)),addRule,removeRule,enableRule:e=>setEnabled(e,!0),disableRule:e=>setEnabled(e,!1),enablePack:e=>setPackEnabled(e,!0),disablePack:e=>setPackEnabled(e,!1),loadPack,unloadPack,reorder,evaluate,list:()=>t.map(e=>({id:e.id,enabled:e.enabled,terminal:e.terminal,isActive:n.has(e.id),suspendsCuring:Boolean(n.get(e.id)?.suspendsCuring),pack:e.pack,tags:[...e.tags],meta:deepClone$1(e.meta)}))}},createSettingCommand=(e,t)=>Object.freeze({commandId:e,buildCommand:t}),$e=Object.freeze({afflictions:createSettingCommand("curing-afflictions",e=>`curing afflictions ${boolWord(e)}`),defences:createSettingCommand("curing-defences",e=>`curing defences ${boolWord(e)}`),sipping:createSettingCommand("curing-sipping",e=>`curing sipping ${boolWord(e)}`),transmutation:createSettingCommand("curing-transmutation",e=>`curing transmutation ${boolWord(e)}`),sipHealthAt:createSettingCommand("curing-siphealth",e=>`curing siphealth ${e}`),sipManaAt:createSettingCommand("curing-sipmana",e=>`curing sipmana ${e}`),mossHealthAt:createSettingCommand("curing-mosshealth",e=>`curing mosshealth ${e}`),mossManaAt:createSettingCommand("curing-mossmana",e=>`curing mossmana ${e}`),sipPriority:createSettingCommand("curing-priority-mode",e=>`curing priority ${String(e||"health").toLowerCase()}`),focus:createSettingCommand("curing-focus-enabled",e=>`curing focus ${boolWord(e)}`),focusOverHerbs:createSettingCommand("curing-focus-priority-mode",e=>"curing focus "+(e?"first":"second")),tree:createSettingCommand("curing-tree",e=>{const t=String(e||"on").toLowerCase();return["on","off","custom"].includes(t)?`curing tree ${t}`:null}),useVault:createSettingCommand("curing-usevault",e=>`curing usevault ${boolWord(e)}`),clot:createSettingCommand("curing-useclot",e=>`curing useclot ${boolWord(e)}`),clotAt:createSettingCommand("curing-clotat",e=>`curing clotat ${e}`),fallback:createSettingCommand("curing-fallback",e=>`curing fallback ${boolWord(e)}`),kaidoTransmute:createSettingCommand("curing-kaidotransmute",e=>e?"curing kaidotransmute":null),batch:createSettingCommand("curing-batch",e=>`curing batch ${boolWord(e)}`),fracturesAbove:createSettingCommand("curing-healthaffsabove",e=>`curing healthaffsabove ${e}`),manaThreshold:createSettingCommand("curing-manathreshold",e=>`curing manathreshold ${e}`)}),sameArray=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},mapDiff=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]),toGamePriorityToken=e=>isServersideAffPriorityNumber(e)?String(Number(e)):String(26),createServersideDiffPlanner=({baseline:e={},getBaseline:t,getAffPriorityCommandName:a,getDefPriorityTokens:n}={})=>{const resolveBaseline=()=>"function"==typeof t?t()||{}:e,resolveAffPriorityCommandName=e=>{if("function"==typeof a){const t=a(e);if(t)return String(t)}return String(e)},resolveDefPriorityTokens=(e,t)=>{if(!isServersideAffPriorityNumber(t))return["reset"];if("function"==typeof n){const a=n(e,Number(t));if(Array.isArray(a)&&a.length)return a.map(e=>String(e));if(null!=a&&!1!==a)return[String(a)]}return[String(Number(t))]},normalizeDesiredDefPriority=e=>"RESET"===e||void 0===e?0:isServersideAffPriorityNumber(e)?Number(e):0;return{build:({desired:e={},observed:t={}}={})=>{const a=resolveBaseline(),n=a.settings||{},s=a.affPriorities||{},i=[],o=[],l=e.settings||{};mapDiff(l,t.settings||{}).sort().forEach(e=>{const t=$e[e];if(!t)return;const a=t.buildCommand(l[e]);a&&(i.push(a),o.push(`settings:${e}`))});const c=e.affPriorities||{},u=t.affPriorities||{};!0===e.fullPriorityReset&&(i.push("curing priority reset"),o.push("aff-priority:reset-all"));const resolveDesiredAffPriority=e=>{const t=c[e];return"RESET"===t||void 0===t?s[e]??0:t},d=[...new Set([...Object.keys(c),...Object.keys(u)])].filter(e=>canonicalAffPriority(resolveDesiredAffPriority(e))!==canonicalAffPriority(u[e])).sort().map(e=>[e,toGamePriorityToken(resolveDesiredAffPriority(e))]);if(d.length){const e=d.flatMap(([e,t])=>[resolveAffPriorityCommandName(e),String(t)]);i.push(`curing priority ${e.join(" ")}`),d.forEach(([e])=>o.push(`aff-priority:${e}`))}const m=e.defPriorities||{},p=t.defPriorities||{},g=[...new Set([...Object.keys(m),...Object.keys(p)])].filter(e=>normalizeDesiredDefPriority(m[e])!==Number(p[e]??0)).sort().map(e=>{const t=m[e];return"RESET"===t||void 0===t?[e,["reset"],`def-priority-reset:${e}`]:isServersideAffPriorityNumber(t)?[e,resolveDefPriorityTokens(e,t),`def-priority:${e}`]:[e,["reset"],`def-priority-reset:${e}`]});if(g.length){const e=g.flatMap(([e,t])=>[e,...t]);i.push(`curing priority defence ${e.join(" ")}`),g.forEach(([,,e])=>o.push(e))}const h=e.prioAff;h!==t.prioAff&&(h?(i.push(`curing prioaff ${h}`),o.push(`prioaff:${h}`)):(i.push("curing prioaff none"),o.push("prioaff:clear")));const b=e.manualQueue||[];return sameArray(b,t.manualQueue||[])||(i.push("curing queue reset"),b.forEach((e,t)=>{i.push(`curing queue insert ${t+1} ${e}`)}),o.push("manual-queue:reconcile")),{commands:Array.from(new Set(i)),reasonCodes:o,baseSettings:n}},getBaseSettings:()=>resolveBaseline().settings||{},getBaseAff:()=>resolveBaseline().affPriorities||{},getBaseDef:()=>resolveBaseline().defPriorities||{}}},Fe=Object.freeze({BALANCE:"balance",EQUILIBRIUM:"equilibrium",ENTITY:"entity",FOCUS:"focus",FREE:"free",WRITHE:"writhe"}),emergencyClassRules=e=>{const t={},a=!e.haveBal(Fe.FOCUS)||e.haveAff("impatience");return t.fitness=e.isClass(["Runewarden","Monk","Blademaster","Infernal","Paladin","Sentinel","Druid"])&&e.haveAff("asthma")&&(e.haveAnAff(["slickness","hellsight"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity"])||e.haveAnAff(["damagedhead","mangledhead","damagedleftleg","damagedrightleg"])&&e.haveAnAff(["paralysis","clumsiness","sensitivity","slickness","hellsight","disloyalty"]))?100:"RESET",t.dragonheal=e.isClass("Dragon")&&e.haveAffs(["asthma","slickness","anorexia"])&&a?100:"RESET",t.dragonflex="RESET",e.isClass("Dragon")&&(e.haveAffs(["entangled","webbed"])||e.haveAnAff(["entangled","webbed"])&&(e.haveBal(Fe.BALANCE)&&!e.haveBal(Fe.WRITHE)||e.haveAff("transfixation")))&&(t.dragonflex=100),t.bloodboil=e.isClass("Magi")&&e.haveAffs(["asthma","slickness"])&&(e.haveAnAff(["hypochondria","paralysis"])||e.haveAff("anorexia")&&a)?100:"RESET",t.dwinnu=e.isClass("Bard")&&(e.haveAffs(["webbed","entangled"])||e.haveAnAff(["webbed","entangled"])&&e.haveAff("transfixation"))?100:"RESET",t.salt=e.isClass("Alchemist")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","paralysis"]))?100:"RESET",t.shrugging=e.isClass("Serpent")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","paralysis"]))?100:"RESET",t.fool=e.isClass("Occultist")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","impatience"]))?100:"RESET",t.alleviate=e.isClass("Blademaster")&&(e.haveAffs(["asthma","slickness","anorexia"])&&a||e.haveAffs(["asthma","slickness","hypochondria"])||e.haveAffs(["asthma","slickness","impatience"]))?100:"RESET",t},createDefaultServersideRulePack=()=>[{id:"aeon-threshold-and-priority",pack:"general",evaluate:e=>e.haveAff("aeon")?{settings:{sipHealthAt:30,sipManaAt:10,mossHealthAt:0,mossManaAt:0,batch:!1,clotAt:5e3},affPriorities:{asthma:3,weariness:4,anorexia:5,impatience:7,paralysis:8}}:null},{id:"nonfunctional-legs-paralysis",pack:"general",evaluate:e=>e.haveAnAff(["brokenleftleg","damagedleftleg","mangledleftleg"])&&e.haveAnAff(["brokenrightleg","damagedrightleg","mangledrightleg"])?{affPriorities:{paralysis:25}}:null},{id:"kelp-paralysis-slickness",pack:"general",evaluate:e=>1==e.cureAffCount("kelp")&&e.haveAffs(["paralysis","asthma","slickness"])?{affPriorities:{asthma:1}}:null},{id:"scytherus-paralysis",pack:"general",evaluate:e=>e.haveAffs(["scytherus","paralysis"])?{affPriorities:{scytherus:2}}:null},{id:"confusion-disrupted",pack:"general",evaluate:e=>e.haveAffs(["confusion","disrupted"])&&(e.haveBal(Fe.FOCUS)||e.haveAff("impatience"))&&!e.haveAff("whisperingmadness")?{affPriorities:{confusion:2}}:null},{id:"impatience-snaptrack",pack:"general",evaluate:e=>e.haveAff("impatience")&&e.trackableElapsed("snapTrack")<8e3?{affPriorities:{impatience:2}}:null},{id:"hypochondria-impatience",pack:"general",evaluate:e=>e.haveAffs(["impatience","hypochondria"])?{affPriorities:{hypochondria:1}}:e.haveAff("hypochondria")&&e.trackableElapsed("snapTrack")<8e3?{affPriorities:{hypochondria:2}}:null},{id:"slickness-asthma-sensitivity-group",pack:"general",evaluate:e=>{const t=e.haveAnAff(["sensitivity","clumsiness","weariness","hypochondria"]);return e.haveAffs(["slickness","asthma"])&&t&&!e.haveAff("anorexia")?{affPriorities:{slickness:2}}:null}},{id:"asthma-hellsight-slickness",pack:"general",evaluate:e=>{const t=!e.haveAnAff(["sensitivity","clumsiness","weariness","hypochondria"]);return e.haveAffs(["slickness","asthma"])&&t||e.haveAffs(["hellsight","asthma"])?{affPriorities:{asthma:2}}:null}},{id:"darkshade-lightwall",pack:"general",evaluate:e=>e.haveAff("darkshade")&&e.affElapsed("darkshade")>1e4&&e.roomHasItem("a lightwall")?{affPriorities:{darkshade:2}}:null},{id:"prone-sensitivity-legdamage",pack:"general",evaluate:e=>e.haveAffs(["prone","sensitivity"])&&e.haveAnAff(["damagedleftleg","damagedrightleg"])?{affPriorities:{sensitivity:2}}:null},{id:"conflagration-burning",pack:"general",evaluate:e=>{if(!e.haveAff("conflagration")||!e.haveAnAff(["brokenleftleg","brokenrightleg","damagedleftleg","damagedrightleg","mangledleftleg","mangledrightleg"]))return null;const t=e.haveAnAff(["damagedleftleg","damagedrightleg","mangledleftleg","mangledrightleg"]);return e.haveAff("prone")&&!t?{affPriorities:{burning:7}}:{affPriorities:{burning:4}}}},{id:"class-emergency-cures",pack:"general",evaluate:e=>({curePriorities:emergencyClassRules(e)})}],ze=Object.freeze(["status","affPriorities","defPriorities"]),Ge=Object.freeze({reportingcommands:"reporting",afflictions:"afflictions",defences:"defences",sipping:"sipping",transmutation:"transmutation",siphealth:"sipHealthAt",siphealthat:"sipHealthAt",sipmana:"sipManaAt",sipmanaat:"sipManaAt",mosshealth:"mossHealthAt",mosshealthat:"mossHealthAt",mossmana:"mossManaAt",mossmanaat:"mossManaAt",priority:"sipPriority",sippriority:"sipPriority",focus:"focus",focusoverherbs:"focusOverHerbs",tree:"tree",usevault:"useVault",useclot:"clot",clot:"clot",clotat:"clotAt",clotabove:"clotAbove",fallback:"fallback",kaidotransmute:"kaidoTransmute",customcuringpriority:"customAffPriority",customdefencepriority:"customDefPriority",batch:"batch",healthaffsabove:"fracturesAbove",fracturesabove:"fracturesAbove",manathreshold:"manaThreshold",insomnia:"insomnia"}),He=Object.freeze(new Set(["status","enabled"])),createServersideObservationApi=({state:e,affModel:t,defModel:a,systemModel:n,emit:s,markDirty:i,replaceBucket:o,maybeResolveFullPriorityReset:l,normalizeAffPriorityName:c=e=>String(e||"").toLowerCase()})=>{const getMissingStartupFlags=(t=Object.keys(e.startup.flags))=>t.filter(t=>t in e.startup.flags&&!e.startup.flags[t]),u=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>({...e.startup.flags})}),d=createSnapshotCache({getVersion:()=>e.startup,buildSnapshot:()=>{const e=u(),t=getMissingStartupFlags(ze);return{ready:Object.values(e).every(Boolean),requiredReady:0===t.length,missingRequired:t,flags:e}}}),markStartupCaptured=t=>t in e.startup.flags&&!e.startup.flags[t]&&(o("startup",{...e.startup,flags:{...e.startup.flags,[t]:!0}}),s("ServersideStartupSnapshotCaptured",{topic:t,flags:u()}),!0),updateObservedSetting=(t,a)=>{if(e.observed.settings[t]!==a){if(o("observed",{...e.observed,settings:{...e.observed.settings,[t]:a}}),e.startup.flags.status){const n=e.derived?.settings?.[t];void 0!==n&&"RESET"!==n||o("sessionBaseline",{...e.sessionBaseline,settings:{...e.sessionBaseline.settings,[t]:a}})}i(`observed-setting:${t}`)}},normalizeCaptureSetName=e=>String(e||"").trim().toLowerCase(),isCaptureSetOwned=e=>{const t=e||"";return""===t||"nexsys4-default"===t},completeObservedAffPrioritySnapshot=()=>{const t=e.capture.affPriorities,a=e.capture.prioritySet||"";if(e.capture.affPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,affPriorities:t,prioritySet:a}),l(),i("observed-aff-priority-snapshot")}return markStartupCaptured("affPriorities"),!0},completeObservedDefPrioritySnapshot=()=>{const t=e.capture.defPriorities,a=e.capture.prioritySet||"";if(e.capture.defPriorities=null,e.capture.prioritySet="",t){if(!isCaptureSetOwned(a))return!1;o("observed",{...e.observed,defPriorities:t,prioritySet:a}),i("observed-def-priority-snapshot")}return markStartupCaptured("defPriorities"),!0},updateObservedQueue=(t=[])=>{const a=t||[],n=e.observed.manualQueue,s=a.length===n.length&&a.every((e,t)=>e===n[t]);markStartupCaptured("queue"),s||(o("observed",{...e.observed,manualQueue:[...a]}),i("observed-manual-queue"))},updateObservedPredictions=(t={})=>{const a=t||{},n=e.observed.predictions,s=Object.keys(a),l=s.length===Object.keys(n).length&&s.every(e=>a[e]===n[e]);markStartupCaptured("predictions"),l||(o("observed",{...e.observed,predictions:{...a}}),i("observed-predictions"))},parseStatusLine=({key:e,value:t})=>{const a=String(e||"").trim();if(He.has(a.toLowerCase()))return;const n=Ge[a.toLowerCase()]||a;updateObservedSetting(n,normalizeStatusValue(n,t))};return{markStartupCaptured,resetStartupStatus:()=>{const t=Object.keys(e.startup.flags).reduce((e,t)=>(e[t]=!1,e),{});return e.capture.affPriorities=null,e.capture.defPriorities=null,o("startup",{...e.startup,flags:t}),s("ServersideStartupReset",{flags:u()}),!0},isStartupReady:()=>Object.values(e.startup.flags).every(Boolean),getStartupStatus:()=>d(),getMissingStartupFlags,beginObservedAffPrioritySnapshot:(a="")=>(e.capture.affPriorities=buildObservedAffPriorities(t),e.capture.prioritySet=normalizeCaptureSetName(a),!0),completeObservedAffPrioritySnapshot,updateObservedSetting,updateObservedAffPriority:(t,a)=>{const n=e.capture.affPriorities||e.observed.affPriorities,s=String(t||"").toLowerCase(),u=c(t);if(!u)return!1;if(!Object.prototype.hasOwnProperty.call(n,u))return!1;const d=normalizeServersideAffPriority(a);if(e.capture.affPriorities)return s&&s!==u&&delete n[s],n[u]=d,!0;const m={...e.observed.affPriorities};if(s&&s!==u&&delete m[s],m[u]=d,o("observed",{...e.observed,affPriorities:m}),l(),e.startup.flags.affPriorities){const t=e.derived?.affPriorities?.[u];void 0!==t&&"RESET"!==t||o("sessionBaseline",{...e.sessionBaseline,affPriorities:{...e.sessionBaseline.affPriorities,[u]:d}})}return i(`observed-aff-priority:${u}`),!0},beginObservedDefPrioritySnapshot:(t="")=>(e.capture.defPriorities=buildObservedDefPriorities(a,n.getClass()),e.capture.prioritySet=normalizeCaptureSetName(t),!0),completeObservedDefPrioritySnapshot,updateObservedDefPriority:(t,s)=>{const l=e.capture.defPriorities||e.observed.defPriorities,c=String(t||"").toLowerCase(),u=a.get(c);if(!u?.serverside)return!1;if(!a.isAvailableForClass(c,n.getClass()))return!1;const d="RESET"===String(s).toUpperCase()?0:Number(s);if(!Number.isFinite(d))return!1;if(e.capture.defPriorities)return l[c]=d,!0;if(o("observed",{...e.observed,defPriorities:{...e.observed.defPriorities,[c]:d}}),e.startup.flags.defPriorities){const t=e.derived?.defPriorities?.[c];if(void 0===t||"RESET"===t){const t={...e.sessionBaseline.defPriorities};u.static?delete t[c]:t[c]=d,o("sessionBaseline",{...e.sessionBaseline,defPriorities:t})}}return i(`observed-def-priority:${c}`),!0},updateObservedQueue,updateObservedPredictions,parseStatusLine}},createServersideTransientApi=({state:e,trackables:t,now:a,markDirty:n,emit:s,replaceBucket:i,normalizeAffName:o=e=>String(e||"").toLowerCase()})=>{const getPredictionCommands=()=>Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],getPredictionRequests=()=>Array.isArray(e.transient.predictionRequests)?e.transient.predictionRequests:[],normalizePredictionAff=e=>String(o(e)||"").trim().toLowerCase(),replaceTransient=t=>i("transient",{...e.transient,...t}),clearPredictionCommands=(e=new Set)=>{if(!e.size)return!1;const t=getPredictionCommands(),a=t.filter(t=>!e.has(normalizeCommand(t)));return a.length!==t.length&&replaceTransient({predictionCommands:a})},clearPredictionRequest=e=>{const t=getPredictionRequests();if(!t.length)return!1;const a=normalizePredictionAff(e),n=a?t.indexOf(a):0;if(n<0)return!1;const s=[...t];return s.splice(n,1),replaceTransient({predictionRequests:s})},queuePredictionCommand=e=>{const t=normalizePredictionAff(e);if(!t)return!1;const a=`curing predict ${t}`,s=normalizeCommand(a),i=getPredictionCommands(),o=getPredictionRequests();return!i.some(e=>normalizeCommand(e)===s)&&!o.includes(t)&&(replaceTransient({predictionCommands:[...i,a],predictionRequests:[...o,t]}),n(`prediction-request:${t}`),!0)};return{setTrackable(e,i,o={}){const l=String(e||"").trim();if(!l)return!1;t[l]||(t[l]={have:!1,since:0});const c=Boolean(i);if(t[l].have===c)return!1;const u=a();return t[l].have=c,t[l].since=c?u:0,s(c?"TrackableGot":"TrackableLost",{name:l,label:String(o.label||l),have:c,at:u,since:t[l].since,source:String(o.source||"manual")}),n(`trackable:${l}`),!0},setPrioAff(t){const a=t?o(t):null;return e.transient.prioAff!==a&&(i("transient",{...e.transient,prioAff:a}),n("prioaff"),!0)},clearPrioAff:()=>!!e.transient.prioAff&&(i("transient",{...e.transient,prioAff:null}),n("prioaff-clear"),!0),requestPriorityReset:()=>!e.transient.fullPriorityReset&&(i("transient",{...e.transient,fullPriorityReset:!0}),n("priority-reset-request"),!0),requestStaticDefPriorities(t={}){let a=!1;const s={...e.transient.staticDefRequests};return Object.entries(t||{}).forEach(([e,t])=>{const n=String(e||"").trim().toLowerCase(),i=Number(t);!n||!Number.isInteger(i)||i<1||i>25||s[n]!==i&&(s[n]=i,a=!0)}),a&&(i("transient",{...e.transient,staticDefRequests:s}),n("static-def-request")),a},clearStaticDefPriorities(t){const a=Array.isArray(t)?t.map(e=>String(e||"").trim().toLowerCase()).filter(Boolean):Object.keys(e.transient.staticDefRequests);let s=e.transient.staticDefRequests;a.forEach(t=>{Object.prototype.hasOwnProperty.call(s,t)&&(s===e.transient.staticDefRequests&&(s={...e.transient.staticDefRequests}),delete s[t])});const o=i("transient",{...e.transient,staticDefRequests:s});return o&&n("static-def-clear"),o},addPrediction:e=>queuePredictionCommand(e),removePrediction(e){const t=normalizePredictionAff(e);if(!t)return!1;const a=clearPredictionCommands(new Set([normalizeCommand(`curing predict ${t}`)])),s=clearPredictionRequest(t);return a&&n(`prediction-cancel:${t}`),a||s},confirmPrediction:e=>clearPredictionRequest(e),manualQueueAdd(t){const a=String(t||"").toLowerCase();return!(!a||e.transient.manualQueue.includes(a))&&(i("transient",{...e.transient,manualQueue:[...e.transient.manualQueue,a]}),n("manual-queue-add"),!0)},manualQueueInsert(t,a){const s=String(a||"").toLowerCase(),o=Math.max(1,Math.min(20,Number(t||1)));if(!s||e.transient.manualQueue.includes(s))return!1;const l=[...e.transient.manualQueue];return l.splice(o-1,0,s),i("transient",{...e.transient,manualQueue:l}),n("manual-queue-insert"),!0},manualQueueRemove(t){const a=String(t||"").toLowerCase(),s=e.transient.manualQueue.indexOf(a);if(s<0)return!1;const o=[...e.transient.manualQueue];return o.splice(s,1),i("transient",{...e.transient,manualQueue:o}),n("manual-queue-remove"),!0},manualQueueReset:()=>!!e.transient.manualQueue.length&&(i("transient",{...e.transient,manualQueue:[]}),n("manual-queue-reset"),!0)}},shallowCopyDesired=e=>({settings:{...e.settings},affPriorities:{...e.affPriorities},defPriorities:{...e.defPriorities},curePriorities:{...e.curePriorities},manualQueue:[...e.manualQueue||[]],predictions:{...e.predictions},prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),injectedCommands:[...e.injectedCommands||[]],appliedRules:[...e.appliedRules||[]],suspendingRules:[...e.suspendingRules||[]]}),copyRuleTransitionPayload=(e,t)=>({id:e.id,pack:e.pack,meta:e.meta,source:t,suspendsCuring:!0===e.suspendsCuring}),areCommandSequencesEqual=(e=[],t=[])=>{if(e.length!==t.length)return!1;for(let a=0;a<e.length;a+=1)if(e[a]!==t[a])return!1;return!0},createServersideEvaluationApi=({state:e,affModel:t,defModel:a,balanceModel:n,systemModel:s,cureTable:i,ruleRegistry:o,diffPlanner:l,sendCommands:c,emit:u,markDirty:d,replaceBucket:m,refreshRulesBucket:p,now:g,trackables:h,options:b})=>{const clearResolvedPending=()=>{const t=b.pendingTimeoutMs||12e3,a=g();let n=e.pending;for(const[s,i]of e.pending.entries())a-i>t&&(n===e.pending&&(n=new Map(e.pending)),n.delete(s));return m("pending",n)},clearSentPredictionCommands=(t=[])=>{const a=new Set(t.map(e=>normalizeCommand(e)));if(!a.size)return!1;const n=Array.isArray(e.transient.predictionCommands)?e.transient.predictionCommands:[],s=n.filter(e=>!a.has(normalizeCommand(e)));return s.length!==n.length&&m("transient",{...e.transient,predictionCommands:s})},markPendingCommands=(t=[],a={})=>{const n=t.map(e=>normalizeCommand(e)).filter(e=>e&&isServersideCommand(e));if(n.length){const t=g(),a=new Map(e.pending);n.forEach(e=>a.set(e,t)),m("pending",a)}return n.length&&(u("ServersidePendingUpdated",{commands:[...n],context:{...a}}),clearSentPredictionCommands(n)),n},filterServersideDefPriorities=(e={})=>{const t=s.getClass();return Object.entries(e||{}).reduce((e,[n,s])=>{const i=a.get(n);return!i?.serverside||i.static?e:a.isAvailableForClass(n,t)?(e[n]=s,e):e},{})},buildRequestedStaticDefPriorities=()=>{const t=s.getClass(),n=e.transient.staticDefRequests||{};let i=n;const removeRequest=e=>{i===n&&(i={...n}),delete i[e]},o=Object.entries(n).reduce((e,[n,s])=>{const i=a.get(n);if(!i?.static)return removeRequest(n),e;if(a.haveDef(n)||!a.isAvailableForClass(n,t))return removeRequest(n),e;if(!i.serverside)return e;const o=a.getPriority(n),l=isServersideAffPriorityNumber(o)?o:s;return!isServersideAffPriorityNumber(l)||Number(l)>=26?(removeRequest(n),e):(e[n]=Number(l),e)},{});return i!==n&&m("transient",{...e.transient,staticDefRequests:i}),o},emitRuleTransitions=(e=[],t)=>{e.forEach(e=>{e.to||u("RuleDeactivated",{...copyRuleTransitionPayload(e,t)})}),e.forEach(e=>{e.to&&u("RuleActivated",{...copyRuleTransitionPayload(e,t)})})},emitRuleSuspendTransitions=(e=[],t)=>{e.forEach(e=>{e.to||u("RuleSuspendDeactivated",{...copyRuleTransitionPayload(e,t)})}),e.forEach(e=>{e.to&&u("RuleSuspendActivated",{...copyRuleTransitionPayload(e,t)})})},resolveDesired=()=>{const l=createServersideContext({affModel:t,defModel:a,balanceModel:n,systemModel:s,trackables:h,cureTable:i,now:g}),c=o.evaluate(l);return p?.(),m("derived",c.overlay),m("desired",{settings:{...e.sessionBaseline.settings,...c.overlay.settings},affPriorities:mergeWithResets(e.sessionBaseline.affPriorities,c.overlay.affPriorities),defPriorities:{...mergeWithResets(e.sessionBaseline.defPriorities,filterServersideDefPriorities(c.overlay.defPriorities)),...buildRequestedStaticDefPriorities()},curePriorities:mergeWithResets(e.sessionBaseline.curePriorities,c.overlay.curePriorities),manualQueue:Array.isArray(c.overlay.manualQueue)?[...c.overlay.manualQueue]:[...e.transient.manualQueue],predictions:{},prioAff:null!==e.transient.prioAff&&void 0!==e.transient.prioAff?e.transient.prioAff:c.overlay.prioAff||null,fullPriorityReset:e.transient.fullPriorityReset,injectedCommands:[...e.transient.predictionCommands||[],...c.overlay.commands||[]],appliedRules:c.applied,suspendingRules:c.suspendingRules||[]}),{desired:e.desired,evaluation:c}};return{markPendingCommands,maybeResolveFullPriorityReset:()=>!!e.transient.fullPriorityReset&&(!!Object.keys(e.sessionBaseline.affPriorities).every(t=>(e.observed.affPriorities[t]??e.sessionBaseline.affPriorities[t])===e.sessionBaseline.affPriorities[t])&&(m("transient",{...e.transient,fullPriorityReset:!1}),u("ServersideFullPriorityResetResolved",{fullPriorityReset:!1}),!0)),evaluate({emitCommands:t=!0,source:a="prompt"}={}){clearResolvedPending();const{desired:n,evaluation:s}=resolveDesired(),i=l.build({desired:n,observed:e.observed});let o=[...n.injectedCommands,...i.commands].filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));const d=Math.max(1,Number(b.maxCommandsPerCycle||40));let p=e.diagnostics.recoveryCounter;o.length>d&&(o=o.slice(0,d),p+=1);const g=(i.commands||[]).filter(Boolean).filter(t=>!e.pending.has(normalizeCommand(t)));let h=g.length&&areCommandSequencesEqual(e.lastDiffCommands||[],g)?e.diagnostics.commandRepeatCounter+1:0,y=e.diagnostics.desyncCounter;return h>=(b.desyncCommandRepeats||3)&&(y+=1,p+=1,o.push("curing status","curing priority list","curing priority defence list","curing queue list","curing predictions"),h=0),t&&o.length&&(c(o,{source:"serverside-reconcile",reasonCodes:i.reasonCodes,cycleSource:a}),markPendingCommands(o,{source:"serverside-reconcile",reasonCodes:i.reasonCodes,cycleSource:a})),e.lastDiffCommands=[...g],m("diagnostics",{...e.diagnostics,lastCommands:[...o],lastReasons:[...i.reasonCodes],desyncCounter:y,recoveryCounter:p,commandRepeatCounter:h}),e.dirty=!1,u("ServersideEvaluated",{source:a,desired:shallowCopyDesired(n),commands:[...o],reasons:[...i.reasonCodes],suspendingRules:[...s.suspendingRules||[]]}),emitRuleSuspendTransitions(s.suspendTransitions,a),emitRuleTransitions(s.transitions,a),{desired:shallowCopyDesired(n),commands:o,reasons:i.reasonCodes}},setBaselineFromRuntime(){const{enabled:n,...o}=s.getBaselineIntent().ss||{},l=s.getClass(),c={...e.baseline,settings:{...e.baseline.settings,...o},affPriorities:buildBaselineAffPriorities(t),defPriorities:buildBaselineDefPriorities(a,l),curePriorities:buildBaselineCurePriorities(i)};m("baseline",c);const u=buildObservedDefPriorities(a,l),p=Object.keys(u).reduce((t,a)=>(t[a]=e.observed.defPriorities[a]??u[a],t),{});m("observed",{...e.observed,defPriorities:p}),m("sessionBaseline",{settings:{...c.settings},affPriorities:{...c.affPriorities},defPriorities:{...c.defPriorities},curePriorities:{...c.curePriorities}}),d("baseline-refresh")},getCurePriority(t){const a=String(t||"").toLowerCase();return e.desired.curePriorities?.[a]??e.baseline.curePriorities[a]??0},observeOutbound:(e=[])=>markPendingCommands(e,{source:"observe-outbound"})}},createServersideCuringSetApi=({state:e,sendCommands:t,markPendingCommands:a,markDirty:n,markStartupCaptured:s,replaceBucket:i})=>{const issueCuringSetCommand=(e,n)=>{const s=normalizeCommand(e);return!!s&&(t([s],{source:"serverside-curingset",reason:n}),a([s],{source:"serverside-curingset",reason:n}),!0)};return{switchCuringSet(t){const a=normalizeSetName(t);if(!a)return!1;const s=issueCuringSetCommand(`curingset switch ${a}`,"switch");return s&&(i("curingsets",{...e.curingsets,activeSet:a}),n("curingset-switch")),s},deleteCuringSet(e){const t=normalizeSetName(e);return!!t&&issueCuringSetCommand(`curingset delete ${t}`,"delete")},observeActiveCuringSet(t){const a=normalizeSetName(t);if(!a||a===normalizeSetName(e.curingsets.activeSet))return!1;const s=i("curingsets",{...e.curingsets,activeSet:a});return s&&n("curingset-active"),s},observeCuringSets({sets:t=[],activeSet:a="",used:o,limit:l}={}){const c=[...new Set((t||[]).map(e=>normalizeSetName(e)).filter(Boolean))],u=normalizeSetName(a),d=Number(o),m=Number(l),p=Number.isFinite(d)?d:e.curingsets.used,g=Number.isFinite(m)?m:e.curingsets.limit,h=e.curingsets.priorSet||(u&&"nexsys4-default"!==u?u:"");i("curingsets",{...e.curingsets,sets:c,activeSet:u,priorSet:h,used:p,limit:g}),s("curingsets"),n("curingset-observed")}}},Ue=new Set(["RuleActivated","RuleDeactivated","RuleAdded","RuleRemoved","RuleEnabled","RuleDisabled","RulePackLoaded","RulePackUnloaded","RuleOrderChanged"]),Ve=Object.freeze(["baseline","sessionBaseline","derived","desired","observed","transient","pending","diagnostics","curingsets","startup","rules"]),areBucketValuesEqual=(e,t)=>{if(Object.is(e,t))return!0;if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;if(e instanceof Date||t instanceof Date)return e instanceof Date&&t instanceof Date&&e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t))return!(!Array.isArray(e)||!Array.isArray(t))&&(e.length===t.length&&e.every((e,a)=>areBucketValuesEqual(e,t[a])));if(e instanceof Map||t instanceof Map){if(!(e instanceof Map&&t instanceof Map))return!1;if(e.size!==t.size)return!1;const a=[...e.entries()],n=[...t.entries()];for(let e=0;e<a.length;e+=1){const[t,s]=a[e],[i,o]=n[e];if(!Object.is(t,i)||!areBucketValuesEqual(s,o))return!1}return!0}const a=Object.keys(e),n=Object.keys(t);return a.length===n.length&&a.every(a=>Object.prototype.hasOwnProperty.call(t,a)&&areBucketValuesEqual(e[a],t[a]))},createServersideController=({adapter:e,dispatchCommands:t,affModel:a,defModel:n,balanceModel:s,systemModel:i,cureTable:o={},options:l={}}={})=>{if("function"!=typeof t)throw new Error("createServersideController requires a dispatchCommands function.");const now=()=>e.now(),c=t,u={snapTrack:{have:!1,since:0}},{enabled:d,...m}=i.getBaselineIntent().ss||{},p=createInitialServersideState({baselineSettings:{afflictions:!0,defences:!0,sipping:!0,transmutation:!0,fallback:!0,kaidoTransmute:!1,...m},affModel:a,defModel:n,systemModel:i,cureTable:o}),g=new Set,emit=(e,t)=>{g.forEach(a=>a(e,t))},markDirty=(e="state-change")=>{p.dirty=!0,emit("ServersideDirty",{reason:e})},replaceBucket=(e,t)=>!areBucketValuesEqual(p[e],t)&&(p[e]=t,!0),h=createRuleRegistry(createDefaultServersideRulePack()),refreshRulesBucket=()=>replaceBucket("rules",h.list());refreshRulesBucket();const b=createServersideDiffPlanner({getBaseline:()=>p.baseline,getAffPriorityCommandName:"function"==typeof a?.formatPriorityCommandName?e=>a.formatPriorityCommandName(e):void 0,getDefPriorityTokens:(e,t)=>{const a=[String(Number(t))];return!0===n.get(e)?.preempt&&a.push("preempt"),a}}),y="function"==typeof a?.normalizeName?e=>a.normalizeName(e):e=>String(e||"").toLowerCase(),v="function"==typeof a?.normalizePriorityName?e=>a.normalizePriorityName(e):e=>String(e||"").toLowerCase(),S=createServersideEvaluationApi({state:p,affModel:a,defModel:n,balanceModel:s,systemModel:i,cureTable:o,ruleRegistry:h,diffPlanner:b,sendCommands:c,emit,markDirty,replaceBucket,refreshRulesBucket,now,trackables:u,options:l}),x=createServersideObservationApi({state:p,affModel:a,defModel:n,systemModel:i,emit,markDirty,replaceBucket,maybeResolveFullPriorityReset:S.maybeResolveFullPriorityReset,normalizeAffPriorityName:v}),C=createServersideTransientApi({state:p,trackables:u,now,markDirty,emit,replaceBucket,normalizeAffName:y}),k=createServersideCuringSetApi({state:p,sendCommands:c,markPendingCommands:S.markPendingCommands,markDirty,markStartupCaptured:x.markStartupCaptured,replaceBucket}),requestSnapshotSync=()=>c(["curing status","curing priority list","curing queue list","curing predictions","curingset list","curing priority defence list"],{source:"serverside-snapshot-sync"}),applyLifecycleChange=e=>(e&&markDirty("rule-lifecycle"),e);h.onChange((e,t)=>{refreshRulesBucket(),Ue.has(e)?emit(e,t):markDirty("rule-engine-change")});const copyRecord=(e={})=>({...e||{}}),copyArray=(e=[])=>[...e||[]],copyRuleOverlay=(e={})=>({affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),curePriorities:copyRecord(e.curePriorities),settings:copyRecord(e.settings),predictions:copyRecord(e.predictions),commands:copyArray(e.commands),prioAff:e.prioAff,manualQueue:Array.isArray(e.manualQueue)?[...e.manualQueue]:void 0}),copyDesiredSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),curePriorities:copyRecord(e.curePriorities),manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioAff:e.prioAff??null,fullPriorityReset:Boolean(e.fullPriorityReset),injectedCommands:copyArray(e.injectedCommands),appliedRules:copyArray(e.appliedRules),suspendingRules:copyArray(e.suspendingRules)}),copyObservedSnapshot=(e={})=>({settings:copyRecord(e.settings),affPriorities:copyRecord(e.affPriorities),defPriorities:copyRecord(e.defPriorities),curePriorities:copyRecord(e.curePriorities),prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),prioritySet:e.prioritySet||""}),copyTransientSnapshot=(e={})=>({prioAff:e.prioAff??null,manualQueue:copyArray(e.manualQueue),predictions:copyRecord(e.predictions),staticDefRequests:copyRecord(e.staticDefRequests),fullPriorityReset:Boolean(e.fullPriorityReset)}),copyDiagnosticsSnapshot=(e={})=>({lastCommands:copyArray(e.lastCommands),lastReasons:copyArray(e.lastReasons),desyncCounter:Number(e.desyncCounter||0),recoveryCounter:Number(e.recoveryCounter||0),commandRepeatCounter:Number(e.commandRepeatCounter||0)}),copyCuringSetSnapshot=(e={})=>({sets:copyArray(e.sets),activeSet:e.activeSet||"",priorSet:e.priorSet||"",used:Number(e.used||0),limit:Number(e.limit||0)}),copyRulesSnapshot=(e=[])=>(e||[]).map(e=>({id:e.id,enabled:e.enabled,terminal:e.terminal,isActive:e.isActive,suspendsCuring:Boolean(e.suspendsCuring),pack:e.pack,tags:Array.isArray(e.tags)?[...e.tags]:[],meta:deepClone$1(e.meta||{})})),A=createSnapshotCache({getVersion:()=>p.baseline,buildSnapshot:()=>({settings:copyRecord(p.baseline.settings),affPriorities:copyRecord(p.baseline.affPriorities),defPriorities:copyRecord(p.baseline.defPriorities),curePriorities:copyRecord(p.baseline.curePriorities)})}),E=createSnapshotCache({getVersion:()=>p.sessionBaseline,buildSnapshot:()=>({settings:copyRecord(p.sessionBaseline.settings),affPriorities:copyRecord(p.sessionBaseline.affPriorities),defPriorities:copyRecord(p.sessionBaseline.defPriorities),curePriorities:copyRecord(p.sessionBaseline.curePriorities)})}),_=createSnapshotCache({getVersion:()=>p.derived,buildSnapshot:()=>copyRuleOverlay(p.derived)}),w=createSnapshotCache({getVersion:()=>p.desired,buildSnapshot:()=>copyDesiredSnapshot(p.desired)}),T=createSnapshotCache({getVersion:()=>p.observed,buildSnapshot:()=>copyObservedSnapshot(p.observed)}),P=createSnapshotCache({getVersion:()=>p.transient,buildSnapshot:()=>copyTransientSnapshot(p.transient)}),M=createSnapshotCache({getVersion:()=>p.pending,buildSnapshot:()=>[...p.pending.entries()]}),D=createSnapshotCache({getVersion:()=>p.diagnostics,buildSnapshot:()=>copyDiagnosticsSnapshot(p.diagnostics)}),R=createSnapshotCache({getVersion:()=>p.curingsets,buildSnapshot:()=>copyCuringSetSnapshot(p.curingsets)}),O={baseline:A,sessionBaseline:E,derived:_,desired:w,observed:T,transient:P,pending:M,diagnostics:D,curingsets:R,startup:createSnapshotCache({getVersion:()=>p.startup,buildSnapshot:()=>({flags:copyRecord(p.startup.flags)})}),rules:createSnapshotCache({getVersion:()=>p.rules,buildSnapshot:()=>copyRulesSnapshot(p.rules)})};let N=null;const getSnapshot=()=>{const e=Ve.reduce((e,t)=>(e[t]=O[t](),e),{});return N&&Ve.every(t=>N[t]===e[t])||(N=deepFreeze(e)),N},acknowledgeCommand=e=>acknowledgeCommands([e]),acknowledgeCommands=(e=[])=>{let t=p.pending;return e.forEach(e=>{const a=normalizeCommand(e);a&&t.has(a)&&(t===p.pending&&(t=new Map(p.pending)),t.delete(a))}),replaceBucket("pending",t)};return{onChange:e=>(g.add(e),()=>g.delete(e)),markDirty,evaluate:S.evaluate,isDirty:()=>p.dirty,getTransientPrioAff:()=>p.transient.prioAff,getStaticDefRequests:()=>P().staticDefRequests,getObserved:()=>T(),getCuringSets:()=>R(),snapshot:()=>getSnapshot(),isStartupReady:x.isStartupReady,getStartupStatus:x.getStartupStatus,getMissingStartupFlags:x.getMissingStartupFlags,markStartupCaptured:x.markStartupCaptured,resetStartupStatus:x.resetStartupStatus,setBaselineFromRuntime:S.setBaselineFromRuntime,getCurePriority:S.getCurePriority,requestSnapshotSync,beginObservedAffPrioritySnapshot:x.beginObservedAffPrioritySnapshot,completeObservedAffPrioritySnapshot:x.completeObservedAffPrioritySnapshot,updateObservedSetting:x.updateObservedSetting,updateObservedAffPriority:x.updateObservedAffPriority,beginObservedDefPrioritySnapshot:x.beginObservedDefPrioritySnapshot,completeObservedDefPrioritySnapshot:x.completeObservedDefPrioritySnapshot,updateObservedDefPriority:x.updateObservedDefPriority,updateObservedQueue:x.updateObservedQueue,updateObservedPredictions:x.updateObservedPredictions,parseStatusLine:x.parseStatusLine,setTrackable:C.setTrackable,setPrioAff:C.setPrioAff,clearPrioAff:C.clearPrioAff,requestPriorityReset:C.requestPriorityReset,requestStaticDefPriorities:C.requestStaticDefPriorities,clearStaticDefPriorities:C.clearStaticDefPriorities,addPrediction:C.addPrediction,removePrediction:C.removePrediction,manualQueueAdd:C.manualQueueAdd,manualQueueInsert:C.manualQueueInsert,manualQueueRemove:C.manualQueueRemove,manualQueueReset:C.manualQueueReset,confirmPrediction:C.confirmPrediction,switchCuringSet:k.switchCuringSet,deleteCuringSet:k.deleteCuringSet,observeCuringSets:k.observeCuringSets,observeActiveCuringSet:k.observeActiveCuringSet,acknowledgeCommand,acknowledgeCommands,markPendingCommands:S.markPendingCommands,observeOutbound:S.observeOutbound,lifecycle:{add:(e,t)=>applyLifecycleChange(h.addRule(e,t)),remove:e=>applyLifecycleChange(h.removeRule(e)),enable:e=>applyLifecycleChange(h.enableRule(e)),disable:e=>applyLifecycleChange(h.disableRule(e)),enablePack:e=>applyLifecycleChange(h.enablePack(e)),disablePack:e=>applyLifecycleChange(h.disablePack(e)),load:(e,t)=>applyLifecycleChange(h.loadPack(e,t)),unload:e=>applyLifecycleChange(h.unloadPack(e)),reorder:e=>applyLifecycleChange(h.reorder(e)),list:()=>h.list()}}},createCommandDispatcher=({adapter:e}={})=>{const t=[],a=200,isDebugEnabled=()=>"function"==typeof e?.isDebugEnabled&&e.isDebugEnabled(),normalizeCommands=(e=[])=>Array.isArray(e)?e.filter(Boolean).map(e=>String(e)):null==e||""===e?[]:[String(e)],resolveSeparator=()=>("function"==typeof e?.getCommandSeparator?e.getCommandSeparator():"|")||"|",normalizeStackPlan=e=>{if(e&&"object"==typeof e&&!Array.isArray(e)){if("stackPlan"!==e.type)return null;const t=normalizeCommands(e.commands);return t.length?{type:"stackPlan",commands:t}:null}const t=normalizeCommands(e);return t.length?{type:"stackPlan",commands:t}:null},normalizeStackPlans=(e=[])=>{if(Array.isArray(e))return e.map(normalizeStackPlan).filter(Boolean);const t=normalizeStackPlan(e);return t?[t]:[]},serializeStackPlan=e=>e.commands.join(resolveSeparator()),recordDispatch=({mode:n,commands:s=[],context:i={},stackIndex:o=1,stackCount:l=1,stackPlan:c=null}={})=>{const u=normalizeCommands(s);if(!u.length)return[];const d={mode:n,commands:[...u],context:{...i},at:e.now(),stackIndex:o,stackCount:l,stackPlan:c?{type:c.type,commands:[...c.commands]}:null};return t.push(d),!isDebugEnabled()&&t.length>a&&t.splice(0,t.length-a),u},sendCommands=(t=[],a={})=>{const n=recordDispatch({mode:"commands",commands:t,context:a});return n.length?(e.send(n,a),n):[]};return{send:sendCommands,sendCommands,sendStackPlan:(t=[],a={})=>{const n=normalizeStackPlans(t);return n.length?(n.forEach((t,s)=>{const i={...a,stackIndex:s+1,stackCount:n.length};recordDispatch({mode:"stack-plan",commands:t.commands,context:i,stackIndex:s+1,stackCount:n.length,stackPlan:t}),e.send(serializeStackPlan(t),i)}),n.map(e=>({type:e.type,commands:[...e.commands]}))):[]},normalizeCommands,history:()=>t.map(e=>({mode:e.mode,commands:[...e.commands],context:{...e.context},at:e.at,stackIndex:e.stackIndex,stackCount:e.stackCount,stackPlan:e.stackPlan?{type:e.stackPlan.type,commands:[...e.stackPlan.commands]}:null}))}},Ye=Object.freeze({freeQueue:[{balanceId:Fe.BALANCE,minDurationMs:250},{balanceId:Fe.EQUILIBRIUM,minDurationMs:250}],fullQueue:[{balanceId:Fe.BALANCE,minDurationMs:250},{balanceId:Fe.EQUILIBRIUM,minDurationMs:250}],classQueue:[{balanceId:Fe.ENTITY,minDurationMs:500}]}),createQueueFiredSideEffects=({balanceModel:e,now:t})=>({queueId:a})=>{const n=Ye[a]||[];if(!n.length)return[];const s=t();return n.filter(({balanceId:t,minDurationMs:a})=>!1===e.have(t)&&e.computeDurationMs(t)>Number(a||0)).map(({balanceId:t})=>(e.restartLossTimer(t,`queue-fired-resync:${a}`,s),t))},createDomainControllers=({adapter:e,seedData:t,options:a={},now:n,models:s})=>{const{systemModel:i,affModel:o,balanceModel:l,defModel:c,cacheModel:u}=s,d=createCommandDispatcher({adapter:e}),m=createQueueFiredSideEffects({balanceModel:l,now:n}),p=createQueueController({send:d.sendStackPlan,getRuntimeState:()=>{const e=i.getRuntime();return{paused:e.paused,phase:e.phase,settings:i.getSettings()}},getSeparator:()=>i.getSettings().commandSeparator,maxEntriesPerSubmission:Number(a.maxEntriesPerSubmission||20),onQueueFired:m}),g=createServersideController({adapter:e,dispatchCommands:d.sendCommands,affModel:o,defModel:c,balanceModel:l,systemModel:i,cureTable:t.cureTable,options:{maxCommandsPerCycle:Number(a.maxSsCommandsPerCycle||40)}}),h=createDefensePlanner({defModel:c,balanceModel:l,affModel:o,systemModel:i}),b=createPrecachePlanner({cacheModel:u});return{commandDispatcher:d,queueController:p,serverside:g,defensePlanner:h,precachePlanner:b,outputPlanner:createOutputPlanner({systemModel:i,serverside:g,defensePlanner:h,precachePlanner:b})}},secondsToMs$1=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds$1=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createBalanceState=(e={})=>{const t={};return Object.entries(e||{}).forEach(([e,a])=>{t[e]={id:e,have:!0,baseDurationMs:secondsToMs$1(a.length),config:deepFreeze(deepClone$1(a||{})),lastLostAtMs:0,lastGotAtMs:0,activeDurationMs:0,expectedReadyAtMs:0,lastRecoveredDurationMs:0,lastServerDurationMs:0,callbacks:{},timer:null}}),t},createBalancePayload=(e,t={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastServerDurationMs:e.lastServerDurationMs,...t}),createBalanceMutationApi=({state:e,emit:t,now:a,setTimeoutFn:n,clearTimeoutFn:s,computeDurationMs:i})=>{const clearTimer=e=>{e.timer&&(s?.(e.timer),e.timer=null)},normalizeDurationMs=(e={},t=0)=>Number.isFinite(Number(e.durationMs))?Math.max(0,Math.round(Number(e.durationMs))):Number.isFinite(Number(e.durationSeconds))?secondsToMs$1(e.durationSeconds):Math.max(0,Math.round(Number(t)||0)),o=1e3,scheduleRecovery=(e,t)=>{clearTimer(e),!n||e.have||e.expectedReadyAtMs<=0||(e.timer=n(()=>{gain(e.id,"timer",a())},Math.max(0,e.expectedReadyAtMs+o-t)))},applyServerDuration=(e,t)=>{e.lastServerDurationMs=t},emitDurationObserved=(e,a,n,s)=>{t("BalanceDurationObserved",createBalancePayload(e,{source:s,atMs:n,durationMs:a,durationSeconds:msToSeconds$1(a)}))},createTimingPayload=(e,t,a,n)=>createBalancePayload(e,{reason:t,atMs:a,durationMs:n,durationSeconds:msToSeconds$1(n)});function gain(n,s="manual",i=a()){const o=e[n];if(!o||o.have)return!1;const l=o.activeDurationMs;return o.have=!0,o.lastGotAtMs=i,o.lastRecoveredDurationMs=Math.max(0,i-o.lastLostAtMs),o.activeDurationMs=0,o.expectedReadyAtMs=0,clearTimer(o),o.callbacks.onStop?.(o),t("BalanceGot",createTimingPayload(o,s,i,o.lastRecoveredDurationMs||l)),!0}const lose=(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||!c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.have=!1,c.lastLostAtMs=o,c.activeDurationMs=u,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),c.callbacks.onStart?.(c),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLost",createTimingPayload(c,s,o,u)),!0},observeServerUse=(t,n,s={})=>{const i=e[t],o=secondsToMs$1(n);if(!i||o<=0)return!1;const l=s.atMs??s.at??a(),c=String(s.source||"serverside-duration");if(i.have){const e=lose(t,c,l,{durationMs:o,serverDuration:!0,autoRegain:s.autoRegain});return e&&emitDurationObserved(i,o,l,c),e}return applyServerDuration(i,o),i.activeDurationMs=o,i.expectedReadyAtMs=i.lastLostAtMs+o,!1!==s.autoRegain?scheduleRecovery(i,l):clearTimer(i),emitDurationObserved(i,o,l,c),!0};return{gain,lose,restartLossTimer:(n,s="manual",o=a(),l={})=>{const c=e[n];if(!c||c.have)return!1;const u=normalizeDurationMs(l,i(n));return c.lastLostAtMs=o,c.activeDurationMs=u,c.expectedReadyAtMs=u>0?o+u:0,!0===l.serverDuration&&applyServerDuration(c,u),!1!==l.autoRegain?scheduleRecovery(c,o):clearTimer(c),t("BalanceLossTimerRestarted",createTimingPayload(c,s,o,u)),!0},observeServerUse,reset(n,s="reset"){const i=e[n];return!!i&&(clearTimer(i),i.have=!0,i.lastGotAtMs=a(),i.activeDurationMs=0,i.expectedReadyAtMs=0,i.callbacks.onReset?.(i),t("BalanceReset",createBalancePayload(i,{reason:s})),!0)},setCallback(t,a={}){const n=e[t];return!!n&&(n.callbacks={...n.callbacks,...a},!0)},applyVitals(t={}){const n=toParsedGmcpVitals(t);n.balancePatches.forEach(({id:e,have:t})=>{if(!e||void 0===t)return;const n=a();t?gain(e,"gmcp-vitals",n):lose(e,"gmcp-vitals",n)}),n.resourceStats.forEach(({key:t,balanceState:n})=>{e[t]&&void 0!==n&&(n?gain(t,"gmcp-charstat",a()):lose(t,"gmcp-charstat",a()))})},dispose(){Object.values(e).forEach(clearTimer)}}},createBalanceQueryApi=({state:e,now:t,haveAff:a,getVersion:n=()=>0,getEntryVersion:s=()=>n()})=>{const buildEntrySnapshot=(e={})=>({id:e.id,have:e.have,baseDurationMs:e.baseDurationMs,baseDurationSeconds:msToSeconds$1(e.baseDurationMs),config:e.config,lastLostAtMs:e.lastLostAtMs,lastGotAtMs:e.lastGotAtMs,activeDurationMs:e.activeDurationMs,activeDurationSeconds:msToSeconds$1(e.activeDurationMs),expectedReadyAtMs:e.expectedReadyAtMs,lastRecoveredDurationMs:e.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(e.lastRecoveredDurationMs),lastServerDurationMs:e.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(e.lastServerDurationMs)}),i=new Map,getEntrySnapshot=t=>e[t]?(i.has(t)||i.set(t,createSnapshotCache({getVersion:()=>s(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),i.get(t)()):null,o=createSnapshotCache({getVersion:n,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),computeDurationMs=t=>{const n=e[t];if(!n)return 0;let s=Number(n.baseDurationMs||0);const i=n.config.aff_modifiers||{};return Object.entries(i).forEach(([e,t])=>{if(!a(e))return;const n=Number(t.multiplier??1),i=secondsToMs$1(t.offset??0);s=Math.round(s*n+i)}),Math.max(0,s)},elapsedMs=(a,n=t())=>{const s=e[a];return s?s.have?Math.max(0,n-s.lastGotAtMs):Math.max(0,n-s.lastLostAtMs):0},remainingMs=(a,n=t())=>{const s=e[a];return!s||s.have?0:s.expectedReadyAtMs>0?Math.max(0,s.expectedReadyAtMs-n):Math.max(0,s.activeDurationMs-elapsedMs(a,n))},timing=(a,n=t())=>{const s=e[a];if(!s)return null;const i=elapsedMs(a,n),o=remainingMs(a,n),l=computeDurationMs(a);return{id:s.id,have:s.have,atMs:n,elapsedMs:i,elapsedSeconds:msToSeconds$1(i),remainingMs:o,remainingSeconds:msToSeconds$1(o),baseDurationMs:s.baseDurationMs,baseDurationSeconds:msToSeconds$1(s.baseDurationMs),computedDurationMs:l,computedDurationSeconds:msToSeconds$1(l),activeDurationMs:s.activeDurationMs,activeDurationSeconds:msToSeconds$1(s.activeDurationMs),expectedReadyAtMs:s.expectedReadyAtMs,lastLostAtMs:s.lastLostAtMs,lastGotAtMs:s.lastGotAtMs,lastRecoveredDurationMs:s.lastRecoveredDurationMs,lastRecoveredDurationSeconds:msToSeconds$1(s.lastRecoveredDurationMs),lastServerDurationMs:s.lastServerDurationMs,lastServerDurationSeconds:msToSeconds$1(s.lastServerDurationMs)}};return{list:()=>Object.keys(e),snapshot:()=>o(),get:e=>getEntrySnapshot(e),have:t=>Boolean(e[t]?.have),elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,a=t())=>msToSeconds$1(elapsedMs(e,a)),remaining:remainingMs,remainingMs,remainingSeconds:(e,a=t())=>msToSeconds$1(remainingMs(e,a)),timing,computeDuration:computeDurationMs,computeDurationMs,computeDurationSeconds:e=>msToSeconds$1(computeDurationMs(e))}},createBalanceModel=({balanceTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n,haveAff:s=()=>!1}={})=>{const i=createBalanceState(e),o=new Set;let l=0;const c=new Map,emit=(e,t)=>{l+=1,t?.id&&c.set(t.id,(c.get(t.id)??0)+1),o.forEach(a=>a(e,t))},u=createBalanceQueryApi({state:i,now:t,haveAff:s,getVersion:()=>l,getEntryVersion:e=>c.get(e)??0}),d=createBalanceMutationApi({state:i,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n,computeDurationMs:u.computeDurationMs});return{onChange:e=>(o.add(e),()=>o.delete(e)),list:u.list,snapshot:u.snapshot,get:u.get,have:u.have,elapsed:u.elapsed,elapsedMs:u.elapsedMs,elapsedSeconds:u.elapsedSeconds,remaining:u.remaining,remainingMs:u.remainingMs,remainingSeconds:u.remainingSeconds,timing:u.timing,computeDuration:u.computeDuration,computeDurationMs:u.computeDurationMs,computeDurationSeconds:u.computeDurationSeconds,gain:d.gain,lose:d.lose,restartLossTimer:d.restartLossTimer,observeServerUse:d.observeServerUse,reset:d.reset,setCallback:d.setCallback,applyVitals:d.applyVitals,dispose:d.dispose}},asSet=(e={})=>Array.isArray(e)?new Set(e.map(e=>String(e).toLowerCase())):new Set(Object.keys(e).map(e=>String(e).toLowerCase())),Qe=0,We=1,createAfflictionReference=(e,t={})=>{const a=String(e||"").trim().toLowerCase();if(!a)return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1};if(t[a])return{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!0};const n=a.match(/^(.*?)(?:\s*\((\d+)\)|(\d+))$/),s=Number(n?.[2]??n?.[3]),i=n?.[1]?.trim();return n&&t[i]?{raw:a,name:i,count:s,hasExplicitCount:!0,isCountable:!0}:{raw:a,name:a,count:null,hasExplicitCount:!1,isCountable:!1}},normalizeAfflictionName=(e,t={})=>createAfflictionReference(e,t).name,normalizeAfflictionPriorityName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable&&a.hasExplicitCount&&Number(a.count)>1?`${a.name}${a.count}`:a.name},formatAfflictionPriorityCommandName=(e,t={})=>{const a=createAfflictionReference(e,t);return a.isCountable?a.hasExplicitCount?`${a.name}${a.count}`:`${a.name}1`:a.name},createAffEntry=(e,t,a,n=null)=>({name:e,have:!1,count:0,min:Number(n?.min??Qe),max:Number(n?.max??We),since:0,lastChangeAt:0,order:t,defaultPriority:a,priorityOverride:null,timer:null}),createInitialAfflictionState=(e={})=>{const t=e.types?.countable||{},a=[...e.list||[]].reduce((e,a)=>{const n=normalizeAfflictionName(a,t);return n&&!e.includes(n)&&e.push(n),e},[]),n=Object.entries(e.prios||{}).reduce((e,[a,n])=>{const s=normalizeAfflictionName(a,t);return s&&(e[s]=n),e},{}),s={};return a.forEach((e,a)=>{s[e]=createAffEntry(e,a,n[e]??100,t[e]||null)}),{list:a,defaultPrios:n,state:s,timedConfig:e.types?.timed||{},countableConfig:t,uncurableSet:asSet(e.types?.uncurable||{})}},ensureAffEntry=(e,t,a={},n)=>{const s=normalizeAfflictionName(n,a);return e[s]||(e[s]=createAffEntry(s,Object.keys(e).length,t[s]??100,a[s]||null)),e[s]},toPriorityNumber=e=>{const t=Number(e);return Number.isFinite(t)?t:null},getPriorityValue=e=>e?e.priorityOverride??e.defaultPriority:null,getDefaultPriorityValue=e=>e?.defaultPriority??null,setPriorityValue=(e,t)=>e.priorityOverride===t?{changed:!1,priority:t}:(e.priorityOverride=t,{changed:!0,priority:t}),resetPriorityValue=e=>{const t=e.defaultPriority;return null===e.priorityOverride||void 0===e.priorityOverride?{changed:!1,priority:t}:(e.priorityOverride=null,{changed:!0,priority:t})},setDefaultPriorityValue=(e,t,{shouldSyncCurrentPriorityToDefault:a=e=>null===e.priorityOverride||void 0===e.priorityOverride,syncCurrentPriorityToDefault:n=()=>{}}={})=>{const s=e.defaultPriority;if(s===t)return{changed:!1,currentChanged:!1,priority:t,previousDefaultPriority:s};const i=a(e);return e.defaultPriority=t,i&&n(e,t),{changed:!0,currentChanged:i,priority:t,previousDefaultPriority:s}},createAfflictionPriorityApi=({state:e,defaultPrios:t,countableConfig:a,emit:n})=>{const getEntry=(n,{ensure:s=!1}={})=>s?ensureAffEntry(e,t,a,n):e[normalizeAfflictionName(n,a)]||null;return{ensureAff:e=>getEntry(e,{ensure:!0}),getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):100},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):100},setPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setPriorityValue(i,s);return!!o.changed&&(n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority}),!0)},resetPriority(e,t="manual"){const a=getEntry(e,{ensure:!0}),s=resetPriorityValue(a);return!!s.changed&&(n("AffPriorityChanged",{name:a.name,source:t,priority:s.priority,defaultPriority:a.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,t,a="manual"){const s=toPriorityNumber(t);if(null===s)return!1;const i=getEntry(e,{ensure:!0}),o=setDefaultPriorityValue(i,s);return!!o.changed&&(n("AffDefaultPriorityChanged",{name:i.name,source:a,priority:o.priority,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&n("AffPriorityChanged",{name:i.name,source:a,priority:o.priority,defaultPriority:i.defaultPriority,defaultChanged:!0}),!0)}}},createAfflictionLifecycleApi=({state:e,defaultPrios:t,timedConfig:a,countableConfig:n,emit:s,now:i,setTimeoutFn:o,clearTimeoutFn:l})=>{const clearTimer=e=>{e.timer&&(l?.(e.timer),e.timer=null)},emitAffGot=(e,t,a)=>{s("AffGot",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitAffLost=(e,t,a)=>{s("AffLost",{name:e.name,at:t,source:a,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt})},emitStackChanged=(e,t,a)=>{s("AffStackChanged",{name:e.name,count:e.count,previousCount:a,min:e.min,max:e.max,have:e.have,at:t})},clampCount=(e,t)=>{const a=Number(t);return Number.isFinite(a)?Math.max(e.min,Math.min(e.max,a)):e.count},scheduleTimedExpiry=e=>{const t=a[e.name];if(!t)return;clearTimer(e);const n=Math.round(1e3*Number(t.length||0));n<=0||!o||(e.timer=o(()=>{lose(e.name,{source:"timed-expiry",at:i()})},n))},applyCountableState=(e,t,a={})=>{const n=a.at??i(),s=a.source||"manual",o=e.have,l=e.count;return e.count=clampCount(e,t),e.have=e.count>0,e.have&&!o&&(e.since=n),e.lastChangeAt=n,emitStackChanged(e,n,l),!o&&e.have?emitAffGot(e,n,s):o&&!e.have&&emitAffLost(e,n,s),o},got=(a,s={})=>{const o=createAfflictionReference(a,n),l=ensureAffEntry(e,t,n,o.name),c=s.at??i(),u=s.source||"manual",d=l.have;if(n[l.name]){const e=Number(s.count);return applyCountableState(l,Number.isFinite(e)?e:o.hasExplicitCount?o.count:l.count+Number(s.countDelta??1),{at:c,source:u}),l.have?scheduleTimedExpiry(l):clearTimer(l),!0}return!d&&(l.have=!0,l.count=1,l.since=c,l.lastChangeAt=c,scheduleTimedExpiry(l),emitAffGot(l,c,u),!0)},lose=(a,s={})=>{const o=ensureAffEntry(e,t,n,createAfflictionReference(a,n).name),l=s.at??i(),c=s.source||"manual",u=o.have;if(n[o.name]){const e=Number(s.count);return applyCountableState(o,Number.isFinite(e)?e:Number.isFinite(Number(s.countDelta))?o.count-Math.abs(Number(s.countDelta)):0,{at:l,source:c}),clearTimer(o),!0}return!!u&&(o.have=!1,o.count=0,o.lastChangeAt=l,clearTimer(o),emitAffLost(o,l,c),!0)};return{got,lose,applyList(t=[]){const a=new Set,s=new Map,i=new Set;(t||[]).forEach(e=>{const t=createAfflictionReference("string"==typeof e?e:String(e?.name||e?.affliction||e||""),n);if(t.name){if(n[t.name])return t.hasExplicitCount?(i.add(t.name),void s.set(t.name,Math.max(s.get(t.name)??0,t.count))):void(i.has(t.name)||s.set(t.name,(s.get(t.name)??0)+1));a.add(t.name)}}),Object.keys(e).forEach(t=>{n[t]?s.has(t)?got(t,{source:"gmcp-list",count:s.get(t)}):(e[t].have||e[t].count>0)&&lose(t,{source:"gmcp-list"}):a.has(t)?got(t,{source:"gmcp-list"}):e[t].have&&lose(t,{source:"gmcp-list"})})},dispose(){Object.values(e).forEach(clearTimer)}}},secondsToMs=e=>{const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.round(1e3*t)):0},msToSeconds=e=>{const t=Number(e);return Number.isFinite(t)?t/1e3:0},createAfflictionQueryApi=({state:e,list:t,timedConfig:a,countableConfig:n,uncurableSet:s,getPriority:i,now:o,getVersion:l=()=>0,getEntryVersion:c=()=>l()})=>{const buildEntrySnapshot=(e={})=>({name:e.name,have:e.have,count:e.count,min:e.min,max:e.max,since:e.since,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride}),u=new Map,getEntrySnapshot=t=>e[t]?(u.has(t)||u.set(t,createSnapshotCache({getVersion:()=>c(t),buildSnapshot:()=>buildEntrySnapshot(e[t])})),u.get(t)()):null,d=createSnapshotCache({getVersion:l,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getEntrySnapshot(t),e),{})}),elapsedMs=(t,a=o())=>{const s=e[normalizeAfflictionName(t,n)];return s?.have?Math.max(0,a-s.since):0},durationMs=e=>{const t=a[normalizeAfflictionName(e,n)];return t?secondsToMs(t.length):0},remainingMs=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s],l=durationMs(s);return!i?.have||l<=0?0:Math.max(0,l-elapsedMs(s,a))},timing=(t,a=o())=>{const s=normalizeAfflictionName(t,n),i=e[s];if(!i)return null;const l=elapsedMs(s,a),c=durationMs(s),u=remainingMs(s,a);return{name:s,have:i.have,atMs:a,sinceMs:i.since,lastChangeAtMs:i.lastChangeAt,elapsedMs:l,elapsedSeconds:msToSeconds(l),timedDurationMs:c,timedDurationSeconds:msToSeconds(c),remainingMs:u,remainingSeconds:msToSeconds(u)}};return{snapshot:()=>d(),get:e=>getEntrySnapshot(normalizeAfflictionName(e,n)),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],getCountablePriorityNames:()=>Object.entries(n).flatMap(([e,t])=>{const a=Math.max(0,Number(t?.max??0)),n=[];for(let s=2;s<=a;s+=1)n.push(`${e}${s}`);return n}),normalizeName:e=>normalizeAfflictionName(e,n),normalizePriorityName:e=>normalizeAfflictionPriorityName(e,n),formatPriorityCommandName:e=>formatAfflictionPriorityCommandName(e,n),haveAff(t){const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)},haveAffs:(t=[])=>t.every(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),haveAnAff:(t=[])=>t.some(t=>{const a=normalizeAfflictionName(t,n);return Boolean(e[a]?.have)}),currentSorted:()=>Object.values(e).filter(e=>e.have).sort((e,t)=>{const a=i(e.name),n=i(t.name);return a!==n?a-n:e.order-t.order}).map(e=>e.name),isCountable(e){const t=normalizeAfflictionName(e,n);return Boolean(n[t])},isTimed(e){const t=normalizeAfflictionName(e,n);return Boolean(a[t])},isUncurable(e){const t=normalizeAfflictionName(e,n);return s.has(t)},elapsed:elapsedMs,elapsedMs,elapsedSeconds:(e,t=o())=>msToSeconds(elapsedMs(e,t)),remaining:remainingMs,remainingMs,remainingSeconds:(e,t=o())=>msToSeconds(remainingMs(e,t)),timing}},createAfflictionModel=({affTable:e,now:t,setTimeoutFn:a,clearTimeoutFn:n}={})=>{const{list:s,defaultPrios:i,state:o,timedConfig:l,countableConfig:c,uncurableSet:u}=createInitialAfflictionState(e),d=new Set;let m=0;const p=new Map,emit=(e,t)=>{m+=1,t?.name&&p.set(t.name,(p.get(t.name)??0)+1),d.forEach(a=>a(e,t))},getEntryVersion=e=>p.get(e)??0,g=createAfflictionPriorityApi({state:o,defaultPrios:i,countableConfig:c,emit}),h=createAfflictionLifecycleApi({state:o,defaultPrios:i,timedConfig:l,countableConfig:c,emit,now:t,setTimeoutFn:a,clearTimeoutFn:n}),b=createAfflictionQueryApi({state:o,list:s,timedConfig:l,countableConfig:c,uncurableSet:u,getPriority:g.getPriority,now:t,getVersion:()=>m,getEntryVersion});return{onChange:e=>(d.add(e),()=>d.delete(e)),snapshot:b.snapshot,get:b.get,list:b.list,getCountablePriorityNames:b.getCountablePriorityNames,normalizeName:b.normalizeName,normalizePriorityName:b.normalizePriorityName,formatPriorityCommandName:b.formatPriorityCommandName,got:h.got,lose:h.lose,applyList:h.applyList,setPriority:g.setPriority,resetPriority:g.resetPriority,getPriority:g.getPriority,getDefaultPriority:g.getDefaultPriority,setDefaultPriority:g.setDefaultPriority,haveAff:b.haveAff,haveAffs:b.haveAffs,haveAnAff:b.haveAnAff,currentSorted:b.currentSorted,isCountable:b.isCountable,isTimed:b.isTimed,isUncurable:b.isUncurable,elapsed:b.elapsed,elapsedMs:b.elapsedMs,elapsedSeconds:b.elapsedSeconds,remaining:b.remaining,remainingMs:b.remainingMs,remainingSeconds:b.remainingSeconds,timing:b.timing,dispose:h.dispose}},createDefenseLifecycleApi=({state:e,emit:t})=>{const consumeStaticPriority=(a,n="manual",s={})=>{const i=e[a];return!(!i?.static||!isActiveStaticPriority(resolveDefensePriority(i)))&&(i.priorityOverride=0,t("DefPriorityChanged",{id:a,value:0,source:n,consumed:!0,static:!0,defaultPriority:i.defaultPriority,...s}),!0)},setHave=(a,n,s="manual",i=Date.now())=>{const o=e[a];if(!o||o.have===n)return!1;o.have=n,o.lastChangeAt=i;const l={id:a,source:s,at:i,have:o.have,lastChangeAt:o.lastChangeAt,static:o.static,serverside:o.serverside,preempt:o.preempt};return t(n?"DefGot":"DefLost",l),n&&consumeStaticPriority(a,s,{triggeredByGain:!0}),!0};return{consumeStaticPriority,setHave,setStatic:(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=Boolean(n);if(i.static===o)return!1;const l=i.static,c=resolveDefensePriority(i);let u=!1,d=!1;return i.static=o,o&&i.have&&isActiveStaticPriority(c)?(i.priorityOverride=0,d=!0,u=resolveDefensePriority(i)!==c):o||0!==i.priorityOverride||(i.priorityOverride=null,u=resolveDefensePriority(i)!==c),t("DefStaticChanged",{id:a,value:o,previousValue:l,source:s,have:i.have,static:i.static,seedStatic:i.seedStatic,defaultPriority:i.defaultPriority,currentPriority:resolveDefensePriority(i),serverside:i.serverside,preempt:i.preempt}),u&&t("DefPriorityChanged",{id:a,value:resolveDefensePriority(i),source:s,static:i.static,defaultPriority:i.defaultPriority,staticChanged:!0,consumed:d}),!0},setCommand:(a,n,s="manual")=>{const i=e[a];if(!i)return!1;const o=normalizeCommandList(n);return i.command=o,t("DefCommandChanged",{id:a,value:o,source:s}),!0},applyList(t=[],a="gmcp-list"){const n=new Set;(t||[]).forEach(e=>{const t=normalizeObservedDefenseId(e);t&&n.add(t)}),Object.keys(e).forEach(t=>{n.has(t)?(setHave(t,!0,a),e[t].static&&consumeStaticPriority(t,a,{observedActive:!0})):e[t].have&&!e[t].clientOnly&&setHave(t,!1,a)})}}},toDefensePriorityNumber=e=>{const t=toPriorityNumber(e);return null===t?null:t<0?0:t>26?26:t},createDefensePriorityApi=({state:e,emit:t,consumeStaticPriority:a})=>{const getEntry=t=>e[t]||null;return{getPriority(e){const t=getEntry(e);return t?getPriorityValue(t):-1},getDefaultPriority(e){const t=getEntry(e);return t?getDefaultPriorityValue(t):-1},setPriority(e,n,s="manual"){const i=toDefensePriorityNumber(n);if(null===i)return!1;const o=getEntry(e);if(!o)return!1;if(o.static&&!0===o.have&&isActiveStaticPriority(i))return a(e,s,{ignoredWhileActive:!0});const l=setPriorityValue(o,i);return!!l.changed&&(t("DefPriorityChanged",{id:o.id,value:l.priority,source:s,static:o.static,defaultPriority:o.defaultPriority}),!0)},resetPriority(e,n="manual"){const s=getEntry(e);if(!s)return!1;if(s.static&&!0===s.have)return a(e,n,{reset:!0,ignoredWhileActive:!0});const i=resetPriorityValue(s);return!!i.changed&&(t("DefPriorityChanged",{id:s.id,value:i.priority,source:n,static:s.static,defaultPriority:s.defaultPriority,reset:!0}),!0)},setDefaultPriority(e,a,n="manual"){const s=toDefensePriorityNumber(a);if(null===s)return!1;const i=getEntry(e);if(!i)return!1;const o=setDefaultPriorityValue(i,s);return!!o.changed&&(t("DefDefaultPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,previousDefaultPriority:o.previousDefaultPriority,currentPriority:getPriorityValue(i)}),o.currentChanged&&t("DefPriorityChanged",{id:i.id,value:o.priority,source:n,static:i.static,defaultPriority:i.defaultPriority,defaultChanged:!0}),!0)}}},createDefenseQueryApi=({state:e,list:t,getVersion:a=()=>0,getEntryVersion:n=()=>a()})=>{const buildDefEntrySnapshot=(e={})=>({id:e.id,have:e.have,lastChangeAt:e.lastChangeAt,order:e.order,defaultPriority:e.defaultPriority,priorityOverride:e.priorityOverride,priority:resolveDefensePriority(e),command:e.command,bals_req:e.bals_req,bals_used:e.bals_used,blocks:e.blocks,skills:e.skills,opps:e.opps,serverside:e.serverside,preempt:e.preempt,static:e.static,clientOnly:e.clientOnly}),s=new Map,getDefSnapshot=t=>e[t]?(s.has(t)||s.set(t,createSnapshotCache({getVersion:()=>n(t),buildSnapshot:()=>buildDefEntrySnapshot(e[t])})),s.get(t)()):null,i=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=resolveDefensePriority(e[a]),t),{})}),o=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Number(e[a].defaultPriority??-1),t),{})}),l=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(t[a]=Boolean(e[a]?.static),t),{})}),c=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((t,a)=>(Boolean(e[a]?.static)!==Boolean(e[a]?.seedStatic)&&(t[a]=Boolean(e[a]?.static)),t),{})}),u=createSnapshotCache({getVersion:a,buildSnapshot:()=>Object.keys(e).reduce((e,t)=>(e[t]=getDefSnapshot(t),e),{})});return{snapshot:()=>u(),get:e=>getDefSnapshot(e),list:()=>[...t,...Object.keys(e).filter(e=>!t.includes(e))],isAvailableForClass:(t,a="")=>matchesClass(e[t]?.skills,a),haveDef:t=>Boolean(e[t]?.have),getPriority(t){const a=e[t];return a?resolveDefensePriority(a):-1},getDefaultPriority:t=>Number(e[t]?.defaultPriority??-1),getPriorities:()=>i(),getDefaultPriorities:()=>o(),getStatics:()=>l(),getStaticOverrides:()=>c(),isStatic:t=>Boolean(e[t]?.static)}},createDefenseModel=({defTable:e={},defPrios:t={}}={})=>{const{state:a,list:n}=createInitialDefenseState({defTable:e,defPrios:t}),s=new Set;let i=0;const o=new Map,emit=(e,t)=>{i+=1,t?.id&&o.set(t.id,(o.get(t.id)??0)+1),s.forEach(a=>a(e,t))},getEntryVersion=e=>o.get(e)??0,l=createDefenseLifecycleApi({state:a,emit}),c=createDefensePriorityApi({state:a,emit,consumeStaticPriority:l.consumeStaticPriority}),u=createDefenseQueryApi({state:a,list:n,getVersion:()=>i,getEntryVersion});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:u.snapshot,get:u.get,list:u.list,isAvailableForClass:u.isAvailableForClass,haveDef:u.haveDef,isStatic:u.isStatic,setStatic:l.setStatic,setCommand:l.setCommand,setHave:l.setHave,applyList:l.applyList,setPriority:c.setPriority,setDefaultPriority:c.setDefaultPriority,resetPriority:c.resetPriority,getPriority:c.getPriority,getDefaultPriority:c.getDefaultPriority,getDefaultPriorities:u.getDefaultPriorities,getPriorities:u.getPriorities,getStatics:u.getStatics,getStaticOverrides:u.getStaticOverrides}},Ke=1e4,Xe=["brokenleftarm","damagedleftarm","mangledleftarm"],Je=["brokenrightarm","damagedrightarm","mangledrightarm"],createCachePrecacheSupport=({state:e,haveAff:t=()=>!1}={})=>{const isPrecacheBlocked=()=>{const e=Xe.some(e=>t(e)),a=Je.some(e=>t(e));return!(!e||!a)},buildPrecacheCommands=()=>isPrecacheBlocked()?[]:e.hydration.inventoryKnown&&e.hydration.riftKnown?Object.entries(e.desiredPrecache).flatMap(([t,a])=>{const n=toNumber(e.inventory[t],0),s=toNumber(e.rift[t],0),i=Math.max(0,toNumber(e.riftCapacity,Ke)),o=Math.max(0,toNumber(a,0)),l=Math.max(0,o-n),c=Math.max(0,n-o),u=Math.min(l,s),d=Math.max(0,i-s);return u>0?[`outr ${u} ${t}`]:c>0&&d>0?[`inr ${Math.min(c,d)} ${t}`]:[]}):[];return{getPrecacheCommands:()=>buildPrecacheCommands(),isPrecacheBlocked,isHydrated:()=>e.hydration.inventoryKnown&&e.hydration.riftKnown,getTotal:t=>toNumber(e.inventory[t],0)+toNumber(e.rift[t],0)}},findCaseInsensitiveKey=(e={},t="")=>{if(!e||"object"!=typeof e)return null;const a=String(t).toLowerCase();return Object.keys(e).find(e=>String(e).toLowerCase()===a)||null},createCacheNameNormalizer=({cacheTable:e={},cacheNames:t={}}={})=>{const a=t.herb_name_to_herb||{},n=new Set(Object.keys(e)),toCount=(e,t=1)=>Math.max(0,toNumber(e,t)),resolveName=e=>{if(!e)return"";const t=String(e).trim().toLowerCase();return a[t]||t},resolveCountedName=e=>{const t=resolveName(e);if(n.has(t)||!t.endsWith("s"))return t;const a=resolveName(t.slice(0,-1));return n.has(a)?a:t},parseNameAndAmount=(e,t)=>{const a=String(e||"").trim().toLowerCase();if(!a)return{name:"",amount:Math.max(0,toNumber(t,1))};const s=a.match(/^a group of\s+(\d+)\s+(.+)$/);if(s){const[,e,a]=s,i=resolveCountedName(a);if(n.has(i))return{name:i,amount:toCount(t,toNumber(e,1))}}const i=a.match(/^(\d+)\s+(.+)$/);if(i){const[,e,a]=i,s=resolveCountedName(a);if(n.has(s))return{name:s,amount:toCount(t,toNumber(e,1))}}return{name:resolveCountedName(a),amount:toCount(t,1)}};return{resolveName,parseNameAndAmount,normalizeName:e=>parseNameAndAmount(e).name}},readGmcpPath=(e={},t=[])=>{const a=findCaseInsensitiveKey(e,t.join("."));if(a)return e[a];let n=e;for(const s of t){if(!n||"object"!=typeof n)return;const e=findCaseInsensitiveKey(n,s);if(!e)return;n=n[e]}return n},createCacheStateSupport=({state:e,emit:t=()=>{},cacheTable:a={},cacheNames:n={}}={})=>{const{parseNameAndAmount:s,normalizeName:i}=createCacheNameNormalizer({cacheTable:a,cacheNames:n}),o={invAddsById:new Map,roomRemovesById:new Map,appliedIds:new Set},normalizeItemId=e=>null==e||""===e?"":String(e),adjustInventoryAmount=(a,n,s="inventory-delta")=>!(!a||!(a in e.inventory))&&(e.inventory[a]=Math.max(0,e.inventory[a]+toNumber(n,0)),t("CacheAmountChanged",{bucket:"inventory",name:a,amount:e.inventory[a],source:s}),!0),parseInventoryEntry=(e={})=>{const t=e?.item||e,a=s(t?.name||t?.item||t,t?.amount??t?.count??t?.qty??e?.amount??e?.count??e?.qty);return{id:normalizeItemId(t?.id??e?.id),location:String(e?.location??t?.parentid??t?.location??"inv").toLowerCase(),name:a.name,amount:a.amount,icon:t?.icon??e?.icon,attrib:t?.attrib??e?.attrib}},storeInventoryCurative=(t={})=>{if(!t.id||!t.name||!(t.name in e.inventory))return!1;const a={name:t.name,amount:t.amount,location:t.location||"inv"};return void 0!==t.icon&&null!==t.icon&&(a.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(a.attrib=t.attrib),e.inventoryCurativesById[t.id]=a,!0},deleteInventoryCurative=t=>{const a=normalizeItemId(t);return!(!a||!(a in e.inventoryCurativesById))&&(delete e.inventoryCurativesById[a],!0)},deleteInventoryCurativesByName=t=>{let a=!1;return Object.entries(e.inventoryCurativesById).forEach(([n,s])=>{s?.name===t&&(delete e.inventoryCurativesById[n],a=!0)}),a},emitInventoryIdentityChanged=()=>{t("CacheInventoryIdentityChanged",{...e.inventoryCurativesById})},buildResult=({changed:e=!1,identityChanged:t=!1,name:a="",amount:n=0,delta:s=0,source:i=""}={})=>({changed:e,identityChanged:t,name:a,amount:n,delta:s,source:i}),readInventorySnapshot=(e={})=>{const t=readGmcpPath(e,["Char","Items","List"]);if(void 0!==t)return t;const a=readGmcpPath(e,["Items","Inv"]);return void 0!==a?{location:"inv",items:a}:void 0},setAmount=(a,n,s,o="manual")=>{const l=i(n);if(!l||!(l in e[a]))return!1;const c=Math.max(0,toNumber(s,e[a][l]));return e[a][l]=c,t("CacheAmountChanged",{bucket:a,name:l,amount:c,source:o}),!0},setRiftCapacity=(a,n="manual")=>{const s=toNumber(e.riftCapacity,Ke),i=Math.max(0,toNumber(a,s));return i!==e.riftCapacity&&(e.riftCapacity=i,t("CacheRiftCapacityChanged",{amount:i,source:n}),!0)},observeInventorySnapshot=(a=[])=>{const n={...e.inventory},s={};Object.keys(n).forEach(e=>{n[e]=0}),(a||[]).forEach(e=>{const t=parseInventoryEntry(e);if("inv"===t.location&&t.name&&t.name in n&&(n[t.name]+=t.amount,t.id)){const e={name:t.name,amount:t.amount,location:t.location};void 0!==t.icon&&null!==t.icon&&(e.icon=t.icon),void 0!==t.attrib&&null!==t.attrib&&(e.attrib=t.attrib),s[t.id]=e}}),e.inventory=n,e.inventoryCurativesById=s,e.hydration.inventoryKnown=!0,t("CacheInventoryListApplied",{...e.inventory})},applyRoomPickupTransfer=t=>{if(!t||o.appliedIds.has(t))return null;const a=o.invAddsById.get(t),n=o.roomRemovesById.get(t);if(!a||!n)return null;const s=a.name&&a.name in e.inventory,i=Math.max(0,toNumber(a.amount,0)),l=n.name&&n.name in e.inventory,c=Math.max(0,toNumber(n.amount,0)),u=s&&i>0?a:l&&c>0?n:null;if(o.invAddsById.delete(t),o.roomRemovesById.delete(t),o.appliedIds.add(t),!u)return null;const d=Math.max(0,toNumber(u.amount,0));return!u.name||!(u.name in e.inventory)||d<=0?null:adjustInventoryAmount(u.name,d,"gmcp:room-pickup")?buildResult({changed:!0,name:u.name,amount:d,delta:d,source:"gmcp:room-pickup"}):null},observeRoomPickupCandidate=(e,t)=>{if(!e.id||o.appliedIds.has(e.id))return null;if("inv"===e.location&&"add"===t)o.invAddsById.set(e.id,e);else{if("room"!==e.location||"remove"!==t)return null;o.roomRemovesById.set(e.id,e)}return applyRoomPickupTransfer(e.id)},observeRiftSnapshot=(a={})=>{const n=a.items||a,i=Array.isArray(n)?n:Object.entries(n).map(([e,t])=>({name:e,amount:t})),o={...e.rift};Object.keys(o).forEach(e=>{o[e]=0}),i.forEach(e=>{const t=s(e.name||e.item||e,e.amount??e.count??e.qty??0);t.name&&t.name in o&&(o[t.name]=t.amount)}),e.rift=o,e.hydration.riftKnown=!0,t("CacheRiftListApplied",{...e.rift})},hydrateFromGmcp=(e={})=>{let t=!1;const a=readInventorySnapshot(e);void 0!==a&&(Array.isArray(a)?(observeInventorySnapshot(a),t=!0):"inv"===String(a?.location??a?.Location??"inv").toLowerCase()&&(observeInventorySnapshot(a?.items||[]),t=!0));const n=readGmcpPath(e,["IRE","Rift","List"]);return void 0!==n&&(observeRiftSnapshot(n||{}),t=!0),t};return{observeInventorySnapshot,observeItemDelta:(t={})=>{const a=parseInventoryEntry(t),n=String(t.action||"").toLowerCase(),s=String(t.direction||"").toLowerCase(),i=n||s;let o=!1;if("inv"===a.location){const t=a.id&&e.inventoryCurativesById[a.id]||null;"add"===i?a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):"remove"===i?(o=!!t&&deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):"update"===i?a.name&&a.name in e.inventory?(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged()):t&&(o=deleteInventoryCurative(a.id),o&&emitInventoryIdentityChanged()):a.name&&a.name in e.inventory&&(o=storeInventoryCurative(a),o&&emitInventoryIdentityChanged())}const l=observeRoomPickupCandidate(a,i);return l?{...l,identityChanged:o}:buildResult({identityChanged:o})},observeRiftSnapshot,observeRiftChange:(t={})=>{const a=t.amount??t.count??t.qty;if(null==a||""===a)return!1;const n=s(t.name||t.item||t.desc||t,a);return!(!n.name||!(n.name in e.rift))&&(setAmount("rift",n.name,n.amount,"gmcp:rift-change"),{name:n.name,riftAmount:e.rift[n.name]})},observeRiftOutText:({item:t,name:a,amount:n=1,riftAmount:i}={})=>{const o=s(t||a,n);if(!o.name||!(o.name in e.inventory)||!(o.name in e.rift))return!1;const l=Math.max(0,toNumber(n,o.amount));return!(l<=0)&&(adjustInventoryAmount(o.name,l,"text:rift-out"),setAmount("rift",o.name,i,"text:rift-out"),{name:o.name,amount:l,riftAmount:e.rift[o.name]})},observeRiftInText:({item:t,name:a,amount:n=1,riftAmount:i,atCapacity:o=!1}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory)||!(l.name in e.rift))return!1;const c=Math.max(0,toNumber(n,l.amount));return!(c<=0)&&(adjustInventoryAmount(l.name,-c,"text:rift-in"),setAmount("rift",l.name,i,"text:rift-in"),o&&setRiftCapacity(i,"text:rift-in-max"),{name:l.name,amount:c,riftAmount:e.rift[l.name],riftCapacity:e.riftCapacity})},invalidateRiftSnapshot:({source:a="rift-resync"}={})=>!!e.hydration.riftKnown&&(e.hydration.riftKnown=!1,t("CacheRiftSnapshotInvalidated",{source:a}),!0),observeInventoryDeltaText:({item:t,name:a,amount:n,delta:i,source:o="text:inventory"}={})=>{const l=s(t||a,n);if(!l.name||!(l.name in e.inventory))return!1;const c=Math.max(0,toNumber(n,l.amount)),u=toNumber(i,0);if(c<=0||0===u)return!1;const d=u>0?c:-c;return adjustInventoryAmount(l.name,d,o),{name:l.name,amount:c,delta:d,inventoryAmount:e.inventory[l.name]}},observeInventoryEmptyText:({item:t,name:a,source:n="text:inventory-empty"}={})=>{const i=s(t||a,0);if(!i.name||!(i.name in e.inventory))return!1;const o=e.inventory[i.name],l=deleteInventoryCurativesByName(i.name);return l&&emitInventoryIdentityChanged(),setAmount("inventory",i.name,0,n),{changed:0!==o||l,identityChanged:l,name:i.name,amount:0,delta:-o,inventoryAmount:e.inventory[i.name],source:n}},observeCurativeConsumedText:({item:t,name:a,amount:n=1}={})=>{const i=s(t||a,n);if(!i.name||!(i.name in e.inventory))return!1;const o=Math.max(0,toNumber(n,i.amount));return!(o<=0)&&(adjustInventoryAmount(i.name,-o,"text:consume"),{name:i.name,amount:o,inventoryAmount:e.inventory[i.name]})},completeObservationBlock:()=>{o.invAddsById.clear(),o.roomRemovesById.clear(),o.appliedIds.clear()},hydrateFromGmcp,setDesiredPrecache:(a={})=>{Object.entries(a).forEach(([t,a])=>{t in e.desiredPrecache&&(e.desiredPrecache[t]=Math.max(0,toNumber(a,0)))}),t("CacheDesiredPrecacheChanged",{...e.desiredPrecache})}}},createCacheModel=({cacheTable:e={},cacheNames:t={},haveAff:a=()=>!1,haveDef:n=()=>!1}={})=>{const s=new Set;let i=0;const o={inventory:{...e},rift:{...e},riftCapacity:Ke,inventoryCurativesById:{},desiredPrecache:Object.keys(e).reduce((e,t)=>(e[t]=0,e),{}),hydration:{inventoryKnown:!1,riftKnown:!1}},emit=(e,t)=>{i+=1,s.forEach(a=>a(e,t))},l=createSnapshotCache({getVersion:()=>i,buildSnapshot:()=>({inventory:{...o.inventory},rift:{...o.rift},riftCapacity:o.riftCapacity,inventoryCurativesById:Object.entries(o.inventoryCurativesById).reduce((e,[t,a])=>(e[t]={...a},e),{}),desiredPrecache:{...o.desiredPrecache},hydration:{...o.hydration}})});return{onChange:e=>(s.add(e),()=>s.delete(e)),snapshot:()=>l(),...createCacheStateSupport({state:o,emit,cacheTable:e,cacheNames:t}),...createCachePrecacheSupport({state:o,haveAff:a,haveDef:n}),getDesiredPrecache:()=>({...o.desiredPrecache})}},Ze={loadOnLogin:!1,flushSafetyMs:250,maxSendPerChunk:20,queueWhilePaused:!1,overrideTab:!1,customPrompt:!0,debug:!1,notices:{affGot:!0,affLost:!0,defGot:!0,defLost:!0,balanceLost:!1,balanceRecovered:!1,trackableGot:!1,trackableLost:!1,priority:!0,output:!1},ss:{transmutation:!0,sipPriority:"health",sipHealthAt:80,sipManaAt:70,mossHealthAt:90,mossManaAt:80,focus:!0,focusOverHerbs:!0,tree:"on",clot:!0,clotAt:19,fracturesAbove:35,manaThreshold:10,batch:!0}},et={paused:!0,rulesSuspended:!1,slowMode:!1,aeonLocked:!1,phase:ie.IDLE,startupFailureMessage:""},tt={name:"",class:"",race:"",color:"",hp:0,maxhp:0,mp:0,maxmp:0,ep:0,maxep:0,wp:0,maxwp:0,bleed:0,rage:0,transcendence:0,dead:!1,mount:null,wielded:{left:null,right:null}},rt={id:"",text:"",isPlayer:null,hp:""},at={id:null,name:"",exits:{},items:{}},getChangedPatchKeys=(e={},t,a)=>Object.keys(e||{}).filter(e=>JSON.stringify(a[e])!==JSON.stringify(t[e])),createSystemConfigApi=({state:e,emit:t})=>({getRuntime:()=>e.runtime,getSettings:()=>e.settings,getBaselineIntent:()=>e.baselineIntent,setRuntime(a={}){const n=e.runtime,s=deepMerge(e.runtime,a),i=Object.keys(s).filter(e=>s[e]!==n[e]);if(!i.length)return!1;const o=n.paused;return e.runtime=s,e.runtime.paused!==o&&t("PauseStateChanged",{paused:e.runtime.paused}),t("RuntimeStateChanged",{current:e.runtime,changedKeys:i}),!0},setSettings(a={},n={}){const s=e.settings,i=deepMerge(e.settings,a),o=getChangedPatchKeys(a,s,i);return!!o.length&&(e.settings=i,n.setBaseline&&(e.baselineIntent=deepMerge(e.baselineIntent,a)),t("SettingsChanged",{current:e.settings,patch:a,changedKeys:o}),!0)},setBaselineIntent(a={}){const n=e.baselineIntent,s=deepMerge(e.baselineIntent,a),i=getChangedPatchKeys(a,n,s);return!!i.length&&(e.baselineIntent=s,t("BaselineIntentChanged",{current:e.baselineIntent,patch:a,changedKeys:i}),!0)}}),shallowEqualRecord=(e={},t={})=>{const a=Object.keys(e||{}),n=Object.keys(t||{});return a.length===n.length&&a.every(a=>e[a]===t[a])},collectChangedFields=(e={})=>{const t={};return Object.entries(e).forEach(([e,[a,n]])=>{a!==n&&(t[e]={previous:a,current:n})}),t},nt=["hp","maxhp","mp","maxmp","ep","maxep","wp","maxwp"],normalizeResourceKey=e=>String(e||"").trim().toLowerCase(),hasOwn$3=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),normalizeResourceValue=(e,t={})=>{if(!t.numeric)return{valid:!0,value:e};const a=Number(e);if(!Number.isFinite(a))return{valid:!1,value:void 0};const n=Number(t.min),s=Number(t.max);let i=a;return Number.isFinite(n)&&i<n&&(i=n),Number.isFinite(s)&&i>s&&(i=s),{valid:!0,value:i}},isDragonClass=(e="")=>/\bdragon\b/i.test(String(e||"")),getDragonColor=(e="")=>{const t=String(e||"").trim().split(/\s+/).filter(Boolean),a=t.findIndex(e=>"dragon"===e.toLowerCase()),n=a>0?t[a-1]:"";return n?n[0].toUpperCase()+n.slice(1).toLowerCase():""},normalizeStatusClass=({className:e="",race:t="",classProvided:a=!1,raceProvided:n=!1}={})=>{const s=String(e||"").trim(),i=String(t||"").trim(),o=isDragonClass(s),l=isDragonClass(i);return o||!a&&n&&l?{className:"Dragon",color:getDragonColor(s)||getDragonColor(i)}:{className:normalizeClassName(s),color:""}},createSystemCharacterApi=({state:e,emit:t})=>({updateVitals(a={}){const n=toParsedGmcpVitals(a),s=n.resourceStats.filter(({balanceState:e})=>void 0===e),i={dead:e.char.dead};nt.forEach(t=>{i[t]=e.char[t]}),s.forEach(({key:t})=>{t in i||(i[t]=e.char[t])}),nt.forEach(t=>{void 0!==n.vitals[t]&&(e.char[t]=n.vitals[t])}),s.forEach(({key:t,value:a})=>{e.char[t]=a}),e.char.dead=e.char.hp<=0;const o={dead:[i.dead,e.char.dead]};nt.forEach(t=>{o[t]=[i[t],e.char[t]]}),s.forEach(({key:t})=>{o[t]=[i[t],e.char[t]]});const l=collectChangedFields(o);return!!Object.keys(l).length&&(t("VitalsUpdated",{current:e.char,hpDiff:e.char.hp-i.hp,mpDiff:e.char.mp-i.mp,changedFields:l}),e.char.dead&&!i.dead&&t("DeathDetected",{hp:e.char.hp,previousHp:i.hp}),!0)},updateResource(a,n,s={}){const i=normalizeResourceKey(a);if(!i)return!1;const o=normalizeResourceValue(n,s);if(!o.valid)return!1;const l=e.char[i];return!Object.is(l,o.value)&&(e.char[i]=o.value,t("VitalsUpdated",{current:e.char,hpDiff:0,mpDiff:0,changedFields:{[i]:{previous:l,current:o.value}},source:String(s.source||"manual")}),!0)},updateStatus(a={}){const n={name:e.char.name,class:e.char.class,race:e.char.race,color:e.char.color};hasOwn$3(a,"name")&&(e.char.name=a.name??""),hasOwn$3(a,"race")&&(e.char.race=a.race??"");const s=hasOwn$3(a,"class"),i=hasOwn$3(a,"race");if(s||i){const t=normalizeStatusClass({className:s?a.class:e.char.class,race:e.char.race,classProvided:s,raceProvided:i});e.char.class=t.className,e.char.color=t.color}const o=collectChangedFields({name:[n.name,e.char.name],class:[n.class,e.char.class],race:[n.race,e.char.race],color:[n.color,e.char.color]});return!!Object.keys(o).length&&(n.class!==e.char.class&&t("ClassChanged",{class:e.char.class,previousClass:n.class}),t("StatusUpdated",{current:e.char,changedFields:o}),!0)},updateWielded(a,n){if("left"!==a&&"right"!==a)return!1;const s=e.char.wielded[a],i=n?{id:n.id??null,name:String(n.name||""),icon:n.icon||null}:null;return(null!==s||null!==i)&&((!s||!i||s.id!==i.id||s.name!==i.name)&&(e.char.wielded[a]=i,t("WieldedUpdated",{side:a,current:i,previous:s}),!0))},updateMount(a){const n=e.char.mount,s=a?{name:String(a.name||""),id:a.id??null}:null;return n!==s&&((!n||!s||n.name!==s.name||n.id!==s.id)&&(e.char.mount=s,t("MountUpdated",{current:s,previous:n}),!0))},getChar:()=>e.char,getClass:()=>e.char.class,checkClass:t=>classesMatch(e.char.class,t),isClass:t=>void 0===t||!!t&&(Array.isArray(t)?t.some(t=>classesMatch(e.char.class,t)):classesMatch(e.char.class,t))}),st=["Text","text","short_desc"],hasOwn$2=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),getProvidedValue=(e,t,a,n="")=>{for(const s of t)if(hasOwn$2(e,s))return e[s]??n;return a},deriveIsPlayer=e=>"-1"===String(e),createSystemTargetApi=({state:e,emit:t})=>({updateTarget(a={}){const n=e.target,s={id:getProvidedValue(a,["id","ID"],n.id),text:getProvidedValue(a,st,n.text),hp:getProvidedValue(a,["HP","hp","hpperc"],n.hp)};if(s.isPlayer=deriveIsPlayer(s.id),s.id===n.id&&s.text===n.text&&s.hp===n.hp&&s.isPlayer===n.isPlayer)return!1;e.target=s;const i=st.some(e=>hasOwn$2(a,e)),o=s.id!==n.id||s.text!==n.text;return!(!i||!o)&&(t("TargetUpdated",{current:e.target,changedFields:collectChangedFields({id:[n.id,s.id],text:[n.text,s.text],isPlayer:[n.isPlayer,s.isPlayer],hp:[n.hp,s.hp]})}),!0)},isTarget(t){if(null==t)return!1;const a=String(t).toLowerCase();return e.target.text.toLowerCase()===a||String(e.target.id).toLowerCase()===a}}),hasOwn$1=(e,t)=>null!==e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,t),createSystemRoomApi=({state:e,emit:t})=>({getRoom:()=>e.room,updateRoom(a={}){const n=e.room,s={id:hasOwn$1(a,"num")?a.num:n.id,name:hasOwn$1(a,"name")?a.name??"":n.name,exits:hasOwn$1(a,"exits")?{...a.exits??{}}:n.exits,items:n.items},i=collectChangedFields({id:[n.id,s.id],name:[n.name,s.name]});return shallowEqualRecord(n.exits,s.exits)||(i.exits={previous:n.exits,current:s.exits}),!!Object.keys(i).length&&(e.room=s,t("RoomUpdated",{current:e.room,changedFields:i}),!0)},setRoomItems(a={}){const n={...a};return!shallowEqualRecord(e.room.items,n)&&(e.room.items=n,t("RoomItemsUpdated",{current:e.room.items}),!0)}}),createSystemModel=(e={})=>{const t={settings:deepMerge(Ze,e.settings||{}),baselineIntent:deepMerge(Ze,e.baselineIntent||{}),runtime:deepMerge(et,e.runtime||{}),char:deepMerge(tt,e.char||{}),target:deepMerge(rt,e.target||{}),room:deepMerge(at,e.room||{})};t.runtime={...t.runtime};const a=new Set;let n=0;const emit=(e,t)=>{n+=1,a.forEach(a=>a(e,t))},s=createSystemConfigApi({state:t,emit}),i=createSystemCharacterApi({state:t,emit}),o=createSystemTargetApi({state:t,emit}),l=createSystemRoomApi({state:t,emit}),copySettingsBucket=(e={})=>({...e,notices:{...e.notices||{}},ss:{...e.ss||{}}}),copyCharSnapshot=(e={})=>({...e,mount:e.mount?{...e.mount}:null,wielded:{left:e.wielded?.left?{...e.wielded.left}:null,right:e.wielded?.right?{...e.wielded.right}:null}}),copyTargetSnapshot=(e={})=>({...e}),copyRoomSnapshot=(e={})=>({...e,exits:{...e.exits||{}},items:{...e.items||{}}}),c=createSnapshotCache({getVersion:()=>n,buildSnapshot:()=>({settings:copySettingsBucket(t.settings),baselineIntent:copySettingsBucket(t.baselineIntent),runtime:{...t.runtime},char:copyCharSnapshot(t.char),target:copyTargetSnapshot(t.target),room:copyRoomSnapshot(t.room)})});return{onChange:e=>(a.add(e),()=>a.delete(e)),snapshot:()=>c(),getRuntime:s.getRuntime,getSettings:s.getSettings,getBaselineIntent:s.getBaselineIntent,setRuntime:s.setRuntime,setSettings:s.setSettings,setBaselineIntent:s.setBaselineIntent,updateVitals:i.updateVitals,updateResource:i.updateResource,updateStatus:i.updateStatus,updateWielded:i.updateWielded,updateMount:i.updateMount,getChar:i.getChar,getClass:i.getClass,checkClass:i.checkClass,isClass:i.isClass,updateTarget:o.updateTarget,isTarget:o.isTarget,getRoom:l.getRoom,updateRoom:l.updateRoom,setRoomItems:l.setRoomItems}},createModels=({adapter:e,seedData:t,options:a={},now:n})=>{const s=Boolean(a.debug),i=createSystemModel({settings:{debug:s},baselineIntent:{debug:s}}),o=createAfflictionModel({affTable:t.affTable,now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),l=createBalanceModel({balanceTable:t.balanceTable,haveAff:e=>o.haveAff(e),now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout}),c=createDefenseModel({defTable:t.defTable,defPrios:t.defPrios});return{systemModel:i,affModel:o,balanceModel:l,defModel:c,cacheModel:createCacheModel({cacheTable:t.cacheTable,cacheNames:t.cacheNames,haveAff:e=>o.haveAff(e),haveDef:e=>c.haveDef(e)}),limbModel:createLimbModel({now:n,setTimeoutFn:e.setTimeout,clearTimeoutFn:e.clearTimeout})}},it="parry",ot=25,resetParryPriorities=e=>{Object.keys(Ee.long).forEach(t=>{e.setDefaultPriority(`parrying ${t}`,0,it),e.get(`guarding ${t}`)&&e.setDefaultPriority(`guarding ${t}`,0,it)})},createCombatDomainService=({affModel:e,defModel:t,limbModel:a,systemModel:n,queueController:s,serverside:i})=>({observeLimbHit:({limb:t,amount:n,source:s="manual",at:o}={})=>applyObservedLimbHit({limbModel:a,affModel:e,serverside:i,limb:t,amount:n,source:s,at:o}),observeLimbReset:({limb:t,source:n="manual",at:s}={})=>applyObservedLimbReset({limbModel:a,affModel:e,serverside:i,limb:t,source:n,at:s}),observeLimbStage:({limb:t,stage:n,source:s="manual",at:o}={})=>applyObservedLimbStage({limbModel:a,affModel:e,serverside:i,limb:t,stage:n,source:s,at:o}),parry(e){resetParryPriorities(t);const a=Ee.short[e]||e,i=t.get(`guarding ${a}`);let o;return i&&n.isClass(i.skills)?(t.setDefaultPriority(`guarding ${a}`,ot,it),o=`guard ${a}`):(t.setDefaultPriority(`parrying ${a}`,ot,it),n.isClass("Dragon")?(t.setCommand(`parrying ${a}`,`clawparry ${a}`,it),o=`clawparry ${a}`):(t.setCommand(`parrying ${a}`,`parry ${a}`,it),o=`parry ${a}`)),s.prepend("freeQueue",o),{limbName:a,command:o}}}),isRecordValue=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),hasSupportedSchemaVersion=e=>isRecordValue(e)&&isSupportedPersistenceSchemaVersion(e.schemaVersion),createPersistenceStore=({adapter:e,key:t="nexSys4Settings",noticeCenter:a}={})=>{let n=!1;const noticeSchemaResetIfNeeded=e=>{n||!isRecordValue(e)||null==e.schemaVersion||isSupportedPersistenceSchemaVersion(e.schemaVersion)||(n=!0,a?.publish?.("persistence","Saved nexSys4 settings were in an older format and have been reset to defaults.",{force:!0}))},read=()=>{const a=e.getVariable(t);return noticeSchemaResetIfNeeded(a),{key:t,exists:hasSupportedSchemaVersion(a),snapshot:deepClone$1(normalizePersistenceSnapshot(a))}},load=()=>read().snapshot,save=(a={})=>{const n=deepClone$1(normalizePersistenceSnapshot(a,{assumeCurrentVersion:!0}));return e.setVariable(t,n),deepClone$1(n)};return{key:t,read,load,save}},createNoticeCenter=({adapter:e,systemModel:t})=>({publish:(a,n,s={})=>{const i=t.getSettings().notices||{},{force:o=!1,...l}=s;(o||!1!==i[a])&&e.notice(String(n),{category:a,...l})}}),lt=Object.freeze({PLANNED:"planned",SENT:"sent",AWAITING_COMPLETION:"awaiting-completion",COMPLETED:"completed",EXPIRED:"expired",RECOVERING:"recovering"}),createOutputCycle=({adapter:e,dispatchCommands:t,systemModel:a,serverside:n,outputPlanner:s,noticeCenter:i,options:o={}}={})=>{const now=()=>e?.now?.()??Date.now();let l=[],c="",u=1,d=null,m=null,p=null,g=[];const h=`echo SystemEvent ${oe.OUTPUT_COMPLETE}`,b=Math.max(50,Number(o.outputCompletionTimeoutMs||1e3)),y=Math.max(0,Number(o.maxOutputRecoveryAttempts??2)),clearCompletionTimer=()=>{p&&(e?.clearTimeout?.(p),p=null)},recordBatchState=(e,t,a={})=>{if(!e)return null;const n=now();return e.state=t,e.stateHistory.push({state:t,at:n}),Object.assign(e,a),e},snapshotBatch=e=>e?{id:e.id,source:e.source,state:e.state,stateHistory:e.stateHistory.map(e=>({...e})),completionRequired:e.completionRequired,recoveryAttempts:e.recoveryAttempts,maxRecoveryAttempts:e.maxRecoveryAttempts,commands:[...e.commands],dispatchedCommands:[...e.dispatchedCommands],serversideCommands:[...e.serversideCommands],batchCount:e.batchCount,createdAt:e.createdAt,sentAt:e.sentAt??null,completedAt:e.completedAt??null,expiredAt:e.expiredAt??null,lastRecoveryAt:e.lastRecoveryAt??null}:null,storeLastBatch=e=>{m=snapshotBatch(e)},createBatch=({source:e,intents:t=[],commands:a,serversideCommands:n,maxCommands:s})=>{const i=t.some(e=>!0===e?.requiresCompletion),o=i?a.filter(e=>e!==h):[...a],l=i?chunkCommandsWithTrailing(o,{maxEntries:s,trailing:[h]}):chunkCommands(o,s);return{id:u++,source:e,state:lt.PLANNED,stateHistory:[{state:lt.PLANNED,at:now()}],completionRequired:i,recoveryAttempts:0,maxRecoveryAttempts:y,commands:[...o],dispatchedCommands:i?[...o,h]:[...o],serversideCommands:[...n],batches:l,batchCount:l.length,createdAt:now(),observedOutbound:!1}},dispatchBatchBatches=(e,a,n={})=>{a.forEach((s,i)=>{t(s,{source:n.source||"output-cycle",cycleSource:e.source,batch:i+1,batchCount:a.length,outputBatchId:e.id,outputBatchState:e.state,recoveryAttempt:n.recoveryAttempt||0})})},scheduleCompletionTimeout=t=>{clearCompletionTimer(),p=e?.setTimeout?.(()=>{if(d&&d.id===t.id&&d.completionRequired){if(recordBatchState(d,lt.EXPIRED,{expiredAt:now()}),c="",d.recoveryAttempts>=d.maxRecoveryAttempts)return i?.publish?.("output",`Output completion confirmation expired after ${d.maxRecoveryAttempts} recovery probe(s).`,{force:!0}),storeLastBatch(d),d=null,void clearCompletionTimer();d.recoveryAttempts+=1,recordBatchState(d,lt.RECOVERING,{lastRecoveryAt:now()}),dispatchBatchBatches(d,[[h]],{source:"output-cycle-recovery",recoveryAttempt:d.recoveryAttempts}),scheduleCompletionTimeout(d)}},b)};return{planAndSend:({source:e="prompt"}={})=>{const t=a.getRuntime(),i=a.getSettings();if(t.paused||t.rulesSuspended)return t.rulesSuspended&&n.evaluate({emitCommands:!1,source:`${e}:rule-suspend-check`}),[];const o=n.getCuringSets?.().activeSet||"";if(o&&"nexsys4-default"!==o)return[];if(d)return[];const u="output-complete"===e?[...g]:[];g=[];const m=s.plan({source:e,injectedCommands:l,suppressedServersideCommands:u});if(a.getRuntime().paused||a.getRuntime().rulesSuspended)return l=[],[];if(!m.commands.length)return l=[],[];const p=Math.max(1,Number(i.maxSendPerChunk||20)),h=createBatch({source:e,intents:m.intents,commands:m.commands,serversideCommands:m.serversideCommands,maxCommands:p}),b=h.dispatchedCommands.join("");return b===c?[]:(h.serversideCommands.length&&!h.observedOutbound&&(n.observeOutbound(h.serversideCommands),h.observedOutbound=!0),recordBatchState(h,lt.SENT,{sentAt:now()}),dispatchBatchBatches(h,h.batches),c=b,h.completionRequired?(d=h,recordBatchState(d,lt.AWAITING_COMPLETION),scheduleCompletionTimeout(d)):(recordBatchState(h,lt.COMPLETED,{completedAt:now()}),storeLastBatch(h)),l=[],m.commands)},markComplete:()=>!!d&&(clearCompletionTimer(),g=[...d.serversideCommands],d.serversideCommands.length&&n.acknowledgeCommands(d.serversideCommands),recordBatchState(d,lt.COMPLETED,{completedAt:now()}),storeLastBatch(d),d=null,!0),isWaitingForCompletion:()=>d?.state===lt.AWAITING_COMPLETION||d?.state===lt.RECOVERING,isBlockingOutput:()=>Boolean(d),getLifecycleState:()=>({activeBatch:snapshotBatch(d),lastBatch:snapshotBatch(m)}),invalidate(){c=""},injectCommands(e=[]){l=[...l,...e.filter(Boolean)]},dispose(){clearCompletionTimer(),d=null,g=[]}}},ct="nexSysSettings",isRecord$1=e=>Boolean(e)&&"object"==typeof e&&!Array.isArray(e),mergeLegacyDefPriorities=(e={},t={})=>{const a={};return new Set([...Object.keys(e),...Object.keys(t)]).forEach(n=>{const s=Number(t[n])||0;a[n]=s>0?s:Number(e[n])||0}),a},ut={customPrompt:"customPrompt",overrideTab:"overrideTab",loadOnLogin:"loadOnLogin",queueWhilePaused:"queueWhilePaused"},dt={echoOutput:"output",echoAffGot:"affGot",echoAffLost:"affLost",echoDefGot:"defGot",echoDefLost:"defLost",echoBalanceGot:"balanceRecovered",echoBalanceLost:"balanceLost",echoTrackableGot:"trackableGot",echoTrackableLost:"trackableLost",echoPrioritySet:"priority"},mt={sipPriority:"sipPriority",sipHealthAt:"sipHealthAt",sipManaAt:"sipManaAt",mossHealthAt:"mossHealthAt",mossManaAt:"mossManaAt",focus:"focus",focusOverHerbs:"focusOverHerbs",tree:"tree",clot:"clot",clotAt:"clotAt",insomnia:"insomnia",fracturesAbove:"fracturesAbove",manaAbilitiesAbove:"manaThreshold",clotAbove:"clotAbove",batch:"batch"},transformSystemSettings=(e={})=>{const t={};Object.entries(ut).forEach(([a,n])=>{void 0!==e[a]&&(t[n]=e[a])});const a={};Object.entries(dt).forEach(([t,n])=>{void 0!==e[t]&&(a[n]=Boolean(e[t]))}),Object.keys(a).length&&(t.notices=a);const n={};return Object.entries(mt).forEach(([t,a])=>{void 0!==e[t]&&(n[a]=normalizeStatusValue(a,e[t]))}),void 0!==e.curingMethod&&(n.transmutation="Transmutation"===e.curingMethod),Object.keys(n).length&&(t.ss=n),t},transformLegacySettings=(e={})=>({systemSettings:transformSystemSettings(e.systemSettings||{}),defSettings:{defaults:mergeLegacyDefPriorities(e.defSettings?.keepup,e.defSettings?.static)},cacheSettings:{precache:{...e.cacheSettings||{}}}}),importLegacySettings=({adapter:e,persistence:t,noticeCenter:a,legacyKey:n=ct}={})=>{if(t.read().exists)return!1;const s=e.getVariable(n);return!!isRecord$1(s)&&(t.save(transformLegacySettings(s)),a?.publish?.("persistence","Imported curing, defence, and cache settings from your original nexSys installation.",{force:!0}),!0)},createRuntimeServices=({adapter:e,options:t={},models:a,controllers:n})=>{const{systemModel:s,affModel:i,defModel:o,limbModel:l}=a,{commandDispatcher:c,queueController:u,serverside:d,defensePlanner:m,precachePlanner:p,outputPlanner:g}=n,h=createNoticeCenter({adapter:e,systemModel:s}),b=createPersistenceStore({adapter:e,key:t.persistenceKey||"nexSys4Settings",noticeCenter:h});return importLegacySettings({adapter:e,persistence:b,noticeCenter:h}),{persistence:b,combatService:createCombatDomainService({affModel:i,defModel:o,limbModel:l,systemModel:s,queueController:u,serverside:d}),noticeCenter:h,defensePlanner:m,precachePlanner:p,outputCycle:createOutputCycle({adapter:e,dispatchCommands:c.sendCommands,systemModel:s,serverside:d,outputPlanner:g,noticeCenter:h,options:t})}},createRuntimeDependencies=({adapter:e,seedData:t,options:a={}})=>{const now=()=>e.now(),n=createModels({adapter:e,seedData:t,options:a,now}),s=createDomainControllers({adapter:e,seedData:t,options:a,now,models:n}),i=createRuntimeServices({adapter:e,options:a,models:n,controllers:s});return{now,...s,...n,...i}},createRuntimeFlushCoordinator=({adapter:e,systemModel:t,serverside:a,outputCycle:n,flushGmcpBuffer:s})=>{const now=()=>e?.now?.()??Date.now(),i={started:!1,safetyTimer:null,dirty:!1,flushing:!1,dirtyAt:null},clearSafetyTimer=()=>{i.safetyTimer&&(e.clearTimeout(i.safetyTimer),i.safetyTimer=null)},isRuntimeReady=()=>isRuntimeReadyPhase(t.getRuntime().phase),hasPendingSafetyWork=()=>{const e="function"!=typeof a.isDirty||a.isDirty();return i.dirty&&e},scheduleSafetyFlush=()=>{const a=t.getSettings(),n=Number(a.flushSafetyMs||120),s=Number(a.flushSafetyMaxWaitMs||500),o=now();i.dirtyAt||(i.dirtyAt=o),clearSafetyTimer();const l=o-i.dirtyAt,c=l>=s?0:Math.min(n,s-l);i.safetyTimer=e.setTimeout(()=>{i.safetyTimer=null,hasPendingSafetyWork()?(i.dirtyAt=null,flushCycle("safety-flush")):i.dirtyAt=null},c)},invalidateOutput=()=>{i.dirty=!0,n.invalidate?.()},markDirty=(e="dirty")=>{if(invalidateOutput(),a.markDirty(e),!isRuntimeReady())return clearSafetyTimer(),void(i.dirtyAt=null);i.flushing||n.isBlockingOutput?.()||scheduleSafetyFlush()},flushCycle=(e="prompt")=>{if(!i.started||i.flushing)return[];if(clearSafetyTimer(),!isRuntimeReady())return[];i.flushing=!0;try{if(s(),t.getRuntime().paused)return i.dirty=!1,[];const a=n.planAndSend({source:e});return i.dirty=n.isBlockingOutput()&&0===a.length,i.dirty||(i.dirtyAt=null),a}finally{i.flushing=!1}};return{start(){i.started=!0},stop(){i.started=!1,i.dirty=!1,i.flushing=!1,i.dirtyAt=null,clearSafetyTimer()},isStarted:()=>i.started,isFlushing:()=>i.flushing,invalidateOutput,markDirty,flushCycle}},cell=(e="",t="",a="")=>({text:e,fg:t,bg:a}),createDefaultCureColors=()=>({antimony:{fg:"olive",bg:""},argentum:{fg:"royalblue",bg:""},arsenic:{fg:"",bg:""},aurum:{fg:"ForestGreen",bg:""},azurite:{fg:"",bg:""},bisemutum:{fg:"",bg:""},calamine:{fg:"",bg:""},calcite:{fg:"slategray",bg:""},cinnabar:{fg:"greenyellow",bg:""},cuprum:{fg:"DeepSkyBlue",bg:""},ferrum:{fg:"DarkOrange",bg:""},gypsum:{fg:"",bg:""},magnesium:{fg:"Red",bg:""},plumbum:{fg:"Gold",bg:""},potash:{fg:"",bg:""},quartz:{fg:"",bg:""},quicksilver:{fg:"",bg:""},realgar:{fg:"firebrick",bg:""},stannum:{fg:"Tan",bg:""},caloric:{fg:"darkseagreen",bg:""},mending:{fg:"orchid",bg:""},epidermal:{fg:"sienna",bg:""},restoration:{fg:"darkviolet",bg:""},health:{fg:"lightpink",bg:""},writhe:{fg:"PaleGoldenRod",bg:"darkslategray"}}),createDefaultVars=()=>({blackout:!1,paused:cell("","red"),retard:cell("","blue"),aeon:cell("","red"),h:cell("0","green"),m:cell("0","green"),e:cell("0","green"),w:cell("0","green"),maxh:cell(""),maxm:cell(""),maxe:cell(""),maxw:cell(""),ph:cell("100%","green"),pm:cell("100%","green"),pe:cell("100%"),pw:cell("100%"),diffh:cell("","green"),diffm:cell("","green"),diffhp:cell("","green"),diffmp:cell("","green"),target:cell("","pink"),targetHP:cell("","green"),eq:cell(""),bal:cell(""),c:cell(""),k:cell(""),d:cell(""),b:cell(""),shield:cell("","cyan"),prismatic:cell("","magenta"),rage:cell("","red"),karma:cell("","green"),transcendence:cell("","cyan"),essence:cell("","purple"),kai:cell("","blue")}),createDefaultAffs=(e=createDefaultCureColors())=>({addiction:{text:"add",...e.ferrum},aeon:{text:"ae",...e.cinnabar},agoraphobia:{text:"agor",...e.argentum},amnesia:{text:"amn",fg:"",bg:""},anorexia:{text:"ANO",...e.epidermal},asthma:{text:"AST",...e.aurum},blackout:{text:"bo",fg:"",bg:""},blindness:{text:"unb",...e.arsenic},bound:{text:"bnd",...e.writhe},brokenleftarm:{text:"la1",...e.mending},brokenleftleg:{text:"ll1",...e.mending},brokenrightarm:{text:"ra1",...e.mending},brokenrightleg:{text:"rl1",...e.mending},bruisedribs:{text:"ribs",fg:"",bg:""},burning:{text:"burn",...e.mending},calcifiedskull:{text:"calh",...e.restoration},calcifiedtorso:{text:"calt",...e.restoration},claustrophobia:{text:"clau",...e.stannum},clumsiness:{text:"clu",...e.aurum},concussion:{text:"conc",...e.restoration},confusion:{text:"con",...e.stannum},corruption:{text:"corr",fg:"",bg:""},crackedribs:{text:"cr",...e.health},crushedthroat:{text:"cru",...e.mending},daeggerimpale:{text:"daeg",...e.writhe},damage:{text:"dmg",fg:"tomato",bg:""},damagedleftarm:{text:"la2",...e.restoration},damagedleftleg:{text:"ll2",...e.restoration},damagedrightarm:{text:"ra2",...e.restoration},damagedrightleg:{text:"rl2",...e.restoration},damagedhead:{text:"hd2",...e.restoration},darkshade:{text:"dark",...e.ferrum},dazed:{text:"dzd",...e.cinnabar},dazzled:{text:"dzl",...e.mending},deadening:{text:"dea",...e.cinnabar},deafness:{text:"und",...e.calamine},dehydrated:{text:"deh",fg:"",bg:""},dementia:{text:"dem",...e.stannum},depression:{text:"dep",...e.plumbum},deteriorate:{text:"det",fg:"",bg:""},disloyalty:{text:"disl",...e.realgar},disrupted:{text:"disr",fg:"",bg:""},dissonance:{text:"disso",...e.plumbum},dizziness:{text:"diz",...e.plumbum},enscorcelled:{text:"ensor",fg:"",bg:""},entangled:{text:"entgl",...e.writhe},epilepsy:{text:"epi",...e.plumbum},fear:{text:"fear",fg:"",bg:""},flushings:{text:"flush",...e.ferrum},fratricide:{text:"frat",...e.ferrum},frozen:{text:"frz",...e.caloric},generosity:{text:"gen",...e.cuprum},grievouswounds:{text:"grv",...e.health},guilt:{text:"gui",...e.argentum},haemophilia:{text:"haem",...e.ferrum},hallucinations:{text:"hall",...e.stannum},hamstrung:{text:"hms",fg:"",bg:""},healthleech:{text:"hthl",...e.aurum},heartseed:{text:"heart",...e.restoration},hellsight:{text:"hell",...e.realgar},horror:{text:"hor",...e.plumbum},hypersomnia:{text:"hypers",...e.stannum},hypochondria:{text:"hypoch",...e.lobelia},hypothermia:{text:"hypoth",...e.restoration},icefisted:{text:"ice",fg:"",bg:""},impaled:{text:"impl",...e.writhe},impatience:{text:"IMPAT",...e.plumbum},indifference:{text:"ind",...e.cuprum},insomnia:{text:"insomnia",fg:"",bg:""},itching:{text:"itch",...e.epidermal},justice:{text:"just",...e.cuprum},kkractlebrand:{text:"kkr",...e.health},laceratedthroat:{text:"lac2",...e.restoration},latched:{text:"latch",...e.health},lethargy:{text:"let",...e.ferrum},lightbind:{text:"light",fg:"",bg:""},loneliness:{text:"lon",...e.argentum},lovers:{text:"love",...e.cuprum},manaleech:{text:"man",...e.realgar},mangledleftarm:{text:"la3",...e.restoration},mangledleftleg:{text:"ll3",...e.restoration},mangledrightarm:{text:"ra3",...e.restoration},mangledrightleg:{text:"rl3",...e.restoration},mangledhead:{text:"hd3",...e.restoration},masochism:{text:"maso",...e.argentum},mildtrauma:{text:"tor1",...e.restoration},mycalium:{text:"myc",...e.plumbum},nausea:{text:"nau",...e.ferrum},numbedleftarm:{text:"nbla",fg:"",bg:""},numbedrightarm:{text:"nbra",fg:"",bg:""},pacified:{text:"pac",...e.cuprum},paralysis:{text:"PAR",...e.magnesium},paranoia:{text:"prn",...e.stannum},parasite:{text:"prs",...e.aurum},peace:{text:"pea",...e.cuprum},phlogisticated:{text:"phlog",fg:"",bg:""},pinshot:{text:"psh",fg:"",bg:""},pressure:{text:"pres",...e.calcite},prone:{text:"pr",fg:"",bg:""},pyramides:{text:"pyra",...e.magnesium},pyre:{text:"pyre",...e.cuprum},rebbies:{text:"reb",...e.aurum},recklessness:{text:"reck",...e.argentum},retardation:{text:"ret",fg:"",bg:""},retribution:{text:"retr",...e.cuprum},revealed:{text:"rev",fg:"",bg:""},sandfever:{text:"sand",...e.plumbum},scalded:{text:"scald",...e.epidermal},scytherus:{text:"scy",...e.ferrum},selarnia:{text:"sel",...e.mending},sensitivity:{text:"sen",...e.aurum},serioustrauma:{text:"tor2",...e.restoration},shadowmadness:{text:"shad",...e.plumbum},shivering:{text:"shiv",...e.caloric},shyness:{text:"shy",...e.plumbum},skullfractures:{text:"sf",...e.health},slashedthroat:{text:"lac1",...e.epidermal},sleeping:{text:"slp",fg:"",bg:""},slickness:{text:"SLI",...e.magnesium},slimeobscure:{text:"nkh",fg:"",bg:""},spiritburn:{text:"spirB",...e.argentum},spiritwrack:{text:"spirW",fg:"",bg:""},stupidity:{text:"st",...e.plumbum},stuttering:{text:"stut",...e.epidermal},homunculusmercury:{text:"merc",fg:"",bg:""},temperedcholeric:{text:"choH",...e.antimony},temperedmelancholic:{text:"melaH",...e.antimony},temperedphlegmatic:{text:"phleH",...e.antimony},temperedsanguine:{text:"sanH",...e.antimony},tenderskin:{text:"tend",...e.argentum},tension:{text:"tens",...e.cinnabar},timeflux:{text:"tmfx",fg:"",bg:""},timeloop:{text:"tmlp",...e.cuprum},tonguetied:{text:"tngt",...e.restoration},torntendons:{text:"tt",...e.health},transfixation:{text:"trfx",...e.writhe},unweavingbody:{text:"unwB",...e.ferrum},unweavingspirit:{text:"unwS",...e.cinnabar},unweavingmind:{text:"unwM",...e.plumbum},vertigo:{text:"vert",...e.argentum},vitrified:{text:"vitri",fg:"",bg:""},voidfisted:{text:"void",fg:"",bg:""},voyria:{text:"voy",fg:"",bg:""},weariness:{text:"wea",...e.aurum},webbed:{text:"web",...e.writhe},whisperingmadness:{text:"mad",...e.argentum},wristfractures:{text:"wf",...e.health}}),createDefaultPromptState=()=>{const e=createDefaultCureColors();return{vars:createDefaultVars(),affs:createDefaultAffs(e),cureColors:e}},pt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},escapeHtml=e=>String(e??"").replace(/[&<>"']/g,e=>pt[e]),renderChunk=(e,t="",a="")=>{if(""===e||null==e)return"";const n=[];return t&&n.push(`color:${t}`),a&&n.push(`background-color:${a}`),`<span${n.length?` style="${n.join(";")}"`:""}>${escapeHtml(e)}</span>`},createPromptBuilder=({vars:e,affs:t,cureColors:a,renderAffsHtml:n,renderDiffHtml:s,renderTargetHtml:i,renderVarHtml:o,renderChunkHtml:l=renderChunk})=>{const c=[],u={vars:e,affs:t,cureColors:a,add(t,a,n){if(""===t||null==t)return u;const s="string"==typeof t?e[t]:null;return s&&"object"==typeof s&&"text"in s?c.push("function"==typeof o?o(t):l(s.text,s.fg,s.bg)):c.push(l(t,a,n)),u},addHTML:e=>(e&&c.push(String(e)),u),addAffs:()=>(c.push(n()),u),addDiff:()=>(c.push(s()),u),addTarget:()=>(c.push(i()),u),toHTML:()=>`<span class="nexsys-prompt">${c.join("")}</span>`};return u},gt=new Set(["diffh","diffm","diffhp","diffmp"]),ft=new Set(["target","targetHP"]),getCellSignature=(e={})=>`${String(e.text??"")}\0${String(e.fg??"")}\0${String(e.bg??"")}`,createPromptRenderer=({state:e,getComposer:t,getSortedAffNames:a,getAffSnapshot:n,renderChunkHtml:s=renderChunk})=>{const i=new Map,o=new Map,l=new Map,c=new Map;let u="",d="",m="",p="",g=!0,h=!0,b=!0,y=!0,v=null,S=Boolean(e.vars.blackout),x=[];const markPromptDirty=()=>{y=!0},markVarsDirty=(t=[])=>{Array.isArray(t)&&t.length&&(t.forEach(t=>{const a=e.vars[t];a&&"object"==typeof a&&"text"in a&&o.delete(t),gt.has(t)&&(h=!0),ft.has(t)&&(b=!0)}),y=!0)},syncExternalVarMutations=()=>{let t=!1;const a=new Set;Object.keys(e.vars||{}).forEach(n=>{a.add(n);const s=e.vars[n];if(!s||"object"!=typeof s||!("text"in s))return void((o.has(n)||i.has(n))&&(o.delete(n),i.delete(n),t=!0));const l=getCellSignature(s);o.get(n)!==l&&(o.delete(n),i.delete(n),t=!0,gt.has(n)&&(h=!0),ft.has(n)&&(b=!0))}),[...o.keys()].forEach(e=>{a.has(e)||(o.delete(e),i.delete(e),t=!0,gt.has(e)&&(h=!0),ft.has(e)&&(b=!0))});const n=Boolean(e.vars.blackout);n!==S&&(S=n,t=!0),t&&(y=!0)},syncExternalAffMutations=()=>{if(g||!x.length)return;let t=!1;x.forEach(a=>{const n=getCellSignature(e.affs[a]||{});l.get(a)!==n&&(t=!0)}),t&&(g=!0,y=!0)},syncExternalCureColorMutations=()=>{let t=!1;const a=new Set;Object.keys(e.cureColors||{}).forEach(n=>{a.add(n);const s=getCellSignature(e.cureColors[n]||{});c.get(n)!==s&&(t=!0)}),[...c.keys()].forEach(e=>{a.has(e)||(t=!0)}),t&&(y=!0)},renderVarHtml=t=>{const a=e.vars[t];if(!a||"object"!=typeof a||!("text"in a))return"";const n=getCellSignature(a);return o.get(t)===n&&i.has(t)||(i.set(t,s(a.text,a.fg,a.bg)),o.set(t,n)),i.get(t)||""},buildAffsHtml=()=>{const t=a()||[],{affs:i}=e;if(x=[...t],l.clear(),!t.length)return'<span class="nexsys-prompt-affs mono"></span>';const o=[s("[","brown")];for(let e=0;e<t.length;e+=1){const a=t[e],c=i[a]||{text:a,fg:"",bg:""},u="function"==typeof n&&n(a)||{},d=Number(u.max)>1&&Number.isFinite(Number(u.count))?`(${Number(u.count)})`:"";l.set(a,getCellSignature(i[a]||{}));const m=e<t.length-1?" ":"";o.push(s(`${c.text}${d}${m}`,c.fg,c.bg))}return o.push(s("]","brown")),`<span class="nexsys-prompt-affs mono">${o.join("")}</span>`},renderAffsHtml=()=>(g&&(u=buildAffsHtml(),g=!1),u),renderDiffHtml=()=>{if(h){const t=e.vars.diffh||{},a=e.vars.diffhp||{},n=e.vars.diffm||{},i=e.vars.diffmp||{},o=[];t.text&&(o.push(s(`${t.text}h`,t.fg,t.bg)),a.text&&o.push(s(`(${a.text})`,a.fg,a.bg))),n.text&&(o.length&&o.push(s(", ")),o.push(s(`${n.text}m`,n.fg,n.bg)),i.text&&o.push(s(`(${i.text})`,i.fg,i.bg))),d=o.join(""),h=!1}return d},renderTargetHtml=()=>{if(b){const t=e.vars.target||{},a=e.vars.targetHP||{},n=[];(t.text||a.text)&&(n.push(s(" [")),t.text&&n.push(renderVarHtml("target")),t.text&&a.text&&n.push(s(": ")),a.text&&n.push(renderVarHtml("targetHP")),n.push(s("] "))),m=n.join(""),b=!1}return m},resetTransients=()=>{const{vars:t}=e,a=["diffh","diffm","diffhp","diffmp"].filter(e=>{const a=t[e];return!(!a||""===a.text)&&(a.text="",!0)});a.length&&markVarsDirty(a)};return{render(){const a=t();if("function"!=typeof a)return"";if(syncExternalVarMutations(),syncExternalAffMutations(),syncExternalCureColorMutations(),!y&&a===v)return p;const n=createPromptBuilder({vars:e.vars,affs:e.affs,cureColors:e.cureColors,renderAffsHtml,renderDiffHtml,renderTargetHtml,renderVarHtml,renderChunkHtml:s});try{a(n)}catch(i){return console.error("nexSys4 prompt compose error",i),""}return p=n.toHTML(),y=!1,v=a,Object.keys(e.cureColors||{}).forEach(t=>{c.set(t,getCellSignature(e.cureColors[t]||{}))}),[...c.keys()].forEach(t=>{t in(e.cureColors||{})||c.delete(t)}),resetTransients(),p},markAffsDirty(){g=!0,y=!0},isAffDirty:()=>g,markDiffDirty(){h=!0,y=!0},markTargetDirty(){b=!0,y=!0},markVarsDirty,markPromptDirty,isPromptDirty:()=>y}},defaultCompose=e=>{const{vars:t}=e;t.blackout?e.add("-","reset"):(e.add("paused"),e.add("aeon"),e.add("retard"),e.add("h"),e.add(`(${t.ph.text}), `,t.h.fg,t.h.bg),e.add("m"),e.add(`(${t.pm.text}) `,t.m.fg,t.m.bg),t.rage.text&&Number(t.rage.text)>0&&e.add(`${t.rage.text}R `,t.rage.fg,t.rage.bg),t.karma.text&&e.add(`${t.karma.text}K `,t.karma.fg,t.karma.bg),e.add("eq"),e.add("bal"),e.add("|"),e.add("c"),e.add("k"),e.add("d"),e.add("b"),e.add(" "),e.addAffs(),e.addDiff())},ht=new Set(["diffh","diffm","diffhp","diffmp"]),bt=new Set(["target","targetHP"]),yt=Object.freeze(["deafness","blindness","insomnia"]),clampPct=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>100?100:t:0},colorGradation=e=>{const t=clampPct(e),a=t<75?50:Math.abs(t-100)/2+25;return`hsl(${(1.2*t).toFixed(0)}, 100%, ${a}%)`},colorPercentage=e=>{const t=Number(e)||0;return t>75?"green":t>=33?"yellow":"red"},createPromptPresenter=({publicEvents:e,affModel:t,defModel:a,balanceModel:n,systemModel:s,renderPrompt:i}={})=>{const o=createDefaultPromptState();let l=defaultCompose;const isPromptDefTracked=e=>"function"==typeof a?.get?Boolean(a.get(e)):"function"==typeof a?.haveDef,c=yt.filter(isPromptDefTracked),u=new Set(c),haveDef=e=>Boolean(a?.haveDef?.(e)),d=createPromptRenderer({state:o,getComposer:()=>l,getSortedAffNames:()=>{const e=t?.currentSorted&&t.currentSorted()||[],a=new Set,n=[];return e.forEach(e=>{u.has(e)||a.has(e)||(a.add(e),n.push(e))}),c.forEach(e=>{haveDef(e)||a.has(e)||(a.add(e),n.push(e))}),n},getAffSnapshot:e=>t?.get?.(e)||null}),isRecord=e=>e&&"object"==typeof e&&!Array.isArray(e),isCellLike=e=>isRecord(e)&&("text"in e||"fg"in e||"bg"in e),normalizeCellField=e=>null==e?"":String(e),getVarRegion=e=>ht.has(e)?"diff":bt.has(e)?"target":"",ensureVarCell=e=>{const t=o.vars[e];if(t&&"object"==typeof t&&"text"in t)return t;if(e in o.vars)return null;const a={text:"",fg:"",bg:""};return o.vars[e]=a,d.markPromptDirty(),a},applyCell=(e,t={},a={})=>{const n=a.create?ensureVarCell(e):o.vars[e];if(!n||"object"!=typeof n||!("text"in n))return!1;let s=!1;if("text"in t){const e=normalizeCellField(t.text);n.text!==e&&(n.text=e,s=!0)}if("fg"in t){const e=normalizeCellField(t.fg);n.fg!==e&&(n.fg=e,s=!0)}if("bg"in t){const e=normalizeCellField(t.bg);n.bg!==e&&(n.bg=e,s=!0)}return!!s&&(d.markVarsDirty([e]),"diff"===a.region&&d.markDiffDirty(),"target"===a.region&&d.markTargetDirty(),!0)},applyFlag=(e,t)=>{const a=Boolean(t);return o.vars[e]!==a&&(o.vars[e]=a,d.markPromptDirty(),!0)},updateBalanceGlyphs=()=>{applyCell("eq",{text:n?.have?.(Fe.EQUILIBRIUM)?"e":""}),applyCell("bal",{text:n?.have?.(Fe.BALANCE)?"x":""})},updateDefGlyphs=()=>{applyCell("c",{text:haveDef("cloak")?"c":""}),applyCell("k",{text:haveDef("kola")?"k":""}),applyCell("d",{text:haveDef("deafness")?"d":""}),applyCell("b",{text:haveDef("blindness")?"b":""}),applyCell("shield",{text:haveDef("shield")?"(":""}),applyCell("prismatic",{text:haveDef("prismatic")?"[":""})},pctOf=(e,t)=>{const a=Number(e)||0,n=Number(t)||0;return n>0?100*a/n:0},onVitals=(e={})=>{const t=e.current||s?.snapshot?.().char||{},a=pctOf(t.hp,t.maxhp),n=pctOf(t.mp,t.maxmp),i=pctOf(t.ep,t.maxep),o=pctOf(t.wp,t.maxwp);applyCell("h",{text:t.hp??"",fg:colorGradation(a)}),applyCell("m",{text:t.mp??"",fg:colorGradation(n)}),applyCell("e",{text:t.ep??"",fg:colorGradation(i)}),applyCell("w",{text:t.wp??"",fg:colorGradation(o)}),applyCell("maxh",{text:t.maxhp??""}),applyCell("maxm",{text:t.maxmp??""}),applyCell("maxe",{text:t.maxep??""}),applyCell("maxw",{text:t.maxwp??""}),applyCell("ph",{text:`${a.toFixed(1)}%`}),applyCell("pm",{text:`${n.toFixed(1)}%`}),applyCell("pe",{text:`${i.toFixed(1)}%`}),applyCell("pw",{text:`${o.toFixed(1)}%`});const l=Number(e.hpDiff||0),c=Number(e.mpDiff||0),u=Number(t.maxhp)||0,d=Number(t.maxmp)||0;if(l){const e=l<0?"red":"green";applyCell("diffh",{text:`${l>0?"+":""}${l}`,fg:e},{region:"diff"}),applyCell("diffhp",{text:u?`${(l/u*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}if(c){const e=c<0?"red":"green";applyCell("diffm",{text:`${c>0?"+":""}${c}`,fg:e},{region:"diff"}),applyCell("diffmp",{text:d?`${(c/d*100).toFixed(1)}%`:"",fg:e},{region:"diff"})}"karma"in t&&applyCell("karma",{text:t.karma??""}),"rage"in t&&applyCell("rage",{text:t.rage??""}),"transcendence"in t&&applyCell("transcendence",{text:t.transcendence??""}),"essence"in t&&applyCell("essence",{text:t.essence??""}),"kai"in t&&applyCell("kai",{text:t.kai??""}),applyFlag("blackout",t.dead)},onRuntimeChange=()=>{const e=s?.snapshot?.().runtime||{};applyCell("retard",{text:e.slowMode?"(r)":""}),applyCell("paused",{text:e.paused?"(p)":""}),applyCell("aeon",{text:e.aeonLocked?"(a)":""})},onTargetChange=()=>{const e=s?.snapshot?.().target||{};applyCell("target",{text:e.text||""},{region:"target"}),applyCell("targetHP",{text:e.hp||""},{region:"target"});const t=parseInt(e.hp,10);Number.isFinite(t)&&applyCell("targetHP",{fg:colorGradation(t)},{region:"target"})},onAffEvent=(e={})=>{"aeon"===e?.name&&applyCell("aeon",{text:t?.haveAff?.("aeon")?"(a)":""}),d.markAffsDirty()},onDefEvent=(e={})=>{updateDefGlyphs(),u.has(e?.id)&&d.markAffsDirty()},onBalanceEvent=()=>updateBalanceGlyphs(),m=[];let p=!1;const subscribe=(t,a)=>{if(!e||"function"!=typeof e.on)return;const n=e.on(t,a);"function"==typeof n&&m.push(n)};return{start:()=>{p||(p=!0,subscribe(se.SYSTEM_VITALS_CHANGED,onVitals),subscribe(se.SYSTEM_RUNTIME_CHANGED,onRuntimeChange),subscribe(se.SYSTEM_PAUSE_CHANGED,onRuntimeChange),subscribe(se.SYSTEM_TARGET_CHANGED,onTargetChange),subscribe(se.AFF_GOT,onAffEvent),subscribe(se.AFF_LOST,onAffEvent),subscribe(se.AFF_STACK_CHANGED,onAffEvent),subscribe(se.AFF_PRIORITY_CHANGED,()=>d.markAffsDirty()),subscribe(se.DEF_GOT,onDefEvent),subscribe(se.DEF_LOST,onDefEvent),subscribe(se.BALANCE_GOT,onBalanceEvent),subscribe(se.BALANCE_LOST,onBalanceEvent),subscribe(se.BALANCE_RESET,onBalanceEvent),subscribe(se.BALANCE_TIMER_RESTARTED,onBalanceEvent),updateDefGlyphs(),updateBalanceGlyphs(),onRuntimeChange())},stop:()=>{m.forEach(e=>{try{e()}catch(t){console.error("nexSys4 prompt presenter unsubscribe failed",t)}}),m.length=0,p=!1},render:(e={})=>{const t=d.render();return"function"==typeof i?i(t,e):t},markAffsDirty:()=>d.markAffsDirty(),markPromptDirty:()=>d.markPromptDirty(),patchVars:(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{const n=o.vars[e],s=getVarRegion(e);"boolean"!=typeof n?"boolean"!=typeof a||void 0!==n?t=applyCell(e,isCellLike(a)?a:{text:a},{create:!0,region:s})||t:o.vars[e]!==a&&(o.vars[e]=a,d.markPromptDirty(),t=!0):t=applyFlag(e,a)||t}),t},patchAffs:(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.affs&&(delete o.affs[e],t=!0));const n=isCellLike(a)?a:{text:a},s=o.affs[e],i=s&&"object"==typeof s?s:o.affs[e]={text:"",fg:"",bg:""};["text","fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t&&d.markAffsDirty(),t},patchCureColors:(e={})=>{if(!isRecord(e))return!1;let t=!1;return Object.entries(e).forEach(([e,a])=>{if(null===a)return void(e in o.cureColors&&(delete o.cureColors[e],t=!0));const n=isRecord(a)?a:{fg:a},s=o.cureColors[e],i=s&&"object"==typeof s?s:o.cureColors[e]={fg:"",bg:""};["fg","bg"].forEach(e=>{if(!(e in n))return;const a=normalizeCellField(n[e]);i[e]!==a&&(i[e]=a,t=!0)})}),t&&d.markPromptDirty(),t},colorGradation,colorPercentage,get vars(){return o.vars},get affs(){return o.affs},get cureColors(){return o.cureColors},get compose(){return l},set compose(e){l="function"==typeof e?e:defaultCompose,d.markPromptDirty()},_state:o,_onVitals:onVitals,_onAffEvent:onAffEvent,_onDefEvent:onDefEvent,_onBalanceEvent:onBalanceEvent,_onRuntimeChange:onRuntimeChange,_onTargetChange:onTargetChange}},vt=Object.freeze({INTERNAL:"internal",JS:"js",EVENTSTREAM:"eventstream"}),St=Object.freeze({STABLE:"stable",EXPERIMENTAL:"experimental",DEPRECATED:"deprecated"}),xt=/^nexsys4(\.[a-z0-9_-]+)+$/,Ct=Object.freeze(Object.values(vt)),kt=Object.freeze(Object.values(St)),At=Object.freeze({[vt.INTERNAL]:Object.freeze([null,vt.INTERNAL]),[vt.JS]:Object.freeze([null,vt.INTERNAL,vt.JS]),[vt.EVENTSTREAM]:Object.freeze([null,vt.INTERNAL,vt.JS,vt.EVENTSTREAM])}),topicEntry=(e,t,a={})=>{const n=a.scopedAudience??null,s={audience:e,scopedAudience:n,stability:a.stability??St.STABLE,description:t};return null!=n&&a.scopedPayloadKey&&(s.scopedPayloadKey=a.scopedPayloadKey),Object.freeze(s)},eventStreamTopic=(e,t={})=>topicEntry(vt.EVENTSTREAM,e,t),jsTopic=(e,t={})=>topicEntry(vt.JS,e,t),scopedEventStreamTopic=(e,t)=>eventStreamTopic(e,{scopedAudience:vt.EVENTSTREAM,scopedPayloadKey:t}),isScopedAudienceAllowed=(e,t)=>{const a=At[e];return Array.isArray(a)&&a.includes(t)},validateRegistryEntry=(e,t)=>{if(!xt.test(e))throw new Error(`Invalid topic registry key "${e}": expected lowercase dotted nexsys4.* form.`);if(!t||"object"!=typeof t||Array.isArray(t))throw new Error(`Invalid registry entry for "${e}": expected an object.`);if(!Ct.includes(t.audience))throw new Error(`Invalid audience for "${e}": received "${t.audience}".`);if(!("scopedAudience"in t))throw new Error(`Missing scopedAudience metadata for "${e}".`);if(null!=t.scopedAudience&&!Ct.includes(t.scopedAudience))throw new Error(`Invalid scopedAudience for "${e}": received "${t.scopedAudience}".`);if(!isScopedAudienceAllowed(t.audience,t.scopedAudience??null))throw new Error(`Invalid scopedAudience for "${e}": "${t.scopedAudience}" exceeds base audience "${t.audience}".`);if(null!=t.scopedAudience&&("string"!=typeof t.scopedPayloadKey||!t.scopedPayloadKey.trim()))throw new Error(`Missing scopedPayloadKey for scoped topic "${e}".`);if(!kt.includes(t.stability))throw new Error(`Invalid stability for "${e}": received "${t.stability}".`);if("string"!=typeof t.description||!t.description.trim())throw new Error(`Invalid description for "${e}": expected a non-empty string.`)},validateTopicRegistry=(e,t=Object.values(se))=>{if(!e||"object"!=typeof e||Array.isArray(e))throw new Error("Invalid topic registry: expected an object.");for(const a of t)if(!Object.prototype.hasOwnProperty.call(e,a))throw new Error(`Missing registry entry for "${a}".`);for(const a of Object.keys(e)){if(!t.includes(a))throw new Error(`Unexpected registry entry for "${a}".`);validateRegistryEntry(a,e[a])}return!0},Et=Object.freeze({[se.RUNTIME_STARTED]:eventStreamTopic("Runtime startup completed."),[se.RUNTIME_STOPPED]:eventStreamTopic("Runtime shutdown completed."),[se.RAW_GMCP]:eventStreamTopic("Raw GMCP payload observed at the adapter boundary."),[se.SYSTEM_VITALS_CHANGED]:eventStreamTopic("Character vitals changed."),[se.SYSTEM_HEALTH_CHANGED]:eventStreamTopic("Health changed."),[se.SYSTEM_MANA_CHANGED]:eventStreamTopic("Mana changed."),[se.SYSTEM_RAGE_CHANGED]:eventStreamTopic("Rage changed."),[se.SYSTEM_BLEED_CHANGED]:eventStreamTopic("Bleed changed."),[se.SYSTEM_STATUS_CHANGED]:eventStreamTopic("Character status snapshot changed."),[se.SYSTEM_CLASS_CHANGED]:eventStreamTopic("Character class changed."),[se.SYSTEM_TARGET_CHANGED]:eventStreamTopic("Current target changed."),[se.SYSTEM_ROOM_CHANGED]:eventStreamTopic("Current room changed."),[se.SYSTEM_ROOM_ITEMS_CHANGED]:eventStreamTopic("Visible room items changed."),[se.SYSTEM_RUNTIME_CHANGED]:jsTopic("Runtime implementation state changed."),[se.SYSTEM_PAUSE_CHANGED]:eventStreamTopic("Runtime pause state changed."),[se.SYSTEM_PAUSED]:eventStreamTopic("Runtime paused."),[se.SYSTEM_UNPAUSED]:eventStreamTopic("Runtime unpaused."),[se.SYSTEM_LOADED]:eventStreamTopic("Startup game-state initialization completed."),[se.SYSTEM_SETTINGS_CHANGED]:jsTopic("Runtime settings changed."),[se.SYSTEM_BASELINE_CHANGED]:jsTopic("Baseline intent changed."),[se.SYSTEM_DEATH_DETECTED]:eventStreamTopic("Death was detected from character state."),[se.SYSTEM_MOUNT_CHANGED]:eventStreamTopic("Mounted state changed."),[se.SYSTEM_WIELDED_CHANGED]:eventStreamTopic("Wielded equipment changed."),[se.UI_CONFIG_CHANGED]:jsTopic("Configuration dialog open state changed."),[se.AFF_GOT]:scopedEventStreamTopic("Affliction became active.","name"),[se.AFF_LOST]:scopedEventStreamTopic("Affliction was cured or removed.","name"),[se.AFF_STACK_CHANGED]:scopedEventStreamTopic("Affliction stack count changed.","name"),[se.AFF_PRIORITY_CHANGED]:jsTopic("Affliction priority changed."),[se.DEF_GOT]:scopedEventStreamTopic("Defence became active.","id"),[se.DEF_LOST]:scopedEventStreamTopic("Defence expired or was removed.","id"),[se.DEF_PRIORITY_CHANGED]:jsTopic("Defence priority changed."),[se.BALANCE_GOT]:scopedEventStreamTopic("Balance became available.","id"),[se.BALANCE_LOST]:scopedEventStreamTopic("Balance was consumed or lost.","id"),[se.BALANCE_RESET]:scopedEventStreamTopic("Balance timing was reset.","id"),[se.BALANCE_DURATION_OBSERVED]:scopedEventStreamTopic("Observed balance recovery duration changed.","id"),[se.BALANCE_TIMER_RESTARTED]:jsTopic("Balance loss timer was restarted without a state flip."),[se.EQBAL_GOT]:eventStreamTopic("Balance and equilibrium are both available."),[se.LIMB_HIT]:scopedEventStreamTopic("Limb damage was recorded.","limb"),[se.LIMB_RESET]:scopedEventStreamTopic("Limb tracking was reset.","limb"),[se.LIMB_STAGE_CHANGED]:scopedEventStreamTopic("Limb damage stage changed.","limb"),[se.LIMB_DECAY]:jsTopic("Limb damage counter reset after 3 minutes of no hits."),[se.CACHE_AMOUNT_CHANGED]:eventStreamTopic("Cached item counts changed."),[se.CACHE_INVENTORY_LIST]:eventStreamTopic("Inventory cache snapshot applied."),[se.CACHE_RIFT_LIST]:eventStreamTopic("Rift cache snapshot applied."),[se.CACHE_PRECACHE_CHANGED]:jsTopic("Desired precache state changed."),[se.ITEM_ROOM_ADDED]:eventStreamTopic("An item appeared in the current room."),[se.ITEM_ROOM_REMOVED]:eventStreamTopic("An item left the current room."),[se.ITEM_ROOM_UPDATED]:eventStreamTopic("A current-room item changed."),[se.ITEM_ROOM_LIST]:eventStreamTopic("Current-room item list snapshot received."),[se.ITEM_INV_ADDED]:eventStreamTopic("An item was added to inventory."),[se.ITEM_INV_REMOVED]:eventStreamTopic("An item was removed from inventory."),[se.ITEM_INV_UPDATED]:eventStreamTopic("An inventory item changed."),[se.ITEM_INV_LIST]:eventStreamTopic("Inventory item list snapshot received."),[se.QUEUE_UPDATED]:jsTopic("Queue contents changed."),[se.QUEUE_FLUSHED]:jsTopic("Queue flush decision completed."),[se.QUEUE_DEFERRED]:jsTopic("Queue execution was deferred."),[se.QUEUE_CLEARED]:jsTopic("Queue contents were cleared."),[se.QUEUE_SENT]:scopedEventStreamTopic("A queue submission was accepted by the server.","queueName"),[se.QUEUE_FIRED]:scopedEventStreamTopic("A queue fire was acknowledged for a named queue.","queueName"),[se.QUEUE_FIRED_ACK]:eventStreamTopic("Queue fire acknowledgement was recorded."),[se.SERVERSIDE_AFF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside affliction priority confirmation was observed.","id"),[se.SERVERSIDE_DEF_PRIORITY_SET]:scopedEventStreamTopic("Live serverside defence priority confirmation was observed.","id"),[se.SERVERSIDE_DIRTY]:jsTopic("Serverside reconciliation dirty flag changed."),[se.SERVERSIDE_EVALUATED]:jsTopic("Serverside evaluation completed."),[se.SERVERSIDE_RULE_CHANGED]:jsTopic("Legacy generic serverside rule-change signal reserved for compatibility."),[se.RULE_ADDED]:jsTopic("Serverside rule was added to the registry."),[se.RULE_REMOVED]:jsTopic("Serverside rule was removed from the registry."),[se.RULE_ENABLED]:jsTopic("Serverside rule was enabled."),[se.RULE_DISABLED]:jsTopic("Serverside rule was disabled."),[se.RULE_PACK_LOADED]:jsTopic("Serverside rule pack was loaded."),[se.RULE_PACK_UNLOADED]:jsTopic("Serverside rule pack was unloaded."),[se.RULE_ORDER_CHANGED]:jsTopic("Serverside rule evaluation order changed."),[se.RULE_ACTIVATED]:scopedEventStreamTopic("Serverside rule became active.","id"),[se.RULE_DEACTIVATED]:scopedEventStreamTopic("Serverside rule stopped being active.","id")});validateTopicRegistry(Et);var buildExactTopicSet=e=>new Set(Object.keys(e||{})),buildScopedBaseMap=e=>{const t=new Map;return Object.entries(e||{}).forEach(([e,a])=>{null!=a?.scopedAudience&&t.set(e,a.scopedAudience)}),t},createEventStreamPublisher=({adapter:e,registry:t,globallyEnabled:a,rawGmcpEnabled:n})=>{const s=buildExactTopicSet(t),i=buildScopedBaseMap(t),resolveAudience=e=>{const a=String(e||"").trim();if(!a)return null;if(s.has(a))return t[a].audience;const n=a.lastIndexOf(".");if(n<0)return null;const o=a.slice(0,n);return i.get(o)??null},isAllowed=(e,t)=>!!a&&(t===vt.EVENTSTREAM&&!(e===se.RAW_GMCP&&!n)),evaluate=(t,a)=>{const n=String(t||"").trim();return!!isAllowed(n,resolveAudience(n))&&("function"==typeof e?.raiseToEventStream&&e.raiseToEventStream(n,a))};return{attach:e=>e&&"function"==typeof e.onAny?e.onAny((e,t)=>{evaluate(t,e)}):()=>{},evaluate,resolveAudience,debugInfo:()=>({globallyEnabled:Boolean(a),rawGmcpEnabled:Boolean(n),exactTopicCount:s.size,scopedBaseCount:i.size})}},normalizeScopedTopicSegment=e=>{const t=String(e||"").trim().toLowerCase();return t?t.replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""):""},normalizePublishedPayload=(e={})=>e&&"object"==typeof e&&!Array.isArray(e)?e:{value:e},normalizeMessage=(e,t={},a)=>{const n=normalizePublishedPayload(t);return{...n,topic:e,at:n.at??a()}},createRuntimeEventPorts=({adapter:e,internalEvents:t,publicEvents:a,now:n})=>{const publishPublic=(e,t={})=>{const s=normalizeMessage(e,t,n);return a.emit(e,s),s},publishPublicScoped=(e,t={},a)=>{const n=publishPublic(e,t),s=normalizeScopedTopicSegment(a);return s?(publishPublic(`${e}.${s}`,n),n):n};return{publishPublic,publishPublicScoped,publishInternal:(e,a={})=>{const s=normalizeMessage(e,a,n);return t.emit(e,s),s},publishAdapterLocal:(t,a={})=>("function"==typeof e?.emitLocal&&e.emitLocal(t,a),a)}},createRuntimeEngine=({adapter:e,seedData:t,options:a={}})=>{const n=resolveAdapterCapabilities(e),{now:s,commandDispatcher:i,systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m,persistence:p,queueController:g,serverside:h,combatService:b,noticeCenter:y,defensePlanner:v,precachePlanner:S,outputPlanner:x,outputCycle:C}=createRuntimeDependencies({adapter:e,seedData:t,options:a}),k=createGmcpBlockBuffer({coalesce:!1!==a.coalesceGmcp}),A=createEventBus({label:"nexSys4.internal"}),E=createEventBus({label:"nexSys4.public"}),_=createPromptPresenter({publicEvents:E,affModel:l,defModel:u,balanceModel:c,systemModel:o,renderPrompt:(t,a={})=>n.promptRender?e.renderPrompt(t,a):t}),w=createEventStreamPublisher({adapter:e,registry:Et,globallyEnabled:!1!==a.publishToEventStream,rawGmcpEnabled:!0===a.publishRawGmcp}),T=createRuntimeEventPorts({adapter:e,internalEvents:A,publicEvents:E,now:s});w.attach(E);const setRuntimePhase=(e,t={})=>o.setRuntime({phase:e,...t}),syncDebugMode=()=>{const t=Boolean(o.getSettings().debug);return n.debugToggle&&e.setDebugEnabled(t),A.setDebugEnabled?.(t),E.setDebugEnabled?.(t),t},P=T.publishPublic,M=T.publishPublicScoped,D=T.publishAdapterLocal,publishStartupPhase=e=>D("StartupPhaseEvent",{phase:e});let R;const O=createCuringSetProvisioner({adapter:e,serverside:h,dispatchCommands:i.sendCommands,setRuntimePhase,publishStartupPhase,options:a}),N=createStartupCoordinator({adapter:e,systemModel:o,serverside:h,persistence:p,seedBaselineFromObservedStartup:()=>$.seedBaselineFromObservedStartup({skipObservedAdoption:O.wasCreatedThisRun()}),noticeCenter:y,buildPersistenceSnapshot:()=>$.buildPersistenceSnapshot(),startupTimeoutMs:a.startupTimeoutMs,maxStartupRetries:a.maxStartupRetries,startupFinalizeTimeoutMs:a.startupFinalizeTimeoutMs,maxStartupFinalizeRecoveryAttempts:a.maxStartupFinalizeRecoveryAttempts,publishStartupPhase,publishLoaded:e=>P(se.SYSTEM_LOADED,e),releaseStartupPause:e=>R.setPaused(!1,e),setRuntimePhase}),L=createGmcpApplier({emit:(e,t)=>A.emit(e,t)}),I=createItemTopicNotifier({publishPublic:P}),queueTranslatedGmcp=e=>{L.translate(e).forEach(e=>{I.notify(e),k.enqueue(e)})},hydrateCacheFromAdapterGmcp=()=>{if(!n.gmcpSnapshot)return!1;const t=e.getGMCP();return!(!t||"object"!=typeof t)&&(d.hydrateFromGmcp?.(t)??!1)},j=createRuntimeFlushCoordinator({adapter:e,systemModel:o,serverside:h,outputCycle:C,flushGmcpBuffer:()=>{k.flush().forEach(({topic:e,payload:t})=>{A.emit(e,t)}),d.completeObservationBlock?.({source:"runtime-flush"})}}),q=createCuringMasterSwitch({setPaused:(e,t)=>R.setPaused(e,t),noticeCenter:y,now:s,options:a});R=createRuntimeControlApi({systemModel:o,serverside:h,queueController:g,noticeCenter:y,curingMasterSwitch:q,dispatchCommands:i.sendCommands,markDirty:j.markDirty,onResume:e=>{j.isFlushing()||j.flushCycle(e)}});const B=createCuringSetGuard({serverside:h,systemModel:o,runtimeControl:R,noticeCenter:y}),$=createRuntimePersistenceApi({persistence:p,systemModel:o,affModel:l,defModel:u,cacheModel:d,serverside:h,syncDebugMode,markDirty:j.markDirty}),F=createRuntimeEventWiring({adapter:e,internalEvents:A}),z=createRuntimeStartupOrchestrator({adapter:e,systemModel:o,persistenceApi:$,startup:N,curingSetProvisioner:O,noticeCenter:y,syncDebugMode,isStarted:j.isStarted,markStarted:j.start,setRuntimePhase,publishStartupPhase,attachEventWiring:()=>{F.attach({options:a,queueTranslatedGmcp,publishPublic:P,publishPublicScoped:M,noticeCenter:y,syncDebugMode,systemModel:o,affModel:l,defModel:u,balanceModel:c,cacheModel:d,limbModel:m,queueController:g,serverside:h,markDirty:j.markDirty,invalidateOutput:j.invalidateOutput,flushCycle:j.flushCycle,outputCycle:C,startup:N,curingSetProvisioner:O,curingSetGuard:B,curingMasterSwitch:q,runtimeControl:R,savePersistence:$.savePersistence})},promptPresenter:_,publishRuntimeStarted:()=>P(se.RUNTIME_STARTED,{source:"runtime-start"}),hydrateCacheFromAdapterGmcp,runtimeControl:R,commandDispatcher:i,debugOverride:a.bootstrapDebugOverride}),stop=()=>{z.dispose(),j.isStarted()&&(P(se.RUNTIME_STOPPED,{source:"runtime-stop"}),j.stop(),N.dispose?.(),C.dispose?.(),F.dispose(),setRuntimePhase(ie.IDLE,{paused:!0,startupFailureMessage:""}),_.stop(),l.dispose?.(),c.dispose?.(),m.dispose(),A.clear(),E.clear(),w.attach(E),n.destroy&&e.destroy())};let G=null;const snapshot=()=>{const e=o.snapshot(),t=l.snapshot(),a=c.snapshot(),n=u.snapshot(),s=d.snapshot(),i=m.snapshot(),p=g.snapshot(),b=h.snapshot();return G&&G.system===e&&G.affs===t&&G.balances===a&&G.defs===n&&G.cache===s&&G.limbs===i&&G.queues===p&&G.serverside===b||(G={system:e,affs:t,balances:a,defs:n,cache:s,limbs:i,queues:p,serverside:b}),G};return{start:z.start,stop,flushCycle:j.flushCycle,savePersistence:$.savePersistence,setPaused:R.setPaused,setSlowMode:R.setSlowMode,setConfigOpen:(e,t="runtime-ui")=>P(se.UI_CONFIG_CHANGED,{open:Boolean(e),source:t}),get paused(){return o.getRuntime().paused},snapshot,adapter:e,models:{systemModel:o,affModel:l,balanceModel:c,defModel:u,cacheModel:d,limbModel:m},services:{combat:b},planners:{defensePlanner:v,precachePlanner:S,outputPlanner:x,outputCycle:C},queueController:g,serverside:h,curingSetGuard:B,noticeCenter:y,persistence:p,commandDispatcher:i,promptPresenter:_,topics:se,onEvent:(e,t)=>E.on(e,t),offEvent:(e,t)=>E.off(e,t),markDirty:j.markDirty,ingestGmcp(e,t){queueTranslatedGmcp({tag:e,payload:t}),!0===a.publishRawGmcp&&P(se.RAW_GMCP,{source:"manual-gmcp",tag:String(e||"").trim().toLowerCase(),payload:t}),j.markDirty(`manual-gmcp:${e}`)},evaluateNow:(e="manual")=>j.flushCycle(e),addOutputCommands(e=[]){C.injectCommands(Array.isArray(e)?e:[e]),j.markDirty("manual-output-inject")},dispatchCommands:i.sendCommands,debugInfo:()=>({adapter:e.debugInfo?.()??null,internalEvents:A.debugInfo?.()??null,publicEvents:E.debugInfo?.()??null,eventStreamPublisher:w.debugInfo?.()??null})}},toArray=e=>Array.isArray(e)?e:[e],normalizeQueueKey=e=>String(e||"").trim(),normalizeCommandContext=(e,t)=>"boolean"==typeof e?{...t,preventExpansion:e}:e&&"object"==typeof e&&!Array.isArray(e)?{...t,...e}:{...t},createPublicCommandApi=({runtime:e})=>{const t=e.queueController,a=t.listQueues().map(e=>({queueId:e,meta:t.getQueue(e)||{}})),n=new Map,s=new Map,resolveQueueId=e=>{const t=normalizeQueueKey(e);return s.get(t)||t},getQueueHandle=e=>{const t=resolveQueueId(e);return n.get(t)||null},inspectQueue=e=>t.getQueue(resolveQueueId(e)),addQueue=(e,a,n)=>t.add(resolveQueueId(e),a,n),addClearQueue=(e,a,n)=>t.addClear(resolveQueueId(e),a,n),prependQueue=(e,a,n)=>t.prepend(resolveQueueId(e),a,n),clearLocalQueue=e=>t.clear(resolveQueueId(e)),clearGameQueue=e=>t.clearQueue(resolveQueueId(e)),flushQueue=(e,a)=>t.flush(resolveQueueId(e),a),isQueued=(e,t)=>{if(!t)return!1;const a=inspectQueue(e);return!!a&&(a.items.includes(t)||a.prepend.includes(t))};a.forEach(({queueId:e,meta:t})=>{n.set(e,{get id(){return e},get queueId(){return e},get name(){return inspectQueue(e)?.name||t.name||""},get type(){return inspectQueue(e)?.type||t.type||""},get exclusions(){return inspectQueue(e)?.exclusions||t.exclusions||[]},inspect:()=>inspectQueue(e),state:()=>inspectQueue(e),add:(t,a)=>addQueue(e,t,a),addClear:(t,a)=>addClearQueue(e,t,a),prepend:(t,a)=>prependQueue(e,t,a),clear:()=>clearLocalQueue(e),clearQueue:()=>clearGameQueue(e),flush:t=>flushQueue(e,t),isQueued:t=>isQueued(e,t)}),s.set(e,e),t.name&&s.set(t.name,e)});const i={controller:t,listQueues:()=>t.listQueues(),inspect:e=>inspectQueue(e),get:e=>getQueueHandle(e),add:(e,t,a)=>addQueue(e,t,a),addClear:(e,t,a)=>addClearQueue(e,t,a),prepend:(e,t,a)=>prependQueue(e,t,a),clear:e=>clearLocalQueue(e),clearQueue:e=>clearGameQueue(e),flush:(e,t)=>flushQueue(e,t),flushAll:()=>t.flushAll(),isQueued:(e,t)=>isQueued(e,t)},o={listQueues:()=>i.listQueues(),inspect:e=>i.inspect(e),get:e=>i.get(e)},l={};return a.forEach(({queueId:e,meta:t})=>{const a=n.get(e);a&&(l[e]=a,o[e]=a,t.name&&(o[t.name]=a))}),{queue:i,queues:o,...l,sendCmd:(t,a={})=>e.dispatchCommands([t],normalizeCommandContext(a,{source:"public-api"})),setTarget(t){const a=String(t??"").trim();if(!a)return{target:"",dispatched:!1,dispatchResult:null};const n=e.dispatchCommands(["settarget "+a],{source:"set-target"});return{target:a,dispatched:Boolean(n),dispatchResult:n}},sendInline:(t=[],a={})=>e.dispatchCommands(toArray(t),normalizeCommandContext(a,{source:"public-api-inline"})),addOutput(t=[]){e.addOutputCommands(toArray(t))},evaluateNow:(t="public-api")=>e.evaluateNow(t)}},_t="nexSys4",wt="https://unpkg.com/nexsys4/dist/nexSys4.nxs",Tt="khaseem",Pt=Object.freeze(["nexSys4.userSettings"]),Mt=1e4,Dt=Object.freeze({fg:"red"}),toLowerName=e=>String(e??"").trim().toLowerCase(),safeCall=e=>{try{return e()}catch{return null}},clonePackageItem=e=>{if(!e||"object"!=typeof e)return null;if("function"==typeof structuredClone)try{return structuredClone(e)}catch{}try{return JSON.parse(JSON.stringify(e))}catch{return e}},getReflexes=e=>safeCall(()=>e?.reflexes?.())??null,getPackageRegistry=e=>{const t=safeCall(()=>e?.packages?.());if("function"==typeof t?.get)return t;const a=safeCall(()=>getReflexes(e)?.packages?.());return"function"==typeof a?.get?a:null},getInstalledPackage=(e,t)=>safeCall(()=>getPackageRegistry(e)?.get(t))??null,findGroupByName=(e,t)=>{if(!Array.isArray(e))return null;const a=toLowerName(t);return e.find(e=>toLowerName(e?.name)===a)??null},capturePreservedGroups=(e,t)=>t.map(t=>{const a=findGroupByName(e?.items,t);return a?{name:t,data:clonePackageItem(a)}:null}).filter(Boolean),applyPreservedGroup=(e,t,a)=>{const n=findGroupByName(e?.items,t.name);n&&t.data&&("function"!=typeof n.apply?"object"==typeof n&&Object.assign(n,clonePackageItem(t.data)):n.apply(t.data,a))},enableShippedGroups=(e,t)=>{if(!Array.isArray(e?.items))return;const a=new Set(t.map(toLowerName));e.items.filter(e=>"group"===e?.type&&!a.has(toLowerName(e.name))).forEach(e=>{e.enabled=!0})},reportUpdateError=({adapter:e,consoleObj:t,message:a,nexusClient:n})=>{t.error(a),"function"!=typeof e?.notice?n?.display?.(a):e.notice(a,Dt)},createAbortSignal=({AbortControllerCtor:e,setTimeoutFn:t,timeoutMs:a})=>{if(!e||a<=0)return{signal:void 0,timeout:null};const n=new e,s=t(()=>n.abort(),a);return{signal:n.signal,timeout:s}},updateNxs=async({adapter:e=null,clearTimeoutFn:t=clearTimeout,consoleObj:a=console,fetchFn:n=globalThis.fetch,nexusClient:s=globalThis.nexusclient,packageName:i=_t,preservedGroupNames:o=Pt,setTimeoutFn:l=setTimeout,skipCharacterName:c=Tt,timeoutMs:u=Mt,url:d=wt}={})=>{if(c&&toLowerName(s?.charname)===toLowerName(c))return null;let m=null;try{if("function"!=typeof n)throw new Error("fetch is not available.");const e=getInstalledPackage(s,i);if(!e||"function"!=typeof e.apply)throw new Error(`${i} package is not installed in Nexus.`);const t=capturePreservedGroups(e,o),{signal:a,timeout:c}=createAbortSignal({AbortControllerCtor:globalThis.AbortController,setTimeoutFn:l,timeoutMs:u});m=c;const p=await n(d,{cache:"no-store",...a?{signal:a}:{}});if(!p?.ok)throw new Error(`${i} update failed: ${p?.status??"unknown"} ${p?.statusText??""}`.trim());const g=await p.json(),h=getReflexes(s);e.apply(g,h);const b=getInstalledPackage(s,i)??e;return t.forEach(e=>applyPreservedGroup(b,e,h)),enableShippedGroups(b,o),g}catch(p){return reportUpdateError({adapter:e,consoleObj:a,message:"AbortError"===p?.name?`${i} update timed out. Check your connection.`:`${i} update error: ${p?.message??String(p)}`,nexusClient:s}),null}finally{null!==m&&t(m)}},createPublicControlApi=({runtime:e,getModels:t})=>{const applySettings=(a={})=>(t().systemModel.setSettings(a,{setBaseline:!0}),e.savePersistence());return{pause:()=>e.setPaused(!0),unpause:()=>e.setPaused(!1),pauseToggle:()=>e.setPaused(!e.paused),setSlowMode:t=>e.setSlowMode(t),slowOn:()=>e.setSlowMode(!0),slowOff:()=>e.setSlowMode(!1),applySettings,setDebug:e=>applySettings({debug:Boolean(e)}),debugOn:()=>applySettings({debug:!0}),debugOff:()=>applySettings({debug:!1}),debug:()=>({runtime:e.snapshot(),internals:e.debugInfo?.()??null}),start:e.start,stop:e.stop,updateNxs:(t={})=>updateNxs({adapter:e.adapter,...t})}},resolveAudienceFor=(e,t)=>{const a=String(e||"").trim();if(!a)return null;if(Object.prototype.hasOwnProperty.call(t,a))return t[a].audience;const n=a.lastIndexOf(".");return n<0?null:t[a.slice(0,n)]?.scopedAudience??null},isPublicAudience=e=>e===vt.JS||e===vt.EVENTSTREAM,defaultIsDevMode=()=>{try{const e=globalThis.process?.env?.NODE_ENV;return!!e&&"production"!==e}catch{return!1}},defaultWarn=e=>{console.warn(e)},createPublicEventApi=({runtime:e,registry:t=Et,isDevMode:a=defaultIsDevMode,warn:n=defaultWarn})=>{const s={on(s,i){const o=String(s||"").trim();return o&&"function"==typeof i?isPublicAudience(resolveAudienceFor(o,t))?e.onEvent(o,i):(a()&&n(`[nexSys4] topic "${o}" is not a public topic`),()=>{}):()=>{}},off(t,a){const n=String(t||"").trim();return!!n&&e.offEvent(n,a)}};return{events:s,on:s.on,off:s.off}},createPublicMutationApi=({runtime:e,getModels:t})=>{const a=e.services.combat,normalizeServersidePriority=e=>{const t=Number(e);return Number.isFinite(t)?t<0?0:t>26?26:t:0},samePriorityMaps=(e={},t={})=>{const a=new Set([...Object.keys(e||{}),...Object.keys(t||{})]);for(const n of a)if(normalizeServersidePriority(e?.[n])!==normalizeServersidePriority(t?.[n]))return!1;return!0},resetPriorities=(e=[],t,a="public-api")=>{let n=!1;return e.forEach(e=>{t(e,a)&&(n=!0)}),n},buildAffPriorityTarget=e=>{const t=e.list().reduce((t,a)=>(t[a]=normalizeServersidePriority(e.getPriority?.(a)),t),{});return e.getCountablePriorityNames?.().forEach(e=>{t[e]=0}),t},buildDefPriorityTarget=(e,t)=>{const a=t.snapshot?.().char?.class||"";return e.list().reduce((t,n)=>{const s=e.get(n);return!s?.serverside||s.static?t:"function"!=typeof e.isAvailableForClass||e.isAvailableForClass(n,a)?(t[n]=normalizeServersidePriority(e.getPriority?.(n)),t):t},{})},restorePersistedPriorities=({restoreAffs:a=!1,restoreDefs:n=!1,reason:s})=>{const{affModel:i,defModel:o,systemModel:l}=t();let c=!1;a&&(c=resetPriorities(i.list(),(e,t)=>i.resetPriority(e,t))||c),n&&(c=resetPriorities(o.list(),(e,t)=>o.resetPriority(e,t))||c);const u=e.serverside.snapshot?.(),d=a?buildAffPriorityTarget(i):null,m=n?buildDefPriorityTarget(o,l):null,p=Boolean(u&&(a&&!samePriorityMaps(u.sessionBaseline?.affPriorities,d)||n&&!samePriorityMaps(u.sessionBaseline?.defPriorities,m)));return!(!c&&!p)&&(refreshServersideBaseline(),e.markDirty(s),!0)},refreshServersideBaseline=()=>{e.serverside.setBaselineFromRuntime?.()},applyMutation=(t,a)=>!!t&&(refreshServersideBaseline(),e.markDirty(a),!0),applyDirtyOnly=(t,a)=>!!t&&(e.markDirty(a),!0);return{updateAffPriority:(e,a)=>applyMutation(t().affModel.setPriority(e,a,"public-api"),"api-aff-priority"),updateAffDefault:(e,a)=>applyMutation(t().affModel.setDefaultPriority(e,a,"public-api"),"api-aff-default"),resetAffPriority:e=>applyMutation(t().affModel.resetPriority(e,"public-api"),"api-aff-priority-reset"),resetAllAffPriorities:()=>restorePersistedPriorities({restoreAffs:!0,reason:"api-aff-priority-reset-all"}),updateDefPriority:(e,a)=>applyMutation(t().defModel.setPriority(e,a,"public-api"),"api-def-priority"),updateDefDefault:(e,a)=>applyMutation(t().defModel.setDefaultPriority(e,a,"public-api"),"api-def-default"),updateDefStatic:(e,a)=>applyMutation(t().defModel.setStatic(e,a,"public-api"),"api-def-static"),updateDefCommand:(e,a)=>applyMutation(t().defModel.setCommand(e,a,"public-api"),"api-def-command"),resetDefPriority:e=>applyMutation(t().defModel.resetPriority(e,"public-api"),"api-def-priority-reset"),resetAllDefPriorities:()=>restorePersistedPriorities({restoreDefs:!0,reason:"api-def-priority-reset-all"}),resetAllPriorities:()=>restorePersistedPriorities({restoreAffs:!0,restoreDefs:!0,reason:"api-priority-reset-all"}),defup(){const a=t().defModel,n={};let s=!1;for(const e of a.list()){const t=a.get(e);if(!t||t.have)continue;a.resetPriority(e,"defup")&&(s=!0);const i=a.get(e),o=normalizeServersidePriority(a.getPriority(e));i?.static&&o>=1&&o<=25&&(n[e]=o)}const i=e.serverside.requestStaticDefPriorities?.(n)??!1;return(s||i)&&(refreshServersideBaseline(),e.markDirty("api-defup")),s||i},defoff(){const a=t().defModel;let n=!1;for(const e of a.list()){const t=a.get(e);t&&!t.have&&(a.setPriority(e,0,"defoff")&&(n=!0))}const s=e.serverside.clearStaticDefPriorities?.()??!1;return(n||s)&&(refreshServersideBaseline(),e.markDirty("api-defoff")),n||s},setPrecache:(a={})=>(t().cacheModel.setDesiredPrecache(a),e.markDirty("api-precache"),e.savePersistence()),prioAff:t=>applyDirtyOnly(e.serverside.setPrioAff(t),"api-prioaff"),clearPrioAff:()=>applyDirtyOnly(e.serverside.clearPrioAff(),"api-prioaff-clear"),parry(t){a.parry(t),refreshServersideBaseline(),e.markDirty("api-parry")}}},Rt="public-observe",freezeHandles=(e=[],t)=>Object.freeze(e.reduce((e,a)=>(e[a]=Object.freeze(t(a)),e),{})),getObserveSource=(e={})=>String(e?.source||Rt),getObserveAt=(e={})=>e?.atMs??e?.at,getAffSnapshotState=(e,t)=>({have:e.haveAff(t),count:e.get(t)?.count??0}),didAffStateChange=(e,t)=>e.have!==t.have||e.count!==t.count,createPublicObserveApi=({runtime:e,getModels:t})=>{const a=t(),n=a.affModel,s=a.defModel,i=a.balanceModel,o=a.limbModel,l=a.systemModel,c=e.services.combat,u=freezeHandles(n.list?.()||[],t=>({got(a={}){const s=getAffSnapshotState(n,t);return n.got(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&("function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"affliction"):o?.applyAfflictionTransition?.(t,!0),e.markDirty(`api-observe-aff-got:${t}`),!0)},lost(a={}){const s=getAffSnapshotState(n,t);return n.lose(t,{...a,source:getObserveSource(a)}),!!didAffStateChange(s,getAffSnapshotState(n,t))&&("function"==typeof o?.syncFromAfflictions&&"function"==typeof n?.currentSorted?o.syncFromAfflictions(n.currentSorted(),"affliction"):o?.applyAfflictionTransition?.(t,!1),e.markDirty(`api-observe-aff-lost:${t}`),!0)}})),d=freezeHandles(s.list?.()||[],t=>({got:(a={})=>!!s.setHave(t,!0,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-got:${t}`),!0),lost:(a={})=>!!s.setHave(t,!1,getObserveSource(a),getObserveAt(a))&&(e.markDirty(`api-observe-def-lost:${t}`),!0)})),m=freezeHandles(i.list?.()||[],t=>{const observeServerUse=(a,n={})=>{const s=i.observeServerUse(t,a,{...n,source:getObserveSource({...n,source:n.source||"server-duration-observe"})});return s&&e.markDirty(`api-observe-balance-used:${t}`),s};return{got(a={}){const n=i.gain(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-got:${t}`),n},lost(a={}){const n=i.lose(t,getObserveSource(a),getObserveAt(a));return n&&e.markDirty(`api-observe-balance-lost:${t}`),n},used:observeServerUse,serverUsed:observeServerUse,observeServerUse}}),createObservedLimbHit=(e,t={},a)=>c.observeLimbHit({limb:e,amount:a,source:getObserveSource(t),at:getObserveAt(t)}),createObservedLimbReset=(e,t={})=>c.observeLimbReset({limb:e,source:getObserveSource(t),at:getObserveAt(t)}),createObservedLimbStage=(e,t,a={})=>c.observeLimbStage({limb:e,stage:t,source:getObserveSource(a),at:getObserveAt(a)}),p=freezeHandles(o?.list?.()||[],t=>({hit(a,n={}){const s=createObservedLimbHit(t,n,a);return s.changed&&"torso"===s.limb&&s.stageChanged&&e.markDirty(`api-observe-limb-torso:${s.after?.stage||"unknown"}`),s.changed},reset(a={}){const n=createObservedLimbReset(t,a);return n.changed&&"torso"===n.limb&&e.markDirty("api-observe-limb-torso:healthy"),n.changed},setStage(a,n={}){const s=createObservedLimbStage(t,a,n);return s.changed&&"torso"===s.limb&&s.stageChanged&&e.markDirty(`api-observe-limb-torso:${s.after?.stage||"unknown"}`),s.changed}})),markObservedLimbResult=t=>(t.changed&&"torso"===t.limb&&t.stageChanged?e.markDirty(`api-observe-limb-torso:${t.after?.stage||"unknown"}`):t.changed&&"torso"===t.limb&&"healthy"===t.after?.stage?e.markDirty("api-observe-limb-torso:healthy"):t.changed&&e.markDirty(`api-observe-limb:${t.limb}`),t.changed),g=Object.freeze({...p,get(e){if(!e)return null;const t=o?.get?.(e);return t?.id&&p[t.id]||null},list:()=>Object.keys(p),hit:(e,t,a={})=>markObservedLimbResult(createObservedLimbHit(e,a,t)),reset:(e,t={})=>markObservedLimbResult(createObservedLimbReset(e,t)),setStage:(e,t,a={})=>markObservedLimbResult(createObservedLimbStage(e,t,a))}),h=Object.freeze({set(t={}){const a=l.updateMount({name:String(t.name||""),id:t.id??null});return a&&e.markDirty("api-observe-mount-set"),a},clear(){const t=l.updateMount(null);return t&&e.markDirty("api-observe-mount-clear"),t}});return{observe:Object.freeze({affs:u,defs:d,balances:m,limbs:g,mount:h})}},createPublicPromptApi=({runtime:e,control:t})=>{const a=e?.promptPresenter;if(!a)return{prompt:null};const getSystemModel=()=>e?.models?.systemModel;let n=null;return n={colorGradation:a.colorGradation,colorPercentage:a.colorPercentage,render:e=>a.render(e),getCustomPrompt:()=>a.render({source:"legacy-getCustomPrompt"}),markAffsDirty:()=>a.markAffsDirty(),markPromptDirty:()=>a.markPromptDirty?.(),patchVars:(e={})=>(a.patchVars?.(e),n),patchAffs:(e={})=>(a.patchAffs?.(e),n),patchCureColors:(e={})=>(a.patchCureColors?.(e),n),applyPreset:e=>"function"==typeof e?(e(n),a.markPromptDirty?.(),n):(!e||"object"!=typeof e||Array.isArray(e)||("cureColors"in e&&n.patchCureColors(e.cureColors),"affs"in e&&n.patchAffs(e.affs),"vars"in e&&n.patchVars(e.vars),"compose"in e&&(n.compose=e.compose),"enabled"in e&&(n.enabled=e.enabled)),n),get vars(){return a.vars},get affs(){return a.affs},get cureColors(){return a.cureColors},get compose(){return a.compose},set compose(e){a.compose=e},get enabled(){const e=getSystemModel()?.snapshot?.().settings||{};return Boolean(e.customPrompt)},set enabled(e){t?.applySettings?.({customPrompt:Boolean(e)})}},{prompt:n}},createPublicLineApi=({lineUtils:e={}})=>({replace:e.replace,replaceHTML:e.replaceHTML,replaceWord:e.replaceWord,replaceWordHTML:e.replaceWordHTML,nextLine:e.nextLine,checkLine:e.checkLine,prevLine:e.prevLine,prependNotice:e.prependNotice,say:e.say}),normalizeScopedSegment=e=>String(e||"").trim().toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9._-]/g,""),createPublicRulesApi=({runtime:e})=>({add:(t,a)=>e.serverside.lifecycle.add(t,a),remove:t=>e.serverside.lifecycle.remove(t),enable:t=>e.serverside.lifecycle.enable(t),disable:t=>e.serverside.lifecycle.disable(t),enablePack:t=>e.serverside.lifecycle.enablePack(t),disablePack:t=>e.serverside.lifecycle.disablePack(t),load:(t,a)=>e.serverside.lifecycle.load(t,a),unload:t=>e.serverside.lifecycle.unload(t),reorder:t=>e.serverside.lifecycle.reorder(t),list:()=>e.serverside.lifecycle.list(),bindTransition(t,a={}){const n=normalizeScopedSegment(t);if(!n)return()=>{};const s=e.topics||{},i=[];return"function"==typeof a.onActivate&&i.push(e.onEvent(`${s.RULE_ACTIVATED||"nexsys4.rule.activated"}.${n}`,a.onActivate)),"function"==typeof a.onDeactivate&&i.push(e.onEvent(`${s.RULE_DEACTIVATED||"nexsys4.rule.deactivated"}.${n}`,a.onDeactivate)),()=>{i.forEach(e=>e?.())}}}),createPublicServersideApi=({runtime:e})=>({predictions:{add:t=>e.serverside.addPrediction(t),remove:t=>e.serverside.removePrediction(t)},ssQueue:{add:t=>e.serverside.manualQueueAdd(t),insert:(t,a)=>e.serverside.manualQueueInsert(t,a),remove:t=>e.serverside.manualQueueRemove(t),reset:()=>e.serverside.manualQueueReset()},ss:{syncSnapshots:()=>e.serverside.requestSnapshotSync(),startupStatus:()=>e.serverside.getStartupStatus(),unload:(t={})=>e.curingSetGuard.unload(t)}}),createPublicStateApi=({runtime:e,getModels:t})=>{const{systemModel:a,affModel:n,defModel:s,balanceModel:i,limbModel:o}=t();return{snapshot:e.snapshot,getTarget:()=>a.snapshot().target,topics:e.topics,haveAff:e=>n.haveAff(e),affElapsedMs:e=>n.elapsedMs(e),affElapsedSeconds:e=>n.elapsedSeconds(e),affRemainingMs:e=>n.remainingMs(e),affRemainingSeconds:e=>n.remainingSeconds(e),affTiming:e=>n.timing(e),haveAffs:e=>n.haveAffs(toArray(e)),haveAnAff:e=>n.haveAnAff(toArray(e)),haveDef:e=>s.haveDef(e),haveDefs:e=>toArray(e).every(e=>s.haveDef(e)),haveAnyDef:e=>toArray(e).some(e=>s.haveDef(e)),haveBal:e=>i.have(e),haveBals:e=>toArray(e).every(e=>i.have(e)),haveAnyBal:e=>toArray(e).some(e=>i.have(e)),balElapsedMs:e=>i.elapsedMs(e),balElapsedSeconds:e=>i.elapsedSeconds(e),balRemainingMs:e=>i.remainingMs(e),balRemainingSeconds:e=>i.remainingSeconds(e),balTiming:e=>i.timing(e),getLimb:e=>o?.get?.(e)||null,listLimbs:()=>o?.list?.()||[],getClass:()=>a.getClass(),checkClass:e=>a.checkClass(e),isClass:e=>a.isClass(e),isTarget:e=>a.isTarget(e)}},isRecord=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),cloneAndFreezeCells=(e={})=>{const t={};for(const[a,n]of Object.entries(e))t[a]=isRecord(n)?Object.freeze({...n}):n;return Object.freeze(t)},buildPromptSnapshot=e=>e?Object.freeze({vars:cloneAndFreezeCells(e.vars),affs:cloneAndFreezeCells(e.affs),cureColors:cloneAndFreezeCells(e.cureColors)}):null,createPublicApi=({runtime:e,lineUtils:t={}})=>{const getModels=()=>e.models,a=createPublicStateApi({runtime:e,getModels}),n=createPublicEventApi({runtime:e}),s=createPublicControlApi({runtime:e,getModels}),i=createPublicCommandApi({runtime:e}),o=createPublicMutationApi({runtime:e,getModels}),l=createPublicObserveApi({runtime:e,getModels}),c=createPublicRulesApi({runtime:e}),u=createPublicServersideApi({runtime:e}),d=createPublicPromptApi({runtime:e,control:s}),m=createPublicLineApi({lineUtils:t}),{systemModel:p,affModel:g,defModel:h,balanceModel:b,limbModel:y,cacheModel:v}=getModels(),S=Object.freeze(Object.create(null,{system:{enumerable:!0,get:()=>p.snapshot()},target:{enumerable:!0,get:()=>p.snapshot().target},class:{enumerable:!0,get:()=>p.snapshot().char.class},affs:{enumerable:!0,get:()=>g.snapshot()},defs:{enumerable:!0,get:()=>h.snapshot()},balances:{enumerable:!0,get:()=>b.snapshot()},limbs:{enumerable:!0,get:()=>y.snapshot()},queue:{enumerable:!0,get:()=>e.queueController.snapshot()},cache:{enumerable:!0,get:()=>v.snapshot()},prompt:{enumerable:!0,get:()=>buildPromptSnapshot(e.promptPresenter)},serverside:{enumerable:!0,get:()=>e.serverside.snapshot()}})),x=Object.freeze({on:n.events.on,off:n.events.off,topics:e.topics}),C=Object.freeze({affs:l.observe.affs,defs:l.observe.defs,balances:l.observe.balances,limbs:l.observe.limbs,mount:Object.freeze({set:l.observe.mount.set,reset:l.observe.mount.clear})}),k=Object.freeze({openConfig:(t="api.ui.openConfig")=>e.setConfigOpen(!0,t),closeConfig:(t="api.ui.closeConfig")=>e.setConfigOpen(!1,t),setConfigOpen:(t,a="api.ui.setConfigOpen")=>e.setConfigOpen(Boolean(t),a)}),A={...i.queue,...i.queues,list:i.queue.listQueues};return{state:S,api:{affs:{have:a.haveAff,haveAll:a.haveAffs,haveAny:a.haveAnAff,elapsedMs:a.affElapsedMs,elapsedSeconds:a.affElapsedSeconds,remainingMs:a.affRemainingMs,remainingSeconds:a.affRemainingSeconds,timing:a.affTiming,setPriority:o.updateAffPriority,setDefaultPriority:o.updateAffDefault,resetPriority:o.resetAffPriority,resetAllPriorities:o.resetAllAffPriorities},defs:{have:a.haveDef,haveAll:a.haveDefs,haveAny:a.haveAnyDef,setPriority:o.updateDefPriority,setDefaultPriority:o.updateDefDefault,setStatic:o.updateDefStatic,setCommand:o.updateDefCommand,resetPriority:o.resetDefPriority,resetAllPriorities:o.resetAllDefPriorities,defup:o.defup,defoff:o.defoff,parry:o.parry},balances:{have:a.haveBal,haveAll:a.haveBals,haveAny:a.haveAnyBal,elapsedMs:a.balElapsedMs,elapsedSeconds:a.balElapsedSeconds,remainingMs:a.balRemainingMs,remainingSeconds:a.balRemainingSeconds,timing:a.balTiming},limbs:{get:a.getLimb,list:a.listLimbs},target:{get:a.getTarget,set:i.setTarget,is:a.isTarget},class:{get:a.getClass,is:a.isClass,check:a.checkClass},command:{send:i.sendCmd,sendInline:i.sendInline,addOutput:i.addOutput,evaluateNow:i.evaluateNow},queue:A,rules:c,prompt:d.prompt,observe:C,ui:k,line:m,control:{...s},ss:{predictions:u.predictions,queue:{add:u.ssQueue.add,insert:u.ssQueue.insert,remove:u.ssQueue.remove,clear:u.ssQueue.reset},syncSnapshots:u.ss.syncSnapshots,startupStatus:u.ss.startupStatus,unload:u.ss.unload,precache:{set:o.setPrecache},prioAff:{set:o.prioAff,reset:o.clearPrioAff}}},events:x}},generateChunk=(e,t,a)=>{const n=document.createElement("span");return n.style.color=t,n.style.backgroundColor=a,n.textContent=e,n},cloneTrustedHtmlNodes=e=>{const t=document.createElement("template");return t.innerHTML=String(e??""),[...t.content.childNodes].map(e=>e.cloneNode(!0))},replaceWordNodes=(e,t,a)=>{const n=String(t??"");if(!n)return!1;const s=document.createTreeWalker(e,globalThis.NodeFilter?.SHOW_TEXT??4),i=[];for(;s.nextNode();)i.push(s.currentNode);let o=!1;return i.forEach(e=>{const t=e?.textContent||"";if(!e?.parentNode||!t.includes(n))return;const s=document.createDocumentFragment();let i=0;for(;i<t.length;){const e=t.indexOf(n,i);if(-1===e){s.append(t.slice(i));break}e>i&&s.append(t.slice(i,e)),a().forEach(e=>s.appendChild(e)),i=e+n.length,o=!0}e.replaceWith(s)}),o},updateCurrentFormattedLine=e=>{const t=document.createElement("span");t.innerHTML=globalThis.nexusclient.current_line.parsed_line.formatted();const a=e(t);return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.innerHTML,a},replace$1=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexusclient.current_line.parsed_line.formatted=()=>t.outerHTML,!0},replaceHTML=e=>(globalThis.nexusclient.current_line.parsed_line.formatted=()=>e,!0),replaceWord=(e,t,a,n)=>updateCurrentFormattedLine(s=>replaceWordNodes(s,e,()=>[generateChunk(t,a,n)])),replaceWordHTML=(e,t)=>updateCurrentFormattedLine(a=>replaceWordNodes(a,e,()=>cloneTrustedHtmlNodes(t))),matchPattern=(e,t)=>"string"==typeof t?e.includes(t):t instanceof RegExp&&t.test(e),prevLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n<=0)&&matchPattern(t[n-1].parsed_line.text(),e)},nextLine=e=>{const{current_block:t,current_line:a}=globalThis.nexusclient,n=t.indexOf(a);return!(n>=t.length-1)&&matchPattern(t[n+1].parsed_line.text(),e)},checkLine=(e,t)=>{const{current_block:a,current_line:n}=globalThis.nexusclient,s=a.indexOf(n)+t;return!(s<0||s>a.length-1)&&matchPattern(a[s].parsed_line.text(),e)},prependNotice=(...e)=>{const t=document.createElement("span");for(let a=0;a<e.length;a+=3)t.appendChild(generateChunk(e[a],e[a+1],e[a+2]));return globalThis.nexSys.prepend_line={timestamp:globalThis.nexusclient.current_block[1].timestamp,timestamp_ms:globalThis.nexusclient.current_block[1].timestamp_ms,parsed_line:{text:()=>t.outerHTML,formatted:()=>t.outerHTML}},t.outerHTML},say=e=>{const t=new SpeechSynthesisUtterance;t.voice=globalThis.speechSynthesis.getVoices().find(e=>"Google UK English Female"===e.voiceURI)||globalThis.speechSynthesis.getVoices().find(e=>"en-US"===e.lang),t.rate=1.1,t.pitch=1.3,t.text=e,globalThis.speechSynthesis.speaking&&globalThis.speechSynthesis.cancel(),setTimeout(()=>globalThis.speechSynthesis.speak(t),10)},Ot={affTable:Y,balanceTable:Q,cacheTable:D,cacheNames:{herb_name_to_herb:T,mineral_to_herb:P,herb_to_mineral:M,herb_names:_,herb_names_group:w,mineral_names:A,mineral_names_group:E},cureTable:X,defTable:ee,defPrios:te},Nt=Object.freeze({affCount:Array.isArray(Y?.list)?Y.list.length:0,cureCount:Object.keys(X||{}).length,defCount:Object.keys(ee||{}).length,balanceCount:Object.keys(Q||{}).length,cacheCount:Object.keys(D||{}).length}),createNexSys=({adapter:e,adapterType:t="nexus",options:a={}}={})=>{installStringPrototypeHelpers();const n={...a.adapterOptions||{}};void 0===n.debug&&(n.debug=a.debug??!1),void 0===n.startupGag&&(n.startupGag=a.startupGag??!0);const s=assertAdapterContract(e||("mock"===t?createMockAdapter(n):createNexusAdapter(n))),i=createRuntimeEngine({adapter:s,seedData:Ot,options:a}),{state:o,api:l,events:c}=createPublicApi({runtime:i,lineUtils:{replace:replace$1,replaceHTML,replaceWord,replaceWordHTML,nextLine,checkLine,prependNotice,prevLine,say}});return{version:"1.2.3",seedMeta:Nt,tables:{limbs:Ee,dirs:_e,dirMap:we,oppdirs:Te,shortDirs:Pe,classList:Me},adapter:s,runtime:i,state:o,api:l,events:c}},clearGlobalNexSys=()=>{if("undefined"==typeof globalThis)return;const e=globalThis.nexSys,t=e?.api?.control?.stop;if(e&&"function"==typeof t)try{t()}catch(a){console.error("nexSys4 failed to stop the existing global runtime during reinstall",a)}try{delete globalThis.nexSys}catch{globalThis.nexSys=void 0}},installGlobalNexSys=(e={})=>{clearGlobalNexSys();const t=createNexSys(e);return globalThis.nexSys=t,t.api.control.start(),t},Lt=Object.freeze({coalesceGmcp:!0,publishToEventStream:!0,publishRawGmcp:!1,debug:!1,startupTimeoutMs:2500,maxStartupRetries:3,maxEntriesPerSubmission:20,pendingTimeoutMs:12e3,desyncCommandRepeats:3,maxSsCommandsPerCycle:40}),bootstrapNexus$1=(e={})=>{const{forceNew:t,...a}=e,n=Object.prototype.hasOwnProperty.call(a,"debug");return uninstallNexusClientOverrides(),installNexusClientOverrides(),installGlobalNexSys({adapterType:"nexus",options:{...Lt,...a,bootstrapDebugOverride:n?Boolean(a.debug):void 0}})},It=Symbol.for("nexsys4.startup.installed"),jt="font_stacks_original",getNexusclient=()=>globalThis.nexusclient&&"object"==typeof globalThis.nexusclient?globalThis.nexusclient:null,mountGui=e=>{if(!globalThis.ReactDOM||!globalThis.React)return!1;document.getElementById("modal-root")||document.body.appendChild(Object.assign(document.createElement("div"),{id:"modal-root"})),document.getElementById("nexsys-modal")?.remove();const t=Object.assign(document.createElement("div"),{id:"nexsys-modal"});return document.getElementById("modal-root").appendChild(t),globalThis.ReactDOM.createRoot(t).render(globalThis.React.createElement(e.component,{nexSys:e})),!0},injectFonts=()=>{const e=document.getElementsByTagName("head")[0],t=document.createElement("link");t.rel="stylesheet",t.href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap",e.appendChild(t);const a=document.createElement("link");a.rel="stylesheet",a.href="https://fonts.googleapis.com/css?family=Roboto%20Mono:300,400,500,700&display=swap",e.appendChild(a)},patchFontStacks=e=>{const t=e.settings();if(void 0!==t[jt])return;const a=document.getElementsByTagName("head")[0],n=document.getElementById("nexSysCSS")||document.createElement("style");n.id="nexSysCSS",n.parentNode||a.appendChild(n),t[jt]=t.font_stacks,t.font_stacks=function(){return n.textContent=`.timestamp {font-family: ${t.font_stack}}`,[{name:"RobotoMono",stack:"Roboto Mono,Consolas,monospace"},{name:"Consolas",stack:"Consolas,RobotoMono,monospace"},{name:"Verdana",stack:"Verdana, Geneva, sans-serif"},{name:"Lucida",stack:"'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Geneva, Verdana, sans-serif"},{name:"Arial",stack:"Arial, 'Helvetica Neue', Helvetica, sans-serif"},{name:"Futura",stack:"Futura, 'Trebuchet MS', Arial, sans-serif"},{name:"Book Antiqua",stack:"'Book Antiqua', Palatino, 'Palatino Linotype', 'Palatino LT STD', Georgia, serif"},...t[jt]()]}},initializeSettings=e=>{void 0===e.variables().vars.nexSys4Settings&&(e.variables().vars.nexSys4Settings={})},startupNexus=()=>{const e=getNexusclient();return!!e&&(e[It]||(injectFonts(),patchFontStacks(e),initializeSettings(e),e[It]=!0),mountGui(globalThis.nexSys),!0)},qt=(0,b.createContext)(null);function useNexSys(){return(0,b.useContext)(qt)}var Bt=__commonJSMin(e=>{var t=Symbol.for("react.transitional.element");Symbol.for("react.fragment");function jsxProd(e,a,n){var s=null;if(void 0!==n&&(s=""+n),void 0!==a.key&&(s=""+a.key),"key"in a)for(var i in n={},a)"key"!==i&&(n[i]=a[i]);else n=a;return a=n.ref,{$$typeof:t,type:e,key:s,ref:void 0!==a?a:null,props:n}}e.jsx=jsxProd,e.jsxs=jsxProd}),$t=__commonJSMin((e,t)=>{t.exports=Bt()})();function NexSysProvider({nexSys:e,children:t}){return(0,$t.jsx)(qt.Provider,{value:e,children:t})}var Ft={ink900:"#121310",ink800:"#191a16",ink700:"#20211b",ink600:"#26271f",textStrong:"#efe5ce",text:"#d4cbb6",textDim:"#a49b87",textFaint:"#7b7460",brassDeep:"#9a7433",brass:"#cba362",brassBright:"#e0c384",brassContrast:"#241a08",oxblood:"#c4776c",verdigris:"#7fa196"},zt="203, 163, 98",Gt={border:`rgba(${zt}, 0.18)`,borderStrong:`rgba(${zt}, 0.34)`,selectFill:`rgba(${zt}, 0.13)`,shadow:"rgba(0, 0, 0, 0.42)",dragShadow:"rgba(0, 0, 0, 0.55)"},Ht=(Ft.ink900,Ft.ink800,Ft.ink700,Ft.ink600,Ft.textStrong,Ft.text,Ft.textDim,Ft.textFaint,Ft.brass,Ft.brassBright,Ft.brassDeep,Ft.brassContrast,Ft.verdigris,Ft.oxblood,Gt.border,Gt.borderStrong,Ft.brass,Gt.selectFill,Gt.shadow,Gt.dragShadow,{radius:5}),Ut=(Ft.ink900,Ft.ink800,Ft.ink700,Ft.ink600,Ft.textStrong,Ft.text,Ft.textDim,Ft.textFaint,Ft.brassDeep,Ft.brass,Ft.brassBright,Ft.oxblood,Ft.verdigris,Gt.border,Gt.borderStrong,Gt.selectFill,Gt.shadow,'"Roboto Mono", ui-monospace, "Cascadia Code", "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", monospace'),Vt=(()=>(0,s.createTheme)({palette:{mode:"dark",primary:{main:Ft.brass,light:Ft.brassBright,dark:Ft.brassDeep,contrastText:Ft.brassContrast},secondary:{main:Ft.verdigris},error:{main:Ft.oxblood},success:{main:Ft.verdigris},info:{main:Ft.verdigris},warning:{main:Ft.brassBright},divider:Gt.border,background:{default:Ft.ink900,paper:Ft.ink700,deep:Ft.ink900,surface:Ft.ink800,panel:Ft.ink700,raised:Ft.ink600},text:{primary:Ft.textStrong,secondary:Ft.textDim,disabled:Ft.textFaint},border:{main:Gt.border,strong:Gt.borderStrong},select:{line:Ft.brass,fill:Gt.selectFill},action:{hover:Gt.selectFill,selected:Gt.selectFill}},shape:{borderRadius:Ht.radius},typography:{fontFamily:Ut,fontSize:13,button:{textTransform:"none",fontWeight:700},subtitle1:{fontWeight:700,letterSpacing:"0.01em"},subtitle2:{fontWeight:700,letterSpacing:"0.01em"},overline:{letterSpacing:"0.14em"}},components:{MuiTypography:{styleOverrides:{root:{fontFamily:Ut}}},MuiPaper:{styleOverrides:{root:{backgroundImage:"none"}}},MuiSwitch:{defaultProps:{size:"small"}},MuiSelect:{defaultProps:{size:"small"}},MuiTextField:{defaultProps:{size:"small"}},MuiPopover:{styleOverrides:{paper:{backgroundColor:Ft.ink600,backgroundImage:"none",border:`1px solid ${Gt.borderStrong}`}}},MuiTooltip:{styleOverrides:{tooltip:{backgroundColor:Ft.ink600,color:Ft.textStrong,border:`1px solid ${Gt.borderStrong}`,fontFamily:Ut,fontSize:"0.72rem"},arrow:{color:Ft.ink600}}},MuiLinearProgress:{styleOverrides:{determinate:{transition:"none",backgroundColor:Gt.selectFill},bar:{transition:"none",backgroundColor:Ft.brass}}},MuiDialog:{styleOverrides:{paper:({theme:e})=>({backgroundColor:e.palette.background.surface,backgroundImage:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius})}},MuiDialogTitle:{styleOverrides:{root:({theme:e})=>({"&&":{backgroundColor:e.palette.background.surface,color:e.palette.text.primary,borderBottom:`1px solid ${e.palette.divider}`}})}}}}))(),Yt=!1;function useDialogOpen(e){const[t,a]=(0,b.useState)(Yt);return(0,b.useEffect)(()=>e?.events?.on?.(se.UI_CONFIG_CHANGED,({open:e})=>{a(Boolean(e))})??void 0,[e]),[t,a]}var cloneSettings=(e={})=>(0,i.produce)(e,()=>{}),toFiniteNumber=(e,t=0)=>{const a=Number(e);return Number.isFinite(a)?a:t},toPriority=e=>toFiniteNumber(e,0),toConfigPriority=e=>Math.max(0,Math.min(26,toPriority(e))),toQuantity=e=>Math.max(0,toFiniteNumber(e,0)),isBlankInput=e=>""===e,toDraftConfigPriority=(e,t=0)=>{if(isBlankInput(e))return"";const a=Number(e);return Number.isFinite(a)?Math.max(0,Math.min(26,a)):t},normalizePriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a),e),{}),buildAffPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toPriority(a?.defaultPriority),e),{}),buildDefPriorityDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=toConfigPriority(a?.defaultPriority),e),{}),buildDefStaticDraft=(e={})=>Object.entries(e).reduce((e,[t,a])=>(e[t]=Boolean(a?.static),e),{}),buildPrecacheDraft=(e={})=>Object.entries(e?.desiredPrecache??{}).reduce((e,[t,a])=>(e[t]=toQuantity(a),e),{}),buildDraft=(e={})=>({settings:cloneSettings(e.system?.settings??{}),affPriorities:buildAffPriorityDraft(e.affs??{}),defPriorities:buildDefPriorityDraft(e.defs??{}),defStatics:buildDefStaticDraft(e.defs??{}),desiredPrecache:buildPrecacheDraft(e.cache??{})}),keysChangedFrom=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].filter(a=>e[a]!==t[a]);function useSettingsForm(e){const[t]=(0,b.useState)(()=>buildDraft(e?.runtime?.snapshot?.()??{})),[a,n]=(0,b.useState)(()=>t.settings),[s,o]=(0,b.useState)(()=>t.affPriorities),[l,c]=(0,b.useState)(()=>t.defPriorities),[u,d]=(0,b.useState)(()=>t.defStatics),[m,p]=(0,b.useState)(()=>t.desiredPrecache);return{pending:a,set:(0,b.useCallback)((e,t)=>{n(a=>a?(0,i.produce)(a,a=>{const n=e.split(".");let s=a;for(let e=0;e<n.length-1;e+=1)s[n[e]]&&"object"==typeof s[n[e]]||(s[n[e]]={}),s=s[n[e]];s[n[n.length-1]]=t}):a)},[]),affPriorities:s,setAffPriority:(0,b.useCallback)((e,t)=>{o(a=>({...a,[e]:toConfigPriority(t)}))},[]),defPriorities:l,setDefPriority:(0,b.useCallback)((e,t)=>{c(a=>{const n=a?.[e]??0;return{...a,[e]:toDraftConfigPriority(t,n)}})},[]),defStatics:u,setDefStatic:(0,b.useCallback)((e,t)=>{d(a=>({...a,[e]:Boolean(t)}))},[]),desiredPrecache:m,setPrecache:(0,b.useCallback)((e,t)=>{p(a=>({...a,[e]:toQuantity(t)}))},[]),commit:(0,b.useCallback)(()=>{if(!e)return;const n=t;keysChangedFrom(s,n.affPriorities).forEach(t=>{e.api?.affs?.setDefaultPriority?.(t,s[t])});const i=normalizePriorityDraft(l);keysChangedFrom(i,n.defPriorities).forEach(t=>{e.api?.defs?.setDefaultPriority?.(t,i[t])}),keysChangedFrom(u,n.defStatics).forEach(t=>{e.api?.defs?.setStatic?.(t,u[t])});const o=keysChangedFrom(m,n.desiredPrecache).reduce((e,t)=>(e[t]=m[t]??0,e),{});Object.keys(o).length&&e.api?.ss?.precache?.set?.(o),a&&e.api?.control?.applySettings?.(a)},[a,s,l,u,m,t,e])}}function LabelledSwitch({label:e,checked:t,onChange:a}){return(0,$t.jsx)(n.FormControlLabel,{control:(0,$t.jsx)(n.Switch,{checked:Boolean(t),onChange:e=>a(e.target.checked),size:"small"}),label:e,sx:{ml:0,mr:0,gap:.5,alignItems:"center",userSelect:"none","& .MuiSwitch-root":{mr:.5},"& .MuiFormControlLabel-label":{fontSize:11,lineHeight:1.25}}})}function ThresholdSlider({label:e,value:t,onChange:a,min:s=0,max:i=100,step:o=5,unit:l="%"}){return(0,$t.jsxs)(n.Box,{sx:{mb:1},children:[(0,$t.jsxs)(n.Typography,{variant:"body2",sx:{mb:.5,fontSize:11,lineHeight:1.3},children:[e,": ",t,l]}),(0,$t.jsx)(n.Slider,{value:t,min:s,max:i,step:o,onChange:(e,t)=>a(t),size:"small",sx:{color:"primary.main"}})]})}var Qt="50px",Wt={minWidth:95,height:25,px:1,fontSize:11,lineHeight:1};function SectionHeader({children:e}){return(0,$t.jsx)(n.Typography,{variant:"overline",sx:{display:"block",color:"primary.main",mt:2,mb:.5,fontWeight:700},children:e})}function SystemSettingsTab({pending:e,set:t}){return e?(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",columnGap:{xs:2,md:Qt},rowGap:2,pt:1},children:[(0,$t.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,$t.jsx)(SectionHeader,{children:"nexSys Config"}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,$t.jsx)(LabelledSwitch,{label:"Load on login",checked:!!e.loadOnLogin,onChange:e=>t("loadOnLogin",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Queue while paused",checked:e.queueWhilePaused,onChange:e=>t("queueWhilePaused",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Override Tab target",checked:e.overrideTab,onChange:e=>t("overrideTab",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Custom Prompt",checked:e.customPrompt,onChange:e=>t("customPrompt",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Debug output",checked:e.debug,onChange:e=>t("debug",e)})]}),(0,$t.jsx)(SectionHeader,{children:"Notices (Echo)"}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column"},children:[(0,$t.jsx)(LabelledSwitch,{label:"Affliction gained",checked:e.notices?.affGot,onChange:e=>t("notices.affGot",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Affliction lost",checked:e.notices?.affLost,onChange:e=>t("notices.affLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Defence gained",checked:e.notices?.defGot,onChange:e=>t("notices.defGot",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Defence lost",checked:e.notices?.defLost,onChange:e=>t("notices.defLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Balance lost",checked:e.notices?.balanceLost,onChange:e=>t("notices.balanceLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Balance recovered",checked:e.notices?.balanceRecovered,onChange:e=>t("notices.balanceRecovered",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Trackable gained",checked:e.notices?.trackableGot,onChange:e=>t("notices.trackableGot",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Trackable lost",checked:e.notices?.trackableLost,onChange:e=>t("notices.trackableLost",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Priority changes",checked:e.notices?.priority,onChange:e=>t("notices.priority",e)}),(0,$t.jsx)(LabelledSwitch,{label:"General output",checked:e.notices?.output,onChange:e=>t("notices.output",e)})]})]}),(0,$t.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:190},width:{xs:"100%",md:190},minWidth:0},children:[(0,$t.jsx)(SectionHeader,{children:"Curing Method"}),(0,$t.jsxs)(n.Box,{sx:{mb:1},children:[(0,$t.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Curing type"}),(0,$t.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.transmutation?"transmutation":"concoctions",onChange:(e,a)=>a&&t("ss.transmutation","transmutation"===a),sx:{"& .MuiToggleButton-root":Wt},children:[(0,$t.jsx)(n.ToggleButton,{value:"transmutation",children:"Transmutation"}),(0,$t.jsx)(n.ToggleButton,{value:"concoctions",children:"Concoctions"})]})]}),(0,$t.jsxs)(n.Box,{sx:{mb:1},children:[(0,$t.jsx)(n.Typography,{variant:"caption",sx:{display:"block",mb:.5,opacity:.7},children:"Sip priority"}),(0,$t.jsxs)(n.ToggleButtonGroup,{exclusive:!0,size:"small",value:e.ss?.sipPriority??"health",onChange:(e,a)=>a&&t("ss.sipPriority",a),sx:{"& .MuiToggleButton-root":Wt},children:[(0,$t.jsx)(n.ToggleButton,{value:"health",children:"Health"}),(0,$t.jsx)(n.ToggleButton,{value:"mana",children:"Mana"})]})]}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",flexDirection:"column",mt:1},children:[(0,$t.jsx)(LabelledSwitch,{label:"Batching",checked:e.ss?.batch,onChange:e=>t("ss.batch",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Tree Tattoo",checked:"on"===e.ss?.tree,onChange:e=>t("ss.tree",e?"on":"off")}),(0,$t.jsx)(LabelledSwitch,{label:"Focus",checked:e.ss?.focus,onChange:e=>t("ss.focus",e)}),e.ss?.focus&&(0,$t.jsx)(LabelledSwitch,{label:"Focus over Herbs",checked:e.ss?.focusOverHerbs,onChange:e=>t("ss.focusOverHerbs",e)}),(0,$t.jsx)(LabelledSwitch,{label:"Blood clotting",checked:e.ss?.clot,onChange:e=>t("ss.clot",e)}),e.ss?.clot&&(0,$t.jsx)(n.Box,{sx:{ml:1,mt:2,mb:.5},children:(0,$t.jsx)(n.TextField,{label:"Clot above",value:e.ss?.clotAt??"",onChange:e=>t("ss.clotAt",Number(e.target.value)||0),type:"number",size:"small",sx:{width:100,maxWidth:"100%"},slotProps:{htmlInput:{min:0}}})})]})]}),(0,$t.jsxs)(n.Box,{sx:{flexGrow:0,flexShrink:0,flexBasis:{xs:"100%",md:250},width:{xs:"100%",md:250},minWidth:0},children:[(0,$t.jsx)(SectionHeader,{children:"Thresholds"}),(0,$t.jsx)(ThresholdSlider,{label:"Sip health at",value:e.ss?.sipHealthAt??0,onChange:e=>t("ss.sipHealthAt",e)}),(0,$t.jsx)(ThresholdSlider,{label:"Sip mana at",value:e.ss?.sipManaAt??0,onChange:e=>t("ss.sipManaAt",e)}),(0,$t.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,$t.jsx)(ThresholdSlider,{label:"Moss health at",value:e.ss?.mossHealthAt??0,onChange:e=>t("ss.mossHealthAt",e)}),(0,$t.jsx)(ThresholdSlider,{label:"Moss mana at",value:e.ss?.mossManaAt??0,onChange:e=>t("ss.mossManaAt",e)}),(0,$t.jsx)(n.Divider,{sx:{my:1,opacity:.3}}),(0,$t.jsx)(ThresholdSlider,{label:"Cure fractures above",value:e.ss?.fracturesAbove??0,onChange:e=>t("ss.fracturesAbove",e)}),(0,$t.jsx)(ThresholdSlider,{label:"Use mana abilities above",value:e.ss?.manaThreshold??0,onChange:e=>t("ss.manaThreshold",e)})]})]}):null}function useNexSysSnapshot(e){return(0,b.useSyncExternalStore)((0,b.useCallback)(t=>{const a=e.events.topics,n=[a.SYSTEM_SETTINGS_CHANGED,a.SYSTEM_STATUS_CHANGED,a.SYSTEM_CLASS_CHANGED,a.AFF_PRIORITY_CHANGED,a.DEF_PRIORITY_CHANGED,a.CACHE_PRECACHE_CHANGED,a.SYSTEM_RUNTIME_CHANGED];return n.forEach(a=>e.events.on(a,t)),()=>n.forEach(a=>e.events.off(a,t))},[e]),e.runtime.snapshot,e.runtime.snapshot)}var Kt=Object.freeze({}),Xt=new Set(Object.keys(Y?.types?.nonServerside??{}));function buildColumns(e,t={}){return(0,i.produce)({},a=>{for(let e=0;e<=25;e++)a[`col-${e}`]={id:`col-${e}`,label:0===e?"Ignored 26":`Prio ${e}`,priority:e,affs:[]};for(const[n,s]of Object.entries(e)){if(Xt.has(n))continue;const e=Number(t[n]??s.defaultPriority??0);!Number.isFinite(e)||e>26||a[`col-${Math.max(0,Math.min(25,26===e?0:e))}`].affs.push(n)}})}function findContainer(e,t){return t[e]?e:Object.keys(t).find(a=>t[a].affs.includes(e))??null}function useAffPriorities(e,t={}){const[a,n]=(0,b.useState)(null),[s,c]=(0,b.useState)(null),u=(0,b.useRef)(null),d=useNexSysSnapshot(e)?.affs??Kt,{affPriorities:m=Kt,setAffPriority:p}=t,g=(0,b.useMemo)(()=>buildColumns(d,m),[d,m]);return{columns:s??g,activeId:a,sensors:(0,o.useSensors)((0,o.useSensor)(o.PointerSensor,{activationConstraint:{distance:4}}),(0,o.useSensor)(o.KeyboardSensor,{coordinateGetter:l.sortableKeyboardCoordinates})),onDragStart:(0,b.useCallback)(({active:e})=>{n(String(e.id));const t=(0,i.produce)(g,()=>{});u.current=t,c(t)},[g]),onDragOver:(0,b.useCallback)(({active:e,over:t})=>{if(!t)return;const a=String(e.id),n=String(t.id),s=u.current;if(!s)return;const o=findContainer(a,s),d=findContainer(n,s);if(!o||!d)return;let m;if(o===d){const e=s[o].affs,t=e.indexOf(a),c=e.indexOf(n);if(-1===t||-1===c||t===c)return;m=(0,i.produce)(s,a=>{a[o].affs=(0,l.arrayMove)(e,t,c)})}else m=(0,i.produce)(s,e=>{const t=e[o].affs,s=e[d].affs;if(-1===t.indexOf(a))return;const i=s.indexOf(n),l=-1===i?s.length:i;e[o].affs=t.filter(e=>e!==a),e[d].affs=[...s.slice(0,l),a,...s.slice(l)]});u.current=m,c(m)},[]),onDragEnd:(0,b.useCallback)(({active:e,over:t})=>{n(null);const a=u.current;if(u.current=null,c(null),!t||!a)return;const s=String(e.id),i=findContainer(s,a);if(!i)return;const o=a[i]?.priority??0;o!==(g[findContainer(s,g)]?.priority??0)&&p?.(s,o)},[g,p]),onDragCancel:(0,b.useCallback)(()=>{n(null),u.current=null,c(null)},[])}}var Jt={antimony:"olive",argentum:"royalblue",aurum:"ForestGreen",calcite:"slategray",cinnabar:"greenyellow",cuprum:"DeepSkyBlue",ferrum:"DarkOrange",magnesium:"Red",plumbum:"Gold",realgar:"firebrick",stannum:"Tan",caloric:"darkseagreen",mending:"orchid",epidermal:"sienna",restoration:"darkviolet",health:"lightpink",writhe:"PaleGoldenRod"},Zt={ginseng:"ferrum",bloodroot:"magnesium",kelp:"aurum",hawthorn:"calamine",lobelia:"argentum",bellwort:"cuprum",ginger:"antimony",bayberry:"arsenic",ash:"stannum",goldenseal:"plumbum",pear:"calcite",elm:"cinnabar",valerian:"realgar",skullcap:"azurite",moss:"potash",kola:"quartz",sileris:"quicksilver",cohosh:"gypsum"};function resolveCureColor(e){if(e in Jt)return Jt[e]??null;const t=Zt[e];if(t)return Jt[t]??null;const a=e.match(/^(caloric|mending|epidermal|restoration|health)\b/);return a?Jt[a[1]]??null:null}var er=["bound","daeggerimpale","entangled","impaled","transfixation","webbed","icebound"],tr={};for(const[On,Nn]of Object.entries(J))for(const e of Nn){const t=resolveCureColor(e);if(t){tr[On]=t;break}}for(const On of er)tr[On]||(tr[On]=Jt.writhe);function getAffColor(e){return tr[e]??null}function AffChip({name:e,isDragging:t=!1}){const a=getAffColor(e);return(0,$t.jsx)(n.Chip,{label:e,size:"small",sx:{fontSize:13,height:22,mb:.25,padding:.5,opacity:t?.4:1,cursor:"grab",bgcolor:"background.deep",color:a??"text.secondary",border:"1px solid",borderColor:a??"divider","& .MuiChip-label":{px:.75},"&:active":{cursor:"grabbing"}}})}function SortableAffChip({name:e}){const{attributes:t,listeners:a,setNodeRef:s,transform:i,transition:o,isDragging:u}=(0,l.useSortable)({id:e});return(0,$t.jsx)(n.Box,{ref:s,...t,...a,sx:{transform:c.CSS.Transform.toString(i),transition:o,touchAction:"none"},children:(0,$t.jsx)(AffChip,{name:e,isDragging:u})})}function PriorityColumn({column:e}){const t=0===e.priority,{setNodeRef:a}=(0,o.useDroppable)({id:e.id});return(0,$t.jsxs)(n.Box,{sx:{minWidth:125,maxWidth:125,border:"1px solid",borderColor:t?"divider":"border.strong",borderRadius:1,p:.5,bgcolor:t?"background.deep":"select.fill",flexShrink:0},children:[(0,$t.jsx)(n.Typography,{variant:"caption",sx:{display:"block",textAlign:"center",fontWeight:700,color:t?"text.secondary":"primary.main",mb:.5,fontSize:13},children:e.label}),(0,$t.jsx)(l.SortableContext,{items:e.affs,strategy:l.verticalListSortingStrategy,children:(0,$t.jsx)(n.Box,{ref:a,sx:{minHeight:28,display:"flex",flexDirection:"column"},children:e.affs.map(e=>(0,$t.jsx)(SortableAffChip,{name:e},e))})})]})}function AffPrioritiesTab({settingsForm:e}){const{columns:t,activeId:a,sensors:s,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u}=useAffPriorities(useNexSys(),e);return(0,$t.jsx)(n.Box,{sx:{py:1},children:(0,$t.jsx)(n.Box,{sx:{display:"inline-flex",gap:.75,alignItems:"flex-start"},children:(0,$t.jsxs)(o.DndContext,{sensors:s,collisionDetection:o.closestCorners,onDragStart:i,onDragOver:l,onDragEnd:c,onDragCancel:u,children:[Object.keys(t).map(e=>(0,$t.jsx)(PriorityColumn,{column:t[e]},e)),(0,$t.jsx)(o.DragOverlay,{children:a?(0,$t.jsx)(AffChip,{name:a}):null})]})})})}function r(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(a=r(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function clsx(){for(var e,t,a=0,n="",s=arguments.length;a<s;a++)(e=arguments[a])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}function composeClasses(e,t,a=void 0){const n={};for(const s in e){const i=e[s];let o="",l=!0;for(let e=0;e<i.length;e+=1){const n=i[e];n&&(o+=(!0===l?"":" ")+t(n),l=!1,a&&a[n]&&(o+=" "+a[n]))}n[s]=o}return n}function formatMuiErrorMessage(e,...t){const a=new URL(`https://mui.com/production-error/?code=${e}`);return t.forEach(e=>a.searchParams.append("args[]",e)),`Minified MUI error #${e}; visit ${a} for the full message.`}function capitalize$1(e){if("string"!=typeof e)throw new Error(formatMuiErrorMessage(7));return e.charAt(0).toUpperCase()+e.slice(1)}var rr=capitalize$1;function fastDeepAssign(e,t){const a=Array.isArray(t),n=Array.isArray(e);return isPrimitive(t)?t:isPrimitiveOrBuiltIn(e)?clone(t):a&&n?mergeArray(e,t):a!==n?clone(t):mergeObject(e,t)}function cloneArray(e){let t=0;const a=e.length,n=new Array(a);for(t=0;t<a;t+=1)n[t]=clone(e[t]);return n}function cloneObject(e){const t={};for(const a in e)t[a]=clone(e[a]);return t}function mergeArray(e,t){const a=e.length;for(let n=0;n<t.length;n+=1)e[a+n]=clone(t[n]);return e}function isMergeableObject(e){return!("object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date)}function isPrimitive(e){return"object"!=typeof e||null===e}function isPrimitiveOrBuiltIn(e){return"object"!=typeof e||null===e||e instanceof RegExp||e instanceof Date}function clone(e){return isMergeableObject(e)?Array.isArray(e)?cloneArray(e):cloneObject(e):e}function mergeObject(e,t){for(const a in t)e[a]=a in e?fastDeepAssign(e[a],t[a]):clone(t[a]);return e}function isObjectEmpty(e){if(null==e)return!0;for(const t in e)return!1;return!0}var ar=__commonJSMin(e=>{Symbol.for("react.transitional.element"),Symbol.for("react.portal");var t=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),i=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.suspense_list"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),m=(Symbol.for("react.view_transition"),Symbol.for("react.client.reference"));e.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===t||e===n||e===a||e===l||e===c||"object"==typeof e&&null!==e&&(e.$$typeof===d||e.$$typeof===u||e.$$typeof===i||e.$$typeof===s||e.$$typeof===o||e.$$typeof===m||void 0!==e.getModuleId)}}),nr=__commonJSMin((e,t)=>{t.exports=ar()})();function isPlainObject(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}function deepClone(e){if(b.isValidElement(e)||(0,nr.isValidElementType)(e)||!isPlainObject(e))return e;const t={};return Object.keys(e).forEach(a=>{t[a]=deepClone(e[a])}),t}function deepmerge(e,t,a={clone:!0}){const n=a.clone?{...e}:e;return isPlainObject(e)&&isPlainObject(t)&&Object.keys(t).forEach(s=>{b.isValidElement(t[s])||(0,nr.isValidElementType)(t[s])?n[s]=t[s]:isPlainObject(t[s])&&Object.prototype.hasOwnProperty.call(e,s)&&isPlainObject(e[s])?n[s]=deepmerge(e[s],t[s],a):a.clone?n[s]=isPlainObject(t[s])?deepClone(t[s]):t[s]:n[s]=t[s]}),n}var sr=/min-width:\s*([0-9.]+)/;function sortContainerQueries(e,t){if(!e.containerQueries||!hasContainerQuery(t))return t;const a=[];for(const s in t)s.startsWith("@container")&&a.push(s);a.sort((e,t)=>+(e.match(sr)?.[1]||0)-+(t.match(sr)?.[1]||0));const n=t;for(let s=0;s<a.length;s+=1){const e=a[s],t=n[e];delete n[e],n[e]=t}return n}function hasContainerQuery(e){for(const t in e)if(t.startsWith("@container"))return!0;return!1}function isCqShorthand(e,t){return"@"===t||t.startsWith("@")&&(e.some(e=>t.startsWith(`@${e}`))||!!t.match(/^@\d/))}function getContainerQuery(e,t){const a=t.match(/^@([^/]+)?\/?(.+)?$/);if(!a)return null;const[,n,s]=a,i=Number.isNaN(+n)?n||0:+n;return e.containerQueries(s).up(i)}function cssContainerQueries(e){const toContainerQuery=(e,t)=>e.replace("@media",t?`@container ${t}`:"@container");function attachCq(t,a){t.up=(...t)=>toContainerQuery(e.breakpoints.up(...t),a),t.down=(...t)=>toContainerQuery(e.breakpoints.down(...t),a),t.between=(...t)=>toContainerQuery(e.breakpoints.between(...t),a),t.only=(...t)=>toContainerQuery(e.breakpoints.only(...t),a),t.not=(...t)=>{const n=toContainerQuery(e.breakpoints.not(...t),a);return n.includes("not all and")?n.replace("not all and ","").replace("min-width:","width<").replace("max-width:","width>").replace("and","or"):n}}const t={},containerQueries=e=>(attachCq(t,e),t);return attachCq(containerQueries),{...e,containerQueries}}var sortBreakpointsValues=e=>{const t=Object.keys(e).map(t=>({key:t,val:e[t]}))||[];return t.sort((e,t)=>e.val-t.val),t.reduce((e,t)=>({...e,[t.key]:t.val}),{})};function createBreakpoints(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:a="px",step:n=5,...s}=e,i=sortBreakpointsValues(t),o=Object.keys(i);function up(e){return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a})`}function down(e){return`@media (max-width:${("number"==typeof t[e]?t[e]:e)-n/100}${a})`}function between(e,s){const i=o.indexOf(s);return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${a}) and (max-width:${(-1!==i&&"number"==typeof t[o[i]]?t[o[i]]:s)-n/100}${a})`}function only(e){return o.indexOf(e)+1<o.length?between(e,o[o.indexOf(e)+1]):up(e)}function not(e){const t=o.indexOf(e);return 0===t?up(o[1]):t===o.length-1?down(o[t]):between(e,o[o.indexOf(e)+1]).replace("@media","@media not all and")}const l=[];for(let c=0;c<o.length;c+=1)l.push(up(o[c]));return{keys:o,values:i,up,down,between,only,not,unit:a,internal_mediaKeys:l,...s}}var ir={},or={xs:0,sm:600,md:900,lg:1200,xl:1536},lr=createBreakpoints({values:or}),cr={containerQueries:e=>({up:t=>{let a="number"==typeof t?t:or[t]||t;return"number"==typeof a&&(a=`${a}px`),e?`@container ${e} (min-width:${a})`:`@container (min-width:${a})`}})};function handleBreakpoints(e,t,a){const n={};return iterateBreakpoints(n,e.theme,t,(e,t,s)=>{const i=a(t,s);e?n[e]=i:fastDeepAssign(n,i)})}function iterateBreakpoints(e,t,a,n){if(t??=ir,Array.isArray(a)){const s=t.breakpoints??lr;for(let t=0;t<a.length;t+=1)buildBreakpoint(e,s.up(s.keys[t]),a[t],void 0,n);return e}if("object"==typeof a){const s=t.breakpoints??lr,i=s.values??or;for(const o in a)if(isCqShorthand(s.keys,o)){const s=getContainerQuery(t.containerQueries?t:cr,o);s&&buildBreakpoint(e,s,a[o],o,n)}else if(o in i)buildBreakpoint(e,s.up(o),a[o],o,n);else{const t=o;e[t]=a[t]}return e}return n(void 0,a),e}function buildBreakpoint(e,t,a,n,s){e[t]??={},s(t,a,n)}function createEmptyBreakpointObject(e=lr){const{internal_mediaKeys:t}=e,a={};for(let n=0;n<t.length;n+=1)a[t[n]]={};return a}function removeUnusedBreakpoints(e,t){const a=e.internal_mediaKeys;for(let n=0;n<a.length;n+=1){const e=a[n];isObjectEmpty(t[e])&&delete t[e]}return t}function hasBreakpoint(e,t){if(Array.isArray(t))return!0;if("object"==typeof t&&null!==t){for(let n=0;n<e.keys.length;n+=1)if(e.keys[n]in t)return!0;const a=Object.keys(t);for(let t=0;t<a.length;t+=1)if(isCqShorthand(e.keys,a[t]))return!0}return!1}function getStyleValue2(e,t,a,n){let s;return s="function"==typeof e?e(a):Array.isArray(e)?e[a]||a:"string"==typeof a&&getPath(e,a,!0,n)||a,t&&(s=t(s,a,e)),s}function getPath(e,t,a=!0,n=void 0){if(!e||!t)return null;const s=t.split(".");if(e.vars&&a){const t=getPathImpl(e.vars,s,n);if(null!=t)return t}return getPathImpl(e,s,n)}function getPathImpl(e,t,a=void 0){let n,s=e,i=0;for(;i<t.length;){if(null==s)return s;n=s,s=s[t[i]],i+=1}if(a&&void 0===s){const e=t[t.length-1],s=`${a}${"default"===e?"":capitalize$1(e)}`;return n?.[s]}return s}function style$1(e){const{prop:t,cssProperty:a=e.prop,themeKey:n,transform:s}=e,fn=e=>{if(null==e[t])return null;const i=e[t],o=getPath(e.theme,n)||{};return handleBreakpoints(e,i,e=>{const n=getStyleValue2(o,s,e,t);return!1===a?n:{[a]:n}})};return fn.propTypes={},fn.filterProps=[t],fn}var ur={internal_cache:{}},dr={m:"margin",p:"padding"},mr={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},pr={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},gr={};for(const On in dr)gr[On]=[dr[On]];for(const On in dr)for(const e in mr){const t=dr[On],a=mr[e],n=Array.isArray(a)?a.map(e=>t+e):[t+a];gr[On+e]=n}for(const On in pr)gr[On]=gr[pr[On]];var fr=new Set(["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"]),hr=new Set(["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"]),br=new Set([...fr,...hr]);function createUnaryUnit(e,t,a,n){const s=getPath(e,t,!0)??a;return"number"==typeof s||"string"==typeof s?e=>"string"==typeof e?e:"string"==typeof s?s.startsWith("var(")&&0===e?0:s.startsWith("var(")&&1===e?s:`calc(${e} * ${s})`:s*e:Array.isArray(s)?e=>{if("string"==typeof e)return e;const t=s[Math.abs(e)];return e>=0?t:"number"==typeof t?-t:"string"==typeof t&&t.startsWith("var(")?`calc(-1 * ${t})`:`-${t}`}:"function"==typeof s?s:()=>{}}function createUnarySpacing(e){return createUnaryUnit(e,"spacing",8,"spacing")}function getValue(e,t){return"string"==typeof t||null==t?t:e(t)}var yr=[""];function style(e,t){const a=e.theme??ur,n=a?.internal_cache?.unarySpacing??createUnarySpacing(a),s={};for(const i in e){if(!t.has(i))continue;const a=gr[i]??(yr[0]=i,yr),o=e[i];iterateBreakpoints(s,e.theme,o,(e,t)=>{const i=e?s[e]:s;for(let s=0;s<a.length;s+=1)i[a[s]]=getValue(n,t)})}return s}function margin(e){return style(e,fr)}function padding(e){return style(e,hr)}function spacing(e){return style(e,br)}function compose(...e){const t=e.reduce((e,t)=>(t.filterProps.forEach(a=>{e[a]=t}),e),{}),fn=e=>{const a={};for(const n in e)t[n]&&fastDeepAssign(a,t[n](e));return a};return fn.propTypes={},fn.filterProps=e.reduce((e,t)=>e.concat(t.filterProps),[]),fn}function borderTransform(e){return"number"!=typeof e?e:`${e}px solid`}function createBorderStyle(e,t){return style$1({prop:e,themeKey:"borders",transform:t})}margin.propTypes={},margin.filterProps=fr,padding.propTypes={},padding.filterProps=hr,spacing.propTypes={},spacing.filterProps=br;var vr=createBorderStyle("border",borderTransform),Sr=createBorderStyle("borderTop",borderTransform),xr=createBorderStyle("borderRight",borderTransform),Cr=createBorderStyle("borderBottom",borderTransform),kr=createBorderStyle("borderLeft",borderTransform),Ar=createBorderStyle("borderColor"),Er=createBorderStyle("borderTopColor"),_r=createBorderStyle("borderRightColor"),wr=createBorderStyle("borderBottomColor"),Tr=createBorderStyle("borderLeftColor"),Pr=createBorderStyle("outline",borderTransform),Mr=createBorderStyle("outlineColor"),borderRadius=e=>{if(void 0!==e.borderRadius&&null!==e.borderRadius){const t=createUnaryUnit(e.theme,"shape.borderRadius",4,"borderRadius"),styleFromPropValue=e=>({borderRadius:getValue(t,e)});return handleBreakpoints(e,e.borderRadius,styleFromPropValue)}return null};borderRadius.propTypes={},borderRadius.filterProps=["borderRadius"];compose(vr,Sr,xr,Cr,kr,Ar,Er,_r,wr,Tr,borderRadius,Pr,Mr);var gap=e=>{if(void 0!==e.gap&&null!==e.gap){const t=createUnaryUnit(e.theme,"spacing",8,"gap"),styleFromPropValue=e=>({gap:getValue(t,e)});return handleBreakpoints(e,e.gap,styleFromPropValue)}return null};gap.propTypes={},gap.filterProps=["gap"];var columnGap=e=>{if(void 0!==e.columnGap&&null!==e.columnGap){const t=createUnaryUnit(e.theme,"spacing",8,"columnGap"),styleFromPropValue=e=>({columnGap:getValue(t,e)});return handleBreakpoints(e,e.columnGap,styleFromPropValue)}return null};columnGap.propTypes={},columnGap.filterProps=["columnGap"];var rowGap=e=>{if(void 0!==e.rowGap&&null!==e.rowGap){const t=createUnaryUnit(e.theme,"spacing",8,"rowGap"),styleFromPropValue=e=>({rowGap:getValue(t,e)});return handleBreakpoints(e,e.rowGap,styleFromPropValue)}return null};rowGap.propTypes={},rowGap.filterProps=["rowGap"];compose(gap,columnGap,rowGap,style$1({prop:"gridColumn"}),style$1({prop:"gridRow"}),style$1({prop:"gridAutoFlow"}),style$1({prop:"gridAutoColumns"}),style$1({prop:"gridAutoRows"}),style$1({prop:"gridTemplateColumns"}),style$1({prop:"gridTemplateRows"}),style$1({prop:"gridTemplateAreas"}),style$1({prop:"gridArea"}));function paletteTransform(e,t){return"grey"===t?t:e}compose(style$1({prop:"color",themeKey:"palette",transform:paletteTransform}),style$1({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:paletteTransform}),style$1({prop:"backgroundColor",themeKey:"palette",transform:paletteTransform}));function sizingTransform(e){return e<=1&&0!==e?100*e+"%":e}var Dr=style$1({prop:"width",transform:sizingTransform}),maxWidth=e=>{if(void 0!==e.maxWidth&&null!==e.maxWidth){const styleFromPropValue=t=>{const a=e.theme?.breakpoints?.values?.[t]||or[t];return a?"px"!==e.theme?.breakpoints?.unit?{maxWidth:`${a}${e.theme.breakpoints.unit}`}:{maxWidth:a}:{maxWidth:sizingTransform(t)}};return handleBreakpoints(e,e.maxWidth,styleFromPropValue)}return null};maxWidth.filterProps=["maxWidth"];var Rr=style$1({prop:"minWidth",transform:sizingTransform}),Or=style$1({prop:"height",transform:sizingTransform}),Nr=style$1({prop:"maxHeight",transform:sizingTransform}),Lr=style$1({prop:"minHeight",transform:sizingTransform}),Ir=(style$1({prop:"size",cssProperty:"width",transform:sizingTransform}),style$1({prop:"size",cssProperty:"height",transform:sizingTransform}),compose(Dr,maxWidth,Rr,Or,Nr,Lr,style$1({prop:"boxSizing"})),{border:{themeKey:"borders",transform:borderTransform},borderTop:{themeKey:"borders",transform:borderTransform},borderRight:{themeKey:"borders",transform:borderTransform},borderBottom:{themeKey:"borders",transform:borderTransform},borderLeft:{themeKey:"borders",transform:borderTransform},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:borderTransform},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:borderRadius},color:{themeKey:"palette",transform:paletteTransform},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:paletteTransform},backgroundColor:{themeKey:"palette",transform:paletteTransform},p:{style:padding},pt:{style:padding},pr:{style:padding},pb:{style:padding},pl:{style:padding},px:{style:padding},py:{style:padding},padding:{style:padding},paddingTop:{style:padding},paddingRight:{style:padding},paddingBottom:{style:padding},paddingLeft:{style:padding},paddingX:{style:padding},paddingY:{style:padding},paddingInline:{style:padding},paddingInlineStart:{style:padding},paddingInlineEnd:{style:padding},paddingBlock:{style:padding},paddingBlockStart:{style:padding},paddingBlockEnd:{style:padding},m:{style:margin},mt:{style:margin},mr:{style:margin},mb:{style:margin},ml:{style:margin},mx:{style:margin},my:{style:margin},margin:{style:margin},marginTop:{style:margin},marginRight:{style:margin},marginBottom:{style:margin},marginLeft:{style:margin},marginX:{style:margin},marginY:{style:margin},marginInline:{style:margin},marginInlineStart:{style:margin},marginInlineEnd:{style:margin},marginBlock:{style:margin},marginBlockStart:{style:margin},marginBlockEnd:{style:margin},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:gap},rowGap:{style:rowGap},columnGap:{style:columnGap},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:sizingTransform},maxWidth:{style:maxWidth},minWidth:{transform:sizingTransform},height:{transform:sizingTransform},maxHeight:{transform:sizingTransform},minHeight:{transform:sizingTransform},boxSizing:{},font:{themeKey:"font"},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}}),jr={};function unstable_createStyleFunctionSx(){function styleFunctionSx(e){if(!e.sx)return null;const{sx:t,theme:a=jr,nested:n}=e,s=a.unstable_sxConfig??Ir,i={sx:null,theme:a,nested:!0};function process(t){let o=t;if("function"==typeof t)o=t(a);else if("object"!=typeof t)return t;if(!o)return null;const l=a.breakpoints??lr,c=createEmptyBreakpointObject(l);for(const n in o){const t=callIfFn(o[n],a);null!=t&&("object"==typeof t?s[n]?setThemeValue(c,n,t,a,s):hasBreakpoint(l,t)?iterateBreakpoints(c,e.theme,t,(e,t)=>{c[e][n]=t}):(i.sx=t,c[n]=styleFunctionSx(i)):setThemeValue(c,n,t,a,s))}return!n&&a.modularCssLayers?{"@layer sx":sortContainerQueries(a,removeUnusedBreakpoints(l,c))}:sortContainerQueries(a,removeUnusedBreakpoints(l,c))}return Array.isArray(t)?t.map(process):process(t)}return styleFunctionSx.filterProps=["sx"],styleFunctionSx}var qr=unstable_createStyleFunctionSx();function setThemeValue(e,t,a,n,s){const i=s[t];if(!i)return void(e[t]=a);if(null==a)return;const{themeKey:o}=i;if("typography"===o&&"inherit"===a)return void(e[t]=a);const{style:l}=i;if(l)return void fastDeepAssign(e,l({[t]:a,theme:n}));const{cssProperty:c=t,transform:u}=i,d=getPath(n,o);iterateBreakpoints(e,n,a,(a,n)=>{const s=getStyleValue2(d,u,n,t);!1===c?fastDeepAssign(a?e[a]:e,s):a?e[a][c]=s:e[c]=s})}function callIfFn(e,t){return"function"==typeof e?e(t):e}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)({}).hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},_extends.apply(null,arguments)}var Br=!1;function sheetForTag(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}function createStyleElement(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}var $r=function(){function StyleSheet(e){var t=this;this._insertTag=function(e){var a;a=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,a),t.tags.push(e)},this.isSpeedy=void 0===e.speedy?!Br:e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var e=StyleSheet.prototype;return e.hydrate=function hydrate(e){e.forEach(this._insertTag)},e.insert=function insert(e){this.ctr%(this.isSpeedy?65e3:1)==0&&this._insertTag(createStyleElement(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var a=sheetForTag(t);try{a.insertRule(e,a.cssRules.length)}catch(n){}}else t.appendChild(document.createTextNode(e));this.ctr++},e.flush=function flush(){this.tags.forEach(function(e){var t;return null==(t=e.parentNode)?void 0:t.removeChild(e)}),this.tags=[],this.ctr=0},StyleSheet}(),Fr="-ms-",zr="-moz-",Gr="-webkit-",Hr="comm",Ur="rule",Vr="decl",Yr="@import",Qr="@keyframes",Wr="@layer",Kr=Math.abs,Xr=String.fromCharCode,Jr=Object.assign;function hash(e,t){return 45^charat(e,0)?(((t<<2^charat(e,0))<<2^charat(e,1))<<2^charat(e,2))<<2^charat(e,3):0}function trim(e){return e.trim()}function match(e,t){return(e=t.exec(e))?e[0]:e}function replace(e,t,a){return e.replace(t,a)}function indexof(e,t){return e.indexOf(t)}function charat(e,t){return 0|e.charCodeAt(t)}function substr(e,t,a){return e.slice(t,a)}function strlen(e){return e.length}function sizeof(e){return e.length}function append(e,t){return t.push(e),e}function combine(e,t){return e.map(t).join("")}var Zr=1,ea=1,ta=0,ra=0,aa=0,na="";function node(e,t,a,n,s,i,o){return{value:e,root:t,parent:a,type:n,props:s,children:i,line:Zr,column:ea,length:o,return:""}}function copy(e,t){return Jr(node("",null,null,"",null,null,0),e,{length:-e.length},t)}function char(){return aa}function prev(){return aa=ra>0?charat(na,--ra):0,ea--,10===aa&&(ea=1,Zr--),aa}function next(){return aa=ra<ta?charat(na,ra++):0,ea++,10===aa&&(ea=1,Zr++),aa}function peek(){return charat(na,ra)}function caret(){return ra}function slice(e,t){return substr(na,e,t)}function token(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function alloc(e){return Zr=ea=1,ta=strlen(na=e),ra=0,[]}function dealloc(e){return na="",e}function delimit(e){return trim(slice(ra-1,delimiter(91===e?e+2:40===e?e+1:e)))}function whitespace(e){for(;(aa=peek())&&aa<33;)next();return token(e)>2||token(aa)>3?"":" "}function escaping(e,t){for(;--t&&next()&&!(aa<48||aa>102||aa>57&&aa<65||aa>70&&aa<97););return slice(e,caret()+(t<6&&32==peek()&&32==next()))}function delimiter(e){for(;next();)switch(aa){case e:return ra;case 34:case 39:34!==e&&39!==e&&delimiter(aa);break;case 40:41===e&&delimiter(e);break;case 92:next()}return ra}function commenter(e,t){for(;next()&&e+aa!==57&&(e+aa!==84||47!==peek()););return"/*"+slice(t,ra-1)+"*"+Xr(47===e?e:next())}function identifier(e){for(;!token(peek());)next();return slice(e,ra)}function compile(e){return dealloc(parse("",null,null,null,[""],e=alloc(e),0,[0],e))}function parse(e,t,a,n,s,i,o,l,c){for(var u=0,d=0,m=o,p=0,g=0,h=0,b=1,y=1,v=1,S=0,x="",C=s,k=i,A=n,E=x;y;)switch(h=S,S=next()){case 40:if(108!=h&&58==charat(E,m-1)){-1!=indexof(E+=replace(delimit(S),"&","&\f"),"&\f")&&(v=-1);break}case 34:case 39:case 91:E+=delimit(S);break;case 9:case 10:case 13:case 32:E+=whitespace(h);break;case 92:E+=escaping(caret()-1,7);continue;case 47:switch(peek()){case 42:case 47:append(comment(commenter(next(),caret()),t,a),c);break;default:E+="/"}break;case 123*b:l[u++]=strlen(E)*v;case 125*b:case 59:case 0:switch(S){case 0:case 125:y=0;case 59+d:-1==v&&(E=replace(E,/\f/g,"")),g>0&&strlen(E)-m&&append(g>32?declaration(E+";",n,a,m-1):declaration(replace(E," ","")+";",n,a,m-2),c);break;case 59:E+=";";default:if(append(A=ruleset(E,t,a,u,d,s,l,x,C=[],k=[],m),i),123===S)if(0===d)parse(E,t,A,A,C,i,m,l,k);else switch(99===p&&110===charat(E,3)?100:p){case 100:case 108:case 109:case 115:parse(e,A,A,n&&append(ruleset(e,A,A,0,0,s,l,x,s,C=[],m),k),s,k,m,l,n?C:k);break;default:parse(E,A,A,A,[""],k,0,l,k)}}u=d=g=0,b=v=1,x=E="",m=o;break;case 58:m=1+strlen(E),g=h;default:if(b<1)if(123==S)--b;else if(125==S&&0==b++&&125==prev())continue;switch(E+=Xr(S),S*b){case 38:v=d>0?1:(E+="\f",-1);break;case 44:l[u++]=(strlen(E)-1)*v,v=1;break;case 64:45===peek()&&(E+=delimit(next())),p=peek(),d=m=strlen(x=E+=identifier(caret())),S++;break;case 45:45===h&&2==strlen(E)&&(b=0)}}return i}function ruleset(e,t,a,n,s,i,o,l,c,u,d){for(var m=s-1,p=0===s?i:[""],g=sizeof(p),h=0,b=0,y=0;h<n;++h)for(var v=0,S=substr(e,m+1,m=Kr(b=o[h])),x=e;v<g;++v)(x=trim(b>0?p[v]+" "+S:replace(S,/&\f/g,p[v])))&&(c[y++]=x);return node(e,t,a,0===s?Ur:l,c,u,d)}function comment(e,t,a){return node(e,t,a,Hr,Xr(char()),substr(e,2,-2),0)}function declaration(e,t,a,n){return node(e,t,a,Vr,substr(e,0,n),substr(e,n+1,-1),n)}function serialize(e,t){for(var a="",n=sizeof(e),s=0;s<n;s++)a+=t(e[s],s,e,t)||"";return a}function stringify(e,t,a,n){switch(e.type){case Wr:if(e.children.length)break;case Yr:case Vr:return e.return=e.return||e.value;case Hr:return"";case Qr:return e.return=e.value+"{"+serialize(e.children,n)+"}";case Ur:e.value=e.props.join(",")}return strlen(a=serialize(e.children,n))?e.return=e.value+"{"+a+"}":""}function middleware(e){var t=sizeof(e);return function(a,n,s,i){for(var o="",l=0;l<t;l++)o+=e[l](a,n,s,i)||"";return o}}function rulesheet(e){return function(t){t.root||(t=t.return)&&e(t)}}function memoize(e){var t=Object.create(null);return function(a){return void 0===t[a]&&(t[a]=e(a)),t[a]}}var sa=function identifierWithPointTracking(e,t,a){for(var n=0,s=0;n=s,s=peek(),38===n&&12===s&&(t[a]=1),!token(s);)next();return slice(e,ra)},ia=function toRules(e,t){var a=-1,n=44;do{switch(token(n)){case 0:38===n&&12===peek()&&(t[a]=1),e[a]+=sa(ra-1,t,a);break;case 2:e[a]+=delimit(n);break;case 4:if(44===n){e[++a]=58===peek()?"&\f":"",t[a]=e[a].length;break}default:e[a]+=Xr(n)}}while(n=next());return e},oa=function getRules(e,t){return dealloc(ia(alloc(e),t))},la=new WeakMap,ca=function compat(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,a=e.parent,n=e.column===a.column&&e.line===a.line;"rule"!==a.type;)if(!(a=a.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||la.get(a))&&!n){la.set(e,!0);for(var s=[],i=oa(t,s),o=a.props,l=0,c=0;l<i.length;l++)for(var u=0;u<o.length;u++,c++)e.props[c]=s[l]?i[l].replace(/&\f/g,o[u]):o[u]+" "+i[l]}}},ua=function removeLabel(e){if("decl"===e.type){var t=e.value;108===t.charCodeAt(0)&&98===t.charCodeAt(2)&&(e.return="",e.value="")}};function prefix(e,t){switch(hash(e,t)){case 5103:return Gr+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Gr+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Gr+e+zr+e+Fr+e+e;case 6828:case 4268:return Gr+e+Fr+e+e;case 6165:return Gr+e+Fr+"flex-"+e+e;case 5187:return Gr+e+replace(e,/(\w+).+(:[^]+)/,Gr+"box-$1$2"+Fr+"flex-$1$2")+e;case 5443:return Gr+e+Fr+"flex-item-"+replace(e,/flex-|-self/,"")+e;case 4675:return Gr+e+Fr+"flex-line-pack"+replace(e,/align-content|flex-|-self/,"")+e;case 5548:return Gr+e+Fr+replace(e,"shrink","negative")+e;case 5292:return Gr+e+Fr+replace(e,"basis","preferred-size")+e;case 6060:return Gr+"box-"+replace(e,"-grow","")+Gr+e+Fr+replace(e,"grow","positive")+e;case 4554:return Gr+replace(e,/([^-])(transform)/g,"$1"+Gr+"$2")+e;case 6187:return replace(replace(replace(e,/(zoom-|grab)/,Gr+"$1"),/(image-set)/,Gr+"$1"),e,"")+e;case 5495:case 3959:return replace(e,/(image-set\([^]*)/,Gr+"$1$`$1");case 4968:return replace(replace(e,/(.+:)(flex-)?(.*)/,Gr+"box-pack:$3"+Fr+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Gr+e+e;case 4095:case 3583:case 4068:case 2532:return replace(e,/(.+)-inline(.+)/,Gr+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(strlen(e)-1-t>6)switch(charat(e,t+1)){case 109:if(45!==charat(e,t+4))break;case 102:return replace(e,/(.+:)(.+)-([^]+)/,"$1"+Gr+"$2-$3$1"+zr+(108==charat(e,t+3)?"$3":"$2-$3"))+e;case 115:return~indexof(e,"stretch")?prefix(replace(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==charat(e,t+1))break;case 6444:switch(charat(e,strlen(e)-3-(~indexof(e,"!important")&&10))){case 107:return replace(e,":",":"+Gr)+e;case 101:return replace(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+Gr+(45===charat(e,14)?"inline-":"")+"box$3$1"+Gr+"$2$3$1"+Fr+"$2box$3")+e}break;case 5936:switch(charat(e,t+11)){case 114:return Gr+e+Fr+replace(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Gr+e+Fr+replace(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Gr+e+Fr+replace(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return Gr+e+Fr+e+e}return e}var da=[function prefixer(e,t,a,n){if(e.length>-1&&!e.return)switch(e.type){case Vr:e.return=prefix(e.value,e.length);break;case Qr:return serialize([copy(e,{value:replace(e.value,"@","@"+Gr)})],n);case Ur:if(e.length)return combine(e.props,function(t){switch(match(t,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return serialize([copy(e,{props:[replace(t,/:(read-\w+)/,":"+zr+"$1")]})],n);case"::placeholder":return serialize([copy(e,{props:[replace(t,/:(plac\w+)/,":"+Gr+"input-$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,":"+zr+"$1")]}),copy(e,{props:[replace(t,/:(plac\w+)/,Fr+"input-$1")]})],n)}return""})}}],ma=function createCache(e){var t=e.key;if("css"===t){var a=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(a,function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))})}var n,s,i=e.stylisPlugins||da,o={},l=[];n=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),function(e){for(var t=e.getAttribute("data-emotion").split(" "),a=1;a<t.length;a++)o[t[a]]=!0;l.push(e)});var c,u=[ca,ua],d=[stringify,rulesheet(function(e){c.insert(e)})],m=middleware(u.concat(i,d)),p=function stylis(e){return serialize(compile(e),m)};s=function insert(e,t,a,n){c=a,p(e?e+"{"+t.styles+"}":t.styles),n&&(g.inserted[t.name]=!0)};var g={key:t,sheet:new $r({key:t,container:n,nonce:e.nonce,speedy:e.speedy,prepend:e.prepend,insertionPoint:e.insertionPoint}),nonce:e.nonce,inserted:o,registered:{},insert:s};return g.sheet.hydrate(l),g},pa=!0;function getRegisteredStyles(e,t,a){var n="";return a.split(" ").forEach(function(a){void 0!==e[a]?t.push(e[a]+";"):a&&(n+=a+" ")}),n}var ga=function registerStyles(e,t,a){var n=e.key+"-"+t.name;!1!==a&&!1!==pa||void 0!==e.registered[n]||(e.registered[n]=t.styles)},fa=function insertStyles(e,t,a){ga(e,t,a);var n=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var s=t;do{e.insert(t===s?"."+n:"",s,e.sheet,!0),s=s.next}while(void 0!==s)}};function murmur2(e){for(var t,a=0,n=0,s=e.length;s>=4;++n,s-=4)t=1540483477*(65535&(t=255&e.charCodeAt(n)|(255&e.charCodeAt(++n))<<8|(255&e.charCodeAt(++n))<<16|(255&e.charCodeAt(++n))<<24))+(59797*(t>>>16)<<16),a=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&a)+(59797*(a>>>16)<<16);switch(s){case 3:a^=(255&e.charCodeAt(n+2))<<16;case 2:a^=(255&e.charCodeAt(n+1))<<8;case 1:a=1540483477*(65535&(a^=255&e.charCodeAt(n)))+(59797*(a>>>16)<<16)}return(((a=1540483477*(65535&(a^=a>>>13))+(59797*(a>>>16)<<16))^a>>>15)>>>0).toString(36)}var ha={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,scale:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},ba=!1,ya=/[A-Z]|^ms/g,va=/_EMO_([^_]+?)_([^]*?)_EMO_/g,Sa=function isCustomProperty(e){return 45===e.charCodeAt(1)},xa=function isProcessableValue(e){return null!=e&&"boolean"!=typeof e},Ca=memoize(function(e){return Sa(e)?e:e.replace(ya,"-$&").toLowerCase()}),ka=function processStyleValue(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(va,function(e,t,a){return Ea={name:t,styles:a,next:Ea},t})}return 1===ha[e]||Sa(e)||"number"!=typeof t||0===t?t:t+"px"},Aa="Component selectors can only be used in conjunction with @emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware compiler transform.";function handleInterpolation(e,t,a){if(null==a)return"";var n=a;if(void 0!==n.__emotion_styles)return n;switch(typeof a){case"boolean":return"";case"object":var s=a;if(1===s.anim)return Ea={name:s.name,styles:s.styles,next:Ea},s.name;var i=a;if(void 0!==i.styles){var o=i.next;if(void 0!==o)for(;void 0!==o;)Ea={name:o.name,styles:o.styles,next:Ea},o=o.next;return i.styles+";"}return createStringFromObject(e,t,a);case"function":if(void 0!==e){var l=Ea,c=a(e);return Ea=l,handleInterpolation(e,t,c)}}var u=a;if(null==t)return u;var d=t[u];return void 0!==d?d:u}function createStringFromObject(e,t,a){var n="";if(Array.isArray(a))for(var s=0;s<a.length;s++)n+=handleInterpolation(e,t,a[s])+";";else for(var i in a){var o=a[i];if("object"!=typeof o){var l=o;null!=t&&void 0!==t[l]?n+=i+"{"+t[l]+"}":xa(l)&&(n+=Ca(i)+":"+ka(i,l)+";")}else{if("NO_COMPONENT_SELECTOR"===i&&ba)throw new Error(Aa);if(!Array.isArray(o)||"string"!=typeof o[0]||null!=t&&void 0!==t[o[0]]){var c=handleInterpolation(e,t,o);switch(i){case"animation":case"animationName":n+=Ca(i)+":"+c+";";break;default:n+=i+"{"+c+"}"}}else for(var u=0;u<o.length;u++)xa(o[u])&&(n+=Ca(i)+":"+ka(i,o[u])+";")}}return n}var Ea,_a=/label:\s*([^\s;{]+)\s*(;|$)/g;function serializeStyles(e,t,a){if(1===e.length&&"object"==typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var n=!0,s="";Ea=void 0;var i=e[0];null==i||void 0===i.raw?(n=!1,s+=handleInterpolation(a,t,i)):s+=i[0];for(var o=1;o<e.length;o++)s+=handleInterpolation(a,t,e[o]),n&&(s+=i[o]);_a.lastIndex=0;for(var l,c="";null!==(l=_a.exec(s));)c+="-"+l[1];return{name:murmur2(s)+c,styles:s,next:Ea}}var wa=function syncFallback(e){return e()},Ta=!!a.useInsertionEffect&&a.useInsertionEffect,Pa=Ta||wa,Ma=(Ta||a.useLayoutEffect,a.createContext("undefined"!=typeof HTMLElement?ma({key:"css"}):null)),Da=(Ma.Provider,function withEmotionCache(e){return(0,a.forwardRef)(function(t,n){return e(t,(0,a.useContext)(Ma),n)})}),Ra=a.createContext({}),Oa=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,Na=!1,La=memoize(function(e){return Oa.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91}),Ia=function testOmitPropsOnComponent(e){return"theme"!==e},ja=function getDefaultShouldForwardProp(e){return"string"==typeof e&&e.charCodeAt(0)>96?La:Ia},qa=function composeShouldForwardProps(e,t,a){var n;if(t){var s=t.shouldForwardProp;n=e.__emotion_forwardProp&&s?function(t){return e.__emotion_forwardProp(t)&&s(t)}:s}return"function"!=typeof n&&a&&(n=e.__emotion_forwardProp),n},Ba=function Insertion(e){var t=e.cache,a=e.serialized,n=e.isStringTag;return ga(t,a,n),Pa(function(){return fa(t,a,n)}),null},$a=function createStyled(e,t){var n,s,i=e.__emotion_real===e,o=i&&e.__emotion_base||e;void 0!==t&&(n=t.label,s=t.target);var l=qa(e,t,i),c=l||ja(o),u=!c("as");return function(){var d=arguments,m=i&&void 0!==e.__emotion_styles?e.__emotion_styles.slice(0):[];if(void 0!==n&&m.push("label:"+n+";"),null==d[0]||void 0===d[0].raw)m.push.apply(m,d);else{var p=d[0];m.push(p[0]);for(var g=d.length,h=1;h<g;h++)m.push(d[h],p[h])}var b=Da(function(e,t,n){var i=u&&e.as||o,d="",p=[],g=e;if(null==e.theme){for(var h in g={},e)g[h]=e[h];g.theme=a.useContext(Ra)}"string"==typeof e.className?d=getRegisteredStyles(t.registered,p,e.className):null!=e.className&&(d=e.className+" ");var b=serializeStyles(m.concat(p),t.registered,g);d+=t.key+"-"+b.name,void 0!==s&&(d+=" "+s);var y=u&&void 0===l?ja(i):c,v={};for(var S in e)u&&"as"===S||y(S)&&(v[S]=e[S]);return v.className=d,n&&(v.ref=n),a.createElement(a.Fragment,null,a.createElement(Ba,{cache:t,serialized:b,isStringTag:"string"==typeof i}),a.createElement(i,v))});return b.displayName=void 0!==n?n:"Styled("+("string"==typeof o?o:o.displayName||o.name||"Component")+")",b.defaultProps=e.defaultProps,b.__emotion_real=b,b.__emotion_base=o,b.__emotion_styles=m,b.__emotion_forwardProp=l,Object.defineProperty(b,"toString",{value:function value(){return void 0===s&&Na?"NO_COMPONENT_SELECTOR":"."+s}}),b.withComponent=function(e,a){return createStyled(e,_extends({},t,a,{shouldForwardProp:qa(b,a,!0)})).apply(void 0,m)},b}},Fa=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],za=$a.bind(null);function styled$1(e,t){return za(e,t)}function internal_mutateStyles(e,t){Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))}Fa.forEach(function(e){za[e]=za(e)});var Ga=[];function internal_serializeStyles(e){return Ga[0]=e,serializeStyles(Ga)}var Ha={borderRadius:4};function createSpacing(e=8,t=createUnarySpacing({spacing:e})){if(e.mui)return e;const spacing=(...e)=>(0===e.length?[1]:e).map(e=>{const a=t(e);return"number"==typeof a?`${a}px`:a}).join(" ");return spacing.mui=!0,spacing}function applyStyles(e,t){const a=this;if(a.vars){if(!a.colorSchemes?.[e]||"function"!=typeof a.getColorSchemeSelector)return{};let n=a.getColorSchemeSelector(e);return"&"===n?t:((n.includes("data-")||n.includes("."))&&(n=`*:where(${n.replace(/\s*&$/,"")}) &`),{[n]:t})}return a.palette.mode===e?t:{}}function createTheme$1(e={},...t){const{breakpoints:a={},palette:n={},spacing:s,shape:i={},...o}=e;let l=deepmerge({breakpoints:createBreakpoints(a),direction:"ltr",components:{},palette:{mode:"light",...n},spacing:createSpacing(s),shape:{...Ha,...i}},o);return l=cssContainerQueries(l),l.applyStyles=applyStyles,l=t.reduce((e,t)=>deepmerge(e,t),l),l.unstable_sxConfig={...Ir,...o?.unstable_sxConfig},l.unstable_sx=function sx(e){return qr({sx:e,theme:this})},l.internal_cache={},l}var defaultGenerator=e=>e,Ua=(()=>{let e=defaultGenerator;return{configure(t){e=t},generate:t=>e(t),reset(){e=defaultGenerator}}})(),Va={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function generateUtilityClass(e,t,a="Mui"){const n=Va[t];return n?`${a}-${n}`:`${Ua.generate(e)}-${t}`}function generateUtilityClasses(e,t,a="Mui"){const n={};return t.forEach(t=>{n[t]=generateUtilityClass(e,t,a)}),n}function preprocessStyles(e){const{variants:t,...a}=e,n={variants:t,style:internal_serializeStyles(a),isProcessed:!0};return n.style===a||t&&t.forEach(e=>{"function"!=typeof e.style&&(e.style=internal_serializeStyles(e.style))}),n}var Ya=createTheme$1();function shouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}function shallowLayer(e,t){return t&&e&&"object"==typeof e&&e.styles&&!e.styles.startsWith("@layer")&&(e.styles=`@layer ${t}{${String(e.styles)}}`),e}function defaultOverridesResolver(e){return e?(t,a)=>a[e]:null}function attachTheme(e,t,a){e.theme=isObjectEmpty(e.theme)?a:e.theme[t]||e.theme}function processStyle(e,t,a){const n="function"==typeof t?t(e):t;if(Array.isArray(n))return n.flatMap(t=>processStyle(e,t,a));if(Array.isArray(n?.variants)){let t;if(n.isProcessed)t=a?shallowLayer(n.style,a):n.style;else{const{variants:e,...s}=n;t=a?shallowLayer(internal_serializeStyles(s),a):s}return processStyleVariants(e,n.variants,[t],a)}return n?.isProcessed?a?shallowLayer(internal_serializeStyles(n.style),a):n.style:a?shallowLayer(internal_serializeStyles(n),a):n}function processStyleVariants(e,t,a=[],n=void 0){let s;e:for(let i=0;i<t.length;i+=1){const o=t[i];if("function"==typeof o.props){if(s??={...e,...e.ownerState,ownerState:e.ownerState},!o.props(s))continue}else for(const t in o.props)if(e[t]!==o.props[t]&&e.ownerState?.[t]!==o.props[t])continue e;"function"==typeof o.style?(s??={...e,...e.ownerState,ownerState:e.ownerState},a.push(n?shallowLayer(internal_serializeStyles(o.style(s)),n):o.style(s))):a.push(n?shallowLayer(internal_serializeStyles(o.style),n):o.style)}return a}function createStyled(e={}){const{themeId:t,defaultTheme:a=Ya,rootShouldForwardProp:n=shouldForwardProp,slotShouldForwardProp:s=shouldForwardProp}=e;function styleAttachTheme(e){attachTheme(e,t,a)}const styled=(e,t={})=>{internal_mutateStyles(e,e=>e.filter(e=>e!==qr));const{name:a,slot:i,skipVariantsResolver:o,skipSx:l,overridesResolver:c=defaultOverridesResolver(lowercaseFirstLetter(i)),...u}=t,d=a&&a.startsWith("Mui")||i?"components":"custom",m=void 0!==o?o:i&&"Root"!==i&&"root"!==i||!1,p=l||!1;let g=shouldForwardProp;"Root"===i||"root"===i?g=n:i?g=s:isStringTag(e)&&(g=void 0);const h=styled$1(e,{shouldForwardProp:g,label:generateStyledLabel(a,i),...u}),transformStyle=e=>{if(e.__emotion_real===e)return e;if("function"==typeof e)return function styleFunctionProcessor(t){return processStyle(t,e,t.theme.modularCssLayers?d:void 0)};if(isPlainObject(e)){const t=preprocessStyles(e);return function styleObjectProcessor(e){return t.variants?processStyle(e,t,e.theme.modularCssLayers?d:void 0):e.theme.modularCssLayers?shallowLayer(t.style,d):t.style}}return e},muiStyledResolver=(...t)=>{const n=[],s=t.map(transformStyle),i=[];if(n.push(styleAttachTheme),a&&c&&i.push(function styleThemeOverrides(e){const t=e.theme.components?.[a]?.styleOverrides;if(!t)return null;const n={};for(const a in t)n[a]=processStyle(e,t[a],e.theme.modularCssLayers?"theme":void 0);return c(e,n)}),a&&!m&&i.push(function styleThemeVariants(e){const t=e.theme?.components?.[a]?.variants;return t?processStyleVariants(e,t,[],e.theme.modularCssLayers?"theme":void 0):null}),p||i.push(qr),Array.isArray(s[0])){const e=s.shift(),t=new Array(n.length).fill(""),a=new Array(i.length).fill("");let o;o=[...t,...e,...a],o.raw=[...t,...e.raw,...a],n.unshift(o)}const o=h(...n,...s,...i);return e.muiName&&(o.muiName=e.muiName),o};return h.withConfig&&(muiStyledResolver.withConfig=h.withConfig),muiStyledResolver};return styled}function generateStyledLabel(e,t){let a;return a}function isStringTag(e){return"string"==typeof e&&e.charCodeAt(0)>96}function lowercaseFirstLetter(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}function resolveProps(e,t,a=!1){const n={...t};for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)){const i=s;if("components"===i||"slots"===i)n[i]={...e[i],...n[i]};else if("componentsProps"===i||"slotProps"===i){const s=e[i],o=t[i];if(o)if(s){n[i]={...o};for(const e in s)if(Object.prototype.hasOwnProperty.call(s,e)){const t=e;n[i][t]=resolveProps(s[t],o[t],a)}}else n[i]=o;else n[i]=s||{}}else"className"===i&&a&&void 0!==t.className?n.className=clsx(e?.className,t?.className):"style"===i&&a&&t.style?n.style={...e?.style,...t?.style}:void 0===n[i]&&(n[i]=e[i])}return n}function clamp(e,t=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(t,Math.min(e,a))}function clampWrapper(e,t=0,a=1){return clamp(e,t,a)}function hexToRgb(e){e=e.slice(1);const t=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let a=e.match(t);return a&&1===a[0].length&&(a=a.map(e=>e+e)),a?`rgb${4===a.length?"a":""}(${a.map((e,t)=>t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3).join(", ")})`:""}function decomposeColor(e){if(e.type)return e;if("#"===e.charAt(0))return decomposeColor(hexToRgb(e));const t=e.indexOf("("),a=e.substring(0,t);if(!["rgb","rgba","hsl","hsla","color"].includes(a))throw new Error(formatMuiErrorMessage(9,e));let n,s=e.substring(t+1,e.length-1);if("color"===a){if(s=s.split(" "),n=s.shift(),4===s.length&&"/"===s[3].charAt(0)&&(s[3]=s[3].slice(1)),!["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].includes(n))throw new Error(formatMuiErrorMessage(10,n))}else s=s.split(",");return s=s.map(e=>parseFloat(e)),{type:a,values:s,colorSpace:n}}var colorChannel=e=>{const t=decomposeColor(e);return t.values.slice(0,3).map((e,a)=>t.type.includes("hsl")&&0!==a?`${e}%`:e).join(" ")},private_safeColorChannel=(e,t)=>{try{return colorChannel(e)}catch(a){return e}};function recomposeColor(e){const{type:t,colorSpace:a}=e;let{values:n}=e;return t.includes("rgb")?n=n.map((e,t)=>t<3?parseInt(e,10):e):t.includes("hsl")&&(n[1]=`${n[1]}%`,n[2]=`${n[2]}%`),n=t.includes("color")?`${a} ${n.join(" ")}`:`${n.join(", ")}`,`${t}(${n})`}function hslToRgb(e){e=decomposeColor(e);const{values:t}=e,a=t[0],n=t[1]/100,s=t[2]/100,i=n*Math.min(s,1-s),f=(e,t=(e+a/30)%12)=>s-i*Math.max(Math.min(t-3,9-t,1),-1);let o="rgb";const l=[Math.round(255*f(0)),Math.round(255*f(8)),Math.round(255*f(4))];return"hsla"===e.type&&(o+="a",l.push(t[3])),recomposeColor({type:o,values:l})}function getLuminance(e){let t="hsl"===(e=decomposeColor(e)).type||"hsla"===e.type?decomposeColor(hslToRgb(e)).values:e.values;return t=t.map(t=>("color"!==e.type&&(t/=255),t<=.03928?t/12.92:((t+.055)/1.055)**2.4)),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function getContrastRatio(e,t){const a=getLuminance(e),n=getLuminance(t);return(Math.max(a,n)+.05)/(Math.min(a,n)+.05)}function alpha(e,t){return e=decomposeColor(e),t=clampWrapper(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),"color"===e.type?e.values[3]=`/${t}`:e.values[3]=t,recomposeColor(e)}function private_safeAlpha(e,t,a){try{return alpha(e,t)}catch(n){return e}}function darken(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]*=1-t;else if(e.type.includes("rgb")||e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]*=1-t;return recomposeColor(e)}function private_safeDarken(e,t,a){try{return darken(e,t)}catch(n){return e}}function lighten(e,t){if(e=decomposeColor(e),t=clampWrapper(t),e.type.includes("hsl"))e.values[2]+=(100-e.values[2])*t;else if(e.type.includes("rgb"))for(let a=0;a<3;a+=1)e.values[a]+=(255-e.values[a])*t;else if(e.type.includes("color"))for(let a=0;a<3;a+=1)e.values[a]+=(1-e.values[a])*t;return recomposeColor(e)}function private_safeLighten(e,t,a){try{return lighten(e,t)}catch(n){return e}}function emphasize(e,t=.15){return getLuminance(e)>.5?darken(e,t):lighten(e,t)}function private_safeEmphasize(e,t,a){try{return emphasize(e,t)}catch(n){return e}}var Qa=b.createContext(void 0);function getThemeProps(e){const{theme:t,name:a,props:n}=e;if(!t||!t.components||!t.components[a])return n;const s=t.components[a];return s.defaultProps?resolveProps(s.defaultProps,n,t.components.mergeClassNameAndStyle):s.styleOverrides||s.variants?n:resolveProps(s,n,t.components.mergeClassNameAndStyle)}function useDefaultProps$1({props:e,name:t}){return getThemeProps({props:e,name:t,theme:{components:b.useContext(Qa)}})}var Wa={theme:void 0};function unstable_memoTheme(e){let t,a;return function styleMemoized(n){let s=t;return void 0!==s&&n.theme===a||(Wa.theme=n.theme,s=preprocessStyles(e(Wa)),t=s,a=n.theme),s}}function createGetCssVar$1(e=""){function appendVar(...t){if(!t.length)return"";const a=t[0];return"string"!=typeof a||a.match(/(#|\(|\)|(-?(\d*\.)?\d+)(px|em|%|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc))|^(-?(\d*\.)?\d+)$|(\d+ \d+ \d+)/)?`, ${a}`:`, var(--${e?`${e}-`:""}${a}${appendVar(...t.slice(1))})`}return(t,...a)=>`var(--${e?`${e}-`:""}${t}${appendVar(...a)})`}var assignNestedKeys=(e,t,a,n=[])=>{let s=e;t.forEach((e,i)=>{i===t.length-1?Array.isArray(s)?s[Number(e)]=a:s&&"object"==typeof s&&(s[e]=a):s&&"object"==typeof s&&(s[e]||(s[e]=n.includes(e)?[]:{}),s=s[e])})},walkObjectDeep=(e,t,a)=>{function recurse(e,n=[],s=[]){Object.entries(e).forEach(([e,i])=>{(!a||a&&!a([...n,e]))&&null!=i&&("object"==typeof i&&Object.keys(i).length>0?recurse(i,[...n,e],Array.isArray(i)?[...s,e]:s):t([...n,e],i,s))})}recurse(e)},getCssValue=(e,t)=>"number"==typeof t?["lineHeight","fontWeight","opacity","zIndex"].some(t=>e.includes(t))||e[e.length-1].toLowerCase().includes("opacity")?t:`${t}px`:t;function cssVarsParser(e,t){const{prefix:a,shouldSkipGeneratingVar:n}=t||{},s={},i={},o={};return walkObjectDeep(e,(e,t,l)=>{if(!("string"!=typeof t&&"number"!=typeof t||n&&n(e,t))){const n=`--${a?`${a}-`:""}${e.join("-")}`,c=getCssValue(e,t);Object.assign(s,{[n]:c}),assignNestedKeys(i,e,`var(${n})`,l),assignNestedKeys(o,e,`var(${n}, ${c})`,l)}},e=>"vars"===e[0]),{css:s,vars:i,varsWithDefaults:o}}function prepareCssVars(e,t={}){const{getSelector:a=defaultGetSelector,disableCssColorScheme:n,colorSchemeSelector:s,enableContrastVars:i}=t,{colorSchemes:o={},components:l,defaultColorScheme:c="light",...u}=e,{vars:d,css:m,varsWithDefaults:p}=cssVarsParser(u,t);let g=p;const h={},{[c]:b,...y}=o;if(Object.entries(y||{}).forEach(([e,a])=>{const{vars:n,css:s,varsWithDefaults:i}=cssVarsParser(a,t);g=deepmerge(g,i),h[e]={css:s,vars:n}}),b){const{css:e,vars:a,varsWithDefaults:n}=cssVarsParser(b,t);g=deepmerge(g,n),h[c]={css:e,vars:a}}function defaultGetSelector(t,a){let n=s;if("class"===s&&(n=".%s"),"data"===s&&(n="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(n=`[${s}="%s"]`),t){if("media"===n)return e.defaultColorScheme===t?":root":{[`@media (prefers-color-scheme: ${o[t]?.palette?.mode||t})`]:{":root":a}};if(n)return e.defaultColorScheme===t?`:root, ${n.replace("%s",String(t))}`:n.replace("%s",String(t))}return":root"}return{vars:g,generateThemeVars:()=>{let e={...d};return Object.entries(h).forEach(([,{vars:t}])=>{e=deepmerge(e,t)}),e},generateStyleSheets:()=>{const t=[],s=e.defaultColorScheme||"light";function insertStyleSheet(e,a){Object.keys(a).length&&t.push("string"==typeof e?{[e]:{...a}}:e)}insertStyleSheet(a(void 0,{...m}),m);const{[s]:l,...c}=h;if(l){const{css:e}=l,t=o[s]?.palette?.mode,i=!n&&t?{colorScheme:t,...e}:{...e};insertStyleSheet(a(s,{...i}),i)}return Object.entries(c).forEach(([e,{css:t}])=>{const s=o[e]?.palette?.mode,i=!n&&s?{colorScheme:s,...t}:{...t};insertStyleSheet(a(e,{...i}),i)}),i&&t.push({":root":{"--__l-threshold":"0.7","--__l":"clamp(0, (l / var(--__l-threshold) - 1) * -infinity, 1)","--__a":"clamp(0.87, (l / var(--__l-threshold) - 1) * -infinity, 1)"}}),t}}}function createGetColorSchemeSelector(e){return function getColorSchemeSelector(t){return"media"===e?`@media (prefers-color-scheme: ${t})`:e?e.startsWith("data-")&&!e.includes("%s")?`[${e}="${t}"] &`:"class"===e?`.${t} &`:"data"===e?`[data-${t}] &`:`${e.replace("%s",t)} &`:"&"}}var Ka={black:"#000",white:"#fff"},Xa={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},Ja={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},Za={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},en={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},tn={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},rn={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},an={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"};function getLight(){return{text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:Ka.white,default:Ka.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}}}var nn=getLight();function getDark(){return{text:{primary:Ka.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:Ka.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}}}var sn=getDark();function addLightOrDark(e,t,a,n){const s=n.light||n,i=n.dark||1.5*n;e[t]||(e.hasOwnProperty(a)?e[t]=e[a]:"light"===t?e.light=lighten(e.main,s):"dark"===t&&(e.dark=darken(e.main,i)))}function mixLightOrDark(e,t,a,n,s){const i=s.light||s,o=s.dark||1.5*s;t[a]||(t.hasOwnProperty(n)?t[a]=t[n]:"light"===a?t.light=`color-mix(in ${e}, ${t.main}, #fff ${(100*i).toFixed(0)}%)`:"dark"===a&&(t.dark=`color-mix(in ${e}, ${t.main}, #000 ${(100*o).toFixed(0)}%)`))}function getDefaultPrimary(e="light"){return"dark"===e?{main:tn[200],light:tn[50],dark:tn[400]}:{main:tn[700],light:tn[400],dark:tn[800]}}function getDefaultSecondary(e="light"){return"dark"===e?{main:Ja[200],light:Ja[50],dark:Ja[400]}:{main:Ja[500],light:Ja[300],dark:Ja[700]}}function getDefaultError(e="light"){return"dark"===e?{main:Za[500],light:Za[300],dark:Za[700]}:{main:Za[700],light:Za[400],dark:Za[800]}}function getDefaultInfo(e="light"){return"dark"===e?{main:rn[400],light:rn[300],dark:rn[700]}:{main:rn[700],light:rn[500],dark:rn[900]}}function getDefaultSuccess(e="light"){return"dark"===e?{main:an[400],light:an[300],dark:an[700]}:{main:an[800],light:an[500],dark:an[900]}}function getDefaultWarning(e="light"){return"dark"===e?{main:en[400],light:en[300],dark:en[700]}:{main:"#ed6c02",light:en[500],dark:en[900]}}function contrastColor(e){return`oklch(from ${e} var(--__l) 0 h / var(--__a))`}function createPalette(e){const{mode:t="light",contrastThreshold:a=3,tonalOffset:n=.2,colorSpace:s,...i}=e,o=e.primary||getDefaultPrimary(t),l=e.secondary||getDefaultSecondary(t),c=e.error||getDefaultError(t),u=e.info||getDefaultInfo(t),d=e.success||getDefaultSuccess(t),m=e.warning||getDefaultWarning(t);function getContrastText(e){return s?contrastColor(e):getContrastRatio(e,sn.text.primary)>=a?sn.text.primary:nn.text.primary}const augmentColor=({color:e,name:t,mainShade:a=500,lightShade:i=300,darkShade:o=700})=>{if(!(e={...e}).main&&e[a]&&(e.main=e[a]),!e.hasOwnProperty("main"))throw new Error(formatMuiErrorMessage(11,t?` (${t})`:"",a));if("string"!=typeof e.main)throw new Error(formatMuiErrorMessage(12,t?` (${t})`:"",JSON.stringify(e.main)));return s?(mixLightOrDark(s,e,"light",i,n),mixLightOrDark(s,e,"dark",o,n)):(addLightOrDark(e,"light",i,n),addLightOrDark(e,"dark",o,n)),e.contrastText||(e.contrastText=getContrastText(e.main)),e};let p;return"light"===t?p=getLight():"dark"===t&&(p=getDark()),deepmerge({common:{...Ka},mode:t,primary:augmentColor({color:o,name:"primary"}),secondary:augmentColor({color:l,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:augmentColor({color:c,name:"error"}),warning:augmentColor({color:m,name:"warning"}),info:augmentColor({color:u,name:"info"}),success:augmentColor({color:d,name:"success"}),grey:Xa,contrastThreshold:a,getContrastText,augmentColor,tonalOffset:n,...p},i)}function prepareTypographyVars(e){const t={};return Object.entries(e).forEach(e=>{const[a,n]=e;"object"==typeof n&&(t[a]=`${n.fontStyle?`${n.fontStyle} `:""}${n.fontVariant?`${n.fontVariant} `:""}${n.fontWeight?`${n.fontWeight} `:""}${n.fontStretch?`${n.fontStretch} `:""}${n.fontSize||""}${n.lineHeight?`/${n.lineHeight} `:""}${n.fontFamily||""}`)}),t}function createMixins(e,t){return{toolbar:{minHeight:56,[e.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[e.up("sm")]:{minHeight:64}},...t}}function round(e){return Math.round(1e5*e)/1e5}var ln={textTransform:"uppercase"},cn='"Roboto", "Helvetica", "Arial", sans-serif';function createTypography(e,t){const{fontFamily:a=cn,fontSize:n=14,fontWeightLight:s=300,fontWeightRegular:i=400,fontWeightMedium:o=500,fontWeightBold:l=700,htmlFontSize:c=16,allVariants:u,pxToRem:d,...m}="function"==typeof t?t(e):t,p=n/14,g=d||(e=>e/c*p+"rem"),buildVariant=(e,t,n,s,i)=>({fontFamily:a,fontWeight:e,fontSize:g(t),lineHeight:n,...a===cn?{letterSpacing:`${round(s/t)}em`}:{},...i,...u});return deepmerge({htmlFontSize:c,pxToRem:g,fontFamily:a,fontSize:n,fontWeightLight:s,fontWeightRegular:i,fontWeightMedium:o,fontWeightBold:l,h1:buildVariant(s,96,1.167,-1.5),h2:buildVariant(s,60,1.2,-.5),h3:buildVariant(i,48,1.167,0),h4:buildVariant(i,34,1.235,.25),h5:buildVariant(i,24,1.334,0),h6:buildVariant(o,20,1.6,.15),subtitle1:buildVariant(i,16,1.75,.15),subtitle2:buildVariant(o,14,1.57,.1),body1:buildVariant(i,16,1.5,.15),body2:buildVariant(i,14,1.43,.15),button:buildVariant(o,14,1.75,.4,ln),caption:buildVariant(i,12,1.66,.4),overline:buildVariant(i,12,2.66,1,ln),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}},m,{clone:!1})}var un=.2,dn=.14,mn=.12;function createShadow(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,${un})`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,${dn})`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,${mn})`].join(",")}var pn=["none",createShadow(0,2,1,-1,0,1,1,0,0,1,3,0),createShadow(0,3,1,-2,0,2,2,0,0,1,5,0),createShadow(0,3,3,-2,0,3,4,0,0,1,8,0),createShadow(0,2,4,-1,0,4,5,0,0,1,10,0),createShadow(0,3,5,-1,0,5,8,0,0,1,14,0),createShadow(0,3,5,-1,0,6,10,0,0,1,18,0),createShadow(0,4,5,-2,0,7,10,1,0,2,16,1),createShadow(0,5,5,-3,0,8,10,1,0,3,14,2),createShadow(0,5,6,-3,0,9,12,1,0,3,16,2),createShadow(0,6,6,-3,0,10,14,1,0,4,18,3),createShadow(0,6,7,-4,0,11,15,1,0,4,20,3),createShadow(0,7,8,-4,0,12,17,2,0,5,22,4),createShadow(0,7,8,-4,0,13,19,2,0,5,24,4),createShadow(0,7,9,-4,0,14,21,2,0,5,26,4),createShadow(0,8,9,-5,0,15,22,2,0,6,28,5),createShadow(0,8,10,-5,0,16,24,2,0,6,30,5),createShadow(0,8,11,-5,0,17,26,2,0,6,32,5),createShadow(0,9,11,-5,0,18,28,2,0,7,34,6),createShadow(0,9,12,-6,0,19,29,2,0,7,36,6),createShadow(0,10,13,-6,0,20,31,3,0,8,38,7),createShadow(0,10,13,-6,0,21,33,3,0,8,40,7),createShadow(0,10,14,-6,0,22,35,3,0,8,42,7),createShadow(0,11,14,-7,0,23,36,3,0,9,44,8),createShadow(0,11,15,-7,0,24,38,3,0,9,46,8)],gn={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},hn={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function formatMs(e){return`${Math.round(e)}ms`}function getAutoHeightDuration(e){if(!e)return 0;const t=e/36;return Math.min(Math.round(10*(4+15*t**.25+t/5)),3e3)}function createTransitions(e){const t={...gn,...e.easing},a={...hn,...e.duration};return{getAutoHeightDuration,create:(e=["all"],n={})=>{const{duration:s=a.standard,easing:i=t.easeInOut,delay:o=0,...l}=n;return(Array.isArray(e)?e:[e]).map(e=>`${e} ${"string"==typeof s?s:formatMs(s)} ${i} ${"string"==typeof o?o:formatMs(o)}`).join(",")},...e,easing:t,duration:a}}var bn={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500};function isSerializable(e){return isPlainObject(e)||void 0===e||"string"==typeof e||"boolean"==typeof e||"number"==typeof e||Array.isArray(e)}function stringifyTheme(e={}){const t={...e};function serializeTheme(e){const t=Object.entries(e);for(let a=0;a<t.length;a++){const[n,s]=t[a];!isSerializable(s)||n.startsWith("unstable_")||n.startsWith("internal_")?delete e[n]:isPlainObject(s)&&(e[n]={...s},serializeTheme(e[n]))}}return serializeTheme(t),`import { unstable_createBreakpoints as createBreakpoints, createTransitions } from '@mui/material/styles';\n\nconst theme = ${JSON.stringify(t,null,2)};\n\ntheme.breakpoints = createBreakpoints(theme.breakpoints || {});\ntheme.transitions = createTransitions(theme.transitions || {});\n\nexport default theme;`}function coefficientToPercentage(e){return"number"==typeof e?`${(100*e).toFixed(0)}%`:`calc((${e}) * 100%)`}var parseAddition=e=>{if(!Number.isNaN(+e))return+e;const t=e.match(/\d*\.?\d+/g);if(!t)return 0;let a=0;for(let n=0;n<t.length;n+=1)a+=+t[n];return a};function attachColorManipulators(e){Object.assign(e,{alpha(t,a){const n=this||e;return n.colorSpace?`oklch(from ${t} l c h / ${"string"==typeof a?`calc(${a})`:a})`:n.vars?`rgba(${t.replace(/var\(--([^,\s)]+)(?:,[^)]+)?\)+/g,"var(--$1Channel)")} / ${"string"==typeof a?`calc(${a})`:a})`:alpha(t,parseAddition(a))},lighten(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #fff ${coefficientToPercentage(a)})`:lighten(t,a)},darken(t,a){const n=this||e;return n.colorSpace?`color-mix(in ${n.colorSpace}, ${t}, #000 ${coefficientToPercentage(a)})`:darken(t,a)}})}function createThemeNoVars(e={},...t){const{breakpoints:a,mixins:n={},spacing:s,palette:i={},transitions:o={},typography:l={},shape:c,colorSpace:u,...d}=e;if(e.vars&&void 0===e.generateThemeVars)throw new Error(formatMuiErrorMessage(22));const m=createPalette({...i,colorSpace:u}),p=createTheme$1(e);let g=deepmerge(p,{mixins:createMixins(p.breakpoints,n),palette:m,shadows:pn.slice(),typography:createTypography(m,l),transitions:createTransitions(o),zIndex:{...bn}});return g=deepmerge(g,d),g=t.reduce((e,t)=>deepmerge(e,t),g),g.unstable_sxConfig={...Ir,...d?.unstable_sxConfig},g.unstable_sx=function sx(e){return qr({sx:e,theme:this})},g.toRuntimeSource=stringifyTheme,attachColorManipulators(g),g}function getOverlayAlpha(e){let t;return t=e<1?5.11916*e**2:4.5*Math.log(e+1)+2,Math.round(10*t)/1e3}var yn=[...Array(25)].map((e,t)=>{if(0===t)return"none";const a=getOverlayAlpha(t);return`linear-gradient(rgba(255 255 255 / ${a}), rgba(255 255 255 / ${a}))`});function getOpacity(e){return{inputPlaceholder:"dark"===e?.5:.42,inputUnderline:"dark"===e?.7:.42,switchTrackDisabled:"dark"===e?.2:.12,switchTrack:"dark"===e?.3:.38}}function getOverlays(e){return"dark"===e?yn:[]}function createColorScheme(e){const{palette:t={mode:"light"},opacity:a,overlays:n,colorSpace:s,...i}=e,o=createPalette({...t,colorSpace:s});return{palette:o,opacity:{...getOpacity(o.mode),...a},overlays:n||getOverlays(o.mode),...i}}function shouldSkipGeneratingVar(e){return!!e[0].match(/(cssVarPrefix|colorSchemeSelector|modularCssLayers|rootSelector|typography|mixins|breakpoints|direction|transitions)/)||!!e[0].match(/sxConfig$/)||"palette"===e[0]&&!!e[1]?.match(/(mode|contrastThreshold|tonalOffset)/)}var excludeVariablesFromRoot=e=>[...[...Array(25)].map((t,a)=>`--${e?`${e}-`:""}overlays-${a}`),`--${e?`${e}-`:""}palette-AppBar-darkBg`,`--${e?`${e}-`:""}palette-AppBar-darkColor`],createGetSelector_default=e=>(t,a)=>{const n=e.rootSelector||":root",s=e.colorSchemeSelector;let i=s;if("class"===s&&(i=".%s"),"data"===s&&(i="[data-%s]"),s?.startsWith("data-")&&!s.includes("%s")&&(i=`[${s}="%s"]`),e.defaultColorScheme===t){if("dark"===t){const s={};return excludeVariablesFromRoot(e.cssVarPrefix).forEach(e=>{s[e]=a[e],delete a[e]}),"media"===i?{[n]:a,"@media (prefers-color-scheme: dark)":{[n]:s}}:i?{[i.replace("%s",t)]:s,[`${n}, ${i.replace("%s",t)}`]:a}:{[n]:{...a,...s}}}if(i&&"media"!==i)return`${n}, ${i.replace("%s",String(t))}`}else if(t){if("media"===i)return{[`@media (prefers-color-scheme: ${String(t)})`]:{[n]:a}};if(i)return i.replace("%s",String(t))}return n};function assignNode(e,t){t.forEach(t=>{e[t]||(e[t]={})})}function setColor(e,t,a){!e[t]&&a&&(e[t]=a)}function toRgb(e){return"string"==typeof e&&e.startsWith("hsl")?hslToRgb(e):e}function setColorChannel(e,t){`${t}Channel`in e||(e[`${t}Channel`]=private_safeColorChannel(toRgb(e[t]),`MUI: Can't create \`palette.${t}Channel\` because \`palette.${t}\` is not one of these formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().\nTo suppress this warning, you need to explicitly provide the \`palette.${t}Channel\` as a string (in rgb format, for example "12 12 12") or undefined if you want to remove the channel token.`))}function getSpacingVal(e){return"number"==typeof e?`${e}px`:"string"==typeof e||"function"==typeof e||Array.isArray(e)?e:"8px"}var silent=e=>{try{return e()}catch(t){}},createGetCssVar=(e="mui")=>createGetCssVar$1(e);function attachColorScheme$1(e,t,a,n,s){if(!a)return;a=!0===a?{}:a;const i="dark"===s?"dark":"light";if(!n)return void(t[s]=createColorScheme({...a,palette:{mode:i,...a?.palette},colorSpace:e}));const{palette:o,...l}=createThemeNoVars({...n,palette:{mode:i,...a?.palette},colorSpace:e});return t[s]={...a,palette:o,opacity:{...getOpacity(i),...a?.opacity},overlays:a?.overlays||getOverlays(i)},l}function createThemeWithVars(e={},...t){const{colorSchemes:a={light:!0},defaultColorScheme:n,disableCssColorScheme:s=!1,cssVarPrefix:i="mui",nativeColor:o=!1,shouldSkipGeneratingVar:l=shouldSkipGeneratingVar,colorSchemeSelector:c=(a.light&&a.dark?"media":void 0),rootSelector:u=":root",...d}=e,m=Object.keys(a)[0],p=n||(a.light&&"light"!==m?"light":m),g=createGetCssVar(i),{[p]:h,light:b,dark:y,...v}=a,S={...v};let x,C=h;if(("dark"===p&&!("dark"in a)||"light"===p&&!("light"in a))&&(C=!0),!C)throw new Error(formatMuiErrorMessage(21,p));o&&(x="oklch");const k=attachColorScheme$1(x,S,C,d,p);b&&!S.light&&attachColorScheme$1(x,S,b,void 0,"light"),y&&!S.dark&&attachColorScheme$1(x,S,y,void 0,"dark");let A={defaultColorScheme:p,...k,cssVarPrefix:i,colorSchemeSelector:c,rootSelector:u,getCssVar:g,colorSchemes:S,font:{...prepareTypographyVars(k.typography),...k.font},spacing:getSpacingVal(d.spacing)};Object.keys(A.colorSchemes).forEach(e=>{const t=A.colorSchemes[e].palette,setCssVarColor=e=>{const a=e.split("-"),n=a[1],s=a[2];return g(e,t[n][s])};function colorMix(e,t,a){if(x){let n;return e===private_safeAlpha&&(n=`transparent ${(100*(1-a)).toFixed(0)}%`),e===private_safeDarken&&(n=`#000 ${(100*a).toFixed(0)}%`),e===private_safeLighten&&(n=`#fff ${(100*a).toFixed(0)}%`),`color-mix(in ${x}, ${t}, ${n})`}return e(t,a)}if("light"===t.mode&&(setColor(t.common,"background","#fff"),setColor(t.common,"onBackground","#000")),"dark"===t.mode&&(setColor(t.common,"background","#000"),setColor(t.common,"onBackground","#fff")),assignNode(t,["Alert","AppBar","Avatar","Button","Chip","FilledInput","LinearProgress","Skeleton","Slider","SnackbarContent","SpeedDialAction","StepConnector","StepContent","Switch","TableCell","Tooltip"]),"light"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-main")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-main")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.main))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.main))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.main))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.main))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-100")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-400")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-300")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-A100")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-400")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-700")),setColor(t.FilledInput,"bg","rgba(0, 0, 0, 0.06)"),setColor(t.FilledInput,"hoverBg","rgba(0, 0, 0, 0.09)"),setColor(t.FilledInput,"disabledBg","rgba(0, 0, 0, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.LinearProgress,"successBg",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.main,.62)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.11):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.11)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Slider,"errorTrack",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Slider,"infoTrack",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Slider,"successTrack",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Slider,"warningTrack",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62));const e=x?colorMix(private_safeDarken,o?g("palette-background-default"):t.background.default,.6825):private_safeEmphasize(t.background.default,.8);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?sn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-400")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-400")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-common-white")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-100")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeLighten,o?g("palette-primary-main"):t.primary.main,.62)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeLighten,o?g("palette-secondary-main"):t.secondary.main,.62)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeLighten,o?g("palette-error-main"):t.error.main,.62)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeLighten,o?g("palette-info-main"):t.info.main,.62)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeLighten,o?g("palette-success-main"):t.success.main,.62)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeLighten,o?g("palette-warning-main"):t.warning.main,.62)),setColor(t.TableCell,"border",colorMix(private_safeLighten,private_safeAlpha(o?g("palette-divider"):t.divider,1),.88)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}if("dark"===t.mode){setColor(t.Alert,"errorColor",colorMix(private_safeLighten,o?g("palette-error-light"):t.error.light,.6)),setColor(t.Alert,"infoColor",colorMix(private_safeLighten,o?g("palette-info-light"):t.info.light,.6)),setColor(t.Alert,"successColor",colorMix(private_safeLighten,o?g("palette-success-light"):t.success.light,.6)),setColor(t.Alert,"warningColor",colorMix(private_safeLighten,o?g("palette-warning-light"):t.warning.light,.6)),setColor(t.Alert,"errorFilledBg",setCssVarColor("palette-error-dark")),setColor(t.Alert,"infoFilledBg",setCssVarColor("palette-info-dark")),setColor(t.Alert,"successFilledBg",setCssVarColor("palette-success-dark")),setColor(t.Alert,"warningFilledBg",setCssVarColor("palette-warning-dark")),setColor(t.Alert,"errorFilledColor",silent(()=>t.getContrastText(t.error.dark))),setColor(t.Alert,"infoFilledColor",silent(()=>t.getContrastText(t.info.dark))),setColor(t.Alert,"successFilledColor",silent(()=>t.getContrastText(t.success.dark))),setColor(t.Alert,"warningFilledColor",silent(()=>t.getContrastText(t.warning.dark))),setColor(t.Alert,"errorStandardBg",colorMix(private_safeDarken,o?g("palette-error-light"):t.error.light,.9)),setColor(t.Alert,"infoStandardBg",colorMix(private_safeDarken,o?g("palette-info-light"):t.info.light,.9)),setColor(t.Alert,"successStandardBg",colorMix(private_safeDarken,o?g("palette-success-light"):t.success.light,.9)),setColor(t.Alert,"warningStandardBg",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.light,.9)),setColor(t.Alert,"errorIconColor",setCssVarColor("palette-error-main")),setColor(t.Alert,"infoIconColor",setCssVarColor("palette-info-main")),setColor(t.Alert,"successIconColor",setCssVarColor("palette-success-main")),setColor(t.Alert,"warningIconColor",setCssVarColor("palette-warning-main")),setColor(t.AppBar,"defaultBg",setCssVarColor("palette-grey-900")),setColor(t.AppBar,"darkBg",setCssVarColor("palette-background-paper")),setColor(t.AppBar,"darkColor",setCssVarColor("palette-text-primary")),setColor(t.Avatar,"defaultBg",setCssVarColor("palette-grey-600")),setColor(t.Button,"inheritContainedBg",setCssVarColor("palette-grey-800")),setColor(t.Button,"inheritContainedHoverBg",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultBorder",setCssVarColor("palette-grey-700")),setColor(t.Chip,"defaultAvatarColor",setCssVarColor("palette-grey-300")),setColor(t.Chip,"defaultIconColor",setCssVarColor("palette-grey-300")),setColor(t.FilledInput,"bg","rgba(255, 255, 255, 0.09)"),setColor(t.FilledInput,"hoverBg","rgba(255, 255, 255, 0.13)"),setColor(t.FilledInput,"disabledBg","rgba(255, 255, 255, 0.12)"),setColor(t.LinearProgress,"primaryBg",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.LinearProgress,"secondaryBg",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.LinearProgress,"errorBg",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.LinearProgress,"infoBg",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.LinearProgress,"successBg",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.LinearProgress,"warningBg",colorMix(private_safeDarken,o?g("palette-warning-main"):t.warning.main,.5)),setColor(t.Skeleton,"bg",x?colorMix(private_safeAlpha,o?g("palette-text-primary"):t.text.primary,.13):`rgba(${setCssVarColor("palette-text-primaryChannel")} / 0.13)`),setColor(t.Slider,"primaryTrack",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.5)),setColor(t.Slider,"secondaryTrack",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.5)),setColor(t.Slider,"errorTrack",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.5)),setColor(t.Slider,"infoTrack",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.5)),setColor(t.Slider,"successTrack",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.5)),setColor(t.Slider,"warningTrack",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.5));const e=x?colorMix(private_safeLighten,o?g("palette-background-default"):t.background.default,.985):private_safeEmphasize(t.background.default,.98);setColor(t.SnackbarContent,"bg",e),setColor(t.SnackbarContent,"color",silent(()=>x?nn.text.primary:t.getContrastText(e))),setColor(t.SpeedDialAction,"fabHoverBg",private_safeEmphasize(t.background.paper,.15)),setColor(t.StepConnector,"border",setCssVarColor("palette-grey-600")),setColor(t.StepContent,"border",setCssVarColor("palette-grey-600")),setColor(t.Switch,"defaultColor",setCssVarColor("palette-grey-300")),setColor(t.Switch,"defaultDisabledColor",setCssVarColor("palette-grey-600")),setColor(t.Switch,"primaryDisabledColor",colorMix(private_safeDarken,o?g("palette-primary-main"):t.primary.main,.55)),setColor(t.Switch,"secondaryDisabledColor",colorMix(private_safeDarken,o?g("palette-secondary-main"):t.secondary.main,.55)),setColor(t.Switch,"errorDisabledColor",colorMix(private_safeDarken,o?g("palette-error-main"):t.error.main,.55)),setColor(t.Switch,"infoDisabledColor",colorMix(private_safeDarken,o?g("palette-info-main"):t.info.main,.55)),setColor(t.Switch,"successDisabledColor",colorMix(private_safeDarken,o?g("palette-success-main"):t.success.main,.55)),setColor(t.Switch,"warningDisabledColor",colorMix(private_safeDarken,o?g("palette-warning-light"):t.warning.main,.55)),setColor(t.TableCell,"border",colorMix(private_safeDarken,private_safeAlpha(o?g("palette-divider"):t.divider,1),.68)),setColor(t.Tooltip,"bg",colorMix(private_safeAlpha,o?g("palette-grey-700"):t.grey[700],.92))}o||(setColorChannel(t.background,"default"),setColorChannel(t.background,"paper"),setColorChannel(t.common,"background"),setColorChannel(t.common,"onBackground"),setColorChannel(t,"divider")),Object.keys(t).forEach(e=>{const a=t[e];"tonalOffset"!==e&&!o&&a&&"object"==typeof a&&(a.main&&setColor(t[e],"mainChannel",private_safeColorChannel(toRgb(a.main))),a.light&&setColor(t[e],"lightChannel",private_safeColorChannel(toRgb(a.light))),a.dark&&setColor(t[e],"darkChannel",private_safeColorChannel(toRgb(a.dark))),a.contrastText&&setColor(t[e],"contrastTextChannel",private_safeColorChannel(toRgb(a.contrastText))),"text"===e&&(setColorChannel(t[e],"primary"),setColorChannel(t[e],"secondary")),"action"===e&&(a.active&&setColorChannel(t[e],"active"),a.selected&&setColorChannel(t[e],"selected")))})}),A=t.reduce((e,t)=>deepmerge(e,t),A);const E={prefix:i,disableCssColorScheme:s,shouldSkipGeneratingVar:l,getSelector:createGetSelector_default(A),enableContrastVars:o},{vars:_,generateThemeVars:w,generateStyleSheets:T}=prepareCssVars(A,E);return A.vars=_,Object.entries(A.colorSchemes[A.defaultColorScheme]).forEach(([e,t])=>{A[e]=t}),A.generateThemeVars=w,A.generateStyleSheets=T,A.generateSpacing=function generateSpacing(){return createSpacing(d.spacing,createUnarySpacing(this))},A.getColorSchemeSelector=createGetColorSchemeSelector(c),A.spacing=A.generateSpacing(),A.shouldSkipGeneratingVar=l,A.unstable_sxConfig={...Ir,...d?.unstable_sxConfig},A.unstable_sx=function sx(e){return qr({sx:e,theme:this})},A.internal_cache={},A.toRuntimeSource=stringifyTheme,A}function attachColorScheme(e,t,a){e.colorSchemes&&a&&(e.colorSchemes[t]={...!0!==a&&a,palette:createPalette({...!0===a?{}:a.palette,mode:t})})}function createTheme(e={},...t){const{palette:a,cssVariables:n=!1,colorSchemes:s=(a?void 0:{light:!0}),defaultColorScheme:i=a?.mode,...o}=e,l=i||"light",c=s?.[l],u={...s,...a?{[l]:{..."boolean"!=typeof c&&c,palette:a}}:void 0};if(!1===n){if(!("colorSchemes"in e))return createThemeNoVars(e,...t);let n=a;"palette"in e||u[l]&&(!0!==u[l]?n=u[l].palette:"dark"===l&&(n={mode:"dark"}));const s=createThemeNoVars({...e,palette:n},...t);return s.defaultColorScheme=l,s.colorSchemes=u,"light"===s.palette.mode&&(s.colorSchemes.light={...!0!==u.light&&u.light,palette:s.palette},attachColorScheme(s,"dark",u.dark)),"dark"===s.palette.mode&&(s.colorSchemes.dark={...!0!==u.dark&&u.dark,palette:s.palette},attachColorScheme(s,"light",u.light)),s}return a||"light"in u||"light"!==l||(u.light=!0),createThemeWithVars({...o,colorSchemes:u,defaultColorScheme:l,..."boolean"!=typeof n&&n},...t)}function slotShouldForwardProp(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}var vn=createStyled({themeId:"$$material",defaultTheme:createTheme(),rootShouldForwardProp:e=>slotShouldForwardProp(e)&&"classes"!==e}),Sn=unstable_memoTheme;function useDefaultProps(e){return useDefaultProps$1(e)}function getSvgIconUtilityClass(e){return generateUtilityClass("MuiSvgIcon",e)}generateUtilityClasses("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);var useUtilityClasses=e=>{const{color:t,fontSize:a,classes:n}=e;return composeClasses({root:["root","inherit"!==t&&`color${rr(t)}`,`fontSize${rr(a)}`]},getSvgIconUtilityClass,n)},xn=vn("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,"inherit"!==a.color&&t[`color${rr(a.color)}`],t[`fontSize${rr(a.fontSize)}`]]}})(Sn(({theme:e})=>({userSelect:"none",width:"1em",height:"1em",display:"inline-block",flexShrink:0,transition:e.transitions?.create?.("fill",{duration:(e.vars??e).transitions?.duration?.shorter}),variants:[{props:e=>!e.hasSvgAsChild,style:{fill:"currentColor"}},{props:{fontSize:"inherit"},style:{fontSize:"inherit"}},{props:{fontSize:"small"},style:{fontSize:e.typography?.pxToRem?.(20)||"1.25rem"}},{props:{fontSize:"medium"},style:{fontSize:e.typography?.pxToRem?.(24)||"1.5rem"}},{props:{fontSize:"large"},style:{fontSize:e.typography?.pxToRem?.(35)||"2.1875rem"}},...Object.entries((e.vars??e).palette).filter(([,e])=>e&&e.main).map(([t])=>({props:{color:t},style:{color:(e.vars??e).palette?.[t]?.main}})),{props:{color:"action"},style:{color:(e.vars??e).palette?.action?.active}},{props:{color:"disabled"},style:{color:(e.vars??e).palette?.action?.disabled}},{props:{color:"inherit"},style:{color:void 0}}]}))),Cn=b.forwardRef(function SvgIcon(e,t){const a=useDefaultProps({props:e,name:"MuiSvgIcon"}),{children:n,className:s,color:i="inherit",component:o="svg",fontSize:l="medium",htmlColor:c,inheritViewBox:u=!1,titleAccess:d,viewBox:m="0 0 24 24",...p}=a,g=b.isValidElement(n)&&"svg"===n.type,h={...a,color:i,component:o,fontSize:l,instanceFontSize:e.fontSize,inheritViewBox:u,viewBox:m,hasSvgAsChild:g},y={};return u||(y.viewBox=m),(0,$t.jsxs)(xn,{as:o,className:clsx(useUtilityClasses(h).root,s),focusable:"false",color:c,"aria-hidden":!d||void 0,role:d?"img":void 0,ref:t,...y,...p,...g&&n.props,ownerState:h,children:[g?n.props.children:n,d?(0,$t.jsx)("title",{children:d}):null]})});function createSvgIcon(e,t){function Component(t,a){return(0,$t.jsx)(Cn,{"data-testid":void 0,ref:a,...t,children:e})}return Component.muiName=Cn.muiName,b.memo(b.forwardRef(Component))}Cn.muiName="SvgIcon";var kn=createSvgIcon((0,$t.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25"}),"HelpOutlined"),An=Object.freeze({}),En=Object.freeze({}),getDefaultClassFilter=(e="")=>{const t=normalizeClassName(e);return Me.includes(t)?t:"all"};function useDefPriorities(e,t={}){const a=useNexSysSnapshot(e)??An,n=a.defs??En,s=a.system?.char?.class??"",{defPriorities:i=En,defStatics:o=En,setDefPriority:l,setDefStatic:c}=t,u=(0,b.useMemo)(()=>getDefaultClassFilter(s),[s]),[d,m]=(0,b.useState)(null),p=d??u,g=(0,b.useMemo)(()=>["all",...Me],[]),h=(0,b.useMemo)(()=>Object.entries(n).reduce((e,[t,a])=>(e[t]={...a,defaultPriority:i[t]??a.defaultPriority,static:o[t]??a.static},e),{}),[n,i,o]),y=(0,b.useMemo)(()=>Object.entries(h).filter(([,e])=>!0===e.serverside),[h]),v=(0,b.useMemo)(()=>"all"===p?y.map(([e])=>e):y.filter(([,e])=>classListIncludes(e.skills,p)).map(([e])=>e),[y,p]),S=(0,b.useCallback)((e,t)=>{c?.(e,t)},[c]),x=(0,b.useCallback)((e,t)=>{l?.(e,t)},[l]);return{defList:v,defsState:h,classFilter:p,setClassFilter:(0,b.useCallback)(e=>{m(e)},[]),classOptions:g,updateStatic:S,updatePriority:x}}function defNameColor(e){const t=e?.bals_used??[],a=e?.bals_req??[],n=["balance","equilibrium"];return t.some(e=>n.includes(e))?"error.main":a.some(e=>n.includes(e))?"warning.main":"success.main"}var _n=(0,$t.jsxs)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:[(0,$t.jsxs)(n.Box,{children:[(0,$t.jsx)(n.Box,{component:"span",sx:{color:"error.main",fontWeight:700},children:"Consumes balance"}),": These skills use eq or bal to activate and should have the lowest priority."]}),(0,$t.jsxs)(n.Box,{children:[(0,$t.jsx)(n.Box,{component:"span",sx:{color:"warning.main",fontWeight:700},children:"Requires balance"}),": These skills are free to use but require eq or bal to activate and should have the middle priority."]}),(0,$t.jsxs)(n.Box,{children:[(0,$t.jsx)(n.Box,{component:"span",sx:{color:"success.main",fontWeight:700},children:"Free action"}),": These skills are free to use and should likely have the highest priority."]})]}),wn=(0,$t.jsx)(n.Box,{sx:{fontSize:13,lineHeight:1.6},children:"Checked defences are player-controlled and only raised by the manual defence-up action. Unchecked defences are kept up by server-side curing."}),Tn={py:.25,px:.75,border:"none"},Pn={py:.5,px:.75,border:"none",borderBottom:"1px solid",borderColor:"divider",bgcolor:"background.panel",color:"text.primary",fontWeight:700,fontSize:13,whiteSpace:"nowrap"};function HelpIcon(){return(0,$t.jsx)(kn,{sx:{fontSize:14,verticalAlign:"middle",ml:.25,opacity:.7}})}function DefRow({name:e,def:t,updateStatic:a,updatePriority:s}){const i=defNameColor(t);return(0,$t.jsxs)(n.TableRow,{sx:{"& td":Tn},children:[(0,$t.jsx)(n.TableCell,{padding:"checkbox",sx:{...Tn,width:36},children:(0,$t.jsx)(n.Checkbox,{size:"small",checked:Boolean(t?.static),onChange:t=>a(e,t.target.checked),sx:{p:.25}})}),(0,$t.jsx)(n.TableCell,{sx:{width:100},children:(0,$t.jsx)(n.Typography,{variant:"body2",sx:{color:i,fontSize:13},children:e})}),(0,$t.jsx)(n.TableCell,{sx:{width:50},children:(0,$t.jsx)(n.TextField,{value:t?.defaultPriority??0,onChange:t=>s(e,t.target.value),type:"number",size:"small",sx:{width:56},slotProps:{htmlInput:{min:0,max:26,style:{padding:"2px 6px",fontSize:13}}}})})]})}function DefHalfTable({defNames:e,defsState:t,updateStatic:a,updatePriority:s}){return(0,$t.jsx)(n.TableContainer,{sx:{flex:1},children:(0,$t.jsxs)(n.Table,{size:"small",stickyHeader:!0,sx:{tableLayout:"fixed"},children:[(0,$t.jsx)(n.TableHead,{children:(0,$t.jsxs)(n.TableRow,{children:[(0,$t.jsx)(n.TableCell,{padding:"checkbox",sx:{...Pn,width:36},children:(0,$t.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:wn,children:(0,$t.jsxs)("span",{children:["Defup",(0,$t.jsx)(HelpIcon,{})]})})}),(0,$t.jsx)(n.TableCell,{sx:{...Pn,width:100},children:(0,$t.jsx)(n.Tooltip,{arrow:!0,placement:"bottom-start",title:_n,children:(0,$t.jsxs)("span",{children:["Name ",(0,$t.jsx)(HelpIcon,{})]})})}),(0,$t.jsx)(n.TableCell,{sx:{...Pn,width:70},children:"Priority"})]})}),(0,$t.jsx)(n.TableBody,{children:e.map(e=>(0,$t.jsx)(DefRow,{name:e,def:t[e],updateStatic:a,updatePriority:s},e))})]})})}function DefPrioritiesTab({settingsForm:e}){const{defList:t,defsState:a,classFilter:s,setClassFilter:i,classOptions:o,updateStatic:l,updatePriority:c}=useDefPriorities(useNexSys(),e),[u,d]=(0,b.useMemo)(()=>{const e=Math.ceil(t.length/2);return[t.slice(0,e),t.slice(e)]},[t]);return(0,$t.jsxs)(n.Box,{sx:{pt:1},children:[(0,$t.jsxs)(n.FormControl,{size:"small",sx:{mb:1.5,minWidth:180},children:[(0,$t.jsx)(n.InputLabel,{children:"Class"}),(0,$t.jsx)(n.Select,{value:s,label:"Class",onChange:e=>i(e.target.value),children:o.map(e=>(0,$t.jsx)(n.MenuItem,{value:e,children:"all"===e?"All Classes":e},e))})]}),(0,$t.jsxs)(n.Box,{sx:{display:"flex",gap:1,alignItems:"flex-start"},children:[(0,$t.jsx)(DefHalfTable,{defNames:u,defsState:a,updateStatic:l,updatePriority:c}),d.length>0&&(0,$t.jsx)(DefHalfTable,{defNames:d,defsState:a,updateStatic:l,updatePriority:c})]})]})}var Mn=Object.freeze({}),Dn=_.map(e=>T[e]).filter(Boolean).map(e=>({herb:e,mineral:M[e]??null}));function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function usePrecache(e,t={}){const a=useNexSysSnapshot(e),{desiredPrecache:n,setPrecache:s}=t,i=n??a?.cache?.desiredPrecache??Mn;return{pairs:(0,b.useMemo)(()=>Dn.map(({herb:e,mineral:t})=>({herb:e,herbLabel:capitalize(e),herbQty:i[e]??0,mineral:t,mineralLabel:t?capitalize(t):null,mineralQty:t?i[t]??0:0})),[i]),update:(0,b.useCallback)((e,t)=>{s?.(e,Math.max(0,t))},[s])}}function QuantityControl({label:e,value:t,onIncrement:a,onDecrement:s,compact:i=!1}){return(0,$t.jsxs)(n.Box,{sx:{display:"flex",alignItems:"center",gap:1,mb:i?0:.5},children:[(0,$t.jsxs)(n.ButtonGroup,{size:"small",variant:"outlined",children:[(0,$t.jsx)(n.Button,{onClick:s,disabled:t<=0,sx:{minWidth:28,px:.5,fontSize:12},children:"−"}),(0,$t.jsx)(n.Button,{disableRipple:!0,disableFocusRipple:!0,sx:{minWidth:36,px:.5,cursor:"default",pointerEvents:"none",fontSize:12,color:"text.primary",borderColor:"divider"},children:t}),(0,$t.jsx)(n.Button,{onClick:a,sx:{minWidth:28,px:.5,fontSize:12},children:"+"})]}),(0,$t.jsx)(n.Typography,{variant:"body2",children:e})]})}function PairRow({pair:e,update:t}){return(0,$t.jsxs)(n.Box,{sx:{display:"flex",gap:.5},children:[(0,$t.jsx)(n.Box,{sx:{flex:1},children:(0,$t.jsx)(QuantityControl,{compact:!0,label:e.herbLabel,value:e.herbQty,onIncrement:()=>t(e.herb,e.herbQty+1),onDecrement:()=>t(e.herb,e.herbQty-1)})}),(0,$t.jsx)(n.Box,{sx:{flex:1},children:e.mineral?(0,$t.jsx)(QuantityControl,{compact:!0,label:e.mineralLabel,value:e.mineralQty,onIncrement:()=>t(e.mineral,e.mineralQty+1),onDecrement:()=>t(e.mineral,e.mineralQty-1)}):(0,$t.jsx)(n.Box,{sx:{height:28}})})]})}function PrecacheTab({settingsForm:e}){const{pairs:t,update:a}=usePrecache(useNexSys(),e);return(0,$t.jsxs)(n.Box,{sx:{pt:1},children:[(0,$t.jsxs)(n.Box,{sx:{display:"flex",gap:.5,mb:.25},children:[(0,$t.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Herb"}),(0,$t.jsx)(n.Typography,{variant:"overline",sx:{flex:1,color:"primary.main",fontWeight:700,fontSize:10},children:"Mineral"})]}),t.map(e=>(0,$t.jsx)(PairRow,{pair:e,update:a},e.herb))]})}function ColorSettingsTab(){return(0,$t.jsx)(n.Box,{sx:{pt:2},children:(0,$t.jsx)(n.Typography,{variant:"body2",color:"text.secondary",children:"Color settings are not yet implemented."})})}var Rn=["System","Aff Priorities","Defences","Precache","Colors"];function ConfigTabs({settingsForm:e}){const[t,a]=(0,b.useState)(0),{pending:s,set:i}=e;return(0,$t.jsxs)(n.Box,{sx:{width:"100%"},children:[(0,$t.jsx)(n.Tabs,{value:t,onChange:(e,t)=>a(t),variant:"scrollable",scrollButtons:"auto",sx:{borderBottom:"1px solid",borderColor:"divider",mb:1,"& .MuiTab-root":{fontSize:11,minHeight:36,py:.5}},children:Rn.map(e=>(0,$t.jsx)(n.Tab,{label:e},e))}),(0,$t.jsxs)(n.Box,{sx:{overflowX:"auto",overflowY:"visible"},children:[0===t&&(0,$t.jsx)(SystemSettingsTab,{pending:s,set:i}),1===t&&(0,$t.jsx)(AffPrioritiesTab,{settingsForm:e}),2===t&&(0,$t.jsx)(DefPrioritiesTab,{settingsForm:e}),3===t&&(0,$t.jsx)(PrecacheTab,{settingsForm:e}),4===t&&(0,$t.jsx)(ColorSettingsTab,{})]})]})}function ConfigDialogContent({nexSys:e,onClose:t}){const a=useSettingsForm(e),handleSave=()=>{a.commit(),e?.api?.ui?.closeConfig("ui.save"),t()},handleCancel=()=>{e?.api?.ui?.closeConfig("ui.cancel"),t()};return(0,$t.jsxs)(n.Dialog,{open:!0,onClose:handleCancel,maxWidth:"md",slotProps:{paper:{sx:{width:{xs:"calc(100% - 24px)",md:900},maxWidth:"calc(100% - 24px)",bgcolor:"background.surface",color:"text.primary",backgroundImage:"none",border:"1px solid",borderColor:"divider"}}},children:[(0,$t.jsxs)(n.DialogTitle,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",bgcolor:"background.surface",color:"text.primary",pb:.5,borderBottom:"1px solid",borderColor:"divider"},children:[(0,$t.jsx)(n.Typography,{component:"span",variant:"h6",sx:{fontSize:14,color:"primary.main",fontWeight:700},children:"nexSys4 Configuration"}),(0,$t.jsx)(n.Typography,{component:"span",variant:"caption",sx:{color:"text.secondary"},children:"v1.0.4"})]}),(0,$t.jsx)(n.DialogContent,{sx:{"&.MuiDialogContent-root":{p:0,overflowY:"auto",overflowX:"hidden"}},children:(0,$t.jsx)(n.Box,{sx:{px:2,pt:2,pb:0},children:(0,$t.jsx)(ConfigTabs,{settingsForm:a})})}),(0,$t.jsxs)(n.DialogActions,{sx:{borderTop:"1px solid",borderColor:"divider",px:2,py:1},children:[(0,$t.jsx)(n.Button,{onClick:handleCancel,size:"small",sx:{fontSize:11},children:"Cancel"}),(0,$t.jsx)(n.Button,{onClick:handleSave,variant:"contained",size:"small",sx:{fontSize:11},children:"Save"})]})]})}function ConfigDialog(){const e=useNexSys(),[t,a]=useDialogOpen(e);return(0,$t.jsx)(s.ThemeProvider,{theme:Vt,children:t?(0,$t.jsx)(ConfigDialogContent,{nexSys:e,onClose:()=>a(!1)}):null})}function NexSysGuiApp({nexSys:e}){return(0,$t.jsx)(NexSysProvider,{nexSys:e,children:(0,$t.jsx)(ConfigDialog,{})})}var bootstrapNexus=(e={})=>{const t=bootstrapNexus$1(e);return t.component=NexSysGuiApp,startupNexus(),t.api.control.updateNxs(),t};e.bootstrapNexus=bootstrapNexus}(globalThis.nexSys=globalThis.nexSys||{},nexRuntime.zod,React,nexRuntime.mui,nexRuntime.muiStyles,nexRuntime.immer,nexRuntime.dndCore,nexRuntime.dndSortable,nexRuntime.dndUtilities);