!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){function e(e){var t=this.constructor;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){return t.reject(n)})})}function t(e){return new this(function(t,n){function r(e,n){if(n&&("object"==typeof n||"function"==typeof n)){var f=n.then;if("function"==typeof f)return void f.call(n,function(t){r(e,t)},function(n){o[e]={status:"rejected",reason:n},0==--i&&t(o)})}o[e]={status:"fulfilled",value:n},0==--i&&t(o)}if(!e||"undefined"==typeof e.length)return n(new TypeError(typeof e+" "+e+" is not iterable(cannot read property Symbol(Symbol.iterator))"));var o=Array.prototype.slice.call(e);if(0===o.length)return t([]);for(var i=o.length,f=0;o.length>f;f++)r(f,o[f])})}function n(e,t){this.name="AggregateError",this.errors=e,this.message=t||""}function r(e){var t=this;return new t(function(r,o){if(!e||"undefined"==typeof e.length)return o(new TypeError("Promise.any accepts an array"));var i=Array.prototype.slice.call(e);if(0===i.length)return o();for(var f=[],u=0;i.length>u;u++)try{t.resolve(i[u]).then(r)["catch"](function(e){f.push(e),f.length===i.length&&o(new n(f,"All promises were rejected"))})}catch(c){o(c)}})}function o(e){return!(!e||"undefined"==typeof e.length)}function i(){}function f(e){if(!(this instanceof f))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=undefined,this._deferreds=[],s(e,this)}function u(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,f._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var r;try{r=n(e._value)}catch(o){return void a(t.promise,o)}c(t.promise,r)}else(1===e._state?c:a)(t.promise,e._value)})):e._deferreds.push(t)}function c(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof f)return e._state=3,e._value=t,void l(e);if("function"==typeof n)return void s(function(e,t){return function(){e.apply(t,arguments)}}(n,t),e)}e._state=1,e._value=t,l(e)}catch(r){a(e,r)}}function a(e,t){e._state=2,e._value=t,l(e)}function l(e){2===e._state&&0===e._deferreds.length&&f._immediateFn(function(){e._handled||f._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;n>t;t++)u(e,e._deferreds[t]);e._deferreds=null}function s(e,t){var n=!1;try{e(function(e){n||(n=!0,c(t,e))},function(e){n||(n=!0,a(t,e))})}catch(r){if(n)return;n=!0,a(t,r)}}n.prototype=Error.prototype;var d=setTimeout;f.prototype["catch"]=function(e){return this.then(null,e)},f.prototype.then=function(e,t){var n=new this.constructor(i);return u(this,new function(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}(e,t,n)),n},f.prototype["finally"]=e,f.all=function(e){return new f(function(t,n){function r(e,o){try{if(o&&("object"==typeof o||"function"==typeof o)){var u=o.then;if("function"==typeof u)return void u.call(o,function(t){r(e,t)},n)}i[e]=o,0==--f&&t(i)}catch(c){n(c)}}if(!o(e))return n(new TypeError("Promise.all accepts an array"));var i=Array.prototype.slice.call(e);if(0===i.length)return t([]);for(var f=i.length,u=0;i.length>u;u++)r(u,i[u])})},f.any=r,f.allSettled=t,f.resolve=function(e){return e&&"object"==typeof e&&e.constructor===f?e:new f(function(t){t(e)})},f.reject=function(e){return new f(function(t,n){n(e)})},f.race=function(e){return new f(function(t,n){if(!o(e))return n(new TypeError("Promise.race accepts an array"));for(var r=0,i=e.length;i>r;r++)f.resolve(e[r]).then(t,n)})},f._immediateFn="function"==typeof setImmediate&&function(e){setImmediate(e)}||function(e){d(e,0)},f._unhandledRejectionFn=function(e){void 0!==console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)};var p=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if("undefined"!=typeof global)return global;throw Error("unable to locate global object")}();"function"!=typeof p.Promise?p.Promise=f:(p.Promise.prototype["finally"]||(p.Promise.prototype["finally"]=e),p.Promise.allSettled||(p.Promise.allSettled=t),p.Promise.any||(p.Promise.any=r))});var WConverwsClient=function(t){function e(){return"undefined"!=typeof window&&void 0!==window.document}function r(t){let e=Object.prototype.toString.call(t);return"[object Function]"===e||"[object AsyncFunction]"===e}function n(n){let o=null;n.url||(n.url="ws://localhost:8080"),n.token||(n.token="*");let i,u=function(){let t=e(),r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope;return t=t||r,{isBrowser:t,isWebWorker:r,isNode:"undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node}}().isBrowser;i=u?("undefined"!=typeof self?self:e()?window:"undefined"!=typeof global?global:null).WebSocket:t;try{o=new i(n.url+"/?token="+n.token)}catch(t){o=null}if(null===o)return{error:"can not new MixWS"};function a(){r(n.open)&&n.open()}function c(){r(n.close)&&n.close()}function s(t){r(n.message)&&n.message(t)}function f(t){r(n.error)&&n.error(t),o.close()}return u?(o.onopen=a,o.onmessage=function(t){s(t.data)},o.onclose=c,o.onerror=f):(o.on("open",a),o.on("message",s),o.on("close",c),o.on("error",f)),o}var o=Array.isArray,i="object"==typeof global&&global&&global.Object===Object&&global,u="object"==typeof self&&self&&self.Object===Object&&self,a=i||u||Function("return this")(),c=a.Symbol,s=Object.prototype,f=s.hasOwnProperty,l=s.toString,p=c?c.toStringTag:void 0;var h=Object.prototype.toString;var d="[object Null]",y="[object Undefined]",v=c?c.toStringTag:void 0;function g(t){return null==t?void 0===t?y:d:v&&v in Object(t)?function(t){var e=f.call(t,p),r=t[p];try{t[p]=void 0;var n=!0}catch(t){}var o=l.call(t);return n&&(e?t[p]=r:delete t[p]),o}(t):function(t){return h.call(t)}(t)}function b(t){return null!=t&&"object"==typeof t}var _="[object Symbol]";function m(t){return"symbol"==typeof t||b(t)&&g(t)==_}var A=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,w=/^\w*$/;function j(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}var x="[object AsyncFunction]",O="[object Function]",S="[object GeneratorFunction]",U="[object Proxy]";function B(t){if(!j(t))return!1;var e=g(t);return e==O||e==S||e==x||e==U}var E,k=a["__core-js_shared__"],C=(E=/[^.]+$/.exec(k&&k.keys&&k.keys.IE_PROTO||""))?"Symbol(src)_1."+E:"";var M=Function.prototype.toString;var z=/^\[object .+?Constructor\]$/,$=Function.prototype,N=Object.prototype,L=$.toString,P=N.hasOwnProperty,F=RegExp("^"+L.call(P).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function W(t){return!(!j(t)||(e=t,C&&C in e))&&(B(t)?F:z).test(function(t){if(null!=t){try{return M.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t));var e}function I(t,e){var r=function(t,e){return null==t?void 0:t[e]}(t,e);return W(r)?r:void 0}var T=I(Object,"create");var R=Object.prototype.hasOwnProperty;var D=Object.prototype.hasOwnProperty;function G(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}function H(t,e){return t===e||t!=t&&e!=e}function Z(t,e){for(var r=t.length;r--;)if(H(t[r][0],e))return r;return-1}G.prototype.clear=function(){this.__data__=T?T(null):{},this.size=0},G.prototype.delete=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e},G.prototype.get=function(t){var e=this.__data__;if(T){var r=e[t];return"__lodash_hash_undefined__"===r?void 0:r}return R.call(e,t)?e[t]:void 0},G.prototype.has=function(t){var e=this.__data__;return T?void 0!==e[t]:D.call(e,t)},G.prototype.set=function(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=T&&void 0===e?"__lodash_hash_undefined__":e,this};var q=Array.prototype.splice;function V(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}V.prototype.clear=function(){this.__data__=[],this.size=0},V.prototype.delete=function(t){var e=this.__data__,r=Z(e,t);return!(r<0)&&(r==e.length-1?e.pop():q.call(e,r,1),--this.size,!0)},V.prototype.get=function(t){var e=this.__data__,r=Z(e,t);return r<0?void 0:e[r][1]},V.prototype.has=function(t){return Z(this.__data__,t)>-1},V.prototype.set=function(t,e){var r=this.__data__,n=Z(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this};var J=I(a,"Map");function X(t,e){var r,n,o=t.__data__;return("string"==(n=typeof(r=e))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==r:null===r)?o["string"==typeof e?"string":"hash"]:o.map}function K(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}K.prototype.clear=function(){this.size=0,this.__data__={hash:new G,map:new(J||V),string:new G}},K.prototype.delete=function(t){var e=X(this,t).delete(t);return this.size-=e?1:0,e},K.prototype.get=function(t){return X(this,t).get(t)},K.prototype.has=function(t){return X(this,t).has(t)},K.prototype.set=function(t,e){var r=X(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this};var Q="Expected a function";function Y(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError(Q);var r=function(){var n=arguments,o=e?e.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var u=t.apply(this,n);return r.cache=i.set(o,u)||i,u};return r.cache=new(Y.Cache||K),r}Y.Cache=K;var tt,et,rt,nt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ot=/\\(\\)?/g,it=(tt=function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(nt,(function(t,r,n,o){e.push(n?o.replace(ot,"$1"):r||t)})),e},et=Y(tt,(function(t){return 500===rt.size&&rt.clear(),t})),rt=et.cache,et),ut=it;var at=1/0,ct=c?c.prototype:void 0,st=ct?ct.toString:void 0;function ft(t){if("string"==typeof t)return t;if(o(t))return function(t,e){for(var r=-1,n=null==t?0:t.length,o=Array(n);++r<n;)o[r]=e(t[r],r,t);return o}(t,ft)+"";if(m(t))return st?st.call(t):"";var e=t+"";return"0"==e&&1/t==-at?"-0":e}function lt(t){return null==t?"":ft(t)}function pt(t,e){return o(t)?t:function(t,e){if(o(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!m(t))||w.test(t)||!A.test(t)||null!=e&&t in Object(e)}(t,e)?[t]:ut(lt(t))}var ht=1/0;function dt(t){if("string"==typeof t||m(t))return t;var e=t+"";return"0"==e&&1/t==-ht?"-0":e}function yt(t,e,r){var n=null==t?void 0:function(t,e){for(var r=0,n=(e=pt(e,t)).length;null!=t&&r<n;)t=t[dt(e[r++])];return r&&r==n?t:void 0}(t,e);return void 0===n?r:n}var vt=/\s/;var gt=/^\s+/;function bt(t){return t?t.slice(0,function(t){for(var e=t.length;e--&&vt.test(t.charAt(e)););return e}(t)+1).replace(gt,""):t}var _t=NaN,mt=/^[-+]0x[0-9a-f]+$/i,At=/^0b[01]+$/i,wt=/^0o[0-7]+$/i,jt=parseInt;function xt(t){if("number"==typeof t)return t;if(m(t))return _t;if(j(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=j(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=bt(t);var r=At.test(t);return r||wt.test(t)?jt(t.slice(2),r?2:8):mt.test(t)?_t:+t}var Ot=1/0,St=17976931348623157e292;function Ut(t){return t?(t=xt(t))===Ot||t===-Ot?(t<0?-1:1)*St:t==t?t:0:0===t?t:0}function Bt(t){var e=Ut(t),r=e%1;return e==e?r?e-r:e:0}var Et="[object Boolean]";function kt(t){return!0===(e=t)||!1===e||b(e)&&g(e)==Et;var e}function Ct(t){return"[object String]"===Object.prototype.toString.call(t)}function Mt(t){return!(!Ct(t)||""===t)}function zt(t){let e=!1;if(Mt(t))e=!isNaN(Number(t));else if(function(t){return"[object Number]"===Object.prototype.toString.call(t)}(t)){if(function(t){return t!=t}(t))return!1;e=!0}return e}function $t(t){if(!zt(t))return 0;return Ut(t)}function Nt(t){let e=yt(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},"useLimitSafe",null);return kt(e)||(e=!1),!!zt(t)&&(t=$t(t),e?Number.isSafeInteger(t):"number"==typeof(r=t)&&r==Bt(r));var r}var Lt=a.isFinite,Pt=Math.min;var Ft=function(t){var e=Math[t];return function(t,r){if(t=xt(t),(r=null==r?0:Pt(Bt(r),292))&&Lt(t)){var n=(lt(t)+"e").split("e");return+((n=(lt(e(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return e(t)}}("round"),Wt=Ft;function It(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=yt(e,"useClampSafe",null);kt(r)||(r=!1);let n=yt(e,"useLimitSafe",null);kt(n)||(n=!1);let o=yt(e,"returnWithStateAndMsg",null);kt(o)||(o=!1);let i=t=>o?{state:"success",msg:t}:t,u=t=>{if(o)return{state:"error",msg:t};throw new Error(t)};if(!zt(t))return i(0);let a=null;try{t=$t(t),a=Wt(t),r&&(a>Number.MAX_SAFE_INTEGER?a=Number.MAX_SAFE_INTEGER:a<Number.MIN_SAFE_INTEGER&&(a=Number.MIN_SAFE_INTEGER))}catch(t){return u(t.toString())}return n&&!Number.isSafeInteger(Number(a))?u(`v[${t}] is not a safe integer`):("0"===String(a)&&(a=0),i(a))}let Tt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Rt=Tt.length;function Dt(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:32,e=[];t=function(t){return!!Nt(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{})&&It(t)>0}(t)?It(t):32;for(let r=0;r<t;r++)e[r]=Tt[0|Math.random()*Rt];return e.join("")}var Gt="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Ht(t){if(t.__esModule)return t;var e=t.default;if("function"==typeof e){var r=function t(){if(this instanceof t){var r=[null];return r.push.apply(r,arguments),new(Function.bind.apply(e,r))}return e.apply(this,arguments)};r.prototype=e.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(t).forEach((function(e){var n=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(r,e,n.get?n:{enumerable:!0,get:function(){return t[e]}})})),r}var Zt={};!function(t){var e=Object.prototype.hasOwnProperty,r="~";function n(){}function o(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function i(t,e,n,i,u){if("function"!=typeof n)throw new TypeError("The listener must be a function");var a=new o(n,i||t,u),c=r?r+e:e;return t._events[c]?t._events[c].fn?t._events[c]=[t._events[c],a]:t._events[c].push(a):(t._events[c]=a,t._eventsCount++),t}function u(t,e){0==--t._eventsCount?t._events=new n:delete t._events[e]}function a(){this._events=new n,this._eventsCount=0}Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(r=!1)),a.prototype.eventNames=function(){var t,n,o=[];if(0===this._eventsCount)return o;for(n in t=this._events)e.call(t,n)&&o.push(r?n.slice(1):n);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(t)):o},a.prototype.listeners=function(t){var e=r?r+t:t,n=this._events[e];if(!n)return[];if(n.fn)return[n.fn];for(var o=0,i=n.length,u=new Array(i);o<i;o++)u[o]=n[o].fn;return u},a.prototype.listenerCount=function(t){var e=r?r+t:t,n=this._events[e];return n?n.fn?1:n.length:0},a.prototype.emit=function(t,e,n,o,i,u){var a=r?r+t:t;if(!this._events[a])return!1;var c,s,f=this._events[a],l=arguments.length;if(f.fn){switch(f.once&&this.removeListener(t,f.fn,void 0,!0),l){case 1:return f.fn.call(f.context),!0;case 2:return f.fn.call(f.context,e),!0;case 3:return f.fn.call(f.context,e,n),!0;case 4:return f.fn.call(f.context,e,n,o),!0;case 5:return f.fn.call(f.context,e,n,o,i),!0;case 6:return f.fn.call(f.context,e,n,o,i,u),!0}for(s=1,c=new Array(l-1);s<l;s++)c[s-1]=arguments[s];f.fn.apply(f.context,c)}else{var p,h=f.length;for(s=0;s<h;s++)switch(f[s].once&&this.removeListener(t,f[s].fn,void 0,!0),l){case 1:f[s].fn.call(f[s].context);break;case 2:f[s].fn.call(f[s].context,e);break;case 3:f[s].fn.call(f[s].context,e,n);break;case 4:f[s].fn.call(f[s].context,e,n,o);break;default:if(!c)for(p=1,c=new Array(l-1);p<l;p++)c[p-1]=arguments[p];f[s].fn.apply(f[s].context,c)}}return!0},a.prototype.on=function(t,e,r){return i(this,t,e,r,!1)},a.prototype.once=function(t,e,r){return i(this,t,e,r,!0)},a.prototype.removeListener=function(t,e,n,o){var i=r?r+t:t;if(!this._events[i])return this;if(!e)return u(this,i),this;var a=this._events[i];if(a.fn)a.fn!==e||o&&!a.once||n&&a.context!==n||u(this,i);else{for(var c=0,s=[],f=a.length;c<f;c++)(a[c].fn!==e||o&&!a[c].once||n&&a[c].context!==n)&&s.push(a[c]);s.length?this._events[i]=1===s.length?s[0]:s:u(this,i)}return this},a.prototype.removeAllListeners=function(t){var e;return t?(e=r?r+t:t,this._events[e]&&u(this,e)):(this._events=new n,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=r,a.EventEmitter=a,t.exports=a}({get exports(){return Zt},set exports(t){Zt=t}});var qt=Zt;function Vt(){return new qt}function Jt(t,e,r){var n=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(r=r>o?o:r)<0&&(r+=o),o=e>r?0:r-e>>>0,e>>>=0;for(var i=Array(o);++n<o;)i[n]=t[n+e];return i}var Xt=9007199254740991;function Kt(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=Xt}function Qt(t){return null!=t&&Kt(t.length)&&!B(t)}var Yt=9007199254740991,te=/^(?:0|[1-9]\d*)$/;function ee(t,e){var r=typeof t;return!!(e=null==e?Yt:e)&&("number"==r||"symbol"!=r&&te.test(t))&&t>-1&&t%1==0&&t<e}function re(t,e,r){if(!j(r))return!1;var n=typeof e;return!!("number"==n?Qt(r)&&ee(e,r.length):"string"==n&&e in r)&&H(r[e],t)}var ne=Math.ceil,oe=Math.max;var ie=Array.prototype.join;function ue(t,e){return null==t?"":ie.call(t,e)}function ae(t,e){for(var r=-1,n=null==t?0:t.length;++r<n&&!1!==e(t[r],r,t););return t}var ce,se=function(t,e,r){for(var n=-1,o=Object(t),i=r(t),u=i.length;u--;){var a=i[ce?u:++n];if(!1===e(o[a],a,o))break}return t};function fe(t){return b(t)&&"[object Arguments]"==g(t)}var le=Object.prototype,pe=le.hasOwnProperty,he=le.propertyIsEnumerable,de=fe(function(){return arguments}())?fe:function(t){return b(t)&&pe.call(t,"callee")&&!he.call(t,"callee")},ye=de;var ve="object"==typeof exports&&exports&&!exports.nodeType&&exports,ge=ve&&"object"==typeof module&&module&&!module.nodeType&&module,be=ge&&ge.exports===ve?a.Buffer:void 0,_e=(be?be.isBuffer:void 0)||function(){return!1},me={};function Ae(t){return function(e){return t(e)}}me["[object Float32Array]"]=me["[object Float64Array]"]=me["[object Int8Array]"]=me["[object Int16Array]"]=me["[object Int32Array]"]=me["[object Uint8Array]"]=me["[object Uint8ClampedArray]"]=me["[object Uint16Array]"]=me["[object Uint32Array]"]=!0,me["[object Arguments]"]=me["[object Array]"]=me["[object ArrayBuffer]"]=me["[object Boolean]"]=me["[object DataView]"]=me["[object Date]"]=me["[object Error]"]=me["[object Function]"]=me["[object Map]"]=me["[object Number]"]=me["[object Object]"]=me["[object RegExp]"]=me["[object Set]"]=me["[object String]"]=me["[object WeakMap]"]=!1;var we="object"==typeof exports&&exports&&!exports.nodeType&&exports,je=we&&"object"==typeof module&&module&&!module.nodeType&&module,xe=je&&je.exports===we&&i.process,Oe=function(){try{var t=je&&je.require&&je.require("util").types;return t||xe&&xe.binding&&xe.binding("util")}catch(t){}}(),Se=Oe&&Oe.isTypedArray,Ue=Se?Ae(Se):function(t){return b(t)&&Kt(t.length)&&!!me[g(t)]},Be=Object.prototype.hasOwnProperty;function Ee(t,e){var r=o(t),n=!r&&ye(t),i=!r&&!n&&_e(t),u=!r&&!n&&!i&&Ue(t),a=r||n||i||u,c=a?function(t,e){for(var r=-1,n=Array(t);++r<t;)n[r]=e(r);return n}(t.length,String):[],s=c.length;for(var f in t)!e&&!Be.call(t,f)||a&&("length"==f||i&&("offset"==f||"parent"==f)||u&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||ee(f,s))||c.push(f);return c}var ke=Object.prototype;var Ce=function(t,e){return function(r){return t(e(r))}}(Object.keys,Object),Me=Ce,ze=Object.prototype.hasOwnProperty;function $e(t){if(r=(e=t)&&e.constructor,e!==("function"==typeof r&&r.prototype||ke))return Me(t);var e,r,n=[];for(var o in Object(t))ze.call(t,o)&&"constructor"!=o&&n.push(o);return n}function Ne(t){return Qt(t)?Ee(t):$e(t)}var Le=function(t,e){return function(r,n){if(null==r)return r;if(!Qt(r))return t(r,n);for(var o=r.length,i=e?o:-1,u=Object(r);(e?i--:++i<o)&&!1!==n(u[i],i,u););return r}}((function(t,e){return t&&se(t,e,Ne)})),Pe=Le;function Fe(t){return t}function We(t,e){var r;return(o(t)?ae:Pe)(t,"function"==typeof(r=e)?r:Fe)}function Ie(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)}function Te(t){return"[object Uint16Array]"===Object.prototype.toString.call(t)}var Re={},De={get exports(){return Re},set exports(t){Re=t}};var Ge,He={},Ze={get exports(){return He},set exports(t){He=t}},qe=Ht(Object.freeze({__proto__:null,default:{}}));function Ve(){return Ge||(Ge=1,function(t,e){var r;t.exports=(r=r||function(t,e){var r;if("undefined"!=typeof window&&window.crypto&&(r=window.crypto),"undefined"!=typeof self&&self.crypto&&(r=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(r=globalThis.crypto),!r&&"undefined"!=typeof window&&window.msCrypto&&(r=window.msCrypto),!r&&void 0!==Gt&&Gt.crypto&&(r=Gt.crypto),!r)try{r=qe}catch(t){}var n=function(){if(r){if("function"==typeof r.getRandomValues)try{return r.getRandomValues(new Uint32Array(1))[0]}catch(t){}if("function"==typeof r.randomBytes)try{return r.randomBytes(4).readInt32LE()}catch(t){}}throw new Error("Native crypto module could not be used to get secure random number.")},o=Object.create||function(){function t(){}return function(e){var r;return t.prototype=e,r=new t,t.prototype=null,r}}(),i={},u=i.lib={},a=u.Base={extend:function(t){var e=o(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),e.init.prototype=e,e.$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},c=u.WordArray=a.extend({init:function(t,r){t=this.words=t||[],this.sigBytes=r!=e?r:4*t.length},toString:function(t){return(t||f).stringify(this)},concat:function(t){var e=this.words,r=t.words,n=this.sigBytes,o=t.sigBytes;if(this.clamp(),n%4)for(var i=0;i<o;i++){var u=r[i>>>2]>>>24-i%4*8&255;e[n+i>>>2]|=u<<24-(n+i)%4*8}else for(var a=0;a<o;a+=4)e[n+a>>>2]=r[a>>>2];return this.sigBytes+=o,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var t=a.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r<t;r+=4)e.push(n());return new c.init(e,t)}}),s=i.enc={},f=s.Hex={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],o=0;o<r;o++){var i=e[o>>>2]>>>24-o%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n<e;n+=2)r[n>>>3]|=parseInt(t.substr(n,2),16)<<24-n%8*4;return new c.init(r,e/2)}},l=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],o=0;o<r;o++){var i=e[o>>>2]>>>24-o%4*8&255;n.push(String.fromCharCode(i))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n<e;n++)r[n>>>2]|=(255&t.charCodeAt(n))<<24-n%4*8;return new c.init(r,e)}},p=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(l.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return l.parse(unescape(encodeURIComponent(t)))}},h=u.BufferedBlockAlgorithm=a.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=p.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var r,n=this._data,o=n.words,i=n.sigBytes,u=this.blockSize,a=i/(4*u),s=(a=e?t.ceil(a):t.max((0|a)-this._minBufferSize,0))*u,f=t.min(4*s,i);if(s){for(var l=0;l<s;l+=u)this._doProcessBlock(o,l);r=o.splice(0,s),n.sigBytes-=f}return new c.init(r,f)},clone:function(){var t=a.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0});u.Hasher=h.extend({cfg:a.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(t){return function(e,r){return new t.init(r).finalize(e)}},_createHmacHelper:function(t){return function(e,r){return new d.HMAC.init(t,r).finalize(e)}}});var d=i.algo={};return i}(Math),r)}(Ze)),He}!function(t,e){var r;t.exports=(r=Ve(),function(){var t=r,e=t.lib.WordArray;function n(t,r,n){for(var o=[],i=0,u=0;u<r;u++)if(u%4){var a=n[t.charCodeAt(u-1)]<<u%4*2|n[t.charCodeAt(u)]>>>6-u%4*2;o[i>>>2]|=a<<24-i%4*8,i++}return e.create(o,i)}t.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,n=this._map;t.clamp();for(var o=[],i=0;i<r;i+=3)for(var u=(e[i>>>2]>>>24-i%4*8&255)<<16|(e[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|e[i+2>>>2]>>>24-(i+2)%4*8&255,a=0;a<4&&i+.75*a<r;a++)o.push(n.charAt(u>>>6*(3-a)&63));var c=n.charAt(64);if(c)for(;o.length%4;)o.push(c);return o.join("")},parse:function(t){var e=t.length,r=this._map,o=this._reverseMap;if(!o){o=this._reverseMap=[];for(var i=0;i<r.length;i++)o[r.charCodeAt(i)]=i}var u=r.charAt(64);if(u){var a=t.indexOf(u);-1!==a&&(e=a)}return n(t,e,o)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),r.enc.Base64)}(De);var Je=Re,Xe={};!function(t,e){var r;t.exports=(r=Ve(),function(){if("function"==typeof ArrayBuffer){var t=r.lib.WordArray,e=t.init,n=t.init=function(t){if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(t instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),t instanceof Uint8Array){for(var r=t.byteLength,n=[],o=0;o<r;o++)n[o>>>2]|=t[o]<<24-o%4*8;e.call(this,n,r)}else e.apply(this,arguments)};n.prototype=t}}(),r.lib.WordArray)}({get exports(){return Xe},set exports(t){Xe=t}});var Ke=Xe;function Qe(t){let e=yt(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},"returnWithStateAndMsg",null);kt(e)||(e=!1);let r=t=>e?{state:"error",msg:t}:"";if(!Ie(t))return r("invalid u8a");let n="";try{n=Ke.create(t).toString(Je)}catch(t){return r(t.toString())}return e?{state:"success",msg:n}:n}let Ye=/[\t\n\f\r ]/g,tr=/^[A-Za-z0-9+/]*={0,2}$/,er=/=+$/;function rr(t){let e=yt(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},"returnWithStateAndMsg",null);kt(e)||(e=!1);let r=t=>e?{state:"error",msg:t}:new Uint8Array;if(!Ct(t))return r("invalid b64");let n=t.replace(Ye,"");if(!tr.test(n))return r("invalid b64, contains characters outside the base64 alphabet or misplaced padding");let o=n.length-n.replace(er,"").length,i=(n.length-o)%4;if(0===o&&1===i)return r(`invalid b64, the last chunk has only 1 character[${n.length}]`);if(1===o&&3!==i)return r("invalid b64, malformed padding, 1 padding requires the last chunk to have 3 characters");if(2===o&&2!==i)return r("invalid b64, malformed padding, 2 paddings require the last chunk to have 2 characters");let u=null;try{let t=Je.parse(n),e=t.words,r=t.sigBytes;u=new Uint8Array(r);for(let t=0;t<r;t++){let r=e[t>>>2]>>>24-t%4*8&255;u[t]=r}}catch(t){return r(t.toString())}return e?{state:"success",msg:u}:u}let nr="[BlazeForPreventEscape]",or=/^(?:\[BlazeForPreventEscape\])*\[(?:Uint8Array|Uint16Array)\]::[A-Za-z0-9+/]*={0,2}$/,ir=/^\[BlazeForPreventEscape\](?:\[BlazeForPreventEscape\])*\[(?:Uint8Array|Uint16Array)\]::[A-Za-z0-9+/]*={0,2}$/;let ur="[Uint8Array]::",ar=/^\[Uint8Array\]::([A-Za-z0-9+/]*={0,2})$/;let cr="[Uint16Array]::",sr=/^\[Uint16Array\]::([A-Za-z0-9+/]*={0,2})$/;let fr={tagEsc:nr,escape:function(t){return Ct(t)&&91===t.charCodeAt(0)&&or.test(t)?nr+t:t},unescape:function(t){return Ct(t)&&91===t.charCodeAt(0)&&ir.test(t)?t.slice(nr.length):t},tagU8A:ur,u8arr2b64:function(t){return Ie(t)?ur+Qe(t):t},b642u8arr:function(t){if(Ct(t)&&91===t.charCodeAt(0)){let e=ar.exec(t);if(null!==e)return rr(e[1])}return t},tagU16A:cr,u16arr2b64:function(t){return Te(t)?cr+function(t){let e=yt(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},"returnWithStateAndMsg",null);kt(e)||(e=!1);let r=t=>e?{state:"error",msg:t}:"";if(!Te(t))return r("invalid u16a");let n="";try{let e=Qe(new Uint8Array(t.buffer,t.byteOffset,t.byteLength),{returnWithStateAndMsg:!0});if("error"===e.state)return r(`u8arr2b64: ${e.msg}`);n=e.msg}catch(t){return r(t.toString())}return e?{state:"success",msg:n}:n}(t):t},b642u16arr:function(t){if(Ct(t)&&91===t.charCodeAt(0)){let e=sr.exec(t);if(null!==e)return function(t){let e=yt(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},"returnWithStateAndMsg",null);kt(e)||(e=!1);let r=t=>e?{state:"error",msg:t}:new Uint16Array;if(!Ct(t))return r("invalid b64");let n=null;try{let e=rr(t,{returnWithStateAndMsg:!0});if("error"===e.state)return r(`b642u8arr: ${e.msg}`);let o=e.msg;if(o.byteLength%2!=0)return r(`byteLength[${o.byteLength}] is not even, can not be restored to Uint16Array`);let i=0===o.byteOffset&&o.byteLength===o.buffer.byteLength?o:new Uint8Array(o);n=new Uint16Array(i.buffer)}catch(t){return r(t.toString())}return e?{state:"success",msg:n}:n}(e[1])}return t}};function lr(t){return"[object Array]"===Object.prototype.toString.call(t)}function pr(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Uint8Array",r=yt(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},"returnWithStateAndMsg",null);kt(r)||(r=!1);let n=t=>r?{state:"error",msg:t}:"";if(o=t,"[object Undefined]"===Object.prototype.toString.call(o))return n("invalid data");var o;Ct(e)?e=[e]:lr(e)||(e=["Uint8Array"]);let i="";try{i=JSON.stringify(t,(function(t,r){return r=fr.escape(r),e.indexOf("Uint8Array")>=0&&(r=fr.u8arr2b64(r)),e.indexOf("Uint16Array")>=0&&(r=fr.u16arr2b64(r)),r}))}catch(t){return n(t.toString())}return r?{state:"success",msg:i}:i}function hr(t,e,r,n,o){let i=function(t,e,r){e=(r?re(t,e,r):void 0===e)?1:oe(Bt(e),0);var n=null==t?0:t.length;if(!n||e<1)return[];for(var o=0,i=0,u=Array(ne(n/e));o<n;)u[i++]=Jt(t,o,o+=e);return u}(pr(r),e),u=Dt(),a=i.length;We(i,(function(e,r){e=ue(e,"");let i=`${u}|${r}|${a}|${e}`;t.send(i,(function(t){t&&B(o)&&o(t)})),B(n)&&n((r+1)/a*100)}))}var dr=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");function yr(t){return dr.test(t)}var vr=Oe&&Oe.isRegExp,gr=vr?Ae(vr):function(t){return b(t)&&"[object RegExp]"==g(t)};var br="\\ud800-\\udfff",_r="["+br+"]",mr="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Ar="\\ud83c[\\udffb-\\udfff]",wr="[^"+br+"]",jr="(?:\\ud83c[\\udde6-\\uddff]){2}",xr="[\\ud800-\\udbff][\\udc00-\\udfff]",Or="(?:"+mr+"|"+Ar+")"+"?",Sr="[\\ufe0e\\ufe0f]?",Ur=Sr+Or+("(?:\\u200d(?:"+[wr,jr,xr].join("|")+")"+Sr+Or+")*"),Br="(?:"+[wr+mr+"?",mr,jr,xr,_r].join("|")+")",Er=RegExp(Ar+"(?="+Ar+")|"+Br+Ur,"g");function kr(t){return yr(t)?function(t){return t.match(Er)||[]}(t):function(t){return t.split("")}(t)}var Cr=4294967295;function Mr(t,e,r){return r&&"number"!=typeof r&&re(t,e,r)&&(e=r=void 0),(r=void 0===r?Cr:r>>>0)?(t=lt(t))&&("string"==typeof e||null!=e&&!gr(e))&&!(e=ft(e))&&yr(t)?(n=kr(t),o=0,i=r,u=n.length,i=void 0===i?u:i,!o&&i>=u?n:Jt(n,o,i)):t.split(e,r):[];var n,o,i,u}var zr=Math.ceil,$r=Math.max;var Nr=function(t){return function(e,r,n){return n&&"number"!=typeof n&&re(e,r,n)&&(r=n=void 0),e=Ut(e),void 0===r?(r=e,e=0):r=Ut(r),function(t,e,r,n){for(var o=-1,i=$r(zr((e-t)/(r||1)),0),u=Array(i);i--;)u[n?i:++o]=t,t+=r;return u}(e,r,n=void 0===n?e<r?1:-1:Ut(n),t)}}(),Lr=Nr;function Pr(t,e){return r=t,"[object Object]"===Object.prototype.toString.call(r)&&(!(!Mt(e)&&!zt(e))&&e in t);var r}let Fr={};function Wr(t,e){let r=Mr(t,"|"),n=r[0],o=xt(r[1]),i=xt(r[2]),u=ue((c=3,(f=null==(a=r)?0:a.length)?Jt(a,(c=s||void 0===c?1:Bt(c))<0?0:c,f):[]),"|");var a,c,s,f;if(Pr(Fr,n)||(Fr[n]={}),Fr[n]["_"+o]=u,o===i-1){let t="";We(Lr(i),(function(e){t+=Fr[n]["_"+e]})),delete Fr[n];let r=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Uint8Array",r=yt(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},"returnWithStateAndMsg",null);kt(r)||(r=!1);let n=t=>r?{state:"error",msg:t}:{};if(!Ct(t))return n("invalid data");Ct(e)?e=[e]:lr(e)||(e=["Uint8Array"]);let o={};try{o=JSON.parse(t,(function(t,r){return e.indexOf("Uint8Array")>=0&&(r=fr.b642u8arr(r)),e.indexOf("Uint16Array")>=0&&(r=fr.b642u16arr(r)),fr.unescape(r)}))}catch(t){return n(t.toString())}return r?{state:"success",msg:o}:o}(t);e(r)}}return function(t){let e=!1,r=null,o=new Vt,i=new Vt,u=function(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),n=1;n<e;n++)r[n-1]=arguments[n];setTimeout((()=>{o.emit(t,...r)}),1)};function a(){t.url||(t.url="ws://localhost:8080"),t.token||(t.token="*"),t.strSplitLength||(t.strSplitLength=1e6);let a={url:t.url,token:t.token,open:function(){u("open"),e||(u("openOnce"),e=!0)},close:function(){u("close"),c()},message:function(t){!function(t){Wr(t,f)}(t)},error:function(t){s(t)}};try{r=new n(a)}catch(t){return u("error",{msg:"can not create websocket",err:t}),void c()}if(yt(r,"error"))return u("error",{msg:"can not create websocket",err:"can not new MixWS in WWebsocketClient"}),void c();function s(t){u("error",{msg:"websocket error",err:t}),r.close()}function f(t){let e=yt(t,"_mode","");if("execute"===e)if(yt(t,"_id")&&yt(t,"output")){let e=yt(t,"_id"),r=yt(t,"output");i.emit(e,r)}else u("error",{msg:"can not find _id and output in data",err:t});else"broadcast"===e?u("broadcast",yt(t,"data")):"deliver"===e?u("deliver",yt(t,"data")):s({msg:"can not find _mode in data",err:t})}function l(e,n){r.readyState===r.OPEN&&hr(r,t.strSplitLength,e,n,(function(t){u("error",{msg:"can not send message",err:t})}))}o.removeAllListeners("triggerExecute"),o.on("triggerExecute",(function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2?arguments[2]:void 0,n=arguments.length>3?arguments[3]:void 0,o=Dt();l({_mode:"execute",_id:o,func:t,input:e},n),i.on(o,(function(t){r(t),i.removeAllListeners(o)}))})),o.removeAllListeners("triggerBroadcast"),o.on("triggerBroadcast",(function(t,e){l({_mode:"broadcast",data:t},e)})),o.removeAllListeners("triggerDeliver"),o.on("triggerDeliver",(function(t,e){l({_mode:"deliver",data:t},e)}))}function c(){setTimeout((function(){u("reconn"),a()}),1e3)}return o.execute=function(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},n=function(){let t,e,r=new Promise((function(){t=arguments[0],e=arguments[1]}));return r.resolve=t,r.reject=e,r}();return u("triggerExecute",t,e,(function(t){n.resolve(t)}),r),n},o.broadcast=function(t){u("triggerBroadcast",t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){})},o.deliver=function(t){u("triggerDeliver",t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){})},a(),o}}();var wo=null,bInit=!1;function init(a){bInit||(wo=new WConverwsClient(a),wo.on("open",function(){sendSystemMessage("open")}),wo.on("openOnce",function(){sendSystemMessage("openOnce"),bInit=!0}),wo.on("close",function(){sendSystemMessage("close")}),wo.on("error",function(a){sendSystemMessage("error",a)}),wo.on("reconn",function(){sendSystemMessage("reconn")}),wo.on("broadcast",function(a){sendSystemMessage("broadcast",a)}),wo.on("deliver",function(a){sendSystemMessage("deliver",a)}))}function sendMessage(a){self.postMessage(a)}function sendSystemMessage(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:null;sendMessage({_id:"system",func:a,data:b})}self.onmessage=function(a){var b=a.data,c=b.type;if("init"===c){var d=b._id,e=b.input;init(e);var f=setInterval(function(){if(bInit){sendMessage({_id:d,output:null}),clearInterval(f)}},10)}else if("execute"===c){var g=b._id,h=b.func,i=b.input;wo.execute(h,i,function(a){sendMessage({_id:g,prog:a})}).then(function(a){sendMessage({_id:g,output:a})})}else if("broadcast"===c||"deliver"===c){var j=b._id,k=b.input;wo[c](k,function(a){sendMessage({_id:j,prog:a})})}else sendSystemMessage("error","type error: ".concat(c))};