@kemu-io/edge-runtime 0.1.23 → 0.1.24
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.
- package/package.json +1 -1
- package/runner.js +1 -1
package/package.json
CHANGED
package/runner.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{config as e}from"dotenv";import{readFile as t,access as n}from"node:fs/promises";import{nanoid as r}from"nanoid";import i from"jsonp";import s from"crypto-js";import o from"util";import a from"emittery";import"axios";import c from"jszip";import l,{scryptSync as u,createDecipheriv as d,createHash as p}from"crypto";import{satisfies as h}from"compare-versions";import f from"debug";import g,{join as m,dirname as v,resolve as y}from"path";import"node-ipc";import{mkdir as b,readFile as w,access as S,constants as I,readdir as _,rm as $}from"fs/promises";import C from"minimist";import k from"tty";import E,{homedir as x}from"os";import A from"net";import N from"tls";import O,{promises as P}from"fs";import L from"dgram";import T from"stream";import B from"zlib";import j from"buffer";import D from"events";import U from"https";import M from"http";import F,{fileURLToPath as R}from"url";import W from"node:os";import{spawn as G}from"child_process";import{join as V,resolve as H,dirname as z}from"node:path";import{ImageData as q,loadImage as K,createCanvas as J}from"@napi-rs/canvas";var Y;!function(e){e.STARTING="STARTING",e.PENDING="PENDING",e.RUNNING="RUNNING",e.PAUSED="PAUSED",e.DRAINING="DRAINING",e.STOPPED="STOPPED",e.ERROR="ERROR"}(Y=Y||(Y={}));const X={};let Z=0,Q="";const ee=e=>X[e]?X[e]:null,te=(e,t)=>{const n=ee(e);if(!n)return n;return n.blocks[t]||null},ne=(e,t,n)=>{const r=te(e,t);if(!r)return r;return r.gates[n]},re=(e,t)=>{let n=r(4);for(;X[n];)n=r(4);const i=(s=e,JSON.parse(JSON.stringify(s)));var s;return i.logs="",i.addLog=e=>{i.logs+=`${(()=>{const e=Date.now();if(e!==Z){const t=new Date;Z=e,Q=t.toJSON()}return Q})()}:: ${e}\n`},i.dbInfo={...t},X[n]=i,n},ie="interrupt_port",se="main.js",oe="state.json",ae="{#}",ce="$var_",le="default";var ue,de,pe,he,fe,ge,me,ve;let ye;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(ue||(ue={})),function(e){e[e.Number=0]="Number",e[e.String=1]="String",e[e.ArrayBuffer=2]="ArrayBuffer",e[e.Array=3]="Array",e[e.Boolean=4]="Boolean",e[e.JsonObj=5]="JsonObj",e[e.Anything=6]="Anything",e[e.ImageData=7]="ImageData",e[e.AudioBuffer=8]="AudioBuffer",e[e.Rect=9]="Rect",e[e.Point=10]="Point",e[e.ImageBitmap=11]="ImageBitmap",e[e.BinaryFile=12]="BinaryFile"}(de||(de={})),function(e){e.Number="Number",e.String="String",e.ArrayBuffer="ArrayBuffer",e.Array="Array",e.Boolean="Boolean",e.JsonObj="JsonObj",e.Anything="Anything",e.ImageData="ImageData",e.AudioBuffer="AudioBuffer",e.Rect="Rect",e.Point="Point",e.ImageBitmap="ImageBitmap",e.BinaryFile="BinaryFile"}(pe||(pe={})),function(e){e.Javascript="js",e.Python="py",e.Executable="exe"}(he||(he={})),function(e){e.IpcAcknowledge="iack:",e.SocketAcknowledge="sack:",e.AcknowledgeResponse="ackr:",e.ServicesListChanged="update-services",e.SendManifest="send-manifest",e.BroadcastStart="broadcast-start",e.BroadcastEnd="broadcast-end",e.AssumeSession="assume:"}(fe||(fe={})),function(e){e.GetServices="getServices",e.SubscribeToService="subscribeToService",e.UnsubscribeFromService="unsubscribeFromService",e.GetServiceContents="getServiceContents",e.SocketAckResponse="socketAckResponse",e.ShowSecretsConfigScreen="showSecretsConfigScreen",e.GetMappedSecrets="getMappedSecrets",e.GetSecretContexts="getSecretContexts",e.OnParentEvent="onParentEvent",e.GetDefaultState="getDefaultState",e.BroadcastEvent="broadcastEvent",e.HubBroadcastEvent="hubBroadcastEvent",e.ServiceManifest="serviceManifest",e.GetState="getState",e.SetState="setState",e.SetOutputs="setOutputs",e.UIEvent="uiEvent",e.InitializeInstance="initializeInstance",e.TerminateInstance="terminateInstance",e.ChooseDirectoryDialog="chooseDirectoryDialog",e.ChooseFileDialog="chooseFileDialog",e.GetUniqueId="getUniqueId"}(ge||(ge={})),function(e){e.SetDependencyPath="setDependencyPath",e.GetDependencyPath="getDependencyPath"}(me||(me={})),function(e){e.IPC="ipc",e.WS="ws"}(ve||(ve={}));const be=()=>{if(!ye)throw new Error("CanvasManager not set");return ye},we=e=>{ye=e},Se=(e,t)=>be().createCanvas(e,t),Ie=e=>$e?e.getContext("2d",{willReadFrequently:!0}):e.getContext("2d"),_e=e=>be().loadImage(e),$e="undefined"!=typeof window&&void 0!==window.document&&void 0!==typeof window.document.createElement,Ce="object"==typeof self&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,ke="undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node,Ee="-",xe=`inner${Ee}`,Ae=`outer${Ee}`,Ne=`${Ae}input${Ee}`,Oe=`${Ae}output${Ee}`,Pe=`${xe}input${Ee}`,Le=`${xe}output${Ee}`,Te=e=>(new TextEncoder).encode(e),Be=e=>e===ie,je=e=>e&&void 0!==e.width&&void 0!==e.height&&void 0!==e.data&&e.data.constructor&&"Uint8ClampedArray"===e.data.constructor.name,De=e=>e&&void 0!==e.width&&void 0!==e.height&&void 0!==e.top&&void 0!==e.left&&"number"==typeof e.width&&"number"==typeof e.height&&"number"==typeof e.top&&"number"==typeof e.left,Ue=e=>e&&"number"==typeof e.x&&"number"==typeof e.y,Me=e=>"number"==typeof e?de.Number:"string"==typeof e?de.String:"boolean"==typeof e?de.Boolean:Array.isArray(e)?de.Array:je(e)?de.ImageData:e&&void 0!==e.duration&&void 0!==e.length&&void 0!==e.numberOfChannels&&void 0!==e.sampleRate&&"function"==typeof e.getChannelData&&"AudioBuffer"===e.constructor.name?de.AudioBuffer:e&&void 0!==e.byteLength?de.ArrayBuffer:De(e)?de.Rect:e&&void 0!==e.x&&void 0!==e.y&&"number"==typeof e.x&&"number"==typeof e.y?de.Point:de.JsonObj,Fe=e=>{const t={};let n;n=Array.isArray(e)?e[0]:e;for(const e in n){const r=Me(n[e]);t[e]=r}return t},Re=(e,t,n)=>"inner"===e?"input"===t?`${Pe}${n}`:`${Le}${n}`:"input"===t?`${Ne}${n}`:`${Oe}${n}`,We=e=>{const t=(e||"")?.split("_");if(t.length<3)throw new Error(`Unknown child identifier format [${e}]`);const n=t[0];return{portType:t[1],widgetId:n,portName:t[2]}},Ge=async e=>{try{return new ImageData(e.data,e.width,e.height,{colorSpace:e.colorSpace})}catch(t){console.warn("Failed to create ImageData from info, assuming raw image data",t);return await _e(e.data)}};var Ve,He;!function(e){e.Action="action",e.CustomInput="customInput"}(Ve=Ve||(Ve={})),function(e){e.input="input",e.counter="counter",e.play="play",e.elapsed="elapsed",e.ifGate="ifGate",e.skipEvent="skipEvent",e.between="between",e.map="map",e.parser="parser",e.slider="slider",e.suspend="suspend",e.display="display",e.json="json",e.arrayItem="arrayItem",e.extractImage="extractImage",e.imageConvolution="imageConvolution",e.firstEvent="firstEvent",e.pixelDraw="pixelDraw",e.randomBetween="randomBetween",e.arrayCombine="arrayCombine",e.clock="clock",e.multiplication="multiplication",e.object="object",e.widgetGroup="widgetGroup",e.script="script",e.base64ToImageData="base64ToImageData",e.jsonParse="jsonParse",e.text="text",e.imageCrop="imageCrop",e.imageResize="imageResize",e.value="value",e.imageWarp="imageWarp",e.widgetBundle="widgetBundle",e.sequence="sequence",e.variable="variable",e.hubService="hubService",e.imageFilter="imageFilter",e.recipeLoad="recipeLoad"}(He=He||(He={}));const ze={};let qe;const Ke=async e=>{const t=ze[e],n={name:ie,type:de.Boolean};if(t){const r={name:t.portName},i=t.data||{type:de.Boolean,value:!0};qe?(await qe(!0,t.targetWidgetId,t.thingId,t.recipePoolId,n.name,r,{...i,timestamp:Date.now()},[n]),"timeout"===t.type&&Je(e)):console.warn("Interrupt service has not been initialized")}},Je=e=>{const t=ze[e];return!!t&&(t.timerRef&&("interval"===t.type?clearInterval(t.timerRef):"timeout"===t.type&&clearTimeout(t.timerRef)),delete ze[e],!0)};var Ye={interruptHandler:Ke,createInterrupt:(e,t,n,i,s,o,a,c)=>{if(c&&ze[c])throw new Error("The given interrupt id already exists");const l=c||r().replace(/_/g,"-");if("interval"===e&&!o.interval)throw new Error(`Invalid interval. Expected a number greater than 0, but got '${o.interval}'`);if("timeout"===e&&!o.timeout)throw new Error(`Invalid timeout. Expected a number greater than 0, but got '${o.timeout}'`);if(ze[l]={data:a,portName:s,recipePoolId:t,targetWidgetId:i,thingId:n,type:e},"interval"===e)ze[l].timerRef=setInterval((async()=>await Ke(l)),o.interval);else{if("timeout"!==e)throw new Error(`Invalid interrupt type '${e}'`);ze[l].timerRef=setTimeout((async()=>await Ke(l)),o.timeout)}return l},destroyInterrupt:Je,destroyAllInterrupts:()=>{Object.keys(ze).forEach(Je)},setInvokeChildGateCb:e=>{qe=e}};const Xe=(e,t,n,r,i)=>{const s=ne(e,n,r);if(!s)return console.warn(`Gate ${r} not found in block ${n} for recipe ${e}`),null;const o=(t,i,s,o)=>Ye.createInterrupt(t,e,n,r,i,s,o),a=()=>Object.freeze({...s.state,...s.type===He.input&&{customInputs:[]}}),c=e=>{if("object"!=typeof e)return void console.warn(`Invalid state type [${typeof e}]. Expected an 'object'`);const t={...e,...s.type===He.input&&!e.customInputs&&{customInputs:[]}};s.state=t};if(i){return{getState:a,setState:c,registerInterrupt:o,getStorageData:async t=>{const r=((e,t,n)=>{const r=ee(e);if(!r)throw new Error(`Recipe [${e} does not exist]`);if(!r.storage)return null;const i=te(e,t);if(!i)throw new Error(`The Thing "${t}" does not exist in recipe ${e}`);if(!(i.storageUnits||[]).includes(n))throw new Error(`The Thing "${t}" has no access to storage unit "${n}"`);return r.storage[n]||null})(e,n,t);return r},recipePoolId:e,recipeType:t,thingRecipeId:n,widgetThingId:r}}return{getState:a,setState:c,recipePoolId:e,widgetId:r}},Ze=[10001,"Invalid `sourcePort` parameter"],Qe=[10002,"The gate [%s] does not exist. Have you called `loadWidgets` yet?"],et=[10110,"No storage medium has been loaded, call `loadMedium()` first"],tt=(e,...t)=>JSON.stringify({code:e[0],message:t[0]?o.format(e[1],...t):e[1].replace(/ \[%s\]/g,"")}),nt=()=>({inputName:"",dataType:de.Anything}),rt="output",it={processEvent:async(e,t)=>{const n=t.getState(),r={...nt(),...n};if(e.type===r.dataType||r.dataType===de.Anything)return t.nextWidget(rt,{type:e.type,value:e.value});console.error(`Invalid data type: ${e.type} for input: ${r.inputName}. Expected: ${r.dataType}`)},getOutputNames:e=>{const t={...nt(),...e};return[{name:rt,type:t.dataType}]},getInputNames:()=>[]},st=Object.freeze({in:"in",reset:"reset",increment:"increment"}),ot="output";var at={onParentEvent:async(e,t,n,r)=>{if(!e)throw new Error(tt(Ze));const i={currentValue:0,increment:1,...r.getState()};let s=i.increment,o=i.currentValue;const a=await r.getParentAtPort(st.increment);if(t.name===st.increment)return void(n.data.type===de.Number&&r.setState({...i,increment:Number(n.data.value)}));if(a){const e=a.getValue();null!==e&&(s=e)}if(t.name===st.reset)return r.setState({...i,currentValue:0});o+=s,r.setState({currentValue:o,increment:s});const c={type:de.Number,value:o};return r.nextGate(ot,c)},getInputNames:()=>[{name:st.in,type:de.Anything},{name:st.reset,type:de.Anything},{name:st.increment,type:de.Number}],getOutputNames:()=>[{name:ot,type:de.Number}]};const ct=Object.freeze({in:"in",reset:"reset"}),lt="output";var ut={onParentEvent:async(e,t,n,r)=>{const i={updatedAt:0,elapsed:0,...r.getState()},s=Date.now(),o=s-(i.updatedAt||s);return t.name===ct.reset?r.setState({...i,updatedAt:s,elapsed:0}):(r.setState({updatedAt:s,elapsed:o}),r.nextGate(lt,{type:de.Number,value:o}))},getInputNames:()=>[{name:ct.in,type:de.Anything},{name:ct.reset,type:de.Anything}],getOutputNames:()=>[{name:lt,type:de.Number}]};const dt=Object.freeze({data:"data",evaluation:"evaluation"}),pt="then",ht="else";var ft={onParentEvent:async(e,t,n,r)=>{const i={value:5,condition:"Equal",useDataPort:!1,...r.getState()},s=n.data.value,o=!isNaN(Number(s)),a="string"==typeof s;if(!i.useDataPort&&(n.data.type===de.Number||n.data.type===de.String||n.data.type===de.Anything&&o||n.data.type===de.Anything&&a)){let e=!1;return("Equal"===i.condition&&n.data.value==i.value||"Not Equal"===i.condition&&n.data.value!==i.value||"Greater"===i.condition&&n.data.value>Number(i.value)||"Less"===i.condition&&n.data.value<Number(i.value)||"Starts With"===i.condition&&String(n.data.value).startsWith(String(i.value))||"Ends With"===i.condition&&String(n.data.value).endsWith(String(i.value))||"Includes"===i.condition&&String(n.data.value).includes(String(i.value))||"Matches"===i.condition&&String(n.data.value).match(String(i.value)))&&(e=!0),e?r.nextGate(pt,n.data):r.nextGate(ht,n.data)}if((t.name===dt.evaluation&&n.data.type===de.Number||n.data.type===de.String||n.data.type===de.Anything&&(o||a))&&(i.$lastValue=n.data.value,r.setState({...i})),t.name===dt.data){let e=!1;return("Equal"===i.condition&&i.$lastValue==i.value||"Not Equal"===i.condition&&i.$lastValue!==i.value||"Greater"===i.condition&&Number(i.$lastValue)>Number(i.value)||"Less"===i.condition&&Number(i.$lastValue)<Number(i.value)||"Starts With"===i.condition&&String(i.$lastValue).startsWith(String(i.value))||"Ends With"===i.condition&&String(i.$lastValue).endsWith(String(i.value))||"Includes"===i.condition&&String(i.$lastValue).includes(String(i.value))||"Matches"===i.condition&&String(i.$lastValue).match(String(i.value)))&&(e=!0),r.setState({...i,$lastValue:void 0,$lastDataType:n.data.type}),e?r.nextGate(pt,n.data):r.nextGate(ht,n.data)}},getInputNames:e=>e.useDataPort?[{name:dt.data,type:de.Anything},{name:dt.evaluation,type:[de.Number,de.String]}]:[{name:"in",type:[de.Number,de.String]}],getOutputNames:e=>e.$lastDataType?[{name:pt,type:e.$lastDataType},{name:ht,type:e.$lastDataType}]:[{name:pt,type:[de.Number,de.String]},{name:ht,type:[de.Number,de.String]}]};const gt=Object.freeze({in:"in",reset:"reset"}),mt="out";var vt={onParentEvent:async(e,t,n,r)=>{const i={totalCalls:0,callsLimit:1,...r.getState()};return t.name===gt.reset?r.setState({...i,totalCalls:0}):(i.totalCalls=i.totalCalls+1,i.totalCalls>i.callsLimit?(i.totalCalls=0,r.setState(i),r.nextGate(mt,n.data)):void r.setState(i))},getInputNames:()=>[{name:gt.in,type:de.Anything},{name:gt.reset,type:de.Anything}],getOutputNames:()=>[{name:mt,type:de.Anything}]};const yt=Object.freeze({in:"in"}),bt="then",wt="else";var St={onParentEvent:async(e,t,n,r)=>{const i={min:1,max:10,...r.getState()};if(n.data.type===de.Number)return n.data.value>=i.min&&n.data.value<=i.max?r.nextGate(bt,n.data):r.nextGate(wt,n.data)},getInputNames:()=>[{name:yt.in,type:de.Number}],getOutputNames:()=>[{name:bt,type:de.Number},{name:wt,type:de.Number}]};const It=Object.freeze({in:"in"}),_t="out";var $t={onParentEvent:async(e,t,n,r)=>{const i={clamp:!0,...r.getState()},s=Number(n.data.value);if(void 0!==i.fromMax&&void 0!==i.fromMin&&void 0!==i.toMax&&void 0!==i.toMin&&""!==i.fromMax&&""!==i.fromMin&&""!==i.toMax&&""!==i.toMin&&(n.data.type===de.Number||n.data.type===de.Anything&&!isNaN(Number(s)))){let e=((e,t,n,r,i)=>(e-t)*(i-r)/(n-t)+r)(s,Number(i.fromMin),Number(i.fromMax),Number(i.toMin),Number(i.toMax));if(isNaN(e))return;return i.clamp&&(e<Number(i.toMin)&&(e=Number(i.toMin)),e>Number(i.toMax)&&(e=Number(i.toMax))),r.nextGate(_t,{type:de.Number,value:Number(e)})}},getInputNames:()=>[{name:It.in,type:de.Number}],getOutputNames:()=>[{name:_t,type:de.Number}]};const Ct=Object.freeze({in:"in"}),kt="out";var Et={onParentEvent:async(e,t,n,r)=>{const i={convertTo:"Integer",floatPlaces:2,...r.getState()};let s=n.data.value;if(n.data.type===de.Number||n.data.type===de.Anything||n.data.type===de.String){if((!isNaN(Number(s))||"string"==typeof s)&&!Array.isArray(s))return"Integer"===i.convertTo?s=parseInt(s):"Decimal"===i.convertTo?s=parseFloat(Number(s).toFixed(i.floatPlaces)):"String"===i.convertTo?s=String(s):"Abs"===i.convertTo?s=Math.abs(Number(s)):"Round"===i.convertTo&&(s=Math.round(Number(s))),r.nextGate(kt,{type:"String"===i.convertTo?de.String:de.Number,value:s})}},getInputNames:()=>[{name:Ct.in,type:de.Number}],getOutputNames:e=>{const t="String"===e?.convertTo?de.String:de.Number;return[{name:kt,type:t}]}};const xt=Object.freeze({in:"in"}),At="out";var Nt={onParentEvent:async(e,t,n,r)=>{const i={currentValue:50,min:0,max:100,...r.getState()};let s=!1;return i.currentValue<i.min&&(i.currentValue=i.min,s=!0),i.currentValue>i.max&&(i.currentValue=i.max,s=!0),s&&r.setState(i),r.nextGate(At,{type:de.Number,value:i.currentValue})},getInputNames:()=>[{name:xt.in,type:de.Anything}],getOutputNames:()=>[{name:At,type:de.Number}]};const Ot=Object.freeze({in:"in",reset:"reset"}),Pt="out";var Lt={onParentEvent:async(e,t,n,r)=>{const i={lastCalledAt:0,delayMs:500},s={lastCalledAt:0,delayMs:500,...r.getState()};if(t.name===Ot.reset)return r.setState({...s,lastCalledAt:0});const o=Date.now(),a=o-s.lastCalledAt;return s.lastCalledAt===i.lastCalledAt||a>=s.delayMs&&s.delayMs>0?(s.lastCalledAt=o,r.setState(s),r.nextGate(Pt,n.data)):void 0},getInputNames:()=>[{name:Ot.in,type:de.Anything},{name:Ot.reset,type:de.Anything}],getOutputNames:()=>[{name:Pt,type:de.Anything}]};const Tt="in";var Bt={onParentEvent:async()=>{},getInputNames:()=>[{name:Tt,type:[de.ImageData,de.Number]}],getOutputNames:()=>[]};const jt=()=>({properties:[{label:"property1",name:"property1"}],detectedProperties:{}}),Dt=(e,t)=>t.split(".").reduce(((e,t)=>null!=e?e[t]:e),e);var Ut={onParentEvent:async(e,t,n,r)=>{const i={properties:[{label:"property1",name:"property1"}],detectedProperties:{},...r.getState()},s=n?.data?.value,o=Array.isArray(s);if(n.data.type===de.JsonObj||n.data.type===de.Rect||n.data.type===de.Anything||o){let e=!1;for(const t in s){const n=Me(s[t]),r=!!i.detectedProperties[t],o=i.detectedProperties[t]?.type!==n;if(!r||o){const r=n===de.JsonObj||n===de.Rect||n===de.Array;i.detectedProperties[t]={type:n,...r?{shape:Fe(s[t])}:void 0},e=!0}}if(o&&void 0===i.detectedProperties.length&&(i.detectedProperties.length={type:de.Number}),e&&r.setState(i),s){const e=[];for(const t of i.properties||[]){const n=Dt(s,t.label),o=t.label.includes(".");if(void 0!==n){const s=o?Me(n):void 0!==i.detectedProperties[t.label]?.type?i.detectedProperties[t.label].type:de.Anything;e.push(r.nextGate(t.name,{type:s,value:n}))}}await Promise.allSettled(e)}}},getInputNames:()=>[{name:"in",type:de.JsonObj}],getOutputNames:e=>{const t={properties:[{label:"property1",name:"property1"}],detectedProperties:{},...e};return t.properties.map((e=>{const n=void 0!==t.detectedProperties[e.label]?t.detectedProperties[e.label]?.type:de.Anything,r=t.detectedProperties[e.label]?.shape||void 0,i="string"==typeof e;return{name:i?e:e.name,label:i?e:e.label,type:n,jsonShape:r}}))},getDefaultState:jt};const Mt="output",Ft="noItem";var Rt={onParentEvent:async(e,t,n,r)=>{const i={index:0,...r.getState()};let s=i.index;const o=n.data.value,a="string"==typeof n.data.value,c=Array.isArray(n.data.value);if(n.data.type===de.Anything&&(c||a)||n.data.type===de.String&&a||n.data.type===de.Array&&c){s<0&&(s=o.length+s);const e=a?de.String:Me(o[s]);return e!==i.$$lastDetectedType&&r.setState({...i,$$lastDetectedType:e}),void 0!==o[s]?r.nextGate(Mt,{value:o[s],type:e}):r.nextGate(Ft,{value:!0,type:de.Boolean})}},getInputNames:()=>[{name:"in",type:[de.Array,de.String]}],getOutputNames:e=>[{name:Mt,type:e.$$lastDetectedType??de.Anything},{name:Ft,type:de.Boolean}]};const Wt=Object.freeze({image:"image",rect:"rect"}),Gt="image";var Vt={onParentEvent:async(e,t,n,r)=>{const i={offset:{height:0,left:0,top:0,width:0},...r.getState()},s=await r.getParentAtPort(Wt.rect),o=[de.Anything,de.Rect,de.JsonObj];if(t.name!==Wt.rect){if(s){const e=s.getValue();null!==e&&(i.rect={...e},r.setState(i))}if(!$e)return n.data.type===de.ImageData?r.nextGate(Gt,n.data):void 0;if(i.$$canvasFrom&&i.$$canvasFrom.getContext||(i.$$canvasFrom=Se(320,240)),i.$$canvasTo&&i.$$canvasTo.getContext||(i.$$canvasTo=Se(320,240)),(n.data.type===de.ImageData||n.data.type===de.Anything&&je(n.data.value))&&!i.$$processing&&i.$$canvasFrom&&i.rect){const e=((e,t,n,r,i)=>{if(r&&r.getContext){const s=r.getContext("2d"),o=n.getContext("2d");if(s&&o){n.width=e.width,n.height=e.height,o.putImageData(e,0,0);const a={...i};i&&(a.height=Number(i.height),a.width=Number(i.width),a.left=Number(i.left),a.top=Number(i.top));const c={top:0,width:0,left:0,height:0,...a};return i&&(Number.isInteger(c.width)||(c.width=t.width*c.width),Number.isInteger(c.height)||(c.height=t.height*c.height),Number.isInteger(c.left)||(c.left=t.left+t.width*c.left),Number.isInteger(c.top)||(c.top=t.top+t.height*c.top)),r.width=t.width+c.width,r.height=t.height+c.height,s.drawImage(n,t.left+c.left,t.top+c.top,t.width+c.width,t.height+c.height,0,0,r.width+c.width,r.height+c.height),s.getImageData(0,0,r.width||1,r.height||1)}}return e})(n.data.value,i.rect,i.$$canvasFrom,i.$$canvasTo,i.offset);return r.nextGate(Gt,{type:de.ImageData,value:e})}}else De(n.data.value)&&o.includes(n.data.type)&&r.setState({...i,rect:n.data.value})},getInputNames:()=>[{name:Wt.image,type:de.ImageData},{name:Wt.rect,type:[de.Rect,de.JsonObj]}],getOutputNames:()=>[{name:Gt,type:de.ImageData}]};const Ht=(e,t)=>{const n=Math.round(Math.sqrt(t.length)),r=Math.floor(n/2),i=e.data,s=e.width,o=e.height,a=s,c=o,l=((e,t,n)=>{if($e)return new ImageData(t,n);return console.warn("Node environment detected. Aborting new ImageData creation"),e})(e,a,c),u=l.data;for(let e=0;e<c;e++)for(let c=0;c<a;c++){const l=e,d=c,p=4*(e*a+c);let h=0,f=0,g=0,m=0;for(let e=0;e<n;e++)for(let a=0;a<n;a++){const c=l+e-r,u=d+a-r;if(c>=0&&c<o&&u>=0&&u<s){const r=4*(c*s+u),o=t[e*n+a];h+=i[r]*o,f+=i[r+1]*o,g+=i[r+2]*o,m+=i[r+3]*o}}u[p]=h,u[p+1]=f,u[p+2]=g,u[p+3]=m+1*(255-m)}return l},zt=[-1,0,1,-2,0,2,1,0,1],qt=Object.freeze({image:"image"}),Kt="image";var Jt={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={matrix:[...zt],...i};if(n.data.type===de.ImageData||n.data.type===de.Anything&&je(n.data.value)){const e=Ht(n.data.value,s.matrix);return r.nextGate(Kt,{type:de.ImageData,value:e})}},getInputNames:()=>[{name:qt.image,type:de.ImageData}],getOutputNames:()=>[{name:Kt,type:de.ImageData}]};const Yt=Object.freeze({output:"output",aborted:"aborted"}),Xt=()=>({inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0}),Zt=e=>{const t={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...e},n=Array(t.inputs).fill(0).map(((e,t)=>({name:`input${t+1}`,type:de.Anything})));return n.push({name:"reset",type:de.Anything}),n};var Qt={onParentEvent:async(e,t,n,r)=>{const i={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...r.getState()};if("reset"===t.name)return r.setState({...i,triggeredAt:0});const s=Date.now(),o=s-i.triggeredAt;if(i.triggeredAt&&!(o>=i.delayMs&&i.delayMs>0)&&i.delayMs)return r.nextGate(Yt.aborted,n.data);{i.triggeredAt=s;const e=Zt(i,(r.recipePoolId,r.recipeType,r.thingRecipeId,r.id)).findIndex((e=>e.name===t.name));-1!==e&&(i.lastInputIndex=e),i.matchingOutputs?-1!==e&&await r.nextGate(`output${e+1}`,n.data):await r.nextGate(Yt.output,n.data),r.setState(i)}},getInputNames:Zt,getOutputNames:e=>{const t={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...e};if(e.matchingOutputs){const e=Array(t.inputs).fill(0).map(((e,t)=>({name:`output${t+1}`,type:de.Anything})));return e.push({name:Yt.aborted,type:de.Anything}),e}return[{name:Yt.output,type:de.Anything},{name:Yt.aborted,type:de.Anything}]},getDefaultState:Xt};const en=(e,t,n,r,i,s)=>{if(i){const o=e.measureText(i),a=o.fontBoundingBoxAscent+o.fontBoundingBoxDescent;e.fillStyle=r,e.fillRect(t,n-s,1.1*o.width,a),e.font=`${s}px Arial`,e.fillStyle="black",e.fillText(i,t,n)}},tn=(e,t,n,r,i,s,o)=>{e.fillStyle=i,e.fillRect(t,n,r,r),en(e,t,n,i,s,o)},nn=(e,t,n,r,i,s)=>{e.beginPath(),e.strokeStyle=r,e.lineWidth=n,e.rect(t.left,t.top,t.width,t.height),e.stroke();const o=n/2;en(e,t.left-o,t.top-o,r,i,s)},rn=Object.freeze({image:"image",pixels:"pixels"}),sn="image";var on={onParentEvent:async(e,t,n,r)=>{const i={fontSize:12,color:"#00ff00",size:2,...r.getState()},s=n.data.type===de.ImageData||n.data.type===de.Anything&&je(n.data.value);if(t.name===rn.pixels){const e=((e,t)=>t===de.Anything&&(je(e)||Ue(e)||De(e)||Array.isArray(e))||t===de.Array||t===de.Rect||t===de.Point)(n.data.value,n.data.type);if(!e)return;i.$$pixels=n.data.value}if(t.name===rn.image&&s){const e=n.data.value;i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(e.width||1,e.height||1)),i.$$lastFrame=e}if(i.$$lastFrame&&i.$$pixels&&i.$$memCanvas){const e=(e=>{const{sourceImage:t,pixels:n,memCanvas:r,size:i,color:s,labelProp:o,fontSize:a}=e;if(r){const e=Ie(r);if(e){r.width!==t.width&&(r.width=t.width),r.height!==t.height&&(r.height=t.height),e.putImageData(t,0,0);const c=Array.isArray(n)?n:[n];for(let t=0;t<c.length;t++){const n=c[t],r=o?n[o]:"";De(n)?nn(e,n,i,s,r,a):Ue(n)&&tn(e,n.x,n.y,i,s,r,a)}return e.getImageData(0,0,r.width,r.height)}}return t})({sourceImage:i.$$lastFrame,pixels:i.$$pixels||[],memCanvas:i.$$memCanvas,size:i.size,color:i.color,labelProp:i.labelProp,fontSize:i.fontSize});return r.setState({...i,$$lastFrame:void 0,$$pixels:void 0}),r.nextWidget(sn,{type:de.ImageData,value:e})}r.setState(i)},getInputNames:()=>[{name:rn.image,type:de.ImageData},{name:rn.pixels,type:[de.Rect,de.Point,de.Array]}],getOutputNames:()=>[{name:sn,type:de.ImageData}]};const an=Object.freeze({in:"in"}),cn="output",ln=e=>{const t=String(e).split(".");return t.length<2?0:t[1].length};var un={onParentEvent:async(e,t,n,r)=>{const i={min:1,max:100,...r.getState()},s=!Number.isInteger(i.min),o=!Number.isInteger(i.max),a=s||o;let c=(l=i.min,u=i.max,Math.random()*(u-l)+l);var l,u;if(a){let e=0;if(s&&(e=ln(i.min)),o){const t=ln(i.max);t>e&&(e=t)}c=Number(c.toFixed(e))}else c=Math.floor(c);return r.nextGate(cn,{type:de.Number,value:c})},getInputNames:()=>[{name:an.in,type:de.Anything}],getOutputNames:()=>[{name:cn,type:de.Number}]};const dn=Object.freeze({output:"output",totalItems:"totalItems"}),pn=Object.freeze({trigger:"trigger",clear:"clear"}),hn=()=>({totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1}),fn=async(e,t)=>t.nextGate(dn.totalItems,{type:de.Number,value:e});var gn={onParentEvent:async(e,t,n,r)=>{const i={totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1,...r.getState()};if(t.name===pn.clear)return i.$$list=[],i.properties?.autoFilled&&delete i.properties,r.setState(i),fn(i.$$list.length,r);const s=t.name===pn.trigger;if(!s)if(Array.isArray(n.data.value))n.data.type!==de.Array&&n.data.type!==de.Anything||(i.$$outputShape={...i.$$outputShape,...e?.jsonShape},i.$$list=i.$$list.concat(n.data.value),r.setState({...i}),await fn(i.$$list.length,r));else{const t=`$$primitive_${Object.keys(i.$$outputShape).length}`;n.data.type===de.JsonObj?i.$$outputShape={...i.$$outputShape,...e?.jsonShape?e.jsonShape:void 0}:i.$$outputShape={...i.$$outputShape,[t]:n.data.type},i.$$list.push(n.data.value),r.setState({...i}),await fn(i.$$list.length,r)}if(s){Object.keys(i.$$outputShape).length&&(i.properties={autoFilled:!0,jsonShape:{...i.$$outputShape}});const e=i.$$list.length,t=[...i.$$list];return i.$$list=[],r.setState({...i}),await fn(e,r),r.nextGate(dn.output,{type:de.Array,value:t})}},getInputNames:e=>{const t={totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1,...e},n=Array(t.totalInputs||1).fill(0).map(((e,t)=>({name:`array${t+1}`,type:de.Array})));return n.push({name:pn.clear,type:de.Anything},{name:pn.trigger,type:de.Anything}),n},getOutputNames:e=>[{name:dn.output,type:de.Array,...e.properties?{jsonShape:e.properties?.jsonShape}:void 0},{name:dn.totalItems,label:"Total Items",type:de.Number}],getDefaultState:hn};const mn=Object.freeze({start:"start",stop:"stop"}),vn="output",yn="clock_interrupt";var bn={onParentEvent:async(e,t,n,r)=>{const i={enabled:!1,interval:1e3,intervalMode:"ms",...r.getState()};if(Be(e?.name||"")&&t.name===yn)return r.nextGate(vn,{type:de.Boolean,value:!0});if(t.name===mn.stop&&i.enabled&&i.$$interruptId){r.cancelInterrupt(i.$$interruptId)?(i.enabled=!1,i.$$interruptId=void 0,r.setState(i)):console.warn(`Failed to cancel interrupt [${i.$$interruptId}]`)}else t.name!==mn.start||i.enabled||i.$$interruptId||(i.$$interruptId=r.registerInterrupt("interval",yn,{interval:i.interval}),i.enabled=!0,r.setState(i))},getInputNames:()=>[{name:mn.start,type:de.Anything},{name:mn.stop,type:de.Anything}],getOutputNames:()=>[{name:vn,type:de.Boolean}],initialize:async e=>{const t=e.getState();if(t.enabled&&!t.$$interruptId){const n=e.registerInterrupt("interval",yn,{interval:t.interval});e.setState({...t,$$interruptId:n})}}};const wn=Object.freeze({in:"in"}),Sn="output",In=(e,t,n)=>"number"==typeof e?Number((e*t).toFixed(n)):e;var _n={onParentEvent:async(e,t,n,r)=>{const i={userProperties:[],factor:2,decimalPoints:2,...r.getState()},s=n.data.type;let o=n.data.value,a=!1;return e?.jsonShape&&(i.detectedInputJson={...i.detectedInputJson,...e?.jsonShape},a=!0),i.detectedInputType||(i.detectedInputType=s,a=!0),n.data.type===de.Array&&("number"==typeof n.data.value?.[0]?o=((e,t,n)=>{const r=(e||[]).map((e=>In(e,t,n)));return r})(n.data.value,i.factor,i.decimalPoints):"object"==typeof n.data.value?.[0]&&(o=((e,t,n,r)=>{const i=(e||[]).map((e=>{const i={...e};return Object.keys(i).forEach((e=>{r?.length&&!r?.includes(e)||(i[e]=In(i[e],t,n))})),i}));return i})(n.data.value,i.factor,i.decimalPoints,i.userProperties))),n.data.type===de.Number&&(o=In(n.data.value,i.factor,i.decimalPoints)),a&&r.setState(i),r.nextGate(Sn,{type:s,value:o})},getInputNames:()=>[{name:wn.in,type:[de.Array,de.Number]}],getOutputNames:e=>[{name:Sn,type:e.detectedInputType||de.Number,jsonShape:e.detectedInputJson}]};const $n=Object.freeze({output:"output"}),Cn=Object.freeze({trigger:"trigger"}),kn=()=>({useTriggerPort:!0,properties:[{name:"x",label:"x",type:de.Number,value:10},{name:"y",label:"y",type:de.Number,value:20}]}),En=e=>{const t={};for(let n=0;n<e.properties.length;n++)t[e.properties[n].label]=e.properties[n].type;return t},xn=e=>{const t={};for(let n=0;n<e.properties.length;n++){let r=e.properties[n].value;const i=e.properties[n].type;i===de.Number?r=Number(r):i===de.String&&(r=String(r)),t[e.properties[n].label]=r}return t};var An={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s=structuredClone(i),o={...kn(),...s};if(t.name===Cn.trigger){const e=xn(o);return r.nextGate($n.output,{type:de.JsonObj,value:e})}const a=o.properties.findIndex((e=>e.name===t.name));if(-1!==a){let e=n.data.type===o.properties[a].type;if(!e&&n.data.type===de.Anything){e=Me(n.data.type)===o.properties[a].type}if(e?(o.properties[a].value=n.data.value,o.properties[a].$$invalidInputType=!1):o.properties[a].$$invalidInputType=!0,r.setState(o),!o.useTriggerPort){const e=xn(o);return r.nextGate($n.output,{type:de.JsonObj,value:e})}}},getInputNames:e=>{const t={...kn(),...e},n=t.properties.map((e=>({name:e.name,label:e.label,type:e.type})));return t.useTriggerPort&&n.push({name:Cn.trigger,label:Cn.trigger,type:de.Anything}),n},getOutputNames:e=>[{name:$n.output,label:$n.output,type:de.JsonObj,jsonShape:En(e)}],getDefaultState:kn};const Nn=async e=>{const t=(e,t)=>e.split(t)[1];if(e.startsWith(Ne)){const n=t(e,Ne);return Re("inner","input",n)}if(e.startsWith(Le)){const n=t(e,Le);return Re("outer","output",n)}return null},On=()=>({canvasPosition:{x:0,y:0},canvasZoom:1,inputs:[{name:"input",type:[de.Anything],index:0}],outputs:[{name:"output",type:[de.Anything],index:0}],name:"Custom Widget 1",description:"",type:"custom"}),Pn=e=>{const t={...On(),...e},n=t.inputs.map(((e,t)=>({name:Re("outer","input",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!1,index:t}))),r=t.outputs.map(((e,t)=>({name:Re("inner","output",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!0,index:n.length+t})));return[...n,...r]};var Ln={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={...On(),...i},o=Pn(s,(r.recipePoolId,r.recipeType,r.thingRecipeId,r.id));for(let e=0;e<o.length;e++){const i=o[e];if(t.name===i.name&&(i.type.includes(de.Anything)||i.type.includes(n.data.type))){const e=await Nn(t.name);e&&await r.nextWidget(e,{type:n.data.type,value:n.data.value})}}},getInputNames:Pn,getOutputNames:e=>{const t={...On(),...e},n=t.outputs.map(((e,t)=>({name:Re("outer","output",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!1,index:t})));return[...t.inputs.map(((e,t)=>({name:Re("inner","input",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!0,index:t+n.length}))),...n]},getDefaultState:On};const Tn=(e,t,n,r,i)=>{const s=4*(t*n.width+e),o=n.data[s],a=n.data[s+1],c=n.data[s+2];return Math.abs(o-r.r)<=i&&Math.abs(a-r.g)<=i&&Math.abs(c-r.b)<=i};var Bn,jn,Dn,Un,Mn,Fn,Rn,Wn,Gn,Vn,Hn={getPixelValueAtIndex:(e,t)=>{const n=e.data,r=n[t]||0,i=n[t+1]||0,s=n[t+2]||0;return{avr:(r+i+s)/3,r:r,g:i,b:s}},getBoundingBox:(e,t,n)=>{const r=e.width,i=e.height,s=new Set,o=Number(n.threshold||0),a=isNaN(o)?10:o,c=(n,o)=>{const c=[[n,o]];let l=n,u=n,d=o,p=o;for(;c.length>0;){const n=c.shift();if(!n)continue;const[o,h]=n;o<0||h<0||o>=r||h>=i||s.has(`${o},${h}`)||!Tn(o,h,e,t,a||0)||(s.add(`${o},${h}`),l=Math.min(l,o),u=Math.max(u,o),d=Math.min(d,h),p=Math.max(p,h),c.push([o+1,h],[o-1,h],[o,h+1],[o,h-1]))}return{minX:l,maxX:u,minY:d,maxY:p}},l=[];for(let o=0;o<i;o+=4)for(let i=0;i<r;i+=4)if(!s.has(`${i},${o}`)&&Tn(i,o,e,t,a)){const{minX:e,maxX:t,minY:r,maxY:s}=c(i,o),a=t-e,u=s-r;if(a>=(n.minWidth||1)&&u>=(n.minHeight||1)&&l.push({left:e,top:r,width:a,height:u}),n.maxBoxes&&l.length>=n.maxBoxes)return l}return l},copyImageData:e=>new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),setPixelValueAtIndex:(e,t,n)=>{const r=e.data,i="object"==typeof n,s=i?n.r:n,o=i?n.g:n,a=i?n.b:n;r[t]=s,r[t+1]=o,r[t+2]=a,r[t+3]=255}};!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(Bn||(Bn={})),function(e){e.Bundle="bundle",e.Group="group"}(jn||(jn={})),function(e){e.Hardware="hardware",e.Virtual="virtual"}(Dn||(Dn={})),function(e){e.Cloud="cloud",e.Web="web"}(Un||(Un={})),function(e){e.Cpu_128M="kmu-cpu-128m",e.Cpu_256M="kmu-cpu-256m",e.Cpu_512M="kmu-cpu-512m",e.Cpu_1024M="kmu-cpu-1024m",e.Cpu_2048M="kmu-cpu-2048m",e.Cpu_4096M="kmu-cpu-4096m"}(Mn||(Mn={})),function(e){e.Gateway="gateway",e.Timer="timer"}(Fn||(Fn={})),(Rn||(Rn={})).InstallInProgress="installation-in-progress",function(e){e.InstallDependencies="install-dependencies",e.GetInstalledDependencies="get-installed-dep"}(Wn||(Wn={})),function(e){e.Success="success",e.Error="error",e.Pending="pending"}(Gn||(Gn={})),function(e){e.NotFound="not-found",e.BadRequest="bad-request",e.Forbidden="forbidden",e.InternalError="internal-error"}(Vn||(Vn={}));let zn=null;var qn=()=>{if(!zn)throw new Error("Required function is not set");return zn};class Kn extends Error{constructor(e,t){super(e),this.name="UserCodeError",t&&(this.stack=t)}}const Jn=(e,t)=>`\n\t\tfunction _user_code_(){\n\t\t\t${t===Bn.Browser?"\n\t\t\tvar global = {\n\t\t\t\t__user_code: true\n\t\t\t};\n\t\t\tvar process = {};\n\t\t\tvar console = this.console;\n\t\t\tvar globalThis = global;\n\t\t\tvar require = this.___notSupportedMethod;\n\t\t\t":"\n\t\t\tvar require = this.require;\n\t\t\tvar process = this.kemuProcess;\n\t\t\t"}\n\n\t\t\tvar eval = () => {};\n\t\t\tvar document = {};\n\t\t\tvar navigator = {};\n\t\t\tvar window = this.window;\n\t\t\tvar alert = this.notify.info;\n\t\t\tvar DataType = this.dataTypesEnum;\n\t\t\tvar setInterval = this.setInterval;\n\t\t\tvar setTimeout = this.setTimeout;\n\t\t\tvar addEventListener = this.addEventListener;\n\t\t\tvar removeEventListener = this.removeEventListener;\n\t\t\tvar requestAnimationFrame = this.___notSupportedMethod;\n\t\t\tvar __delay = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms, reject));\n\n\t\t\tvar Kemu = {\n\t\t\t\tservices: {\n\t\t\t\t\thttp: { ...this.httpWebService },\n\t\t\t\t\tdynamoDb: { ...this.dynamoService },\n\t\t\t\t\tgoogleSheets: {\n\t\t\t\t\t\t...this.googleSheetsService,\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\timage: this.imageHelpers,\n\t\t\t\tvariable: this.variablesManager,\n\n\t\t\t\thelpers: {\n\t\t\t\t\tcryptoJS: this.CryptoJS,\n\t\t\t\t\tjsonp: this.jsonp,\n\t\t\t\t\tdelay: __delay,\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar sendToPort;\n\n\t\t\t// --- User Methods Start ---\n\t\t\t${e||""};\n\t\t\t// --- User Methods End ---\n\t\t\t\n\t\t\t// Processes the user code asynchronously.\n\t\t\tconst asyncProcessEvent = async (targetPort, sourcePort, event) => {\n\t\t\t\tconst userProcessEvent = typeof processEvent === 'undefined' ? undefined : processEvent;\n\t\t\t\tif(userProcessEvent) {\n\t\t\t\t\ttry{\n\t\t\t\t\t\treturn await userProcessEvent(targetPort, sourcePort, event, sendToPort);\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** invoked the very first time the recipe is initialized */\n\t\t\tconst asyncRecipeInit = async (context, logger) => {\n\t\t\t\ttry {\n\t\t\t\t\t${t===Bn.Browser?"if(logger) { console = logger; }":""}\n\t\t\t\t\tif(typeof recipeInit === 'function') {\n\t\t\t\t\t\treturn recipeInit(context);\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** invoked every time the code is about to be replaced */\n\t\t\tconst asyncOnTerminate = async (context) => {\n\t\t\t\ttry {\n\t\t\t\t\tif(typeof onTerminate === 'function') {\n\t\t\t\t\t\treturn onTerminate(context);\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** updates the function that allows widget contexts to send data to the next widget */\n\t\t\tconst setSendToPort = (sendNextFun) => {\n\t\t\t\tsendToPort = sendNextFun;\n\t\t\t}\n\n\t\t\t/** invoked the every time the user code is compiled. */\n\t\t\tconst asyncMainEvent = async (sendNextFun, logger) => {\n\t\t\t\ttry{\n\t\t\t\t\tsetSendToPort(sendNextFun);\n\t\t\t\t\tif(logger) { console = logger; }\n\t\t\t\t\tif(typeof main === 'function'){\n\t\t\t\t\t\treturn main();\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tasyncProcessEvent: asyncProcessEvent,\n\t\t\t\tmain: asyncMainEvent,\n\t\t\t\trecipeInit: asyncRecipeInit,\n\t\t\t\tsetSendToPortFun: setSendToPort,\n\t\t\t\tonTerminate: asyncOnTerminate,\n\t\t\t\tgetLocalContext: () => global,\n\t\t\t\tgetWidgetInputs: typeof getWidgetInputs === 'undefined' ? undefined : getWidgetInputs,\n\t\t\t\tgetWidgetOutputs: typeof getWidgetOutputs === 'undefined' ? undefined : getWidgetOutputs,\n\t\t\t};\n\t\t}\n\t\t\n\t\treturn function compiler(context){\n\t\t\treturn _user_code_.call(context)\n\t\t}\n\n\t\treturn compiler;\n\t`,Yn=(e,t,n,r)=>{const o=Jn(e,n),a={...t,document:{},__errorTracer:e=>{throw new Kn(e.message,e.stack)},__jest:void 0===globalThis.__jest?void 0:globalThis.__jest,___notSupportedMethod:()=>r?.error("This method is not supported."),console:console,setInterval:()=>r?.error("'setInterval' is not supported. Please use a \"Timer\" widget instead."),setTimeout:t?.setTimeout,imageHelpers:Hn,...n===Bn.Cloud?{require:qn(),kemuProcess:process.env.KEMU_PROCESS?process.env.KEMU_PROCESS:{}}:{},jsonp:i,CryptoJS:s,window:{addEventListener:t?.addEventListener,removeEventListener:t?.removeEventListener}};try{const e="browser"===(()=>{if($e)return"browser";if(ke)return"node";if(Ce)return"worker";throw new Error("Unsupported environment")})()?(e=>e.replace(/[//]{2}[ ]*@kemu-cloud[ \t]*\{[\s\S]*?[//]{2}[ ]*@kemu-cloud[ \t]*\}/gim,""))(o):(e=>e.replace(/[//]{2}[ ]*@kemu-browser[ \t]*\{[\s\S]*?[//]{2}[ ]*@kemu-browser[ \t]*\}/gim,""))(o),t=new Function(e);return{compiledModule:t()(a)}}catch(e){return{error:{name:"CompileError",message:e.message,stack:e.stack}}}},Xn="main",Zn=()=>({pauseExecution:!1,autoPauseOnError:!0,$$eventListeners:{},pages:{[Xn]:{code:"\nconst getWidgetInputs = () => [\n\t{ name: 'Input 1', type: DataType.Number }\n];\n\nconst getWidgetOutputs = () => [\n\t{ name: 'Output 1', type: DataType.Number }\n]\n\nlet counter = 0;\n\nconst processEvent = async (targetPort, sourceWidget, event) => {\n\tif(targetPort.name === 'Input 1'){\n\t\treturn sendToPort('Output 1', {\n\t\t\ttype: DataType.Number,\n\t\t\tvalue: counter++,\n\t\t});\n\t}\n}\n",language:"javascript",name:"My First Script"}},consoleVisible:!1,$$consoleLines:[]}),Qn=(e,t)=>{const n={message:"Unknown Error"};if(e?.stack){const r=e?.stack?.split(":")[0].trim();n.type=r;const i=(e=>{const t=/,[ ]?<anonymous>:([0-9]+:[0-9]+)\)/gm;let n;for(;null!==(n=t.exec(e));){n.index===t.lastIndex&&t.lastIndex++;const e=n[1].split(":");if(2===e.length)return{line:Number(e[0])||0,column:Number(e[1])||0}}return null})(e.stack);i&&(n.line=i.line-(e=>{const t="___user_code_section___";return Jn(t,e).split(t)[0].split("\n").length+2})(t),n.column=i.column)}return e.message&&(n.message=e.message),n},er=(e,t)=>{const n={...Zn(),...t.getState()},r={...n,...e?{$$error:e}:void 0,...n.autoPauseOnError&&e?{pauseExecution:!0}:void 0};e&&(r.$$consoleLines=[...r.$$consoleLines,{type:"error",text:e.message,timestamp:Date.now(),fileName:Xn}]),t.setState(r)};var tr,nr;!function(e){e.ServiceCreationLog="service-creation-log"}(tr=tr||(tr={})),function(e){e.Service="service",e.ServiceUI="serviceUI"}(nr=nr||(nr={}));const rr=new a,ir=(e,t,n)=>{const r=te(e,t);if(!r)throw new Error(`Thing ${t} not found in recipe ${e}`);const i=r.gates[n];if(!i)throw new Error(`Widget ${n} not found in thing ${t}`);return i},sr=(e,t,n)=>`${t}:${n}:${e}`,or=e=>`${e}:new-var`,ar=e=>`value-change:${e}`,cr=async(e,t,n,r,i,s,o)=>{const a={...o},c={thingId:n,recipeId:t,variableName:e,changes:s,ownerId:r,callerWidgetId:i,varDefinition:Object.freeze(a)};if(s.includes("added")){const e=or(n);return rr.emit(e,c)}{const t=sr(e,n,r);return s.includes("value")&&(await rr.emit(ar(e),c),await rr.emit(ar("*"),c)),rr.emit(t,c)}},lr=(e,t,n,r)=>{const i=ir(e,t,r);i.variablesListener={...i.variablesListener,[n]:0},dr(e,t)},ur=(e,t,n,r)=>{const i=ir(e,t,r),s={...i.variablesListener};void 0!==i.variablesListener?.[n]&&(delete s[n],i.variablesListener=s)},dr=async(e,t)=>{const n=te(e,t);if(!n)throw new Error(`Thing "${t}" not found in recipe "${e}"`);const r={...n.variables},i=Object.keys(r);for(const s of i){const i=r[s],o=Object.keys(i);for(const i of o){!n.gates[i]&&(delete r[s][i],await cr(s,e,t,i,void 0,["removed"],null))}0===Object.keys(r[s]).length&&delete r[s]}n.variables=r},pr=(e,t,n)=>{for(const r in t){const i=t[r];if(i.createdByWidgetId===e.id)return i;if(e.type===He.variable&&i.ownerType===He.variable)return i;if(e.type===He.script){const t=i.createdByWidgetId===e.groupId,r=n[i.createdByWidgetId];if(!r)continue;const s=r.groupId===e.groupId;if(t||r.type===He.variable&&s)return i}}return null};var hr=async(e,t,n,r,i,s)=>{const o=te(e,t);if(!o)throw new Error(`Thing ${t} not found in recipe ${e}`);const a={...o.variables};a[r]=a[r]||{};const c=a[r],l=o.gates[n];if(!l)throw new Error(`Widget ${n} not found in thing ${t}`);const u=Object.values(c);let d=!1,p=!1;const h=async i=>cr(r,e,t,i.createdByWidgetId,n,["value"],i);if(l.type===He.variable){d=!0;for(const e of u)e.ownerType===He.variable&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}if(l.type===He.script){d=!0;for(const e of u){const t=e.createdByWidgetId===l.groupId,n=o.gates[e.createdByWidgetId],r=n?.type===He.variable,s=n?.groupId===l.groupId;(t||r&&s)&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}}if(!d){d=!0;for(const e of u){e.createdByWidgetId===n&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}}if(!s?.skipNotifications&&p){const a=Object.values(o.gates);for(const o of a){if(o.id===n&&s?.skipCallerNotification)continue;const a=o.variablesListener?.[r];void 0!==a&&await os(o.id,t,e,`${ce}${r}`,i)}}},fr=(e,t,n,r)=>{const i=te(e,t);if(!i)throw new Error(`Thing ${t} not found in recipe ${e}`);if(!r.readerWidgetId&&!r.ownerWidgetId)throw new Error("readerWidgetId or ownerWidgetId must be provided");const s={...i.variables}[n];if(!s)return;if(r.ownerWidgetId){const e=s[r.ownerWidgetId];return e?.value}const o=i.gates[r.readerWidgetId];if(!o)throw new Error(`Widget ${r.readerWidgetId} not found in thing ${t}`);const a=pr(o,s,i.gates);return a?a.value:null},gr=lr,mr=ur,vr=(e,t)=>rr.on(ar(e),(e=>{if(e.varDefinition)return t({type:e.varDefinition.type,value:e.varDefinition.value,varName:e.variableName})}));const yr="setTimeout",br="variableChanged",wr=e=>{const{recipePoolId:t,thingId:n,scriptWidgetId:r}=e;if(!ne(t,n,r))throw new Error(`Widget "${r}" not found in recipe "${t}"`);return{get:(e,i)=>{const s=fr(t,n,e,{readerWidgetId:r});if(null===s){if(void 0===i)throw new Error(`Variable "${e}" is not defined`);return i}return s},set:async(e,i)=>{await hr(t,n,r,e,{type:Me(i),value:i})},onValueChange:(i,s)=>{if(!e.setState)return void console.warn("Cannot subscribe to variable changes without a setState function");gr(t,n,i,r);const o={...Zn(),...e.getState()};o.$$eventListeners[i]={handler:s,abort:async()=>{mr(t,n,i,r)},name:br},e.setState(o)}}},Sr="__command-compile__";let Ir;const _r=()=>{console.log("Method not implemented")},$r=(e,t,n)=>{const i=(e,...n)=>{const r={...Zn(),...t.getState()}.$$eventListeners[e];r&&r.handler(n)},s={};return Object.keys(de).forEach((e=>{s[e]=de[e]})),{dataTypesEnum:s,notify:{success:e=>{t.getState()?.$$managedUI?.notify?.success(e)},error:e=>{t.getState()?.$$managedUI?.notify?.error(e)},info:e=>{t.getState()?.$$managedUI?.notify?.info(e)}},variablesManager:e.variablesManager?wr({recipePoolId:n.recipePoolId,scriptWidgetId:n.widgetId,thingId:n.thingId,getState:t.getState,setState:t.setState}):{get:_r,set:async()=>_r(),onValueChange:_r},setTimeout:(n,i,s)=>{if(e.withTimers&&t&&t.setState&&t.registerInterrupt){const e=r(),o={...Zn(),...t.getState()};o.$$eventListeners[e]={handler:n,rejectHandler:s,name:yr},t.setState(o),t.registerInterrupt("timeout",e,{timeout:i},void 0,e)}},addEventListener:(e,n)=>{if(t.setState){const s=r(),o={...Zn(),...t.getState()};o.$$eventListeners[s]={handler:n,name:e},t.setState(o),window.addEventListener(e,i.bind(s))}else console.warn(`Cannot remove event listener '${e}' because the widget context is not available.`)},removeEventListener:(e,n)=>{if(t.setState){const r={...Zn(),...t.getState()},i=Object.keys(r.$$eventListeners).find((t=>r.$$eventListeners[t].name===e&&r.$$eventListeners[t].handler===n));t.setState(r),i&&removeEventListener(r.$$eventListeners[i].name,r.$$eventListeners[i].handler)}else console.warn(`Cannot remove event listener '${e}' because the widget context is not available.`)}}},Cr=(e,t,n,r)=>{const i={...Zn(),...n.getState()},s=i.pages[Xn].$$compiledCode;if(s)return{compiledModule:s};{const s=$r(e,n,t);return Yn(i.pages[Xn].code,s,n.recipeType,r)}},kr=e=>e.map((e=>({...e,name:e.name.replace("_","")}))),Er=async(e,t)=>{const n={...e};for(const r in e){if(e[r].name===yr){const e=n[r]?.rejectHandler;if("function"==typeof e)try{await e("TIMER_ABORTED")}catch(e){console.log("Error in reject interrupt handler: ",e)}t.cancelInterrupt(r),delete n[r]}}return n},xr=async(e,t,n)=>{let r={...Zn(),...e.getState()};if(void 0!==n){r.pages[Xn]?.$$compiledCode?.onTerminate&&await(r.pages[Xn].$$compiledCode?.onTerminate());let t=await Er(r.$$eventListeners,e);t=await(async e=>{const t={...e};for(const n in e)if(e[n].name===br){const r=e[n]?.abort;if("function"==typeof r)try{await r()}catch(e){console.log("Error in abort interrupt handler: ",e)}delete t[n]}return t})(t),r.$$eventListeners=t,r.$$error=void 0,r.pages[Xn].$$compiledCode=void 0,r.pages[Xn].code=n,e.setState({...r})}const i=!r.pages[Xn].$$compiledCode,{compiledModule:s,error:o}=Cr({variablesManager:!0,withTimers:!0},{recipePoolId:e.recipePoolId,thingId:e.thingRecipeId,widgetId:e.id},{getState:e.getState,setState:e.setState,recipeType:e.recipeType,registerInterrupt:e.registerInterrupt});if(o){console.log("Failed to compile user code");const t=Qn(o,e.recipeType);return er(t,e),null}if(s){const n=(e=>{const t=(t,n)=>{if(Ir)try{return Ir[t](n)}catch(e){return void console.log("Error in custom logger: ",e)}const r={...Zn(),...e.getState()},i=[...r.$$consoleLines||[]];i.push({fileName:Xn,text:n,type:t,timestamp:Date.now()}),i.length>100&&i.splice(0,30),e.setState({...r,$$consoleLines:i})},n={log:e=>{t("log",e)},error:e=>{t("error",e)},warn:e=>{t("warn",e)},info:e=>{t("info",e)}};return n})(e);let o;if(r={...e.getState()},r.pages[Xn].$$compiledCode=s,e.nextGate&&s.setSendToPortFun(e.nextGate),t)try{await s.recipeInit({setState:e.setState,getState:e.getState},n)}catch(t){o=Qn(t,e.recipeType)}if(e.nextGate&&i)try{await s.main(e.nextGate,n)}catch(t){o=Qn(t,e.recipeType)}r.$$lastInputs=s.getWidgetInputs?s.getWidgetInputs():[],r.$$lastOutputs=s.getWidgetOutputs?s.getWidgetOutputs():[],e.setState(r),er(o,e)}};var Ar={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={...Zn(),...i};if(!s.pages[Xn])return console.warn("Missing default page");if(s.pauseExecution){if(Object.keys(s.$$eventListeners).length){const e=await Er(s.$$eventListeners,r);r.setState({...s,$$eventListeners:e})}return}if(Be(e?.name||""))return s.$$eventListeners[t.name]?(await s.$$eventListeners[t.name].handler(),s.$$eventListeners[t.name].name===yr&&delete s.$$eventListeners[t.name],void r.setState({...s})):void console.log(`Unknown interrupt id [${t.name}] `);if(t.name.startsWith(ce)){const e=t.name.replace(ce,""),r=n.data.value,i=s.$$eventListeners[e];return void(i?.handler&&await i.handler(r))}const o=t.name===Sr;await xr(r,!1,o?n.data.value:void 0);const a=s.pages[Xn].$$compiledCode;if(e&&e.name!==Sr&&a){let i;try{await a.asyncProcessEvent(t,e,n)}catch(e){"UserCodeError"===e.name&&(i=Qn(e,r.recipeType))}er(i,r)}},getInputNames:(e,t)=>{const n={...Zn(),...e},{compiledModule:r}=Cr({},{recipePoolId:t.recipePoolId,thingId:t.thingRecipeId,widgetId:t.widgetId},{getState:()=>n,recipeType:t.recipeType});if(r?.getWidgetInputs){const e=r.getWidgetInputs();return kr(e)}return e.$$lastInputs||[]},getOutputNames:(e,t)=>{const n={...Zn(),...e},{compiledModule:r}=Cr({},{recipePoolId:t.recipePoolId,thingId:t.thingRecipeId,widgetId:t.widgetId},{getState:()=>n,recipeType:t.recipeType});if(r?.getWidgetOutputs){const e=r.getWidgetOutputs();return kr(e)}return e.$$lastOutputs||[]},getDefaultState:Zn,initialize:async e=>{const t=e.getState(),n={...Zn(),...t};n.pages[Xn].code&&await xr({getState:e.getState,id:e.widgetThingId,recipePoolId:e.recipePoolId,recipeType:e.recipeType,registerInterrupt:e.registerInterrupt,setState:e.setState,thingRecipeId:e.thingRecipeId,cancelInterrupt:()=>!0},!0,n.pages[Xn].code)}};const Nr=async(e,t,n,r)=>{e.startsWith("data:image/")||(e=`data:image/png;base64,${e}`);const i=await Or(e);return((e,t,n,r)=>{const i=r.getContext("2d");if(!i)throw new Error("Failed to get canvas context");const s=e.width,o=e.height;return r.width=t,r.height=n,i.drawImage(e,0,0,s,o,0,0,t,n),i.getImageData(0,0,t,n)})(i,n||i.naturalWidth,r||i.naturalHeight,t)},Or=e=>new Promise(((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=e=>n(e),r.src=e})),Pr=Object.freeze({image:"image"}),Lr=Object.freeze({base64:"base64"}),Tr=()=>({});var Br={onParentEvent:async(e,t,n,r)=>{const i={...r.getState()};if(t.name===Lr.base64){if("string"!=typeof n.data.value)return;if(n.data.type!==de.String&&n.data.type!==de.Anything)return;const e=n.data.value;$e&&(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(320,240)));try{const t=await Nr(e,i.$$memCanvas,i.resize?.width,i.resize?.height);return r.setState(i),r.nextGate(Pr.image,{type:de.ImageData,value:t})}catch(e){console.log("[base64ToImageData] Error: ",e)}}},getInputNames:()=>[{name:Lr.base64,type:de.String}],getOutputNames:()=>[{name:Pr.image,type:de.ImageData}],getDefaultState:Tr};const jr=Object.freeze({object:"object",error:"error"}),Dr=Object.freeze({string:"string"}),Ur=()=>({outputIsArray:!1});var Mr={onParentEvent:async(e,t,n,r)=>{const i={outputIsArray:!1,...r.getState()};if((n.data.type===de.String||n.data.type===de.Anything)&&"string"==typeof n.data.value)try{const e=JSON.parse(n.data.value),t=Array.isArray(e);return t&&!i.outputIsArray?r.setState({...i,outputIsArray:!0}):!t&&i.outputIsArray&&r.setState({...i,outputIsArray:!1}),r.nextGate("object",{type:t?de.Array:de.JsonObj,value:e})}catch(e){return r.nextGate("error",{type:de.Boolean,value:!0})}},getInputNames:()=>[{name:Dr.string,type:de.String}],getOutputNames:e=>[{name:jr.object,type:[de.JsonObj,de.Array],label:e.outputIsArray?"array":jr.object},{name:jr.error,type:de.Boolean}],getDefaultState:Ur};const Fr=Object.freeze({string:"string",length:"length"}),Rr=Object.freeze({trigger:"trigger",setText:"setText"}),Wr=()=>({text:"",dispatchOnSet:!1});var Gr={onParentEvent:async(e,t,n,r)=>{const i={text:"",dispatchOnSet:!1,...r.getState()};if(t.name===Rr.setText){if(!((n.data.type===de.String||n.data.type===de.Anything)&&"string"==typeof n.data.value))return;if("string"==typeof n.data.value&&(i.text=n.data.value,r.setState(i)),!i.dispatchOnSet)return}const s=r.nextGate(Fr.length,{type:de.Number,value:i.text.length}),o=r.nextGate(Fr.string,{type:de.String,value:i.text});await Promise.all([s,o])},getInputNames:e=>{const t=[{name:Rr.setText,type:de.String}];return e.dispatchOnSet||t.push({name:Rr.trigger,type:de.Anything}),t},getOutputNames:()=>[{name:Fr.string,type:de.String},{name:Fr.length,type:de.Number}],getDefaultState:Wr};const Vr=Object.freeze({image:"image"}),Hr=Object.freeze({image:"image",x:"x",y:"y",width:"width",height:"height"}),zr=()=>({showInputPorts:!1});var qr={onParentEvent:async(e,t,n,r)=>{const i={showInputPorts:!1,...r.getState()};if("number"==typeof n.data.value)return t.name===Hr.x&&(i.cropX=n.data.value),t.name===Hr.y&&(i.cropY=n.data.value),t.name===Hr.width&&(i.cropWidth=n.data.value),t.name===Hr.height&&(i.cropHeight=n.data.value),void r.setState(i);if(t.name===Hr.image){if(n.data.type!==de.ImageData&&n.data.type!==de.Anything)return;if(!je(n.data.value))return;const e=n.data.value;if(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(320,240),i.$$memCanvasContext=Ie(i.$$memCanvas),r.setState(i)),!i.$$memCanvas||!i.$$memCanvasContext)return void console.error("Failed to get canvas or context");let t=e;return i.$$memCanvas.width=e.width,i.$$memCanvas.height=e.height,(i.cropX||i.cropY||i.cropWidth||i.cropHeight)&&(t=((e,t,n,r)=>{if(!n)return e;const i=Math.max(r.x||0,0),s=Math.max(r.y||0,0),o=e.width,a=e.height,c=Math.min(Math.ceil(r.width||o),o),l=Math.min(Math.ceil(r.height||a),a);return t.width=e.width,t.height=e.height,n.putImageData(e,0,0),n.drawImage(t,i,s,c,l,0,0,c,l),n.getImageData(0,0,c,l)})(e,i.$$memCanvas,i.$$memCanvasContext,{x:i.cropX,y:i.cropY,width:i.cropWidth,height:i.cropHeight})),r.nextGate(Vr.image,{type:de.ImageData,value:t})}},getInputNames:e=>{const t=[{name:Hr.image,type:[de.ImageData]}];return e.showInputPorts&&(t.push({name:Hr.x,type:de.Number}),t.push({name:Hr.y,type:de.Number}),t.push({name:Hr.width,type:de.Number}),t.push({name:Hr.height,type:de.Number})),t},getOutputNames:()=>[{name:Vr.image,type:de.ImageData}],getDefaultState:zr};const Kr=Object.freeze({image:"image"}),Jr=Object.freeze({image:"image",width:"width",height:"height"}),Yr=()=>({showInputPorts:!1});var Xr={onParentEvent:async(e,t,n,r)=>{const i={showInputPorts:!1,...r.getState()};if("number"==typeof n.data.value)return t.name===Jr.width&&(i.width=n.data.value),t.name===Jr.height&&(i.height=n.data.value),void r.setState(i);if(t.name===Jr.image){if(n.data.type!==de.ImageData&&n.data.type!==de.Anything)return;if(!je(n.data.value))return;const e=n.data.value;if(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(320,240),i.$$tempCanvas=Se(320,240),r.setState(i)),!i.$$memCanvas||!i.$$tempCanvas)return;let t=e;return(i.width||i.height)&&(t=((e,t,n,r,i)=>{if(!r&&!i)return e;r&&!i?i=r*(e.height/e.width):!r&&i&&(r=i*(e.width/e.height));const s=Math.max(1,r||e.width),o=Math.max(1,i||e.height);n.width===e.width&&n.height===e.height||(n.width=e.width,n.height=e.height),t.width=s,t.height=o;const a=Ie(t),c=Ie(n);if(!a||!c)throw new Error("Failed to get canvas context");return c.putImageData(e,0,0),a.drawImage(n,0,0,e.width,e.height,0,0,s,o),a.getImageData(0,0,s,o)})(e,i.$$memCanvas,i.$$tempCanvas,i.width,i.height)),r.nextGate(Kr.image,{type:de.ImageData,value:t})}},getInputNames:e=>{const t=[{name:Jr.image,type:de.ImageData}];return e.showInputPorts&&(t.push({name:Jr.width,type:de.Number}),t.push({name:Jr.height,type:de.Number})),t},getOutputNames:()=>[{name:Kr.image,type:de.ImageData}],getDefaultState:Yr};const Zr=Object.freeze({value:"value"}),Qr=Object.freeze({trigger:"trigger",setValue:"setValue"}),ei=()=>({value:0,dispatchOnSet:!1});var ti={onParentEvent:async(e,t,n,r)=>{const i={value:0,dispatchOnSet:!1,...r.getState()};if(t.name===Qr.setValue){const e=n.data.type===de.Number||n.data.type===de.Anything||n.data.type===de.String,t=!isNaN(Number(n.data.value))&&!Array.isArray(n.data.value);if(!e||!t)return;if(i.value=Number(n.data.value),r.setState(i),!i.dispatchOnSet)return}return r.nextGate(Zr.value,{type:de.Number,value:i.value})},getInputNames:e=>{const t=[{name:Qr.setValue,type:de.Number}];return e.dispatchOnSet||t.push({name:Qr.trigger,type:de.Anything}),t},getOutputNames:()=>[{name:Zr.value,type:de.Number}],getDefaultState:ei};const ni=Object.freeze({image:"image"}),ri=Object.freeze({image:"image"}),ii=()=>({anchors:[],vertices:[],matrix:[]}),si={onParentEvent:async(e,t,n,r)=>{const i={anchors:[],vertices:[],matrix:[],...r.getState()},s=window,o=n.data.type===de.ImageData;if(s.Speedy&&o){const e=s.Speedy,t=n.data.value;let o,u,d,p=i.$$private?.canvas,h=i.$$private?.context,f={...i};const g=4===i.anchors.length;if(i.$$private?.pipeline)o=i.$$private?.pipeline,u=i.$$private?.source;else{o=e.Pipeline(),u=e.Image.Source();const n=e.Image.Sink();d=e.Transform.PerspectiveWarp(),p?p.width===t.width&&p.height===t.height||(p.width=t.width,p.height=t.height,h=p.getContext("2d")):(c=t.width,l=t.height,p=Se(c,l),h=p.getContext("2d")),u.output().connectTo(d.input()),d.output().connectTo(n.input()),o.init(u,n,d);let r=e.Matrix(3,3,[1,0,0,0,1,0,0,0,1]);if(4===i.anchors.length){const t=e.Matrix(2,4,[(a=i.anchors)[0].x,a[0].y,a[1].x,a[1].y,a[2].x,a[2].y,a[3].x,a[3].y]),n=e.Matrix(2,4,i.vertices.reduce(((e,t)=>e.concat([t.x,t.y])),[])),s=e.Matrix.Zeros(3,3);await e.Matrix.perspective(s,t,n);const o=s.read();r=e.Matrix(3,3,o)}d.transform=r,f={...f,$$private:{...f.$$private,canvas:p,context:h,perspective:d,pipeline:o,source:u}}}let m=t;if(g){const e=await(async(e,t)=>{const n=window,r=e.$$private?.source,i=e.$$private?.pipeline;if(n.Speedy&&r&&i){const e=n.Speedy,s=await createImageBitmap(t),o=await e.load(s);return r.media=o,(await i.run()).image.source}return null})(f,m);e&&(p&&h&&(m=((e,t,n)=>(t.width=e.width,t.height=e.height,n.drawImage(e,0,0),n.getImageData(0,0,e.width,e.height)))(e,p,h)),f.$$private&&r.setState({...f,$$private:{...f.$$private,lastInputImage:t}}))}else f.$$private&&r.setState({...f,$$private:{...f.$$private,lastInputImage:t}});return r.nextGate(ni.image,{type:de.ImageData,value:m})}var a,c,l;console.log("Environment not supported")},getInputNames:()=>[{name:ri.image,type:de.ImageData}],getOutputNames:()=>[{name:ni.image,type:de.ImageData}],getDefaultState:ii,terminate:async e=>{const t=e.getState();t.$$private?.pipeline.release()}},oi=()=>({name:"Default widget bundle",description:"",inputs:[{dataType:[de.Anything],name:"input"}],outputs:[{dataType:[de.Anything],name:"output"}]});let ai;const ci=()=>{if(!ai)throw new Error(tt(et));return ai};const li=async e=>{const t=new c,n=await t.loadAsync(e),r={};for(const e in n.files)if(!n.files[e].dir){const t=await n.file(e);t&&(r[e]=await t.async("uint8array"))}return r},ui={};var di=e=>ui[e]||null;const pi=async(e,t,n)=>{try{const r=ci(),i=n?r.loadBlobAsString:r.loadBlob;return await i(e,t)}catch(e){return null}},hi=async e=>{const t=se;try{const n=await pi(e,t,!0);if(!n)return null;return Function(n)()}catch(e){return null}},fi=async e=>{const t=oe;try{const n=await pi(e,t,!0);if(!n)return null;return JSON.parse(n)}catch(n){return console.log(`Failed to parse the bundle's state [${e}/${t}] %j`,n),null}},gi=(e,t)=>`${e.replace(ae,"")}_${t}`,mi=(e,t)=>`widget/${e.replace(ae,"")}/v/${t}`,vi=async(e,t)=>{const n=ci(),[r]=await Promise.all([li(e),n.createLocation(t)]);for(const e in r)e.startsWith("__MACOSX")||await n.saveBlob(t,e,r[e])},yi=(e,t)=>{const n=gi(e,t),r=di(n);return r?{...r}:null},bi=(e,t,n)=>{const r=`${`widget/${e.replace(ae,"")}/tmp`}/${t}`;if(n){return ci().getCacheLocation(r)}return r};var wi=yi,Si=async(e,t,n)=>{const r=bi(t,n);await vi(e,r);const i=hi(r),s=fi(r),o=ci(),a=o.getCacheLocation(r),[c,l]=await Promise.all([i,s]);if(!c)return null;let u=l;if(!l){const e=oi(),t=JSON.stringify(e);await o.saveBlob(r,oe,Te(t)),u=e}return{cachePath:a,processor:c,storedState:Object.freeze(u)}},Ii=(e,t,n)=>{if(n.isTempStorage)return bi(e,t,n.fullStorageRoot);const r=ci(),i=mi(e,t);return n.fullStorageRoot?r.getCacheLocation(i):i};const _i=()=>oi();var $i={onParentEvent:async(e,t,n,r)=>{const i=r.getState();return i.$$processor?.onParentEvent({sourcePort:e?.name||"",targetPort:t?.name||"",data:n.data},{getState:r.getState,recipeId:r.recipePoolId,recipeType:r.recipeType,setState:r.setState,nextWidget:r.nextGate})},getInputNames:(e,t)=>{const n={..._i(),...e};return n.$$processor?.getInputNames?n.$$processor.getInputNames(e,t):n.inputs.map((e=>({name:e.name,type:e.dataType})))},getOutputNames:(e,t)=>{const n={..._i(),...e};return n.$$processor?.getOutputNames?n.$$processor.getOutputNames(e,t):n.outputs.map((e=>({name:e.name,type:e.dataType})))},getDefaultState:_i,initialize:async(e,t)=>{console.log("Widget bundle initialize",e);let n={...e.getState()},r=n.$$cacheInfo?.widgetThingId||n.collectionInfo?.widgetId||e.widgetThingId;const i=n.$$cacheInfo?.version.toString()||n.collectionInfo?.version.toString()||1;if(n.$$cacheInfo={...n.$$cacheInfo,version:Number(i),widgetThingId:r},!r||!i)throw new Error("Widget bundle state is missing cache id or version");console.log("Loading state from cache");const s=wi(r,i);let o=!s;if(!n.$$processor)if(n.storageUnitId&&!s){const t=await e.getStorageData(n.storageUnitId);if(t){r=e.widgetThingId;const s=await Si(t,r,i);o=!0,s&&(n={...n,$$processor:s.processor,$$cacheInfo:{...n.$$cacheInfo,widgetThingId:r,version:Number(i)}},e.setState(n))}}else if(s){o=!1;const r=n.collectionInfo?{...n.collectionInfo}:void 0;n={...n,...!t.keepCurrentState&&s.storedState?{...s.storedState,...r?{collectionInfo:r}:{}}:{},$$processor:s.processor},e.setState(n)}const a=Ii(r,i,{fullStorageRoot:!0,isTempStorage:o});console.log("Invoking bundle initialize with cache: ",a);try{await(n.$$processor?.initialize({cacheLocation:a,getState:e.getState,setState:e.setState}));const t=e.getState();e.setState({...t,$$initializationError:void 0})}catch(t){const n=e.getState();throw e.setState({...n,$$initializationError:t.message||"An error occurred initializing the widget"}),t}},terminate:async e=>{const t={...e.getState()};console.log(`Terminating widget bundle ${t.name} [${t.$$cacheInfo?.widgetThingId||""}]`);const n=t.$$processor;n&&"function"==typeof n.terminate&&await n.terminate({getState:e.getState,setState:e.setState,recipePoolId:e.recipePoolId,widgetId:e.widgetId})}};const Ci=Object.freeze({event:"event"}),ki="1",Ei="2",xi="3";var Ai={onParentEvent:async(e,t,n,r)=>{const i={...r.getState()};r.setState({...i,$$lastEventType:n.data.type}),await r.nextGate(ki,n.data),await r.nextGate(Ei,n.data),await r.nextGate(xi,n.data)},getInputNames:()=>[{name:Ci.event,type:de.Anything}],getOutputNames:e=>{const t={type:{...e}.$$lastEventType??de.Anything};return[{name:ki,...t},{name:Ei,...t},{name:xi,...t}]}};const Ni=Object.freeze({set:"set",trigger:"trigger"}),Oi="value";var Pi={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={name:"myVar",type:de.String,reactive:!0,defaultValue:"",...i};if(t.name.startsWith(ce)){if(!s.reactive)return;if(n.data.type!==s.type)return;return r.nextWidget(Oi,n.data)}if(t.name!==Ni.set){if(t.name===Ni.trigger){const e=fr(r.recipePoolId,r.thingRecipeId,s.name,{ownerWidgetId:r.id}),t=e||s.defaultValue;await r.nextWidget(Oi,{type:s.type,value:t})}}else await hr(r.recipePoolId,r.thingRecipeId,r.id,s.name,n.data,{skipCallerNotification:!s.reactive})},getInputNames:e=>{const t={...e};return[{name:Ni.set,type:t.type||de.Anything},{name:Ni.trigger,type:de.Anything}]},getOutputNames:e=>{const t={...e};return[{name:Oi,type:t.type||de.Anything}]}};let Li;var Ti=e=>{Li=e},Bi=()=>{if(!Li)throw new Error("Hub Connector not set");return Li};const ji=async(e,t=!1)=>{const n=Bi();let r=e.$$$serviceId;if(!e.service)return console.log("Aborting service initialization, missing property `service` in state."),null;if(!r||t){const t=await n.getCompatibleService(e.service.name,e.service.version,"^");if(!t)return null;r=t.sessionId}return r};var Di={onParentEvent:async(e,t,n,r)=>{const i={dynamicInputs:{},dynamicOutputs:{},customState:{},...r.getState()};if(!e)return;const s=Bi();let o=i.$$$serviceId;if(!o){const e=s.getCachedServices().available.find((e=>e.name===i.service?.name&&e.version===i.service?.version));if(!e)return;o=e.sessionId,i.$$$serviceId=o,r.setState(i)}const a=i.service?.variants?.find((e=>e.id===i.variantId)),c=a?i.dynamicInputs[a.id]||a?.inputs||[]:i.service?.inputs||[];if(!c?.length)return;if(!a&&i.service?.ignoreParentEvents)return;const l=i.service?.processingTimeoutSec;return s.onParentEvent({recipeId:r.recipePoolId,data:n.data,targetServiceSessionId:o,currentState:i.customState,targetVariantId:i.variantId,target:{portName:t.name,widgetId:r.id,widgetType:r.type},source:e,config:{timeout:l?1e3*l:0,async:i.service?.asyncParentEvents}})},getInputNames:async e=>{const t=e.variantId;if(t&&e.dynamicInputs?.[t])return[...e.dynamicInputs[t]||[]];if(!t)return e.service?.inputs||[];{const n=e.service?.variants?.find((e=>e.id===t));if(n)return n.inputs||[]}return[]},getOutputNames:async e=>{const t=e.variantId;if(t&&e.dynamicOutputs?.[t])return[...e.dynamicOutputs[t]||[]];if(!t)return e.service?.outputs||[];{const n=e.service?.variants?.find((e=>e.id===t));if(n)return n.outputs||[]}return[]},initialize:async e=>{const t={dynamicInputs:{},dynamicOutputs:{},customState:{},...e.getState()},n=Bi(),r=await ji(t);if(r)try{return await n.initializeServiceInstance({recipeId:e.recipePoolId,sessionId:r,widgetId:e.widgetThingId,recipeType:e.recipeType,variantId:t.variantId})}catch(t){if("FNC_NOT_FOUND"!==t?.errCode){if(!!("string"!=typeof t||!t.match('^Function ".*" not found.$')))throw t;console.warn(`Widget [${e.widgetThingId}] does not have an init function.`)}}else console.log(`Aborting service initialization, "${t.service?.name}" was not found in the current Hub.`)},terminate:async e=>{const t={dynamicInputs:{},dynamicOutputs:{},customState:{},...e.getState()},n=Bi(),r=await ji(t,!0);if(r)return n.terminateServiceInstance(r,e.widgetId,e.recipePoolId,t.variantId)}};const Ui=Object.freeze({Image:"image"}),Mi=Object.freeze({Image:"image"}),Fi=()=>({filters:[{name:"grayscale",value:.5,id:"d-1"}]});const Ri="loaded";const Wi={input:it,counter:at,elapsed:ut,ifGate:ft,skipEvent:vt,between:St,map:$t,parser:Et,slider:Nt,suspend:Lt,display:Bt,json:Ut,arrayItem:Rt,extractImage:Vt,imageConvolution:Jt,firstEvent:Qt,pixelDraw:on,randomBetween:un,arrayCombine:gn,clock:bn,multiplication:_n,object:An,widgetGroup:Ln,script:Ar,base64ToImageData:Br,jsonParse:Mr,text:Gr,imageCrop:qr,imageResize:Xr,value:ti,imageWarp:si,widgetBundle:$i,sequence:Ai,variable:Pi,hubService:Di,imageFilter:{onParentEvent:async(e,t,n,r)=>{const i={filters:[{name:"grayscale",value:.5,id:"d-1"}],...r.getState()};if(t.name===Ui.Image&&n.data.type===de.ImageData){if(!je(n.data.value))return void console.log("ImageFilter: Invalid image data type, aborting process");const e=n.data.value;i.$$memCanvas||(i.$$memCanvas=Se(e.width,e.height)),i.$$context||(i.$$context=i.$$memCanvas.getContext("2d")),i.$$memCanvas.width!==e.width&&(i.$$memCanvas.width=e.width),i.$$memCanvas.height!==e.height&&(i.$$memCanvas.height=e.height),r.setState(i),i.$$context.putImageData(e,0,0),i.filters.length?i.$$context.filter=i.filters.map((e=>`${e.name}(${e.value}${"blur"===e.name?"px":""})`)).join(" "):i.$$context.filter="none",i.$$context.drawImage(i.$$memCanvas,0,0);const t=i.$$context.getImageData(0,0,e.width,e.height);return r.nextWidget(Mi.Image,{type:de.ImageData,value:t})}},getInputNames:()=>[{name:Ui.Image,type:de.ImageData}],getOutputNames:()=>[{name:Mi.Image,type:de.ImageData}],getDefaultState:Fi},recipeLoad:{onParentEvent:async(e,t,n,r)=>r.nextWidget(Ri,{value:!0,type:de.Boolean}),getInputNames:()=>[],getOutputNames:()=>[{name:Ri,type:de.Boolean,description:"Triggered when the recipe is fully loaded"}]},play:{getInputNames:()=>[],onParentEvent:()=>Promise.resolve(),getOutputNames:()=>[{name:"out",type:de.Boolean}]}},Gi={},Vi=async()=>{if(!Object.keys(Gi).length)for(const e in Wi){const t=Wi[e];Gi[e]=Object.freeze({...t})}};var Hi=e=>{if(Gi[e])return Gi[e];throw new Error(tt(Qe,e))},zi=Vi;const qi=new a,Ki="invoked";let Ji={},Yi={},Xi={},Zi={};const Qi=(e,t,n)=>`${e}-${t}${n?`-${n}`:""}`;var es=(e,t,n,r,i)=>{const s=Qi(e,t,n),o=Qi(e,t),a=Qi(e,t,"produced"),c=Xi[o],l=Date.now();Zi[o]=l,Ji[s]={data:r,sourcePortName:n,...i?{target:{widgetId:i.widgetId,portName:i.portName}}:{}},qi.emit(a,{currentTime:l,prevTime:c,...i?{targetPort:i?.portName}:{}})},ts=(e,t,n,r,i)=>{const s=Qi(e,t,n),o=Qi(e,t),a=Qi(e,t,Ki),c=Xi[o],l=Date.now();Xi[o]=l,Yi[s]={data:r,sourcePortName:n,...i?{source:{widgetId:i.widgetId,portName:i.portName}}:{}},qi.emit(a,{prevTime:c,currentTime:l,targetPort:n,sourceInfo:i})},ns=()=>{Ji={},Yi={},Xi={},Zi={},qi.clearListeners()};let rs,is,ss;const os=async(e,t,n,r,i)=>{const s=te(n,t);if(!s)return;const o=s.gates[e];if(!o||o.disabled)return;const a={...i,timestamp:Date.now()},c=Hi(o.type),l=us(e,a,s.recipeId,s.id,s.version,n);if(l&&c.onParentEvent){const t={name:r};return rs&&await rs({recipeId:n,blockId:s.recipeId,gateId:e,targetPort:t.name,data:i}),c.onParentEvent(null,t,{originalEvent:a,data:{...a}},l)}},as=async(e,t,n,r,i,s,o,a,c,l)=>{if(!e&&!c)throw new Error("Missing parameter ['sourceGateId']");if(!e&&!l)throw new Error("Missing parameter ['originalEvent']");e&&(l={timestamp:Date.now(),type:de.Boolean,value:!0});const u=l;if("string"==typeof n){const e=te(r,n);if(!e)return;n=e}const d=n.gates[t];if(!d||d.disabled)return;const p=a.findIndex((e=>e.name===i)),h=Hi(d.type),f=us(t,u,n.recipeId,n.id,n.version,r);if(f&&h.onParentEvent&&-1!==p){rs&&await rs({recipeId:r,blockId:n.recipeId,gateId:t,targetPort:s.name,data:o,sourceGate:e?"interrupt_widget":c,sourcePort:e?ie:i});const l={name:a[p].name,type:a[p].type,...a[p].jsonShape?{jsonShape:a[p].jsonShape}:void 0};return ts(n.recipeId,t,s.name,o,c?{widgetId:c,portName:i}:void 0),h.onParentEvent(l,s,{originalEvent:u,data:o},f)}},cs=async(e,t,n,r,i,s,o,a)=>{const c=ee(a);if(!c)throw new Error(`Failed to find recipe "${a}" in cache`);const l=c.dbInfo.recipeType,u=ne(a,i,r);if(!u)return;const d={...n,timestamp:t.timestamp},p=Hi(u.type);let h;h=u.type===He.input?p.getOutputNames(u.state,{thingRecipeId:i,thingDbId:s,thingVersion:o,id:r,recipeId:a,recipeType:l,recipePoolId:a}):await p.getOutputNames(u.state,{recipePoolId:a,recipeType:l,thingRecipeId:i,widgetId:r});const f=h.findIndex((t=>t.name===e));if(-1!==f){const n=te(a,i);if(!n)return;es(i,r,e,d);const s=u.children.length;for(let o=0;o<s;o++){if(We(u.children[o]?.sourcePort).portName===e){const s=n.gates[u.children[o].childId];if(s&&!s.disabled){const c=Hi(s.type);let p;const f={recipePoolId:a,recipeType:l,thingRecipeId:i,widgetId:r};p=s.type===He.hubService?await c.getInputNames(s.state,f):c.getInputNames(s.state,f);const g=We(u.children[o].targetPort),m=p.find((e=>e.name===g.portName));m&&await as(!1,s.id,n,a,e,{name:m.name},u.returnOriginalEvent?t:d,h,u.id,t)}}}}},ls=async(e,t,n,r)=>{const i=ee(r);if(!i)return null;const s=te(r,n);if(!s)return s;const o=s.gates,a=s.gates[t],c=Hi(a.type),l=await c.getInputNames(a.state,{recipePoolId:r,recipeType:i.dbInfo.recipeType,thingRecipeId:n,widgetId:t}),u=l.findIndex((t=>t.name===e));if(-1!==u){const e=((e,t,n)=>{for(const r in n){const i=n[r],s=i.children.length;for(let n=0;n<s;n++){const r=i.children[n],s=We(r.targetPort);if(r.childId===e&&s.portName===t)return i}}return null})(t,l[u].name,o);if(e){const t=Hi(e.type);return{getValue:()=>"function"==typeof t.getValue?t.getValue():null}}}return null},us=(e,t,n,r,i,s)=>{const o=ee(s);if(!o)throw new Error(`Failed to find recipe "${s}" in cache`);const a=ne(s,n,e);if(!a)return console.warn(`Gate ${e} not found in block ${n} for recipe ${s}`),null;const c=async(o,a)=>cs(o,t,a,e,n,r,i,s),l={id:e,type:a.type,recipePoolId:s,thingRecipeId:n,recipeType:o.dbInfo.recipeType,returnOriginalEvent:!!a.returnOriginalEvent,registerInterrupt:(t,r,i,o,a)=>Ye.createInterrupt(t,s,n,e,r,i,o,a),cancelInterrupt:e=>Ye.destroyInterrupt(e),nextWidget:c,nextGate:c,getParentAtPort:t=>ls(t,e,n,s),getState:()=>Object.freeze({...a.state,...a.type===He.input&&{customInputs:[]}}),setState:t=>{if("object"!=typeof t)return void console.warn(`Invalid state type [${typeof t}]. Expected an 'object'`);const r={...t,...a.type===He.input&&!t.customInputs&&{customInputs:[]}},i={...a.state};a.state=r,is&&is({blockId:n,gateId:e,prevState:i,newState:{...r},recipeId:s})}};return l};Ye.setInvokeChildGateCb(as);const ds=new a,ps="invoked",hs="state",fs=()=>{Ye.destroyAllInterrupts()},gs=async(e,t,n)=>{const r=ee(e),i=ne(e,t,n);if(i&&r){const s=Hi(i.type);if(s&&"function"==typeof s.terminate){const i=((e,t,n,r)=>Xe(e,t,n,r))(e,r.dbInfo.recipeType,t,n);if(i)try{await s.terminate(i)}catch(e){console.warn(`Error terminating widget "${n}" in thing "${t}". Failing silently: `,e)}}}},ms=async(e,t,n,r)=>{const i=ee(e),s=ne(e,t,n);if(s&&i){const o=Hi(s.type);if(o&&"function"==typeof o.initialize){const s=((e,t,n,r)=>Xe(e,t,n,r,!0))(e,i.dbInfo.recipeType,t,n);if(s){const e=o.initialize;try{await e(s,r||{})}catch(e){throw console.warn(`Error initializing widget "${n}" in thing "${t}": `,e),e}}}}},vs=(e,t)=>{const n=ee(t);if(n)for(const t in n.blocks){const r=n.blocks[t];for(const t in r.gates)if(t===e)return{widget:r.gates[t],thing:r}}return null},ys=(e,t="",n="")=>`block:${t}:gate:${n||""}:${e}`,bs=e=>{ds.emit(ys(hs),e),ds.emit(ys(hs,e.blockId,e.gateId),e)};rs=async e=>{await ds.emit(ys(ps),e),await ds.emit(ys(ps,e.blockId,e.gateId),e)},(e=>{is=e})(bs);var ws,Ss,Is,_s,$s,Cs,ks,Es,xs,As,Ns,Os,Ps,Ls=async(e,t,n,r,i)=>{const s=re(e,{id:t,authorId:r,version:n,recipeType:i});ns();const o=ee(s);return o&&(o.startedAt=Date.now(),o.retryAttempts=0,o.execCounter=0,o.status=Y.STARTING,o.addLog("recipe registered")),s},Ts=async e=>{const t=ee(e);var n;if(!t)return null;t.addLog("terminating recipe"),fs();for(const n in t.blocks){const r=t.blocks[n];for(const t in r.gates)await gs(e,n,t)}X[n=e]&&delete X[n]},Bs=async(e,t)=>{const n=ee(e),r=[],i=[];if(n)for(const s in n.blocks){const o=n.blocks[s];if(!t||!Array.isArray(t)||t.includes(s))for(const t in o.gates)try{if(n.dbInfo?.recipeType===Bn.Desktop){const e=o.gates[t];if(e.type===He.hubService){const r=e.state;if(r?.service?.webOnly){n?.addLog(`skipping initialization of web-only widget "${t}"`);continue}}e.type===He.recipeLoad&&i.push(e)}await ms(e,s,t,{keepCurrentState:!0})}catch(e){r.push({widgetId:t,error:e.message})}}return{failed:r,sendToInputWidget:(t,n,r=le)=>(async(e,t,n,r)=>{const i=ee(n),s=te(n,r),o=Date.now();if(s&&i)for(const i in s.gates){const a=s.gates[i];if(a.type===He.input&&!a.disabled){const c=a.state.inputName||"";if(c===e){const e=Hi(a.type),l={...t,timestamp:o},u=us(i,l,r,s.id,s.version,n);if(u&&e.processEvent){const s={...u,getState:u.getState};rs&&await rs({recipeId:n,blockId:r,gateId:i,targetPort:rt,data:t}),ss?await ss(r,n,c,t):await e.processEvent(l,s)}}}}})(t,n,e,r),invokeRecipeLoadedWidgets:async()=>{for(const t of i)await os(t.id,le,e,Ri,{type:de.Boolean,value:!0})}}},js=e=>{Ti(e)},Ds=(e,t,n,r=!1)=>{const i=vs(t,e);if(i){const{widget:s,thing:o}=i,a={...s.state};s.state=n,r&&bs({blockId:o.recipeId,gateId:t,recipeId:e,newState:{...n},prevState:a})}},Us=(e,t)=>{const n=vs(t,e);return n?n.widget.state:null},Ms=async(e,t,n,r,i)=>{const s=vs(t,e);if(s)return cs(n,r,i,t,s.thing.recipeId,s.thing.id,s.thing.version,e)};!function(e){e.Seats="seats",e.RecipeInvocations="recipe_invocations",e.HubServices="hub_services",e.RecipeExports="recipe_exports"}(ws||(ws={})),function(e){e.UserFriendlyName="user_friendly_name",e.UserFriendlyDescription="user_friendly_description",e.InternalDescription="internal_description",e.TierLevel="tier_level",e.ProductFeatures="product_features",e.UserSubscribeCode="subscription_code"}(Ss||(Ss={})),function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(Is||(Is={})),function(e){e.Bundle="bundle",e.Group="group"}(_s||(_s={})),function(e){e.Hardware="hardware",e.Virtual="virtual"}($s||($s={})),function(e){e.Cloud="cloud",e.Web="web"}(Cs||(Cs={})),function(e){e.Cpu_128M="kmu-cpu-128m",e.Cpu_256M="kmu-cpu-256m",e.Cpu_512M="kmu-cpu-512m",e.Cpu_1024M="kmu-cpu-1024m",e.Cpu_2048M="kmu-cpu-2048m",e.Cpu_4096M="kmu-cpu-4096m"}(ks||(ks={})),function(e){e.Gateway="gateway",e.Timer="timer"}(Es||(Es={})),function(e){e.InstallInProgress="installation-in-progress"}(xs||(xs={})),function(e){e.InstallDependencies="install-dependencies",e.GetInstalledDependencies="get-installed-dep"}(As||(As={})),function(e){e.Success="success",e.Error="error",e.Pending="pending"}(Ns||(Ns={})),function(e){e.NotFound="not-found",e.BadRequest="bad-request",e.Forbidden="forbidden",e.InternalError="internal-error"}(Os||(Os={})),function(e){e.KeyCreated="key_created",e.ValidateKey="validate_key",e.ExecuteRecipe="execute_recipe",e.InstallHubService="install_hub_service",e.ExportRecipe="export_recipe"}(Ps||(Ps={}));const Fs=(e,t)=>((e,t,n)=>{const r=Buffer.from(n,"base64"),i=r.subarray(0,16),s=r.subarray(16).toString("base64"),o=u(e,t,32),a=d("aes-256-cbc",o,i);let c=a.update(s,"base64","utf8");return c+=a.final("utf8"),c})(e.id||"recipe.json","kemu",t),Rs=e=>{try{return JSON.parse(e)}catch(e){return null}},Ws="undefined"!=typeof window,Gs={protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8},Vs={protocolPrefix:4,txtLength:4},Hs=Object.values(Gs).reduce(((e,t)=>e+t),0),zs=Object.values(Vs).reduce(((e,t)=>e+t),0),qs=["width","height","colorSpace"],Ks=(e,t)=>{const n={},r=[];let i=0,s=Array.isArray(e)?[]:{};const o=(e,s)=>{const a=(e=>{const t="undefined"!=typeof Buffer&&e instanceof Buffer,n=e instanceof ArrayBuffer,r=e instanceof Uint8ClampedArray,i=e instanceof Uint8Array,s=e instanceof Int8Array;return t?"Buffer":n?"ArrayBuffer":r?"Uint8ClampedArray":i?"Uint8Array":s?"Int8Array":null})(e);if(!a){if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++)t[n]=o(e[n],`${s}[${n}]`);return t}if("object"==typeof e){const t={},n=(e=>{const t=e instanceof Int16Array,n=e instanceof Uint16Array,r=e instanceof Int32Array,i=e instanceof Uint32Array,s=e instanceof Float32Array,o=e instanceof Float64Array,a=e instanceof BigInt64Array,c=e instanceof BigUint64Array;return t?"Int16Array":n?"Uint16Array":r?"Int32Array":i?"Uint32Array":s?"Float32Array":o?"Float64Array":a?"BigInt64Array":c?"BigUint64Array":null})(e);if(n)throw new Error(`Unsupported binary type [${n}] at path "${s}"`);for(const n in e)e.hasOwnProperty(n)||qs.includes(n)||console.warn(`Allowing inherited property: ${n} from path: ${s}`),t[n]=o(e[n],`${s.length?`${s}.`:""}${n}`);return t}return e}n[s]={index:i,length:e.byteLength,binaryType:a},"Buffer"===t?r.push(Buffer.from(e)):"ArrayBuffer"===a?r.push(e):r.push(e.buffer),i+=e.byteLength};s=o(e,"");let a=null;if(r.length>1)if("ArrayBuffer"===t){const e=r.reduce(((e,t)=>e+t.byteLength),0),t=new Uint8Array(e);let n=0;for(let e=0;e<r.length;e++)t.set(new Uint8Array(r[e]),n),n+=r[e].byteLength;a=t.buffer}else{a=Buffer.concat(r)}else 1===r.length&&(a=r[0]);return a?{map:n,combinedData:a,sourceCopy:s}:null},Js=(e,t,n)=>{const r=t.match(/(\[\d+\])|([^[\].]+)/g)||[];let i=e;for(let e=0;e<r.length;e++){let t=r[e];const s=t.startsWith("[")&&t.endsWith("]"),o=e===r.length-1;if(s){t=t.slice(1,-1);const s=parseInt(t,10);if(!Array.isArray(i))throw new Error(`Expected an array at key "${r.slice(0,e).join(".")}" but found an object.`);o?i[s]=n:(i[s]||(i[s]=r[e+1].startsWith("[")?[]:{}),i=i[s])}else o?i[t]=n:(i[t]||(i[t]=r[e+1].startsWith("[")?[]:{}),i=i[t])}return e},Ys=(e,t,n)=>{const r="undefined"!=typeof Buffer,i=t instanceof Uint8Array;for(const s in n)if(n.hasOwnProperty(s)){const{index:o,length:a,binaryType:c}=n[s];let l=null;if(r&&t instanceof Buffer)switch(c){case"Buffer":l=t.subarray(o,o+a);break;case"ArrayBuffer":l=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a);break;case"Uint8Array":l=new Uint8Array(t.subarray(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.subarray(o,o+a));break;case"Int8Array":l=new Int8Array(t.subarray(o,o+a))}else if(t instanceof ArrayBuffer||t instanceof Uint8Array)switch(c){case"Buffer":if(r){l=Buffer.from(t.slice(o,o+a));break}case"ArrayBuffer":l=i?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a):t.slice(o,o+a);break;case"Uint8Array":l=i?t.slice(o,o+a):new Uint8Array(t.slice(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.slice(o,o+a));break;case"Int8Array":l=new Int8Array(t.slice(o,o+a))}l&&Js(e,s,l)}return e},Xs=e=>f(e),Zs="KMSG",Qs="KCMD",eo=Xs("klProtocol");var to={encode:(e,t,n)=>{const r={json:e.json},i=Ks(r.json,"Buffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Buffer.from(a),l=c.byteLength,u=Gs.protocolPrefix+Gs.protocolVersion+Gs.jsonLength+Gs.binaryLength+Gs.fromServiceId+Gs.toServiceId+Gs.sentAt+l+o,d=Buffer.alloc(u),p=Date.now();let h=0;return d.write(Zs,h),h+=Gs.protocolPrefix,d.writeUInt8(1,h),h+=Gs.protocolVersion,d.writeUInt32LE(l,h),h+=Gs.jsonLength,d.writeUInt32LE(o,h),h+=Gs.binaryLength,d.writeUInt32LE(t,h),h+=Gs.fromServiceId,d.writeUInt32LE(n,h),h+=Gs.toServiceId,d.writeBigInt64LE(BigInt(p),h),h+=Gs.sentAt,c.copy(d,h),h+=l,s&&o&&s.copy(d,h),d},decodeHeader:e=>{let t=0;const n=e.toString("utf-8",t,Gs.protocolPrefix);if(t+=Gs.protocolPrefix,n!==Zs)return null;if(e.byteLength<Hs)return eo(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const r=e.readUInt8(t);t+=Gs.protocolVersion;const i=e.readUInt32LE(t);t+=Gs.jsonLength;const s=e.readUInt32LE(t);t+=Gs.binaryLength;const o=e.readUInt32LE(t);t+=Gs.fromServiceId;const a=e.readUInt32LE(t);t+=Gs.toServiceId;const c=e.readBigInt64LE(t);t+=Gs.sentAt;const l=i+s,u=e.subarray(t,t+l),d=e.subarray(0,Hs);let p=null;return e.byteLength-Hs-i-s>0&&(p=e.subarray(Hs+i+s)),{header:{protocolVersion:r,jsonLength:i,binaryLength:s,fromServiceId:o,toServiceId:a,sentAt:new Date(Number(c)),packages:[u],headerPackage:d},remaining:p}},decodeFullKlMessage:e=>{const t=Buffer.concat(e.packages),n=t.subarray(0,e.jsonLength).toString(),r=t.subarray(e.jsonLength,e.jsonLength+e.binaryLength),i=Rs(n);if(!i?.json)return eo("Invalid JSON in KL message"),null;i.jsonBinaryMap&&r.byteLength&&Ys(i.json,r,i.jsonBinaryMap);const s=Buffer.concat([e.headerPackage,t]);let o=s,a=null;const c=Hs+e.jsonLength+e.binaryLength;return s.byteLength>c&&(a=s.subarray(c),o=s.subarray(0,c)),{message:{json:i.json,rawMessage:o},remaining:a}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<Hs)return eo("Invalid Header Size"),e;let n=0;return n+=Gs.protocolPrefix,n+=Gs.protocolVersion,n+=Gs.jsonLength,n+=Gs.binaryLength,void 0!==t.fromServiceId&&e.writeUInt32LE(t.fromServiceId,n),n+=Gs.fromServiceId,void 0!==t.toServiceId&&e.writeUInt32LE(t.toServiceId,n),e},encodeCommand:e=>{let t=0;const n=Buffer.from(e),r=n.byteLength,i=zs+r,s=Buffer.alloc(i);return s.write(Qs,t),t+=Vs.protocolPrefix,s.writeUint32LE(r,t),t+=Vs.txtLength,n.copy(s,t),s},decodeCommand:e=>{let t=0;if(e.byteLength<zs)return{command:null};const n=e.toString("utf-8",t,Vs.protocolPrefix);if(t+=Vs.protocolPrefix,n!==Qs)return{command:null};const r=e.readUInt32LE(t);t+=Vs.txtLength;const i=e.toString("utf-8",t,t+r),s=e.byteLength-zs-r;let o=null;s>0&&(o=e.subarray(zs+r));let a=0;return s<0&&(a=Math.abs(s)),{command:i,remainingData:o,missing:a}}};const no="KMSG",ro="KCMD",io=Xs("klProtocol"),so=new TextEncoder;var oo={encode:(e,t,n)=>{const r={json:e.json},i=Ks(e.json,"ArrayBuffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=so.encode(a),l=c.byteLength,u=new ArrayBuffer(Gs.protocolPrefix+Gs.protocolVersion+Gs.jsonLength+Gs.binaryLength+Gs.fromServiceId+Gs.toServiceId+Gs.sentAt+l+o),d=new DataView(u),p=new Uint8Array(u),h=Date.now();let f=0;for(let e=0;e<4;++e)p[f++]=no.charCodeAt(e);return d.setUint8(f,1),f+=Gs.protocolVersion,d.setUint32(f,l,!0),f+=Gs.jsonLength,d.setUint32(f,o,!0),f+=Gs.binaryLength,d.setUint32(f,t,!0),f+=Gs.fromServiceId,d.setUint32(f,n,!0),f+=Gs.toServiceId,d.setBigInt64(f,BigInt(h),!0),f+=Gs.sentAt,p.set(c,f),f+=l,s&&o&&p.set(new Uint8Array(s),f),u},decodeHeader:e=>{const t=new DataView(e);let n=0,r="";for(let e=0;e<Gs.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==no)return null;if(e.byteLength<Hs)return io.log(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const i=t.getUint8(n);n+=Gs.protocolVersion;const s=t.getUint32(n,!0);n+=Gs.jsonLength;const o=t.getUint32(n,!0);n+=Gs.binaryLength;const a=t.getUint32(n,!0);n+=Gs.fromServiceId;const c=t.getUint32(n,!0);n+=Gs.toServiceId;const l=t.getBigInt64(n,!0);n+=Gs.sentAt;const u=s+o,d=e.slice(n,n+u),p=new Uint8Array(e,0,Hs);let h=null;if(e.byteLength-Hs-s-o>0){h=new Uint8Array(e,Hs+s+o).slice().buffer}return{header:{protocolVersion:i,jsonLength:s,binaryLength:o,fromServiceId:a,toServiceId:c,sentAt:new Date(Number(l)),packages:[d],headerPackage:p.slice().buffer},remaining:h}},decodeFullKlMessage:e=>{const t=e.packages.reduce(((e,t)=>e+t.byteLength),0),n=new Uint8Array(t);let r,i=0;for(const t of e.packages)r=new Uint8Array(t),n.set(r,i),i+=r.byteLength;const s=(new TextDecoder).decode(n.subarray(0,e.jsonLength)),o=n.subarray(e.jsonLength,e.jsonLength+e.binaryLength),a=Rs(s);if(!a?.json)return io.log("Invalid JSON in KL message"),null;a.jsonBinaryMap&&o.byteLength&&Ys(a.json,o,a.jsonBinaryMap);const c=new Uint8Array(e.headerPackage.byteLength+n.byteLength);c.set(new Uint8Array(e.headerPackage),0),c.set(n,e.headerPackage.byteLength);let l=c,u=null;const d=Hs+e.jsonLength+e.binaryLength;return c.byteLength>d&&(u=c.subarray(d),l=c.subarray(0,d)),{message:{json:a.json,...o.length?{binaryData:o.buffer}:{},rawMessage:l.buffer},remaining:u?.buffer??null}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<Hs)return io("Invalid Header Size"),e;let n=0;n+=Gs.protocolPrefix,n+=Gs.protocolVersion,n+=Gs.jsonLength,n+=Gs.binaryLength;const r=new DataView(e);return void 0!==t.fromServiceId&&r.setUint32(n,t.fromServiceId,!0),n+=Gs.fromServiceId,void 0!==t.toServiceId&&r.setUint32(n,t.toServiceId,!0),e},encodeCommand:e=>{let t=0;const n=so.encode(e),r=n.byteLength,i=new ArrayBuffer(zs+r),s=new DataView(i),o=new Uint8Array(i);for(let e=0;e<4;++e)o[t++]=ro.charCodeAt(e);return s.setUint32(t,r,!0),t+=Vs.txtLength,o.set(n,t),i},decodeCommand:e=>{const t=new DataView(e);let n=0;if(e.byteLength<zs)return{command:null};let r="";for(let e=0;e<Vs.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==ro)return{command:null};const i=t.getUint32(n,!0);n+=Vs.txtLength;const s=e.byteLength-zs-i,o=new Uint8Array(e,n,Math.min(i,e.byteLength-zs)),a=(new TextDecoder).decode(o);let c=null;s>0&&(c=e.slice(zs+i));let l=0;return s<0&&(l=Math.abs(s)),{command:a,remainingData:c,missing:l}}};let ao=to;Ws&&(ao=oo);var co,lo=ao;(co||(co={})).FunctionNotFound="FNC_NOT_FOUND";let uo=Math.ceil(Date.now()/1e3);let po,ho,fo,go,mo,vo=!1;var yo=()=>{vo=!0},bo=(e,t)=>{if(!po)throw new Error("Memory connection not set.");po.sendBuf(e,t)},wo=e=>ho=e,So=e=>mo=e,Io=e=>fo=e,_o=e=>go=e;const $o=(e,t=2)=>{const n=(e,r)=>{if("object"==typeof e){const i=Object.keys(e);for(const s of i){const i=e[s];if(i&&"object"==typeof i){const o=i._kemuType;if(void 0!==o){if(o===de.ImageData){const t=e[s];e[s]=Ge(t)}}else r<t&&n(i,++r)}}}};return n(e,1),e};Xs("klTransmissionManager"),Xs("ipcClient");Xs("kemuWidgetService"),C(process.argv.slice(2));const Co=e=>f(`runner:${e}`),ko=Co("connectionManager"),Eo=Co("remoteInvoke"),xo=new function(e){const t={};let n=console.log;const r={};let i=e||String(Date.now());const s={},o=e=>!s[e],a=(e,t,n,r,i,s)=>{let a=Ws?new ArrayBuffer(0):Buffer.alloc(0);const c={json:{functionName:e,args:s.success?s.success:[s],messageId:t,type:s.success?"response":"error"}};return o(r)&&(a=lo.encode(c,n,r)),i(a,{msg:c,sourceServiceId:n,targetServiceId:r})};return{setLogger:e=>{n=e},processMessage:(e,i,s,o)=>{if(!o)return!1;const c=o;if(t[c.messageId]){const e=t[c.messageId];return e&&(clearTimeout(e.timer),e.fulfilled||(e.fulfilled=!0,"response"===c.type?e.resolve(c.args):"error"===c.type&&e.reject(c.args[0])),delete t[c.messageId]),!0}if("execute"!==c.type&&n&&n(`No pending execution found for message id "${c.messageId}"`),"execute"===c.type){const t=r[c.functionName];if(t){const n=e=>{a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,e)};t({transport:e,args:c.args,reply:n,messageId:c.messageId,sourceServiceId:s.sourceServiceId,send:i})}else{const e=`Function "${c.functionName}" not found.`;n&&n(e),a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,{error:e,errCode:"FNC_NOT_FOUND"})}return!0}return!1},execute:async(e,r,s,a,c,l)=>{if(!s){const e="No send buffer function provided.";throw n&&n(e),e}uo+=1;const u=`${i}-${uo}-exec-${e.substring(0,10)}`,d={messageId:u,functionName:e,send:s,sourceServiceId:a,targetServiceId:c,args:r||[],fulfilled:!1,resolve:()=>{},reject:()=>{}};d.promise=new Promise(((e,t)=>{d.resolve=e,d.reject=t}));let p=Ws?new ArrayBuffer(0):Buffer.alloc(0);const h={json:{functionName:e,args:r,messageId:u,type:"execute"}};o(c)&&(p=lo.encode(h,a,c)),t[u]=d,n&&n(`Calling remote function "${e}" with message id "${u}"`);const f="true"===process.env.NO_INVOKE_TIMEOUT;return l?.async?(d.fulfilled=!0,d.resolve([void 0]),delete t[u]):0===l?.timeout||f||(d.timer=setTimeout((()=>{n&&n(`Remote function ${u} timed out`);const r=t[u];r&&!r.fulfilled&&(r.fulfilled=!0,d.reject(`Function ${e} Timed out`)),delete t[u]}),l?.timeout||3e4)),s(p,{sourceServiceId:a,targetServiceId:c,msg:h}),d.promise},sendResponse:a,registerFunction:(e,t)=>{r[e]=t},getTransportSendFunction:e=>{const n=t[e];return n?n.send:null},setServiceName:e=>{i=e},getPendingExecutions:()=>t,rejectAllPending:e=>{Object.keys(t).forEach((n=>{const r=t[n];r&&!r.fulfilled&&(clearTimeout(r.timer),r.fulfilled=!0,r.reject(e),delete t[n])}))},broadcast:(e,t,r,s)=>{uo+=1;const a=`${i}-${uo}-multicast-${e.substring(0,10)}`;let c=Ws?new ArrayBuffer(0):Buffer.alloc(0);const l={json:{functionName:e,args:t,messageId:a,type:"execute"}};let u=o(r[0].serviceId);u&&(c=lo.encode(l,s,r[0].serviceId));for(let t=0;t<r.length;t++)try{const i=r[t];n&&n(`Broadcasting function "${e}" with message id "${a}" to client [${i.serviceId}]`),0!==t&&(u=o(i.serviceId),u&&(c=lo.patchEncodedHeader(c,{toServiceId:i.serviceId}))),i.sendFn(c,{msg:l,sourceServiceId:s,targetServiceId:i.serviceId})}catch(e){n&&n(`Error broadcasting to client at index ${t}`)}},disableServiceEncoding:(e,t)=>{s[e]=t}}}("kweb");xo.setLogger(Eo);const Ao=new a,No=new a;let Oo,Po=null,Lo=null,To=null;const Bo={},jo=()=>{if(!To)throw new Error("API key is required to interact with the hub");return To},Do=(e,t,n)=>{const r=`${e}_${t}`,i={contents:n,lastRequestedAt:Date.now(),contentsChecksum:""};return Bo[r]=i,i},Uo=(e,t)=>Bo[`${e}_${t}`]||null,Mo=async(e,t)=>{if(!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),null;const n=[{serviceName:e,version:t}];return(await xo.execute(ge.GetServiceContents,n,Ro,Po,0))[0]},Fo=async(e,t,n=!1)=>{if(!e||!t)return null;const r=Uo(e,t);if(!r||n){const n=r||Do(e,t);try{const r=await Mo(e,t);return r&&(n.contents=r.uiContent,n.contentsChecksum=r.uiContentsChecksum||""),n.contents||null}catch(n){ko(`Failed to fetch service contents for ${e} v${t}`,n)}}return r?.contents||null},Ro=bo,Wo=()=>{ko("Disconnected from the server"),Po=null,xo.rejectAllPending("Disconnected from the server"),Ao.emit("disconnected")},Go=()=>{ko("Connected to the server"),Ao.emit("connected")},Vo=()=>Lo,Ho=(e,t,n,r)=>`${e}_${t}_${n}_${r}`,zo=async()=>{const e=Vo();if(e){const t=ee(e)?.blocks;if(t){const n={};for(const r in t){const i=t[r];for(const t in i.gates){const r=i.gates[t];if(r.type===He.hubService){const t=r.state;if(t.service?.eventEmitter){const r=`${t.service.name}_${t.service.version}`;if(!n[r])try{ko(`Re-issuing subscription for service ${t.service.name} (${t.service.version})`),n[r]=!0,await aa({listener:{recipeId:e},targetService:{serviceName:t.service.name,version:t.service.version}})}catch(e){ko(`Failed to re-issue subscription for service ${t.service.name} (${t.service.version})`,e)}}}}}}}},qo=async e=>{if(!e)return void ko("Hub sent ACK request without service id");const t={apiKey:jo(),ackSessionId:e};await xo.execute(ge.SocketAckResponse,[t],Ro,e,0),ko("Hub Link acknowledged"),Po=e,Ao.emit("acknowledged"),zo()},Ko=async e=>{const t=e.args[0],n=Ho("broadcast",`hub_${t.type}`,(0).toString(),"");await No.emit(n,t)},Jo=async e=>{const t=e.args[0];for(const e of t.outputs||[])e.type===de.ImageData&&je(e.value)&&(e.value=await Ge(e.value));const n=Vo();if(n){const r=ee(n);if(r){const i=async e=>{const n=Ho("broadcast",t.source.serviceName,t.source.serviceVersion,e);try{await No.emit(n,t)}catch(t){ko(`Failed to emit broadcast event for target ${e}`,t)}};await i("app");for(const s in r.blocks){const o=r.blocks[s];for(const r in o.gates){const s=o.gates[r];if(s.disabled)continue;const a=s.state;if(s.type===He.hubService&&a.service?.name===t.source.serviceName&&a.service?.version===t.source.serviceVersion&&a.variantId===t.variantId){await i(r);for(const i of t.outputs||[])if(null!==i.value&&void 0!==i.value){const t={type:i.type,value:i.value,timestamp:Date.now()};ko(`Sending data to output ${i.name} requested by messageId ${e.messageId}`),await Ms(n,r,i.name,t,t)}}}}}}},Yo=async e=>{const t=e.args[0],{finalState:n,recipeId:r,widgetId:i}=t,s=Us(r,i);let o=s;if(n&&o&&s&&(o={...s,customState:n},Ds(r,i,o,!0)),o?.service)try{const e=Ho("setOutputs",o.service.name,o.service.version,i);await No.emit(e,t.outputs)}catch(e){ko(`Failed to emit setOutputs event for widget ${i}`,e)}for(const n of t.outputs)if(null!==n.value&&void 0!==n.value){if(n.type===de.ImageData){if(!je(n.value)){ko(`Invalid ImageData value received for output ${n.name}. Expected an ImageData-like object`);continue}n.value=await Ge(n.value)}else n.type===de.JsonObj&&$o(n.value);const t={type:n.type,value:n.value,timestamp:Date.now()};ko(`Sending data to output ${n.name} requested by messageId ${e.messageId}`),await Ms(r,i,n.name,t,t)}e.reply({success:[]})},Xo=async e=>{const t=e.args[0],{newState:n,recipeId:r,widgetId:i}=t,s=Us(r,i);if(s){const t={...s,customState:{...s.customState,...n}};return Ds(r,i,t,!0),e.reply({success:[]})}},Zo=async({args:e,reply:t})=>{const n=e[0],{recipeId:r,widgetId:i,path:s,key:o}=n;ko(`Received request to set a dependency path for "${o}" on widget "${i}" in recipe "${r}"`);const a=Us(r,i);if(a){const e={...a};e.dependencies=e.dependencies||{},e.dependencies[o]={path:s},Ds(r,i,e,!0)}return t({success:[]})},Qo=async({args:e,reply:t})=>{const n=e[0],{recipeId:r,widgetId:i,key:s}=n;ko(`Received request to get a dependency path for "${s}" on widget "${i}" in recipe "${r}"`);const o=Us(r,i);if(o){const e=o.dependencies?.[s]?.path;return ko(`Returning dependency path for "${s}" on widget "${i}": "${e}"`),t({success:[e||null]})}return t({error:"Widget not found",errCode:"WIDGET_NOT_FOUND"})},ea=async()=>{if(ko(`Requesting services on ${(new Date).toISOString()}`),!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),{available:[],installed:[],failed:[]};const[e]=await xo.execute(ge.GetServices,[],Ro,Po,0);Oo=e;for(const t of e.available){if(t.internal)continue;const e=Uo(t.name,t.version);if(!e||e?.contentsChecksum!==t.uiContentChecksum)try{const n=e||Do(t.name,t.version);ko(`Service ${t.name} v${t.version} contents have changed, fetching new contents`);const r=await Mo(t.name,t.version);r&&(n.contents=r.uiContent,n.contentsChecksum=t.uiContentChecksum||"")}catch(e){ko(`Failed to update service contents for ${t.name} v${t.version}`,e)}}return e},ta=()=>Oo||{available:[],installed:[],failed:[]},na=()=>!!Oo,ra=async e=>{const{targetServiceSessionId:t}=e;if(!Po)return void ko("No target service session id provided");ko(`Forwarding "onParentEvent" to service ${t}`);return await xo.execute(ge.OnParentEvent,[e],Ro,Po,t,e.config)},ia=async e=>{if(!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),{};const[t]=await xo.execute(ge.GetDefaultState,[],Ro,Po,e);return t},sa=async(e,t,n,r)=>{if(!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),null;const[i]=await xo.execute(ge.UIEvent,[t,n],Ro,Po,e,r);return i},oa=(e,t)=>{const n=()=>{t()};return Ao.on(e,n),()=>Ao.off(e,n)},aa=async e=>{if(Po)return xo.execute(ge.SubscribeToService,[e],Ro,Po,0);ko("Hub Link has not been acknowledged. Cannot subscribe to services.")},ca=async e=>{if(Po)return xo.execute(ge.UnsubscribeFromService,[e],Ro,Po,0);ko("Hub Link has not been acknowledged. Cannot subscribe to services.")},la=(e,t,n,r)=>{const i=Ho("broadcast",t,n,e);return No.on(i,r)},ua=(e,t,n,r)=>{const i=Ho("setOutputs",t,n,e);return No.on(i,r)},da=async(e,t,n)=>Po?xo.execute(e,t,Ro,Po,0,n):(ko("Hub Link has not been acknowledged. Cannot execute function."),null),pa=async e=>{if(!Po)return void ko("Hub Link has not been acknowledged. Cannot execute function.");const t=Us(e.recipeId,e.widgetId);if(!t)throw new Error("Widget or recipe pool not found. Cannot initialize service instance.");const n=Object.keys(t.dependencies||{}).reduce(((e,n)=>(e[n]=t.dependencies?.[n]?.path||null,e)),{}),r=[{currentState:t.customState,recipeId:e.recipeId,widgetId:e.widgetId,variantId:e.variantId,recipeType:e.recipeType,currentDependencies:n}],[i]=await xo.execute(ge.InitializeInstance,r,Ro,Po,e.sessionId);if(i){const t=Us(e.recipeId,e.widgetId);if(t){const n={...t,customState:i};Ds(e.recipeId,e.widgetId,n,!0)}}},ha=async(e,t,n,r)=>{if(!Po)return void ko("Hub Link has not been acknowledged. Cannot execute function.");const i=Us(n,t);if(!i)throw new Error("Widget or recipe pool not found. Cannot initialize service instance.");const s=[{currentState:i.customState,recipeId:n,widgetId:t,variantId:r}];await xo.execute(ge.TerminateInstance,s,Ro,Po,e)},fa=async(e,t,n="^",r)=>{const i=["^","~",">=",">","<=","<","="];if(!i.includes(n))throw new Error(`Invalid compare mode "${n}". Must be one of ${i.join(", ")}`);const s=na(),o=r||!s?await ea():ta();for(const r of o.available)if(r.name===e){if(r.version===t)return r;if(h(r.version,`${n}${t}`))return r}return null};var ga,ma,va,ya,ba,wa,Sa,Ia,_a=async e=>{Io(Go),_o(Wo),To=e,So((({json:e,transmission:t})=>{xo.processMessage("websocket",Ro,t,e)})),xo.registerFunction(ge.SetState,Xo),xo.registerFunction(ge.SetOutputs,Yo),xo.registerFunction(ge.BroadcastEvent,Jo),xo.registerFunction(ge.HubBroadcastEvent,Ko),xo.registerFunction(me.SetDependencyPath,Zo),xo.registerFunction(me.GetDependencyPath,Qo),wo((e=>{((e,t)=>{const n=fe.SocketAcknowledge,r=fe.IpcAcknowledge,i=e.startsWith(n);if(e===r)return t&&t(),0;if(i){const s=e.split(i?n:r),o=parseInt(s[1]);return t&&t(o),o}})(e,qo),((e,t)=>{e===fe.ServicesListChanged&&(t&&t())})(e,(()=>{ko("Services list changed"),Ao.emit("services-changed")}))})),await yo()},$a=(e,t)=>{Ao.on(e,t)},Ca=()=>({getServices:ea,getServiceContents:Fo,onParentEvent:ra,onCommand:oa,getDefaultState:ia,getCachedServices:ta,areServicesCached:na,subscribeToServiceEvents:aa,unsubscribeFromServiceEvents:ca,callProcessorHandler:sa,onBroadcastEvent:la,onSetOutputsEvent:ua,executeHubFunction:da,initializeServiceInstance:pa,terminateServiceInstance:ha,getCompatibleService:fa}),ka=e=>{Lo=e},Ea=()=>xo;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(ga||(ga={})),function(e){e[e.Number=0]="Number",e[e.String=1]="String",e[e.ArrayBuffer=2]="ArrayBuffer",e[e.Array=3]="Array",e[e.Boolean=4]="Boolean",e[e.JsonObj=5]="JsonObj",e[e.Anything=6]="Anything",e[e.ImageData=7]="ImageData",e[e.AudioBuffer=8]="AudioBuffer",e[e.Rect=9]="Rect",e[e.Point=10]="Point",e[e.ImageBitmap=11]="ImageBitmap",e[e.BinaryFile=12]="BinaryFile"}(ma||(ma={})),function(e){e.Number="Number",e.String="String",e.ArrayBuffer="ArrayBuffer",e.Array="Array",e.Boolean="Boolean",e.JsonObj="JsonObj",e.Anything="Anything",e.ImageData="ImageData",e.AudioBuffer="AudioBuffer",e.Rect="Rect",e.Point="Point",e.ImageBitmap="ImageBitmap",e.BinaryFile="BinaryFile"}(va||(va={})),function(e){e.Javascript="js",e.Python="py",e.Executable="exe"}(ya||(ya={})),function(e){e.IpcAcknowledge="iack:",e.SocketAcknowledge="sack:",e.AcknowledgeResponse="ackr:",e.ServicesListChanged="update-services",e.SendManifest="send-manifest",e.BroadcastStart="broadcast-start",e.BroadcastEnd="broadcast-end",e.AssumeSession="assume:"}(ba||(ba={})),function(e){e.GetServices="getServices",e.SubscribeToService="subscribeToService",e.UnsubscribeFromService="unsubscribeFromService",e.GetServiceContents="getServiceContents",e.SocketAckResponse="socketAckResponse",e.ShowSecretsConfigScreen="showSecretsConfigScreen",e.GetMappedSecrets="getMappedSecrets",e.GetSecretContexts="getSecretContexts",e.OnParentEvent="onParentEvent",e.GetDefaultState="getDefaultState",e.BroadcastEvent="broadcastEvent",e.HubBroadcastEvent="hubBroadcastEvent",e.ServiceManifest="serviceManifest",e.GetState="getState",e.SetState="setState",e.SetOutputs="setOutputs",e.UIEvent="uiEvent",e.InitializeInstance="initializeInstance",e.TerminateInstance="terminateInstance",e.ChooseDirectoryDialog="chooseDirectoryDialog",e.ChooseFileDialog="chooseFileDialog",e.GetUniqueId="getUniqueId"}(wa||(wa={})),function(e){e.SetDependencyPath="setDependencyPath",e.GetDependencyPath="getDependencyPath"}(Sa||(Sa={})),function(e){e.IPC="ipc",e.WS="ws"}(Ia||(Ia={}));const xa=e=>{try{return JSON.parse(e)}catch(e){return null}},Aa=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,Na=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(Aa);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},Oa=e=>"*"===e||"x"===e||"X"===e,Pa=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},La=(e,t)=>{if(Oa(e)||Oa(t))return 0;const[n,r]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(Pa(e),Pa(t));return n>r?1:n<r?-1:0},Ta=(e,t)=>{for(let n=0;n<Math.max(e.length,t.length);n++){const r=La(e[n]||"0",t[n]||"0");if(0!==r)return r}return 0},Ba=(e,t,n)=>{Ua(n);const r=((e,t)=>{const n=Na(e),r=Na(t),i=n.pop(),s=r.pop(),o=Ta(n,r);return 0!==o?o:i&&s?Ta(i.split("."),s.split(".")):i||s?i?-1:1:0})(e,t);return ja[n].includes(r)},ja={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]},Da=Object.keys(ja),Ua=e=>{if(-1===Da.indexOf(e))throw new Error(`Invalid operator, expected one of ${Da.join("|")}`)};var Ma="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Fa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ra,Wa,Ga,Va,Ha,za={exports:{}},qa={exports:{}};function Ka(){if(Wa)return Ra;Wa=1;var e=1e3,t=60*e,n=60*t,r=24*n,i=7*r,s=365.25*r;function o(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}return Ra=function(a,c){c=c||{};var l=typeof a;if("string"===l&&a.length>0)return function(o){if((o=String(o)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!a)return;var c=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*s;case"weeks":case"week":case"w":return c*i;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(a);if("number"===l&&isFinite(a))return c.long?function(i){var s=Math.abs(i);if(s>=r)return o(i,s,r,"day");if(s>=n)return o(i,s,n,"hour");if(s>=t)return o(i,s,t,"minute");if(s>=e)return o(i,s,e,"second");return i+" ms"}(a):function(i){var s=Math.abs(i);if(s>=r)return Math.round(i/r)+"d";if(s>=n)return Math.round(i/n)+"h";if(s>=t)return Math.round(i/t)+"m";if(s>=e)return Math.round(i/e)+"s";return i+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}function Ja(){if(Va)return Ga;return Va=1,Ga=function(e){function t(e){let r,i,s,o=null;function a(...e){if(!a.enabled)return;const n=a,i=Number(new Date),s=i-(r||i);n.diff=s,n.prev=r,n.curr=i,r=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,i)=>{if("%%"===r)return"%";o++;const s=t.formatters[i];if("function"==typeof s){const t=e[o];r=s.call(n,t),e.splice(o,1),o--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(i!==t.namespaces&&(i=t.namespaces,s=t.enabled(e)),s),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n<i;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.slice(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=Ka(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t},Ga}var Ya,Xa,Za,Qa,ec,tc={exports:{}};function nc(){return Xa||(Xa=1,Ya=(e,t=process.argv)=>{const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),i=t.indexOf("--");return-1!==r&&(-1===i||r<i)}),Ya}"undefined"==typeof process||"renderer"===process.type||!0===process.browser||process.__nwjs?za.exports=(Ha||(Ha=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=Ja()(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(qa,qa.exports)),qa.exports):za.exports=(ec||(ec=1,function(e,t){const n=k,r=o;t.init=function(e){e.inspectOpts={};const n=Object.keys(t.inspectOpts);for(let r=0;r<n.length;r++)e.inspectOpts[n[r]]=t.inspectOpts[n[r]]},t.log=function(...e){return process.stderr.write(r.formatWithOptions(t.inspectOpts,...e)+"\n")},t.formatArgs=function(n){const{namespace:r,useColors:i}=this;if(i){const t=this.color,i="[3"+(t<8?t:"8;5;"+t),s=` ${i};1m${r} [0m`;n[0]=s+n[0].split("\n").join("\n"+s),n.push(i+"m+"+e.exports.humanize(this.diff)+"[0m")}else n[0]=(t.inspectOpts.hideDate?"":(new Date).toISOString()+" ")+r+" "+n[0]},t.save=function(e){e?process.env.DEBUG=e:delete process.env.DEBUG},t.load=function(){return process.env.DEBUG},t.useColors=function(){return"colors"in t.inspectOpts?Boolean(t.inspectOpts.colors):n.isatty(process.stderr.fd)},t.destroy=r.deprecate((()=>{}),"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),t.colors=[6,2,3,4,5,1];try{const e=function(){if(Qa)return Za;Qa=1;const e=E,t=k,n=nc(),{env:r}=process;let i;function s(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function o(t,s){if(0===i)return 0;if(n("color=16m")||n("color=full")||n("color=truecolor"))return 3;if(n("color=256"))return 2;if(t&&!s&&void 0===i)return 0;const o=i||0;if("dumb"===r.TERM)return o;if("win32"===process.platform){const t=e.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in r)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((e=>e in r))||"codeship"===r.CI_NAME?1:o;if("TEAMCITY_VERSION"in r)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(r.TEAMCITY_VERSION)?1:0;if("truecolor"===r.COLORTERM)return 3;if("TERM_PROGRAM"in r){const e=parseInt((r.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(r.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(r.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(r.TERM)||"COLORTERM"in r?1:o}return n("no-color")||n("no-colors")||n("color=false")||n("color=never")?i=0:(n("color")||n("colors")||n("color=true")||n("color=always"))&&(i=1),"FORCE_COLOR"in r&&(i="true"===r.FORCE_COLOR?1:"false"===r.FORCE_COLOR?0:0===r.FORCE_COLOR.length?1:Math.min(parseInt(r.FORCE_COLOR,10),3)),Za={supportsColor:function(e){return s(o(e,e&&e.isTTY))},stdout:s(o(!0,t.isatty(1))),stderr:s(o(!0,t.isatty(2)))}}();e&&(e.stderr||e).level>=2&&(t.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(e){}t.inspectOpts=Object.keys(process.env).filter((e=>/^debug_/i.test(e))).reduce(((e,t)=>{const n=t.substring(6).toLowerCase().replace(/_([a-z])/g,((e,t)=>t.toUpperCase()));let r=process.env[t];return r=!!/^(yes|on|true|enabled)$/i.test(r)||!/^(no|off|false|disabled)$/i.test(r)&&("null"===r?null:Number(r)),e[n]=r,e}),{}),e.exports=Ja()(t);const{formatters:i}=e.exports;i.o=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts).split("\n").map((e=>e.trim())).join(" ")},i.O=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts)}}(tc,tc.exports)),tc.exports);var rc=Fa(za.exports);const ic=e=>rc(e),sc=Date.now();let oc=Math.ceil(sc/1e3);var ac=()=>oc+=1;const cc=m(x(),"kemu-user-services"),lc=m(x(),"kemu-test-services"),uc="KMU-CB-v1";var dc;!function(e){e.input="input",e.counter="counter",e.play="play",e.elapsed="elapsed",e.ifGate="ifGate",e.skipEvent="skipEvent",e.between="between",e.map="map",e.parser="parser",e.slider="slider",e.suspend="suspend",e.display="display",e.pixelfy="pixelfy",e.json="json",e.arrayItem="arrayItem",e.extractImage="extractImage",e.imageConvolution="imageConvolution",e.firstEvent="firstEvent",e.pixelDraw="pixelDraw",e.randomBetween="randomBetween",e.arrayCombine="arrayCombine",e.clock="clock",e.multiplication="multiplication",e.object="object",e.widgetGroup="widgetGroup",e.script="script",e.base64ToImageData="base64ToImageData",e.jsonParse="jsonParse",e.text="text",e.imageCrop="imageCrop",e.imageResize="imageResize",e.value="value",e.imageWarp="imageWarp",e.widgetBundle="widgetBundle",e.sequence="sequence",e.variable="variable",e.hubService="hubService"}(dc||(dc={}));const pc=e=>({...e,type:Array.isArray(e.type)?e.type.map((e=>ma[e])):ma[e.type]}),hc=async e=>{try{return await w(e,"utf-8")}catch(e){return null}},fc=e=>{if(e&&e.startsWith(uc)){const t=e.slice(9),n=decodeURI(t);return xa(n)}return null},gc=async(e,t,n)=>{let r=[];e.variants?.length&&(r=e.variants.map((e=>({...e,...e.inputs?{inputs:e.inputs.map(pc)}:{},...e.outputs?{outputs:e.outputs.map(pc)}:{}}))));const i={...e,path:t,customWidgets:[],...e.inputs?{inputs:e.inputs.map(pc)}:{inputs:[]},...e.outputs?{outputs:e.outputs.map(pc)}:{outputs:[]},variants:r,...e.widgetUI&&n?.widgetUIContents?{widgetUIContents:n.widgetUIContents}:{}},s=await(async(e,t,n=console.log)=>{const r=[];if(t.customWidgets?.length)for(const i of t.customWidgets){const t=await hc(m(e,i));if(!t){n(`Error loading custom widget file ${i}`);continue}const s=t.startsWith(uc)?t:`${uc}${t}`,o=fc(s);if(!o){n(`Custom widget file "${i}" is not a valid Kemu Clipboard item`);continue}const a=Object.values(o).filter((e=>e.type===dc.widgetGroup&&!e.groupId));if(a.length>1){n(`Custom widget file "${i}" contains more than one top level widgetGroup`);continue}const c=a[0];if(!c){n(`Custom widget file "${i}" does not contain a top level widgetGroup`);continue}const l=c.state,u={name:l.name,color:l.color,description:l.description,contents:s,rootGroupId:c.id,icon:l.icon,protocolVersion:l.protocolVersion||"2"};r.push(u)}return r})(t,e,n?.log);if(s.length?i.customWidgets=s:delete i.customWidgets,i.variants?.length)for(const e of i.variants)if(e.svgIcon)try{const n=await w(m(t,e.svgIcon),"utf-8");e.svgIcon=n}catch(t){n?.log&&n?.log(`Error loading svgIcon for variant ${e.id}: ${t}`)}return i},mc=async e=>{try{return await S(e,I.F_OK),!0}catch{return!1}};let vc=null,yc=null;const bc=()=>vc||cc,wc=ic("servicesManager"),Sc={};let Ic=null,_c=null,$c=null;class Cc extends Error{code;originalError;constructor(e,t,n){super(e),this.code=t,this.originalError=n,this.name="ServiceError"}}const kc=async e=>{try{return await S(e),!0}catch{return!1}},Ec=async e=>{if(!Ic)throw new Error('IPC config not set, call "setHubIpcConfig" first.');try{if(e.processor===ya.Javascript){wc(`Spawning service ${e.name} with sessionId ${e.sessionId}`);const t=g.join(e.path,"processor.js"),n=g.join(e.path,"processor.mjs"),r=await kc(t)?t:n,i=[`--sessionId=${e.sessionId.toString()}`,`--ipcSpace=${Ic.appSpace}`,`--ipcId=${Ic?.id}`,`--recipePath=${Ic.recipePath||""}`];if(e.internal&&i.push("--internal=true"),!$c)throw new Error('Get secrets function not set, call "setGetSecretsFunction" first.');const s=await $c({name:e.name,version:e.version,requiredSecrets:e.requiredSecrets||{}}),o=Object.entries(e.requiredSecrets||{}).filter((([e,t])=>{const n=s[e];return null==n&&!t.optional})).map((([e])=>e));if(o?.length)throw new Cc(`Missing required environment variables: ${o.join(", ")}`,"MISSING_REQUIRED_SECRETS");return new Promise(((t,n)=>{if(!_c)throw new Error('Spawn function not set, call "setSpawnNodeFunction" first.');const o=_c({args:[r,...i],serviceInfo:{name:e.name,version:e.version},options:{env:s}});o.stdout.on("data",(t=>{wc(`[${e.name}] - stdout: ${t}`)})),o.stderr.on("data",(t=>{wc(`[${e.name}] - stderr: ${t}`)})),o.on("exit",(t=>{wc(`[${e.name}] exited with code ${t}`)})),o.on("spawn",(()=>{wc(`[${e.name}] spawned with PID ${o.pid}`),t(o)})),o.on("error",(t=>{wc(`[${e.name}] error: ${t}`),n(new Cc(`Error spawning service ${e.name}: ${t}`,"SPAWN_ERROR"))}))}))}throw`Unsupported processor type ${e.processor}`}catch(t){if(t instanceof Cc)throw t;throw`Error spawning service ${e.name}: ${t}`}},xc=e=>{if(!e?.name)return"Missing name";if(!e?.version)return"Missing version";if(!e?.description)return"Missing description";if(!e?.processor)return"Missing processor";return[ya.Javascript,ya.Executable,ya.Python].includes(e?.processor)?null:"Invalid processor"},Ac=async(e,t)=>{const n=g.join(e,"manifest.json");if(!await kc(n)){const t=`Missing manifest for service ${e}. Aborting.`;return wc(t),{error:t}}const r=await w(n,"utf-8"),i=xa(r),s=xc(i);if(!i||s){const t=`Invalid service manifest [${e}]: ${s}. Aborting.`;return wc(t),{error:t}}let o;if(delete i.internal,t?.singleServiceName&&i.name!==t.singleServiceName){return{error:`Skipping service ${i.name} as it does not match the singleServiceName option`}}await Promise.all([(async()=>{if(i.widgetUI)try{o=await w(g.join(e,"widgetUI.js"))}catch(e){const t=`Error loading widgetUI file ${i.name}: ${e}`;return wc(t),{error:t}}})(),(async()=>{if(i.svgIcon){const t=await hc(g.join(e,i.svgIcon));if(!t){return{error:`Error loading icon for service ${i.name}`}}i.svgIcon=t}})(),(async()=>{if(i.subServices?.length)for(const t of i.subServices){const n=g.join(e,t),{error:r,service:s}=await Ac(n);r?wc(`Error loading sub-service ${t}: ${r}`):s&&(s.info.parentService={name:i.name,version:i.version})}delete i.subServices})(),(async()=>{if(i.variants?.length)for(const t of i.variants)if(t.svgIcon)try{const n=await w(g.join(e,t.svgIcon),"utf-8");t.svgIcon=n}catch(e){wc(`Error loading svgIcon for variant ${t.id}: ${e}`)}})()]);const a=ac(),c=t?.fixedSession||a;wc(`Loaded service ${i.name} with sessionId ${c}`);const l=await gc(i,e,{widgetUIContents:o});return Nc(l),Sc[c]={info:{...l,path:e,sessionId:c},status:"loaded",childProcess:null},{service:Sc[c]}},Nc=e=>{e.widgetUIContents?e.uiContentChecksum=(e=>{const t=p("sha256");return t.update(e),t.digest("hex")})(e.widgetUIContents):e.uiContentChecksum=void 0},Oc=async e=>{try{return e.childProcess=await Ec(e.info),e.status="started",e.errorMsg=void 0,e.errorCode=void 0,!0}catch(t){return wc(`Service [${e.info.name}] error: ${t}`),e.status="error",t instanceof Cc?(e.errorMsg=t.message,e.errorCode=t.code):(e.errorMsg="string"==typeof t?t:JSON.stringify(t),e.errorCode="UNKNOWN_ERROR"),!1}},Pc=e=>{const{path:t,...n}=e.info;return{...n}},Lc=()=>Object.values(Sc).filter((e=>"running"===e.status)).map(Pc),Tc=e=>{const{serviceName:t,version:n,force:r}=e,i=Object.values(Sc).find((t=>t.info.name===e.serviceName&&t.info.version===e.version));if(!i)return null;if(i.info.internal&&!r)throw`Cannot stop internal service ${t}`;if(i.childProcess){wc(`Stopping service "${t} (v${n})"`);i.childProcess.kill("SIGINT")||wc(`Failed to stop service ${t}`)}return i.status="stopped",wc(`Service ${t} stopped`),i},Bc=e=>e.info.internal?e.info.path:g.join(e.info.path,".."),jc=e=>!!e.internal;var Dc={isOfficialKemuService:e=>e.name.startsWith("kemu.io"),loadServices:async(e,t)=>{if(!await mc(e))return void wc(`Failed to load services from "${e}". Directory does not exist.`);const n=(await _(e,{withFileTypes:!0})).filter((e=>e.isDirectory())).map((e=>e.name));wc(`Found ${n.length} services in "${e}"`);for(let r=0;r<n.length;r++){const i=n[r],s=g.join(e,i),{error:o,service:a}=await Ac(`${s}${t?.internalServices?"":"/dist"}`,t);o&&wc(`Failed to load service ${s}. Please check logs`),a&&t?.internalServices&&(a.info.internal=!0)}},launchServices:async e=>{if(wc("Initializing services"),!Ic)throw new Error('IPC config not set, call "setHubIpcConfig" first.');for(const t in Sc){const n=Sc[t];e.noSpawningList&&e.noSpawningList.includes(n.info.name)?wc(`Service ${n.info.name} is in the noSpawningList. Skipping.`):Oc(n)}wc("Services initialized")},setServiceStatus:(e,t)=>{const n=Sc[e];return n?(n.status=t,!0):(wc(`Service with serviceId ${e} not found`),!1)},getActiveServices:Lc,getMatchingService:(e,t)=>{const n=Object.values(Sc).filter((e=>"running"===e.status));for(const r of n)if(r.info.name===e){if(r.info.version===t)return r;if(Ba(r.info.version,t,">="))return r}return null},getServiceBySessionId:e=>Sc[e]||null,killAllServices:()=>{for(const e in Sc){const t=Sc[e];if(t.childProcess)try{wc(`Killing service ${t.info.name} with PID ${t.childProcess.pid}`),t.childProcess.kill()}catch(e){wc(`Error killing service ${t.info.name}: ${e}`)}}},addDevService:async(e,t,n)=>{const r={info:{...await gc(t,t.path),sessionId:e},status:n,startedAt:new Date,devMode:!0,childProcess:null};Sc[e]=r,Nc(Sc[e].info)},setServiceManifest:(e,t,n)=>{const r=Sc[e];if(!r)return wc(`Service with sessionId ${e} not found`),!1;const i=xc(t);if(i)return wc(`Invalid manifest for service ${r.info.name}: ${i}`),!1;Nc(t),r.info={...r.info,...t},n&&(r.status=n)},getMatchingDevService:(e,t,n)=>{const r=Object.values(Sc).filter((e=>e.devMode));for(const i of r)if(i.info.name===e&&i.status===n&&i.info.version===t)return i;return null},getInternalServices:()=>Lc().filter((e=>e.internal)),getAllServices:()=>Object.values(Sc),stopService:Tc,uninstallService:async(e,t)=>{wc(`Uninstalling service ${e} v${t}`);const n=Tc({serviceName:e,version:t});if(!n)return!1;wc(`Service ${e} stopped. Removing from disk...`);const r=Bc(n),i=bc();return r.startsWith(i)?(await $(r,{recursive:!0,force:!0}),wc(`Service ${e} successfully removed from disk`),(e=>{const t=Sc[e];delete Sc[e]})(n.info.sessionId),!0):(wc(`Service ${e} is not installed in the user services directory. Aborting.`),!1)},getAllServiceVersions:e=>Object.values(Sc).filter((t=>t.info.name===e)),setHubIpcConfig:e=>{Ic={...e}},loadAndLaunch:async(e,t,n)=>{const r=y(e,t),{error:i,service:s}=await Ac(r);if(i||!s)return{errorMsg:i};try{s.info.internal=!!n,s.childProcess=await Ec(s.info),s.status="started"}catch(e){s.status="error",e instanceof Cc?(wc(`Service spawning error: ${e.message} (${e.code})`),s.errorMsg=e.message,s.errorCode=e.code):(wc(`Error launching service ${s.info.name}: ${e}`),s.errorMsg="string"==typeof e?e:JSON.stringify(e))}return{service:s,errorCode:s.errorCode,errorMsg:s.errorMsg}},getServiceRootDirectory:Bc,setSpawnNodeFunction:e=>{_c=e},setGetSecretsFunction:e=>{$c=e},restartService:async(e,t)=>{wc(`Restarting service ${e} v${t}`);const n=Tc({serviceName:e,version:t,force:!0});return!!n&&Oc(n)},getFailedServices:()=>Object.values(Sc).filter((e=>"error"===e.status)).map((e=>({...Pc(e),errorMsg:e.errorMsg||"",errorCode:e.errorCode,status:e.status}))),isInternalKemuService:jc,isNotInternalKemuService:e=>!jc(e),isNotDevService:e=>!e.devMode};class Uc{constructor(){}appspace="app.";socketRoot="/tmp/";id=E.hostname();encoding="utf8";rawBuffer=!1;sync=!1;unlink=!0;delimiter="\f";silent=!1;logDepth=5;logInColor=!0;logger=console.log.bind(console);maxConnections=100;retry=500;maxRetries=1/0;stopRetrying=!1;IPType=function(){const e=E.networkInterfaces();let t="";e&&Array.isArray(e)&&e.length>0&&(t=e[Object.keys(e)[0]][0].family);return t}();tls=!1;networkHost="IPv6"==this.IPType?"::1":"127.0.0.1";networkPort=8e3;readableAll=!1;writableAll=!1;interface={localAddress:!1,localPort:!1,family:!1,hints:!1,lookup:!1}}class Mc{constructor(e){e||(e=new Uc),this.delimiter=e.delimiter}format(e){return e.data||!1===e.data||0===e.data||(e.data={}),e.data._maxListeners&&(e.data={}),e=e.JSON+this.delimiter}parse(e){let t=e.split(this.delimiter);return t.pop(),t}}var Fc=function(){Object.defineProperties(this,{data:{enumerable:!0,get:function(){return t},set:function(e){t=e}},type:{enumerable:!0,get:function(){return e},set:function(t){e=t}},load:{enumerable:!0,writable:!1,value:function(n){try{n=JSON.parse(n);e=n.type,t=n.data}catch(r){e="error",t={message:"Invalid JSON response format",err:r,response:n}}}},JSON:{enumerable:!0,get:function(){return JSON.stringify({type:e,data:t})}}});var e="",t={}},Rc=Fa(Fc);var Wc=Fa((function(){Object.defineProperties(this,{add:{enumerable:!0,writable:!1,value:function(){for(var n in arguments)e.push(arguments[n]);t||this.stop||!this.autoRun||this.next()}},next:{enumerable:!0,writable:!1,value:function(){if(t=!0,e.length<1||this.stop)return void(t=!1);e.shift().bind(this)()}},clear:{enumerable:!0,writable:!1,value:function(){return e=[]}},contents:{enumerable:!1,get:function(){return e},set:function(t){return e=t}},autoRun:{enumerable:!0,writable:!0,value:!0},stop:{enumerable:!0,writable:!0,value:!1}});var e=[],t=!1}));class Gc{}class Vc{}const Hc=new class{constructor(e=!0){this.strict=e}throw(e,t){let n=new TypeError;if(n.message=`expected type of ${e} to be ${t}`,!this.strict)return!1;throw n}typeCheck(e,t){return typeof e===t||this.throw(typeof e,t)}instanceCheck(e=new Gc,t=Vc){return e instanceof t||this.throw(typeof e,t.name)}symbolStringCheck(e,t){return Object.prototype.toString.call(e)==`[object ${t}]`||this.throw(Object.prototype.toString.call(e),`[object ${t}]`)}compare(e,t,n){return e==t||this.throw(typeof e,n)}finite(e){return!!isFinite(e)||this.throw(typeof e,"finite")}NaN(e){return this.number(e)?!!isNaN(e)||this.throw(typeof e,"NaN"):this.number(e)}null(e){return this.compare(e,null,"null")}array(e){return this.instanceCheck(e,Array)}boolean(e){return this.typeCheck(e,"boolean")}bigint(e){return this.typeCheck(e,"bigint")}date(e){return this.instanceCheck(e,Date)}generator(e){return this.symbolStringCheck(e,"Generator")}asyncGenerator(e){return this.symbolStringCheck(e,"AsyncGenerator")}globalThis(e){return this.compare(e,globalThis,"explicitly globalThis, not window, global nor self")}infinity(e){return this.compare(e,1/0,"Infinity")}map(e){return this.instanceCheck(e,Map)}weakMap(e){return this.instanceCheck(e,WeakMap)}number(e){return this.typeCheck(e,"number")}object(e){return this.typeCheck(e,"object")}promise(e){return this.instanceCheck(e,Promise)}regExp(e){return this.instanceCheck(e,RegExp)}undefined(e){return this.typeCheck(e,"undefined")}set(e){return this.instanceCheck(e,Set)}weakSet(e){return this.instanceCheck(e,WeakSet)}string(e){return this.typeCheck(e,"string")}symbol(e){return this.typeCheck(e,"symbol")}function(e){return this.typeCheck(e,"function")}asyncFunction(e){return this.symbolStringCheck(e,"AsyncFunction")}generatorFunction(e){return this.symbolStringCheck(e,"GeneratorFunction")}asyncGeneratorFunction(e){return this.symbolStringCheck(e,"AsyncGeneratorFunction")}error(e){return this.instanceCheck(e,Error)}evalError(e){return this.instanceCheck(e,EvalError)}rangeError(e){return this.instanceCheck(e,RangeError)}referenceError(e){return this.instanceCheck(e,ReferenceError)}syntaxError(e){return this.instanceCheck(e,SyntaxError)}typeError(e){return this.instanceCheck(e,TypeError)}URIError(e){return this.instanceCheck(e,URIError)}bigInt64Array(e){return this.instanceCheck(e,BigInt64Array)}bigUint64Array(e){return this.instanceCheck(e,BigUint64Array)}float32Array(e){return this.instanceCheck(e,Float32Array)}float64Array(e){return this.instanceCheck(e,Float64Array)}int8Array(e){return this.instanceCheck(e,Int8Array)}int16Array(e){return this.instanceCheck(e,Int16Array)}int32Array(e){return this.instanceCheck(e,Int32Array)}uint8Array(e){return this.instanceCheck(e,Uint8Array)}uint8ClampedArray(e){return this.instanceCheck(e,Uint8ClampedArray)}uint16Array(e){return this.instanceCheck(e,Uint16Array)}uint32Array(e){return this.instanceCheck(e,Uint32Array)}arrayBuffer(e){return this.instanceCheck(e,ArrayBuffer)}dataView(e){return this.instanceCheck(e,DataView)}sharedArrayBuffer(e){return this.instanceCheck(e,function(){try{return SharedArrayBuffer}catch{return Gc}}())}intlDateTimeFormat(e){return this.instanceCheck(e,Intl.DateTimeFormat)}intlCollator(e){return this.instanceCheck(e,Intl.Collator)}intlDisplayNames(e){return this.instanceCheck(e,Intl.DisplayNames)}intlListFormat(e){return this.instanceCheck(e,Intl.ListFormat)}intlLocale(e){return this.instanceCheck(e,Intl.Locale)}intlNumberFormat(e){return this.instanceCheck(e,Intl.NumberFormat)}intlPluralRules(e){return this.instanceCheck(e,Intl.PluralRules)}intlRelativeTimeFormat(e){return this.instanceCheck(e,Intl.RelativeTimeFormat)}intlRelativeTimeFormat(e){return this.instanceCheck(e,Intl.RelativeTimeFormat)}finalizationRegistry(e){return this.instanceCheck(e,FinalizationRegistry)}weakRef(e){return this.instanceCheck(e,WeakRef)}};class zc{constructor(){}on(e,t,n=!1){return Hc.string(e),Hc.function(t),Hc.boolean(n),"*"==e&&(e=this.#e),this.#t[e]||(this.#t[e]=[]),t[this.#n]=n,this.#t[e].push(t),this}once(e,t){return this.on(e,t,!0)}off(e="*",t="*"){if(Hc.string(e),e!=this.#e.toString()&&"*"!=e||(e=this.#e),!this.#t[e])return this;if("*"==t)return delete this.#t[e],this;Hc.function(t);const n=this.#t[e];for(;n.includes(t);)n.splice(n.indexOf(t),1);return n.length<1&&delete this.#t[e],this}emit(e,...t){Hc.string(e);const n=this.#t[this.#e]||[];if(this.#r(this.#e.toString(),n,e,...t),!this.#t[e])return this;const r=this.#t[e];return this.#r(e,r,...t),this}reset(){this.off(this.#e.toString());for(let e in this.#t)this.off(e);return this}get list(){return Object.assign({},this.#t)}#r=(e,t,...n)=>{Hc.string(e),Hc.array(t);const r=[];for(let e of t)e(...n),e[this.#n]&&r.push(e);for(let t of r)this.off(e,t)};#e=Symbol.for("event-pubsub-all");#n=Symbol.for("event-pubsub-once");#t={}}let qc=new Mc;class Kc extends zc{constructor(e,t){super(),this.config=e,this.log=t,this.publish=super.emit,e.maxRetries&&(this.retriesRemaining=e.maxRetries),qc=new Mc(this.config)}Client=Kc;queue=new Wc;socket=!1;connect=Xc;emit=Jc;retriesRemaining=0;explicitlyDisconnected=!1}function Jc(e,t){this.log("dispatching event to ",this.id,this.path," : ",e,",",t);let n=new Rc;n.type=e,n.data=t,n=this.config.rawBuffer?Buffer.from(e,this.config.encoding):qc.format(n),this.config.sync?this.queue.add(Yc.bind(this,n)):this.socket.write(n)}function Yc(e){this.log("dispatching event to ",this.id,this.path," : ",e),this.socket.write(e)}function Xc(){let e=this;if(e.log("requested connection to ",e.id,e.path),!this.path)return void e.log("\n\n######\nerror: ",e.id," client has not specified socket path it wishes to connect to.");const t={};if(e.port)if(t.host=e.path,t.port=e.port,e.config.interface.localAddress&&(t.localAddress=e.config.interface.localAddress),e.config.interface.localPort&&(t.localPort=e.config.interface.localPort),e.config.interface.family&&(t.family=e.config.interface.family),e.config.interface.hints&&(t.hints=e.config.interface.hints),e.config.interface.lookup&&(t.lookup=e.config.interface.lookup),e.config.tls){if(e.log("Connecting client via TLS to",e.path,e.port,e.config.tls),e.config.tls.private&&(e.config.tls.key=O.readFileSync(e.config.tls.private)),e.config.tls.public&&(e.config.tls.cert=O.readFileSync(e.config.tls.public)),e.config.tls.trustedConnections){"string"==typeof e.config.tls.trustedConnections&&(e.config.tls.trustedConnections=[e.config.tls.trustedConnections]),e.config.tls.ca=[];for(let t=0;t<e.config.tls.trustedConnections.length;t++)e.config.tls.ca.push(O.readFileSync(e.config.tls.trustedConnections[t]))}Object.assign(e.config.tls,t),e.socket=N.connect(e.config.tls)}else e.log("Connecting client via TCP to",t),e.socket=A.connect(t);else e.log("Connecting client on Unix Socket :",e.path),t.path=e.path,"win32"!==process.platform||e.path.startsWith("\\\\.\\pipe\\")||(t.path=t.path.replace(/^\//,""),t.path=t.path.replace(/\//g,"-"),t.path=`\\\\.\\pipe\\${t.path}`),e.socket=A.connect(t);e.socket.setEncoding(this.config.encoding),e.socket.on("error",(function(t){e.log("\n\n######\nerror: ",t),e.publish("error",t)})),e.socket.on("connect",(function(){e.publish("connect"),e.retriesRemaining=e.config.maxRetries,e.log("retrying reset")})),e.socket.on("close",(function(){if(e.log("connection closed",e.id,e.path,e.retriesRemaining,"tries remaining of",e.config.maxRetries),e.config.stopRetrying||e.retriesRemaining<1||e.explicitlyDisconnected)return e.publish("disconnect"),e.log(e.config.id,"exceeded connection rety amount of"," or stopRetrying flag set."),e.socket.destroy(),e.publish("destroy"),void(e=void 0);setTimeout(function(){e.explicitlyDisconnected||(e.retriesRemaining--,e.connect())}.bind(null,e),e.config.retry),e.publish("disconnect")})),e.socket.on("data",(function(t){if(e.log("## received events ##"),e.config.rawBuffer){if(e.publish("data",Buffer.from(t,e.config.encoding)),!e.config.sync)return;return void e.queue.next()}if(this.ipcBuffer||(this.ipcBuffer=""),(t=this.ipcBuffer+=t).slice(-1)!=qc.delimiter||-1==t.indexOf(qc.delimiter))return void e.log("Messages are large, You may want to consider smaller messages.");this.ipcBuffer="";const n=qc.parse(t),r=n.length;for(let t=0;t<r;t++){let r=new Rc;r.load(n[t]),e.log("detected event",r.type,r.data),e.publish(r.type,r.data)}e.config.sync&&e.queue.next()}))}let Zc=new Mc;class Qc extends zc{constructor(e,t,n,r){super(),this.config=t,this.path=e,this.port=r,this.log=n,this.publish=super.emit,Zc=new Mc(this.config),this.on("close",nl.bind(this))}udp4=!1;udp6=!1;server=!1;sockets=[];emit=el;broadcast=tl;onStart(e){this.publish("start",e)}stop(){this.server.close()}start(){this.path?this.config.unlink?O.unlink(this.path,ol.bind(this)):ol.bind(this)():this.log("Socket Server Path not specified, refusing to start")}}function el(e,t,n){this.log("dispatching event to socket"," : ",t,n);let r=new Rc;if(r.type=t,r.data=n,this.config.rawBuffer?(this.log(this.config.encoding),r=Buffer.from(t,this.config.encoding)):r=Zc.format(r),this.udp4||this.udp6)return e.address&&e.port?void this.server.write(r,e):(this.log("Attempting to emit to a single UDP socket without supplying socket address or port. Redispatching event as broadcast to all connected sockets"),void this.broadcast(t,n));e.write(r)}function tl(e,t){this.log("broadcasting event to all known sockets listening to ",this.path," : ",this.port?this.port:"",e,t);let n=new Rc;if(n.type=e,n.data=t,n=this.config.rawBuffer?Buffer.from(e,this.config.encoding):Zc.format(n),this.udp4||this.udp6)for(let e=1,t=this.sockets.length;e<t;e++)this.server.write(n,this.sockets[e]);else for(let e=0,t=this.sockets.length;e<t;e++)this.sockets[e].write(n)}function nl(){for(let e=0,t=this.sockets.length;e<t;e++){let t=this.sockets[e],n=!1;if(!t||!t.readable)return t.id&&(n=t.id),this.log("socket disconnected",n.toString()),t&&t.destroy&&t.destroy(),this.sockets.splice(e,1),void this.publish("socket.disconnected",t,n)}}function rl(e,t,n){let r=this.udp4||this.udp6?n:e;if(this.config.rawBuffer)return t=Buffer.from(t,this.config.encoding),void this.publish("data",t,r);if(r.ipcBuffer||(r.ipcBuffer=""),(t=r.ipcBuffer+=t).slice(-1)==Zc.delimiter&&-1!=t.indexOf(Zc.delimiter))for(r.ipcBuffer="",t=Zc.parse(t);t.length>0;){let e=new Rc;e.load(t.shift()),e.data&&e.data.id&&(r.id=e.data.id),this.log("received event of : ",e.type,e.data),this.publish(e.type,e.data,r)}else this.log("Messages are large, You may want to consider smaller messages.")}function il(e){this.publish("close",e)}function sl(e){this.sockets.push(e),e.setEncoding&&e.setEncoding(this.config.encoding),this.log("## socket connection to server detected ##"),e.on("close",il.bind(this)),e.on("error",function(e){this.log("server socket error",e),this.publish("error",e)}.bind(this)),e.on("data",rl.bind(this,e)),e.on("message",function(t,n){if(!n)return;let r;this.log("Received UDP message from ",n.address,n.port),r=this.config.rawSocket?Buffer.from(t,this.config.encoding):t.toString(),e.emit("data",r,n)}.bind(this)),this.publish("connect",e),this.config.rawBuffer}function ol(){return this.log("starting server on ",this.path,this.port?`:${this.port}`:""),this.udp4||this.udp6?(this.server=L.createSocket(this.udp4?"udp4":"udp6"),this.server.write=cl.bind(this),this.server.on("listening",function(){sl.bind(this)(this.server)}.bind(this))):(this.log("starting TLS server",this.config.tls),this.config.tls?al.bind(this)():this.server=A.createServer(sl.bind(this))),this.server.on("error",function(e){this.log("server error",e),this.publish("error",e)}.bind(this)),this.server.maxConnections=this.config.maxConnections,this.port?this.udp4||this.udp6?(this.log("starting server as",this.udp4?"udp4":"udp6"),this.server.bind(this.port,this.path),void this.onStart({address:this.path,port:this.port})):(this.log("starting server as",this.config.tls?"TLS":"TCP"),void this.server.listen(this.port,this.path,this.onStart.bind(this))):(this.log("starting server as","Unix || Windows Socket"),"win32"===process.platform&&(this.path=this.path.replace(/^\//,""),this.path=this.path.replace(/\//g,"-"),this.path=`\\\\.\\pipe\\${this.path}`),void this.server.listen({path:this.path,readableAll:this.config.readableAll,writableAll:this.config.writableAll},this.onStart.bind(this)))}function al(){if(this.log("starting TLS server",this.config.tls),this.config.tls.private?this.config.tls.key=O.readFileSync(this.config.tls.private):this.config.tls.key=O.readFileSync(`${__dirname}/../local-node-ipc-certs/private/server.key`),this.config.tls.public?this.config.tls.cert=O.readFileSync(this.config.tls.public):this.config.tls.cert=O.readFileSync(`${__dirname}/../local-node-ipc-certs/server.pub`),this.config.tls.dhparam&&(this.config.tls.dhparam=O.readFileSync(this.config.tls.dhparam)),this.config.tls.trustedConnections){"string"==typeof this.config.tls.trustedConnections&&(this.config.tls.trustedConnections=[this.config.tls.trustedConnections]),this.config.tls.ca=[];for(let e=0;e<this.config.tls.trustedConnections.length;e++)this.config.tls.ca.push(O.readFileSync(this.config.tls.trustedConnections[e]))}this.server=N.createServer(this.config.tls,sl.bind(this))}function cl(e,t){let n=Buffer.from(e,this.config.encoding);this.server.send(n,0,n.length,t.port,t.address,(function(e){e&&(this.log("error writing data to socket",e),this.publish("error",(function(e){this.publish("error",e)})))}))}class ll{constructor(){}config=new Uc;of={};server=!1;get connectTo(){return gl}get connectToNet(){return ml}get disconnect(){return dl}get serve(){return pl}get serveNet(){return fl}get log(){return ul}set connectTo(e){return gl}set connectToNet(e){return ml}set disconnect(e){return dl}set serve(e){return pl}set serveNet(e){return fl}set log(e){return ul}}function ul(...e){if(!this.config.silent){for(let t=0,n=e.length;t<n;t++)"object"==typeof e[t]&&(e[t]=o.inspect(e[t],{depth:this.config.logDepth,colors:this.config.logInColor}));this.config.logger(e.join(" "))}}function dl(e){this.of[e]&&(this.of[e].explicitlyDisconnected=!0,this.of[e].off("*","*"),this.of[e].socket&&this.of[e].socket.destroy&&this.of[e].socket.destroy(),delete this.of[e])}function pl(e,t){"function"==typeof e&&(t=e,e=!1),e||(this.log("Server path not specified, so defaulting to","ipc.config.socketRoot + ipc.config.appspace + ipc.config.id",this.config.socketRoot+this.config.appspace+this.config.id),e=this.config.socketRoot+this.config.appspace+this.config.id),t||(t=hl),this.server=new Qc(e,this.config,ul),this.server.on("start",t)}function hl(){}function fl(e,t,n,r){"number"==typeof e&&(r=n,n=t,t=e,e=!1),"function"==typeof e&&(r=e,n=!1,e=!1,t=!1),e||(this.log("Server host not specified, so defaulting to","ipc.config.networkHost",this.config.networkHost),e=this.config.networkHost),"udp4"!=e.toLowerCase()&&"udp6"!=e.toLowerCase()||(r=t,n=e.toLowerCase(),t=!1,e=this.config.networkHost),"string"==typeof t&&(r=n,n=t,t=!1),"function"==typeof t&&(r=t,n=!1,t=!1),t||(this.log("Server port not specified, so defaulting to","ipc.config.networkPort",this.config.networkPort),t=this.config.networkPort),"function"==typeof n&&(r=n,n=!1),r||(r=hl),this.server=new Qc(e,this.config,ul,t),n&&(this.server[n]=!0,"udp4"===n&&"::1"===e&&(this.server.path="127.0.0.1")),this.server.on("start",r)}function gl(e,t,n){if("function"==typeof t&&(n=t,t=!1),n||(n=hl),e){if(t||(this.log("Service path not specified, so defaulting to","ipc.config.socketRoot + ipc.config.appspace + id",(this.config.socketRoot+this.config.appspace+e).data),t=this.config.socketRoot+this.config.appspace+e),this.of[e]){if(!this.of[e].socket.destroyed)return this.log("Already Connected to",e,"- So executing success without connection"),void n();this.of[e].socket.destroy()}this.of[e]=new Kc(this.config,this.log),this.of[e].id=e,this.of[e].socket&&(this.of[e].socket.id=e),this.of[e].path=t,this.of[e].connect(),n(this)}else this.log("Service id required","Requested service connection without specifying service id. Aborting connection attempt")}function ml(e,t,n,r){if(e){if("number"==typeof t&&(r=n,n=t,t=!1),"function"==typeof t&&(r=t,t=!1,n=!1),t||(this.log("Server host not specified, so defaulting to","ipc.config.networkHost",this.config.networkHost),t=this.config.networkHost),"function"==typeof n&&(r=n,n=!1),n||(this.log("Server port not specified, so defaulting to","ipc.config.networkPort",this.config.networkPort),n=this.config.networkPort),"string"==typeof r&&(UDPType=r,r=!1),r||(r=hl),this.of[e]){if(!this.of[e].socket.destroyed)return this.log("Already Connected to",e,"- So executing success without connection"),void r();this.of[e].socket.destroy()}this.of[e]=new Kc(this.config,this.log),this.of[e].id=e,this.of[e].socket&&(this.of[e].socket.id=e),this.of[e].path=t,this.of[e].port=n,this.of[e].connect(),r(this)}else this.log("Service id required","Requested service connection without specifying service id. Aborting connection attempt")}const vl=new class extends ll{constructor(){super()}IPC=ll};var yl={id:"widgets",retry:1500,silent:!0,rawBuffer:!0,appspace:"kemu.",encoding:"hex"};const bl=Object.values({protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8}).reduce(((e,t)=>e+t),0),wl=e=>{try{return JSON.parse(e)}catch(e){return null}},Sl="undefined"!=typeof window,Il={protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8},_l={protocolPrefix:4,txtLength:4},$l=Object.values(Il).reduce(((e,t)=>e+t),0),Cl=Object.values(_l).reduce(((e,t)=>e+t),0),kl=["width","height","colorSpace"],El=(e,t)=>{const n={},r=[];let i=0,s=Array.isArray(e)?[]:{};const o=(e,s)=>{const a=(e=>{const t="undefined"!=typeof Buffer&&e instanceof Buffer,n=e instanceof ArrayBuffer,r=e instanceof Uint8ClampedArray,i=e instanceof Uint8Array,s=e instanceof Int8Array;return t?"Buffer":n?"ArrayBuffer":r?"Uint8ClampedArray":i?"Uint8Array":s?"Int8Array":null})(e);if(!a){if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++)t[n]=o(e[n],`${s}[${n}]`);return t}if("object"==typeof e){const t={},n=(e=>{const t=e instanceof Int16Array,n=e instanceof Uint16Array,r=e instanceof Int32Array,i=e instanceof Uint32Array,s=e instanceof Float32Array,o=e instanceof Float64Array,a=e instanceof BigInt64Array,c=e instanceof BigUint64Array;return t?"Int16Array":n?"Uint16Array":r?"Int32Array":i?"Uint32Array":s?"Float32Array":o?"Float64Array":a?"BigInt64Array":c?"BigUint64Array":null})(e);if(n)throw new Error(`Unsupported binary type [${n}] at path "${s}"`);for(const n in e)e.hasOwnProperty(n)||kl.includes(n)||console.warn(`Allowing inherited property: ${n} from path: ${s}`),t[n]=o(e[n],`${s.length?`${s}.`:""}${n}`);return t}return e}n[s]={index:i,length:e.byteLength,binaryType:a},"Buffer"===t?r.push(Buffer.from(e)):"ArrayBuffer"===a?r.push(e):r.push(e.buffer),i+=e.byteLength};s=o(e,"");let a=null;if(r.length>1)if("ArrayBuffer"===t){const e=r.reduce(((e,t)=>e+t.byteLength),0),t=new Uint8Array(e);let n=0;for(let e=0;e<r.length;e++)t.set(new Uint8Array(r[e]),n),n+=r[e].byteLength;a=t.buffer}else{a=Buffer.concat(r)}else 1===r.length&&(a=r[0]);return a?{map:n,combinedData:a,sourceCopy:s}:null},xl=(e,t,n)=>{const r=t.match(/(\[\d+\])|([^[\].]+)/g)||[];let i=e;for(let e=0;e<r.length;e++){let t=r[e];const s=t.startsWith("[")&&t.endsWith("]"),o=e===r.length-1;if(s){t=t.slice(1,-1);const s=parseInt(t,10);if(!Array.isArray(i))throw new Error(`Expected an array at key "${r.slice(0,e).join(".")}" but found an object.`);o?i[s]=n:(i[s]||(i[s]=r[e+1].startsWith("[")?[]:{}),i=i[s])}else o?i[t]=n:(i[t]||(i[t]=r[e+1].startsWith("[")?[]:{}),i=i[t])}return e},Al=(e,t,n)=>{const r="undefined"!=typeof Buffer,i=t instanceof Uint8Array;for(const s in n)if(n.hasOwnProperty(s)){const{index:o,length:a,binaryType:c}=n[s];let l=null;if(r&&t instanceof Buffer)switch(c){case"Buffer":l=t.subarray(o,o+a);break;case"ArrayBuffer":l=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a);break;case"Uint8Array":l=new Uint8Array(t.subarray(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.subarray(o,o+a));break;case"Int8Array":l=new Int8Array(t.subarray(o,o+a))}else if(t instanceof ArrayBuffer||t instanceof Uint8Array)switch(c){case"Buffer":if(r){l=Buffer.from(t.slice(o,o+a));break}case"ArrayBuffer":l=i?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a):t.slice(o,o+a);break;case"Uint8Array":l=i?t.slice(o,o+a):new Uint8Array(t.slice(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.slice(o,o+a));break;case"Int8Array":l=new Int8Array(t.slice(o,o+a))}l&&xl(e,s,l)}return e},Nl=e=>rc(e),Ol="KMSG",Pl="KCMD",Ll=Nl("klProtocol");var Tl={encode:(e,t,n)=>{const r={json:e.json},i=El(r.json,"Buffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Buffer.from(a),l=c.byteLength,u=Il.protocolPrefix+Il.protocolVersion+Il.jsonLength+Il.binaryLength+Il.fromServiceId+Il.toServiceId+Il.sentAt+l+o,d=Buffer.alloc(u),p=Date.now();let h=0;return d.write(Ol,h),h+=Il.protocolPrefix,d.writeUInt8(1,h),h+=Il.protocolVersion,d.writeUInt32LE(l,h),h+=Il.jsonLength,d.writeUInt32LE(o,h),h+=Il.binaryLength,d.writeUInt32LE(t,h),h+=Il.fromServiceId,d.writeUInt32LE(n,h),h+=Il.toServiceId,d.writeBigInt64LE(BigInt(p),h),h+=Il.sentAt,c.copy(d,h),h+=l,s&&o&&s.copy(d,h),d},decodeHeader:e=>{let t=0;const n=e.toString("utf-8",t,Il.protocolPrefix);if(t+=Il.protocolPrefix,n!==Ol)return null;if(e.byteLength<$l)return Ll(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const r=e.readUInt8(t);t+=Il.protocolVersion;const i=e.readUInt32LE(t);t+=Il.jsonLength;const s=e.readUInt32LE(t);t+=Il.binaryLength;const o=e.readUInt32LE(t);t+=Il.fromServiceId;const a=e.readUInt32LE(t);t+=Il.toServiceId;const c=e.readBigInt64LE(t);t+=Il.sentAt;const l=i+s,u=e.subarray(t,t+l),d=e.subarray(0,$l);let p=null;return e.byteLength-$l-i-s>0&&(p=e.subarray($l+i+s)),{header:{protocolVersion:r,jsonLength:i,binaryLength:s,fromServiceId:o,toServiceId:a,sentAt:new Date(Number(c)),packages:[u],headerPackage:d},remaining:p}},decodeFullKlMessage:e=>{const t=Buffer.concat(e.packages),n=t.subarray(0,e.jsonLength).toString(),r=t.subarray(e.jsonLength,e.jsonLength+e.binaryLength),i=wl(n);if(!i?.json)return Ll("Invalid JSON in KL message"),null;i.jsonBinaryMap&&r.byteLength&&Al(i.json,r,i.jsonBinaryMap);const s=Buffer.concat([e.headerPackage,t]);let o=s,a=null;const c=$l+e.jsonLength+e.binaryLength;return s.byteLength>c&&(a=s.subarray(c),o=s.subarray(0,c)),{message:{json:i.json,rawMessage:o},remaining:a}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<$l)return Ll("Invalid Header Size"),e;let n=0;return n+=Il.protocolPrefix,n+=Il.protocolVersion,n+=Il.jsonLength,n+=Il.binaryLength,void 0!==t.fromServiceId&&e.writeUInt32LE(t.fromServiceId,n),n+=Il.fromServiceId,void 0!==t.toServiceId&&e.writeUInt32LE(t.toServiceId,n),e},encodeCommand:e=>{let t=0;const n=Buffer.from(e),r=n.byteLength,i=Cl+r,s=Buffer.alloc(i);return s.write(Pl,t),t+=_l.protocolPrefix,s.writeUint32LE(r,t),t+=_l.txtLength,n.copy(s,t),s},decodeCommand:e=>{let t=0;if(e.byteLength<Cl)return{command:null};const n=e.toString("utf-8",t,_l.protocolPrefix);if(t+=_l.protocolPrefix,n!==Pl)return{command:null};const r=e.readUInt32LE(t);t+=_l.txtLength;const i=e.toString("utf-8",t,t+r),s=e.byteLength-Cl-r;let o=null;s>0&&(o=e.subarray(Cl+r));let a=0;return s<0&&(a=Math.abs(s)),{command:i,remainingData:o,missing:a}}};const Bl="KMSG",jl="KCMD",Dl=Nl("klProtocol"),Ul=new TextEncoder;var Ml={encode:(e,t,n)=>{const r={json:e.json},i=El(e.json,"ArrayBuffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Ul.encode(a),l=c.byteLength,u=new ArrayBuffer(Il.protocolPrefix+Il.protocolVersion+Il.jsonLength+Il.binaryLength+Il.fromServiceId+Il.toServiceId+Il.sentAt+l+o),d=new DataView(u),p=new Uint8Array(u),h=Date.now();let f=0;for(let e=0;e<4;++e)p[f++]=Bl.charCodeAt(e);return d.setUint8(f,1),f+=Il.protocolVersion,d.setUint32(f,l,!0),f+=Il.jsonLength,d.setUint32(f,o,!0),f+=Il.binaryLength,d.setUint32(f,t,!0),f+=Il.fromServiceId,d.setUint32(f,n,!0),f+=Il.toServiceId,d.setBigInt64(f,BigInt(h),!0),f+=Il.sentAt,p.set(c,f),f+=l,s&&o&&p.set(new Uint8Array(s),f),u},decodeHeader:e=>{const t=new DataView(e);let n=0,r="";for(let e=0;e<Il.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==Bl)return null;if(e.byteLength<$l)return Dl.log(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const i=t.getUint8(n);n+=Il.protocolVersion;const s=t.getUint32(n,!0);n+=Il.jsonLength;const o=t.getUint32(n,!0);n+=Il.binaryLength;const a=t.getUint32(n,!0);n+=Il.fromServiceId;const c=t.getUint32(n,!0);n+=Il.toServiceId;const l=t.getBigInt64(n,!0);n+=Il.sentAt;const u=s+o,d=e.slice(n,n+u),p=new Uint8Array(e,0,$l);let h=null;if(e.byteLength-$l-s-o>0){h=new Uint8Array(e,$l+s+o).slice().buffer}return{header:{protocolVersion:i,jsonLength:s,binaryLength:o,fromServiceId:a,toServiceId:c,sentAt:new Date(Number(l)),packages:[d],headerPackage:p.slice().buffer},remaining:h}},decodeFullKlMessage:e=>{const t=e.packages.reduce(((e,t)=>e+t.byteLength),0),n=new Uint8Array(t);let r,i=0;for(const t of e.packages)r=new Uint8Array(t),n.set(r,i),i+=r.byteLength;const s=(new TextDecoder).decode(n.subarray(0,e.jsonLength)),o=n.subarray(e.jsonLength,e.jsonLength+e.binaryLength),a=wl(s);if(!a?.json)return Dl.log("Invalid JSON in KL message"),null;a.jsonBinaryMap&&o.byteLength&&Al(a.json,o,a.jsonBinaryMap);const c=new Uint8Array(e.headerPackage.byteLength+n.byteLength);c.set(new Uint8Array(e.headerPackage),0),c.set(n,e.headerPackage.byteLength);let l=c,u=null;const d=$l+e.jsonLength+e.binaryLength;return c.byteLength>d&&(u=c.subarray(d),l=c.subarray(0,d)),{message:{json:a.json,...o.length?{binaryData:o.buffer}:{},rawMessage:l.buffer},remaining:u?.buffer??null}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<$l)return Dl("Invalid Header Size"),e;let n=0;n+=Il.protocolPrefix,n+=Il.protocolVersion,n+=Il.jsonLength,n+=Il.binaryLength;const r=new DataView(e);return void 0!==t.fromServiceId&&r.setUint32(n,t.fromServiceId,!0),n+=Il.fromServiceId,void 0!==t.toServiceId&&r.setUint32(n,t.toServiceId,!0),e},encodeCommand:e=>{let t=0;const n=Ul.encode(e),r=n.byteLength,i=new ArrayBuffer(Cl+r),s=new DataView(i),o=new Uint8Array(i);for(let e=0;e<4;++e)o[t++]=jl.charCodeAt(e);return s.setUint32(t,r,!0),t+=_l.txtLength,o.set(n,t),i},decodeCommand:e=>{const t=new DataView(e);let n=0;if(e.byteLength<Cl)return{command:null};let r="";for(let e=0;e<_l.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==jl)return{command:null};const i=t.getUint32(n,!0);n+=_l.txtLength;const s=e.byteLength-Cl-i,o=new Uint8Array(e,n,Math.min(i,e.byteLength-Cl)),a=(new TextDecoder).decode(o);let c=null;s>0&&(c=e.slice(Cl+i));let l=0;return s<0&&(l=Math.abs(s)),{command:a,remainingData:c,missing:l}}};const Fl=Nl("klTransmissionManager"),Rl=()=>{const e=(t,n,r,i)=>{let s=n,o=null;const a=t instanceof ArrayBuffer;if(Fl(`RAW: ${t.toString()}`),!s||s.partialHeaderData){let c;if(a?(c=s?.partialHeaderData?new Uint8Array([...new Uint8Array(s.partialHeaderData),...new Uint8Array(t)]).buffer:t,o=Ml.decodeHeader(c)):(c=s?.partialHeaderData?Buffer.concat([s.partialHeaderData,t]):t,o=Tl.decodeHeader(c)),!o){const{command:t,missing:s,remainingData:o}=a?Ml.decodeCommand(c):Tl.decodeCommand(c);return t?i({command:t,complete:!0,rawMessage:c}):Fl(s?`ERROR: Missing ${s} bytes to complete the command. This partial command will be aborted.`:`ERROR: Invalid state, message was decoded without a header or partial header data. Discarding ${c.byteLength} bytes`),o?(Fl(`${o.byteLength} bytes remain after processing command. Re-analyzing...`),e(o,n,r,i)):void 0}if(o.partialHeader)return s={firstPackageAt:Date.now(),partialHeaderData:c},r(s);if(!o.header)return Fl(`ERROR: Invalid state, message was decoded without a header or partial header data. Discarding ${c.byteLength} bytes`);const l=o.header;s={firstPackageAt:Date.now(),header:{...l,totalBytesReceived:l.packages[0].byteLength,totalBytesExpected:l.binaryLength+l.jsonLength,remaining:o.remaining}},r(s)}else s.header&&s.header.totalBytesReceived<s.header.totalBytesExpected&&(s.header.packages.push(t),s.header.totalBytesReceived+=t.byteLength,r(s));if(s.header&&s.header.totalBytesReceived>=s.header.totalBytesExpected){const t=Date.now()-s.header.sentAt.getTime(),n=Date.now()-s.firstPackageAt;Fl(`Received ${s.header.totalBytesReceived} of ${s.header.totalBytesExpected} expected in ${t} ms, elapsed since first package: ${n}ms`);const o=a?Ml.decodeFullKlMessage(s.header):Tl.decodeFullKlMessage(s.header),c=s.header.totalBytesReceived,l=s.header.remaining;r(null),o&&i({klMessage:o.message,complete:!0,sourceServiceId:s.header.fromServiceId,targetServiceId:s.header.toServiceId,rawMessage:o.message.rawMessage});let u=l;if(o?.remaining&&(u=a?l?((e,t)=>{const n=e.byteLength+t.byteLength,r=new ArrayBuffer(n),i=new Uint8Array(e),s=new Uint8Array(t),o=new Uint8Array(r);return o.set(i),o.set(s,i.length),r})(l,o.remaining):o.remaining:l?Buffer.concat([l,o.remaining]):o.remaining),u)return Fl(`${u.byteLength} bytes remaining after processing message with ${c} bytes of data. Re-analyzing...`),e(u,null,r,i)}};return e};vl.config={...vl.config,...yl};const Wl={info:ic("ipcServer:info"),data:ic("ipcServer:data")};let Gl,Vl,Hl,zl,ql={};const Kl=Rl(),Jl=e=>{ql[e]&&(Wl.info(`Client disconnected [${e}]`),delete ql[e],Vl&&Vl(e))};var Yl=e=>(e?.ipcId&&(vl.config.id=e.ipcId),e?.ipcAppSpace&&(vl.config.appspace=e.ipcAppSpace),new Promise((e=>{vl.serve((()=>{Wl.info("IPC Server Initiated"),vl.server.on("data",((e,t)=>{const n=ql[t.id];n?(Wl.data(`IPC Socket [${t.id}] data ${e.byteLength} bytes`),Kl(e,n.activeMessage,(e=>n.activeMessage=e),(e=>{if(!e.complete)return;const n=e=>{t.write(e)};if(e.command)return Wl.data(`Received command from client [${t.id}]: ${e.command}`),void(Hl&&Hl(t.id,e.command,n));e.klMessage&&zl&&zl({send:n,transmission:{sourceServiceId:e.sourceServiceId??-1,targetServiceId:e.targetServiceId??-1,rawMessage:e.rawMessage},json:e.klMessage.json})}))):Wl.data(`Received data from unknown client [${t.id}]. Ignoring.`)})),vl.server.on("connect",(e=>{const t=ac();Wl.info(`New client connected. Registered as "${t}"`),e.id=t,ql[t]={socket:e,activeMessage:null,disconnectHandler:()=>Jl(t)},e.on("close",ql[t].disconnectHandler),Gl&&Gl(t)})),vl.server.on("disconnect",(e=>{Jl(e.id)})),vl.server.on("error",(e=>{console.log(`IPC Server Error: ${e}`)})),e()})),vl.server.start()}))),Xl=e=>{Gl=e},Zl=e=>{Vl=e},Ql=e=>zl=e,eu=(e,t)=>{const n=ql[e];if(!n)return Wl.info(`Cannot send message to unknown client [${e}]`),!1;if(t.length>=bl)return Wl.info("Message is too long to be a command. Use sendMessage instead."),!1;const r=Tl.encodeCommand(t);return n.socket.write(r),!0},tu=(e,t)=>{const n=ql[e];return!!n&&(Wl.info(`Renaming socket id [${e}] to [${t}]`),delete ql[e],n.socket.id=t,ql[t]=n,n.socket.removeListener("close",n.disconnectHandler),n.disconnectHandler=()=>Jl(t),n.socket.on("close",n.disconnectHandler),!0)},nu=e=>{Hl=e};let ru=Tl;Sl&&(ru=Ml);var iu,su=ru;!function(e){e.FunctionNotFound="FNC_NOT_FOUND"}(iu||(iu={}));let ou=Math.ceil(Date.now()/1e3);var au={exports:{}};const cu=["nodebuffer","arraybuffer","fragments"],lu="undefined"!=typeof Blob;lu&&cu.push("blob");var uu={BINARY_TYPES:cu,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:lu,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}};const{EMPTY_BUFFER:du}=uu,pu=Buffer[Symbol.species];function hu(e,t,n,r,i){for(let s=0;s<i;s++)n[r+s]=e[s]^t[3&s]}function fu(e,t){for(let n=0;n<e.length;n++)e[n]^=t[3&n]}if(au.exports={concat:function(e,t){if(0===e.length)return du;if(1===e.length)return e[0];const n=Buffer.allocUnsafe(t);let r=0;for(let t=0;t<e.length;t++){const i=e[t];n.set(i,r),r+=i.length}return r<t?new pu(n.buffer,n.byteOffset,r):n},mask:hu,toArrayBuffer:function(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)},toBuffer:function e(t){if(e.readOnly=!0,Buffer.isBuffer(t))return t;let n;return t instanceof ArrayBuffer?n=new pu(t):ArrayBuffer.isView(t)?n=new pu(t.buffer,t.byteOffset,t.byteLength):(n=Buffer.from(t),e.readOnly=!1),n},unmask:fu},!process.env.WS_NO_BUFFER_UTIL)try{const e=require("bufferutil");au.exports.mask=function(t,n,r,i,s){s<48?hu(t,n,r,i,s):e.mask(t,n,r,i,s)},au.exports.unmask=function(t,n){t.length<32?fu(t,n):e.unmask(t,n)}}catch(e){}var gu=au.exports;const mu=Symbol("kDone"),vu=Symbol("kRun");const yu=B,bu=gu,wu=class{constructor(e){this[mu]=()=>{this.pending--,this[vu]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[vu]()}[vu](){if(this.pending!==this.concurrency&&this.jobs.length){const e=this.jobs.shift();this.pending++,e(this[mu])}}},{kStatusCode:Su}=uu,Iu=Buffer[Symbol.species],_u=Buffer.from([0,0,255,255]),$u=Symbol("permessage-deflate"),Cu=Symbol("total-length"),ku=Symbol("callback"),Eu=Symbol("buffers"),xu=Symbol("error");let Au;var Nu=class{constructor(e,t,n){if(this._maxPayload=0|n,this._options=e||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,!Au){const e=void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10;Au=new wu(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){const e=this._deflate[ku];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){const t=this._options,n=e.find((e=>!(!1===t.serverNoContextTakeover&&e.server_no_context_takeover||e.server_max_window_bits&&(!1===t.serverMaxWindowBits||"number"==typeof t.serverMaxWindowBits&&t.serverMaxWindowBits>e.server_max_window_bits)||"number"==typeof t.clientMaxWindowBits&&!e.client_max_window_bits)));if(!n)throw new Error("None of the extension offers can be accepted");return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),"number"==typeof t.serverMaxWindowBits&&(n.server_max_window_bits=t.serverMaxWindowBits),"number"==typeof t.clientMaxWindowBits?n.client_max_window_bits=t.clientMaxWindowBits:!0!==n.client_max_window_bits&&!1!==t.clientMaxWindowBits||delete n.client_max_window_bits,n}acceptAsClient(e){const t=e[0];if(!1===this._options.clientNoContextTakeover&&t.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(t.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(t.client_max_window_bits=this._options.clientMaxWindowBits);return t}normalizeParams(e){return e.forEach((e=>{Object.keys(e).forEach((t=>{let n=e[t];if(n.length>1)throw new Error(`Parameter "${t}" must have only a single value`);if(n=n[0],"client_max_window_bits"===t){if(!0!==n){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}else if("server_max_window_bits"===t){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else{if("client_no_context_takeover"!==t&&"server_no_context_takeover"!==t)throw new Error(`Unknown parameter "${t}"`);if(!0!==n)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}e[t]=n}))})),e}decompress(e,t,n){Au.add((r=>{this._decompress(e,t,((e,t)=>{r(),n(e,t)}))}))}compress(e,t,n){Au.add((r=>{this._compress(e,t,((e,t)=>{r(),n(e,t)}))}))}_decompress(e,t,n){const r=this._isServer?"client":"server";if(!this._inflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?yu.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=yu.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[$u]=this,this._inflate[Cu]=0,this._inflate[Eu]=[],this._inflate.on("error",Lu),this._inflate.on("data",Pu)}this._inflate[ku]=n,this._inflate.write(e),t&&this._inflate.write(_u),this._inflate.flush((()=>{const e=this._inflate[xu];if(e)return this._inflate.close(),this._inflate=null,void n(e);const i=bu.concat(this._inflate[Eu],this._inflate[Cu]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[Cu]=0,this._inflate[Eu]=[],t&&this.params[`${r}_no_context_takeover`]&&this._inflate.reset()),n(null,i)}))}_compress(e,t,n){const r=this._isServer?"server":"client";if(!this._deflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?yu.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=yu.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[Cu]=0,this._deflate[Eu]=[],this._deflate.on("data",Ou)}this._deflate[ku]=n,this._deflate.write(e),this._deflate.flush(yu.Z_SYNC_FLUSH,(()=>{if(!this._deflate)return;let e=bu.concat(this._deflate[Eu],this._deflate[Cu]);t&&(e=new Iu(e.buffer,e.byteOffset,e.length-4)),this._deflate[ku]=null,this._deflate[Cu]=0,this._deflate[Eu]=[],t&&this.params[`${r}_no_context_takeover`]&&this._deflate.reset(),n(null,e)}))}};function Ou(e){this[Eu].push(e),this[Cu]+=e.length}function Pu(e){this[Cu]+=e.length,this[$u]._maxPayload<1||this[Cu]<=this[$u]._maxPayload?this[Eu].push(e):(this[xu]=new RangeError("Max payload size exceeded"),this[xu].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[xu][Su]=1009,this.removeListener("data",Pu),this.reset())}function Lu(e){this[$u]._inflate=null,e[Su]=1007,this[ku](e)}var Tu={exports:{}};const{isUtf8:Bu}=j,{hasBlob:ju}=uu;function Du(e){const t=e.length;let n=0;for(;n<t;)if(128&e[n])if(192==(224&e[n])){if(n+1===t||128!=(192&e[n+1])||192==(254&e[n]))return!1;n+=2}else if(224==(240&e[n])){if(n+2>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||224===e[n]&&128==(224&e[n+1])||237===e[n]&&160==(224&e[n+1]))return!1;n+=3}else{if(240!=(248&e[n]))return!1;if(n+3>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||128!=(192&e[n+3])||240===e[n]&&128==(240&e[n+1])||244===e[n]&&e[n+1]>143||e[n]>244)return!1;n+=4}else n++;return!0}if(Tu.exports={isBlob:function(e){return ju&&"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&("Blob"===e[Symbol.toStringTag]||"File"===e[Symbol.toStringTag])},isValidStatusCode:function(e){return e>=1e3&&e<=1014&&1004!==e&&1005!==e&&1006!==e||e>=3e3&&e<=4999},isValidUTF8:Du,tokenChars:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0]},Bu)Tu.exports.isValidUTF8=function(e){return e.length<24?Du(e):Bu(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{const e=require("utf-8-validate");Tu.exports.isValidUTF8=function(t){return t.length<32?Du(t):e(t)}}catch(e){}var Uu=Tu.exports;const{Writable:Mu}=T,Fu=Nu,{BINARY_TYPES:Ru,EMPTY_BUFFER:Wu,kStatusCode:Gu,kWebSocket:Vu}=uu,{concat:Hu,toArrayBuffer:zu,unmask:qu}=gu,{isValidStatusCode:Ku,isValidUTF8:Ju}=Uu,Yu=Buffer[Symbol.species];var Xu=class extends Mu{constructor(e={}){super(),this._allowSynchronousEvents=void 0===e.allowSynchronousEvents||e.allowSynchronousEvents,this._binaryType=e.binaryType||Ru[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=0|e.maxPayload,this._skipUTF8Validation=!!e.skipUTF8Validation,this[Vu]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=0}_write(e,t,n){if(8===this._opcode&&0==this._state)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){const t=this._buffers[0];return this._buffers[0]=new Yu(t.buffer,t.byteOffset+e,t.length-e),new Yu(t.buffer,t.byteOffset,e)}const t=Buffer.allocUnsafe(e);do{const n=this._buffers[0],r=t.length-e;e>=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=new Yu(n.buffer,n.byteOffset+e,n.length-e)),e-=n.length}while(e>0);return t}startLoop(e){this._loop=!0;do{switch(this._state){case 0:this.getInfo(e);break;case 1:this.getPayloadLength16(e);break;case 2:this.getPayloadLength64(e);break;case 3:this.getMask();break;case 4:this.getData(e);break;case 5:case 6:return void(this._loop=!1)}}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2)return void(this._loop=!1);const t=this.consume(2);if(48&t[0]){return void e(this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3"))}const n=!(64&~t[0]);if(!n||this._extensions[Fu.extensionName]){if(this._fin=!(128&~t[0]),this._opcode=15&t[0],this._payloadLength=127&t[1],0===this._opcode){if(n){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(!this._fragmented){return void e(this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE"))}this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}this._compressed=n}else{if(!(this._opcode>7&&this._opcode<11)){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}if(!this._fin){return void e(this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN"))}if(n){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(this._payloadLength>125||8===this._opcode&&1===this._payloadLength){return void e(this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH"))}}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=!(128&~t[1]),this._isServer){if(!this._masked){return void e(this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK"))}}else if(this._masked){return void e(this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK"))}126===this._payloadLength?this._state=1:127===this._payloadLength?this._state=2:this.haveLength(e)}else{e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}}getPayloadLength16(e){this._bufferedBytes<2?this._loop=!1:(this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e))}getPayloadLength64(e){if(this._bufferedBytes<8)return void(this._loop=!1);const t=this.consume(8),n=t.readUInt32BE(0);if(n>Math.pow(2,21)-1){e(this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH"))}else this._payloadLength=n*Math.pow(2,32)+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){e(this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"))}else this._masked?this._state=3:this._state=4}getMask(){this._bufferedBytes<4?this._loop=!1:(this._mask=this.consume(4),this._state=4)}getData(e){let t=Wu;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength)return void(this._loop=!1);t=this.consume(this._payloadLength),this._masked&&this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3]&&qu(t,this._mask)}if(this._opcode>7)this.controlMessage(t,e);else{if(this._compressed)return this._state=5,void this.decompress(t,e);t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}}decompress(e,t){this._extensions[Fu.extensionName].decompress(e,this._fin,((e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){const e=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");return void t(e)}this._fragments.push(n)}this.dataMessage(t),0===this._state&&this.startLoop(t)}))}dataMessage(e){if(!this._fin)return void(this._state=0);const t=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],2===this._opcode){let r;r="nodebuffer"===this._binaryType?Hu(n,t):"arraybuffer"===this._binaryType?zu(Hu(n,t)):"blob"===this._binaryType?new Blob(n):n,this._allowSynchronousEvents?(this.emit("message",r,!0),this._state=0):(this._state=6,setImmediate((()=>{this.emit("message",r,!0),this._state=0,this.startLoop(e)})))}else{const r=Hu(n,t);if(!this._skipUTF8Validation&&!Ju(r)){const t=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");return void e(t)}5===this._state||this._allowSynchronousEvents?(this.emit("message",r,!1),this._state=0):(this._state=6,setImmediate((()=>{this.emit("message",r,!1),this._state=0,this.startLoop(e)})))}}controlMessage(e,t){if(8!==this._opcode)this._allowSynchronousEvents?(this.emit(9===this._opcode?"ping":"pong",e),this._state=0):(this._state=6,setImmediate((()=>{this.emit(9===this._opcode?"ping":"pong",e),this._state=0,this.startLoop(t)})));else{if(0===e.length)this._loop=!1,this.emit("conclude",1005,Wu),this.end();else{const n=e.readUInt16BE(0);if(!Ku(n)){const e=this.createError(RangeError,`invalid status code ${n}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");return void t(e)}const r=new Yu(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!Ju(r)){const e=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");return void t(e)}this._loop=!1,this.emit("conclude",n,r),this.end()}this._state=0}}createError(e,t,n,r,i){this._loop=!1,this._errored=!0;const s=new e(n?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(s,this.createError),s.code=i,s[Gu]=r,s}};const{randomFillSync:Zu}=l,Qu=Nu,{EMPTY_BUFFER:ed,kWebSocket:td,NOOP:nd}=uu,{isBlob:rd,isValidStatusCode:id}=Uu,{mask:sd,toBuffer:od}=gu,ad=Symbol("kByteLength"),cd=Buffer.alloc(4),ld=8192;let ud,dd=ld;var pd=class e{constructor(e,t,n){this._extensions=t||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=0,this.onerror=nd,this[td]=void 0}static frame(e,t){let n,r,i=!1,s=2,o=!1;t.mask&&(n=t.maskBuffer||cd,t.generateMask?t.generateMask(n):(dd===ld&&(void 0===ud&&(ud=Buffer.alloc(ld)),Zu(ud,0,ld),dd=0),n[0]=ud[dd++],n[1]=ud[dd++],n[2]=ud[dd++],n[3]=ud[dd++]),o=!(n[0]|n[1]|n[2]|n[3]),s=6),"string"==typeof e?r=t.mask&&!o||void 0===t[ad]?(e=Buffer.from(e)).length:t[ad]:(r=e.length,i=t.mask&&t.readOnly&&!o);let a=r;r>=65536?(s+=8,a=127):r>125&&(s+=2,a=126);const c=Buffer.allocUnsafe(i?r+s:s);return c[0]=t.fin?128|t.opcode:t.opcode,t.rsv1&&(c[0]|=64),c[1]=a,126===a?c.writeUInt16BE(r,2):127===a&&(c[2]=c[3]=0,c.writeUIntBE(r,4,6)),t.mask?(c[1]|=128,c[s-4]=n[0],c[s-3]=n[1],c[s-2]=n[2],c[s-1]=n[3],o?[c,e]:i?(sd(e,n,c,s,r),[c]):(sd(e,n,e,0,r),[c,e])):[c,e]}close(t,n,r,i){let s;if(void 0===t)s=ed;else{if("number"!=typeof t||!id(t))throw new TypeError("First argument must be a valid error code number");if(void 0!==n&&n.length){const e=Buffer.byteLength(n);if(e>123)throw new RangeError("The message must not be greater than 123 bytes");s=Buffer.allocUnsafe(2+e),s.writeUInt16BE(t,0),"string"==typeof n?s.write(n,2):s.set(n,2)}else s=Buffer.allocUnsafe(2),s.writeUInt16BE(t,0)}const o={[ad]:s.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};0!==this._state?this.enqueue([this.dispatch,s,!1,o,i]):this.sendFrame(e.frame(s,o),i)}ping(t,n,r){let i,s;if("string"==typeof t?(i=Buffer.byteLength(t),s=!1):rd(t)?(i=t.size,s=!1):(i=(t=od(t)).length,s=od.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const o={[ad]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:s,rsv1:!1};rd(t)?0!==this._state?this.enqueue([this.getBlobData,t,!1,o,r]):this.getBlobData(t,!1,o,r):0!==this._state?this.enqueue([this.dispatch,t,!1,o,r]):this.sendFrame(e.frame(t,o),r)}pong(t,n,r){let i,s;if("string"==typeof t?(i=Buffer.byteLength(t),s=!1):rd(t)?(i=t.size,s=!1):(i=(t=od(t)).length,s=od.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const o={[ad]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:s,rsv1:!1};rd(t)?0!==this._state?this.enqueue([this.getBlobData,t,!1,o,r]):this.getBlobData(t,!1,o,r):0!==this._state?this.enqueue([this.dispatch,t,!1,o,r]):this.sendFrame(e.frame(t,o),r)}send(e,t,n){const r=this._extensions[Qu.extensionName];let i,s,o=t.binary?2:1,a=t.compress;"string"==typeof e?(i=Buffer.byteLength(e),s=!1):rd(e)?(i=e.size,s=!1):(i=(e=od(e)).length,s=od.readOnly),this._firstFragment?(this._firstFragment=!1,a&&r&&r.params[r._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(a=i>=r._threshold),this._compress=a):(a=!1,o=0),t.fin&&(this._firstFragment=!0);const c={[ad]:i,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:o,readOnly:s,rsv1:a};rd(e)?0!==this._state?this.enqueue([this.getBlobData,e,this._compress,c,n]):this.getBlobData(e,this._compress,c,n):0!==this._state?this.enqueue([this.dispatch,e,this._compress,c,n]):this.dispatch(e,this._compress,c,n)}getBlobData(t,n,r,i){this._bufferedBytes+=r[ad],this._state=2,t.arrayBuffer().then((t=>{if(this._socket.destroyed){const e=new Error("The socket was closed while the blob was being read");return void process.nextTick(hd,this,e,i)}this._bufferedBytes-=r[ad];const s=od(t);n?this.dispatch(s,n,r,i):(this._state=0,this.sendFrame(e.frame(s,r),i),this.dequeue())})).catch((e=>{process.nextTick(fd,this,e,i)}))}dispatch(t,n,r,i){if(!n)return void this.sendFrame(e.frame(t,r),i);const s=this._extensions[Qu.extensionName];this._bufferedBytes+=r[ad],this._state=1,s.compress(t,r.fin,((t,n)=>{if(this._socket.destroyed){hd(this,new Error("The socket was closed while data was being compressed"),i)}else this._bufferedBytes-=r[ad],this._state=0,r.readOnly=!1,this.sendFrame(e.frame(n,r),i),this.dequeue()}))}dequeue(){for(;0===this._state&&this._queue.length;){const e=this._queue.shift();this._bufferedBytes-=e[3][ad],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][ad],this._queue.push(e)}sendFrame(e,t){2===e.length?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};function hd(e,t,n){"function"==typeof n&&n(t);for(let n=0;n<e._queue.length;n++){const r=e._queue[n],i=r[r.length-1];"function"==typeof i&&i(t)}}function fd(e,t,n){hd(e,t,n),e.onerror(t)}const{kForOnEventAttribute:gd,kListener:md}=uu,vd=Symbol("kCode"),yd=Symbol("kData"),bd=Symbol("kError"),wd=Symbol("kMessage"),Sd=Symbol("kReason"),Id=Symbol("kTarget"),_d=Symbol("kType"),$d=Symbol("kWasClean");class Cd{constructor(e){this[Id]=null,this[_d]=e}get target(){return this[Id]}get type(){return this[_d]}}Object.defineProperty(Cd.prototype,"target",{enumerable:!0}),Object.defineProperty(Cd.prototype,"type",{enumerable:!0});class kd extends Cd{constructor(e,t={}){super(e),this[vd]=void 0===t.code?0:t.code,this[Sd]=void 0===t.reason?"":t.reason,this[$d]=void 0!==t.wasClean&&t.wasClean}get code(){return this[vd]}get reason(){return this[Sd]}get wasClean(){return this[$d]}}Object.defineProperty(kd.prototype,"code",{enumerable:!0}),Object.defineProperty(kd.prototype,"reason",{enumerable:!0}),Object.defineProperty(kd.prototype,"wasClean",{enumerable:!0});class Ed extends Cd{constructor(e,t={}){super(e),this[bd]=void 0===t.error?null:t.error,this[wd]=void 0===t.message?"":t.message}get error(){return this[bd]}get message(){return this[wd]}}Object.defineProperty(Ed.prototype,"error",{enumerable:!0}),Object.defineProperty(Ed.prototype,"message",{enumerable:!0});class xd extends Cd{constructor(e,t={}){super(e),this[yd]=void 0===t.data?null:t.data}get data(){return this[yd]}}Object.defineProperty(xd.prototype,"data",{enumerable:!0});const Ad={addEventListener(e,t,n={}){for(const r of this.listeners(e))if(!n[gd]&&r[md]===t&&!r[gd])return;let r;if("message"===e)r=function(e,n){const r=new xd("message",{data:n?e:e.toString()});r[Id]=this,Od(t,this,r)};else if("close"===e)r=function(e,n){const r=new kd("close",{code:e,reason:n.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[Id]=this,Od(t,this,r)};else if("error"===e)r=function(e){const n=new Ed("error",{error:e,message:e.message});n[Id]=this,Od(t,this,n)};else{if("open"!==e)return;r=function(){const e=new Cd("open");e[Id]=this,Od(t,this,e)}}r[gd]=!!n[gd],r[md]=t,n.once?this.once(e,r):this.on(e,r)},removeEventListener(e,t){for(const n of this.listeners(e))if(n[md]===t&&!n[gd]){this.removeListener(e,n);break}}};var Nd={CloseEvent:kd,ErrorEvent:Ed,Event:Cd,EventTarget:Ad,MessageEvent:xd};function Od(e,t,n){"object"==typeof e&&e.handleEvent?e.handleEvent.call(e,n):e.call(t,n)}const{tokenChars:Pd}=Uu;function Ld(e,t,n){void 0===e[t]?e[t]=[n]:e[t].push(n)}var Td={format:function(e){return Object.keys(e).map((t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map((e=>[t].concat(Object.keys(e).map((t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map((e=>!0===e?t:`${t}=${e}`)).join("; ")}))).join("; "))).join(", ")})).join(", ")},parse:function(e){const t=Object.create(null);let n,r,i=Object.create(null),s=!1,o=!1,a=!1,c=-1,l=-1,u=-1,d=0;for(;d<e.length;d++)if(l=e.charCodeAt(d),void 0===n)if(-1===u&&1===Pd[l])-1===c&&(c=d);else if(0===d||32!==l&&9!==l){if(59!==l&&44!==l)throw new SyntaxError(`Unexpected character at index ${d}`);{if(-1===c)throw new SyntaxError(`Unexpected character at index ${d}`);-1===u&&(u=d);const r=e.slice(c,u);44===l?(Ld(t,r,i),i=Object.create(null)):n=r,c=u=-1}}else-1===u&&-1!==c&&(u=d);else if(void 0===r)if(-1===u&&1===Pd[l])-1===c&&(c=d);else if(32===l||9===l)-1===u&&-1!==c&&(u=d);else if(59===l||44===l){if(-1===c)throw new SyntaxError(`Unexpected character at index ${d}`);-1===u&&(u=d),Ld(i,e.slice(c,u),!0),44===l&&(Ld(t,n,i),i=Object.create(null),n=void 0),c=u=-1}else{if(61!==l||-1===c||-1!==u)throw new SyntaxError(`Unexpected character at index ${d}`);r=e.slice(c,d),c=u=-1}else if(o){if(1!==Pd[l])throw new SyntaxError(`Unexpected character at index ${d}`);-1===c?c=d:s||(s=!0),o=!1}else if(a)if(1===Pd[l])-1===c&&(c=d);else if(34===l&&-1!==c)a=!1,u=d;else{if(92!==l)throw new SyntaxError(`Unexpected character at index ${d}`);o=!0}else if(34===l&&61===e.charCodeAt(d-1))a=!0;else if(-1===u&&1===Pd[l])-1===c&&(c=d);else if(-1===c||32!==l&&9!==l){if(59!==l&&44!==l)throw new SyntaxError(`Unexpected character at index ${d}`);{if(-1===c)throw new SyntaxError(`Unexpected character at index ${d}`);-1===u&&(u=d);let o=e.slice(c,u);s&&(o=o.replace(/\\/g,""),s=!1),Ld(i,r,o),44===l&&(Ld(t,n,i),i=Object.create(null),n=void 0),r=void 0,c=u=-1}}else-1===u&&(u=d);if(-1===c||a||32===l||9===l)throw new SyntaxError("Unexpected end of input");-1===u&&(u=d);const p=e.slice(c,u);return void 0===n?Ld(t,p,i):(void 0===r?Ld(i,p,!0):Ld(i,r,s?p.replace(/\\/g,""):p),Ld(t,n,i)),t}};const Bd=D,jd=U,Dd=M,Ud=A,Md=N,{randomBytes:Fd,createHash:Rd}=l,{URL:Wd}=F,Gd=Nu,Vd=Xu,Hd=pd,{isBlob:zd}=Uu,{BINARY_TYPES:qd,EMPTY_BUFFER:Kd,GUID:Jd,kForOnEventAttribute:Yd,kListener:Xd,kStatusCode:Zd,kWebSocket:Qd,NOOP:ep}=uu,{EventTarget:{addEventListener:tp,removeEventListener:np}}=Nd,{format:rp,parse:ip}=Td,{toBuffer:sp}=gu,op=3e4,ap=Symbol("kAborted"),cp=[8,13],lp=["CONNECTING","OPEN","CLOSING","CLOSED"],up=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;let dp=class e extends Bd{constructor(t,n,r){super(),this._binaryType=qd[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Kd,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,null!==t?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,void 0===n?n=[]:Array.isArray(n)||("object"==typeof n&&null!==n?(r=n,n=[]):n=[n]),hp(this,t,n,r)):(this._autoPong=r.autoPong,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){qd.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,n,r){const i=new Vd({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),s=new Hd(t,this._extensions,r.generateMask);this._receiver=i,this._sender=s,this._socket=t,i[Qd]=this,s[Qd]=this,t[Qd]=this,i.on("conclude",bp),i.on("drain",wp),i.on("error",Sp),i.on("message",_p),i.on("ping",$p),i.on("pong",Cp),s.onerror=Ep,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),n.length>0&&t.unshift(n),t.on("close",Ap),t.on("data",Np),t.on("end",Op),t.on("error",Pp),this._readyState=e.OPEN,this.emit("open")}emitClose(){if(!this._socket)return this._readyState=e.CLOSED,void this.emit("close",this._closeCode,this._closeMessage);this._extensions[Gd.extensionName]&&this._extensions[Gd.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(t,n){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this.readyState!==e.CLOSING?(this._readyState=e.CLOSING,this._sender.close(t,n,!this._isServer,(e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())})),xp(this)):this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();else{const e="WebSocket was closed before the connection was established";vp(this,this._req,e)}}pause(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!0,this._socket.pause())}ping(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=n=void 0):"function"==typeof n&&(r=n,n=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===n&&(n=!this._isServer),this._sender.ping(t||Kd,n,r)):yp(this,t,r)}pong(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=n=void 0):"function"==typeof n&&(r=n,n=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===n&&(n=!this._isServer),this._sender.pong(t||Kd,n,r)):yp(this,t,r)}resume(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof n&&(r=n,n={}),"number"==typeof t&&(t=t.toString()),this.readyState!==e.OPEN)return void yp(this,t,r);const i={binary:"string"!=typeof t,mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[Gd.extensionName]||(i.compress=!1),this._sender.send(t||Kd,i,r)}terminate(){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this._socket&&(this._readyState=e.CLOSING,this._socket.destroy());else{const e="WebSocket was closed before the connection was established";vp(this,this._req,e)}}};Object.defineProperty(dp,"CONNECTING",{enumerable:!0,value:lp.indexOf("CONNECTING")}),Object.defineProperty(dp.prototype,"CONNECTING",{enumerable:!0,value:lp.indexOf("CONNECTING")}),Object.defineProperty(dp,"OPEN",{enumerable:!0,value:lp.indexOf("OPEN")}),Object.defineProperty(dp.prototype,"OPEN",{enumerable:!0,value:lp.indexOf("OPEN")}),Object.defineProperty(dp,"CLOSING",{enumerable:!0,value:lp.indexOf("CLOSING")}),Object.defineProperty(dp.prototype,"CLOSING",{enumerable:!0,value:lp.indexOf("CLOSING")}),Object.defineProperty(dp,"CLOSED",{enumerable:!0,value:lp.indexOf("CLOSED")}),Object.defineProperty(dp.prototype,"CLOSED",{enumerable:!0,value:lp.indexOf("CLOSED")}),["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach((e=>{Object.defineProperty(dp.prototype,e,{enumerable:!0})})),["open","error","close","message"].forEach((e=>{Object.defineProperty(dp.prototype,`on${e}`,{enumerable:!0,get(){for(const t of this.listeners(e))if(t[Yd])return t[Xd];return null},set(t){for(const t of this.listeners(e))if(t[Yd]){this.removeListener(e,t);break}"function"==typeof t&&this.addEventListener(e,t,{[Yd]:!0})}})})),dp.prototype.addEventListener=tp,dp.prototype.removeEventListener=np;var pp=dp;function hp(e,t,n,r){const i={allowSynchronousEvents:!0,autoPong:!0,protocolVersion:cp[1],maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...r,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(e._autoPong=i.autoPong,!cp.includes(i.protocolVersion))throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} (supported versions: ${cp.join(", ")})`);let s;if(t instanceof Wd)s=t;else try{s=new Wd(t)}catch(e){throw new SyntaxError(`Invalid URL: ${t}`)}"http:"===s.protocol?s.protocol="ws:":"https:"===s.protocol&&(s.protocol="wss:"),e._url=s.href;const o="wss:"===s.protocol,a="ws+unix:"===s.protocol;let c;if("ws:"===s.protocol||o||a?a&&!s.pathname?c="The URL's pathname is empty":s.hash&&(c="The URL contains a fragment identifier"):c='The URL\'s protocol must be one of "ws:", "wss:", "http:", "https", or "ws+unix:"',c){const t=new SyntaxError(c);if(0===e._redirects)throw t;return void fp(e,t)}const l=o?443:80,u=Fd(16).toString("base64"),d=o?jd.request:Dd.request,p=new Set;let h,f;if(i.createConnection=i.createConnection||(o?mp:gp),i.defaultPort=i.defaultPort||l,i.port=s.port||l,i.host=s.hostname.startsWith("[")?s.hostname.slice(1,-1):s.hostname,i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":u,Connection:"Upgrade",Upgrade:"websocket"},i.path=s.pathname+s.search,i.timeout=i.handshakeTimeout,i.perMessageDeflate&&(h=new Gd(!0!==i.perMessageDeflate?i.perMessageDeflate:{},!1,i.maxPayload),i.headers["Sec-WebSocket-Extensions"]=rp({[Gd.extensionName]:h.offer()})),n.length){for(const e of n){if("string"!=typeof e||!up.test(e)||p.has(e))throw new SyntaxError("An invalid or duplicated subprotocol was specified");p.add(e)}i.headers["Sec-WebSocket-Protocol"]=n.join(",")}if(i.origin&&(i.protocolVersion<13?i.headers["Sec-WebSocket-Origin"]=i.origin:i.headers.Origin=i.origin),(s.username||s.password)&&(i.auth=`${s.username}:${s.password}`),a){const e=i.path.split(":");i.socketPath=e[0],i.path=e[1]}if(i.followRedirects){if(0===e._redirects){e._originalIpc=a,e._originalSecure=o,e._originalHostOrSocketPath=a?i.socketPath:s.host;const t=r&&r.headers;if(r={...r,headers:{}},t)for(const[e,n]of Object.entries(t))r.headers[e.toLowerCase()]=n}else if(0===e.listenerCount("redirect")){const t=a?!!e._originalIpc&&i.socketPath===e._originalHostOrSocketPath:!e._originalIpc&&s.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!o)&&(delete i.headers.authorization,delete i.headers.cookie,t||delete i.headers.host,i.auth=void 0)}i.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")),f=e._req=d(i),e._redirects&&e.emit("redirect",e.url,f)}else f=e._req=d(i);i.timeout&&f.on("timeout",(()=>{vp(e,f,"Opening handshake has timed out")})),f.on("error",(t=>{null===f||f[ap]||(f=e._req=null,fp(e,t))})),f.on("response",(s=>{const o=s.headers.location,a=s.statusCode;if(o&&i.followRedirects&&a>=300&&a<400){if(++e._redirects>i.maxRedirects)return void vp(e,f,"Maximum redirects exceeded");let s;f.abort();try{s=new Wd(o,t)}catch(t){const n=new SyntaxError(`Invalid URL: ${o}`);return void fp(e,n)}hp(e,s,n,r)}else e.emit("unexpected-response",f,s)||vp(e,f,`Unexpected server response: ${s.statusCode}`)})),f.on("upgrade",((t,n,r)=>{if(e.emit("upgrade",t),e.readyState!==dp.CONNECTING)return;f=e._req=null;const s=t.headers.upgrade;if(void 0===s||"websocket"!==s.toLowerCase())return void vp(e,n,"Invalid Upgrade header");const o=Rd("sha1").update(u+Jd).digest("base64");if(t.headers["sec-websocket-accept"]!==o)return void vp(e,n,"Invalid Sec-WebSocket-Accept header");const a=t.headers["sec-websocket-protocol"];let c;if(void 0!==a?p.size?p.has(a)||(c="Server sent an invalid subprotocol"):c="Server sent a subprotocol but none was requested":p.size&&(c="Server sent no subprotocol"),c)return void vp(e,n,c);a&&(e._protocol=a);const l=t.headers["sec-websocket-extensions"];if(void 0!==l){if(!h){return void vp(e,n,"Server sent a Sec-WebSocket-Extensions header but no extension was requested")}let t;try{t=ip(l)}catch(t){return void vp(e,n,"Invalid Sec-WebSocket-Extensions header")}const r=Object.keys(t);if(1!==r.length||r[0]!==Gd.extensionName){return void vp(e,n,"Server indicated an extension that was not requested")}try{h.accept(t[Gd.extensionName])}catch(t){return void vp(e,n,"Invalid Sec-WebSocket-Extensions header")}e._extensions[Gd.extensionName]=h}e.setSocket(n,r,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxPayload:i.maxPayload,skipUTF8Validation:i.skipUTF8Validation})})),i.finishRequest?i.finishRequest(f,e):f.end()}function fp(e,t){e._readyState=dp.CLOSING,e._errorEmitted=!0,e.emit("error",t),e.emitClose()}function gp(e){return e.path=e.socketPath,Ud.connect(e)}function mp(e){return e.path=void 0,e.servername||""===e.servername||(e.servername=Ud.isIP(e.host)?"":e.host),Md.connect(e)}function vp(e,t,n){e._readyState=dp.CLOSING;const r=new Error(n);Error.captureStackTrace(r,vp),t.setHeader?(t[ap]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(fp,e,r)):(t.destroy(r),t.once("error",e.emit.bind(e,"error")),t.once("close",e.emitClose.bind(e)))}function yp(e,t,n){if(t){const n=zd(t)?t.size:sp(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){const t=new Error(`WebSocket is not open: readyState ${e.readyState} (${lp[e.readyState]})`);process.nextTick(n,t)}}function bp(e,t){const n=this[Qd];n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,void 0!==n._socket[Qd]&&(n._socket.removeListener("data",Np),process.nextTick(kp,n._socket),1005===e?n.close():n.close(e,t))}function wp(){const e=this[Qd];e.isPaused||e._socket.resume()}function Sp(e){const t=this[Qd];void 0!==t._socket[Qd]&&(t._socket.removeListener("data",Np),process.nextTick(kp,t._socket),t.close(e[Zd])),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e))}function Ip(){this[Qd].emitClose()}function _p(e,t){this[Qd].emit("message",e,t)}function $p(e){const t=this[Qd];t._autoPong&&t.pong(e,!this._isServer,ep),t.emit("ping",e)}function Cp(e){this[Qd].emit("pong",e)}function kp(e){e.resume()}function Ep(e){const t=this[Qd];t.readyState!==dp.CLOSED&&(t.readyState===dp.OPEN&&(t._readyState=dp.CLOSING,xp(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e)))}function xp(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),op)}function Ap(){const e=this[Qd];let t;this.removeListener("close",Ap),this.removeListener("data",Np),this.removeListener("end",Op),e._readyState=dp.CLOSING,this._readableState.endEmitted||e._closeFrameReceived||e._receiver._writableState.errorEmitted||null===(t=e._socket.read())||e._receiver.write(t),e._receiver.end(),this[Qd]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on("error",Ip),e._receiver.on("finish",Ip))}function Np(e){this[Qd]._receiver.write(e)||this.pause()}function Op(){const e=this[Qd];e._readyState=dp.CLOSING,e._receiver.end(),this.end()}function Pp(){const e=this[Qd];this.removeListener("error",Pp),this.on("error",ep),e&&(e._readyState=dp.CLOSING,this.destroy())}const{tokenChars:Lp}=Uu;var Tp={parse:function(e){const t=new Set;let n=-1,r=-1,i=0;for(;i<e.length;i++){const s=e.charCodeAt(i);if(-1===r&&1===Lp[s])-1===n&&(n=i);else if(0===i||32!==s&&9!==s){if(44!==s)throw new SyntaxError(`Unexpected character at index ${i}`);{if(-1===n)throw new SyntaxError(`Unexpected character at index ${i}`);-1===r&&(r=i);const s=e.slice(n,r);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);t.add(s),n=r=-1}}else-1===r&&-1!==n&&(r=i)}if(-1===n||-1!==r)throw new SyntaxError("Unexpected end of input");const s=e.slice(n,i);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);return t.add(s),t}};const Bp=D,jp=M,{createHash:Dp}=l,Up=Td,Mp=Nu,Fp=Tp,Rp=pp,{GUID:Wp,kWebSocket:Gp}=uu,Vp=/^[+/0-9A-Za-z]{22}==$/;var Hp=class extends Bp{constructor(e,t){if(super(),null==(e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:Rp,...e}).port&&!e.server&&!e.noServer||null!=e.port&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=e.port?(this._server=jp.createServer(((e,t)=>{const n=jp.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":"text/plain"}),t.end(n)})),this._server.listen(e.port,e.host,e.backlog,t)):e.server&&(this._server=e.server),this._server){const e=this.emit.bind(this,"connection");this._removeListeners=function(e,t){for(const n of Object.keys(t))e.on(n,t[n]);return function(){for(const n of Object.keys(t))e.removeListener(n,t[n])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}!0===e.perMessageDeflate&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=0}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(2===this._state)return e&&this.once("close",(()=>{e(new Error("The server is not running"))})),void process.nextTick(zp,this);if(e&&this.once("close",e),1!==this._state)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(zp,this);else{const e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close((()=>{zp(this)}))}}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");if((-1!==t?e.url.slice(0,t):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on("error",qp);const i=e.headers["sec-websocket-key"],s=e.headers.upgrade,o=+e.headers["sec-websocket-version"];if("GET"!==e.method){return void Jp(this,e,t,405,"Invalid HTTP method")}if(void 0===s||"websocket"!==s.toLowerCase()){return void Jp(this,e,t,400,"Invalid Upgrade header")}if(void 0===i||!Vp.test(i)){return void Jp(this,e,t,400,"Missing or invalid Sec-WebSocket-Key header")}if(8!==o&&13!==o){return void Jp(this,e,t,400,"Missing or invalid Sec-WebSocket-Version header")}if(!this.shouldHandle(e))return void Kp(t,400);const a=e.headers["sec-websocket-protocol"];let c=new Set;if(void 0!==a)try{c=Fp.parse(a)}catch(n){return void Jp(this,e,t,400,"Invalid Sec-WebSocket-Protocol header")}const l=e.headers["sec-websocket-extensions"],u={};if(this.options.perMessageDeflate&&void 0!==l){const n=new Mp(this.options.perMessageDeflate,!0,this.options.maxPayload);try{const e=Up.parse(l);e[Mp.extensionName]&&(n.accept(e[Mp.extensionName]),u[Mp.extensionName]=n)}catch(n){return void Jp(this,e,t,400,"Invalid or unacceptable Sec-WebSocket-Extensions header")}}if(this.options.verifyClient){const s={origin:e.headers[""+(8===o?"sec-websocket-origin":"origin")],secure:!(!e.socket.authorized&&!e.socket.encrypted),req:e};if(2===this.options.verifyClient.length)return void this.options.verifyClient(s,((s,o,a,l)=>{if(!s)return Kp(t,o||401,a,l);this.completeUpgrade(u,i,c,e,t,n,r)}));if(!this.options.verifyClient(s))return Kp(t,401)}this.completeUpgrade(u,i,c,e,t,n,r)}completeUpgrade(e,t,n,r,i,s,o){if(!i.readable||!i.writable)return i.destroy();if(i[Gp])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return Kp(i,503);const a=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${Dp("sha1").update(t+Wp).digest("base64")}`],c=new this.options.WebSocket(null,void 0,this.options);if(n.size){const e=this.options.handleProtocols?this.options.handleProtocols(n,r):n.values().next().value;e&&(a.push(`Sec-WebSocket-Protocol: ${e}`),c._protocol=e)}if(e[Mp.extensionName]){const t=e[Mp.extensionName].params,n=Up.format({[Mp.extensionName]:[t]});a.push(`Sec-WebSocket-Extensions: ${n}`),c._extensions=e}this.emit("headers",a,r),i.write(a.concat("\r\n").join("\r\n")),i.removeListener("error",qp),c.setSocket(i,s,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(c),c.on("close",(()=>{this.clients.delete(c),this._shouldEmitClose&&!this.clients.size&&process.nextTick(zp,this)}))),o(c,r)}};function zp(e){e._state=2,e.emit("close")}function qp(){this.destroy()}function Kp(e,t,n,r){n=n||jp.STATUS_CODES[t],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(n),...r},e.once("finish",e.destroy),e.end(`HTTP/1.1 ${t} ${jp.STATUS_CODES[t]}\r\n`+Object.keys(r).map((e=>`${e}: ${r[e]}`)).join("\r\n")+"\r\n\r\n"+n)}function Jp(e,t,n,r,i){if(e.listenerCount("wsClientError")){const r=new Error(i);Error.captureStackTrace(r,Jp),e.emit("wsClientError",r,n,t)}else Kp(n,r,i)}var Yp=Fa(Hp);const Xp=ic("websocketServer"),Zp={},Qp=Rl();let eh,th,nh,rh,ih;const sh=e=>{const t=Zp[e];t&&t.socket.close()};var oh={startServer:e=>{ih=new Yp({port:e,maxPayload:1048576e3}),ih.on("connection",(e=>{const t=ac();Xp(`New client connected. Registered as "${t}"`),e.id=t,Zp[t]={socket:e,activeMessage:null},eh&&eh(t),e.on("message",(t=>{if(t instanceof Buffer){const n=Zp[e.id];Qp(t,n.activeMessage,(e=>n.activeMessage=e),(t=>{if(!t.complete)return;const r=t=>{e.send(t),Xp(`Writing ${t.byteLength} bytes to socket [${n.socket.id}]: ${t.toString()}`)},i=()=>{sh(n.socket.id)};if(t.command)return Xp(`Received command from client [${n.socket.id}]: ${t.command}`),void(nh&&nh(n.socket.id,t.command,r,i));t.klMessage&&rh&&rh({send:r,terminateWebsocket:i,websocketId:n.socket.id,transmission:{sourceServiceId:t.sourceServiceId??-1,targetServiceId:t.targetServiceId??-1,rawMessage:t.rawMessage},json:t.klMessage.json})}))}})),e.on("close",(()=>{Xp(`Client disconnected: ${e.id}`),th&&th(e.id),delete Zp[e.id]})),e.on("error",(()=>{Xp(`Error on client connection: ${e.id}`)}))})),console.log(`WebSocket server is running on port ${e}`)},stopServer:()=>{ih.close((()=>{console.log("WebSocket server stopped")}))},onClientConnected:e=>{eh=e},onClientDisconnected:e=>{th=e},onClientCommand:e=>{nh=e},sendCommand:(e,t)=>{const n=Zp[e];if(!n)return Xp(`Cannot send message to unknown client [${e}]`),!1;if(t.length>=bl)return Xp("Message is too long to be a command. Use sendMessage instead."),!1;const r=Tl.encodeCommand(t);return n.socket.send(r),!0},onMessageReceived:e=>rh=e,terminateConnection:sh};const ah=ic("stopService"),ch=async e=>{const t=e.args[0];if(!t)return e.reply({error:"No service name provided"});const n=Dc.getAllServiceVersions(t);ah(`Stopping ${n.length} services with name: ${t}`);for(const e of n)await Dc.stopService({serviceName:e.info.name,version:e.info.version});const r=n.map((e=>`${e.info.name}@${e.info.version}`));e.reply({success:[r]})},lh=ic("removeService"),uh=async e=>{const t=e.args[0],n=e.args[1];if(!t)return e.reply({error:"No service name provided"});let r=Dc.getAllServiceVersions(t);n&&(r=r.filter((e=>e.info.version===n))),lh(`Removing ${r.length} service(s) with name: ${t}`);for(const e of r)await Dc.uninstallService(e.info.name,e.info.version);const i=r.map((e=>`${e.info.name}@${e.info.version}`));e.reply({success:[i]})},dh=ic("launchService"),ph=async e=>{const t=e.args[0],n=e.args[1];if(!t)return e.reply({error:"No service name provided"});if(!n)return e.reply({error:"No service version provided"});const r=`${t}@${n}/dist`;try{const i=bc();dh(`Loading service ${t}@${n} from ${i}`);const{errorMsg:s,service:o,errorCode:a}=await Dc.loadAndLaunch(i,r,!1);if(s||"started"!==o?.status)return e.reply({error:`Failed to launch service ${t}@${n}: ${s||"error-not-provided"}`,errCode:a});const c=Date.now(),l=3e4,u=async()=>{const r=o.status;return"running"===r?(dh(`Service ${t}@${n} loaded and started`),e.reply({success:[]})):(dh(`Service ${t}@${n} not yet started, status: ${r}`),"stopped"===r||"error"===r?e.reply({error:`Error launching service: "${o.errorMsg||"failed to initiate"}"`}):Date.now()-c>l?e.reply({error:"Timeout waiting for service to start"}):(dh("Retrying in 1 second..."),void setTimeout(u,1e3)))};u()}catch(r){return dh(`Error loading service ${t}@${n}: ${r?.message||r}`),e.reply({error:r?.message||"There was an error loading the service"})}},hh=ic("getMatchingServices"),fh=async e=>{const t=e.args[0],n=[],r=[];hh(`Checking for matching services: ${t.map((e=>e.name)).join(", ")}`);for(const{name:e,version:i}of t){const t=Dc.getMatchingService(e,i);t?n.push({name:e,version:i,installationPath:Dc.getServiceRootDirectory(t)}):r.push({name:e,version:i})}hh(`Found ${n.length} available services and ${r.length} missing services.`),e.reply({success:[{available:n,missing:r}]})},gh=ic("getSecretsValues");let mh;var vh=async e=>{const t=e.args[0].services;if(!mh)throw new Error("getSecretValuesFn is not set. Please call setGetSecretValuesFunction before using this function.");gh(`Checking for secrets values for services: ${t.map((e=>`${e.name}@${e.version}`)).join(", ")}`);const n=[];for(const e of t){const t=e.secrets,r=await mh({name:e.name,version:e.version,requiredSecrets:t.reduce(((e,t)=>(e[t]={optional:!1,description:""},e)),{})});n.push({name:e.name,version:e.version,secrets:t.map((e=>({name:e,value:r[e]})))})}const r=[{services:n}];e.reply({success:r})},yh=e=>{mh=e};const bh=ic("getMappedSecrets");let wh;var Sh=async e=>{const t=e.args[0].services;bh(`Getting mapped secrets for services: ${t.map((e=>`${e.name}@${e.version}`)).join(", ")}`);const n=await wh(t),r=[{services:t.map((e=>({name:e.name,version:e.version,secrets:n[e.name]||[]})))}];e.reply({success:r})},Ih=e=>{wh=e};const _h=ic("getServiceContents"),$h=({reply:e,args:t})=>{const[n]=t;_h(`Received GetServiceContents request for service ${n.serviceName} v${n.version}`);const r=Dc.getMatchingService(n.serviceName,n.version);if(r){return e({success:[{serviceName:r.info.name,serviceVersion:r.info.version,uiContent:r.info.widgetUIContents,uiContentsChecksum:r.info.uiContentChecksum}]})}_h(`Service ${n.serviceName} v${n.version} not found`),e({error:`Service ${n.serviceName} v${n.version} not found`})};let Ch=null;const kh=async e=>{const{data:t,error:n}=await(async(e,t)=>{try{const n=await fetch(e,{method:"POST",body:JSON.stringify(t)});return n.ok?{data:await n.json(),statusCode:n.status,success:!0}:{statusCode:n.status,error:await n.text(),success:!1}}catch(e){return{statusCode:500,error:e instanceof Error?e.message:"Internal server error",success:!1}}})(`${(()=>{if(!Ch)throw new Error("Unknown server URL. Please call `setServerUrl` before using the APIs.");return Ch})()}/v1/validate/validate_key`,{apiKey:e});return n?(console.warn(`Error validating Kemu API key: ${n}`),{valid:!1,features:{},error:n}):t?.features?{valid:!0,features:t.features,error:null}:{valid:!1,features:{},error:"No features returned from the server"}},Eh={},xh=async e=>{const t=(e=>{const t=Eh[e],n=Date.now()-(t?.lastCheckedAt.getTime()??0);return t&&n<3e5?t.features:null})(e);if(t)return{valid:!0,features:t,error:null};const{valid:n,features:r,error:i}=await kh(e);return n&&(Eh[e]={features:r,lastCheckedAt:new Date}),{valid:n,features:r,error:i}},Ah=ic("activeClients");let Nh={},Oh={};const Ph=(e,t)=>`${e}_${t}`,Lh=e=>Nh[e]||null,Th=(e,t)=>{const n=Ph(e,t);return Oh[n]||[]},Bh=()=>{for(const e in Nh){const t=Nh[e];if(t?.transport===Ia.WS){const e=Tl.encodeCommand(ba.ServicesListChanged);t.send(e)}}},jh=async e=>{const t=[],{serviceSessionId:n,transport:r,send:i,terminateFn:s,extraInfo:o,isDevClient:a}=e,c=e=>{console.warn(e),s&&s()};if(r===Ia.WS){if(!o.wsApiKey)return void c(`Attempted to register a WebSocket client without an API key. SessionId: ${n}`);const{valid:e,error:t}=await xh(o.wsApiKey);if(!e&&!t)return void c(`Attempted to register a WebSocket client with an invalid API key. SessionId: ${n}`);t&&Ah(`Unable to validate API Key, usage will be limited. SessionId: ${n}`)}Nh[n]={serviceSessionId:n,transport:r,isDevClient:!!a,broadcastSubscriptions:t,send:i,extraInfo:o,terminate:()=>{s&&s()},addSubscription:e=>{if(!t.some((t=>t.targetService.serviceName===e.serviceName&&t.targetService.version===e.version))){t.push({targetService:e});const r=Ph(e.serviceName,e.version);Oh[r]=Oh[r]||[];return Oh[r].some((e=>e.serviceId===n))||Oh[r].push({sendFn:i,serviceId:n}),!0}return!1},removeSubscription:e=>{const r=t.findIndex((t=>t.targetService.serviceName===e.serviceName));if(-1!==r){t.splice(r,1);const i=Ph(e.serviceName,e.version),s=Oh[i]?.findIndex((e=>e.serviceId===n));if(-1!==s&&(Oh[i].splice(s,1),!Oh[i].length)){const t=Dc.getMatchingService(e.serviceName,e.version);if(t?.info.eventEmitter&&"running"===t.status){const e=Lh(t.info.sessionId);e?.extraInfo.ipcSocketId&&eu(e?.extraInfo.ipcSocketId,ba.BroadcastEnd)}}}},removeAllSubscriptions:()=>{for(const e of t){const t=Ph(e.targetService.serviceName,e.targetService.version),r=Oh[t].findIndex((e=>e.serviceId===n));-1!==r&&Oh[t].splice(r,1)}t.length=0}},r===Ia.IPC&&(Bh(),Uh(n))},Dh=()=>{const e=Object.values(Nh);for(const t of e)if(t.transport===Ia.IPC){const e=t.extraInfo.ipcSocketId,n=Dc.getServiceBySessionId(t.serviceSessionId);if(n?.info.eventEmitter){Th(n.info.name,n.info.version).length||e&&eu(e,ba.BroadcastEnd)}}},Uh=e=>{const t=Dc.getServiceBySessionId(e);if(t?.info.eventEmitter){if(Th(t.info.name,t.info.version).length){const t=Lh(e);t?.extraInfo.ipcSocketId&&eu(t?.extraInfo.ipcSocketId,ba.BroadcastStart)}}},Mh=e=>{const t=Nh[e];delete Nh[e],t?.transport===Ia.IPC?Bh():(t?.removeAllSubscriptions(),Dh())},Fh=ic("ipc:handleIpcClientCommand"),Rh=(e,t,n)=>{const r=((e,t)=>{if(e.startsWith(ba.AcknowledgeResponse)){const n=e.split(":"),r=parseInt(n[1]),i=parseInt(n[2]);return t&&t(r,isNaN(i)?void 0:i),!0}return!1})(t,((e,t)=>{if(!e)return void Fh(`Ignoring ACK response from IPC service ${e} with no service id`);Fh(`Received ACK from IPC service ${e}. Marking as running.`);let r=e;t&&e&&e!==t&&(tu(e,t),r=t);let i=!1;t&&(i=Dc.setServiceStatus(t,"running")),i?jh({serviceSessionId:t||e,transport:Ia.IPC,send:n,extraInfo:{ipcSocketId:t}}):eu(r,ba.SendManifest)}));!r&&Fh(`Received unknown command [${t}] from service ${e}`)};let Wh={};W.platform();const Gh=async e=>{const t=e.args[0];if(Wh.chooseDirectory)try{const n=await Wh.chooseDirectory(t);return e.reply({success:[String(n).trim()]})}catch(t){return console.error(t),e.reply({error:t instanceof Error?t.message:"Unknown error"})}return e.reply({error:"This hub does not support showing file dialogs",errCode:"GUI_NOT_SUPPORTED"})},Vh=async e=>{const t=e.args[0];if(Wh.chooseFile)try{const n=await Wh.chooseFile(t);return e.reply({success:[String(n).trim()]})}catch(t){return console.error(t),e.reply({error:t instanceof Error?t.message:"Unknown error"})}return e.reply({error:"This hub does not support showing file dialogs",errCode:"GUI_NOT_SUPPORTED"})},Hh=e=>{Wh=e};var zh={},qh={},Kh={};function Jh(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Yh(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Xh(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function Zh(e,...t){if(!Xh(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Qh(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");Jh(e.outputLen),Jh(e.blockLen)}function ef(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function tf(e,t){Zh(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}Object.defineProperty(Kh,"__esModule",{value:!0}),Kh.output=Kh.exists=Kh.hash=Kh.bytes=Kh.bool=Kh.number=Kh.isBytes=void 0,Kh.number=Jh,Kh.bool=Yh,Kh.isBytes=Xh,Kh.bytes=Zh,Kh.hash=Qh,Kh.exists=ef,Kh.output=tf;const nf={number:Jh,bool:Yh,bytes:Zh,hash:Qh,exists:ef,output:tf};Kh.default=nf;var rf={};Object.defineProperty(rf,"__esModule",{value:!0}),rf.add5L=rf.add5H=rf.add4H=rf.add4L=rf.add3H=rf.add3L=rf.add=rf.rotlBL=rf.rotlBH=rf.rotlSL=rf.rotlSH=rf.rotr32L=rf.rotr32H=rf.rotrBL=rf.rotrBH=rf.rotrSL=rf.rotrSH=rf.shrSL=rf.shrSH=rf.toBig=rf.split=rf.fromBig=void 0;const sf=BigInt(2**32-1),of=BigInt(32);function af(e,t=!1){return t?{h:Number(e&sf),l:Number(e>>of&sf)}:{h:0|Number(e>>of&sf),l:0|Number(e&sf)}}function cf(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let i=0;i<e.length;i++){const{h:s,l:o}=af(e[i],t);[n[i],r[i]]=[s,o]}return[n,r]}rf.fromBig=af,rf.split=cf;const lf=(e,t)=>BigInt(e>>>0)<<of|BigInt(t>>>0);rf.toBig=lf;const uf=(e,t,n)=>e>>>n;rf.shrSH=uf;const df=(e,t,n)=>e<<32-n|t>>>n;rf.shrSL=df;const pf=(e,t,n)=>e>>>n|t<<32-n;rf.rotrSH=pf;const hf=(e,t,n)=>e<<32-n|t>>>n;rf.rotrSL=hf;const ff=(e,t,n)=>e<<64-n|t>>>n-32;rf.rotrBH=ff;const gf=(e,t,n)=>e>>>n-32|t<<64-n;rf.rotrBL=gf;const mf=(e,t)=>t;rf.rotr32H=mf;const vf=e=>e;rf.rotr32L=vf;const yf=(e,t,n)=>e<<n|t>>>32-n;rf.rotlSH=yf;const bf=(e,t,n)=>t<<n|e>>>32-n;rf.rotlSL=bf;const wf=(e,t,n)=>t<<n-32|e>>>64-n;rf.rotlBH=wf;const Sf=(e,t,n)=>e<<n-32|t>>>64-n;function If(e,t,n,r){const i=(t>>>0)+(r>>>0);return{h:e+n+(i/2**32|0)|0,l:0|i}}rf.rotlBL=Sf,rf.add=If;const _f=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0);rf.add3L=_f;const $f=(e,t,n,r)=>t+n+r+(e/2**32|0)|0;rf.add3H=$f;const Cf=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0);rf.add4L=Cf;const kf=(e,t,n,r,i)=>t+n+r+i+(e/2**32|0)|0;rf.add4H=kf;const Ef=(e,t,n,r,i)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(i>>>0);rf.add5L=Ef;const xf=(e,t,n,r,i,s)=>t+n+r+i+s+(e/2**32|0)|0;rf.add5H=xf;const Af={fromBig:af,split:cf,toBig:lf,shrSH:uf,shrSL:df,rotrSH:pf,rotrSL:hf,rotrBH:ff,rotrBL:gf,rotr32H:mf,rotr32L:vf,rotlSH:yf,rotlSL:bf,rotlBH:wf,rotlBL:Sf,add:If,add3L:_f,add3H:$f,add4L:Cf,add4H:kf,add5H:xf,add5L:Ef};rf.default=Af;var Nf={},Of={};Object.defineProperty(Of,"__esModule",{value:!0}),Of.crypto=void 0,Of.crypto="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,function(e){
|
|
1
|
+
import{config as e}from"dotenv";import{readFile as t,access as n}from"node:fs/promises";import{nanoid as r}from"nanoid";import i from"jsonp";import s from"crypto-js";import o from"util";import a from"emittery";import"axios";import c from"jszip";import l,{scryptSync as u,createDecipheriv as d,createHash as p}from"crypto";import{satisfies as h}from"compare-versions";import f from"debug";import g,{join as m,dirname as v,resolve as y}from"path";import"node-ipc";import{mkdir as b,readFile as w,access as S,constants as I,readdir as _,rm as $}from"fs/promises";import C from"minimist";import k from"tty";import E,{homedir as x}from"os";import A from"net";import N from"tls";import O,{promises as P}from"fs";import L from"dgram";import T from"stream";import B from"zlib";import j from"buffer";import D from"events";import U from"https";import M from"http";import F,{fileURLToPath as R}from"url";import W from"node:os";import{spawn as G}from"child_process";import{join as V,resolve as H,dirname as z}from"node:path";import{ImageData as q,loadImage as K,createCanvas as J}from"@napi-rs/canvas";var Y;!function(e){e.STARTING="STARTING",e.PENDING="PENDING",e.RUNNING="RUNNING",e.PAUSED="PAUSED",e.DRAINING="DRAINING",e.STOPPED="STOPPED",e.ERROR="ERROR"}(Y=Y||(Y={}));const X={};let Z=0,Q="";const ee=e=>X[e]?X[e]:null,te=(e,t)=>{const n=ee(e);if(!n)return n;return n.blocks[t]||null},ne=(e,t,n)=>{const r=te(e,t);if(!r)return r;return r.gates[n]},re=(e,t)=>{let n=r(4);for(;X[n];)n=r(4);const i=(s=e,JSON.parse(JSON.stringify(s)));var s;return i.logs="",i.addLog=e=>{i.logs+=`${(()=>{const e=Date.now();if(e!==Z){const t=new Date;Z=e,Q=t.toJSON()}return Q})()}:: ${e}\n`},i.dbInfo={...t},X[n]=i,n},ie="interrupt_port",se="main.js",oe="state.json",ae="{#}",ce="$var_",le="default";var ue,de,pe,he,fe,ge,me,ve;let ye;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(ue||(ue={})),function(e){e[e.Number=0]="Number",e[e.String=1]="String",e[e.ArrayBuffer=2]="ArrayBuffer",e[e.Array=3]="Array",e[e.Boolean=4]="Boolean",e[e.JsonObj=5]="JsonObj",e[e.Anything=6]="Anything",e[e.ImageData=7]="ImageData",e[e.AudioBuffer=8]="AudioBuffer",e[e.Rect=9]="Rect",e[e.Point=10]="Point",e[e.ImageBitmap=11]="ImageBitmap",e[e.BinaryFile=12]="BinaryFile"}(de||(de={})),function(e){e.Number="Number",e.String="String",e.ArrayBuffer="ArrayBuffer",e.Array="Array",e.Boolean="Boolean",e.JsonObj="JsonObj",e.Anything="Anything",e.ImageData="ImageData",e.AudioBuffer="AudioBuffer",e.Rect="Rect",e.Point="Point",e.ImageBitmap="ImageBitmap",e.BinaryFile="BinaryFile"}(pe||(pe={})),function(e){e.Javascript="js",e.Python="py",e.Executable="exe"}(he||(he={})),function(e){e.IpcAcknowledge="iack:",e.SocketAcknowledge="sack:",e.AcknowledgeResponse="ackr:",e.ServicesListChanged="update-services",e.SendManifest="send-manifest",e.BroadcastStart="broadcast-start",e.BroadcastEnd="broadcast-end",e.AssumeSession="assume:"}(fe||(fe={})),function(e){e.GetServices="getServices",e.SubscribeToService="subscribeToService",e.UnsubscribeFromService="unsubscribeFromService",e.GetServiceContents="getServiceContents",e.SocketAckResponse="socketAckResponse",e.ShowSecretsConfigScreen="showSecretsConfigScreen",e.GetMappedSecrets="getMappedSecrets",e.GetSecretContexts="getSecretContexts",e.OnParentEvent="onParentEvent",e.GetDefaultState="getDefaultState",e.BroadcastEvent="broadcastEvent",e.HubBroadcastEvent="hubBroadcastEvent",e.ServiceManifest="serviceManifest",e.GetState="getState",e.SetState="setState",e.SetOutputs="setOutputs",e.UIEvent="uiEvent",e.InitializeInstance="initializeInstance",e.TerminateInstance="terminateInstance",e.ChooseDirectoryDialog="chooseDirectoryDialog",e.ChooseFileDialog="chooseFileDialog",e.GetUniqueId="getUniqueId"}(ge||(ge={})),function(e){e.SetDependencyPath="setDependencyPath",e.GetDependencyPath="getDependencyPath"}(me||(me={})),function(e){e.IPC="ipc",e.WS="ws"}(ve||(ve={}));const be=()=>{if(!ye)throw new Error("CanvasManager not set");return ye},we=e=>{ye=e},Se=(e,t)=>be().createCanvas(e,t),Ie=e=>$e?e.getContext("2d",{willReadFrequently:!0}):e.getContext("2d"),_e=e=>be().loadImage(e),$e="undefined"!=typeof window&&void 0!==window.document&&void 0!==typeof window.document.createElement,Ce="object"==typeof self&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,ke="undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node,Ee="-",xe=`inner${Ee}`,Ae=`outer${Ee}`,Ne=`${Ae}input${Ee}`,Oe=`${Ae}output${Ee}`,Pe=`${xe}input${Ee}`,Le=`${xe}output${Ee}`,Te=e=>(new TextEncoder).encode(e),Be=e=>e===ie,je=e=>e&&void 0!==e.width&&void 0!==e.height&&void 0!==e.data&&e.data.constructor&&"Uint8ClampedArray"===e.data.constructor.name,De=e=>e&&void 0!==e.width&&void 0!==e.height&&void 0!==e.top&&void 0!==e.left&&"number"==typeof e.width&&"number"==typeof e.height&&"number"==typeof e.top&&"number"==typeof e.left,Ue=e=>e&&"number"==typeof e.x&&"number"==typeof e.y,Me=e=>"number"==typeof e?de.Number:"string"==typeof e?de.String:"boolean"==typeof e?de.Boolean:Array.isArray(e)?de.Array:je(e)?de.ImageData:e&&void 0!==e.duration&&void 0!==e.length&&void 0!==e.numberOfChannels&&void 0!==e.sampleRate&&"function"==typeof e.getChannelData&&"AudioBuffer"===e.constructor.name?de.AudioBuffer:e&&void 0!==e.byteLength?de.ArrayBuffer:De(e)?de.Rect:e&&void 0!==e.x&&void 0!==e.y&&"number"==typeof e.x&&"number"==typeof e.y?de.Point:de.JsonObj,Fe=e=>{const t={};let n;n=Array.isArray(e)?e[0]:e;for(const e in n){const r=Me(n[e]);t[e]=r}return t},Re=(e,t,n)=>"inner"===e?"input"===t?`${Pe}${n}`:`${Le}${n}`:"input"===t?`${Ne}${n}`:`${Oe}${n}`,We=e=>{const t=(e||"")?.split("_");if(t.length<3)throw new Error(`Unknown child identifier format [${e}]`);const n=t[0];return{portType:t[1],widgetId:n,portName:t[2]}},Ge=async e=>{try{return new ImageData(e.data,e.width,e.height,{colorSpace:e.colorSpace})}catch(t){console.warn("Failed to create ImageData from info, assuming raw image data",t);return await _e(e.data)}};var Ve,He;!function(e){e.Action="action",e.CustomInput="customInput"}(Ve=Ve||(Ve={})),function(e){e.input="input",e.counter="counter",e.play="play",e.elapsed="elapsed",e.ifGate="ifGate",e.skipEvent="skipEvent",e.between="between",e.map="map",e.parser="parser",e.slider="slider",e.suspend="suspend",e.display="display",e.json="json",e.arrayItem="arrayItem",e.extractImage="extractImage",e.imageConvolution="imageConvolution",e.firstEvent="firstEvent",e.pixelDraw="pixelDraw",e.randomBetween="randomBetween",e.arrayCombine="arrayCombine",e.clock="clock",e.multiplication="multiplication",e.object="object",e.widgetGroup="widgetGroup",e.script="script",e.base64ToImageData="base64ToImageData",e.jsonParse="jsonParse",e.text="text",e.imageCrop="imageCrop",e.imageResize="imageResize",e.value="value",e.imageWarp="imageWarp",e.widgetBundle="widgetBundle",e.sequence="sequence",e.variable="variable",e.hubService="hubService",e.imageFilter="imageFilter",e.recipeLoad="recipeLoad"}(He=He||(He={}));const ze={};let qe;const Ke=async e=>{const t=ze[e],n={name:ie,type:de.Boolean};if(t){const r={name:t.portName},i=t.data||{type:de.Boolean,value:!0};qe?(await qe(!0,t.targetWidgetId,t.thingId,t.recipePoolId,n.name,r,{...i,timestamp:Date.now()},[n]),"timeout"===t.type&&Je(e)):console.warn("Interrupt service has not been initialized")}},Je=e=>{const t=ze[e];return!!t&&(t.timerRef&&("interval"===t.type?clearInterval(t.timerRef):"timeout"===t.type&&clearTimeout(t.timerRef)),delete ze[e],!0)};var Ye={interruptHandler:Ke,createInterrupt:(e,t,n,i,s,o,a,c)=>{if(c&&ze[c])throw new Error("The given interrupt id already exists");const l=c||r().replace(/_/g,"-");if("interval"===e&&!o.interval)throw new Error(`Invalid interval. Expected a number greater than 0, but got '${o.interval}'`);if("timeout"===e&&!o.timeout)throw new Error(`Invalid timeout. Expected a number greater than 0, but got '${o.timeout}'`);if(ze[l]={data:a,portName:s,recipePoolId:t,targetWidgetId:i,thingId:n,type:e},"interval"===e)ze[l].timerRef=setInterval((async()=>await Ke(l)),o.interval);else{if("timeout"!==e)throw new Error(`Invalid interrupt type '${e}'`);ze[l].timerRef=setTimeout((async()=>await Ke(l)),o.timeout)}return l},destroyInterrupt:Je,destroyAllInterrupts:()=>{Object.keys(ze).forEach(Je)},setInvokeChildGateCb:e=>{qe=e}};const Xe=(e,t,n,r,i)=>{const s=ne(e,n,r);if(!s)return console.warn(`Gate ${r} not found in block ${n} for recipe ${e}`),null;const o=(t,i,s,o)=>Ye.createInterrupt(t,e,n,r,i,s,o),a=()=>Object.freeze({...s.state,...s.type===He.input&&{customInputs:[]}}),c=e=>{if("object"!=typeof e)return void console.warn(`Invalid state type [${typeof e}]. Expected an 'object'`);const t={...e,...s.type===He.input&&!e.customInputs&&{customInputs:[]}};s.state=t};if(i){return{getState:a,setState:c,registerInterrupt:o,getStorageData:async t=>{const r=((e,t,n)=>{const r=ee(e);if(!r)throw new Error(`Recipe [${e} does not exist]`);if(!r.storage)return null;const i=te(e,t);if(!i)throw new Error(`The Thing "${t}" does not exist in recipe ${e}`);if(!(i.storageUnits||[]).includes(n))throw new Error(`The Thing "${t}" has no access to storage unit "${n}"`);return r.storage[n]||null})(e,n,t);return r},recipePoolId:e,recipeType:t,thingRecipeId:n,widgetThingId:r}}return{getState:a,setState:c,recipePoolId:e,widgetId:r}},Ze=[10001,"Invalid `sourcePort` parameter"],Qe=[10002,"The gate [%s] does not exist. Have you called `loadWidgets` yet?"],et=[10110,"No storage medium has been loaded, call `loadMedium()` first"],tt=(e,...t)=>JSON.stringify({code:e[0],message:t[0]?o.format(e[1],...t):e[1].replace(/ \[%s\]/g,"")}),nt=()=>({inputName:"",dataType:de.Anything}),rt="output",it={processEvent:async(e,t)=>{const n=t.getState(),r={...nt(),...n};if(e.type===r.dataType||r.dataType===de.Anything)return t.nextWidget(rt,{type:e.type,value:e.value});console.error(`Invalid data type: ${e.type} for input: ${r.inputName}. Expected: ${r.dataType}`)},getOutputNames:e=>{const t={...nt(),...e};return[{name:rt,type:t.dataType}]},getInputNames:()=>[]},st=Object.freeze({in:"in",reset:"reset",increment:"increment"}),ot="output";var at={onParentEvent:async(e,t,n,r)=>{if(!e)throw new Error(tt(Ze));const i={currentValue:0,increment:1,...r.getState()};let s=i.increment,o=i.currentValue;const a=await r.getParentAtPort(st.increment);if(t.name===st.increment)return void(n.data.type===de.Number&&r.setState({...i,increment:Number(n.data.value)}));if(a){const e=a.getValue();null!==e&&(s=e)}if(t.name===st.reset)return r.setState({...i,currentValue:0});o+=s,r.setState({currentValue:o,increment:s});const c={type:de.Number,value:o};return r.nextGate(ot,c)},getInputNames:()=>[{name:st.in,type:de.Anything},{name:st.reset,type:de.Anything},{name:st.increment,type:de.Number}],getOutputNames:()=>[{name:ot,type:de.Number}]};const ct=Object.freeze({in:"in",reset:"reset"}),lt="output";var ut={onParentEvent:async(e,t,n,r)=>{const i={updatedAt:0,elapsed:0,...r.getState()},s=Date.now(),o=s-(i.updatedAt||s);return t.name===ct.reset?r.setState({...i,updatedAt:s,elapsed:0}):(r.setState({updatedAt:s,elapsed:o}),r.nextGate(lt,{type:de.Number,value:o}))},getInputNames:()=>[{name:ct.in,type:de.Anything},{name:ct.reset,type:de.Anything}],getOutputNames:()=>[{name:lt,type:de.Number}]};const dt=Object.freeze({data:"data",evaluation:"evaluation"}),pt="then",ht="else";var ft={onParentEvent:async(e,t,n,r)=>{const i={value:5,condition:"Equal",useDataPort:!1,...r.getState()},s=n.data.value,o=!isNaN(Number(s)),a="string"==typeof s;if(!i.useDataPort&&(n.data.type===de.Number||n.data.type===de.String||n.data.type===de.Anything&&o||n.data.type===de.Anything&&a)){let e=!1;return("Equal"===i.condition&&n.data.value==i.value||"Not Equal"===i.condition&&n.data.value!==i.value||"Greater"===i.condition&&n.data.value>Number(i.value)||"Less"===i.condition&&n.data.value<Number(i.value)||"Starts With"===i.condition&&String(n.data.value).startsWith(String(i.value))||"Ends With"===i.condition&&String(n.data.value).endsWith(String(i.value))||"Includes"===i.condition&&String(n.data.value).includes(String(i.value))||"Matches"===i.condition&&String(n.data.value).match(String(i.value)))&&(e=!0),e?r.nextGate(pt,n.data):r.nextGate(ht,n.data)}if((t.name===dt.evaluation&&n.data.type===de.Number||n.data.type===de.String||n.data.type===de.Anything&&(o||a))&&(i.$lastValue=n.data.value,r.setState({...i})),t.name===dt.data){let e=!1;return("Equal"===i.condition&&i.$lastValue==i.value||"Not Equal"===i.condition&&i.$lastValue!==i.value||"Greater"===i.condition&&Number(i.$lastValue)>Number(i.value)||"Less"===i.condition&&Number(i.$lastValue)<Number(i.value)||"Starts With"===i.condition&&String(i.$lastValue).startsWith(String(i.value))||"Ends With"===i.condition&&String(i.$lastValue).endsWith(String(i.value))||"Includes"===i.condition&&String(i.$lastValue).includes(String(i.value))||"Matches"===i.condition&&String(i.$lastValue).match(String(i.value)))&&(e=!0),r.setState({...i,$lastValue:void 0,$lastDataType:n.data.type}),e?r.nextGate(pt,n.data):r.nextGate(ht,n.data)}},getInputNames:e=>e.useDataPort?[{name:dt.data,type:de.Anything},{name:dt.evaluation,type:[de.Number,de.String]}]:[{name:"in",type:[de.Number,de.String]}],getOutputNames:e=>e.$lastDataType?[{name:pt,type:e.$lastDataType},{name:ht,type:e.$lastDataType}]:[{name:pt,type:[de.Number,de.String]},{name:ht,type:[de.Number,de.String]}]};const gt=Object.freeze({in:"in",reset:"reset"}),mt="out";var vt={onParentEvent:async(e,t,n,r)=>{const i={totalCalls:0,callsLimit:1,...r.getState()};return t.name===gt.reset?r.setState({...i,totalCalls:0}):(i.totalCalls=i.totalCalls+1,i.totalCalls>i.callsLimit?(i.totalCalls=0,r.setState(i),r.nextGate(mt,n.data)):void r.setState(i))},getInputNames:()=>[{name:gt.in,type:de.Anything},{name:gt.reset,type:de.Anything}],getOutputNames:()=>[{name:mt,type:de.Anything}]};const yt=Object.freeze({in:"in"}),bt="then",wt="else";var St={onParentEvent:async(e,t,n,r)=>{const i={min:1,max:10,...r.getState()};if(n.data.type===de.Number)return n.data.value>=i.min&&n.data.value<=i.max?r.nextGate(bt,n.data):r.nextGate(wt,n.data)},getInputNames:()=>[{name:yt.in,type:de.Number}],getOutputNames:()=>[{name:bt,type:de.Number},{name:wt,type:de.Number}]};const It=Object.freeze({in:"in"}),_t="out";var $t={onParentEvent:async(e,t,n,r)=>{const i={clamp:!0,...r.getState()},s=Number(n.data.value);if(void 0!==i.fromMax&&void 0!==i.fromMin&&void 0!==i.toMax&&void 0!==i.toMin&&""!==i.fromMax&&""!==i.fromMin&&""!==i.toMax&&""!==i.toMin&&(n.data.type===de.Number||n.data.type===de.Anything&&!isNaN(Number(s)))){let e=((e,t,n,r,i)=>(e-t)*(i-r)/(n-t)+r)(s,Number(i.fromMin),Number(i.fromMax),Number(i.toMin),Number(i.toMax));if(isNaN(e))return;return i.clamp&&(e<Number(i.toMin)&&(e=Number(i.toMin)),e>Number(i.toMax)&&(e=Number(i.toMax))),r.nextGate(_t,{type:de.Number,value:Number(e)})}},getInputNames:()=>[{name:It.in,type:de.Number}],getOutputNames:()=>[{name:_t,type:de.Number}]};const Ct=Object.freeze({in:"in"}),kt="out";var Et={onParentEvent:async(e,t,n,r)=>{const i={convertTo:"Integer",floatPlaces:2,...r.getState()};let s=n.data.value;if(n.data.type===de.Number||n.data.type===de.Anything||n.data.type===de.String){if((!isNaN(Number(s))||"string"==typeof s)&&!Array.isArray(s))return"Integer"===i.convertTo?s=parseInt(s):"Decimal"===i.convertTo?s=parseFloat(Number(s).toFixed(i.floatPlaces)):"String"===i.convertTo?s=String(s):"Abs"===i.convertTo?s=Math.abs(Number(s)):"Round"===i.convertTo&&(s=Math.round(Number(s))),r.nextGate(kt,{type:"String"===i.convertTo?de.String:de.Number,value:s})}},getInputNames:()=>[{name:Ct.in,type:de.Number}],getOutputNames:e=>{const t="String"===e?.convertTo?de.String:de.Number;return[{name:kt,type:t}]}};const xt=Object.freeze({in:"in"}),At="out";var Nt={onParentEvent:async(e,t,n,r)=>{const i={currentValue:50,min:0,max:100,...r.getState()};let s=!1;return i.currentValue<i.min&&(i.currentValue=i.min,s=!0),i.currentValue>i.max&&(i.currentValue=i.max,s=!0),s&&r.setState(i),r.nextGate(At,{type:de.Number,value:i.currentValue})},getInputNames:()=>[{name:xt.in,type:de.Anything}],getOutputNames:()=>[{name:At,type:de.Number}]};const Ot=Object.freeze({in:"in",reset:"reset"}),Pt="out";var Lt={onParentEvent:async(e,t,n,r)=>{const i={lastCalledAt:0,delayMs:500},s={lastCalledAt:0,delayMs:500,...r.getState()};if(t.name===Ot.reset)return r.setState({...s,lastCalledAt:0});const o=Date.now(),a=o-s.lastCalledAt;return s.lastCalledAt===i.lastCalledAt||a>=s.delayMs&&s.delayMs>0?(s.lastCalledAt=o,r.setState(s),r.nextGate(Pt,n.data)):void 0},getInputNames:()=>[{name:Ot.in,type:de.Anything},{name:Ot.reset,type:de.Anything}],getOutputNames:()=>[{name:Pt,type:de.Anything}]};const Tt="in";var Bt={onParentEvent:async()=>{},getInputNames:()=>[{name:Tt,type:[de.ImageData,de.Number]}],getOutputNames:()=>[]};const jt=()=>({properties:[{label:"property1",name:"property1"}],detectedProperties:{}}),Dt=(e,t)=>t.split(".").reduce(((e,t)=>null!=e?e[t]:e),e);var Ut={onParentEvent:async(e,t,n,r)=>{const i={properties:[{label:"property1",name:"property1"}],detectedProperties:{},...r.getState()},s=n?.data?.value,o=Array.isArray(s);if(n.data.type===de.JsonObj||n.data.type===de.Rect||n.data.type===de.Anything||o){let e=!1;for(const t in s){const n=Me(s[t]),r=!!i.detectedProperties[t],o=i.detectedProperties[t]?.type!==n;if(!r||o){const r=n===de.JsonObj||n===de.Rect||n===de.Array;i.detectedProperties[t]={type:n,...r?{shape:Fe(s[t])}:void 0},e=!0}}if(o&&void 0===i.detectedProperties.length&&(i.detectedProperties.length={type:de.Number}),e&&r.setState(i),s){const e=[];for(const t of i.properties||[]){const n=Dt(s,t.label),o=t.label.includes(".");if(void 0!==n){const s=o?Me(n):void 0!==i.detectedProperties[t.label]?.type?i.detectedProperties[t.label].type:de.Anything;e.push(r.nextGate(t.name,{type:s,value:n}))}}await Promise.allSettled(e)}}},getInputNames:()=>[{name:"in",type:de.JsonObj}],getOutputNames:e=>{const t={properties:[{label:"property1",name:"property1"}],detectedProperties:{},...e};return t.properties.map((e=>{const n=void 0!==t.detectedProperties[e.label]?t.detectedProperties[e.label]?.type:de.Anything,r=t.detectedProperties[e.label]?.shape||void 0,i="string"==typeof e;return{name:i?e:e.name,label:i?e:e.label,type:n,jsonShape:r}}))},getDefaultState:jt};const Mt="output",Ft="noItem";var Rt={onParentEvent:async(e,t,n,r)=>{const i={index:0,...r.getState()};let s=i.index;const o=n.data.value,a="string"==typeof n.data.value,c=Array.isArray(n.data.value);if(n.data.type===de.Anything&&(c||a)||n.data.type===de.String&&a||n.data.type===de.Array&&c){s<0&&(s=o.length+s);const e=a?de.String:Me(o[s]);return e!==i.$$lastDetectedType&&r.setState({...i,$$lastDetectedType:e}),void 0!==o[s]?r.nextGate(Mt,{value:o[s],type:e}):r.nextGate(Ft,{value:!0,type:de.Boolean})}},getInputNames:()=>[{name:"in",type:[de.Array,de.String]}],getOutputNames:e=>[{name:Mt,type:e.$$lastDetectedType??de.Anything},{name:Ft,type:de.Boolean}]};const Wt=Object.freeze({image:"image",rect:"rect"}),Gt="image";var Vt={onParentEvent:async(e,t,n,r)=>{const i={offset:{height:0,left:0,top:0,width:0},...r.getState()},s=await r.getParentAtPort(Wt.rect),o=[de.Anything,de.Rect,de.JsonObj];if(t.name!==Wt.rect){if(s){const e=s.getValue();null!==e&&(i.rect={...e},r.setState(i))}if(!$e)return n.data.type===de.ImageData?r.nextGate(Gt,n.data):void 0;if(i.$$canvasFrom&&i.$$canvasFrom.getContext||(i.$$canvasFrom=Se(320,240)),i.$$canvasTo&&i.$$canvasTo.getContext||(i.$$canvasTo=Se(320,240)),(n.data.type===de.ImageData||n.data.type===de.Anything&&je(n.data.value))&&!i.$$processing&&i.$$canvasFrom&&i.rect){const e=((e,t,n,r,i)=>{if(r&&r.getContext){const s=r.getContext("2d"),o=n.getContext("2d");if(s&&o){n.width=e.width,n.height=e.height,o.putImageData(e,0,0);const a={...i};i&&(a.height=Number(i.height),a.width=Number(i.width),a.left=Number(i.left),a.top=Number(i.top));const c={top:0,width:0,left:0,height:0,...a};return i&&(Number.isInteger(c.width)||(c.width=t.width*c.width),Number.isInteger(c.height)||(c.height=t.height*c.height),Number.isInteger(c.left)||(c.left=t.left+t.width*c.left),Number.isInteger(c.top)||(c.top=t.top+t.height*c.top)),r.width=t.width+c.width,r.height=t.height+c.height,s.drawImage(n,t.left+c.left,t.top+c.top,t.width+c.width,t.height+c.height,0,0,r.width+c.width,r.height+c.height),s.getImageData(0,0,r.width||1,r.height||1)}}return e})(n.data.value,i.rect,i.$$canvasFrom,i.$$canvasTo,i.offset);return r.nextGate(Gt,{type:de.ImageData,value:e})}}else De(n.data.value)&&o.includes(n.data.type)&&r.setState({...i,rect:n.data.value})},getInputNames:()=>[{name:Wt.image,type:de.ImageData},{name:Wt.rect,type:[de.Rect,de.JsonObj]}],getOutputNames:()=>[{name:Gt,type:de.ImageData}]};const Ht=(e,t)=>{const n=Math.round(Math.sqrt(t.length)),r=Math.floor(n/2),i=e.data,s=e.width,o=e.height,a=s,c=o,l=((e,t,n)=>{if($e)return new ImageData(t,n);return console.warn("Node environment detected. Aborting new ImageData creation"),e})(e,a,c),u=l.data;for(let e=0;e<c;e++)for(let c=0;c<a;c++){const l=e,d=c,p=4*(e*a+c);let h=0,f=0,g=0,m=0;for(let e=0;e<n;e++)for(let a=0;a<n;a++){const c=l+e-r,u=d+a-r;if(c>=0&&c<o&&u>=0&&u<s){const r=4*(c*s+u),o=t[e*n+a];h+=i[r]*o,f+=i[r+1]*o,g+=i[r+2]*o,m+=i[r+3]*o}}u[p]=h,u[p+1]=f,u[p+2]=g,u[p+3]=m+1*(255-m)}return l},zt=[-1,0,1,-2,0,2,1,0,1],qt=Object.freeze({image:"image"}),Kt="image";var Jt={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={matrix:[...zt],...i};if(n.data.type===de.ImageData||n.data.type===de.Anything&&je(n.data.value)){const e=Ht(n.data.value,s.matrix);return r.nextGate(Kt,{type:de.ImageData,value:e})}},getInputNames:()=>[{name:qt.image,type:de.ImageData}],getOutputNames:()=>[{name:Kt,type:de.ImageData}]};const Yt=Object.freeze({output:"output",aborted:"aborted"}),Xt=()=>({inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0}),Zt=e=>{const t={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...e},n=Array(t.inputs).fill(0).map(((e,t)=>({name:`input${t+1}`,type:de.Anything})));return n.push({name:"reset",type:de.Anything}),n};var Qt={onParentEvent:async(e,t,n,r)=>{const i={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...r.getState()};if("reset"===t.name)return r.setState({...i,triggeredAt:0});const s=Date.now(),o=s-i.triggeredAt;if(i.triggeredAt&&!(o>=i.delayMs&&i.delayMs>0)&&i.delayMs)return r.nextGate(Yt.aborted,n.data);{i.triggeredAt=s;const e=Zt(i,(r.recipePoolId,r.recipeType,r.thingRecipeId,r.id)).findIndex((e=>e.name===t.name));-1!==e&&(i.lastInputIndex=e),i.matchingOutputs?-1!==e&&await r.nextGate(`output${e+1}`,n.data):await r.nextGate(Yt.output,n.data),r.setState(i)}},getInputNames:Zt,getOutputNames:e=>{const t={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...e};if(e.matchingOutputs){const e=Array(t.inputs).fill(0).map(((e,t)=>({name:`output${t+1}`,type:de.Anything})));return e.push({name:Yt.aborted,type:de.Anything}),e}return[{name:Yt.output,type:de.Anything},{name:Yt.aborted,type:de.Anything}]},getDefaultState:Xt};const en=(e,t,n,r,i,s)=>{if(i){const o=e.measureText(i),a=o.fontBoundingBoxAscent+o.fontBoundingBoxDescent;e.fillStyle=r,e.fillRect(t,n-s,1.1*o.width,a),e.font=`${s}px Arial`,e.fillStyle="black",e.fillText(i,t,n)}},tn=(e,t,n,r,i,s,o)=>{e.fillStyle=i,e.fillRect(t,n,r,r),en(e,t,n,i,s,o)},nn=(e,t,n,r,i,s)=>{e.beginPath(),e.strokeStyle=r,e.lineWidth=n,e.rect(t.left,t.top,t.width,t.height),e.stroke();const o=n/2;en(e,t.left-o,t.top-o,r,i,s)},rn=Object.freeze({image:"image",pixels:"pixels"}),sn="image";var on={onParentEvent:async(e,t,n,r)=>{const i={fontSize:12,color:"#00ff00",size:2,...r.getState()},s=n.data.type===de.ImageData||n.data.type===de.Anything&&je(n.data.value);if(t.name===rn.pixels){const e=((e,t)=>t===de.Anything&&(je(e)||Ue(e)||De(e)||Array.isArray(e))||t===de.Array||t===de.Rect||t===de.Point)(n.data.value,n.data.type);if(!e)return;i.$$pixels=n.data.value}if(t.name===rn.image&&s){const e=n.data.value;i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(e.width||1,e.height||1)),i.$$lastFrame=e}if(i.$$lastFrame&&i.$$pixels&&i.$$memCanvas){const e=(e=>{const{sourceImage:t,pixels:n,memCanvas:r,size:i,color:s,labelProp:o,fontSize:a}=e;if(r){const e=Ie(r);if(e){r.width!==t.width&&(r.width=t.width),r.height!==t.height&&(r.height=t.height),e.putImageData(t,0,0);const c=Array.isArray(n)?n:[n];for(let t=0;t<c.length;t++){const n=c[t],r=o?n[o]:"";De(n)?nn(e,n,i,s,r,a):Ue(n)&&tn(e,n.x,n.y,i,s,r,a)}return e.getImageData(0,0,r.width,r.height)}}return t})({sourceImage:i.$$lastFrame,pixels:i.$$pixels||[],memCanvas:i.$$memCanvas,size:i.size,color:i.color,labelProp:i.labelProp,fontSize:i.fontSize});return r.setState({...i,$$lastFrame:void 0,$$pixels:void 0}),r.nextWidget(sn,{type:de.ImageData,value:e})}r.setState(i)},getInputNames:()=>[{name:rn.image,type:de.ImageData},{name:rn.pixels,type:[de.Rect,de.Point,de.Array]}],getOutputNames:()=>[{name:sn,type:de.ImageData}]};const an=Object.freeze({in:"in"}),cn="output",ln=e=>{const t=String(e).split(".");return t.length<2?0:t[1].length};var un={onParentEvent:async(e,t,n,r)=>{const i={min:1,max:100,...r.getState()},s=!Number.isInteger(i.min),o=!Number.isInteger(i.max),a=s||o;let c=(l=i.min,u=i.max,Math.random()*(u-l)+l);var l,u;if(a){let e=0;if(s&&(e=ln(i.min)),o){const t=ln(i.max);t>e&&(e=t)}c=Number(c.toFixed(e))}else c=Math.floor(c);return r.nextGate(cn,{type:de.Number,value:c})},getInputNames:()=>[{name:an.in,type:de.Anything}],getOutputNames:()=>[{name:cn,type:de.Number}]};const dn=Object.freeze({output:"output",totalItems:"totalItems"}),pn=Object.freeze({trigger:"trigger",clear:"clear"}),hn=()=>({totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1}),fn=async(e,t)=>t.nextGate(dn.totalItems,{type:de.Number,value:e});var gn={onParentEvent:async(e,t,n,r)=>{const i={totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1,...r.getState()};if(t.name===pn.clear)return i.$$list=[],i.properties?.autoFilled&&delete i.properties,r.setState(i),fn(i.$$list.length,r);const s=t.name===pn.trigger;if(!s)if(Array.isArray(n.data.value))n.data.type!==de.Array&&n.data.type!==de.Anything||(i.$$outputShape={...i.$$outputShape,...e?.jsonShape},i.$$list=i.$$list.concat(n.data.value),r.setState({...i}),await fn(i.$$list.length,r));else{const t=`$$primitive_${Object.keys(i.$$outputShape).length}`;n.data.type===de.JsonObj?i.$$outputShape={...i.$$outputShape,...e?.jsonShape?e.jsonShape:void 0}:i.$$outputShape={...i.$$outputShape,[t]:n.data.type},i.$$list.push(n.data.value),r.setState({...i}),await fn(i.$$list.length,r)}if(s){Object.keys(i.$$outputShape).length&&(i.properties={autoFilled:!0,jsonShape:{...i.$$outputShape}});const e=i.$$list.length,t=[...i.$$list];return i.$$list=[],r.setState({...i}),await fn(e,r),r.nextGate(dn.output,{type:de.Array,value:t})}},getInputNames:e=>{const t={totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1,...e},n=Array(t.totalInputs||1).fill(0).map(((e,t)=>({name:`array${t+1}`,type:de.Array})));return n.push({name:pn.clear,type:de.Anything},{name:pn.trigger,type:de.Anything}),n},getOutputNames:e=>[{name:dn.output,type:de.Array,...e.properties?{jsonShape:e.properties?.jsonShape}:void 0},{name:dn.totalItems,label:"Total Items",type:de.Number}],getDefaultState:hn};const mn=Object.freeze({start:"start",stop:"stop"}),vn="output",yn="clock_interrupt";var bn={onParentEvent:async(e,t,n,r)=>{const i={enabled:!1,interval:1e3,intervalMode:"ms",...r.getState()};if(Be(e?.name||"")&&t.name===yn)return r.nextGate(vn,{type:de.Boolean,value:!0});if(t.name===mn.stop&&i.enabled&&i.$$interruptId){r.cancelInterrupt(i.$$interruptId)?(i.enabled=!1,i.$$interruptId=void 0,r.setState(i)):console.warn(`Failed to cancel interrupt [${i.$$interruptId}]`)}else t.name!==mn.start||i.enabled||i.$$interruptId||(i.$$interruptId=r.registerInterrupt("interval",yn,{interval:i.interval}),i.enabled=!0,r.setState(i))},getInputNames:()=>[{name:mn.start,type:de.Anything},{name:mn.stop,type:de.Anything}],getOutputNames:()=>[{name:vn,type:de.Boolean}],initialize:async e=>{const t=e.getState();if(t.enabled&&!t.$$interruptId){const n=e.registerInterrupt("interval",yn,{interval:t.interval});e.setState({...t,$$interruptId:n})}}};const wn=Object.freeze({in:"in"}),Sn="output",In=(e,t,n)=>"number"==typeof e?Number((e*t).toFixed(n)):e;var _n={onParentEvent:async(e,t,n,r)=>{const i={userProperties:[],factor:2,decimalPoints:2,...r.getState()},s=n.data.type;let o=n.data.value,a=!1;return e?.jsonShape&&(i.detectedInputJson={...i.detectedInputJson,...e?.jsonShape},a=!0),i.detectedInputType||(i.detectedInputType=s,a=!0),n.data.type===de.Array&&("number"==typeof n.data.value?.[0]?o=((e,t,n)=>{const r=(e||[]).map((e=>In(e,t,n)));return r})(n.data.value,i.factor,i.decimalPoints):"object"==typeof n.data.value?.[0]&&(o=((e,t,n,r)=>{const i=(e||[]).map((e=>{const i={...e};return Object.keys(i).forEach((e=>{r?.length&&!r?.includes(e)||(i[e]=In(i[e],t,n))})),i}));return i})(n.data.value,i.factor,i.decimalPoints,i.userProperties))),n.data.type===de.Number&&(o=In(n.data.value,i.factor,i.decimalPoints)),a&&r.setState(i),r.nextGate(Sn,{type:s,value:o})},getInputNames:()=>[{name:wn.in,type:[de.Array,de.Number]}],getOutputNames:e=>[{name:Sn,type:e.detectedInputType||de.Number,jsonShape:e.detectedInputJson}]};const $n=Object.freeze({output:"output"}),Cn=Object.freeze({trigger:"trigger"}),kn=()=>({useTriggerPort:!0,properties:[{name:"x",label:"x",type:de.Number,value:10},{name:"y",label:"y",type:de.Number,value:20}]}),En=e=>{const t={};for(let n=0;n<e.properties.length;n++)t[e.properties[n].label]=e.properties[n].type;return t},xn=e=>{const t={};for(let n=0;n<e.properties.length;n++){let r=e.properties[n].value;const i=e.properties[n].type;i===de.Number?r=Number(r):i===de.String&&(r=String(r)),t[e.properties[n].label]=r}return t};var An={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s=structuredClone(i),o={...kn(),...s};if(t.name===Cn.trigger){const e=xn(o);return r.nextGate($n.output,{type:de.JsonObj,value:e})}const a=o.properties.findIndex((e=>e.name===t.name));if(-1!==a){let e=n.data.type===o.properties[a].type;if(!e&&n.data.type===de.Anything){e=Me(n.data.type)===o.properties[a].type}if(e?(o.properties[a].value=n.data.value,o.properties[a].$$invalidInputType=!1):o.properties[a].$$invalidInputType=!0,r.setState(o),!o.useTriggerPort){const e=xn(o);return r.nextGate($n.output,{type:de.JsonObj,value:e})}}},getInputNames:e=>{const t={...kn(),...e},n=t.properties.map((e=>({name:e.name,label:e.label,type:e.type})));return t.useTriggerPort&&n.push({name:Cn.trigger,label:Cn.trigger,type:de.Anything}),n},getOutputNames:e=>[{name:$n.output,label:$n.output,type:de.JsonObj,jsonShape:En(e)}],getDefaultState:kn};const Nn=async e=>{const t=(e,t)=>e.split(t)[1];if(e.startsWith(Ne)){const n=t(e,Ne);return Re("inner","input",n)}if(e.startsWith(Le)){const n=t(e,Le);return Re("outer","output",n)}return null},On=()=>({canvasPosition:{x:0,y:0},canvasZoom:1,inputs:[{name:"input",type:[de.Anything],index:0}],outputs:[{name:"output",type:[de.Anything],index:0}],name:"Custom Widget 1",description:"",type:"custom"}),Pn=e=>{const t={...On(),...e},n=t.inputs.map(((e,t)=>({name:Re("outer","input",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!1,index:t}))),r=t.outputs.map(((e,t)=>({name:Re("inner","output",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!0,index:n.length+t})));return[...n,...r]};var Ln={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={...On(),...i},o=Pn(s,(r.recipePoolId,r.recipeType,r.thingRecipeId,r.id));for(let e=0;e<o.length;e++){const i=o[e];if(t.name===i.name&&(i.type.includes(de.Anything)||i.type.includes(n.data.type))){const e=await Nn(t.name);e&&await r.nextWidget(e,{type:n.data.type,value:n.data.value})}}},getInputNames:Pn,getOutputNames:e=>{const t={...On(),...e},n=t.outputs.map(((e,t)=>({name:Re("outer","output",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!1,index:t})));return[...t.inputs.map(((e,t)=>({name:Re("inner","input",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!0,index:t+n.length}))),...n]},getDefaultState:On};const Tn=(e,t,n,r,i)=>{const s=4*(t*n.width+e),o=n.data[s],a=n.data[s+1],c=n.data[s+2];return Math.abs(o-r.r)<=i&&Math.abs(a-r.g)<=i&&Math.abs(c-r.b)<=i};var Bn,jn,Dn,Un,Mn,Fn,Rn,Wn,Gn,Vn,Hn={getPixelValueAtIndex:(e,t)=>{const n=e.data,r=n[t]||0,i=n[t+1]||0,s=n[t+2]||0;return{avr:(r+i+s)/3,r:r,g:i,b:s}},getBoundingBox:(e,t,n)=>{const r=e.width,i=e.height,s=new Set,o=Number(n.threshold||0),a=isNaN(o)?10:o,c=(n,o)=>{const c=[[n,o]];let l=n,u=n,d=o,p=o;for(;c.length>0;){const n=c.shift();if(!n)continue;const[o,h]=n;o<0||h<0||o>=r||h>=i||s.has(`${o},${h}`)||!Tn(o,h,e,t,a||0)||(s.add(`${o},${h}`),l=Math.min(l,o),u=Math.max(u,o),d=Math.min(d,h),p=Math.max(p,h),c.push([o+1,h],[o-1,h],[o,h+1],[o,h-1]))}return{minX:l,maxX:u,minY:d,maxY:p}},l=[];for(let o=0;o<i;o+=4)for(let i=0;i<r;i+=4)if(!s.has(`${i},${o}`)&&Tn(i,o,e,t,a)){const{minX:e,maxX:t,minY:r,maxY:s}=c(i,o),a=t-e,u=s-r;if(a>=(n.minWidth||1)&&u>=(n.minHeight||1)&&l.push({left:e,top:r,width:a,height:u}),n.maxBoxes&&l.length>=n.maxBoxes)return l}return l},copyImageData:e=>new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),setPixelValueAtIndex:(e,t,n)=>{const r=e.data,i="object"==typeof n,s=i?n.r:n,o=i?n.g:n,a=i?n.b:n;r[t]=s,r[t+1]=o,r[t+2]=a,r[t+3]=255}};!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(Bn||(Bn={})),function(e){e.Bundle="bundle",e.Group="group"}(jn||(jn={})),function(e){e.Hardware="hardware",e.Virtual="virtual"}(Dn||(Dn={})),function(e){e.Cloud="cloud",e.Web="web"}(Un||(Un={})),function(e){e.Cpu_128M="kmu-cpu-128m",e.Cpu_256M="kmu-cpu-256m",e.Cpu_512M="kmu-cpu-512m",e.Cpu_1024M="kmu-cpu-1024m",e.Cpu_2048M="kmu-cpu-2048m",e.Cpu_4096M="kmu-cpu-4096m"}(Mn||(Mn={})),function(e){e.Gateway="gateway",e.Timer="timer"}(Fn||(Fn={})),(Rn||(Rn={})).InstallInProgress="installation-in-progress",function(e){e.InstallDependencies="install-dependencies",e.GetInstalledDependencies="get-installed-dep"}(Wn||(Wn={})),function(e){e.Success="success",e.Error="error",e.Pending="pending"}(Gn||(Gn={})),function(e){e.NotFound="not-found",e.BadRequest="bad-request",e.Forbidden="forbidden",e.InternalError="internal-error"}(Vn||(Vn={}));let zn=null;var qn=()=>{if(!zn)throw new Error("Required function is not set");return zn};class Kn extends Error{constructor(e,t){super(e),this.name="UserCodeError",t&&(this.stack=t)}}const Jn=(e,t)=>`\n\t\tfunction _user_code_(){\n\t\t\t${t===Bn.Browser?"\n\t\t\tvar global = {\n\t\t\t\t__user_code: true\n\t\t\t};\n\t\t\tvar process = {};\n\t\t\tvar console = this.console;\n\t\t\tvar globalThis = global;\n\t\t\tvar require = this.___notSupportedMethod;\n\t\t\t":"\n\t\t\tvar require = this.require;\n\t\t\tvar process = this.kemuProcess;\n\t\t\t"}\n\n\t\t\tvar eval = () => {};\n\t\t\tvar document = {};\n\t\t\tvar navigator = {};\n\t\t\tvar window = this.window;\n\t\t\tvar alert = this.notify.info;\n\t\t\tvar DataType = this.dataTypesEnum;\n\t\t\tvar setInterval = this.setInterval;\n\t\t\tvar setTimeout = this.setTimeout;\n\t\t\tvar addEventListener = this.addEventListener;\n\t\t\tvar removeEventListener = this.removeEventListener;\n\t\t\tvar requestAnimationFrame = this.___notSupportedMethod;\n\t\t\tvar __delay = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms, reject));\n\n\t\t\tvar Kemu = {\n\t\t\t\tservices: {\n\t\t\t\t\thttp: { ...this.httpWebService },\n\t\t\t\t\tdynamoDb: { ...this.dynamoService },\n\t\t\t\t\tgoogleSheets: {\n\t\t\t\t\t\t...this.googleSheetsService,\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\timage: this.imageHelpers,\n\t\t\t\tvariable: this.variablesManager,\n\n\t\t\t\thelpers: {\n\t\t\t\t\tcryptoJS: this.CryptoJS,\n\t\t\t\t\tjsonp: this.jsonp,\n\t\t\t\t\tdelay: __delay,\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar sendToPort;\n\n\t\t\t// --- User Methods Start ---\n\t\t\t${e||""};\n\t\t\t// --- User Methods End ---\n\t\t\t\n\t\t\t// Processes the user code asynchronously.\n\t\t\tconst asyncProcessEvent = async (targetPort, sourcePort, event) => {\n\t\t\t\tconst userProcessEvent = typeof processEvent === 'undefined' ? undefined : processEvent;\n\t\t\t\tif(userProcessEvent) {\n\t\t\t\t\ttry{\n\t\t\t\t\t\treturn await userProcessEvent(targetPort, sourcePort, event, sendToPort);\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** invoked the very first time the recipe is initialized */\n\t\t\tconst asyncRecipeInit = async (context, logger) => {\n\t\t\t\ttry {\n\t\t\t\t\t${t===Bn.Browser?"if(logger) { console = logger; }":""}\n\t\t\t\t\tif(typeof recipeInit === 'function') {\n\t\t\t\t\t\treturn recipeInit(context);\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** invoked every time the code is about to be replaced */\n\t\t\tconst asyncOnTerminate = async (context) => {\n\t\t\t\ttry {\n\t\t\t\t\tif(typeof onTerminate === 'function') {\n\t\t\t\t\t\treturn onTerminate(context);\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** updates the function that allows widget contexts to send data to the next widget */\n\t\t\tconst setSendToPort = (sendNextFun) => {\n\t\t\t\tsendToPort = sendNextFun;\n\t\t\t}\n\n\t\t\t/** invoked the every time the user code is compiled. */\n\t\t\tconst asyncMainEvent = async (sendNextFun, logger) => {\n\t\t\t\ttry{\n\t\t\t\t\tsetSendToPort(sendNextFun);\n\t\t\t\t\tif(logger) { console = logger; }\n\t\t\t\t\tif(typeof main === 'function'){\n\t\t\t\t\t\treturn main();\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tasyncProcessEvent: asyncProcessEvent,\n\t\t\t\tmain: asyncMainEvent,\n\t\t\t\trecipeInit: asyncRecipeInit,\n\t\t\t\tsetSendToPortFun: setSendToPort,\n\t\t\t\tonTerminate: asyncOnTerminate,\n\t\t\t\tgetLocalContext: () => global,\n\t\t\t\tgetWidgetInputs: typeof getWidgetInputs === 'undefined' ? undefined : getWidgetInputs,\n\t\t\t\tgetWidgetOutputs: typeof getWidgetOutputs === 'undefined' ? undefined : getWidgetOutputs,\n\t\t\t};\n\t\t}\n\t\t\n\t\treturn function compiler(context){\n\t\t\treturn _user_code_.call(context)\n\t\t}\n\n\t\treturn compiler;\n\t`,Yn=(e,t,n,r)=>{const o=Jn(e,n),a={...t,document:{},__errorTracer:e=>{throw new Kn(e.message,e.stack)},__jest:void 0===globalThis.__jest?void 0:globalThis.__jest,___notSupportedMethod:()=>r?.error("This method is not supported."),console:console,setInterval:()=>r?.error("'setInterval' is not supported. Please use a \"Timer\" widget instead."),setTimeout:t?.setTimeout,imageHelpers:Hn,...n===Bn.Cloud?{require:qn(),kemuProcess:process.env.KEMU_PROCESS?process.env.KEMU_PROCESS:{}}:{},jsonp:i,CryptoJS:s,window:{addEventListener:t?.addEventListener,removeEventListener:t?.removeEventListener}};try{const e="browser"===(()=>{if($e)return"browser";if(ke)return"node";if(Ce)return"worker";throw new Error("Unsupported environment")})()?(e=>e.replace(/[//]{2}[ ]*@kemu-cloud[ \t]*\{[\s\S]*?[//]{2}[ ]*@kemu-cloud[ \t]*\}/gim,""))(o):(e=>e.replace(/[//]{2}[ ]*@kemu-browser[ \t]*\{[\s\S]*?[//]{2}[ ]*@kemu-browser[ \t]*\}/gim,""))(o),t=new Function(e);return{compiledModule:t()(a)}}catch(e){return{error:{name:"CompileError",message:e.message,stack:e.stack}}}},Xn="main",Zn=()=>({pauseExecution:!1,autoPauseOnError:!0,$$eventListeners:{},pages:{[Xn]:{code:"\nconst getWidgetInputs = () => [\n\t{ name: 'Input 1', type: DataType.Number }\n];\n\nconst getWidgetOutputs = () => [\n\t{ name: 'Output 1', type: DataType.Number }\n]\n\nlet counter = 0;\n\nconst processEvent = async (targetPort, sourceWidget, event) => {\n\tif(targetPort.name === 'Input 1'){\n\t\treturn sendToPort('Output 1', {\n\t\t\ttype: DataType.Number,\n\t\t\tvalue: counter++,\n\t\t});\n\t}\n}\n",language:"javascript",name:"My First Script"}},consoleVisible:!1,$$consoleLines:[]}),Qn=(e,t)=>{const n={message:"Unknown Error"};if(e?.stack){const r=e?.stack?.split(":")[0].trim();n.type=r;const i=(e=>{const t=/,[ ]?<anonymous>:([0-9]+:[0-9]+)\)/gm;let n;for(;null!==(n=t.exec(e));){n.index===t.lastIndex&&t.lastIndex++;const e=n[1].split(":");if(2===e.length)return{line:Number(e[0])||0,column:Number(e[1])||0}}return null})(e.stack);i&&(n.line=i.line-(e=>{const t="___user_code_section___";return Jn(t,e).split(t)[0].split("\n").length+2})(t),n.column=i.column)}return e.message&&(n.message=e.message),n},er=(e,t)=>{const n={...Zn(),...t.getState()},r={...n,...e?{$$error:e}:void 0,...n.autoPauseOnError&&e?{pauseExecution:!0}:void 0};e&&(r.$$consoleLines=[...r.$$consoleLines,{type:"error",text:e.message,timestamp:Date.now(),fileName:Xn}]),t.setState(r)};var tr,nr;!function(e){e.ServiceCreationLog="service-creation-log"}(tr=tr||(tr={})),function(e){e.Service="service",e.ServiceUI="serviceUI"}(nr=nr||(nr={}));const rr=new a,ir=(e,t,n)=>{const r=te(e,t);if(!r)throw new Error(`Thing ${t} not found in recipe ${e}`);const i=r.gates[n];if(!i)throw new Error(`Widget ${n} not found in thing ${t}`);return i},sr=(e,t,n)=>`${t}:${n}:${e}`,or=e=>`${e}:new-var`,ar=e=>`value-change:${e}`,cr=async(e,t,n,r,i,s,o)=>{const a={...o},c={thingId:n,recipeId:t,variableName:e,changes:s,ownerId:r,callerWidgetId:i,varDefinition:Object.freeze(a)};if(s.includes("added")){const e=or(n);return rr.emit(e,c)}{const t=sr(e,n,r);return s.includes("value")&&(await rr.emit(ar(e),c),await rr.emit(ar("*"),c)),rr.emit(t,c)}},lr=(e,t,n,r)=>{const i=ir(e,t,r);i.variablesListener={...i.variablesListener,[n]:0},dr(e,t)},ur=(e,t,n,r)=>{const i=ir(e,t,r),s={...i.variablesListener};void 0!==i.variablesListener?.[n]&&(delete s[n],i.variablesListener=s)},dr=async(e,t)=>{const n=te(e,t);if(!n)throw new Error(`Thing "${t}" not found in recipe "${e}"`);const r={...n.variables},i=Object.keys(r);for(const s of i){const i=r[s],o=Object.keys(i);for(const i of o){!n.gates[i]&&(delete r[s][i],await cr(s,e,t,i,void 0,["removed"],null))}0===Object.keys(r[s]).length&&delete r[s]}n.variables=r},pr=(e,t,n)=>{for(const r in t){const i=t[r];if(i.createdByWidgetId===e.id)return i;if(e.type===He.variable&&i.ownerType===He.variable)return i;if(e.type===He.script){const t=i.createdByWidgetId===e.groupId,r=n[i.createdByWidgetId];if(!r)continue;const s=r.groupId===e.groupId;if(t||r.type===He.variable&&s)return i}}return null};var hr=async(e,t,n,r,i,s)=>{const o=te(e,t);if(!o)throw new Error(`Thing ${t} not found in recipe ${e}`);const a={...o.variables};a[r]=a[r]||{};const c=a[r],l=o.gates[n];if(!l)throw new Error(`Widget ${n} not found in thing ${t}`);const u=Object.values(c);let d=!1,p=!1;const h=async i=>cr(r,e,t,i.createdByWidgetId,n,["value"],i);if(l.type===He.variable){d=!0;for(const e of u)e.ownerType===He.variable&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}if(l.type===He.script){d=!0;for(const e of u){const t=e.createdByWidgetId===l.groupId,n=o.gates[e.createdByWidgetId],r=n?.type===He.variable,s=n?.groupId===l.groupId;(t||r&&s)&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}}if(!d){d=!0;for(const e of u){e.createdByWidgetId===n&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}}if(!s?.skipNotifications&&p){const a=Object.values(o.gates);for(const o of a){if(o.id===n&&s?.skipCallerNotification)continue;const a=o.variablesListener?.[r];void 0!==a&&await os(o.id,t,e,`${ce}${r}`,i)}}},fr=(e,t,n,r)=>{const i=te(e,t);if(!i)throw new Error(`Thing ${t} not found in recipe ${e}`);if(!r.readerWidgetId&&!r.ownerWidgetId)throw new Error("readerWidgetId or ownerWidgetId must be provided");const s={...i.variables}[n];if(!s)return;if(r.ownerWidgetId){const e=s[r.ownerWidgetId];return e?.value}const o=i.gates[r.readerWidgetId];if(!o)throw new Error(`Widget ${r.readerWidgetId} not found in thing ${t}`);const a=pr(o,s,i.gates);return a?a.value:null},gr=lr,mr=ur,vr=(e,t)=>rr.on(ar(e),(e=>{if(e.varDefinition)return t({type:e.varDefinition.type,value:e.varDefinition.value,varName:e.variableName})}));const yr="setTimeout",br="variableChanged",wr=e=>{const{recipePoolId:t,thingId:n,scriptWidgetId:r}=e;if(!ne(t,n,r))throw new Error(`Widget "${r}" not found in recipe "${t}"`);return{get:(e,i)=>{const s=fr(t,n,e,{readerWidgetId:r});if(null===s){if(void 0===i)throw new Error(`Variable "${e}" is not defined`);return i}return s},set:async(e,i)=>{await hr(t,n,r,e,{type:Me(i),value:i})},onValueChange:(i,s)=>{if(!e.setState)return void console.warn("Cannot subscribe to variable changes without a setState function");gr(t,n,i,r);const o={...Zn(),...e.getState()};o.$$eventListeners[i]={handler:s,abort:async()=>{mr(t,n,i,r)},name:br},e.setState(o)}}},Sr="__command-compile__";let Ir;const _r=()=>{console.log("Method not implemented")},$r=(e,t,n)=>{const i=(e,...n)=>{const r={...Zn(),...t.getState()}.$$eventListeners[e];r&&r.handler(n)},s={};return Object.keys(de).forEach((e=>{s[e]=de[e]})),{dataTypesEnum:s,notify:{success:e=>{t.getState()?.$$managedUI?.notify?.success(e)},error:e=>{t.getState()?.$$managedUI?.notify?.error(e)},info:e=>{t.getState()?.$$managedUI?.notify?.info(e)}},variablesManager:e.variablesManager?wr({recipePoolId:n.recipePoolId,scriptWidgetId:n.widgetId,thingId:n.thingId,getState:t.getState,setState:t.setState}):{get:_r,set:async()=>_r(),onValueChange:_r},setTimeout:(n,i,s)=>{if(e.withTimers&&t&&t.setState&&t.registerInterrupt){const e=r(),o={...Zn(),...t.getState()};o.$$eventListeners[e]={handler:n,rejectHandler:s,name:yr},t.setState(o),t.registerInterrupt("timeout",e,{timeout:i},void 0,e)}},addEventListener:(e,n)=>{if(t.setState){const s=r(),o={...Zn(),...t.getState()};o.$$eventListeners[s]={handler:n,name:e},t.setState(o),window.addEventListener(e,i.bind(s))}else console.warn(`Cannot remove event listener '${e}' because the widget context is not available.`)},removeEventListener:(e,n)=>{if(t.setState){const r={...Zn(),...t.getState()},i=Object.keys(r.$$eventListeners).find((t=>r.$$eventListeners[t].name===e&&r.$$eventListeners[t].handler===n));t.setState(r),i&&removeEventListener(r.$$eventListeners[i].name,r.$$eventListeners[i].handler)}else console.warn(`Cannot remove event listener '${e}' because the widget context is not available.`)}}},Cr=(e,t,n,r)=>{const i={...Zn(),...n.getState()},s=i.pages[Xn].$$compiledCode;if(s)return{compiledModule:s};{const s=$r(e,n,t);return Yn(i.pages[Xn].code,s,n.recipeType,r)}},kr=e=>e.map((e=>({...e,name:e.name.replace("_","")}))),Er=async(e,t)=>{const n={...e};for(const r in e){if(e[r].name===yr){const e=n[r]?.rejectHandler;if("function"==typeof e)try{await e("TIMER_ABORTED")}catch(e){console.log("Error in reject interrupt handler: ",e)}t.cancelInterrupt(r),delete n[r]}}return n},xr=async(e,t,n)=>{let r={...Zn(),...e.getState()};if(void 0!==n){r.pages[Xn]?.$$compiledCode?.onTerminate&&await(r.pages[Xn].$$compiledCode?.onTerminate());let t=await Er(r.$$eventListeners,e);t=await(async e=>{const t={...e};for(const n in e)if(e[n].name===br){const r=e[n]?.abort;if("function"==typeof r)try{await r()}catch(e){console.log("Error in abort interrupt handler: ",e)}delete t[n]}return t})(t),r.$$eventListeners=t,r.$$error=void 0,r.pages[Xn].$$compiledCode=void 0,r.pages[Xn].code=n,e.setState({...r})}const i=!r.pages[Xn].$$compiledCode,{compiledModule:s,error:o}=Cr({variablesManager:!0,withTimers:!0},{recipePoolId:e.recipePoolId,thingId:e.thingRecipeId,widgetId:e.id},{getState:e.getState,setState:e.setState,recipeType:e.recipeType,registerInterrupt:e.registerInterrupt});if(o){console.log("Failed to compile user code");const t=Qn(o,e.recipeType);return er(t,e),null}if(s){const n=(e=>{const t=(t,n)=>{if(Ir)try{return Ir[t](n)}catch(e){return void console.log("Error in custom logger: ",e)}const r={...Zn(),...e.getState()},i=[...r.$$consoleLines||[]];i.push({fileName:Xn,text:n,type:t,timestamp:Date.now()}),i.length>100&&i.splice(0,30),e.setState({...r,$$consoleLines:i})},n={log:e=>{t("log",e)},error:e=>{t("error",e)},warn:e=>{t("warn",e)},info:e=>{t("info",e)}};return n})(e);let o;if(r={...e.getState()},r.pages[Xn].$$compiledCode=s,e.nextGate&&s.setSendToPortFun(e.nextGate),t)try{await s.recipeInit({setState:e.setState,getState:e.getState},n)}catch(t){o=Qn(t,e.recipeType)}if(e.nextGate&&i)try{await s.main(e.nextGate,n)}catch(t){o=Qn(t,e.recipeType)}r.$$lastInputs=s.getWidgetInputs?s.getWidgetInputs():[],r.$$lastOutputs=s.getWidgetOutputs?s.getWidgetOutputs():[],e.setState(r),er(o,e)}};var Ar={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={...Zn(),...i};if(!s.pages[Xn])return console.warn("Missing default page");if(s.pauseExecution){if(Object.keys(s.$$eventListeners).length){const e=await Er(s.$$eventListeners,r);r.setState({...s,$$eventListeners:e})}return}if(Be(e?.name||""))return s.$$eventListeners[t.name]?(await s.$$eventListeners[t.name].handler(),s.$$eventListeners[t.name].name===yr&&delete s.$$eventListeners[t.name],void r.setState({...s})):void console.log(`Unknown interrupt id [${t.name}] `);if(t.name.startsWith(ce)){const e=t.name.replace(ce,""),r=n.data.value,i=s.$$eventListeners[e];return void(i?.handler&&await i.handler(r))}const o=t.name===Sr;await xr(r,!1,o?n.data.value:void 0);const a=s.pages[Xn].$$compiledCode;if(e&&e.name!==Sr&&a){let i;try{await a.asyncProcessEvent(t,e,n)}catch(e){"UserCodeError"===e.name&&(i=Qn(e,r.recipeType))}er(i,r)}},getInputNames:(e,t)=>{const n={...Zn(),...e},{compiledModule:r}=Cr({},{recipePoolId:t.recipePoolId,thingId:t.thingRecipeId,widgetId:t.widgetId},{getState:()=>n,recipeType:t.recipeType});if(r?.getWidgetInputs){const e=r.getWidgetInputs();return kr(e)}return e.$$lastInputs||[]},getOutputNames:(e,t)=>{const n={...Zn(),...e},{compiledModule:r}=Cr({},{recipePoolId:t.recipePoolId,thingId:t.thingRecipeId,widgetId:t.widgetId},{getState:()=>n,recipeType:t.recipeType});if(r?.getWidgetOutputs){const e=r.getWidgetOutputs();return kr(e)}return e.$$lastOutputs||[]},getDefaultState:Zn,initialize:async e=>{const t=e.getState(),n={...Zn(),...t};n.pages[Xn].code&&await xr({getState:e.getState,id:e.widgetThingId,recipePoolId:e.recipePoolId,recipeType:e.recipeType,registerInterrupt:e.registerInterrupt,setState:e.setState,thingRecipeId:e.thingRecipeId,cancelInterrupt:()=>!0},!0,n.pages[Xn].code)}};const Nr=async(e,t,n,r)=>{e.startsWith("data:image/")||(e=`data:image/png;base64,${e}`);const i=await Or(e);return((e,t,n,r)=>{const i=r.getContext("2d");if(!i)throw new Error("Failed to get canvas context");const s=e.width,o=e.height;return r.width=t,r.height=n,i.drawImage(e,0,0,s,o,0,0,t,n),i.getImageData(0,0,t,n)})(i,n||i.naturalWidth,r||i.naturalHeight,t)},Or=e=>new Promise(((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=e=>n(e),r.src=e})),Pr=Object.freeze({image:"image"}),Lr=Object.freeze({base64:"base64"}),Tr=()=>({});var Br={onParentEvent:async(e,t,n,r)=>{const i={...r.getState()};if(t.name===Lr.base64){if("string"!=typeof n.data.value)return;if(n.data.type!==de.String&&n.data.type!==de.Anything)return;const e=n.data.value;$e&&(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(320,240)));try{const t=await Nr(e,i.$$memCanvas,i.resize?.width,i.resize?.height);return r.setState(i),r.nextGate(Pr.image,{type:de.ImageData,value:t})}catch(e){console.log("[base64ToImageData] Error: ",e)}}},getInputNames:()=>[{name:Lr.base64,type:de.String}],getOutputNames:()=>[{name:Pr.image,type:de.ImageData}],getDefaultState:Tr};const jr=Object.freeze({object:"object",error:"error"}),Dr=Object.freeze({string:"string"}),Ur=()=>({outputIsArray:!1});var Mr={onParentEvent:async(e,t,n,r)=>{const i={outputIsArray:!1,...r.getState()};if((n.data.type===de.String||n.data.type===de.Anything)&&"string"==typeof n.data.value)try{const e=JSON.parse(n.data.value),t=Array.isArray(e);return t&&!i.outputIsArray?r.setState({...i,outputIsArray:!0}):!t&&i.outputIsArray&&r.setState({...i,outputIsArray:!1}),r.nextGate("object",{type:t?de.Array:de.JsonObj,value:e})}catch(e){return r.nextGate("error",{type:de.Boolean,value:!0})}},getInputNames:()=>[{name:Dr.string,type:de.String}],getOutputNames:e=>[{name:jr.object,type:[de.JsonObj,de.Array],label:e.outputIsArray?"array":jr.object},{name:jr.error,type:de.Boolean}],getDefaultState:Ur};const Fr=Object.freeze({string:"string",length:"length"}),Rr=Object.freeze({trigger:"trigger",setText:"setText"}),Wr=()=>({text:"",dispatchOnSet:!1});var Gr={onParentEvent:async(e,t,n,r)=>{const i={text:"",dispatchOnSet:!1,...r.getState()};if(t.name===Rr.setText){if(!((n.data.type===de.String||n.data.type===de.Anything)&&"string"==typeof n.data.value))return;if("string"==typeof n.data.value&&(i.text=n.data.value,r.setState(i)),!i.dispatchOnSet)return}const s=r.nextGate(Fr.length,{type:de.Number,value:i.text.length}),o=r.nextGate(Fr.string,{type:de.String,value:i.text});await Promise.all([s,o])},getInputNames:e=>{const t=[{name:Rr.setText,type:de.String}];return e.dispatchOnSet||t.push({name:Rr.trigger,type:de.Anything}),t},getOutputNames:()=>[{name:Fr.string,type:de.String},{name:Fr.length,type:de.Number}],getDefaultState:Wr};const Vr=Object.freeze({image:"image"}),Hr=Object.freeze({image:"image",x:"x",y:"y",width:"width",height:"height"}),zr=()=>({showInputPorts:!1});var qr={onParentEvent:async(e,t,n,r)=>{const i={showInputPorts:!1,...r.getState()};if("number"==typeof n.data.value)return t.name===Hr.x&&(i.cropX=n.data.value),t.name===Hr.y&&(i.cropY=n.data.value),t.name===Hr.width&&(i.cropWidth=n.data.value),t.name===Hr.height&&(i.cropHeight=n.data.value),void r.setState(i);if(t.name===Hr.image){if(n.data.type!==de.ImageData&&n.data.type!==de.Anything)return;if(!je(n.data.value))return;const e=n.data.value;if(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(320,240),i.$$memCanvasContext=Ie(i.$$memCanvas),r.setState(i)),!i.$$memCanvas||!i.$$memCanvasContext)return void console.error("Failed to get canvas or context");let t=e;return i.$$memCanvas.width=e.width,i.$$memCanvas.height=e.height,(i.cropX||i.cropY||i.cropWidth||i.cropHeight)&&(t=((e,t,n,r)=>{if(!n)return e;const i=Math.max(r.x||0,0),s=Math.max(r.y||0,0),o=e.width,a=e.height,c=Math.min(Math.ceil(r.width||o),o),l=Math.min(Math.ceil(r.height||a),a);return t.width=e.width,t.height=e.height,n.putImageData(e,0,0),n.drawImage(t,i,s,c,l,0,0,c,l),n.getImageData(0,0,c,l)})(e,i.$$memCanvas,i.$$memCanvasContext,{x:i.cropX,y:i.cropY,width:i.cropWidth,height:i.cropHeight})),r.nextGate(Vr.image,{type:de.ImageData,value:t})}},getInputNames:e=>{const t=[{name:Hr.image,type:[de.ImageData]}];return e.showInputPorts&&(t.push({name:Hr.x,type:de.Number}),t.push({name:Hr.y,type:de.Number}),t.push({name:Hr.width,type:de.Number}),t.push({name:Hr.height,type:de.Number})),t},getOutputNames:()=>[{name:Vr.image,type:de.ImageData}],getDefaultState:zr};const Kr=Object.freeze({image:"image"}),Jr=Object.freeze({image:"image",width:"width",height:"height"}),Yr=()=>({showInputPorts:!1});var Xr={onParentEvent:async(e,t,n,r)=>{const i={showInputPorts:!1,...r.getState()};if("number"==typeof n.data.value)return t.name===Jr.width&&(i.width=n.data.value),t.name===Jr.height&&(i.height=n.data.value),void r.setState(i);if(t.name===Jr.image){if(n.data.type!==de.ImageData&&n.data.type!==de.Anything)return;if(!je(n.data.value))return;const e=n.data.value;if(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=Se(320,240),i.$$tempCanvas=Se(320,240),r.setState(i)),!i.$$memCanvas||!i.$$tempCanvas)return;let t=e;return(i.width||i.height)&&(t=((e,t,n,r,i)=>{if(!r&&!i)return e;r&&!i?i=r*(e.height/e.width):!r&&i&&(r=i*(e.width/e.height));const s=Math.max(1,r||e.width),o=Math.max(1,i||e.height);n.width===e.width&&n.height===e.height||(n.width=e.width,n.height=e.height),t.width=s,t.height=o;const a=Ie(t),c=Ie(n);if(!a||!c)throw new Error("Failed to get canvas context");return c.putImageData(e,0,0),a.drawImage(n,0,0,e.width,e.height,0,0,s,o),a.getImageData(0,0,s,o)})(e,i.$$memCanvas,i.$$tempCanvas,i.width,i.height)),r.nextGate(Kr.image,{type:de.ImageData,value:t})}},getInputNames:e=>{const t=[{name:Jr.image,type:de.ImageData}];return e.showInputPorts&&(t.push({name:Jr.width,type:de.Number}),t.push({name:Jr.height,type:de.Number})),t},getOutputNames:()=>[{name:Kr.image,type:de.ImageData}],getDefaultState:Yr};const Zr=Object.freeze({value:"value"}),Qr=Object.freeze({trigger:"trigger",setValue:"setValue"}),ei=()=>({value:0,dispatchOnSet:!1});var ti={onParentEvent:async(e,t,n,r)=>{const i={value:0,dispatchOnSet:!1,...r.getState()};if(t.name===Qr.setValue){const e=n.data.type===de.Number||n.data.type===de.Anything||n.data.type===de.String,t=!isNaN(Number(n.data.value))&&!Array.isArray(n.data.value);if(!e||!t)return;if(i.value=Number(n.data.value),r.setState(i),!i.dispatchOnSet)return}return r.nextGate(Zr.value,{type:de.Number,value:i.value})},getInputNames:e=>{const t=[{name:Qr.setValue,type:de.Number}];return e.dispatchOnSet||t.push({name:Qr.trigger,type:de.Anything}),t},getOutputNames:()=>[{name:Zr.value,type:de.Number}],getDefaultState:ei};const ni=Object.freeze({image:"image"}),ri=Object.freeze({image:"image"}),ii=()=>({anchors:[],vertices:[],matrix:[]}),si={onParentEvent:async(e,t,n,r)=>{const i={anchors:[],vertices:[],matrix:[],...r.getState()},s=window,o=n.data.type===de.ImageData;if(s.Speedy&&o){const e=s.Speedy,t=n.data.value;let o,u,d,p=i.$$private?.canvas,h=i.$$private?.context,f={...i};const g=4===i.anchors.length;if(i.$$private?.pipeline)o=i.$$private?.pipeline,u=i.$$private?.source;else{o=e.Pipeline(),u=e.Image.Source();const n=e.Image.Sink();d=e.Transform.PerspectiveWarp(),p?p.width===t.width&&p.height===t.height||(p.width=t.width,p.height=t.height,h=p.getContext("2d")):(c=t.width,l=t.height,p=Se(c,l),h=p.getContext("2d")),u.output().connectTo(d.input()),d.output().connectTo(n.input()),o.init(u,n,d);let r=e.Matrix(3,3,[1,0,0,0,1,0,0,0,1]);if(4===i.anchors.length){const t=e.Matrix(2,4,[(a=i.anchors)[0].x,a[0].y,a[1].x,a[1].y,a[2].x,a[2].y,a[3].x,a[3].y]),n=e.Matrix(2,4,i.vertices.reduce(((e,t)=>e.concat([t.x,t.y])),[])),s=e.Matrix.Zeros(3,3);await e.Matrix.perspective(s,t,n);const o=s.read();r=e.Matrix(3,3,o)}d.transform=r,f={...f,$$private:{...f.$$private,canvas:p,context:h,perspective:d,pipeline:o,source:u}}}let m=t;if(g){const e=await(async(e,t)=>{const n=window,r=e.$$private?.source,i=e.$$private?.pipeline;if(n.Speedy&&r&&i){const e=n.Speedy,s=await createImageBitmap(t),o=await e.load(s);return r.media=o,(await i.run()).image.source}return null})(f,m);e&&(p&&h&&(m=((e,t,n)=>(t.width=e.width,t.height=e.height,n.drawImage(e,0,0),n.getImageData(0,0,e.width,e.height)))(e,p,h)),f.$$private&&r.setState({...f,$$private:{...f.$$private,lastInputImage:t}}))}else f.$$private&&r.setState({...f,$$private:{...f.$$private,lastInputImage:t}});return r.nextGate(ni.image,{type:de.ImageData,value:m})}var a,c,l;console.log("Environment not supported")},getInputNames:()=>[{name:ri.image,type:de.ImageData}],getOutputNames:()=>[{name:ni.image,type:de.ImageData}],getDefaultState:ii,terminate:async e=>{const t=e.getState();t.$$private?.pipeline.release()}},oi=()=>({name:"Default widget bundle",description:"",inputs:[{dataType:[de.Anything],name:"input"}],outputs:[{dataType:[de.Anything],name:"output"}]});let ai;const ci=()=>{if(!ai)throw new Error(tt(et));return ai};const li=async e=>{const t=new c,n=await t.loadAsync(e),r={};for(const e in n.files)if(!n.files[e].dir){const t=await n.file(e);t&&(r[e]=await t.async("uint8array"))}return r},ui={};var di=e=>ui[e]||null;const pi=async(e,t,n)=>{try{const r=ci(),i=n?r.loadBlobAsString:r.loadBlob;return await i(e,t)}catch(e){return null}},hi=async e=>{const t=se;try{const n=await pi(e,t,!0);if(!n)return null;return Function(n)()}catch(e){return null}},fi=async e=>{const t=oe;try{const n=await pi(e,t,!0);if(!n)return null;return JSON.parse(n)}catch(n){return console.log(`Failed to parse the bundle's state [${e}/${t}] %j`,n),null}},gi=(e,t)=>`${e.replace(ae,"")}_${t}`,mi=(e,t)=>`widget/${e.replace(ae,"")}/v/${t}`,vi=async(e,t)=>{const n=ci(),[r]=await Promise.all([li(e),n.createLocation(t)]);for(const e in r)e.startsWith("__MACOSX")||await n.saveBlob(t,e,r[e])},yi=(e,t)=>{const n=gi(e,t),r=di(n);return r?{...r}:null},bi=(e,t,n)=>{const r=`${`widget/${e.replace(ae,"")}/tmp`}/${t}`;if(n){return ci().getCacheLocation(r)}return r};var wi=yi,Si=async(e,t,n)=>{const r=bi(t,n);await vi(e,r);const i=hi(r),s=fi(r),o=ci(),a=o.getCacheLocation(r),[c,l]=await Promise.all([i,s]);if(!c)return null;let u=l;if(!l){const e=oi(),t=JSON.stringify(e);await o.saveBlob(r,oe,Te(t)),u=e}return{cachePath:a,processor:c,storedState:Object.freeze(u)}},Ii=(e,t,n)=>{if(n.isTempStorage)return bi(e,t,n.fullStorageRoot);const r=ci(),i=mi(e,t);return n.fullStorageRoot?r.getCacheLocation(i):i};const _i=()=>oi();var $i={onParentEvent:async(e,t,n,r)=>{const i=r.getState();return i.$$processor?.onParentEvent({sourcePort:e?.name||"",targetPort:t?.name||"",data:n.data},{getState:r.getState,recipeId:r.recipePoolId,recipeType:r.recipeType,setState:r.setState,nextWidget:r.nextGate})},getInputNames:(e,t)=>{const n={..._i(),...e};return n.$$processor?.getInputNames?n.$$processor.getInputNames(e,t):n.inputs.map((e=>({name:e.name,type:e.dataType})))},getOutputNames:(e,t)=>{const n={..._i(),...e};return n.$$processor?.getOutputNames?n.$$processor.getOutputNames(e,t):n.outputs.map((e=>({name:e.name,type:e.dataType})))},getDefaultState:_i,initialize:async(e,t)=>{console.log("Widget bundle initialize",e);let n={...e.getState()},r=n.$$cacheInfo?.widgetThingId||n.collectionInfo?.widgetId||e.widgetThingId;const i=n.$$cacheInfo?.version.toString()||n.collectionInfo?.version.toString()||1;if(n.$$cacheInfo={...n.$$cacheInfo,version:Number(i),widgetThingId:r},!r||!i)throw new Error("Widget bundle state is missing cache id or version");console.log("Loading state from cache");const s=wi(r,i);let o=!s;if(!n.$$processor)if(n.storageUnitId&&!s){const t=await e.getStorageData(n.storageUnitId);if(t){r=e.widgetThingId;const s=await Si(t,r,i);o=!0,s&&(n={...n,$$processor:s.processor,$$cacheInfo:{...n.$$cacheInfo,widgetThingId:r,version:Number(i)}},e.setState(n))}}else if(s){o=!1;const r=n.collectionInfo?{...n.collectionInfo}:void 0;n={...n,...!t.keepCurrentState&&s.storedState?{...s.storedState,...r?{collectionInfo:r}:{}}:{},$$processor:s.processor},e.setState(n)}const a=Ii(r,i,{fullStorageRoot:!0,isTempStorage:o});console.log("Invoking bundle initialize with cache: ",a);try{await(n.$$processor?.initialize({cacheLocation:a,getState:e.getState,setState:e.setState}));const t=e.getState();e.setState({...t,$$initializationError:void 0})}catch(t){const n=e.getState();throw e.setState({...n,$$initializationError:t.message||"An error occurred initializing the widget"}),t}},terminate:async e=>{const t={...e.getState()};console.log(`Terminating widget bundle ${t.name} [${t.$$cacheInfo?.widgetThingId||""}]`);const n=t.$$processor;n&&"function"==typeof n.terminate&&await n.terminate({getState:e.getState,setState:e.setState,recipePoolId:e.recipePoolId,widgetId:e.widgetId})}};const Ci=Object.freeze({event:"event"}),ki="1",Ei="2",xi="3";var Ai={onParentEvent:async(e,t,n,r)=>{const i={...r.getState()};r.setState({...i,$$lastEventType:n.data.type}),await r.nextGate(ki,n.data),await r.nextGate(Ei,n.data),await r.nextGate(xi,n.data)},getInputNames:()=>[{name:Ci.event,type:de.Anything}],getOutputNames:e=>{const t={type:{...e}.$$lastEventType??de.Anything};return[{name:ki,...t},{name:Ei,...t},{name:xi,...t}]}};const Ni=Object.freeze({set:"set",trigger:"trigger"}),Oi="value";var Pi={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={name:"myVar",type:de.String,reactive:!0,defaultValue:"",...i};if(t.name.startsWith(ce)){if(!s.reactive)return;if(n.data.type!==s.type)return;return r.nextWidget(Oi,n.data)}if(t.name!==Ni.set){if(t.name===Ni.trigger){const e=fr(r.recipePoolId,r.thingRecipeId,s.name,{ownerWidgetId:r.id}),t=e||s.defaultValue;await r.nextWidget(Oi,{type:s.type,value:t})}}else await hr(r.recipePoolId,r.thingRecipeId,r.id,s.name,n.data,{skipCallerNotification:!s.reactive})},getInputNames:e=>{const t={...e};return[{name:Ni.set,type:t.type||de.Anything},{name:Ni.trigger,type:de.Anything}]},getOutputNames:e=>{const t={...e};return[{name:Oi,type:t.type||de.Anything}]}};let Li;var Ti=e=>{Li=e},Bi=()=>{if(!Li)throw new Error("Hub Connector not set");return Li};const ji=async(e,t=!1)=>{const n=Bi();let r=e.$$$serviceId;if(!e.service)return console.log("Aborting service initialization, missing property `service` in state."),null;if(!r||t){const t=await n.getCompatibleService(e.service.name,e.service.version,"^");if(!t)return null;r=t.sessionId}return r};var Di={onParentEvent:async(e,t,n,r)=>{const i={dynamicInputs:{},dynamicOutputs:{},customState:{},...r.getState()};if(!e)return;const s=Bi();let o=i.$$$serviceId;if(!o){const e=s.getCachedServices().available.find((e=>e.name===i.service?.name&&e.version===i.service?.version));if(!e)return;o=e.sessionId,i.$$$serviceId=o,r.setState(i)}const a=i.service?.variants?.find((e=>e.id===i.variantId)),c=a?i.dynamicInputs[a.id]||a?.inputs||[]:i.service?.inputs||[];if(!c?.length)return;if(!a&&i.service?.ignoreParentEvents)return;const l=i.service?.processingTimeoutSec;return s.onParentEvent({recipeId:r.recipePoolId,data:n.data,targetServiceSessionId:o,currentState:i.customState,targetVariantId:i.variantId,target:{portName:t.name,widgetId:r.id,widgetType:r.type},source:e,config:{timeout:l?1e3*l:0,async:i.service?.asyncParentEvents}})},getInputNames:async e=>{const t=e.variantId;if(t&&e.dynamicInputs?.[t])return[...e.dynamicInputs[t]||[]];if(!t)return e.service?.inputs||[];{const n=e.service?.variants?.find((e=>e.id===t));if(n)return n.inputs||[]}return[]},getOutputNames:async e=>{const t=e.variantId;if(t&&e.dynamicOutputs?.[t])return[...e.dynamicOutputs[t]||[]];if(!t)return e.service?.outputs||[];{const n=e.service?.variants?.find((e=>e.id===t));if(n)return n.outputs||[]}return[]},initialize:async e=>{const t={dynamicInputs:{},dynamicOutputs:{},customState:{},...e.getState()},n=Bi(),r=await ji(t);if(r)try{return await n.initializeServiceInstance({recipeId:e.recipePoolId,sessionId:r,widgetId:e.widgetThingId,recipeType:e.recipeType,variantId:t.variantId})}catch(t){if("FNC_NOT_FOUND"!==t?.errCode){if(!!("string"!=typeof t||!t.match('^Function ".*" not found.$')))throw t;console.warn(`Widget [${e.widgetThingId}] does not have an init function.`)}}else console.log(`Aborting service initialization, "${t.service?.name}" was not found in the current Hub.`)},terminate:async e=>{const t={dynamicInputs:{},dynamicOutputs:{},customState:{},...e.getState()},n=Bi(),r=await ji(t,!0);if(r)return n.terminateServiceInstance(r,e.widgetId,e.recipePoolId,t.variantId)}};const Ui=Object.freeze({Image:"image"}),Mi=Object.freeze({Image:"image"}),Fi=()=>({filters:[{name:"grayscale",value:.5,id:"d-1"}]});const Ri="loaded";const Wi={input:it,counter:at,elapsed:ut,ifGate:ft,skipEvent:vt,between:St,map:$t,parser:Et,slider:Nt,suspend:Lt,display:Bt,json:Ut,arrayItem:Rt,extractImage:Vt,imageConvolution:Jt,firstEvent:Qt,pixelDraw:on,randomBetween:un,arrayCombine:gn,clock:bn,multiplication:_n,object:An,widgetGroup:Ln,script:Ar,base64ToImageData:Br,jsonParse:Mr,text:Gr,imageCrop:qr,imageResize:Xr,value:ti,imageWarp:si,widgetBundle:$i,sequence:Ai,variable:Pi,hubService:Di,imageFilter:{onParentEvent:async(e,t,n,r)=>{const i={filters:[{name:"grayscale",value:.5,id:"d-1"}],...r.getState()};if(t.name===Ui.Image&&n.data.type===de.ImageData){if(!je(n.data.value))return void console.log("ImageFilter: Invalid image data type, aborting process");const e=n.data.value;i.$$memCanvas||(i.$$memCanvas=Se(e.width,e.height)),i.$$context||(i.$$context=i.$$memCanvas.getContext("2d")),i.$$memCanvas.width!==e.width&&(i.$$memCanvas.width=e.width),i.$$memCanvas.height!==e.height&&(i.$$memCanvas.height=e.height),r.setState(i),i.$$context.putImageData(e,0,0),i.filters.length?i.$$context.filter=i.filters.map((e=>`${e.name}(${e.value}${"blur"===e.name?"px":""})`)).join(" "):i.$$context.filter="none",i.$$context.drawImage(i.$$memCanvas,0,0);const t=i.$$context.getImageData(0,0,e.width,e.height);return r.nextWidget(Mi.Image,{type:de.ImageData,value:t})}},getInputNames:()=>[{name:Ui.Image,type:de.ImageData}],getOutputNames:()=>[{name:Mi.Image,type:de.ImageData}],getDefaultState:Fi},recipeLoad:{onParentEvent:async(e,t,n,r)=>r.nextWidget(Ri,{value:!0,type:de.Boolean}),getInputNames:()=>[],getOutputNames:()=>[{name:Ri,type:de.Boolean,description:"Triggered when the recipe is fully loaded"}]},play:{getInputNames:()=>[],onParentEvent:()=>Promise.resolve(),getOutputNames:()=>[{name:"out",type:de.Boolean}]}},Gi={},Vi=async()=>{if(!Object.keys(Gi).length)for(const e in Wi){const t=Wi[e];Gi[e]=Object.freeze({...t})}};var Hi=e=>{if(Gi[e])return Gi[e];throw new Error(tt(Qe,e))},zi=Vi;const qi=new a,Ki="invoked";let Ji={},Yi={},Xi={},Zi={};const Qi=(e,t,n)=>`${e}-${t}${n?`-${n}`:""}`;var es=(e,t,n,r,i)=>{const s=Qi(e,t,n),o=Qi(e,t),a=Qi(e,t,"produced"),c=Xi[o],l=Date.now();Zi[o]=l,Ji[s]={data:r,sourcePortName:n,...i?{target:{widgetId:i.widgetId,portName:i.portName}}:{}},qi.emit(a,{currentTime:l,prevTime:c,...i?{targetPort:i?.portName}:{}})},ts=(e,t,n,r,i)=>{const s=Qi(e,t,n),o=Qi(e,t),a=Qi(e,t,Ki),c=Xi[o],l=Date.now();Xi[o]=l,Yi[s]={data:r,sourcePortName:n,...i?{source:{widgetId:i.widgetId,portName:i.portName}}:{}},qi.emit(a,{prevTime:c,currentTime:l,targetPort:n,sourceInfo:i})},ns=()=>{Ji={},Yi={},Xi={},Zi={},qi.clearListeners()};let rs,is,ss;const os=async(e,t,n,r,i)=>{const s=te(n,t);if(!s)return;const o=s.gates[e];if(!o||o.disabled)return;const a={...i,timestamp:Date.now()},c=Hi(o.type),l=us(e,a,s.recipeId,s.id,s.version,n);if(l&&c.onParentEvent){const t={name:r};return rs&&await rs({recipeId:n,blockId:s.recipeId,gateId:e,targetPort:t.name,data:i}),c.onParentEvent(null,t,{originalEvent:a,data:{...a}},l)}},as=async(e,t,n,r,i,s,o,a,c,l)=>{if(!e&&!c)throw new Error("Missing parameter ['sourceGateId']");if(!e&&!l)throw new Error("Missing parameter ['originalEvent']");e&&(l={timestamp:Date.now(),type:de.Boolean,value:!0});const u=l;if("string"==typeof n){const e=te(r,n);if(!e)return;n=e}const d=n.gates[t];if(!d||d.disabled)return;const p=a.findIndex((e=>e.name===i)),h=Hi(d.type),f=us(t,u,n.recipeId,n.id,n.version,r);if(f&&h.onParentEvent&&-1!==p){rs&&await rs({recipeId:r,blockId:n.recipeId,gateId:t,targetPort:s.name,data:o,sourceGate:e?"interrupt_widget":c,sourcePort:e?ie:i});const l={name:a[p].name,type:a[p].type,...a[p].jsonShape?{jsonShape:a[p].jsonShape}:void 0};return ts(n.recipeId,t,s.name,o,c?{widgetId:c,portName:i}:void 0),h.onParentEvent(l,s,{originalEvent:u,data:o},f)}},cs=async(e,t,n,r,i,s,o,a)=>{const c=ee(a);if(!c)throw new Error(`Failed to find recipe "${a}" in cache`);const l=c.dbInfo.recipeType,u=ne(a,i,r);if(!u)return;const d={...n,timestamp:t.timestamp},p=Hi(u.type);let h;h=u.type===He.input?p.getOutputNames(u.state,{thingRecipeId:i,thingDbId:s,thingVersion:o,id:r,recipeId:a,recipeType:l,recipePoolId:a}):await p.getOutputNames(u.state,{recipePoolId:a,recipeType:l,thingRecipeId:i,widgetId:r});const f=h.findIndex((t=>t.name===e));if(-1!==f){const n=te(a,i);if(!n)return;es(i,r,e,d);const s=u.children.length;for(let o=0;o<s;o++){if(We(u.children[o]?.sourcePort).portName===e){const s=n.gates[u.children[o].childId];if(s&&!s.disabled){const c=Hi(s.type);let p;const f={recipePoolId:a,recipeType:l,thingRecipeId:i,widgetId:r};p=s.type===He.hubService?await c.getInputNames(s.state,f):c.getInputNames(s.state,f);const g=We(u.children[o].targetPort),m=p.find((e=>e.name===g.portName));m&&await as(!1,s.id,n,a,e,{name:m.name},u.returnOriginalEvent?t:d,h,u.id,t)}}}}},ls=async(e,t,n,r)=>{const i=ee(r);if(!i)return null;const s=te(r,n);if(!s)return s;const o=s.gates,a=s.gates[t],c=Hi(a.type),l=await c.getInputNames(a.state,{recipePoolId:r,recipeType:i.dbInfo.recipeType,thingRecipeId:n,widgetId:t}),u=l.findIndex((t=>t.name===e));if(-1!==u){const e=((e,t,n)=>{for(const r in n){const i=n[r],s=i.children.length;for(let n=0;n<s;n++){const r=i.children[n],s=We(r.targetPort);if(r.childId===e&&s.portName===t)return i}}return null})(t,l[u].name,o);if(e){const t=Hi(e.type);return{getValue:()=>"function"==typeof t.getValue?t.getValue():null}}}return null},us=(e,t,n,r,i,s)=>{const o=ee(s);if(!o)throw new Error(`Failed to find recipe "${s}" in cache`);const a=ne(s,n,e);if(!a)return console.warn(`Gate ${e} not found in block ${n} for recipe ${s}`),null;const c=async(o,a)=>cs(o,t,a,e,n,r,i,s),l={id:e,type:a.type,recipePoolId:s,thingRecipeId:n,recipeType:o.dbInfo.recipeType,returnOriginalEvent:!!a.returnOriginalEvent,registerInterrupt:(t,r,i,o,a)=>Ye.createInterrupt(t,s,n,e,r,i,o,a),cancelInterrupt:e=>Ye.destroyInterrupt(e),nextWidget:c,nextGate:c,getParentAtPort:t=>ls(t,e,n,s),getState:()=>Object.freeze({...a.state,...a.type===He.input&&{customInputs:[]}}),setState:t=>{if("object"!=typeof t)return void console.warn(`Invalid state type [${typeof t}]. Expected an 'object'`);const r={...t,...a.type===He.input&&!t.customInputs&&{customInputs:[]}},i={...a.state};a.state=r,is&&is({blockId:n,gateId:e,prevState:i,newState:{...r},recipeId:s})}};return l};Ye.setInvokeChildGateCb(as);const ds=new a,ps="invoked",hs="state",fs=()=>{Ye.destroyAllInterrupts()},gs=async(e,t,n)=>{const r=ee(e),i=ne(e,t,n);if(i&&r){const s=Hi(i.type);if(s&&"function"==typeof s.terminate){const i=((e,t,n,r)=>Xe(e,t,n,r))(e,r.dbInfo.recipeType,t,n);if(i)try{await s.terminate(i)}catch(e){console.warn(`Error terminating widget "${n}" in thing "${t}". Failing silently: `,e)}}}},ms=async(e,t,n,r)=>{const i=ee(e),s=ne(e,t,n);if(s&&i){const o=Hi(s.type);if(o&&"function"==typeof o.initialize){const s=((e,t,n,r)=>Xe(e,t,n,r,!0))(e,i.dbInfo.recipeType,t,n);if(s){const e=o.initialize;try{await e(s,r||{})}catch(e){throw console.warn(`Error initializing widget "${n}" in thing "${t}": `,e),e}}}}},vs=(e,t)=>{const n=ee(t);if(n)for(const t in n.blocks){const r=n.blocks[t];for(const t in r.gates)if(t===e)return{widget:r.gates[t],thing:r}}return null},ys=(e,t="",n="")=>`block:${t}:gate:${n||""}:${e}`,bs=e=>{ds.emit(ys(hs),e),ds.emit(ys(hs,e.blockId,e.gateId),e)};rs=async e=>{await ds.emit(ys(ps),e),await ds.emit(ys(ps,e.blockId,e.gateId),e)},(e=>{is=e})(bs);var ws,Ss,Is,_s,$s,Cs,ks,Es,xs,As,Ns,Os,Ps,Ls=async(e,t,n,r,i)=>{const s=re(e,{id:t,authorId:r,version:n,recipeType:i});ns();const o=ee(s);return o&&(o.startedAt=Date.now(),o.retryAttempts=0,o.execCounter=0,o.status=Y.STARTING,o.addLog("recipe registered")),s},Ts=async e=>{const t=ee(e);var n;if(!t)return null;t.addLog("terminating recipe"),fs();for(const n in t.blocks){const r=t.blocks[n];for(const t in r.gates)await gs(e,n,t)}X[n=e]&&delete X[n]},Bs=async(e,t)=>{const n=ee(e),r=[],i=[];if(n)for(const s in n.blocks){const o=n.blocks[s];if(!t||!Array.isArray(t)||t.includes(s))for(const t in o.gates)try{if(n.dbInfo?.recipeType===Bn.Desktop){const e=o.gates[t];if(e.type===He.hubService){const r=e.state;if(r?.service?.webOnly){n?.addLog(`skipping initialization of web-only widget "${t}"`);continue}}e.type===He.recipeLoad&&i.push(e)}await ms(e,s,t,{keepCurrentState:!0})}catch(e){r.push({widgetId:t,error:e.message})}}return{failed:r,sendToInputWidget:(t,n,r=le)=>(async(e,t,n,r)=>{const i=ee(n),s=te(n,r),o=Date.now();if(s&&i)for(const i in s.gates){const a=s.gates[i];if(a.type===He.input&&!a.disabled){const c=a.state.inputName||"";if(c===e){const e=Hi(a.type),l={...t,timestamp:o},u=us(i,l,r,s.id,s.version,n);if(u&&e.processEvent){const s={...u,getState:u.getState};rs&&await rs({recipeId:n,blockId:r,gateId:i,targetPort:rt,data:t}),ss?await ss(r,n,c,t):await e.processEvent(l,s)}}}}})(t,n,e,r),invokeRecipeLoadedWidgets:async()=>{for(const t of i)await os(t.id,le,e,Ri,{type:de.Boolean,value:!0})}}},js=e=>{Ti(e)},Ds=(e,t,n,r=!1)=>{const i=vs(t,e);if(i){const{widget:s,thing:o}=i,a={...s.state};s.state=n,r&&bs({blockId:o.recipeId,gateId:t,recipeId:e,newState:{...n},prevState:a})}},Us=(e,t)=>{const n=vs(t,e);return n?n.widget.state:null},Ms=async(e,t,n,r,i)=>{const s=vs(t,e);if(s)return cs(n,r,i,t,s.thing.recipeId,s.thing.id,s.thing.version,e)};!function(e){e.Seats="seats",e.RecipeInvocations="recipe_invocations",e.HubServices="hub_services",e.RecipeExports="recipe_exports"}(ws||(ws={})),function(e){e.UserFriendlyName="user_friendly_name",e.UserFriendlyDescription="user_friendly_description",e.InternalDescription="internal_description",e.TierLevel="tier_level",e.ProductFeatures="product_features",e.UserSubscribeCode="subscription_code"}(Ss||(Ss={})),function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(Is||(Is={})),function(e){e.Bundle="bundle",e.Group="group"}(_s||(_s={})),function(e){e.Hardware="hardware",e.Virtual="virtual"}($s||($s={})),function(e){e.Cloud="cloud",e.Web="web"}(Cs||(Cs={})),function(e){e.Cpu_128M="kmu-cpu-128m",e.Cpu_256M="kmu-cpu-256m",e.Cpu_512M="kmu-cpu-512m",e.Cpu_1024M="kmu-cpu-1024m",e.Cpu_2048M="kmu-cpu-2048m",e.Cpu_4096M="kmu-cpu-4096m"}(ks||(ks={})),function(e){e.Gateway="gateway",e.Timer="timer"}(Es||(Es={})),function(e){e.InstallInProgress="installation-in-progress"}(xs||(xs={})),function(e){e.InstallDependencies="install-dependencies",e.GetInstalledDependencies="get-installed-dep"}(As||(As={})),function(e){e.Success="success",e.Error="error",e.Pending="pending"}(Ns||(Ns={})),function(e){e.NotFound="not-found",e.BadRequest="bad-request",e.Forbidden="forbidden",e.InternalError="internal-error"}(Os||(Os={})),function(e){e.KeyCreated="key_created",e.ValidateKey="validate_key",e.ExecuteRecipe="execute_recipe",e.InstallHubService="install_hub_service",e.ExportRecipe="export_recipe"}(Ps||(Ps={}));const Fs=(e,t)=>((e,t,n)=>{const r=Buffer.from(n,"base64"),i=r.subarray(0,16),s=r.subarray(16).toString("base64"),o=u(e,t,32),a=d("aes-256-cbc",o,i);let c=a.update(s,"base64","utf8");return c+=a.final("utf8"),c})(e.id||"recipe.json","kemu",t),Rs=e=>{try{return JSON.parse(e)}catch(e){return null}},Ws="undefined"!=typeof window,Gs={protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8},Vs={protocolPrefix:4,txtLength:4},Hs=Object.values(Gs).reduce(((e,t)=>e+t),0),zs=Object.values(Vs).reduce(((e,t)=>e+t),0),qs=["width","height","colorSpace"],Ks=(e,t)=>{const n={},r=[];let i=0,s=Array.isArray(e)?[]:{};const o=(e,s)=>{const a=(e=>{const t="undefined"!=typeof Buffer&&e instanceof Buffer,n=e instanceof ArrayBuffer,r=e instanceof Uint8ClampedArray,i=e instanceof Uint8Array,s=e instanceof Int8Array;return t?"Buffer":n?"ArrayBuffer":r?"Uint8ClampedArray":i?"Uint8Array":s?"Int8Array":null})(e);if(!a){if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++)t[n]=o(e[n],`${s}[${n}]`);return t}if("object"==typeof e){const t={},n=(e=>{const t=e instanceof Int16Array,n=e instanceof Uint16Array,r=e instanceof Int32Array,i=e instanceof Uint32Array,s=e instanceof Float32Array,o=e instanceof Float64Array,a=e instanceof BigInt64Array,c=e instanceof BigUint64Array;return t?"Int16Array":n?"Uint16Array":r?"Int32Array":i?"Uint32Array":s?"Float32Array":o?"Float64Array":a?"BigInt64Array":c?"BigUint64Array":null})(e);if(n)throw new Error(`Unsupported binary type [${n}] at path "${s}"`);for(const n in e)e.hasOwnProperty(n)||qs.includes(n)||console.warn(`Allowing inherited property: ${n} from path: ${s}`),t[n]=o(e[n],`${s.length?`${s}.`:""}${n}`);return t}return e}n[s]={index:i,length:e.byteLength,binaryType:a},"Buffer"===t?r.push(Buffer.from(e)):"ArrayBuffer"===a?r.push(e):r.push(e.buffer),i+=e.byteLength};s=o(e,"");let a=null;if(r.length>1)if("ArrayBuffer"===t){const e=r.reduce(((e,t)=>e+t.byteLength),0),t=new Uint8Array(e);let n=0;for(let e=0;e<r.length;e++)t.set(new Uint8Array(r[e]),n),n+=r[e].byteLength;a=t.buffer}else{a=Buffer.concat(r)}else 1===r.length&&(a=r[0]);return a?{map:n,combinedData:a,sourceCopy:s}:null},Js=(e,t,n)=>{const r=t.match(/(\[\d+\])|([^[\].]+)/g)||[];let i=e;for(let e=0;e<r.length;e++){let t=r[e];const s=t.startsWith("[")&&t.endsWith("]"),o=e===r.length-1;if(s){t=t.slice(1,-1);const s=parseInt(t,10);if(!Array.isArray(i))throw new Error(`Expected an array at key "${r.slice(0,e).join(".")}" but found an object.`);o?i[s]=n:(i[s]||(i[s]=r[e+1].startsWith("[")?[]:{}),i=i[s])}else o?i[t]=n:(i[t]||(i[t]=r[e+1].startsWith("[")?[]:{}),i=i[t])}return e},Ys=(e,t,n)=>{const r="undefined"!=typeof Buffer,i=t instanceof Uint8Array;for(const s in n)if(n.hasOwnProperty(s)){const{index:o,length:a,binaryType:c}=n[s];let l=null;if(r&&t instanceof Buffer)switch(c){case"Buffer":l=t.subarray(o,o+a);break;case"ArrayBuffer":l=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a);break;case"Uint8Array":l=new Uint8Array(t.subarray(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.subarray(o,o+a));break;case"Int8Array":l=new Int8Array(t.subarray(o,o+a))}else if(t instanceof ArrayBuffer||t instanceof Uint8Array)switch(c){case"Buffer":if(r){l=Buffer.from(t.slice(o,o+a));break}case"ArrayBuffer":l=i?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a):t.slice(o,o+a);break;case"Uint8Array":l=i?t.slice(o,o+a):new Uint8Array(t.slice(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.slice(o,o+a));break;case"Int8Array":l=new Int8Array(t.slice(o,o+a))}l&&Js(e,s,l)}return e},Xs=e=>f(e),Zs="KMSG",Qs="KCMD",eo=Xs("klProtocol");var to={encode:(e,t,n)=>{const r={json:e.json},i=Ks(r.json,"Buffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Buffer.from(a),l=c.byteLength,u=Gs.protocolPrefix+Gs.protocolVersion+Gs.jsonLength+Gs.binaryLength+Gs.fromServiceId+Gs.toServiceId+Gs.sentAt+l+o,d=Buffer.alloc(u),p=Date.now();let h=0;return d.write(Zs,h),h+=Gs.protocolPrefix,d.writeUInt8(1,h),h+=Gs.protocolVersion,d.writeUInt32LE(l,h),h+=Gs.jsonLength,d.writeUInt32LE(o,h),h+=Gs.binaryLength,d.writeUInt32LE(t,h),h+=Gs.fromServiceId,d.writeUInt32LE(n,h),h+=Gs.toServiceId,d.writeBigInt64LE(BigInt(p),h),h+=Gs.sentAt,c.copy(d,h),h+=l,s&&o&&s.copy(d,h),d},decodeHeader:e=>{let t=0;const n=e.toString("utf-8",t,Gs.protocolPrefix);if(t+=Gs.protocolPrefix,n!==Zs)return null;if(e.byteLength<Hs)return eo(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const r=e.readUInt8(t);t+=Gs.protocolVersion;const i=e.readUInt32LE(t);t+=Gs.jsonLength;const s=e.readUInt32LE(t);t+=Gs.binaryLength;const o=e.readUInt32LE(t);t+=Gs.fromServiceId;const a=e.readUInt32LE(t);t+=Gs.toServiceId;const c=e.readBigInt64LE(t);t+=Gs.sentAt;const l=i+s,u=e.subarray(t,t+l),d=e.subarray(0,Hs);let p=null;return e.byteLength-Hs-i-s>0&&(p=e.subarray(Hs+i+s)),{header:{protocolVersion:r,jsonLength:i,binaryLength:s,fromServiceId:o,toServiceId:a,sentAt:new Date(Number(c)),packages:[u],headerPackage:d},remaining:p}},decodeFullKlMessage:e=>{const t=Buffer.concat(e.packages),n=t.subarray(0,e.jsonLength).toString(),r=t.subarray(e.jsonLength,e.jsonLength+e.binaryLength),i=Rs(n);if(!i?.json)return eo("Invalid JSON in KL message"),null;i.jsonBinaryMap&&r.byteLength&&Ys(i.json,r,i.jsonBinaryMap);const s=Buffer.concat([e.headerPackage,t]);let o=s,a=null;const c=Hs+e.jsonLength+e.binaryLength;return s.byteLength>c&&(a=s.subarray(c),o=s.subarray(0,c)),{message:{json:i.json,rawMessage:o},remaining:a}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<Hs)return eo("Invalid Header Size"),e;let n=0;return n+=Gs.protocolPrefix,n+=Gs.protocolVersion,n+=Gs.jsonLength,n+=Gs.binaryLength,void 0!==t.fromServiceId&&e.writeUInt32LE(t.fromServiceId,n),n+=Gs.fromServiceId,void 0!==t.toServiceId&&e.writeUInt32LE(t.toServiceId,n),e},encodeCommand:e=>{let t=0;const n=Buffer.from(e),r=n.byteLength,i=zs+r,s=Buffer.alloc(i);return s.write(Qs,t),t+=Vs.protocolPrefix,s.writeUint32LE(r,t),t+=Vs.txtLength,n.copy(s,t),s},decodeCommand:e=>{let t=0;if(e.byteLength<zs)return{command:null};const n=e.toString("utf-8",t,Vs.protocolPrefix);if(t+=Vs.protocolPrefix,n!==Qs)return{command:null};const r=e.readUInt32LE(t);t+=Vs.txtLength;const i=e.toString("utf-8",t,t+r),s=e.byteLength-zs-r;let o=null;s>0&&(o=e.subarray(zs+r));let a=0;return s<0&&(a=Math.abs(s)),{command:i,remainingData:o,missing:a}}};const no="KMSG",ro="KCMD",io=Xs("klProtocol"),so=new TextEncoder;var oo={encode:(e,t,n)=>{const r={json:e.json},i=Ks(e.json,"ArrayBuffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=so.encode(a),l=c.byteLength,u=new ArrayBuffer(Gs.protocolPrefix+Gs.protocolVersion+Gs.jsonLength+Gs.binaryLength+Gs.fromServiceId+Gs.toServiceId+Gs.sentAt+l+o),d=new DataView(u),p=new Uint8Array(u),h=Date.now();let f=0;for(let e=0;e<4;++e)p[f++]=no.charCodeAt(e);return d.setUint8(f,1),f+=Gs.protocolVersion,d.setUint32(f,l,!0),f+=Gs.jsonLength,d.setUint32(f,o,!0),f+=Gs.binaryLength,d.setUint32(f,t,!0),f+=Gs.fromServiceId,d.setUint32(f,n,!0),f+=Gs.toServiceId,d.setBigInt64(f,BigInt(h),!0),f+=Gs.sentAt,p.set(c,f),f+=l,s&&o&&p.set(new Uint8Array(s),f),u},decodeHeader:e=>{const t=new DataView(e);let n=0,r="";for(let e=0;e<Gs.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==no)return null;if(e.byteLength<Hs)return io.log(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const i=t.getUint8(n);n+=Gs.protocolVersion;const s=t.getUint32(n,!0);n+=Gs.jsonLength;const o=t.getUint32(n,!0);n+=Gs.binaryLength;const a=t.getUint32(n,!0);n+=Gs.fromServiceId;const c=t.getUint32(n,!0);n+=Gs.toServiceId;const l=t.getBigInt64(n,!0);n+=Gs.sentAt;const u=s+o,d=e.slice(n,n+u),p=new Uint8Array(e,0,Hs);let h=null;if(e.byteLength-Hs-s-o>0){h=new Uint8Array(e,Hs+s+o).slice().buffer}return{header:{protocolVersion:i,jsonLength:s,binaryLength:o,fromServiceId:a,toServiceId:c,sentAt:new Date(Number(l)),packages:[d],headerPackage:p.slice().buffer},remaining:h}},decodeFullKlMessage:e=>{const t=e.packages.reduce(((e,t)=>e+t.byteLength),0),n=new Uint8Array(t);let r,i=0;for(const t of e.packages)r=new Uint8Array(t),n.set(r,i),i+=r.byteLength;const s=(new TextDecoder).decode(n.subarray(0,e.jsonLength)),o=n.subarray(e.jsonLength,e.jsonLength+e.binaryLength),a=Rs(s);if(!a?.json)return io.log("Invalid JSON in KL message"),null;a.jsonBinaryMap&&o.byteLength&&Ys(a.json,o,a.jsonBinaryMap);const c=new Uint8Array(e.headerPackage.byteLength+n.byteLength);c.set(new Uint8Array(e.headerPackage),0),c.set(n,e.headerPackage.byteLength);let l=c,u=null;const d=Hs+e.jsonLength+e.binaryLength;return c.byteLength>d&&(u=c.subarray(d),l=c.subarray(0,d)),{message:{json:a.json,...o.length?{binaryData:o.buffer}:{},rawMessage:l.buffer},remaining:u?.buffer??null}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<Hs)return io("Invalid Header Size"),e;let n=0;n+=Gs.protocolPrefix,n+=Gs.protocolVersion,n+=Gs.jsonLength,n+=Gs.binaryLength;const r=new DataView(e);return void 0!==t.fromServiceId&&r.setUint32(n,t.fromServiceId,!0),n+=Gs.fromServiceId,void 0!==t.toServiceId&&r.setUint32(n,t.toServiceId,!0),e},encodeCommand:e=>{let t=0;const n=so.encode(e),r=n.byteLength,i=new ArrayBuffer(zs+r),s=new DataView(i),o=new Uint8Array(i);for(let e=0;e<4;++e)o[t++]=ro.charCodeAt(e);return s.setUint32(t,r,!0),t+=Vs.txtLength,o.set(n,t),i},decodeCommand:e=>{const t=new DataView(e);let n=0;if(e.byteLength<zs)return{command:null};let r="";for(let e=0;e<Vs.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==ro)return{command:null};const i=t.getUint32(n,!0);n+=Vs.txtLength;const s=e.byteLength-zs-i,o=new Uint8Array(e,n,Math.min(i,e.byteLength-zs)),a=(new TextDecoder).decode(o);let c=null;s>0&&(c=e.slice(zs+i));let l=0;return s<0&&(l=Math.abs(s)),{command:a,remainingData:c,missing:l}}};let ao=to;Ws&&(ao=oo);var co,lo=ao;(co||(co={})).FunctionNotFound="FNC_NOT_FOUND";let uo=Math.ceil(Date.now()/1e3);let po,ho,fo,go,mo,vo=!1;var yo=()=>{vo=!0},bo=(e,t)=>{if(!po)throw new Error("Memory connection not set.");po.sendBuf(e,t)},wo=e=>ho=e,So=e=>mo=e,Io=e=>fo=e,_o=e=>go=e;const $o=async(e,t=2)=>{const n=async(e,r)=>{if("object"==typeof e){const i=Object.keys(e);for(const s of i){const i=e[s];if(i&&"object"==typeof i){const o=i._kemuType;if(void 0!==o){if(o===de.ImageData){const t=e[s];e[s]=await Ge(t)}}else r<t&&await n(i,++r)}}}};return await n(e,1),e};Xs("klTransmissionManager"),Xs("ipcClient");Xs("kemuWidgetService"),C(process.argv.slice(2));const Co=e=>f(`runner:${e}`),ko=Co("connectionManager"),Eo=Co("remoteInvoke"),xo=new function(e){const t={};let n=console.log;const r={};let i=e||String(Date.now());const s={},o=e=>!s[e],a=(e,t,n,r,i,s)=>{let a=Ws?new ArrayBuffer(0):Buffer.alloc(0);const c={json:{functionName:e,args:s.success?s.success:[s],messageId:t,type:s.success?"response":"error"}};return o(r)&&(a=lo.encode(c,n,r)),i(a,{msg:c,sourceServiceId:n,targetServiceId:r})};return{setLogger:e=>{n=e},processMessage:(e,i,s,o)=>{if(!o)return!1;const c=o;if(t[c.messageId]){const e=t[c.messageId];return e&&(clearTimeout(e.timer),e.fulfilled||(e.fulfilled=!0,"response"===c.type?e.resolve(c.args):"error"===c.type&&e.reject(c.args[0])),delete t[c.messageId]),!0}if("execute"!==c.type&&n&&n(`No pending execution found for message id "${c.messageId}"`),"execute"===c.type){const t=r[c.functionName];if(t){const n=e=>{a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,e)};t({transport:e,args:c.args,reply:n,messageId:c.messageId,sourceServiceId:s.sourceServiceId,send:i})}else{const e=`Function "${c.functionName}" not found.`;n&&n(e),a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,{error:e,errCode:"FNC_NOT_FOUND"})}return!0}return!1},execute:async(e,r,s,a,c,l)=>{if(!s){const e="No send buffer function provided.";throw n&&n(e),e}uo+=1;const u=`${i}-${uo}-exec-${e.substring(0,10)}`,d={messageId:u,functionName:e,send:s,sourceServiceId:a,targetServiceId:c,args:r||[],fulfilled:!1,resolve:()=>{},reject:()=>{}};d.promise=new Promise(((e,t)=>{d.resolve=e,d.reject=t}));let p=Ws?new ArrayBuffer(0):Buffer.alloc(0);const h={json:{functionName:e,args:r,messageId:u,type:"execute"}};o(c)&&(p=lo.encode(h,a,c)),t[u]=d,n&&n(`Calling remote function "${e}" with message id "${u}"`);const f="true"===process.env.NO_INVOKE_TIMEOUT;return l?.async?(d.fulfilled=!0,d.resolve([void 0]),delete t[u]):0===l?.timeout||f||(d.timer=setTimeout((()=>{n&&n(`Remote function ${u} timed out`);const r=t[u];r&&!r.fulfilled&&(r.fulfilled=!0,d.reject(`Function ${e} Timed out`)),delete t[u]}),l?.timeout||3e4)),s(p,{sourceServiceId:a,targetServiceId:c,msg:h}),d.promise},sendResponse:a,registerFunction:(e,t)=>{r[e]=t},getTransportSendFunction:e=>{const n=t[e];return n?n.send:null},setServiceName:e=>{i=e},getPendingExecutions:()=>t,rejectAllPending:e=>{Object.keys(t).forEach((n=>{const r=t[n];r&&!r.fulfilled&&(clearTimeout(r.timer),r.fulfilled=!0,r.reject(e),delete t[n])}))},broadcast:(e,t,r,s)=>{uo+=1;const a=`${i}-${uo}-multicast-${e.substring(0,10)}`;let c=Ws?new ArrayBuffer(0):Buffer.alloc(0);const l={json:{functionName:e,args:t,messageId:a,type:"execute"}};let u=o(r[0].serviceId);u&&(c=lo.encode(l,s,r[0].serviceId));for(let t=0;t<r.length;t++)try{const i=r[t];n&&n(`Broadcasting function "${e}" with message id "${a}" to client [${i.serviceId}]`),0!==t&&(u=o(i.serviceId),u&&(c=lo.patchEncodedHeader(c,{toServiceId:i.serviceId}))),i.sendFn(c,{msg:l,sourceServiceId:s,targetServiceId:i.serviceId})}catch(e){n&&n(`Error broadcasting to client at index ${t}`)}},disableServiceEncoding:(e,t)=>{s[e]=t}}}("kweb");xo.setLogger(Eo);const Ao=new a,No=new a;let Oo,Po=null,Lo=null,To=null;const Bo={},jo=()=>{if(!To)throw new Error("API key is required to interact with the hub");return To},Do=(e,t,n)=>{const r=`${e}_${t}`,i={contents:n,lastRequestedAt:Date.now(),contentsChecksum:""};return Bo[r]=i,i},Uo=(e,t)=>Bo[`${e}_${t}`]||null,Mo=async(e,t)=>{if(!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),null;const n=[{serviceName:e,version:t}];return(await xo.execute(ge.GetServiceContents,n,Ro,Po,0))[0]},Fo=async(e,t,n=!1)=>{if(!e||!t)return null;const r=Uo(e,t);if(!r||n){const n=r||Do(e,t);try{const r=await Mo(e,t);return r&&(n.contents=r.uiContent,n.contentsChecksum=r.uiContentsChecksum||""),n.contents||null}catch(n){ko(`Failed to fetch service contents for ${e} v${t}`,n)}}return r?.contents||null},Ro=bo,Wo=()=>{ko("Disconnected from the server"),Po=null,xo.rejectAllPending("Disconnected from the server"),Ao.emit("disconnected")},Go=()=>{ko("Connected to the server"),Ao.emit("connected")},Vo=()=>Lo,Ho=(e,t,n,r)=>`${e}_${t}_${n}_${r}`,zo=async()=>{const e=Vo();if(e){const t=ee(e)?.blocks;if(t){const n={};for(const r in t){const i=t[r];for(const t in i.gates){const r=i.gates[t];if(r.type===He.hubService){const t=r.state;if(t.service?.eventEmitter){const r=`${t.service.name}_${t.service.version}`;if(!n[r])try{ko(`Re-issuing subscription for service ${t.service.name} (${t.service.version})`),n[r]=!0,await aa({listener:{recipeId:e},targetService:{serviceName:t.service.name,version:t.service.version}})}catch(e){ko(`Failed to re-issue subscription for service ${t.service.name} (${t.service.version})`,e)}}}}}}}},qo=async e=>{if(!e)return void ko("Hub sent ACK request without service id");const t={apiKey:jo(),ackSessionId:e};await xo.execute(ge.SocketAckResponse,[t],Ro,e,0),ko("Hub Link acknowledged"),Po=e,Ao.emit("acknowledged"),zo()},Ko=async e=>{const t=e.args[0],n=Ho("broadcast",`hub_${t.type}`,(0).toString(),"");await No.emit(n,t)},Jo=async e=>{const t=e.args[0];for(const e of t.outputs||[])e.type===de.ImageData&&je(e.value)&&(e.value=await Ge(e.value));const n=Vo();if(n){const r=ee(n);if(r){const i=async e=>{const n=Ho("broadcast",t.source.serviceName,t.source.serviceVersion,e);try{await No.emit(n,t)}catch(t){ko(`Failed to emit broadcast event for target ${e}`,t)}};await i("app");for(const s in r.blocks){const o=r.blocks[s];for(const r in o.gates){const s=o.gates[r];if(s.disabled)continue;const a=s.state;if(s.type===He.hubService&&a.service?.name===t.source.serviceName&&a.service?.version===t.source.serviceVersion&&a.variantId===t.variantId){await i(r);for(const i of t.outputs||[])if(null!==i.value&&void 0!==i.value){const t={type:i.type,value:i.value,timestamp:Date.now()};ko(`Sending data to output ${i.name} requested by messageId ${e.messageId}`),await Ms(n,r,i.name,t,t)}}}}}}},Yo=async e=>{const t=e.args[0],{finalState:n,recipeId:r,widgetId:i}=t,s=Us(r,i);let o=s;if(n&&o&&s&&(o={...s,customState:n},Ds(r,i,o,!0)),o?.service)try{const e=Ho("setOutputs",o.service.name,o.service.version,i);await No.emit(e,t.outputs)}catch(e){ko(`Failed to emit setOutputs event for widget ${i}`,e)}for(const n of t.outputs)if(null!==n.value&&void 0!==n.value){if(n.type===de.ImageData){if(!je(n.value)){ko(`Invalid ImageData value received for output ${n.name}. Expected an ImageData-like object`);continue}n.value=await Ge(n.value)}else n.type===de.JsonObj&&await $o(n.value);const t={type:n.type,value:n.value,timestamp:Date.now()};ko(`Sending data to output ${n.name} requested by messageId ${e.messageId}`),await Ms(r,i,n.name,t,t)}e.reply({success:[]})},Xo=async e=>{const t=e.args[0],{newState:n,recipeId:r,widgetId:i}=t,s=Us(r,i);if(s){const t={...s,customState:{...s.customState,...n}};return Ds(r,i,t,!0),e.reply({success:[]})}},Zo=async({args:e,reply:t})=>{const n=e[0],{recipeId:r,widgetId:i,path:s,key:o}=n;ko(`Received request to set a dependency path for "${o}" on widget "${i}" in recipe "${r}"`);const a=Us(r,i);if(a){const e={...a};e.dependencies=e.dependencies||{},e.dependencies[o]={path:s},Ds(r,i,e,!0)}return t({success:[]})},Qo=async({args:e,reply:t})=>{const n=e[0],{recipeId:r,widgetId:i,key:s}=n;ko(`Received request to get a dependency path for "${s}" on widget "${i}" in recipe "${r}"`);const o=Us(r,i);if(o){const e=o.dependencies?.[s]?.path;return ko(`Returning dependency path for "${s}" on widget "${i}": "${e}"`),t({success:[e||null]})}return t({error:"Widget not found",errCode:"WIDGET_NOT_FOUND"})},ea=async()=>{if(ko(`Requesting services on ${(new Date).toISOString()}`),!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),{available:[],installed:[],failed:[]};const[e]=await xo.execute(ge.GetServices,[],Ro,Po,0);Oo=e;for(const t of e.available){if(t.internal)continue;const e=Uo(t.name,t.version);if(!e||e?.contentsChecksum!==t.uiContentChecksum)try{const n=e||Do(t.name,t.version);ko(`Service ${t.name} v${t.version} contents have changed, fetching new contents`);const r=await Mo(t.name,t.version);r&&(n.contents=r.uiContent,n.contentsChecksum=t.uiContentChecksum||"")}catch(e){ko(`Failed to update service contents for ${t.name} v${t.version}`,e)}}return e},ta=()=>Oo||{available:[],installed:[],failed:[]},na=()=>!!Oo,ra=async e=>{const{targetServiceSessionId:t}=e;if(!Po)return void ko("No target service session id provided");ko(`Forwarding "onParentEvent" to service ${t}`);return await xo.execute(ge.OnParentEvent,[e],Ro,Po,t,e.config)},ia=async e=>{if(!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),{};const[t]=await xo.execute(ge.GetDefaultState,[],Ro,Po,e);return t},sa=async(e,t,n,r)=>{if(!Po)return ko("Hub Link has not been acknowledged. Cannot get services."),null;const[i]=await xo.execute(ge.UIEvent,[t,n],Ro,Po,e,r);return i},oa=(e,t)=>{const n=()=>{t()};return Ao.on(e,n),()=>Ao.off(e,n)},aa=async e=>{if(Po)return xo.execute(ge.SubscribeToService,[e],Ro,Po,0);ko("Hub Link has not been acknowledged. Cannot subscribe to services.")},ca=async e=>{if(Po)return xo.execute(ge.UnsubscribeFromService,[e],Ro,Po,0);ko("Hub Link has not been acknowledged. Cannot subscribe to services.")},la=(e,t,n,r)=>{const i=Ho("broadcast",t,n,e);return No.on(i,r)},ua=(e,t,n,r)=>{const i=Ho("setOutputs",t,n,e);return No.on(i,r)},da=async(e,t,n)=>Po?xo.execute(e,t,Ro,Po,0,n):(ko("Hub Link has not been acknowledged. Cannot execute function."),null),pa=async e=>{if(!Po)return void ko("Hub Link has not been acknowledged. Cannot execute function.");const t=Us(e.recipeId,e.widgetId);if(!t)throw new Error("Widget or recipe pool not found. Cannot initialize service instance.");const n=Object.keys(t.dependencies||{}).reduce(((e,n)=>(e[n]=t.dependencies?.[n]?.path||null,e)),{}),r=[{currentState:t.customState,recipeId:e.recipeId,widgetId:e.widgetId,variantId:e.variantId,recipeType:e.recipeType,currentDependencies:n}],[i]=await xo.execute(ge.InitializeInstance,r,Ro,Po,e.sessionId);if(i){const t=Us(e.recipeId,e.widgetId);if(t){const n={...t,customState:i};Ds(e.recipeId,e.widgetId,n,!0)}}},ha=async(e,t,n,r)=>{if(!Po)return void ko("Hub Link has not been acknowledged. Cannot execute function.");const i=Us(n,t);if(!i)throw new Error("Widget or recipe pool not found. Cannot initialize service instance.");const s=[{currentState:i.customState,recipeId:n,widgetId:t,variantId:r}];await xo.execute(ge.TerminateInstance,s,Ro,Po,e)},fa=async(e,t,n="^",r)=>{const i=["^","~",">=",">","<=","<","="];if(!i.includes(n))throw new Error(`Invalid compare mode "${n}". Must be one of ${i.join(", ")}`);const s=na(),o=r||!s?await ea():ta();for(const r of o.available)if(r.name===e){if(r.version===t)return r;if(h(r.version,`${n}${t}`))return r}return null};var ga,ma,va,ya,ba,wa,Sa,Ia,_a=async e=>{Io(Go),_o(Wo),To=e,So((({json:e,transmission:t})=>{xo.processMessage("websocket",Ro,t,e)})),xo.registerFunction(ge.SetState,Xo),xo.registerFunction(ge.SetOutputs,Yo),xo.registerFunction(ge.BroadcastEvent,Jo),xo.registerFunction(ge.HubBroadcastEvent,Ko),xo.registerFunction(me.SetDependencyPath,Zo),xo.registerFunction(me.GetDependencyPath,Qo),wo((e=>{((e,t)=>{const n=fe.SocketAcknowledge,r=fe.IpcAcknowledge,i=e.startsWith(n);if(e===r)return t&&t(),0;if(i){const s=e.split(i?n:r),o=parseInt(s[1]);return t&&t(o),o}})(e,qo),((e,t)=>{e===fe.ServicesListChanged&&(t&&t())})(e,(()=>{ko("Services list changed"),Ao.emit("services-changed")}))})),await yo()},$a=(e,t)=>{Ao.on(e,t)},Ca=()=>({getServices:ea,getServiceContents:Fo,onParentEvent:ra,onCommand:oa,getDefaultState:ia,getCachedServices:ta,areServicesCached:na,subscribeToServiceEvents:aa,unsubscribeFromServiceEvents:ca,callProcessorHandler:sa,onBroadcastEvent:la,onSetOutputsEvent:ua,executeHubFunction:da,initializeServiceInstance:pa,terminateServiceInstance:ha,getCompatibleService:fa}),ka=e=>{Lo=e},Ea=()=>xo;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(ga||(ga={})),function(e){e[e.Number=0]="Number",e[e.String=1]="String",e[e.ArrayBuffer=2]="ArrayBuffer",e[e.Array=3]="Array",e[e.Boolean=4]="Boolean",e[e.JsonObj=5]="JsonObj",e[e.Anything=6]="Anything",e[e.ImageData=7]="ImageData",e[e.AudioBuffer=8]="AudioBuffer",e[e.Rect=9]="Rect",e[e.Point=10]="Point",e[e.ImageBitmap=11]="ImageBitmap",e[e.BinaryFile=12]="BinaryFile"}(ma||(ma={})),function(e){e.Number="Number",e.String="String",e.ArrayBuffer="ArrayBuffer",e.Array="Array",e.Boolean="Boolean",e.JsonObj="JsonObj",e.Anything="Anything",e.ImageData="ImageData",e.AudioBuffer="AudioBuffer",e.Rect="Rect",e.Point="Point",e.ImageBitmap="ImageBitmap",e.BinaryFile="BinaryFile"}(va||(va={})),function(e){e.Javascript="js",e.Python="py",e.Executable="exe"}(ya||(ya={})),function(e){e.IpcAcknowledge="iack:",e.SocketAcknowledge="sack:",e.AcknowledgeResponse="ackr:",e.ServicesListChanged="update-services",e.SendManifest="send-manifest",e.BroadcastStart="broadcast-start",e.BroadcastEnd="broadcast-end",e.AssumeSession="assume:"}(ba||(ba={})),function(e){e.GetServices="getServices",e.SubscribeToService="subscribeToService",e.UnsubscribeFromService="unsubscribeFromService",e.GetServiceContents="getServiceContents",e.SocketAckResponse="socketAckResponse",e.ShowSecretsConfigScreen="showSecretsConfigScreen",e.GetMappedSecrets="getMappedSecrets",e.GetSecretContexts="getSecretContexts",e.OnParentEvent="onParentEvent",e.GetDefaultState="getDefaultState",e.BroadcastEvent="broadcastEvent",e.HubBroadcastEvent="hubBroadcastEvent",e.ServiceManifest="serviceManifest",e.GetState="getState",e.SetState="setState",e.SetOutputs="setOutputs",e.UIEvent="uiEvent",e.InitializeInstance="initializeInstance",e.TerminateInstance="terminateInstance",e.ChooseDirectoryDialog="chooseDirectoryDialog",e.ChooseFileDialog="chooseFileDialog",e.GetUniqueId="getUniqueId"}(wa||(wa={})),function(e){e.SetDependencyPath="setDependencyPath",e.GetDependencyPath="getDependencyPath"}(Sa||(Sa={})),function(e){e.IPC="ipc",e.WS="ws"}(Ia||(Ia={}));const xa=e=>{try{return JSON.parse(e)}catch(e){return null}},Aa=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,Na=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(Aa);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},Oa=e=>"*"===e||"x"===e||"X"===e,Pa=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},La=(e,t)=>{if(Oa(e)||Oa(t))return 0;const[n,r]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(Pa(e),Pa(t));return n>r?1:n<r?-1:0},Ta=(e,t)=>{for(let n=0;n<Math.max(e.length,t.length);n++){const r=La(e[n]||"0",t[n]||"0");if(0!==r)return r}return 0},Ba=(e,t,n)=>{Ua(n);const r=((e,t)=>{const n=Na(e),r=Na(t),i=n.pop(),s=r.pop(),o=Ta(n,r);return 0!==o?o:i&&s?Ta(i.split("."),s.split(".")):i||s?i?-1:1:0})(e,t);return ja[n].includes(r)},ja={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]},Da=Object.keys(ja),Ua=e=>{if(-1===Da.indexOf(e))throw new Error(`Invalid operator, expected one of ${Da.join("|")}`)};var Ma="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Fa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ra,Wa,Ga,Va,Ha,za={exports:{}},qa={exports:{}};function Ka(){if(Wa)return Ra;Wa=1;var e=1e3,t=60*e,n=60*t,r=24*n,i=7*r,s=365.25*r;function o(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}return Ra=function(a,c){c=c||{};var l=typeof a;if("string"===l&&a.length>0)return function(o){if((o=String(o)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!a)return;var c=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*s;case"weeks":case"week":case"w":return c*i;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(a);if("number"===l&&isFinite(a))return c.long?function(i){var s=Math.abs(i);if(s>=r)return o(i,s,r,"day");if(s>=n)return o(i,s,n,"hour");if(s>=t)return o(i,s,t,"minute");if(s>=e)return o(i,s,e,"second");return i+" ms"}(a):function(i){var s=Math.abs(i);if(s>=r)return Math.round(i/r)+"d";if(s>=n)return Math.round(i/n)+"h";if(s>=t)return Math.round(i/t)+"m";if(s>=e)return Math.round(i/e)+"s";return i+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}function Ja(){if(Va)return Ga;return Va=1,Ga=function(e){function t(e){let r,i,s,o=null;function a(...e){if(!a.enabled)return;const n=a,i=Number(new Date),s=i-(r||i);n.diff=s,n.prev=r,n.curr=i,r=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,i)=>{if("%%"===r)return"%";o++;const s=t.formatters[i];if("function"==typeof s){const t=e[o];r=s.call(n,t),e.splice(o,1),o--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(i!==t.namespaces&&(i=t.namespaces,s=t.enabled(e)),s),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n<i;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.slice(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=Ka(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t},Ga}var Ya,Xa,Za,Qa,ec,tc={exports:{}};function nc(){return Xa||(Xa=1,Ya=(e,t=process.argv)=>{const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),i=t.indexOf("--");return-1!==r&&(-1===i||r<i)}),Ya}"undefined"==typeof process||"renderer"===process.type||!0===process.browser||process.__nwjs?za.exports=(Ha||(Ha=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=Ja()(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(qa,qa.exports)),qa.exports):za.exports=(ec||(ec=1,function(e,t){const n=k,r=o;t.init=function(e){e.inspectOpts={};const n=Object.keys(t.inspectOpts);for(let r=0;r<n.length;r++)e.inspectOpts[n[r]]=t.inspectOpts[n[r]]},t.log=function(...e){return process.stderr.write(r.formatWithOptions(t.inspectOpts,...e)+"\n")},t.formatArgs=function(n){const{namespace:r,useColors:i}=this;if(i){const t=this.color,i="[3"+(t<8?t:"8;5;"+t),s=` ${i};1m${r} [0m`;n[0]=s+n[0].split("\n").join("\n"+s),n.push(i+"m+"+e.exports.humanize(this.diff)+"[0m")}else n[0]=(t.inspectOpts.hideDate?"":(new Date).toISOString()+" ")+r+" "+n[0]},t.save=function(e){e?process.env.DEBUG=e:delete process.env.DEBUG},t.load=function(){return process.env.DEBUG},t.useColors=function(){return"colors"in t.inspectOpts?Boolean(t.inspectOpts.colors):n.isatty(process.stderr.fd)},t.destroy=r.deprecate((()=>{}),"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),t.colors=[6,2,3,4,5,1];try{const e=function(){if(Qa)return Za;Qa=1;const e=E,t=k,n=nc(),{env:r}=process;let i;function s(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function o(t,s){if(0===i)return 0;if(n("color=16m")||n("color=full")||n("color=truecolor"))return 3;if(n("color=256"))return 2;if(t&&!s&&void 0===i)return 0;const o=i||0;if("dumb"===r.TERM)return o;if("win32"===process.platform){const t=e.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in r)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((e=>e in r))||"codeship"===r.CI_NAME?1:o;if("TEAMCITY_VERSION"in r)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(r.TEAMCITY_VERSION)?1:0;if("truecolor"===r.COLORTERM)return 3;if("TERM_PROGRAM"in r){const e=parseInt((r.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(r.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(r.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(r.TERM)||"COLORTERM"in r?1:o}return n("no-color")||n("no-colors")||n("color=false")||n("color=never")?i=0:(n("color")||n("colors")||n("color=true")||n("color=always"))&&(i=1),"FORCE_COLOR"in r&&(i="true"===r.FORCE_COLOR?1:"false"===r.FORCE_COLOR?0:0===r.FORCE_COLOR.length?1:Math.min(parseInt(r.FORCE_COLOR,10),3)),Za={supportsColor:function(e){return s(o(e,e&&e.isTTY))},stdout:s(o(!0,t.isatty(1))),stderr:s(o(!0,t.isatty(2)))}}();e&&(e.stderr||e).level>=2&&(t.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(e){}t.inspectOpts=Object.keys(process.env).filter((e=>/^debug_/i.test(e))).reduce(((e,t)=>{const n=t.substring(6).toLowerCase().replace(/_([a-z])/g,((e,t)=>t.toUpperCase()));let r=process.env[t];return r=!!/^(yes|on|true|enabled)$/i.test(r)||!/^(no|off|false|disabled)$/i.test(r)&&("null"===r?null:Number(r)),e[n]=r,e}),{}),e.exports=Ja()(t);const{formatters:i}=e.exports;i.o=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts).split("\n").map((e=>e.trim())).join(" ")},i.O=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts)}}(tc,tc.exports)),tc.exports);var rc=Fa(za.exports);const ic=e=>rc(e),sc=Date.now();let oc=Math.ceil(sc/1e3);var ac=()=>oc+=1;const cc=m(x(),"kemu-user-services"),lc=m(x(),"kemu-test-services"),uc="KMU-CB-v1";var dc;!function(e){e.input="input",e.counter="counter",e.play="play",e.elapsed="elapsed",e.ifGate="ifGate",e.skipEvent="skipEvent",e.between="between",e.map="map",e.parser="parser",e.slider="slider",e.suspend="suspend",e.display="display",e.pixelfy="pixelfy",e.json="json",e.arrayItem="arrayItem",e.extractImage="extractImage",e.imageConvolution="imageConvolution",e.firstEvent="firstEvent",e.pixelDraw="pixelDraw",e.randomBetween="randomBetween",e.arrayCombine="arrayCombine",e.clock="clock",e.multiplication="multiplication",e.object="object",e.widgetGroup="widgetGroup",e.script="script",e.base64ToImageData="base64ToImageData",e.jsonParse="jsonParse",e.text="text",e.imageCrop="imageCrop",e.imageResize="imageResize",e.value="value",e.imageWarp="imageWarp",e.widgetBundle="widgetBundle",e.sequence="sequence",e.variable="variable",e.hubService="hubService"}(dc||(dc={}));const pc=e=>({...e,type:Array.isArray(e.type)?e.type.map((e=>ma[e])):ma[e.type]}),hc=async e=>{try{return await w(e,"utf-8")}catch(e){return null}},fc=e=>{if(e&&e.startsWith(uc)){const t=e.slice(9),n=decodeURI(t);return xa(n)}return null},gc=async(e,t,n)=>{let r=[];e.variants?.length&&(r=e.variants.map((e=>({...e,...e.inputs?{inputs:e.inputs.map(pc)}:{},...e.outputs?{outputs:e.outputs.map(pc)}:{}}))));const i={...e,path:t,customWidgets:[],...e.inputs?{inputs:e.inputs.map(pc)}:{inputs:[]},...e.outputs?{outputs:e.outputs.map(pc)}:{outputs:[]},variants:r,...e.widgetUI&&n?.widgetUIContents?{widgetUIContents:n.widgetUIContents}:{}},s=await(async(e,t,n=console.log)=>{const r=[];if(t.customWidgets?.length)for(const i of t.customWidgets){const t=await hc(m(e,i));if(!t){n(`Error loading custom widget file ${i}`);continue}const s=t.startsWith(uc)?t:`${uc}${t}`,o=fc(s);if(!o){n(`Custom widget file "${i}" is not a valid Kemu Clipboard item`);continue}const a=Object.values(o).filter((e=>e.type===dc.widgetGroup&&!e.groupId));if(a.length>1){n(`Custom widget file "${i}" contains more than one top level widgetGroup`);continue}const c=a[0];if(!c){n(`Custom widget file "${i}" does not contain a top level widgetGroup`);continue}const l=c.state,u={name:l.name,color:l.color,description:l.description,contents:s,rootGroupId:c.id,icon:l.icon,protocolVersion:l.protocolVersion||"2"};r.push(u)}return r})(t,e,n?.log);if(s.length?i.customWidgets=s:delete i.customWidgets,i.variants?.length)for(const e of i.variants)if(e.svgIcon)try{const n=await w(m(t,e.svgIcon),"utf-8");e.svgIcon=n}catch(t){n?.log&&n?.log(`Error loading svgIcon for variant ${e.id}: ${t}`)}return i},mc=async e=>{try{return await S(e,I.F_OK),!0}catch{return!1}};let vc=null,yc=null;const bc=()=>vc||cc,wc=ic("servicesManager"),Sc={};let Ic=null,_c=null,$c=null;class Cc extends Error{code;originalError;constructor(e,t,n){super(e),this.code=t,this.originalError=n,this.name="ServiceError"}}const kc=async e=>{try{return await S(e),!0}catch{return!1}},Ec=async e=>{if(!Ic)throw new Error('IPC config not set, call "setHubIpcConfig" first.');try{if(e.processor===ya.Javascript){wc(`Spawning service ${e.name} with sessionId ${e.sessionId}`);const t=g.join(e.path,"processor.js"),n=g.join(e.path,"processor.mjs"),r=await kc(t)?t:n,i=[`--sessionId=${e.sessionId.toString()}`,`--ipcSpace=${Ic.appSpace}`,`--ipcId=${Ic?.id}`,`--recipePath=${Ic.recipePath||""}`];if(e.internal&&i.push("--internal=true"),!$c)throw new Error('Get secrets function not set, call "setGetSecretsFunction" first.');const s=await $c({name:e.name,version:e.version,requiredSecrets:e.requiredSecrets||{}}),o=Object.entries(e.requiredSecrets||{}).filter((([e,t])=>{const n=s[e];return null==n&&!t.optional})).map((([e])=>e));if(o?.length)throw new Cc(`Missing required environment variables: ${o.join(", ")}`,"MISSING_REQUIRED_SECRETS");return new Promise(((t,n)=>{if(!_c)throw new Error('Spawn function not set, call "setSpawnNodeFunction" first.');const o=_c({args:[r,...i],serviceInfo:{name:e.name,version:e.version},options:{env:s}});o.stdout.on("data",(t=>{wc(`[${e.name}] - stdout: ${t}`)})),o.stderr.on("data",(t=>{wc(`[${e.name}] - stderr: ${t}`)})),o.on("exit",(t=>{wc(`[${e.name}] exited with code ${t}`)})),o.on("spawn",(()=>{wc(`[${e.name}] spawned with PID ${o.pid}`),t(o)})),o.on("error",(t=>{wc(`[${e.name}] error: ${t}`),n(new Cc(`Error spawning service ${e.name}: ${t}`,"SPAWN_ERROR"))}))}))}throw`Unsupported processor type ${e.processor}`}catch(t){if(t instanceof Cc)throw t;throw`Error spawning service ${e.name}: ${t}`}},xc=e=>{if(!e?.name)return"Missing name";if(!e?.version)return"Missing version";if(!e?.description)return"Missing description";if(!e?.processor)return"Missing processor";return[ya.Javascript,ya.Executable,ya.Python].includes(e?.processor)?null:"Invalid processor"},Ac=async(e,t)=>{const n=g.join(e,"manifest.json");if(!await kc(n)){const t=`Missing manifest for service ${e}. Aborting.`;return wc(t),{error:t}}const r=await w(n,"utf-8"),i=xa(r),s=xc(i);if(!i||s){const t=`Invalid service manifest [${e}]: ${s}. Aborting.`;return wc(t),{error:t}}let o;if(delete i.internal,t?.singleServiceName&&i.name!==t.singleServiceName){return{error:`Skipping service ${i.name} as it does not match the singleServiceName option`}}await Promise.all([(async()=>{if(i.widgetUI)try{o=await w(g.join(e,"widgetUI.js"))}catch(e){const t=`Error loading widgetUI file ${i.name}: ${e}`;return wc(t),{error:t}}})(),(async()=>{if(i.svgIcon){const t=await hc(g.join(e,i.svgIcon));if(!t){return{error:`Error loading icon for service ${i.name}`}}i.svgIcon=t}})(),(async()=>{if(i.subServices?.length)for(const t of i.subServices){const n=g.join(e,t),{error:r,service:s}=await Ac(n);r?wc(`Error loading sub-service ${t}: ${r}`):s&&(s.info.parentService={name:i.name,version:i.version})}delete i.subServices})(),(async()=>{if(i.variants?.length)for(const t of i.variants)if(t.svgIcon)try{const n=await w(g.join(e,t.svgIcon),"utf-8");t.svgIcon=n}catch(e){wc(`Error loading svgIcon for variant ${t.id}: ${e}`)}})()]);const a=ac(),c=t?.fixedSession||a;wc(`Loaded service ${i.name} with sessionId ${c}`);const l=await gc(i,e,{widgetUIContents:o});return Nc(l),Sc[c]={info:{...l,path:e,sessionId:c},status:"loaded",childProcess:null},{service:Sc[c]}},Nc=e=>{e.widgetUIContents?e.uiContentChecksum=(e=>{const t=p("sha256");return t.update(e),t.digest("hex")})(e.widgetUIContents):e.uiContentChecksum=void 0},Oc=async e=>{try{return e.childProcess=await Ec(e.info),e.status="started",e.errorMsg=void 0,e.errorCode=void 0,!0}catch(t){return wc(`Service [${e.info.name}] error: ${t}`),e.status="error",t instanceof Cc?(e.errorMsg=t.message,e.errorCode=t.code):(e.errorMsg="string"==typeof t?t:JSON.stringify(t),e.errorCode="UNKNOWN_ERROR"),!1}},Pc=e=>{const{path:t,...n}=e.info;return{...n}},Lc=()=>Object.values(Sc).filter((e=>"running"===e.status)).map(Pc),Tc=e=>{const{serviceName:t,version:n,force:r}=e,i=Object.values(Sc).find((t=>t.info.name===e.serviceName&&t.info.version===e.version));if(!i)return null;if(i.info.internal&&!r)throw`Cannot stop internal service ${t}`;if(i.childProcess){wc(`Stopping service "${t} (v${n})"`);i.childProcess.kill("SIGINT")||wc(`Failed to stop service ${t}`)}return i.status="stopped",wc(`Service ${t} stopped`),i},Bc=e=>e.info.internal?e.info.path:g.join(e.info.path,".."),jc=e=>!!e.internal;var Dc={isOfficialKemuService:e=>e.name.startsWith("kemu.io"),loadServices:async(e,t)=>{if(!await mc(e))return void wc(`Failed to load services from "${e}". Directory does not exist.`);const n=(await _(e,{withFileTypes:!0})).filter((e=>e.isDirectory())).map((e=>e.name));wc(`Found ${n.length} services in "${e}"`);for(let r=0;r<n.length;r++){const i=n[r],s=g.join(e,i),{error:o,service:a}=await Ac(`${s}${t?.internalServices?"":"/dist"}`,t);o&&wc(`Failed to load service ${s}. Please check logs`),a&&t?.internalServices&&(a.info.internal=!0)}},launchServices:async e=>{if(wc("Initializing services"),!Ic)throw new Error('IPC config not set, call "setHubIpcConfig" first.');for(const t in Sc){const n=Sc[t];e.noSpawningList&&e.noSpawningList.includes(n.info.name)?wc(`Service ${n.info.name} is in the noSpawningList. Skipping.`):Oc(n)}wc("Services initialized")},setServiceStatus:(e,t)=>{const n=Sc[e];return n?(n.status=t,!0):(wc(`Service with serviceId ${e} not found`),!1)},getActiveServices:Lc,getMatchingService:(e,t)=>{const n=Object.values(Sc).filter((e=>"running"===e.status));for(const r of n)if(r.info.name===e){if(r.info.version===t)return r;if(Ba(r.info.version,t,">="))return r}return null},getServiceBySessionId:e=>Sc[e]||null,killAllServices:()=>{for(const e in Sc){const t=Sc[e];if(t.childProcess)try{wc(`Killing service ${t.info.name} with PID ${t.childProcess.pid}`),t.childProcess.kill()}catch(e){wc(`Error killing service ${t.info.name}: ${e}`)}}},addDevService:async(e,t,n)=>{const r={info:{...await gc(t,t.path),sessionId:e},status:n,startedAt:new Date,devMode:!0,childProcess:null};Sc[e]=r,Nc(Sc[e].info)},setServiceManifest:(e,t,n)=>{const r=Sc[e];if(!r)return wc(`Service with sessionId ${e} not found`),!1;const i=xc(t);if(i)return wc(`Invalid manifest for service ${r.info.name}: ${i}`),!1;Nc(t),r.info={...r.info,...t},n&&(r.status=n)},getMatchingDevService:(e,t,n)=>{const r=Object.values(Sc).filter((e=>e.devMode));for(const i of r)if(i.info.name===e&&i.status===n&&i.info.version===t)return i;return null},getInternalServices:()=>Lc().filter((e=>e.internal)),getAllServices:()=>Object.values(Sc),stopService:Tc,uninstallService:async(e,t)=>{wc(`Uninstalling service ${e} v${t}`);const n=Tc({serviceName:e,version:t});if(!n)return!1;wc(`Service ${e} stopped. Removing from disk...`);const r=Bc(n),i=bc();return r.startsWith(i)?(await $(r,{recursive:!0,force:!0}),wc(`Service ${e} successfully removed from disk`),(e=>{const t=Sc[e];delete Sc[e]})(n.info.sessionId),!0):(wc(`Service ${e} is not installed in the user services directory. Aborting.`),!1)},getAllServiceVersions:e=>Object.values(Sc).filter((t=>t.info.name===e)),setHubIpcConfig:e=>{Ic={...e}},loadAndLaunch:async(e,t,n)=>{const r=y(e,t),{error:i,service:s}=await Ac(r);if(i||!s)return{errorMsg:i};try{s.info.internal=!!n,s.childProcess=await Ec(s.info),s.status="started"}catch(e){s.status="error",e instanceof Cc?(wc(`Service spawning error: ${e.message} (${e.code})`),s.errorMsg=e.message,s.errorCode=e.code):(wc(`Error launching service ${s.info.name}: ${e}`),s.errorMsg="string"==typeof e?e:JSON.stringify(e))}return{service:s,errorCode:s.errorCode,errorMsg:s.errorMsg}},getServiceRootDirectory:Bc,setSpawnNodeFunction:e=>{_c=e},setGetSecretsFunction:e=>{$c=e},restartService:async(e,t)=>{wc(`Restarting service ${e} v${t}`);const n=Tc({serviceName:e,version:t,force:!0});return!!n&&Oc(n)},getFailedServices:()=>Object.values(Sc).filter((e=>"error"===e.status)).map((e=>({...Pc(e),errorMsg:e.errorMsg||"",errorCode:e.errorCode,status:e.status}))),isInternalKemuService:jc,isNotInternalKemuService:e=>!jc(e),isNotDevService:e=>!e.devMode};class Uc{constructor(){}appspace="app.";socketRoot="/tmp/";id=E.hostname();encoding="utf8";rawBuffer=!1;sync=!1;unlink=!0;delimiter="\f";silent=!1;logDepth=5;logInColor=!0;logger=console.log.bind(console);maxConnections=100;retry=500;maxRetries=1/0;stopRetrying=!1;IPType=function(){const e=E.networkInterfaces();let t="";e&&Array.isArray(e)&&e.length>0&&(t=e[Object.keys(e)[0]][0].family);return t}();tls=!1;networkHost="IPv6"==this.IPType?"::1":"127.0.0.1";networkPort=8e3;readableAll=!1;writableAll=!1;interface={localAddress:!1,localPort:!1,family:!1,hints:!1,lookup:!1}}class Mc{constructor(e){e||(e=new Uc),this.delimiter=e.delimiter}format(e){return e.data||!1===e.data||0===e.data||(e.data={}),e.data._maxListeners&&(e.data={}),e=e.JSON+this.delimiter}parse(e){let t=e.split(this.delimiter);return t.pop(),t}}var Fc=function(){Object.defineProperties(this,{data:{enumerable:!0,get:function(){return t},set:function(e){t=e}},type:{enumerable:!0,get:function(){return e},set:function(t){e=t}},load:{enumerable:!0,writable:!1,value:function(n){try{n=JSON.parse(n);e=n.type,t=n.data}catch(r){e="error",t={message:"Invalid JSON response format",err:r,response:n}}}},JSON:{enumerable:!0,get:function(){return JSON.stringify({type:e,data:t})}}});var e="",t={}},Rc=Fa(Fc);var Wc=Fa((function(){Object.defineProperties(this,{add:{enumerable:!0,writable:!1,value:function(){for(var n in arguments)e.push(arguments[n]);t||this.stop||!this.autoRun||this.next()}},next:{enumerable:!0,writable:!1,value:function(){if(t=!0,e.length<1||this.stop)return void(t=!1);e.shift().bind(this)()}},clear:{enumerable:!0,writable:!1,value:function(){return e=[]}},contents:{enumerable:!1,get:function(){return e},set:function(t){return e=t}},autoRun:{enumerable:!0,writable:!0,value:!0},stop:{enumerable:!0,writable:!0,value:!1}});var e=[],t=!1}));class Gc{}class Vc{}const Hc=new class{constructor(e=!0){this.strict=e}throw(e,t){let n=new TypeError;if(n.message=`expected type of ${e} to be ${t}`,!this.strict)return!1;throw n}typeCheck(e,t){return typeof e===t||this.throw(typeof e,t)}instanceCheck(e=new Gc,t=Vc){return e instanceof t||this.throw(typeof e,t.name)}symbolStringCheck(e,t){return Object.prototype.toString.call(e)==`[object ${t}]`||this.throw(Object.prototype.toString.call(e),`[object ${t}]`)}compare(e,t,n){return e==t||this.throw(typeof e,n)}finite(e){return!!isFinite(e)||this.throw(typeof e,"finite")}NaN(e){return this.number(e)?!!isNaN(e)||this.throw(typeof e,"NaN"):this.number(e)}null(e){return this.compare(e,null,"null")}array(e){return this.instanceCheck(e,Array)}boolean(e){return this.typeCheck(e,"boolean")}bigint(e){return this.typeCheck(e,"bigint")}date(e){return this.instanceCheck(e,Date)}generator(e){return this.symbolStringCheck(e,"Generator")}asyncGenerator(e){return this.symbolStringCheck(e,"AsyncGenerator")}globalThis(e){return this.compare(e,globalThis,"explicitly globalThis, not window, global nor self")}infinity(e){return this.compare(e,1/0,"Infinity")}map(e){return this.instanceCheck(e,Map)}weakMap(e){return this.instanceCheck(e,WeakMap)}number(e){return this.typeCheck(e,"number")}object(e){return this.typeCheck(e,"object")}promise(e){return this.instanceCheck(e,Promise)}regExp(e){return this.instanceCheck(e,RegExp)}undefined(e){return this.typeCheck(e,"undefined")}set(e){return this.instanceCheck(e,Set)}weakSet(e){return this.instanceCheck(e,WeakSet)}string(e){return this.typeCheck(e,"string")}symbol(e){return this.typeCheck(e,"symbol")}function(e){return this.typeCheck(e,"function")}asyncFunction(e){return this.symbolStringCheck(e,"AsyncFunction")}generatorFunction(e){return this.symbolStringCheck(e,"GeneratorFunction")}asyncGeneratorFunction(e){return this.symbolStringCheck(e,"AsyncGeneratorFunction")}error(e){return this.instanceCheck(e,Error)}evalError(e){return this.instanceCheck(e,EvalError)}rangeError(e){return this.instanceCheck(e,RangeError)}referenceError(e){return this.instanceCheck(e,ReferenceError)}syntaxError(e){return this.instanceCheck(e,SyntaxError)}typeError(e){return this.instanceCheck(e,TypeError)}URIError(e){return this.instanceCheck(e,URIError)}bigInt64Array(e){return this.instanceCheck(e,BigInt64Array)}bigUint64Array(e){return this.instanceCheck(e,BigUint64Array)}float32Array(e){return this.instanceCheck(e,Float32Array)}float64Array(e){return this.instanceCheck(e,Float64Array)}int8Array(e){return this.instanceCheck(e,Int8Array)}int16Array(e){return this.instanceCheck(e,Int16Array)}int32Array(e){return this.instanceCheck(e,Int32Array)}uint8Array(e){return this.instanceCheck(e,Uint8Array)}uint8ClampedArray(e){return this.instanceCheck(e,Uint8ClampedArray)}uint16Array(e){return this.instanceCheck(e,Uint16Array)}uint32Array(e){return this.instanceCheck(e,Uint32Array)}arrayBuffer(e){return this.instanceCheck(e,ArrayBuffer)}dataView(e){return this.instanceCheck(e,DataView)}sharedArrayBuffer(e){return this.instanceCheck(e,function(){try{return SharedArrayBuffer}catch{return Gc}}())}intlDateTimeFormat(e){return this.instanceCheck(e,Intl.DateTimeFormat)}intlCollator(e){return this.instanceCheck(e,Intl.Collator)}intlDisplayNames(e){return this.instanceCheck(e,Intl.DisplayNames)}intlListFormat(e){return this.instanceCheck(e,Intl.ListFormat)}intlLocale(e){return this.instanceCheck(e,Intl.Locale)}intlNumberFormat(e){return this.instanceCheck(e,Intl.NumberFormat)}intlPluralRules(e){return this.instanceCheck(e,Intl.PluralRules)}intlRelativeTimeFormat(e){return this.instanceCheck(e,Intl.RelativeTimeFormat)}intlRelativeTimeFormat(e){return this.instanceCheck(e,Intl.RelativeTimeFormat)}finalizationRegistry(e){return this.instanceCheck(e,FinalizationRegistry)}weakRef(e){return this.instanceCheck(e,WeakRef)}};class zc{constructor(){}on(e,t,n=!1){return Hc.string(e),Hc.function(t),Hc.boolean(n),"*"==e&&(e=this.#e),this.#t[e]||(this.#t[e]=[]),t[this.#n]=n,this.#t[e].push(t),this}once(e,t){return this.on(e,t,!0)}off(e="*",t="*"){if(Hc.string(e),e!=this.#e.toString()&&"*"!=e||(e=this.#e),!this.#t[e])return this;if("*"==t)return delete this.#t[e],this;Hc.function(t);const n=this.#t[e];for(;n.includes(t);)n.splice(n.indexOf(t),1);return n.length<1&&delete this.#t[e],this}emit(e,...t){Hc.string(e);const n=this.#t[this.#e]||[];if(this.#r(this.#e.toString(),n,e,...t),!this.#t[e])return this;const r=this.#t[e];return this.#r(e,r,...t),this}reset(){this.off(this.#e.toString());for(let e in this.#t)this.off(e);return this}get list(){return Object.assign({},this.#t)}#r=(e,t,...n)=>{Hc.string(e),Hc.array(t);const r=[];for(let e of t)e(...n),e[this.#n]&&r.push(e);for(let t of r)this.off(e,t)};#e=Symbol.for("event-pubsub-all");#n=Symbol.for("event-pubsub-once");#t={}}let qc=new Mc;class Kc extends zc{constructor(e,t){super(),this.config=e,this.log=t,this.publish=super.emit,e.maxRetries&&(this.retriesRemaining=e.maxRetries),qc=new Mc(this.config)}Client=Kc;queue=new Wc;socket=!1;connect=Xc;emit=Jc;retriesRemaining=0;explicitlyDisconnected=!1}function Jc(e,t){this.log("dispatching event to ",this.id,this.path," : ",e,",",t);let n=new Rc;n.type=e,n.data=t,n=this.config.rawBuffer?Buffer.from(e,this.config.encoding):qc.format(n),this.config.sync?this.queue.add(Yc.bind(this,n)):this.socket.write(n)}function Yc(e){this.log("dispatching event to ",this.id,this.path," : ",e),this.socket.write(e)}function Xc(){let e=this;if(e.log("requested connection to ",e.id,e.path),!this.path)return void e.log("\n\n######\nerror: ",e.id," client has not specified socket path it wishes to connect to.");const t={};if(e.port)if(t.host=e.path,t.port=e.port,e.config.interface.localAddress&&(t.localAddress=e.config.interface.localAddress),e.config.interface.localPort&&(t.localPort=e.config.interface.localPort),e.config.interface.family&&(t.family=e.config.interface.family),e.config.interface.hints&&(t.hints=e.config.interface.hints),e.config.interface.lookup&&(t.lookup=e.config.interface.lookup),e.config.tls){if(e.log("Connecting client via TLS to",e.path,e.port,e.config.tls),e.config.tls.private&&(e.config.tls.key=O.readFileSync(e.config.tls.private)),e.config.tls.public&&(e.config.tls.cert=O.readFileSync(e.config.tls.public)),e.config.tls.trustedConnections){"string"==typeof e.config.tls.trustedConnections&&(e.config.tls.trustedConnections=[e.config.tls.trustedConnections]),e.config.tls.ca=[];for(let t=0;t<e.config.tls.trustedConnections.length;t++)e.config.tls.ca.push(O.readFileSync(e.config.tls.trustedConnections[t]))}Object.assign(e.config.tls,t),e.socket=N.connect(e.config.tls)}else e.log("Connecting client via TCP to",t),e.socket=A.connect(t);else e.log("Connecting client on Unix Socket :",e.path),t.path=e.path,"win32"!==process.platform||e.path.startsWith("\\\\.\\pipe\\")||(t.path=t.path.replace(/^\//,""),t.path=t.path.replace(/\//g,"-"),t.path=`\\\\.\\pipe\\${t.path}`),e.socket=A.connect(t);e.socket.setEncoding(this.config.encoding),e.socket.on("error",(function(t){e.log("\n\n######\nerror: ",t),e.publish("error",t)})),e.socket.on("connect",(function(){e.publish("connect"),e.retriesRemaining=e.config.maxRetries,e.log("retrying reset")})),e.socket.on("close",(function(){if(e.log("connection closed",e.id,e.path,e.retriesRemaining,"tries remaining of",e.config.maxRetries),e.config.stopRetrying||e.retriesRemaining<1||e.explicitlyDisconnected)return e.publish("disconnect"),e.log(e.config.id,"exceeded connection rety amount of"," or stopRetrying flag set."),e.socket.destroy(),e.publish("destroy"),void(e=void 0);setTimeout(function(){e.explicitlyDisconnected||(e.retriesRemaining--,e.connect())}.bind(null,e),e.config.retry),e.publish("disconnect")})),e.socket.on("data",(function(t){if(e.log("## received events ##"),e.config.rawBuffer){if(e.publish("data",Buffer.from(t,e.config.encoding)),!e.config.sync)return;return void e.queue.next()}if(this.ipcBuffer||(this.ipcBuffer=""),(t=this.ipcBuffer+=t).slice(-1)!=qc.delimiter||-1==t.indexOf(qc.delimiter))return void e.log("Messages are large, You may want to consider smaller messages.");this.ipcBuffer="";const n=qc.parse(t),r=n.length;for(let t=0;t<r;t++){let r=new Rc;r.load(n[t]),e.log("detected event",r.type,r.data),e.publish(r.type,r.data)}e.config.sync&&e.queue.next()}))}let Zc=new Mc;class Qc extends zc{constructor(e,t,n,r){super(),this.config=t,this.path=e,this.port=r,this.log=n,this.publish=super.emit,Zc=new Mc(this.config),this.on("close",nl.bind(this))}udp4=!1;udp6=!1;server=!1;sockets=[];emit=el;broadcast=tl;onStart(e){this.publish("start",e)}stop(){this.server.close()}start(){this.path?this.config.unlink?O.unlink(this.path,ol.bind(this)):ol.bind(this)():this.log("Socket Server Path not specified, refusing to start")}}function el(e,t,n){this.log("dispatching event to socket"," : ",t,n);let r=new Rc;if(r.type=t,r.data=n,this.config.rawBuffer?(this.log(this.config.encoding),r=Buffer.from(t,this.config.encoding)):r=Zc.format(r),this.udp4||this.udp6)return e.address&&e.port?void this.server.write(r,e):(this.log("Attempting to emit to a single UDP socket without supplying socket address or port. Redispatching event as broadcast to all connected sockets"),void this.broadcast(t,n));e.write(r)}function tl(e,t){this.log("broadcasting event to all known sockets listening to ",this.path," : ",this.port?this.port:"",e,t);let n=new Rc;if(n.type=e,n.data=t,n=this.config.rawBuffer?Buffer.from(e,this.config.encoding):Zc.format(n),this.udp4||this.udp6)for(let e=1,t=this.sockets.length;e<t;e++)this.server.write(n,this.sockets[e]);else for(let e=0,t=this.sockets.length;e<t;e++)this.sockets[e].write(n)}function nl(){for(let e=0,t=this.sockets.length;e<t;e++){let t=this.sockets[e],n=!1;if(!t||!t.readable)return t.id&&(n=t.id),this.log("socket disconnected",n.toString()),t&&t.destroy&&t.destroy(),this.sockets.splice(e,1),void this.publish("socket.disconnected",t,n)}}function rl(e,t,n){let r=this.udp4||this.udp6?n:e;if(this.config.rawBuffer)return t=Buffer.from(t,this.config.encoding),void this.publish("data",t,r);if(r.ipcBuffer||(r.ipcBuffer=""),(t=r.ipcBuffer+=t).slice(-1)==Zc.delimiter&&-1!=t.indexOf(Zc.delimiter))for(r.ipcBuffer="",t=Zc.parse(t);t.length>0;){let e=new Rc;e.load(t.shift()),e.data&&e.data.id&&(r.id=e.data.id),this.log("received event of : ",e.type,e.data),this.publish(e.type,e.data,r)}else this.log("Messages are large, You may want to consider smaller messages.")}function il(e){this.publish("close",e)}function sl(e){this.sockets.push(e),e.setEncoding&&e.setEncoding(this.config.encoding),this.log("## socket connection to server detected ##"),e.on("close",il.bind(this)),e.on("error",function(e){this.log("server socket error",e),this.publish("error",e)}.bind(this)),e.on("data",rl.bind(this,e)),e.on("message",function(t,n){if(!n)return;let r;this.log("Received UDP message from ",n.address,n.port),r=this.config.rawSocket?Buffer.from(t,this.config.encoding):t.toString(),e.emit("data",r,n)}.bind(this)),this.publish("connect",e),this.config.rawBuffer}function ol(){return this.log("starting server on ",this.path,this.port?`:${this.port}`:""),this.udp4||this.udp6?(this.server=L.createSocket(this.udp4?"udp4":"udp6"),this.server.write=cl.bind(this),this.server.on("listening",function(){sl.bind(this)(this.server)}.bind(this))):(this.log("starting TLS server",this.config.tls),this.config.tls?al.bind(this)():this.server=A.createServer(sl.bind(this))),this.server.on("error",function(e){this.log("server error",e),this.publish("error",e)}.bind(this)),this.server.maxConnections=this.config.maxConnections,this.port?this.udp4||this.udp6?(this.log("starting server as",this.udp4?"udp4":"udp6"),this.server.bind(this.port,this.path),void this.onStart({address:this.path,port:this.port})):(this.log("starting server as",this.config.tls?"TLS":"TCP"),void this.server.listen(this.port,this.path,this.onStart.bind(this))):(this.log("starting server as","Unix || Windows Socket"),"win32"===process.platform&&(this.path=this.path.replace(/^\//,""),this.path=this.path.replace(/\//g,"-"),this.path=`\\\\.\\pipe\\${this.path}`),void this.server.listen({path:this.path,readableAll:this.config.readableAll,writableAll:this.config.writableAll},this.onStart.bind(this)))}function al(){if(this.log("starting TLS server",this.config.tls),this.config.tls.private?this.config.tls.key=O.readFileSync(this.config.tls.private):this.config.tls.key=O.readFileSync(`${__dirname}/../local-node-ipc-certs/private/server.key`),this.config.tls.public?this.config.tls.cert=O.readFileSync(this.config.tls.public):this.config.tls.cert=O.readFileSync(`${__dirname}/../local-node-ipc-certs/server.pub`),this.config.tls.dhparam&&(this.config.tls.dhparam=O.readFileSync(this.config.tls.dhparam)),this.config.tls.trustedConnections){"string"==typeof this.config.tls.trustedConnections&&(this.config.tls.trustedConnections=[this.config.tls.trustedConnections]),this.config.tls.ca=[];for(let e=0;e<this.config.tls.trustedConnections.length;e++)this.config.tls.ca.push(O.readFileSync(this.config.tls.trustedConnections[e]))}this.server=N.createServer(this.config.tls,sl.bind(this))}function cl(e,t){let n=Buffer.from(e,this.config.encoding);this.server.send(n,0,n.length,t.port,t.address,(function(e){e&&(this.log("error writing data to socket",e),this.publish("error",(function(e){this.publish("error",e)})))}))}class ll{constructor(){}config=new Uc;of={};server=!1;get connectTo(){return gl}get connectToNet(){return ml}get disconnect(){return dl}get serve(){return pl}get serveNet(){return fl}get log(){return ul}set connectTo(e){return gl}set connectToNet(e){return ml}set disconnect(e){return dl}set serve(e){return pl}set serveNet(e){return fl}set log(e){return ul}}function ul(...e){if(!this.config.silent){for(let t=0,n=e.length;t<n;t++)"object"==typeof e[t]&&(e[t]=o.inspect(e[t],{depth:this.config.logDepth,colors:this.config.logInColor}));this.config.logger(e.join(" "))}}function dl(e){this.of[e]&&(this.of[e].explicitlyDisconnected=!0,this.of[e].off("*","*"),this.of[e].socket&&this.of[e].socket.destroy&&this.of[e].socket.destroy(),delete this.of[e])}function pl(e,t){"function"==typeof e&&(t=e,e=!1),e||(this.log("Server path not specified, so defaulting to","ipc.config.socketRoot + ipc.config.appspace + ipc.config.id",this.config.socketRoot+this.config.appspace+this.config.id),e=this.config.socketRoot+this.config.appspace+this.config.id),t||(t=hl),this.server=new Qc(e,this.config,ul),this.server.on("start",t)}function hl(){}function fl(e,t,n,r){"number"==typeof e&&(r=n,n=t,t=e,e=!1),"function"==typeof e&&(r=e,n=!1,e=!1,t=!1),e||(this.log("Server host not specified, so defaulting to","ipc.config.networkHost",this.config.networkHost),e=this.config.networkHost),"udp4"!=e.toLowerCase()&&"udp6"!=e.toLowerCase()||(r=t,n=e.toLowerCase(),t=!1,e=this.config.networkHost),"string"==typeof t&&(r=n,n=t,t=!1),"function"==typeof t&&(r=t,n=!1,t=!1),t||(this.log("Server port not specified, so defaulting to","ipc.config.networkPort",this.config.networkPort),t=this.config.networkPort),"function"==typeof n&&(r=n,n=!1),r||(r=hl),this.server=new Qc(e,this.config,ul,t),n&&(this.server[n]=!0,"udp4"===n&&"::1"===e&&(this.server.path="127.0.0.1")),this.server.on("start",r)}function gl(e,t,n){if("function"==typeof t&&(n=t,t=!1),n||(n=hl),e){if(t||(this.log("Service path not specified, so defaulting to","ipc.config.socketRoot + ipc.config.appspace + id",(this.config.socketRoot+this.config.appspace+e).data),t=this.config.socketRoot+this.config.appspace+e),this.of[e]){if(!this.of[e].socket.destroyed)return this.log("Already Connected to",e,"- So executing success without connection"),void n();this.of[e].socket.destroy()}this.of[e]=new Kc(this.config,this.log),this.of[e].id=e,this.of[e].socket&&(this.of[e].socket.id=e),this.of[e].path=t,this.of[e].connect(),n(this)}else this.log("Service id required","Requested service connection without specifying service id. Aborting connection attempt")}function ml(e,t,n,r){if(e){if("number"==typeof t&&(r=n,n=t,t=!1),"function"==typeof t&&(r=t,t=!1,n=!1),t||(this.log("Server host not specified, so defaulting to","ipc.config.networkHost",this.config.networkHost),t=this.config.networkHost),"function"==typeof n&&(r=n,n=!1),n||(this.log("Server port not specified, so defaulting to","ipc.config.networkPort",this.config.networkPort),n=this.config.networkPort),"string"==typeof r&&(UDPType=r,r=!1),r||(r=hl),this.of[e]){if(!this.of[e].socket.destroyed)return this.log("Already Connected to",e,"- So executing success without connection"),void r();this.of[e].socket.destroy()}this.of[e]=new Kc(this.config,this.log),this.of[e].id=e,this.of[e].socket&&(this.of[e].socket.id=e),this.of[e].path=t,this.of[e].port=n,this.of[e].connect(),r(this)}else this.log("Service id required","Requested service connection without specifying service id. Aborting connection attempt")}const vl=new class extends ll{constructor(){super()}IPC=ll};var yl={id:"widgets",retry:1500,silent:!0,rawBuffer:!0,appspace:"kemu.",encoding:"hex"};const bl=Object.values({protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8}).reduce(((e,t)=>e+t),0),wl=e=>{try{return JSON.parse(e)}catch(e){return null}},Sl="undefined"!=typeof window,Il={protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8},_l={protocolPrefix:4,txtLength:4},$l=Object.values(Il).reduce(((e,t)=>e+t),0),Cl=Object.values(_l).reduce(((e,t)=>e+t),0),kl=["width","height","colorSpace"],El=(e,t)=>{const n={},r=[];let i=0,s=Array.isArray(e)?[]:{};const o=(e,s)=>{const a=(e=>{const t="undefined"!=typeof Buffer&&e instanceof Buffer,n=e instanceof ArrayBuffer,r=e instanceof Uint8ClampedArray,i=e instanceof Uint8Array,s=e instanceof Int8Array;return t?"Buffer":n?"ArrayBuffer":r?"Uint8ClampedArray":i?"Uint8Array":s?"Int8Array":null})(e);if(!a){if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++)t[n]=o(e[n],`${s}[${n}]`);return t}if("object"==typeof e){const t={},n=(e=>{const t=e instanceof Int16Array,n=e instanceof Uint16Array,r=e instanceof Int32Array,i=e instanceof Uint32Array,s=e instanceof Float32Array,o=e instanceof Float64Array,a=e instanceof BigInt64Array,c=e instanceof BigUint64Array;return t?"Int16Array":n?"Uint16Array":r?"Int32Array":i?"Uint32Array":s?"Float32Array":o?"Float64Array":a?"BigInt64Array":c?"BigUint64Array":null})(e);if(n)throw new Error(`Unsupported binary type [${n}] at path "${s}"`);for(const n in e)e.hasOwnProperty(n)||kl.includes(n)||console.warn(`Allowing inherited property: ${n} from path: ${s}`),t[n]=o(e[n],`${s.length?`${s}.`:""}${n}`);return t}return e}n[s]={index:i,length:e.byteLength,binaryType:a},"Buffer"===t?r.push(Buffer.from(e)):"ArrayBuffer"===a?r.push(e):r.push(e.buffer),i+=e.byteLength};s=o(e,"");let a=null;if(r.length>1)if("ArrayBuffer"===t){const e=r.reduce(((e,t)=>e+t.byteLength),0),t=new Uint8Array(e);let n=0;for(let e=0;e<r.length;e++)t.set(new Uint8Array(r[e]),n),n+=r[e].byteLength;a=t.buffer}else{a=Buffer.concat(r)}else 1===r.length&&(a=r[0]);return a?{map:n,combinedData:a,sourceCopy:s}:null},xl=(e,t,n)=>{const r=t.match(/(\[\d+\])|([^[\].]+)/g)||[];let i=e;for(let e=0;e<r.length;e++){let t=r[e];const s=t.startsWith("[")&&t.endsWith("]"),o=e===r.length-1;if(s){t=t.slice(1,-1);const s=parseInt(t,10);if(!Array.isArray(i))throw new Error(`Expected an array at key "${r.slice(0,e).join(".")}" but found an object.`);o?i[s]=n:(i[s]||(i[s]=r[e+1].startsWith("[")?[]:{}),i=i[s])}else o?i[t]=n:(i[t]||(i[t]=r[e+1].startsWith("[")?[]:{}),i=i[t])}return e},Al=(e,t,n)=>{const r="undefined"!=typeof Buffer,i=t instanceof Uint8Array;for(const s in n)if(n.hasOwnProperty(s)){const{index:o,length:a,binaryType:c}=n[s];let l=null;if(r&&t instanceof Buffer)switch(c){case"Buffer":l=t.subarray(o,o+a);break;case"ArrayBuffer":l=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a);break;case"Uint8Array":l=new Uint8Array(t.subarray(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.subarray(o,o+a));break;case"Int8Array":l=new Int8Array(t.subarray(o,o+a))}else if(t instanceof ArrayBuffer||t instanceof Uint8Array)switch(c){case"Buffer":if(r){l=Buffer.from(t.slice(o,o+a));break}case"ArrayBuffer":l=i?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a):t.slice(o,o+a);break;case"Uint8Array":l=i?t.slice(o,o+a):new Uint8Array(t.slice(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.slice(o,o+a));break;case"Int8Array":l=new Int8Array(t.slice(o,o+a))}l&&xl(e,s,l)}return e},Nl=e=>rc(e),Ol="KMSG",Pl="KCMD",Ll=Nl("klProtocol");var Tl={encode:(e,t,n)=>{const r={json:e.json},i=El(r.json,"Buffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Buffer.from(a),l=c.byteLength,u=Il.protocolPrefix+Il.protocolVersion+Il.jsonLength+Il.binaryLength+Il.fromServiceId+Il.toServiceId+Il.sentAt+l+o,d=Buffer.alloc(u),p=Date.now();let h=0;return d.write(Ol,h),h+=Il.protocolPrefix,d.writeUInt8(1,h),h+=Il.protocolVersion,d.writeUInt32LE(l,h),h+=Il.jsonLength,d.writeUInt32LE(o,h),h+=Il.binaryLength,d.writeUInt32LE(t,h),h+=Il.fromServiceId,d.writeUInt32LE(n,h),h+=Il.toServiceId,d.writeBigInt64LE(BigInt(p),h),h+=Il.sentAt,c.copy(d,h),h+=l,s&&o&&s.copy(d,h),d},decodeHeader:e=>{let t=0;const n=e.toString("utf-8",t,Il.protocolPrefix);if(t+=Il.protocolPrefix,n!==Ol)return null;if(e.byteLength<$l)return Ll(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const r=e.readUInt8(t);t+=Il.protocolVersion;const i=e.readUInt32LE(t);t+=Il.jsonLength;const s=e.readUInt32LE(t);t+=Il.binaryLength;const o=e.readUInt32LE(t);t+=Il.fromServiceId;const a=e.readUInt32LE(t);t+=Il.toServiceId;const c=e.readBigInt64LE(t);t+=Il.sentAt;const l=i+s,u=e.subarray(t,t+l),d=e.subarray(0,$l);let p=null;return e.byteLength-$l-i-s>0&&(p=e.subarray($l+i+s)),{header:{protocolVersion:r,jsonLength:i,binaryLength:s,fromServiceId:o,toServiceId:a,sentAt:new Date(Number(c)),packages:[u],headerPackage:d},remaining:p}},decodeFullKlMessage:e=>{const t=Buffer.concat(e.packages),n=t.subarray(0,e.jsonLength).toString(),r=t.subarray(e.jsonLength,e.jsonLength+e.binaryLength),i=wl(n);if(!i?.json)return Ll("Invalid JSON in KL message"),null;i.jsonBinaryMap&&r.byteLength&&Al(i.json,r,i.jsonBinaryMap);const s=Buffer.concat([e.headerPackage,t]);let o=s,a=null;const c=$l+e.jsonLength+e.binaryLength;return s.byteLength>c&&(a=s.subarray(c),o=s.subarray(0,c)),{message:{json:i.json,rawMessage:o},remaining:a}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<$l)return Ll("Invalid Header Size"),e;let n=0;return n+=Il.protocolPrefix,n+=Il.protocolVersion,n+=Il.jsonLength,n+=Il.binaryLength,void 0!==t.fromServiceId&&e.writeUInt32LE(t.fromServiceId,n),n+=Il.fromServiceId,void 0!==t.toServiceId&&e.writeUInt32LE(t.toServiceId,n),e},encodeCommand:e=>{let t=0;const n=Buffer.from(e),r=n.byteLength,i=Cl+r,s=Buffer.alloc(i);return s.write(Pl,t),t+=_l.protocolPrefix,s.writeUint32LE(r,t),t+=_l.txtLength,n.copy(s,t),s},decodeCommand:e=>{let t=0;if(e.byteLength<Cl)return{command:null};const n=e.toString("utf-8",t,_l.protocolPrefix);if(t+=_l.protocolPrefix,n!==Pl)return{command:null};const r=e.readUInt32LE(t);t+=_l.txtLength;const i=e.toString("utf-8",t,t+r),s=e.byteLength-Cl-r;let o=null;s>0&&(o=e.subarray(Cl+r));let a=0;return s<0&&(a=Math.abs(s)),{command:i,remainingData:o,missing:a}}};const Bl="KMSG",jl="KCMD",Dl=Nl("klProtocol"),Ul=new TextEncoder;var Ml={encode:(e,t,n)=>{const r={json:e.json},i=El(e.json,"ArrayBuffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Ul.encode(a),l=c.byteLength,u=new ArrayBuffer(Il.protocolPrefix+Il.protocolVersion+Il.jsonLength+Il.binaryLength+Il.fromServiceId+Il.toServiceId+Il.sentAt+l+o),d=new DataView(u),p=new Uint8Array(u),h=Date.now();let f=0;for(let e=0;e<4;++e)p[f++]=Bl.charCodeAt(e);return d.setUint8(f,1),f+=Il.protocolVersion,d.setUint32(f,l,!0),f+=Il.jsonLength,d.setUint32(f,o,!0),f+=Il.binaryLength,d.setUint32(f,t,!0),f+=Il.fromServiceId,d.setUint32(f,n,!0),f+=Il.toServiceId,d.setBigInt64(f,BigInt(h),!0),f+=Il.sentAt,p.set(c,f),f+=l,s&&o&&p.set(new Uint8Array(s),f),u},decodeHeader:e=>{const t=new DataView(e);let n=0,r="";for(let e=0;e<Il.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==Bl)return null;if(e.byteLength<$l)return Dl.log(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const i=t.getUint8(n);n+=Il.protocolVersion;const s=t.getUint32(n,!0);n+=Il.jsonLength;const o=t.getUint32(n,!0);n+=Il.binaryLength;const a=t.getUint32(n,!0);n+=Il.fromServiceId;const c=t.getUint32(n,!0);n+=Il.toServiceId;const l=t.getBigInt64(n,!0);n+=Il.sentAt;const u=s+o,d=e.slice(n,n+u),p=new Uint8Array(e,0,$l);let h=null;if(e.byteLength-$l-s-o>0){h=new Uint8Array(e,$l+s+o).slice().buffer}return{header:{protocolVersion:i,jsonLength:s,binaryLength:o,fromServiceId:a,toServiceId:c,sentAt:new Date(Number(l)),packages:[d],headerPackage:p.slice().buffer},remaining:h}},decodeFullKlMessage:e=>{const t=e.packages.reduce(((e,t)=>e+t.byteLength),0),n=new Uint8Array(t);let r,i=0;for(const t of e.packages)r=new Uint8Array(t),n.set(r,i),i+=r.byteLength;const s=(new TextDecoder).decode(n.subarray(0,e.jsonLength)),o=n.subarray(e.jsonLength,e.jsonLength+e.binaryLength),a=wl(s);if(!a?.json)return Dl.log("Invalid JSON in KL message"),null;a.jsonBinaryMap&&o.byteLength&&Al(a.json,o,a.jsonBinaryMap);const c=new Uint8Array(e.headerPackage.byteLength+n.byteLength);c.set(new Uint8Array(e.headerPackage),0),c.set(n,e.headerPackage.byteLength);let l=c,u=null;const d=$l+e.jsonLength+e.binaryLength;return c.byteLength>d&&(u=c.subarray(d),l=c.subarray(0,d)),{message:{json:a.json,...o.length?{binaryData:o.buffer}:{},rawMessage:l.buffer},remaining:u?.buffer??null}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<$l)return Dl("Invalid Header Size"),e;let n=0;n+=Il.protocolPrefix,n+=Il.protocolVersion,n+=Il.jsonLength,n+=Il.binaryLength;const r=new DataView(e);return void 0!==t.fromServiceId&&r.setUint32(n,t.fromServiceId,!0),n+=Il.fromServiceId,void 0!==t.toServiceId&&r.setUint32(n,t.toServiceId,!0),e},encodeCommand:e=>{let t=0;const n=Ul.encode(e),r=n.byteLength,i=new ArrayBuffer(Cl+r),s=new DataView(i),o=new Uint8Array(i);for(let e=0;e<4;++e)o[t++]=jl.charCodeAt(e);return s.setUint32(t,r,!0),t+=_l.txtLength,o.set(n,t),i},decodeCommand:e=>{const t=new DataView(e);let n=0;if(e.byteLength<Cl)return{command:null};let r="";for(let e=0;e<_l.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==jl)return{command:null};const i=t.getUint32(n,!0);n+=_l.txtLength;const s=e.byteLength-Cl-i,o=new Uint8Array(e,n,Math.min(i,e.byteLength-Cl)),a=(new TextDecoder).decode(o);let c=null;s>0&&(c=e.slice(Cl+i));let l=0;return s<0&&(l=Math.abs(s)),{command:a,remainingData:c,missing:l}}};const Fl=Nl("klTransmissionManager"),Rl=()=>{const e=(t,n,r,i)=>{let s=n,o=null;const a=t instanceof ArrayBuffer;if(Fl(`RAW: ${t.toString()}`),!s||s.partialHeaderData){let c;if(a?(c=s?.partialHeaderData?new Uint8Array([...new Uint8Array(s.partialHeaderData),...new Uint8Array(t)]).buffer:t,o=Ml.decodeHeader(c)):(c=s?.partialHeaderData?Buffer.concat([s.partialHeaderData,t]):t,o=Tl.decodeHeader(c)),!o){const{command:t,missing:s,remainingData:o}=a?Ml.decodeCommand(c):Tl.decodeCommand(c);return t?i({command:t,complete:!0,rawMessage:c}):Fl(s?`ERROR: Missing ${s} bytes to complete the command. This partial command will be aborted.`:`ERROR: Invalid state, message was decoded without a header or partial header data. Discarding ${c.byteLength} bytes`),o?(Fl(`${o.byteLength} bytes remain after processing command. Re-analyzing...`),e(o,n,r,i)):void 0}if(o.partialHeader)return s={firstPackageAt:Date.now(),partialHeaderData:c},r(s);if(!o.header)return Fl(`ERROR: Invalid state, message was decoded without a header or partial header data. Discarding ${c.byteLength} bytes`);const l=o.header;s={firstPackageAt:Date.now(),header:{...l,totalBytesReceived:l.packages[0].byteLength,totalBytesExpected:l.binaryLength+l.jsonLength,remaining:o.remaining}},r(s)}else s.header&&s.header.totalBytesReceived<s.header.totalBytesExpected&&(s.header.packages.push(t),s.header.totalBytesReceived+=t.byteLength,r(s));if(s.header&&s.header.totalBytesReceived>=s.header.totalBytesExpected){const t=Date.now()-s.header.sentAt.getTime(),n=Date.now()-s.firstPackageAt;Fl(`Received ${s.header.totalBytesReceived} of ${s.header.totalBytesExpected} expected in ${t} ms, elapsed since first package: ${n}ms`);const o=a?Ml.decodeFullKlMessage(s.header):Tl.decodeFullKlMessage(s.header),c=s.header.totalBytesReceived,l=s.header.remaining;r(null),o&&i({klMessage:o.message,complete:!0,sourceServiceId:s.header.fromServiceId,targetServiceId:s.header.toServiceId,rawMessage:o.message.rawMessage});let u=l;if(o?.remaining&&(u=a?l?((e,t)=>{const n=e.byteLength+t.byteLength,r=new ArrayBuffer(n),i=new Uint8Array(e),s=new Uint8Array(t),o=new Uint8Array(r);return o.set(i),o.set(s,i.length),r})(l,o.remaining):o.remaining:l?Buffer.concat([l,o.remaining]):o.remaining),u)return Fl(`${u.byteLength} bytes remaining after processing message with ${c} bytes of data. Re-analyzing...`),e(u,null,r,i)}};return e};vl.config={...vl.config,...yl};const Wl={info:ic("ipcServer:info"),data:ic("ipcServer:data")};let Gl,Vl,Hl,zl,ql={};const Kl=Rl(),Jl=e=>{ql[e]&&(Wl.info(`Client disconnected [${e}]`),delete ql[e],Vl&&Vl(e))};var Yl=e=>(e?.ipcId&&(vl.config.id=e.ipcId),e?.ipcAppSpace&&(vl.config.appspace=e.ipcAppSpace),new Promise((e=>{vl.serve((()=>{Wl.info("IPC Server Initiated"),vl.server.on("data",((e,t)=>{const n=ql[t.id];n?(Wl.data(`IPC Socket [${t.id}] data ${e.byteLength} bytes`),Kl(e,n.activeMessage,(e=>n.activeMessage=e),(e=>{if(!e.complete)return;const n=e=>{t.write(e)};if(e.command)return Wl.data(`Received command from client [${t.id}]: ${e.command}`),void(Hl&&Hl(t.id,e.command,n));e.klMessage&&zl&&zl({send:n,transmission:{sourceServiceId:e.sourceServiceId??-1,targetServiceId:e.targetServiceId??-1,rawMessage:e.rawMessage},json:e.klMessage.json})}))):Wl.data(`Received data from unknown client [${t.id}]. Ignoring.`)})),vl.server.on("connect",(e=>{const t=ac();Wl.info(`New client connected. Registered as "${t}"`),e.id=t,ql[t]={socket:e,activeMessage:null,disconnectHandler:()=>Jl(t)},e.on("close",ql[t].disconnectHandler),Gl&&Gl(t)})),vl.server.on("disconnect",(e=>{Jl(e.id)})),vl.server.on("error",(e=>{console.log(`IPC Server Error: ${e}`)})),e()})),vl.server.start()}))),Xl=e=>{Gl=e},Zl=e=>{Vl=e},Ql=e=>zl=e,eu=(e,t)=>{const n=ql[e];if(!n)return Wl.info(`Cannot send message to unknown client [${e}]`),!1;if(t.length>=bl)return Wl.info("Message is too long to be a command. Use sendMessage instead."),!1;const r=Tl.encodeCommand(t);return n.socket.write(r),!0},tu=(e,t)=>{const n=ql[e];return!!n&&(Wl.info(`Renaming socket id [${e}] to [${t}]`),delete ql[e],n.socket.id=t,ql[t]=n,n.socket.removeListener("close",n.disconnectHandler),n.disconnectHandler=()=>Jl(t),n.socket.on("close",n.disconnectHandler),!0)},nu=e=>{Hl=e};let ru=Tl;Sl&&(ru=Ml);var iu,su=ru;!function(e){e.FunctionNotFound="FNC_NOT_FOUND"}(iu||(iu={}));let ou=Math.ceil(Date.now()/1e3);var au={exports:{}};const cu=["nodebuffer","arraybuffer","fragments"],lu="undefined"!=typeof Blob;lu&&cu.push("blob");var uu={BINARY_TYPES:cu,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:lu,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}};const{EMPTY_BUFFER:du}=uu,pu=Buffer[Symbol.species];function hu(e,t,n,r,i){for(let s=0;s<i;s++)n[r+s]=e[s]^t[3&s]}function fu(e,t){for(let n=0;n<e.length;n++)e[n]^=t[3&n]}if(au.exports={concat:function(e,t){if(0===e.length)return du;if(1===e.length)return e[0];const n=Buffer.allocUnsafe(t);let r=0;for(let t=0;t<e.length;t++){const i=e[t];n.set(i,r),r+=i.length}return r<t?new pu(n.buffer,n.byteOffset,r):n},mask:hu,toArrayBuffer:function(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)},toBuffer:function e(t){if(e.readOnly=!0,Buffer.isBuffer(t))return t;let n;return t instanceof ArrayBuffer?n=new pu(t):ArrayBuffer.isView(t)?n=new pu(t.buffer,t.byteOffset,t.byteLength):(n=Buffer.from(t),e.readOnly=!1),n},unmask:fu},!process.env.WS_NO_BUFFER_UTIL)try{const e=require("bufferutil");au.exports.mask=function(t,n,r,i,s){s<48?hu(t,n,r,i,s):e.mask(t,n,r,i,s)},au.exports.unmask=function(t,n){t.length<32?fu(t,n):e.unmask(t,n)}}catch(e){}var gu=au.exports;const mu=Symbol("kDone"),vu=Symbol("kRun");const yu=B,bu=gu,wu=class{constructor(e){this[mu]=()=>{this.pending--,this[vu]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[vu]()}[vu](){if(this.pending!==this.concurrency&&this.jobs.length){const e=this.jobs.shift();this.pending++,e(this[mu])}}},{kStatusCode:Su}=uu,Iu=Buffer[Symbol.species],_u=Buffer.from([0,0,255,255]),$u=Symbol("permessage-deflate"),Cu=Symbol("total-length"),ku=Symbol("callback"),Eu=Symbol("buffers"),xu=Symbol("error");let Au;var Nu=class{constructor(e,t,n){if(this._maxPayload=0|n,this._options=e||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,!Au){const e=void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10;Au=new wu(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){const e=this._deflate[ku];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){const t=this._options,n=e.find((e=>!(!1===t.serverNoContextTakeover&&e.server_no_context_takeover||e.server_max_window_bits&&(!1===t.serverMaxWindowBits||"number"==typeof t.serverMaxWindowBits&&t.serverMaxWindowBits>e.server_max_window_bits)||"number"==typeof t.clientMaxWindowBits&&!e.client_max_window_bits)));if(!n)throw new Error("None of the extension offers can be accepted");return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),"number"==typeof t.serverMaxWindowBits&&(n.server_max_window_bits=t.serverMaxWindowBits),"number"==typeof t.clientMaxWindowBits?n.client_max_window_bits=t.clientMaxWindowBits:!0!==n.client_max_window_bits&&!1!==t.clientMaxWindowBits||delete n.client_max_window_bits,n}acceptAsClient(e){const t=e[0];if(!1===this._options.clientNoContextTakeover&&t.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(t.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(t.client_max_window_bits=this._options.clientMaxWindowBits);return t}normalizeParams(e){return e.forEach((e=>{Object.keys(e).forEach((t=>{let n=e[t];if(n.length>1)throw new Error(`Parameter "${t}" must have only a single value`);if(n=n[0],"client_max_window_bits"===t){if(!0!==n){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}else if("server_max_window_bits"===t){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else{if("client_no_context_takeover"!==t&&"server_no_context_takeover"!==t)throw new Error(`Unknown parameter "${t}"`);if(!0!==n)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}e[t]=n}))})),e}decompress(e,t,n){Au.add((r=>{this._decompress(e,t,((e,t)=>{r(),n(e,t)}))}))}compress(e,t,n){Au.add((r=>{this._compress(e,t,((e,t)=>{r(),n(e,t)}))}))}_decompress(e,t,n){const r=this._isServer?"client":"server";if(!this._inflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?yu.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=yu.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[$u]=this,this._inflate[Cu]=0,this._inflate[Eu]=[],this._inflate.on("error",Lu),this._inflate.on("data",Pu)}this._inflate[ku]=n,this._inflate.write(e),t&&this._inflate.write(_u),this._inflate.flush((()=>{const e=this._inflate[xu];if(e)return this._inflate.close(),this._inflate=null,void n(e);const i=bu.concat(this._inflate[Eu],this._inflate[Cu]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[Cu]=0,this._inflate[Eu]=[],t&&this.params[`${r}_no_context_takeover`]&&this._inflate.reset()),n(null,i)}))}_compress(e,t,n){const r=this._isServer?"server":"client";if(!this._deflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?yu.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=yu.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[Cu]=0,this._deflate[Eu]=[],this._deflate.on("data",Ou)}this._deflate[ku]=n,this._deflate.write(e),this._deflate.flush(yu.Z_SYNC_FLUSH,(()=>{if(!this._deflate)return;let e=bu.concat(this._deflate[Eu],this._deflate[Cu]);t&&(e=new Iu(e.buffer,e.byteOffset,e.length-4)),this._deflate[ku]=null,this._deflate[Cu]=0,this._deflate[Eu]=[],t&&this.params[`${r}_no_context_takeover`]&&this._deflate.reset(),n(null,e)}))}};function Ou(e){this[Eu].push(e),this[Cu]+=e.length}function Pu(e){this[Cu]+=e.length,this[$u]._maxPayload<1||this[Cu]<=this[$u]._maxPayload?this[Eu].push(e):(this[xu]=new RangeError("Max payload size exceeded"),this[xu].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[xu][Su]=1009,this.removeListener("data",Pu),this.reset())}function Lu(e){this[$u]._inflate=null,e[Su]=1007,this[ku](e)}var Tu={exports:{}};const{isUtf8:Bu}=j,{hasBlob:ju}=uu;function Du(e){const t=e.length;let n=0;for(;n<t;)if(128&e[n])if(192==(224&e[n])){if(n+1===t||128!=(192&e[n+1])||192==(254&e[n]))return!1;n+=2}else if(224==(240&e[n])){if(n+2>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||224===e[n]&&128==(224&e[n+1])||237===e[n]&&160==(224&e[n+1]))return!1;n+=3}else{if(240!=(248&e[n]))return!1;if(n+3>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||128!=(192&e[n+3])||240===e[n]&&128==(240&e[n+1])||244===e[n]&&e[n+1]>143||e[n]>244)return!1;n+=4}else n++;return!0}if(Tu.exports={isBlob:function(e){return ju&&"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&("Blob"===e[Symbol.toStringTag]||"File"===e[Symbol.toStringTag])},isValidStatusCode:function(e){return e>=1e3&&e<=1014&&1004!==e&&1005!==e&&1006!==e||e>=3e3&&e<=4999},isValidUTF8:Du,tokenChars:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0]},Bu)Tu.exports.isValidUTF8=function(e){return e.length<24?Du(e):Bu(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{const e=require("utf-8-validate");Tu.exports.isValidUTF8=function(t){return t.length<32?Du(t):e(t)}}catch(e){}var Uu=Tu.exports;const{Writable:Mu}=T,Fu=Nu,{BINARY_TYPES:Ru,EMPTY_BUFFER:Wu,kStatusCode:Gu,kWebSocket:Vu}=uu,{concat:Hu,toArrayBuffer:zu,unmask:qu}=gu,{isValidStatusCode:Ku,isValidUTF8:Ju}=Uu,Yu=Buffer[Symbol.species];var Xu=class extends Mu{constructor(e={}){super(),this._allowSynchronousEvents=void 0===e.allowSynchronousEvents||e.allowSynchronousEvents,this._binaryType=e.binaryType||Ru[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=0|e.maxPayload,this._skipUTF8Validation=!!e.skipUTF8Validation,this[Vu]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=0}_write(e,t,n){if(8===this._opcode&&0==this._state)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){const t=this._buffers[0];return this._buffers[0]=new Yu(t.buffer,t.byteOffset+e,t.length-e),new Yu(t.buffer,t.byteOffset,e)}const t=Buffer.allocUnsafe(e);do{const n=this._buffers[0],r=t.length-e;e>=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=new Yu(n.buffer,n.byteOffset+e,n.length-e)),e-=n.length}while(e>0);return t}startLoop(e){this._loop=!0;do{switch(this._state){case 0:this.getInfo(e);break;case 1:this.getPayloadLength16(e);break;case 2:this.getPayloadLength64(e);break;case 3:this.getMask();break;case 4:this.getData(e);break;case 5:case 6:return void(this._loop=!1)}}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2)return void(this._loop=!1);const t=this.consume(2);if(48&t[0]){return void e(this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3"))}const n=!(64&~t[0]);if(!n||this._extensions[Fu.extensionName]){if(this._fin=!(128&~t[0]),this._opcode=15&t[0],this._payloadLength=127&t[1],0===this._opcode){if(n){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(!this._fragmented){return void e(this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE"))}this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}this._compressed=n}else{if(!(this._opcode>7&&this._opcode<11)){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}if(!this._fin){return void e(this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN"))}if(n){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(this._payloadLength>125||8===this._opcode&&1===this._payloadLength){return void e(this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH"))}}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=!(128&~t[1]),this._isServer){if(!this._masked){return void e(this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK"))}}else if(this._masked){return void e(this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK"))}126===this._payloadLength?this._state=1:127===this._payloadLength?this._state=2:this.haveLength(e)}else{e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}}getPayloadLength16(e){this._bufferedBytes<2?this._loop=!1:(this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e))}getPayloadLength64(e){if(this._bufferedBytes<8)return void(this._loop=!1);const t=this.consume(8),n=t.readUInt32BE(0);if(n>Math.pow(2,21)-1){e(this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH"))}else this._payloadLength=n*Math.pow(2,32)+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){e(this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"))}else this._masked?this._state=3:this._state=4}getMask(){this._bufferedBytes<4?this._loop=!1:(this._mask=this.consume(4),this._state=4)}getData(e){let t=Wu;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength)return void(this._loop=!1);t=this.consume(this._payloadLength),this._masked&&this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3]&&qu(t,this._mask)}if(this._opcode>7)this.controlMessage(t,e);else{if(this._compressed)return this._state=5,void this.decompress(t,e);t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}}decompress(e,t){this._extensions[Fu.extensionName].decompress(e,this._fin,((e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){const e=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");return void t(e)}this._fragments.push(n)}this.dataMessage(t),0===this._state&&this.startLoop(t)}))}dataMessage(e){if(!this._fin)return void(this._state=0);const t=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],2===this._opcode){let r;r="nodebuffer"===this._binaryType?Hu(n,t):"arraybuffer"===this._binaryType?zu(Hu(n,t)):"blob"===this._binaryType?new Blob(n):n,this._allowSynchronousEvents?(this.emit("message",r,!0),this._state=0):(this._state=6,setImmediate((()=>{this.emit("message",r,!0),this._state=0,this.startLoop(e)})))}else{const r=Hu(n,t);if(!this._skipUTF8Validation&&!Ju(r)){const t=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");return void e(t)}5===this._state||this._allowSynchronousEvents?(this.emit("message",r,!1),this._state=0):(this._state=6,setImmediate((()=>{this.emit("message",r,!1),this._state=0,this.startLoop(e)})))}}controlMessage(e,t){if(8!==this._opcode)this._allowSynchronousEvents?(this.emit(9===this._opcode?"ping":"pong",e),this._state=0):(this._state=6,setImmediate((()=>{this.emit(9===this._opcode?"ping":"pong",e),this._state=0,this.startLoop(t)})));else{if(0===e.length)this._loop=!1,this.emit("conclude",1005,Wu),this.end();else{const n=e.readUInt16BE(0);if(!Ku(n)){const e=this.createError(RangeError,`invalid status code ${n}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");return void t(e)}const r=new Yu(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!Ju(r)){const e=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");return void t(e)}this._loop=!1,this.emit("conclude",n,r),this.end()}this._state=0}}createError(e,t,n,r,i){this._loop=!1,this._errored=!0;const s=new e(n?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(s,this.createError),s.code=i,s[Gu]=r,s}};const{randomFillSync:Zu}=l,Qu=Nu,{EMPTY_BUFFER:ed,kWebSocket:td,NOOP:nd}=uu,{isBlob:rd,isValidStatusCode:id}=Uu,{mask:sd,toBuffer:od}=gu,ad=Symbol("kByteLength"),cd=Buffer.alloc(4),ld=8192;let ud,dd=ld;var pd=class e{constructor(e,t,n){this._extensions=t||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=0,this.onerror=nd,this[td]=void 0}static frame(e,t){let n,r,i=!1,s=2,o=!1;t.mask&&(n=t.maskBuffer||cd,t.generateMask?t.generateMask(n):(dd===ld&&(void 0===ud&&(ud=Buffer.alloc(ld)),Zu(ud,0,ld),dd=0),n[0]=ud[dd++],n[1]=ud[dd++],n[2]=ud[dd++],n[3]=ud[dd++]),o=!(n[0]|n[1]|n[2]|n[3]),s=6),"string"==typeof e?r=t.mask&&!o||void 0===t[ad]?(e=Buffer.from(e)).length:t[ad]:(r=e.length,i=t.mask&&t.readOnly&&!o);let a=r;r>=65536?(s+=8,a=127):r>125&&(s+=2,a=126);const c=Buffer.allocUnsafe(i?r+s:s);return c[0]=t.fin?128|t.opcode:t.opcode,t.rsv1&&(c[0]|=64),c[1]=a,126===a?c.writeUInt16BE(r,2):127===a&&(c[2]=c[3]=0,c.writeUIntBE(r,4,6)),t.mask?(c[1]|=128,c[s-4]=n[0],c[s-3]=n[1],c[s-2]=n[2],c[s-1]=n[3],o?[c,e]:i?(sd(e,n,c,s,r),[c]):(sd(e,n,e,0,r),[c,e])):[c,e]}close(t,n,r,i){let s;if(void 0===t)s=ed;else{if("number"!=typeof t||!id(t))throw new TypeError("First argument must be a valid error code number");if(void 0!==n&&n.length){const e=Buffer.byteLength(n);if(e>123)throw new RangeError("The message must not be greater than 123 bytes");s=Buffer.allocUnsafe(2+e),s.writeUInt16BE(t,0),"string"==typeof n?s.write(n,2):s.set(n,2)}else s=Buffer.allocUnsafe(2),s.writeUInt16BE(t,0)}const o={[ad]:s.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};0!==this._state?this.enqueue([this.dispatch,s,!1,o,i]):this.sendFrame(e.frame(s,o),i)}ping(t,n,r){let i,s;if("string"==typeof t?(i=Buffer.byteLength(t),s=!1):rd(t)?(i=t.size,s=!1):(i=(t=od(t)).length,s=od.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const o={[ad]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:s,rsv1:!1};rd(t)?0!==this._state?this.enqueue([this.getBlobData,t,!1,o,r]):this.getBlobData(t,!1,o,r):0!==this._state?this.enqueue([this.dispatch,t,!1,o,r]):this.sendFrame(e.frame(t,o),r)}pong(t,n,r){let i,s;if("string"==typeof t?(i=Buffer.byteLength(t),s=!1):rd(t)?(i=t.size,s=!1):(i=(t=od(t)).length,s=od.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const o={[ad]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:s,rsv1:!1};rd(t)?0!==this._state?this.enqueue([this.getBlobData,t,!1,o,r]):this.getBlobData(t,!1,o,r):0!==this._state?this.enqueue([this.dispatch,t,!1,o,r]):this.sendFrame(e.frame(t,o),r)}send(e,t,n){const r=this._extensions[Qu.extensionName];let i,s,o=t.binary?2:1,a=t.compress;"string"==typeof e?(i=Buffer.byteLength(e),s=!1):rd(e)?(i=e.size,s=!1):(i=(e=od(e)).length,s=od.readOnly),this._firstFragment?(this._firstFragment=!1,a&&r&&r.params[r._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(a=i>=r._threshold),this._compress=a):(a=!1,o=0),t.fin&&(this._firstFragment=!0);const c={[ad]:i,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:o,readOnly:s,rsv1:a};rd(e)?0!==this._state?this.enqueue([this.getBlobData,e,this._compress,c,n]):this.getBlobData(e,this._compress,c,n):0!==this._state?this.enqueue([this.dispatch,e,this._compress,c,n]):this.dispatch(e,this._compress,c,n)}getBlobData(t,n,r,i){this._bufferedBytes+=r[ad],this._state=2,t.arrayBuffer().then((t=>{if(this._socket.destroyed){const e=new Error("The socket was closed while the blob was being read");return void process.nextTick(hd,this,e,i)}this._bufferedBytes-=r[ad];const s=od(t);n?this.dispatch(s,n,r,i):(this._state=0,this.sendFrame(e.frame(s,r),i),this.dequeue())})).catch((e=>{process.nextTick(fd,this,e,i)}))}dispatch(t,n,r,i){if(!n)return void this.sendFrame(e.frame(t,r),i);const s=this._extensions[Qu.extensionName];this._bufferedBytes+=r[ad],this._state=1,s.compress(t,r.fin,((t,n)=>{if(this._socket.destroyed){hd(this,new Error("The socket was closed while data was being compressed"),i)}else this._bufferedBytes-=r[ad],this._state=0,r.readOnly=!1,this.sendFrame(e.frame(n,r),i),this.dequeue()}))}dequeue(){for(;0===this._state&&this._queue.length;){const e=this._queue.shift();this._bufferedBytes-=e[3][ad],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][ad],this._queue.push(e)}sendFrame(e,t){2===e.length?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};function hd(e,t,n){"function"==typeof n&&n(t);for(let n=0;n<e._queue.length;n++){const r=e._queue[n],i=r[r.length-1];"function"==typeof i&&i(t)}}function fd(e,t,n){hd(e,t,n),e.onerror(t)}const{kForOnEventAttribute:gd,kListener:md}=uu,vd=Symbol("kCode"),yd=Symbol("kData"),bd=Symbol("kError"),wd=Symbol("kMessage"),Sd=Symbol("kReason"),Id=Symbol("kTarget"),_d=Symbol("kType"),$d=Symbol("kWasClean");class Cd{constructor(e){this[Id]=null,this[_d]=e}get target(){return this[Id]}get type(){return this[_d]}}Object.defineProperty(Cd.prototype,"target",{enumerable:!0}),Object.defineProperty(Cd.prototype,"type",{enumerable:!0});class kd extends Cd{constructor(e,t={}){super(e),this[vd]=void 0===t.code?0:t.code,this[Sd]=void 0===t.reason?"":t.reason,this[$d]=void 0!==t.wasClean&&t.wasClean}get code(){return this[vd]}get reason(){return this[Sd]}get wasClean(){return this[$d]}}Object.defineProperty(kd.prototype,"code",{enumerable:!0}),Object.defineProperty(kd.prototype,"reason",{enumerable:!0}),Object.defineProperty(kd.prototype,"wasClean",{enumerable:!0});class Ed extends Cd{constructor(e,t={}){super(e),this[bd]=void 0===t.error?null:t.error,this[wd]=void 0===t.message?"":t.message}get error(){return this[bd]}get message(){return this[wd]}}Object.defineProperty(Ed.prototype,"error",{enumerable:!0}),Object.defineProperty(Ed.prototype,"message",{enumerable:!0});class xd extends Cd{constructor(e,t={}){super(e),this[yd]=void 0===t.data?null:t.data}get data(){return this[yd]}}Object.defineProperty(xd.prototype,"data",{enumerable:!0});const Ad={addEventListener(e,t,n={}){for(const r of this.listeners(e))if(!n[gd]&&r[md]===t&&!r[gd])return;let r;if("message"===e)r=function(e,n){const r=new xd("message",{data:n?e:e.toString()});r[Id]=this,Od(t,this,r)};else if("close"===e)r=function(e,n){const r=new kd("close",{code:e,reason:n.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[Id]=this,Od(t,this,r)};else if("error"===e)r=function(e){const n=new Ed("error",{error:e,message:e.message});n[Id]=this,Od(t,this,n)};else{if("open"!==e)return;r=function(){const e=new Cd("open");e[Id]=this,Od(t,this,e)}}r[gd]=!!n[gd],r[md]=t,n.once?this.once(e,r):this.on(e,r)},removeEventListener(e,t){for(const n of this.listeners(e))if(n[md]===t&&!n[gd]){this.removeListener(e,n);break}}};var Nd={CloseEvent:kd,ErrorEvent:Ed,Event:Cd,EventTarget:Ad,MessageEvent:xd};function Od(e,t,n){"object"==typeof e&&e.handleEvent?e.handleEvent.call(e,n):e.call(t,n)}const{tokenChars:Pd}=Uu;function Ld(e,t,n){void 0===e[t]?e[t]=[n]:e[t].push(n)}var Td={format:function(e){return Object.keys(e).map((t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map((e=>[t].concat(Object.keys(e).map((t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map((e=>!0===e?t:`${t}=${e}`)).join("; ")}))).join("; "))).join(", ")})).join(", ")},parse:function(e){const t=Object.create(null);let n,r,i=Object.create(null),s=!1,o=!1,a=!1,c=-1,l=-1,u=-1,d=0;for(;d<e.length;d++)if(l=e.charCodeAt(d),void 0===n)if(-1===u&&1===Pd[l])-1===c&&(c=d);else if(0===d||32!==l&&9!==l){if(59!==l&&44!==l)throw new SyntaxError(`Unexpected character at index ${d}`);{if(-1===c)throw new SyntaxError(`Unexpected character at index ${d}`);-1===u&&(u=d);const r=e.slice(c,u);44===l?(Ld(t,r,i),i=Object.create(null)):n=r,c=u=-1}}else-1===u&&-1!==c&&(u=d);else if(void 0===r)if(-1===u&&1===Pd[l])-1===c&&(c=d);else if(32===l||9===l)-1===u&&-1!==c&&(u=d);else if(59===l||44===l){if(-1===c)throw new SyntaxError(`Unexpected character at index ${d}`);-1===u&&(u=d),Ld(i,e.slice(c,u),!0),44===l&&(Ld(t,n,i),i=Object.create(null),n=void 0),c=u=-1}else{if(61!==l||-1===c||-1!==u)throw new SyntaxError(`Unexpected character at index ${d}`);r=e.slice(c,d),c=u=-1}else if(o){if(1!==Pd[l])throw new SyntaxError(`Unexpected character at index ${d}`);-1===c?c=d:s||(s=!0),o=!1}else if(a)if(1===Pd[l])-1===c&&(c=d);else if(34===l&&-1!==c)a=!1,u=d;else{if(92!==l)throw new SyntaxError(`Unexpected character at index ${d}`);o=!0}else if(34===l&&61===e.charCodeAt(d-1))a=!0;else if(-1===u&&1===Pd[l])-1===c&&(c=d);else if(-1===c||32!==l&&9!==l){if(59!==l&&44!==l)throw new SyntaxError(`Unexpected character at index ${d}`);{if(-1===c)throw new SyntaxError(`Unexpected character at index ${d}`);-1===u&&(u=d);let o=e.slice(c,u);s&&(o=o.replace(/\\/g,""),s=!1),Ld(i,r,o),44===l&&(Ld(t,n,i),i=Object.create(null),n=void 0),r=void 0,c=u=-1}}else-1===u&&(u=d);if(-1===c||a||32===l||9===l)throw new SyntaxError("Unexpected end of input");-1===u&&(u=d);const p=e.slice(c,u);return void 0===n?Ld(t,p,i):(void 0===r?Ld(i,p,!0):Ld(i,r,s?p.replace(/\\/g,""):p),Ld(t,n,i)),t}};const Bd=D,jd=U,Dd=M,Ud=A,Md=N,{randomBytes:Fd,createHash:Rd}=l,{URL:Wd}=F,Gd=Nu,Vd=Xu,Hd=pd,{isBlob:zd}=Uu,{BINARY_TYPES:qd,EMPTY_BUFFER:Kd,GUID:Jd,kForOnEventAttribute:Yd,kListener:Xd,kStatusCode:Zd,kWebSocket:Qd,NOOP:ep}=uu,{EventTarget:{addEventListener:tp,removeEventListener:np}}=Nd,{format:rp,parse:ip}=Td,{toBuffer:sp}=gu,op=3e4,ap=Symbol("kAborted"),cp=[8,13],lp=["CONNECTING","OPEN","CLOSING","CLOSED"],up=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;let dp=class e extends Bd{constructor(t,n,r){super(),this._binaryType=qd[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Kd,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,null!==t?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,void 0===n?n=[]:Array.isArray(n)||("object"==typeof n&&null!==n?(r=n,n=[]):n=[n]),hp(this,t,n,r)):(this._autoPong=r.autoPong,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){qd.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,n,r){const i=new Vd({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),s=new Hd(t,this._extensions,r.generateMask);this._receiver=i,this._sender=s,this._socket=t,i[Qd]=this,s[Qd]=this,t[Qd]=this,i.on("conclude",bp),i.on("drain",wp),i.on("error",Sp),i.on("message",_p),i.on("ping",$p),i.on("pong",Cp),s.onerror=Ep,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),n.length>0&&t.unshift(n),t.on("close",Ap),t.on("data",Np),t.on("end",Op),t.on("error",Pp),this._readyState=e.OPEN,this.emit("open")}emitClose(){if(!this._socket)return this._readyState=e.CLOSED,void this.emit("close",this._closeCode,this._closeMessage);this._extensions[Gd.extensionName]&&this._extensions[Gd.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(t,n){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this.readyState!==e.CLOSING?(this._readyState=e.CLOSING,this._sender.close(t,n,!this._isServer,(e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())})),xp(this)):this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();else{const e="WebSocket was closed before the connection was established";vp(this,this._req,e)}}pause(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!0,this._socket.pause())}ping(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=n=void 0):"function"==typeof n&&(r=n,n=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===n&&(n=!this._isServer),this._sender.ping(t||Kd,n,r)):yp(this,t,r)}pong(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=n=void 0):"function"==typeof n&&(r=n,n=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===n&&(n=!this._isServer),this._sender.pong(t||Kd,n,r)):yp(this,t,r)}resume(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof n&&(r=n,n={}),"number"==typeof t&&(t=t.toString()),this.readyState!==e.OPEN)return void yp(this,t,r);const i={binary:"string"!=typeof t,mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[Gd.extensionName]||(i.compress=!1),this._sender.send(t||Kd,i,r)}terminate(){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this._socket&&(this._readyState=e.CLOSING,this._socket.destroy());else{const e="WebSocket was closed before the connection was established";vp(this,this._req,e)}}};Object.defineProperty(dp,"CONNECTING",{enumerable:!0,value:lp.indexOf("CONNECTING")}),Object.defineProperty(dp.prototype,"CONNECTING",{enumerable:!0,value:lp.indexOf("CONNECTING")}),Object.defineProperty(dp,"OPEN",{enumerable:!0,value:lp.indexOf("OPEN")}),Object.defineProperty(dp.prototype,"OPEN",{enumerable:!0,value:lp.indexOf("OPEN")}),Object.defineProperty(dp,"CLOSING",{enumerable:!0,value:lp.indexOf("CLOSING")}),Object.defineProperty(dp.prototype,"CLOSING",{enumerable:!0,value:lp.indexOf("CLOSING")}),Object.defineProperty(dp,"CLOSED",{enumerable:!0,value:lp.indexOf("CLOSED")}),Object.defineProperty(dp.prototype,"CLOSED",{enumerable:!0,value:lp.indexOf("CLOSED")}),["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach((e=>{Object.defineProperty(dp.prototype,e,{enumerable:!0})})),["open","error","close","message"].forEach((e=>{Object.defineProperty(dp.prototype,`on${e}`,{enumerable:!0,get(){for(const t of this.listeners(e))if(t[Yd])return t[Xd];return null},set(t){for(const t of this.listeners(e))if(t[Yd]){this.removeListener(e,t);break}"function"==typeof t&&this.addEventListener(e,t,{[Yd]:!0})}})})),dp.prototype.addEventListener=tp,dp.prototype.removeEventListener=np;var pp=dp;function hp(e,t,n,r){const i={allowSynchronousEvents:!0,autoPong:!0,protocolVersion:cp[1],maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...r,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(e._autoPong=i.autoPong,!cp.includes(i.protocolVersion))throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} (supported versions: ${cp.join(", ")})`);let s;if(t instanceof Wd)s=t;else try{s=new Wd(t)}catch(e){throw new SyntaxError(`Invalid URL: ${t}`)}"http:"===s.protocol?s.protocol="ws:":"https:"===s.protocol&&(s.protocol="wss:"),e._url=s.href;const o="wss:"===s.protocol,a="ws+unix:"===s.protocol;let c;if("ws:"===s.protocol||o||a?a&&!s.pathname?c="The URL's pathname is empty":s.hash&&(c="The URL contains a fragment identifier"):c='The URL\'s protocol must be one of "ws:", "wss:", "http:", "https", or "ws+unix:"',c){const t=new SyntaxError(c);if(0===e._redirects)throw t;return void fp(e,t)}const l=o?443:80,u=Fd(16).toString("base64"),d=o?jd.request:Dd.request,p=new Set;let h,f;if(i.createConnection=i.createConnection||(o?mp:gp),i.defaultPort=i.defaultPort||l,i.port=s.port||l,i.host=s.hostname.startsWith("[")?s.hostname.slice(1,-1):s.hostname,i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":u,Connection:"Upgrade",Upgrade:"websocket"},i.path=s.pathname+s.search,i.timeout=i.handshakeTimeout,i.perMessageDeflate&&(h=new Gd(!0!==i.perMessageDeflate?i.perMessageDeflate:{},!1,i.maxPayload),i.headers["Sec-WebSocket-Extensions"]=rp({[Gd.extensionName]:h.offer()})),n.length){for(const e of n){if("string"!=typeof e||!up.test(e)||p.has(e))throw new SyntaxError("An invalid or duplicated subprotocol was specified");p.add(e)}i.headers["Sec-WebSocket-Protocol"]=n.join(",")}if(i.origin&&(i.protocolVersion<13?i.headers["Sec-WebSocket-Origin"]=i.origin:i.headers.Origin=i.origin),(s.username||s.password)&&(i.auth=`${s.username}:${s.password}`),a){const e=i.path.split(":");i.socketPath=e[0],i.path=e[1]}if(i.followRedirects){if(0===e._redirects){e._originalIpc=a,e._originalSecure=o,e._originalHostOrSocketPath=a?i.socketPath:s.host;const t=r&&r.headers;if(r={...r,headers:{}},t)for(const[e,n]of Object.entries(t))r.headers[e.toLowerCase()]=n}else if(0===e.listenerCount("redirect")){const t=a?!!e._originalIpc&&i.socketPath===e._originalHostOrSocketPath:!e._originalIpc&&s.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!o)&&(delete i.headers.authorization,delete i.headers.cookie,t||delete i.headers.host,i.auth=void 0)}i.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")),f=e._req=d(i),e._redirects&&e.emit("redirect",e.url,f)}else f=e._req=d(i);i.timeout&&f.on("timeout",(()=>{vp(e,f,"Opening handshake has timed out")})),f.on("error",(t=>{null===f||f[ap]||(f=e._req=null,fp(e,t))})),f.on("response",(s=>{const o=s.headers.location,a=s.statusCode;if(o&&i.followRedirects&&a>=300&&a<400){if(++e._redirects>i.maxRedirects)return void vp(e,f,"Maximum redirects exceeded");let s;f.abort();try{s=new Wd(o,t)}catch(t){const n=new SyntaxError(`Invalid URL: ${o}`);return void fp(e,n)}hp(e,s,n,r)}else e.emit("unexpected-response",f,s)||vp(e,f,`Unexpected server response: ${s.statusCode}`)})),f.on("upgrade",((t,n,r)=>{if(e.emit("upgrade",t),e.readyState!==dp.CONNECTING)return;f=e._req=null;const s=t.headers.upgrade;if(void 0===s||"websocket"!==s.toLowerCase())return void vp(e,n,"Invalid Upgrade header");const o=Rd("sha1").update(u+Jd).digest("base64");if(t.headers["sec-websocket-accept"]!==o)return void vp(e,n,"Invalid Sec-WebSocket-Accept header");const a=t.headers["sec-websocket-protocol"];let c;if(void 0!==a?p.size?p.has(a)||(c="Server sent an invalid subprotocol"):c="Server sent a subprotocol but none was requested":p.size&&(c="Server sent no subprotocol"),c)return void vp(e,n,c);a&&(e._protocol=a);const l=t.headers["sec-websocket-extensions"];if(void 0!==l){if(!h){return void vp(e,n,"Server sent a Sec-WebSocket-Extensions header but no extension was requested")}let t;try{t=ip(l)}catch(t){return void vp(e,n,"Invalid Sec-WebSocket-Extensions header")}const r=Object.keys(t);if(1!==r.length||r[0]!==Gd.extensionName){return void vp(e,n,"Server indicated an extension that was not requested")}try{h.accept(t[Gd.extensionName])}catch(t){return void vp(e,n,"Invalid Sec-WebSocket-Extensions header")}e._extensions[Gd.extensionName]=h}e.setSocket(n,r,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxPayload:i.maxPayload,skipUTF8Validation:i.skipUTF8Validation})})),i.finishRequest?i.finishRequest(f,e):f.end()}function fp(e,t){e._readyState=dp.CLOSING,e._errorEmitted=!0,e.emit("error",t),e.emitClose()}function gp(e){return e.path=e.socketPath,Ud.connect(e)}function mp(e){return e.path=void 0,e.servername||""===e.servername||(e.servername=Ud.isIP(e.host)?"":e.host),Md.connect(e)}function vp(e,t,n){e._readyState=dp.CLOSING;const r=new Error(n);Error.captureStackTrace(r,vp),t.setHeader?(t[ap]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(fp,e,r)):(t.destroy(r),t.once("error",e.emit.bind(e,"error")),t.once("close",e.emitClose.bind(e)))}function yp(e,t,n){if(t){const n=zd(t)?t.size:sp(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){const t=new Error(`WebSocket is not open: readyState ${e.readyState} (${lp[e.readyState]})`);process.nextTick(n,t)}}function bp(e,t){const n=this[Qd];n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,void 0!==n._socket[Qd]&&(n._socket.removeListener("data",Np),process.nextTick(kp,n._socket),1005===e?n.close():n.close(e,t))}function wp(){const e=this[Qd];e.isPaused||e._socket.resume()}function Sp(e){const t=this[Qd];void 0!==t._socket[Qd]&&(t._socket.removeListener("data",Np),process.nextTick(kp,t._socket),t.close(e[Zd])),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e))}function Ip(){this[Qd].emitClose()}function _p(e,t){this[Qd].emit("message",e,t)}function $p(e){const t=this[Qd];t._autoPong&&t.pong(e,!this._isServer,ep),t.emit("ping",e)}function Cp(e){this[Qd].emit("pong",e)}function kp(e){e.resume()}function Ep(e){const t=this[Qd];t.readyState!==dp.CLOSED&&(t.readyState===dp.OPEN&&(t._readyState=dp.CLOSING,xp(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e)))}function xp(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),op)}function Ap(){const e=this[Qd];let t;this.removeListener("close",Ap),this.removeListener("data",Np),this.removeListener("end",Op),e._readyState=dp.CLOSING,this._readableState.endEmitted||e._closeFrameReceived||e._receiver._writableState.errorEmitted||null===(t=e._socket.read())||e._receiver.write(t),e._receiver.end(),this[Qd]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on("error",Ip),e._receiver.on("finish",Ip))}function Np(e){this[Qd]._receiver.write(e)||this.pause()}function Op(){const e=this[Qd];e._readyState=dp.CLOSING,e._receiver.end(),this.end()}function Pp(){const e=this[Qd];this.removeListener("error",Pp),this.on("error",ep),e&&(e._readyState=dp.CLOSING,this.destroy())}const{tokenChars:Lp}=Uu;var Tp={parse:function(e){const t=new Set;let n=-1,r=-1,i=0;for(;i<e.length;i++){const s=e.charCodeAt(i);if(-1===r&&1===Lp[s])-1===n&&(n=i);else if(0===i||32!==s&&9!==s){if(44!==s)throw new SyntaxError(`Unexpected character at index ${i}`);{if(-1===n)throw new SyntaxError(`Unexpected character at index ${i}`);-1===r&&(r=i);const s=e.slice(n,r);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);t.add(s),n=r=-1}}else-1===r&&-1!==n&&(r=i)}if(-1===n||-1!==r)throw new SyntaxError("Unexpected end of input");const s=e.slice(n,i);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);return t.add(s),t}};const Bp=D,jp=M,{createHash:Dp}=l,Up=Td,Mp=Nu,Fp=Tp,Rp=pp,{GUID:Wp,kWebSocket:Gp}=uu,Vp=/^[+/0-9A-Za-z]{22}==$/;var Hp=class extends Bp{constructor(e,t){if(super(),null==(e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:Rp,...e}).port&&!e.server&&!e.noServer||null!=e.port&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=e.port?(this._server=jp.createServer(((e,t)=>{const n=jp.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":"text/plain"}),t.end(n)})),this._server.listen(e.port,e.host,e.backlog,t)):e.server&&(this._server=e.server),this._server){const e=this.emit.bind(this,"connection");this._removeListeners=function(e,t){for(const n of Object.keys(t))e.on(n,t[n]);return function(){for(const n of Object.keys(t))e.removeListener(n,t[n])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}!0===e.perMessageDeflate&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=0}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(2===this._state)return e&&this.once("close",(()=>{e(new Error("The server is not running"))})),void process.nextTick(zp,this);if(e&&this.once("close",e),1!==this._state)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(zp,this);else{const e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close((()=>{zp(this)}))}}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");if((-1!==t?e.url.slice(0,t):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on("error",qp);const i=e.headers["sec-websocket-key"],s=e.headers.upgrade,o=+e.headers["sec-websocket-version"];if("GET"!==e.method){return void Jp(this,e,t,405,"Invalid HTTP method")}if(void 0===s||"websocket"!==s.toLowerCase()){return void Jp(this,e,t,400,"Invalid Upgrade header")}if(void 0===i||!Vp.test(i)){return void Jp(this,e,t,400,"Missing or invalid Sec-WebSocket-Key header")}if(8!==o&&13!==o){return void Jp(this,e,t,400,"Missing or invalid Sec-WebSocket-Version header")}if(!this.shouldHandle(e))return void Kp(t,400);const a=e.headers["sec-websocket-protocol"];let c=new Set;if(void 0!==a)try{c=Fp.parse(a)}catch(n){return void Jp(this,e,t,400,"Invalid Sec-WebSocket-Protocol header")}const l=e.headers["sec-websocket-extensions"],u={};if(this.options.perMessageDeflate&&void 0!==l){const n=new Mp(this.options.perMessageDeflate,!0,this.options.maxPayload);try{const e=Up.parse(l);e[Mp.extensionName]&&(n.accept(e[Mp.extensionName]),u[Mp.extensionName]=n)}catch(n){return void Jp(this,e,t,400,"Invalid or unacceptable Sec-WebSocket-Extensions header")}}if(this.options.verifyClient){const s={origin:e.headers[""+(8===o?"sec-websocket-origin":"origin")],secure:!(!e.socket.authorized&&!e.socket.encrypted),req:e};if(2===this.options.verifyClient.length)return void this.options.verifyClient(s,((s,o,a,l)=>{if(!s)return Kp(t,o||401,a,l);this.completeUpgrade(u,i,c,e,t,n,r)}));if(!this.options.verifyClient(s))return Kp(t,401)}this.completeUpgrade(u,i,c,e,t,n,r)}completeUpgrade(e,t,n,r,i,s,o){if(!i.readable||!i.writable)return i.destroy();if(i[Gp])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return Kp(i,503);const a=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${Dp("sha1").update(t+Wp).digest("base64")}`],c=new this.options.WebSocket(null,void 0,this.options);if(n.size){const e=this.options.handleProtocols?this.options.handleProtocols(n,r):n.values().next().value;e&&(a.push(`Sec-WebSocket-Protocol: ${e}`),c._protocol=e)}if(e[Mp.extensionName]){const t=e[Mp.extensionName].params,n=Up.format({[Mp.extensionName]:[t]});a.push(`Sec-WebSocket-Extensions: ${n}`),c._extensions=e}this.emit("headers",a,r),i.write(a.concat("\r\n").join("\r\n")),i.removeListener("error",qp),c.setSocket(i,s,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(c),c.on("close",(()=>{this.clients.delete(c),this._shouldEmitClose&&!this.clients.size&&process.nextTick(zp,this)}))),o(c,r)}};function zp(e){e._state=2,e.emit("close")}function qp(){this.destroy()}function Kp(e,t,n,r){n=n||jp.STATUS_CODES[t],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(n),...r},e.once("finish",e.destroy),e.end(`HTTP/1.1 ${t} ${jp.STATUS_CODES[t]}\r\n`+Object.keys(r).map((e=>`${e}: ${r[e]}`)).join("\r\n")+"\r\n\r\n"+n)}function Jp(e,t,n,r,i){if(e.listenerCount("wsClientError")){const r=new Error(i);Error.captureStackTrace(r,Jp),e.emit("wsClientError",r,n,t)}else Kp(n,r,i)}var Yp=Fa(Hp);const Xp=ic("websocketServer"),Zp={},Qp=Rl();let eh,th,nh,rh,ih;const sh=e=>{const t=Zp[e];t&&t.socket.close()};var oh={startServer:e=>{ih=new Yp({port:e,maxPayload:1048576e3}),ih.on("connection",(e=>{const t=ac();Xp(`New client connected. Registered as "${t}"`),e.id=t,Zp[t]={socket:e,activeMessage:null},eh&&eh(t),e.on("message",(t=>{if(t instanceof Buffer){const n=Zp[e.id];Qp(t,n.activeMessage,(e=>n.activeMessage=e),(t=>{if(!t.complete)return;const r=t=>{e.send(t),Xp(`Writing ${t.byteLength} bytes to socket [${n.socket.id}]: ${t.toString()}`)},i=()=>{sh(n.socket.id)};if(t.command)return Xp(`Received command from client [${n.socket.id}]: ${t.command}`),void(nh&&nh(n.socket.id,t.command,r,i));t.klMessage&&rh&&rh({send:r,terminateWebsocket:i,websocketId:n.socket.id,transmission:{sourceServiceId:t.sourceServiceId??-1,targetServiceId:t.targetServiceId??-1,rawMessage:t.rawMessage},json:t.klMessage.json})}))}})),e.on("close",(()=>{Xp(`Client disconnected: ${e.id}`),th&&th(e.id),delete Zp[e.id]})),e.on("error",(()=>{Xp(`Error on client connection: ${e.id}`)}))})),console.log(`WebSocket server is running on port ${e}`)},stopServer:()=>{ih.close((()=>{console.log("WebSocket server stopped")}))},onClientConnected:e=>{eh=e},onClientDisconnected:e=>{th=e},onClientCommand:e=>{nh=e},sendCommand:(e,t)=>{const n=Zp[e];if(!n)return Xp(`Cannot send message to unknown client [${e}]`),!1;if(t.length>=bl)return Xp("Message is too long to be a command. Use sendMessage instead."),!1;const r=Tl.encodeCommand(t);return n.socket.send(r),!0},onMessageReceived:e=>rh=e,terminateConnection:sh};const ah=ic("stopService"),ch=async e=>{const t=e.args[0];if(!t)return e.reply({error:"No service name provided"});const n=Dc.getAllServiceVersions(t);ah(`Stopping ${n.length} services with name: ${t}`);for(const e of n)await Dc.stopService({serviceName:e.info.name,version:e.info.version});const r=n.map((e=>`${e.info.name}@${e.info.version}`));e.reply({success:[r]})},lh=ic("removeService"),uh=async e=>{const t=e.args[0],n=e.args[1];if(!t)return e.reply({error:"No service name provided"});let r=Dc.getAllServiceVersions(t);n&&(r=r.filter((e=>e.info.version===n))),lh(`Removing ${r.length} service(s) with name: ${t}`);for(const e of r)await Dc.uninstallService(e.info.name,e.info.version);const i=r.map((e=>`${e.info.name}@${e.info.version}`));e.reply({success:[i]})},dh=ic("launchService"),ph=async e=>{const t=e.args[0],n=e.args[1];if(!t)return e.reply({error:"No service name provided"});if(!n)return e.reply({error:"No service version provided"});const r=`${t}@${n}/dist`;try{const i=bc();dh(`Loading service ${t}@${n} from ${i}`);const{errorMsg:s,service:o,errorCode:a}=await Dc.loadAndLaunch(i,r,!1);if(s||"started"!==o?.status)return e.reply({error:`Failed to launch service ${t}@${n}: ${s||"error-not-provided"}`,errCode:a});const c=Date.now(),l=3e4,u=async()=>{const r=o.status;return"running"===r?(dh(`Service ${t}@${n} loaded and started`),e.reply({success:[]})):(dh(`Service ${t}@${n} not yet started, status: ${r}`),"stopped"===r||"error"===r?e.reply({error:`Error launching service: "${o.errorMsg||"failed to initiate"}"`}):Date.now()-c>l?e.reply({error:"Timeout waiting for service to start"}):(dh("Retrying in 1 second..."),void setTimeout(u,1e3)))};u()}catch(r){return dh(`Error loading service ${t}@${n}: ${r?.message||r}`),e.reply({error:r?.message||"There was an error loading the service"})}},hh=ic("getMatchingServices"),fh=async e=>{const t=e.args[0],n=[],r=[];hh(`Checking for matching services: ${t.map((e=>e.name)).join(", ")}`);for(const{name:e,version:i}of t){const t=Dc.getMatchingService(e,i);t?n.push({name:e,version:i,installationPath:Dc.getServiceRootDirectory(t)}):r.push({name:e,version:i})}hh(`Found ${n.length} available services and ${r.length} missing services.`),e.reply({success:[{available:n,missing:r}]})},gh=ic("getSecretsValues");let mh;var vh=async e=>{const t=e.args[0].services;if(!mh)throw new Error("getSecretValuesFn is not set. Please call setGetSecretValuesFunction before using this function.");gh(`Checking for secrets values for services: ${t.map((e=>`${e.name}@${e.version}`)).join(", ")}`);const n=[];for(const e of t){const t=e.secrets,r=await mh({name:e.name,version:e.version,requiredSecrets:t.reduce(((e,t)=>(e[t]={optional:!1,description:""},e)),{})});n.push({name:e.name,version:e.version,secrets:t.map((e=>({name:e,value:r[e]})))})}const r=[{services:n}];e.reply({success:r})},yh=e=>{mh=e};const bh=ic("getMappedSecrets");let wh;var Sh=async e=>{const t=e.args[0].services;bh(`Getting mapped secrets for services: ${t.map((e=>`${e.name}@${e.version}`)).join(", ")}`);const n=await wh(t),r=[{services:t.map((e=>({name:e.name,version:e.version,secrets:n[e.name]||[]})))}];e.reply({success:r})},Ih=e=>{wh=e};const _h=ic("getServiceContents"),$h=({reply:e,args:t})=>{const[n]=t;_h(`Received GetServiceContents request for service ${n.serviceName} v${n.version}`);const r=Dc.getMatchingService(n.serviceName,n.version);if(r){return e({success:[{serviceName:r.info.name,serviceVersion:r.info.version,uiContent:r.info.widgetUIContents,uiContentsChecksum:r.info.uiContentChecksum}]})}_h(`Service ${n.serviceName} v${n.version} not found`),e({error:`Service ${n.serviceName} v${n.version} not found`})};let Ch=null;const kh=async e=>{const{data:t,error:n}=await(async(e,t)=>{try{const n=await fetch(e,{method:"POST",body:JSON.stringify(t)});return n.ok?{data:await n.json(),statusCode:n.status,success:!0}:{statusCode:n.status,error:await n.text(),success:!1}}catch(e){return{statusCode:500,error:e instanceof Error?e.message:"Internal server error",success:!1}}})(`${(()=>{if(!Ch)throw new Error("Unknown server URL. Please call `setServerUrl` before using the APIs.");return Ch})()}/v1/validate/validate_key`,{apiKey:e});return n?(console.warn(`Error validating Kemu API key: ${n}`),{valid:!1,features:{},error:n}):t?.features?{valid:!0,features:t.features,error:null}:{valid:!1,features:{},error:"No features returned from the server"}},Eh={},xh=async e=>{const t=(e=>{const t=Eh[e],n=Date.now()-(t?.lastCheckedAt.getTime()??0);return t&&n<3e5?t.features:null})(e);if(t)return{valid:!0,features:t,error:null};const{valid:n,features:r,error:i}=await kh(e);return n&&(Eh[e]={features:r,lastCheckedAt:new Date}),{valid:n,features:r,error:i}},Ah=ic("activeClients");let Nh={},Oh={};const Ph=(e,t)=>`${e}_${t}`,Lh=e=>Nh[e]||null,Th=(e,t)=>{const n=Ph(e,t);return Oh[n]||[]},Bh=()=>{for(const e in Nh){const t=Nh[e];if(t?.transport===Ia.WS){const e=Tl.encodeCommand(ba.ServicesListChanged);t.send(e)}}},jh=async e=>{const t=[],{serviceSessionId:n,transport:r,send:i,terminateFn:s,extraInfo:o,isDevClient:a}=e,c=e=>{console.warn(e),s&&s()};if(r===Ia.WS){if(!o.wsApiKey)return void c(`Attempted to register a WebSocket client without an API key. SessionId: ${n}`);const{valid:e,error:t}=await xh(o.wsApiKey);if(!e&&!t)return void c(`Attempted to register a WebSocket client with an invalid API key. SessionId: ${n}`);t&&Ah(`Unable to validate API Key, usage will be limited. SessionId: ${n}`)}Nh[n]={serviceSessionId:n,transport:r,isDevClient:!!a,broadcastSubscriptions:t,send:i,extraInfo:o,terminate:()=>{s&&s()},addSubscription:e=>{if(!t.some((t=>t.targetService.serviceName===e.serviceName&&t.targetService.version===e.version))){t.push({targetService:e});const r=Ph(e.serviceName,e.version);Oh[r]=Oh[r]||[];return Oh[r].some((e=>e.serviceId===n))||Oh[r].push({sendFn:i,serviceId:n}),!0}return!1},removeSubscription:e=>{const r=t.findIndex((t=>t.targetService.serviceName===e.serviceName));if(-1!==r){t.splice(r,1);const i=Ph(e.serviceName,e.version),s=Oh[i]?.findIndex((e=>e.serviceId===n));if(-1!==s&&(Oh[i].splice(s,1),!Oh[i].length)){const t=Dc.getMatchingService(e.serviceName,e.version);if(t?.info.eventEmitter&&"running"===t.status){const e=Lh(t.info.sessionId);e?.extraInfo.ipcSocketId&&eu(e?.extraInfo.ipcSocketId,ba.BroadcastEnd)}}}},removeAllSubscriptions:()=>{for(const e of t){const t=Ph(e.targetService.serviceName,e.targetService.version),r=Oh[t].findIndex((e=>e.serviceId===n));-1!==r&&Oh[t].splice(r,1)}t.length=0}},r===Ia.IPC&&(Bh(),Uh(n))},Dh=()=>{const e=Object.values(Nh);for(const t of e)if(t.transport===Ia.IPC){const e=t.extraInfo.ipcSocketId,n=Dc.getServiceBySessionId(t.serviceSessionId);if(n?.info.eventEmitter){Th(n.info.name,n.info.version).length||e&&eu(e,ba.BroadcastEnd)}}},Uh=e=>{const t=Dc.getServiceBySessionId(e);if(t?.info.eventEmitter){if(Th(t.info.name,t.info.version).length){const t=Lh(e);t?.extraInfo.ipcSocketId&&eu(t?.extraInfo.ipcSocketId,ba.BroadcastStart)}}},Mh=e=>{const t=Nh[e];delete Nh[e],t?.transport===Ia.IPC?Bh():(t?.removeAllSubscriptions(),Dh())},Fh=ic("ipc:handleIpcClientCommand"),Rh=(e,t,n)=>{const r=((e,t)=>{if(e.startsWith(ba.AcknowledgeResponse)){const n=e.split(":"),r=parseInt(n[1]),i=parseInt(n[2]);return t&&t(r,isNaN(i)?void 0:i),!0}return!1})(t,((e,t)=>{if(!e)return void Fh(`Ignoring ACK response from IPC service ${e} with no service id`);Fh(`Received ACK from IPC service ${e}. Marking as running.`);let r=e;t&&e&&e!==t&&(tu(e,t),r=t);let i=!1;t&&(i=Dc.setServiceStatus(t,"running")),i?jh({serviceSessionId:t||e,transport:Ia.IPC,send:n,extraInfo:{ipcSocketId:t}}):eu(r,ba.SendManifest)}));!r&&Fh(`Received unknown command [${t}] from service ${e}`)};let Wh={};W.platform();const Gh=async e=>{const t=e.args[0];if(Wh.chooseDirectory)try{const n=await Wh.chooseDirectory(t);return e.reply({success:[String(n).trim()]})}catch(t){return console.error(t),e.reply({error:t instanceof Error?t.message:"Unknown error"})}return e.reply({error:"This hub does not support showing file dialogs",errCode:"GUI_NOT_SUPPORTED"})},Vh=async e=>{const t=e.args[0];if(Wh.chooseFile)try{const n=await Wh.chooseFile(t);return e.reply({success:[String(n).trim()]})}catch(t){return console.error(t),e.reply({error:t instanceof Error?t.message:"Unknown error"})}return e.reply({error:"This hub does not support showing file dialogs",errCode:"GUI_NOT_SUPPORTED"})},Hh=e=>{Wh=e};var zh={},qh={},Kh={};function Jh(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Yh(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Xh(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function Zh(e,...t){if(!Xh(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Qh(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");Jh(e.outputLen),Jh(e.blockLen)}function ef(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function tf(e,t){Zh(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}Object.defineProperty(Kh,"__esModule",{value:!0}),Kh.output=Kh.exists=Kh.hash=Kh.bytes=Kh.bool=Kh.number=Kh.isBytes=void 0,Kh.number=Jh,Kh.bool=Yh,Kh.isBytes=Xh,Kh.bytes=Zh,Kh.hash=Qh,Kh.exists=ef,Kh.output=tf;const nf={number:Jh,bool:Yh,bytes:Zh,hash:Qh,exists:ef,output:tf};Kh.default=nf;var rf={};Object.defineProperty(rf,"__esModule",{value:!0}),rf.add5L=rf.add5H=rf.add4H=rf.add4L=rf.add3H=rf.add3L=rf.add=rf.rotlBL=rf.rotlBH=rf.rotlSL=rf.rotlSH=rf.rotr32L=rf.rotr32H=rf.rotrBL=rf.rotrBH=rf.rotrSL=rf.rotrSH=rf.shrSL=rf.shrSH=rf.toBig=rf.split=rf.fromBig=void 0;const sf=BigInt(2**32-1),of=BigInt(32);function af(e,t=!1){return t?{h:Number(e&sf),l:Number(e>>of&sf)}:{h:0|Number(e>>of&sf),l:0|Number(e&sf)}}function cf(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let i=0;i<e.length;i++){const{h:s,l:o}=af(e[i],t);[n[i],r[i]]=[s,o]}return[n,r]}rf.fromBig=af,rf.split=cf;const lf=(e,t)=>BigInt(e>>>0)<<of|BigInt(t>>>0);rf.toBig=lf;const uf=(e,t,n)=>e>>>n;rf.shrSH=uf;const df=(e,t,n)=>e<<32-n|t>>>n;rf.shrSL=df;const pf=(e,t,n)=>e>>>n|t<<32-n;rf.rotrSH=pf;const hf=(e,t,n)=>e<<32-n|t>>>n;rf.rotrSL=hf;const ff=(e,t,n)=>e<<64-n|t>>>n-32;rf.rotrBH=ff;const gf=(e,t,n)=>e>>>n-32|t<<64-n;rf.rotrBL=gf;const mf=(e,t)=>t;rf.rotr32H=mf;const vf=e=>e;rf.rotr32L=vf;const yf=(e,t,n)=>e<<n|t>>>32-n;rf.rotlSH=yf;const bf=(e,t,n)=>t<<n|e>>>32-n;rf.rotlSL=bf;const wf=(e,t,n)=>t<<n-32|e>>>64-n;rf.rotlBH=wf;const Sf=(e,t,n)=>e<<n-32|t>>>64-n;function If(e,t,n,r){const i=(t>>>0)+(r>>>0);return{h:e+n+(i/2**32|0)|0,l:0|i}}rf.rotlBL=Sf,rf.add=If;const _f=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0);rf.add3L=_f;const $f=(e,t,n,r)=>t+n+r+(e/2**32|0)|0;rf.add3H=$f;const Cf=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0);rf.add4L=Cf;const kf=(e,t,n,r,i)=>t+n+r+i+(e/2**32|0)|0;rf.add4H=kf;const Ef=(e,t,n,r,i)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(i>>>0);rf.add5L=Ef;const xf=(e,t,n,r,i,s)=>t+n+r+i+s+(e/2**32|0)|0;rf.add5H=xf;const Af={fromBig:af,split:cf,toBig:lf,shrSH:uf,shrSL:df,rotrSH:pf,rotrSL:hf,rotrBH:ff,rotrBL:gf,rotr32H:mf,rotr32L:vf,rotlSH:yf,rotlSL:bf,rotlBH:wf,rotlBL:Sf,add:If,add3L:_f,add3H:$f,add4L:Cf,add4H:kf,add5H:xf,add5L:Ef};rf.default=Af;var Nf={},Of={};Object.defineProperty(Of,"__esModule",{value:!0}),Of.crypto=void 0,Of.crypto="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,function(e){
|
|
2
2
|
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
3
3
|
Object.defineProperty(e,"__esModule",{value:!0}),e.randomBytes=e.wrapXOFConstructorWithOpts=e.wrapConstructorWithOpts=e.wrapConstructor=e.checkOpts=e.Hash=e.concatBytes=e.toBytes=e.utf8ToBytes=e.asyncLoop=e.nextTick=e.hexToBytes=e.bytesToHex=e.byteSwap32=e.byteSwapIfBE=e.byteSwap=e.isLE=e.rotl=e.rotr=e.createView=e.u32=e.u8=e.isBytes=void 0;const t=Of,n=Kh;e.isBytes=function(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name};e.u8=e=>new Uint8Array(e.buffer,e.byteOffset,e.byteLength);e.u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));e.createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength);e.rotr=(e,t)=>e<<32-t|e>>>t;e.rotl=(e,t)=>e<<t|e>>>32-t>>>0,e.isLE=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];e.byteSwap=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255,e.byteSwapIfBE=e.isLE?e=>e:t=>(0,e.byteSwap)(t),e.byteSwap32=function(t){for(let n=0;n<t.length;n++)t[n]=(0,e.byteSwap)(t[n])};const r=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));e.bytesToHex=function(e){(0,n.bytes)(e);let t="";for(let n=0;n<e.length;n++)t+=r[e[n]];return t};const i={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function s(e){return e>=i._0&&e<=i._9?e-i._0:e>=i._A&&e<=i._F?e-(i._A-10):e>=i._a&&e<=i._f?e-(i._a-10):void 0}e.hexToBytes=function(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;t<n;t++,i+=2){const n=s(e.charCodeAt(i)),o=s(e.charCodeAt(i+1));if(void 0===n||void 0===o){const t=e[i]+e[i+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+i)}r[t]=16*n+o}return r};function o(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function a(e){return"string"==typeof e&&(e=o(e)),(0,n.bytes)(e),e}e.nextTick=async()=>{},e.asyncLoop=async function(t,n,r){let i=Date.now();for(let s=0;s<t;s++){r(s);const t=Date.now()-i;t>=0&&t<n||(await(0,e.nextTick)(),i+=t)}},e.utf8ToBytes=o,e.toBytes=a,e.concatBytes=function(...e){let t=0;for(let r=0;r<e.length;r++){const i=e[r];(0,n.bytes)(i),t+=i.length}const r=new Uint8Array(t);for(let t=0,n=0;t<e.length;t++){const i=e[t];r.set(i,n),n+=i.length}return r};e.Hash=class{clone(){return this._cloneInto()}};const c={}.toString;e.checkOpts=function(e,t){if(void 0!==t&&"[object Object]"!==c.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)},e.wrapConstructor=function(e){const t=t=>e().update(a(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t},e.wrapConstructorWithOpts=function(e){const t=(t,n)=>e(n).update(a(t)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t},e.wrapXOFConstructorWithOpts=function(e){const t=(t,n)=>e(n).update(a(t)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t},e.randomBytes=function(e=32){if(t.crypto&&"function"==typeof t.crypto.getRandomValues)return t.crypto.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}}(Nf),Object.defineProperty(qh,"__esModule",{value:!0}),qh.shake256=qh.shake128=qh.keccak_512=qh.keccak_384=qh.keccak_256=qh.keccak_224=qh.sha3_512=qh.sha3_384=qh.sha3_256=qh.sha3_224=qh.Keccak=qh.keccakP=void 0;const Pf=Kh,Lf=rf,Tf=Nf,Bf=[],jf=[],Df=[],Uf=BigInt(0),Mf=BigInt(1),Ff=BigInt(2),Rf=BigInt(7),Wf=BigInt(256),Gf=BigInt(113);for(let e=0,t=Mf,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],Bf.push(2*(5*r+n)),jf.push((e+1)*(e+2)/2%64);let i=Uf;for(let e=0;e<7;e++)t=(t<<Mf^(t>>Rf)*Gf)%Wf,t&Ff&&(i^=Mf<<(Mf<<BigInt(e))-Mf);Df.push(i)}const[Vf,Hf]=(0,Lf.split)(Df,!0),zf=(e,t,n)=>n>32?(0,Lf.rotlBH)(e,t,n):(0,Lf.rotlSH)(e,t,n),qf=(e,t,n)=>n>32?(0,Lf.rotlBL)(e,t,n):(0,Lf.rotlSL)(e,t,n);function Kf(e,t=24){const n=new Uint32Array(10);for(let r=24-t;r<24;r++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){const r=(t+8)%10,i=(t+2)%10,s=n[i],o=n[i+1],a=zf(s,o,1)^n[r],c=qf(s,o,1)^n[r+1];for(let n=0;n<50;n+=10)e[t+n]^=a,e[t+n+1]^=c}let t=e[2],i=e[3];for(let n=0;n<24;n++){const r=jf[n],s=zf(t,i,r),o=qf(t,i,r),a=Bf[n];t=e[a],i=e[a+1],e[a]=s,e[a+1]=o}for(let t=0;t<50;t+=10){for(let r=0;r<10;r++)n[r]=e[t+r];for(let r=0;r<10;r++)e[t+r]^=~n[(r+2)%10]&n[(r+4)%10]}e[0]^=Vf[r],e[1]^=Hf[r]}n.fill(0)}qh.keccakP=Kf;class Jf extends Tf.Hash{constructor(e,t,n,r=!1,i=24){if(super(),this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=r,this.rounds=i,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,(0,Pf.number)(n),0>=this.blockLen||this.blockLen>=200)throw new Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,Tf.u32)(this.state)}keccak(){Tf.isLE||(0,Tf.byteSwap32)(this.state32),Kf(this.state32,this.rounds),Tf.isLE||(0,Tf.byteSwap32)(this.state32),this.posOut=0,this.pos=0}update(e){(0,Pf.exists)(this);const{blockLen:t,state:n}=this,r=(e=(0,Tf.toBytes)(e)).length;for(let i=0;i<r;){const s=Math.min(t-this.pos,r-i);for(let t=0;t<s;t++)n[this.pos++]^=e[i++];this.pos===t&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;const{state:e,suffix:t,pos:n,blockLen:r}=this;e[n]^=t,128&t&&n===r-1&&this.keccak(),e[r-1]^=128,this.keccak()}writeInto(e){(0,Pf.exists)(this,!1),(0,Pf.bytes)(e),this.finish();const t=this.state,{blockLen:n}=this;for(let r=0,i=e.length;r<i;){this.posOut>=n&&this.keccak();const s=Math.min(n-this.posOut,i-r);e.set(t.subarray(this.posOut,this.posOut+s),r),this.posOut+=s,r+=s}return e}xofInto(e){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(e)}xof(e){return(0,Pf.number)(e),this.xofInto(new Uint8Array(e))}digestInto(e){if((0,Pf.output)(e,this),this.finished)throw new Error("digest() was already called");return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(e){const{blockLen:t,suffix:n,outputLen:r,rounds:i,enableXOF:s}=this;return e||(e=new Jf(t,n,r,s,i)),e.state32.set(this.state32),e.pos=this.pos,e.posOut=this.posOut,e.finished=this.finished,e.rounds=i,e.suffix=n,e.outputLen=r,e.enableXOF=s,e.destroyed=this.destroyed,e}}qh.Keccak=Jf;const Yf=(e,t,n)=>(0,Tf.wrapConstructor)((()=>new Jf(t,e,n)));qh.sha3_224=Yf(6,144,28),qh.sha3_256=Yf(6,136,32),qh.sha3_384=Yf(6,104,48),qh.sha3_512=Yf(6,72,64),qh.keccak_224=Yf(1,144,28),qh.keccak_256=Yf(1,136,32),qh.keccak_384=Yf(1,104,48),qh.keccak_512=Yf(1,72,64);const Xf=(e,t,n)=>(0,Tf.wrapXOFConstructorWithOpts)(((r={})=>new Jf(t,e,void 0===r.dkLen?n:r.dkLen,!0)));qh.shake128=Xf(31,168,16),qh.shake256=Xf(31,136,32);const{sha3_512:Zf}=qh,Qf=(e=4,t=Math.random)=>{let n="";for(;n.length<e;)n+=Math.floor(36*t()).toString(36);return n};function eg(e){let t=0n;for(const n of e.values()){t=(t<<8n)+BigInt(n)}return t}const tg=(e="")=>eg(Zf(e)).toString(36).slice(1),ng=Array.from({length:26},((e,t)=>String.fromCharCode(t+97))),rg=({globalObj:e=(void 0!==Ma?Ma:"undefined"!=typeof window?window:{}),random:t=Math.random}={})=>{const n=Object.keys(e).toString(),r=n.length?n+Qf(32,t):Qf(32,t);return tg(r).substring(0,32)},ig=e=>()=>e++,sg=({random:e=Math.random,counter:t=ig(Math.floor(476782367*e())),length:n=24,fingerprint:r=rg({random:e})}={})=>function(){const i=(e=>ng[Math.floor(e()*ng.length)])(e),s=Date.now().toString(36),o=t().toString(36),a=Qf(n,e);return`${i+tg(`${s+a+o+r}`).substring(1,n)}`},og=sg();zh.getConstants=()=>({defaultLength:24,bigLength:32}),zh.init=sg,zh.createId=og,zh.bufToBigInt=eg,zh.createCounter=ig,zh.createFingerprint=rg,zh.isCuid=(e,{minLength:t=2,maxLength:n=32}={})=>{const r=e.length,i=/^[0-9a-z]+$/;try{if("string"==typeof e&&r>=t&&r<=n&&i.test(e))return!0}finally{}return!1};const{createId:ag,init:cg,getConstants:lg,isCuid:ug}=zh;var dg=ag;const pg=ic("getUniqueId"),hg=({reply:e,sourceServiceId:t})=>{pg(`Generating unique id for service "${t}"`);return e({success:[dg()]})},fg=ic("getActiveServices"),gg=async({transport:e,sourceServiceId:t,reply:n})=>{if(fg(`Received GetServices request from ${e} [${t}]`),e===Ia.WS){let e=Dc.getActiveServices();const r=Lh(t);if(!r)return n({error:"Client not found",errCode:"CLIENT_NOT_FOUND"});let i=[];if(r.transport===Ia.WS){if(!r?.extraInfo.wsApiKey)return n({error:"Client does not have an API key",errCode:"CLIENT_NO_API_KEY"});const t=e.filter(Dc.isInternalKemuService),s=e.filter((e=>e.devMode&&Dc.isNotInternalKemuService(e))),o=e.filter((e=>Dc.isOfficialKemuService(e)&&Dc.isNotInternalKemuService(e)&&Dc.isNotDevService(e))).sort(((e,t)=>e.name.localeCompare(t.name))),a=await(async e=>{const{features:t}=await xh(e);return t})(r.extraInfo.wsApiKey),c=a?.hub_services??0,l=o.slice(0,-1!==c?c:o.length);i=o.slice(c).map((e=>({name:e.name,version:e.version,svgIcon:e.svgIcon,color:e.color,description:e.description,title:e.title,shortTitle:e.shortTitle}))),e=[...t,...s,...l]}const s=Dc.getFailedServices().map((e=>({name:e.name,version:e.version,description:e.description,title:e.title,status:e.status,errorMsg:e.errorMsg,errorCode:e.errorCode,internal:Dc.isInternalKemuService(e),svgIcon:e.svgIcon,color:e.color,shortTitle:e.shortTitle})));n({success:[{available:e.map((e=>{const{widgetUIContents:t,...n}=e;return{...n}})),failed:s,installed:i}]})}},mg=v(R(import.meta.url)),vg=ic("hub"),yg=new function(e){const t={};let n=console.log;const r={};let i=e||String(Date.now());const s={},o=e=>!s[e],a=(e,t,n,r,i,s)=>{let a=Sl?new ArrayBuffer(0):Buffer.alloc(0);const c={json:{functionName:e,args:s.success?s.success:[s],messageId:t,type:s.success?"response":"error"}};return o(r)&&(a=su.encode(c,n,r)),i(a,{msg:c,sourceServiceId:n,targetServiceId:r})};return{setLogger:e=>{n=e},processMessage:(e,i,s,o)=>{if(!o)return!1;const c=o;if(t[c.messageId]){const e=t[c.messageId];return e&&(clearTimeout(e.timer),e.fulfilled||(e.fulfilled=!0,"response"===c.type?e.resolve(c.args):"error"===c.type&&e.reject(c.args[0])),delete t[c.messageId]),!0}if("execute"!==c.type&&n&&n(`No pending execution found for message id "${c.messageId}"`),"execute"===c.type){const t=r[c.functionName];if(t){const n=e=>{a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,e)};t({transport:e,args:c.args,reply:n,messageId:c.messageId,sourceServiceId:s.sourceServiceId,send:i})}else{const e=`Function "${c.functionName}" not found.`;n&&n(e),a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,{error:e,errCode:"FNC_NOT_FOUND"})}return!0}return!1},execute:async(e,r,s,a,c,l)=>{if(!s){const e="No send buffer function provided.";throw n&&n(e),e}ou+=1;const u=`${i}-${ou}-exec-${e.substring(0,10)}`,d={messageId:u,functionName:e,send:s,sourceServiceId:a,targetServiceId:c,args:r||[],fulfilled:!1,resolve:()=>{},reject:()=>{}};d.promise=new Promise(((e,t)=>{d.resolve=e,d.reject=t}));let p=Sl?new ArrayBuffer(0):Buffer.alloc(0);const h={json:{functionName:e,args:r,messageId:u,type:"execute"}};o(c)&&(p=su.encode(h,a,c)),t[u]=d,n&&n(`Calling remote function "${e}" with message id "${u}"`);const f="true"===process.env.NO_INVOKE_TIMEOUT;return l?.async?(d.fulfilled=!0,d.resolve([void 0]),delete t[u]):0===l?.timeout||f||(d.timer=setTimeout((()=>{n&&n(`Remote function ${u} timed out`);const r=t[u];r&&!r.fulfilled&&(r.fulfilled=!0,d.reject(`Function ${e} Timed out`)),delete t[u]}),l?.timeout||3e4)),s(p,{sourceServiceId:a,targetServiceId:c,msg:h}),d.promise},sendResponse:a,registerFunction:(e,t)=>{r[e]=t},getTransportSendFunction:e=>{const n=t[e];return n?n.send:null},setServiceName:e=>{i=e},getPendingExecutions:()=>t,rejectAllPending:e=>{Object.keys(t).forEach((n=>{const r=t[n];r&&!r.fulfilled&&(clearTimeout(r.timer),r.fulfilled=!0,r.reject(e),delete t[n])}))},broadcast:(e,t,r,s)=>{ou+=1;const a=`${i}-${ou}-multicast-${e.substring(0,10)}`;let c=Sl?new ArrayBuffer(0):Buffer.alloc(0);const l={json:{functionName:e,args:t,messageId:a,type:"execute"}};let u=o(r[0].serviceId);u&&(c=su.encode(l,s,r[0].serviceId));for(let t=0;t<r.length;t++)try{const i=r[t];n&&n(`Broadcasting function "${e}" with message id "${a}" to client [${i.serviceId}]`),0!==t&&(u=o(i.serviceId),u&&(c=su.patchEncodedHeader(c,{toServiceId:i.serviceId}))),i.sendFn(c,{msg:l,sourceServiceId:s,targetServiceId:i.serviceId})}catch(e){n&&n(`Error broadcasting to client at index ${t}`)}},disableServiceEncoding:(e,t)=>{s[e]=t}}}("hub");yg.setLogger(vg);const bg=(e,t)=>{const{transmission:n}=t;if(0!==n.targetServiceId){const r=Lh(n.targetServiceId);if(!r)return vg(`Service [${e}] ${n.sourceServiceId} is sending data to an unknown service ["${n.targetServiceId}"]`),!0;r.transport,Ia.IPC;const i=t.json?.messageId;return vg(`Forwarding message from ${n.sourceServiceId} to ${n.targetServiceId}, msgId: ${i}`),r.send(n.rawMessage,{sourceServiceId:n.sourceServiceId,targetServiceId:n.targetServiceId,msg:{json:t.json}}),!0}return!1},wg=({sourceServiceId:e,args:t})=>{const n=Dc.getServiceBySessionId(e);if(n){const r=Th(n.info.name,n.info.version),i=Th(n.info.name,"*");if(!r.length&&!i.length)return;const s=[...r,...i],o=t[0],a={outputs:o.outputs,variantId:o.variantId,source:{serviceName:n.info.name,serviceVersion:n.info.version,sessionId:e}};yg.broadcast(wa.BroadcastEvent,[a],s,0)}},Sg=e=>{const{send:t,transmission:n,json:r}=e;vg(`Raw message Id received from WS: ${r?.messageId}`);bg(Ia.WS,e)||yg.processMessage(Ia.WS,t,n,r)},Ig=e=>{const t=(n=e,`${ba.SocketAcknowledge}${n}`);var n;oh.sendCommand(e,t)},_g=(e,t)=>{vg(`Received unknown command [${t}] from service ${e}`)},$g=async e=>{const{args:t,sourceServiceId:n,send:r,reply:i}=e,{apiKey:s}=t[0],o=n;await jh({serviceSessionId:n,transport:Ia.WS,send:r,terminateFn:()=>{oh.terminateConnection(n)},extraInfo:{websocketId:o,wsApiKey:s}}),i({success:[]})},Cg=e=>{vg(`WS Client ${e} disconnected`),Mh(e)},kg=async({sourceServiceId:e,args:t,transport:n,send:r})=>{if(n!==Ia.IPC){var i;vg(`Received manifest from non IPC service ${e}.`)}else{const n=t[0];if(n.devMode){const t=Dc.getMatchingDevService(n.name,n.version,"stopped");if(t){vg(`Found matching previous service ${t.info.name} (${t.info.version}). Reactivating previous client with session id ${t.info.sessionId}`);const s=Lh(t.info.sessionId);if(!s)return void vg(`Could not find previous client instance for ${t.info.name} (${t.info.version}). Aborting manifest injection`);s.send=r,Nh[i=e]?delete Nh[i]:Ah(`Could not find source client with session id ${i}`),tu(e,t.info.sessionId);const o=await gc(n,n.path);t.info={...t.info,...o},vg(`Updating manifest for dev service ${t.info.sessionId}`),Dc.setServiceManifest(t.info.sessionId,o,"running"),vg(`Asking service ${e} to assume previous session id ${t.info.sessionId}`),eu(t.info.sessionId,(e=>`${ba.AssumeSession}${e}`)(t.info.sessionId)),(e=>{const t=Nh[e];t?t.isDevClient?(t.disconnected=!1,t.transport===Ia.IPC&&(Bh(),Uh(e))):Ah(`Client with session id ${e} is not a dev client`):Ah(`Could not find source client with session id ${e}`)})(t.info.sessionId)}else{Dc.addDevService(e,n,"running");const t=Lh(e);t?t.isDevClient=!0:jh({serviceSessionId:e,transport:Ia.IPC,send:r,extraInfo:{ipcSocketId:e},isDevClient:!0})}return}vg(`Received manifest from non dev service ${e} [${n.name}@(${n.version})]. Ignoring...`)}};var Eg=async e=>{vg("Starting Kemu Hub...");const t=e?.ipc?.appSpace||"kemu.",n=e?.ipc?.id||"widgets";if(!e.serviceUrl)throw new Error("Missing service url, please set the `apiUrl` option.");const r=e.serviceUrl;Ch=r,yg.registerFunction(wa.GetServiceContents,$h),yg.registerFunction(wa.GetServices,gg),yg.registerFunction(wa.ShowSecretsConfigScreen,(async({args:t,reply:n})=>{const[{name:r,version:i}]=t;e?.onShowSecretsScreen?(await e.onShowSecretsScreen(r,i),n({success:[]})):n({error:"This hub does not support showing secrets configuration screens",errCode:"GUI_NOT_SUPPORTED"})})),yg.registerFunction(wa.UnsubscribeFromService,(({transport:e,reply:t,args:n,sourceServiceId:r})=>{if(e===Ia.WS){const[e]=n,i=Lh(r);if(!i)return t({error:`Session id "${r}" not found`});vg(`Service ${r} unsubscribing from "${e.targetService.serviceName} (${e.targetService.version})"`),t({success:[]}),i?.removeSubscription({serviceName:e.targetService.serviceName,version:e.targetService.version})}})),yg.registerFunction(wa.SubscribeToService,(({transport:e,reply:t,args:n,sourceServiceId:r})=>{if(e===Ia.WS){const[e]=n,i=Lh(r),s=e.targetService;if(!i)return t({error:`Session id "${r}" not found`});if(vg(`Service ${r} subscribing to "${s.serviceName} (${s.version})"`),"hub"===s.serviceName)return i.addSubscription(s),void t({success:[]});if(!i.addSubscription(s))return vg(`Service ${r} already subscribed to "${s.serviceName} (${s.version})", ignoring request.`),t({success:[]});const o=Dc.getMatchingService(s.serviceName,s.version);if(!o)return vg(`Service ${s.serviceName} ${s.version} not active yet`),t({success:[]});if(!o.info.eventEmitter)return vg(`Service ${s.serviceName} ${s.version} does not have an event emitter, removing subscription`),i.removeSubscription(s),t({error:`Service "${s.serviceName} (${s.version})" does not produce events`});const a=Lh(o.info.sessionId);return a?.extraInfo.ipcSocketId&&(vg(`Sending Broadcast START command to service ${o.info.sessionId}`),eu(a?.extraInfo.ipcSocketId,ba.BroadcastStart)),t({success:[]})}})),yg.registerFunction("stopService",ch),yg.registerFunction("removeService",uh),yg.registerFunction("launchService",ph),yg.registerFunction("getMatchingServices",fh),yg.registerFunction("getSecretsValues",vh),yg.registerFunction(wa.GetMappedSecrets,Sh),yg.registerFunction(wa.BroadcastEvent,wg),yg.registerFunction(wa.ServiceManifest,kg),yg.registerFunction(wa.ChooseDirectoryDialog,Gh),yg.registerFunction(wa.ChooseFileDialog,Vh),yg.registerFunction(wa.GetUniqueId,hg),yg.registerFunction(wa.SocketAckResponse,$g),Ql((e=>{const{send:t,transmission:n,json:r}=e;vg(`Raw message Id received from IPC: ${r?.messageId}`);bg(Ia.IPC,e)||yg.processMessage(Ia.IPC,t,n,r)})),oh.onMessageReceived(Sg),oh.onClientConnected(Ig),oh.onClientCommand(_g),oh.onClientDisconnected(Cg),nu(Rh),Xl((e=>{const t=(e=>`${ba.IpcAcknowledge}${e}`)(e);eu(e,t)})),Zl((e=>{vg(`IPC socket [${e}] disconnected`);const t=Lh(e);if(t){vg(`Found matching service for disconnected socket. SessionId: ${t.serviceSessionId}`);const e=Dc.getServiceBySessionId(t.serviceSessionId);Dc.setServiceStatus(t.serviceSessionId,"stopped"),e?.devMode?(t.disconnected=!0,Bh()):Mh(t.serviceSessionId)}})),await Yl({ipcAppSpace:t,ipcId:n}),e?.ws?.disabled||await oh.startServer(e?.ws?.port||5368);const i=e?.defaultServicesPath||g.resolve(mg,"defaultServices"),s=process.env.DEV_SESSION_ID;Dc.setHubIpcConfig({recipePath:e?.recipeRootPath,appSpace:t,id:n}),e?.servicesInstallPath&&(e=>{vc=e})(e.servicesInstallPath),e?.testServicesInstallPath&&(e=>{yc=e})(e.testServicesInstallPath);const o=bc(),a=yc||lc,c=async({requiredSecrets:e})=>{const t=Object.keys(e).reduce(((e,t)=>({...e,[t]:process.env[t]})),{});return t.__KEMU_USER_SERVICES_PATH=o,t.__KEMU_USER_TEST_SERVICES_PATH=a,t.__KEMU_SERVICE_URL=r,t},l=async e=>e.reduce(((e,t)=>({...e,[t.name]:[]})),{});e?.getServiceSecretsFn?(Dc.setGetSecretsFunction(e.getServiceSecretsFn),yh(e.getServiceSecretsFn)):(Dc.setGetSecretsFunction(c),yh(c)),Ih(e?.getMappedSecretsFn?e.getMappedSecretsFn:l),Dc.setSpawnNodeFunction(e?.spawnFn?e.spawnFn:({args:e,options:t})=>{const n={...process.env};return G("node",e||[],{...t,env:{...n,...t?.env}})}),e?.noDefaultServices||await Dc.loadServices(i,{fixedSession:s?parseInt(s):void 0,singleServiceName:process.env.DEV_SINGLE_SERVICE_NAME,internalServices:!0}),null!==e?.servicesInstallPath&&(await mc(o)||await b(o,{recursive:!0}),await Dc.loadServices(o,{internalServices:!1,singleServiceName:process.env.DEV_SINGLE_SERVICE_NAME}));const u=process.env.DEV_NO_SPAWN_LIST?.split(",");await Dc.launchServices({noSpawningList:u||[]}),vg("Kemu Hub started"),(e?.onChooseDirectory||e?.onChooseFile)&&Hh({chooseDirectory:e.onChooseDirectory,chooseFile:e.onChooseFile})},xg=e=>{if(e===Ia.WS)return{handleWebsocketConnectionEvent:Ig,handleWebsocketClientDisconnectionEvent:Cg,handleWebsocketMessage:Sg,handleWebsocketClientCommand:_g,getRemoteInvoke:()=>yg}},Ag=(e=[])=>{let t;const n=new Promise((n=>{const r=()=>{if(Dc.getAllServices().every((e=>"running"===e.status))){if(e.every((e=>"running"===Dc.getMatchingService(e.name,e.version)?.status)))return n()}t=setTimeout(r,100)};r()}));return n.abort=()=>{t&&clearTimeout(t)},n};let Ng;const Og=Co("run"),Pg=Ca(),Lg=1e3,Tg=C(process.argv.slice(2));global.ImageData=q,we({createCanvas:(e,t)=>J(e,t),loadImage:async e=>{const t=await K(e),n=J(t.width,t.height).getContext("2d");n.drawImage(t,0,0,t.width,t.height);return n.getImageData(0,0,t.width,t.height)}});const Bg={createImageDataLike:(e,t,n,r="srgb")=>{let i;return i=e instanceof Uint8ClampedArray?e:new Uint8ClampedArray(e),{data:i,width:t,height:n,colorSpace:r,_kemuType:de.ImageData}},loadImageFile:async e=>{const t=await K(e),n=J(t.width,t.height).getContext("2d");n.drawImage(t,0,0,t.width,t.height);return n.getImageData(0,0,t.width,t.height)},encodeImageData:async(e,t="jpeg",n)=>{const r=J(e.width,e.height);let i;return r.getContext("2d").putImageData(e,0,0),i="png"===t?await r.encode(t):await r.encode(t,n),i}};var jg={start:async r=>{r=r||{};const i=r?.recipePath||Tg.recipePath||process.env.KEMU_EDGE_RECIPE_PATH||process.cwd();if(!i)throw new Error("`recipePath` not provided. Please specify it in the config object, via a command line argument [--recipePath] or as an environment variable [KEMU_EDGE_RECIPE_PATH].");e({path:V(H(i),".env")});const s=r.apiKey||process.env.KEMU_API_KEY;if(!s)throw new Error("Missing API key. Please provide it via config.apiKey or KEMU_API_KEY environment variable.");const o=i.endsWith(".json"),a=o?z(i):i,c=o?i:V(a,"recipe.json"),l=(e=>{try{return JSON.parse(e||"")}catch(e){return null}})(await t(H(c),"utf-8"));if(!l)throw new Error("Failed to parse recipe file");const{serviceUrl:u,apiKey:d}=((e,t)=>{const n=Fs(e,t),r=Buffer.from(n,"base64").toString("utf8"),[i,s]=r.split("<@>");if(!s||!i)throw new Error("Invalid API key.");return{serviceUrl:s,apiKey:i}})(l,s);await zi();const p={id:l.id||String(Date.now()),version:1,author:""};(e=>{Ir=e})(console);const h=xg(ve.WS),f=(e,t)=>{if(t)h?.handleWebsocketMessage({send:m,transmission:{rawMessage:e,sourceServiceId:t.sourceServiceId,targetServiceId:t.targetServiceId},json:t.msg?.json});else{const t=e instanceof Buffer?e.toString():e;h?.handleWebsocketClientCommand(Lg,t)}},g=(po={instanceServiceId:Lg,sendBuf:f,sendCmd:f,triggerOnCommand:(...e)=>ho(...e),triggerOnConnected:()=>fo(),triggerOnDisconnected:()=>go(),triggerOnMessageReceived:(...e)=>mo(...e)},po);const m=(e,t)=>{if(t)g.triggerOnMessageReceived({send:f,transmission:{rawMessage:e,sourceServiceId:t.sourceServiceId,targetServiceId:t.targetServiceId},json:t.msg.json});else{const t=e instanceof Buffer?e.toString():e;g.triggerOnCommand(t)}},v=Ea(),y=h.getRemoteInvoke();v.disableServiceEncoding(0,!0),y.disableServiceEncoding(Lg,!0);const b=Object.values(l.blocks[le].gates).filter((e=>e.type===He.hubService&&e.state.service&&!0!==e.state.service?.webOnly)),w=b.map((e=>{const t=e.state.service;return{name:t.name,version:t.version}})),S=V(a,"services"),I=await n(S).then((()=>!0)).catch((()=>!1));await Eg({recipeRootPath:a,servicesInstallPath:I?V(a,"services"):null,noDefaultServices:!0,ws:{disabled:!0},serviceUrl:u,ipc:{appSpace:"kemu-runner.",id:p.id}}),Og("Waiting for services to run"),await Ag(w),Og("All services are running"),js(Pg);const _=await Ls(l,"runner",p.version,p.author,Is.Desktop);return Ng=_,ka(_),await _a(d),new Promise(((e,t)=>{var n;$a("acknowledged",(async()=>{await Pg.getServices();const{failed:n,sendToInputWidget:r,invokeRecipeLoadedWidgets:i}=await Bs(_);if(n.length>0){const e=`Some widgets failed to initialize: ${n.join(", ")}`;return t(e)}await i().catch((e=>{console.error("Error invoking recipe loaded widgets: ",e)})),Og("Recipe started"),e({sendToInputWidget:r})})),g.triggerOnConnected(),g.triggerOnCommand((n=Lg,`${fe.SocketAcknowledge}${n}`))}))},terminate:async()=>{Ng&&await Ts(Ng)},onVariableChange:(e,t)=>vr(e,t)};void 0===typeof process.env.BLOCKS_INSTALL_DIR&&console.warn("Missing `BLOCKS_INSTALL_DIR` env var");process.env.BLOCKS_INSTALL_DIR;export{de as DataType,jg as default,Bg as utils};
|