/**
 * Copyright (c) 2026 The VolcEngineRTC project authors. All Rights Reserved.
 * @brief VolcEngine Advance API
 * version: 4.68.3
 */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).VERTC=t()}(this,(function(){"use strict";function e(e,t){return t.forEach((function(t){t&&"string"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(i){if("default"!==i&&!(i in e)){var o=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:function(){return t[i]}})}}))})),Object.freeze(e)}var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function i(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function o(e){if(e.__esModule)return e;var t=e.default;if("function"==typeof t){var i=function e(){if(this instanceof e){var i=[null];return i.push.apply(i,arguments),new(Function.bind.apply(t,i))}return t.apply(this,arguments)};i.prototype=t.prototype}else i={};return Object.defineProperty(i,"__esModule",{value:!0}),Object.keys(e).forEach((function(t){var o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(i,t,o.get?o:{enumerable:!0,get:function(){return e[t]}})})),i}var s=function(e){return e&&e.Math===Math&&e},r=s("object"==typeof globalThis&&globalThis)||s("object"==typeof window&&window)||s("object"==typeof self&&self)||s("object"==typeof t&&t)||s("object"==typeof t&&t)||function(){return this}()||Function("return this")(),n=function(e){try{return!!e()}catch(t){return!0}},a=!n((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})),d=a,c=Function.prototype,l=c.apply,u=c.call,m="object"==typeof Reflect&&Reflect.apply||(d?u.bind(l):function(){return u.apply(l,arguments)}),h=a,p=Function.prototype,b=p.call,_=h&&p.bind.bind(b,b),y=h?_:function(e){return function(){return b.apply(e,arguments)}},v=y,S=v({}.toString),Z=v("".slice),f=function(e){return Z(S(e),8,-1)},T=f,I=y,g=function(e){if("Function"===T(e))return I(e)},R="object"==typeof document&&document.all,X=void 0===R&&void 0!==R?function(e){return"function"==typeof e||e===R}:function(e){return"function"==typeof e},L={},C=!n((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]})),W=a,G=Function.prototype.call,V=W?G.bind(G):function(){return G.apply(G,arguments)},E={},P={}.propertyIsEnumerable,k=Object.getOwnPropertyDescriptor,x=k&&!P.call({1:2},1);E.f=x?function(e){var t=k(this,e);return!!t&&t.enumerable}:P;var N,M,Y=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},w=n,K=f,H=Object,F=y("".split),J=w((function(){return!H("z").propertyIsEnumerable(0)}))?function(e){return"String"===K(e)?F(e,""):H(e)}:H,O=function(e){return null==e},U=O,D=TypeError,A=function(e){if(U(e))throw new D("Can't call method on "+e);return e},z=J,j=A,Q=function(e){return z(j(e))},B=X,q=function(e){return"object"==typeof e?null!==e:B(e)},$={},ee=$,te=r,ie=X,oe=function(e){return ie(e)?e:void 0},se=function(e,t){return arguments.length<2?oe(ee[e])||oe(te[e]):ee[e]&&ee[e][t]||te[e]&&te[e][t]},re=y({}.isPrototypeOf),ne=r.navigator,ae=ne&&ne.userAgent,de=ae?String(ae):"",ce=r,le=de,ue=ce.process,me=ce.Deno,he=ue&&ue.versions||me&&me.version,pe=he&&he.v8;pe&&(M=(N=pe.split("."))[0]>0&&N[0]<4?1:+(N[0]+N[1])),!M&&le&&(!(N=le.match(/Edge\/(\d+)/))||N[1]>=74)&&(N=le.match(/Chrome\/(\d+)/))&&(M=+N[1]);var be=M,_e=be,ye=n,ve=r.String,Se=!!Object.getOwnPropertySymbols&&!ye((function(){var e=Symbol("symbol detection");return!ve(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&_e&&_e<41})),Ze=Se&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,fe=se,Te=X,Ie=re,ge=Object,Re=Ze?function(e){return"symbol"==typeof e}:function(e){var t=fe("Symbol");return Te(t)&&Ie(t.prototype,ge(e))},Xe=String,Le=function(e){try{return Xe(e)}catch(t){return"Object"}},Ce=X,We=Le,Ge=TypeError,Ve=function(e){if(Ce(e))return e;throw new Ge(We(e)+" is not a function")},Ee=Ve,Pe=O,ke=function(e,t){var i=e[t];return Pe(i)?void 0:Ee(i)},xe=V,Ne=X,Me=q,Ye=TypeError,we={exports:{}},Ke=!0,He=r,Fe=Object.defineProperty,Je=r,Oe=function(e,t){try{Fe(He,e,{value:t,configurable:!0,writable:!0})}catch(i){He[e]=t}return t},Ue="__core-js_shared__",De=we.exports=Je[Ue]||Oe(Ue,{});(De.versions||(De.versions=[])).push({version:"3.39.0",mode:"pure",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE",source:"https://github.com/zloirock/core-js"});var Ae=we.exports,ze=Ae,je=function(e,t){return ze[e]||(ze[e]=t||{})},Qe=A,Be=Object,qe=function(e){return Be(Qe(e))},$e=qe,et=y({}.hasOwnProperty),tt=Object.hasOwn||function(e,t){return et($e(e),t)},it=y,ot=0,st=Math.random(),rt=it(1..toString),nt=function(e){return"Symbol("+(void 0===e?"":e)+")_"+rt(++ot+st,36)},at=je,dt=tt,ct=nt,lt=Se,ut=Ze,mt=r.Symbol,ht=at("wks"),pt=ut?mt.for||mt:mt&&mt.withoutSetter||ct,bt=function(e){return dt(ht,e)||(ht[e]=lt&&dt(mt,e)?mt[e]:pt("Symbol."+e)),ht[e]},_t=V,yt=q,vt=Re,St=ke,Zt=function(e,t){var i,o;if("string"===t&&Ne(i=e.toString)&&!Me(o=xe(i,e)))return o;if(Ne(i=e.valueOf)&&!Me(o=xe(i,e)))return o;if("string"!==t&&Ne(i=e.toString)&&!Me(o=xe(i,e)))return o;throw new Ye("Can't convert object to primitive value")},ft=TypeError,Tt=bt("toPrimitive"),It=function(e,t){if(!yt(e)||vt(e))return e;var i,o=St(e,Tt);if(o){if(void 0===t&&(t="default"),i=_t(o,e,t),!yt(i)||vt(i))return i;throw new ft("Can't convert object to primitive value")}return void 0===t&&(t="number"),Zt(e,t)},gt=Re,Rt=function(e){var t=It(e,"string");return gt(t)?t:t+""},Xt=q,Lt=r.document,Ct=Xt(Lt)&&Xt(Lt.createElement),Wt=function(e){return Ct?Lt.createElement(e):{}},Gt=Wt,Vt=!C&&!n((function(){return 7!==Object.defineProperty(Gt("div"),"a",{get:function(){return 7}}).a})),Et=C,Pt=V,kt=E,xt=Y,Nt=Q,Mt=Rt,Yt=tt,wt=Vt,Kt=Object.getOwnPropertyDescriptor;L.f=Et?Kt:function(e,t){if(e=Nt(e),t=Mt(t),wt)try{return Kt(e,t)}catch(i){}if(Yt(e,t))return xt(!Pt(kt.f,e,t),e[t])};var Ht=n,Ft=X,Jt=/#|\.prototype\./,Ot=function(e,t){var i=Dt[Ut(e)];return i===zt||i!==At&&(Ft(t)?Ht(t):!!t)},Ut=Ot.normalize=function(e){return String(e).replace(Jt,".").toLowerCase()},Dt=Ot.data={},At=Ot.NATIVE="N",zt=Ot.POLYFILL="P",jt=Ot,Qt=Ve,Bt=a,qt=g(g.bind),$t=function(e,t){return Qt(e),void 0===t?e:Bt?qt(e,t):function(){return e.apply(t,arguments)}},ei={},ti=C&&n((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),ii=q,oi=String,si=TypeError,ri=function(e){if(ii(e))return e;throw new si(oi(e)+" is not an object")},ni=C,ai=Vt,di=ti,ci=ri,li=Rt,ui=TypeError,mi=Object.defineProperty,hi=Object.getOwnPropertyDescriptor,pi="enumerable",bi="configurable",_i="writable";ei.f=ni?di?function(e,t,i){if(ci(e),t=li(t),ci(i),"function"==typeof e&&"prototype"===t&&"value"in i&&_i in i&&!i[_i]){var o=hi(e,t);o&&o[_i]&&(e[t]=i.value,i={configurable:bi in i?i[bi]:o[bi],enumerable:pi in i?i[pi]:o[pi],writable:!1})}return mi(e,t,i)}:mi:function(e,t,i){if(ci(e),t=li(t),ci(i),ai)try{return mi(e,t,i)}catch(o){}if("get"in i||"set"in i)throw new ui("Accessors not supported");return"value"in i&&(e[t]=i.value),e};var yi=ei,vi=Y,Si=C?function(e,t,i){return yi.f(e,t,vi(1,i))}:function(e,t,i){return e[t]=i,e},Zi=r,fi=m,Ti=g,Ii=X,gi=L.f,Ri=jt,Xi=$,Li=$t,Ci=Si,Wi=tt,Gi=function(e){var t=function(i,o,s){if(this instanceof t){switch(arguments.length){case 0:return new e;case 1:return new e(i);case 2:return new e(i,o)}return new e(i,o,s)}return fi(e,this,arguments)};return t.prototype=e.prototype,t},Vi=function(e,t){var i,o,s,r,n,a,d,c,l,u=e.target,m=e.global,h=e.stat,p=e.proto,b=m?Zi:h?Zi[u]:Zi[u]&&Zi[u].prototype,_=m?Xi:Xi[u]||Ci(Xi,u,{})[u],y=_.prototype;for(r in t)o=!(i=Ri(m?r:u+(h?".":"#")+r,e.forced))&&b&&Wi(b,r),a=_[r],o&&(d=e.dontCallGetSet?(l=gi(b,r))&&l.value:b[r]),n=o&&d?d:t[r],(i||p||typeof a!=typeof n)&&(c=e.bind&&o?Li(n,Zi):e.wrap&&o?Gi(n):p&&Ii(n)?Ti(n):n,(e.sham||n&&n.sham||a&&a.sham)&&Ci(c,"sham",!0),Ci(_,r,c),p&&(Wi(Xi,s=u+"Prototype")||Ci(Xi,s,{}),Ci(Xi[s],r,n),e.real&&y&&(i||!y[r])&&Ci(y,r,n)))},Ei=Math.ceil,Pi=Math.floor,ki=Math.trunc||function(e){var t=+e;return(t>0?Pi:Ei)(t)},xi=function(e){var t=+e;return t!=t||0===t?0:ki(t)},Ni=xi,Mi=Math.max,Yi=Math.min,wi=function(e,t){var i=Ni(e);return i<0?Mi(i+t,0):Yi(i,t)},Ki=xi,Hi=Math.min,Fi=function(e){var t=Ki(e);return t>0?Hi(t,9007199254740991):0},Ji=function(e){return Fi(e.length)},Oi=Q,Ui=wi,Di=Ji,Ai=function(e){return function(t,i,o){var s=Oi(t),r=Di(s);if(0===r)return!e&&-1;var n,a=Ui(o,r);if(e&&i!=i){for(;r>a;)if((n=s[a++])!=n)return!0}else for(;r>a;a++)if((e||a in s)&&s[a]===i)return e||a||0;return!e&&-1}},zi={includes:Ai(!0),indexOf:Ai(!1)},ji={},Qi=tt,Bi=Q,qi=zi.indexOf,$i=ji,eo=y([].push),to=function(e,t){var i,o=Bi(e),s=0,r=[];for(i in o)!Qi($i,i)&&Qi(o,i)&&eo(r,i);for(;t.length>s;)Qi(o,i=t[s++])&&(~qi(r,i)||eo(r,i));return r},io=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],oo=to,so=io,ro=Object.keys||function(e){return oo(e,so)},no=qe,ao=ro;Vi({target:"Object",stat:!0,forced:n((function(){ao(1)}))},{keys:function(e){return ao(no(e))}});var co=i($.Object.keys),lo={};lo[bt("toStringTag")]="z";var uo="[object z]"===String(lo),mo=uo,ho=X,po=f,bo=bt("toStringTag"),_o=Object,yo="Arguments"===po(function(){return arguments}()),vo=mo?po:function(e){var t,i,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,t){try{return e[t]}catch(i){}}(t=_o(e),bo))?i:yo?po(t):"Object"===(o=po(t))&&ho(t.callee)?"Arguments":o},So=vo,Zo=String,fo=function(e){if("Symbol"===So(e))throw new TypeError("Cannot convert a Symbol value to a string");return Zo(e)},To={},Io=C,go=ti,Ro=ei,Xo=ri,Lo=Q,Co=ro;To.f=Io&&!go?Object.defineProperties:function(e,t){Xo(e);for(var i,o=Lo(t),s=Co(t),r=s.length,n=0;r>n;)Ro.f(e,i=s[n++],o[i]);return e};var Wo,Go=se("document","documentElement"),Vo=nt,Eo=je("keys"),Po=function(e){return Eo[e]||(Eo[e]=Vo(e))},ko=ri,xo=To,No=io,Mo=ji,Yo=Go,wo=Wt,Ko="prototype",Ho="script",Fo=Po("IE_PROTO"),Jo=function(){},Oo=function(e){return"<"+Ho+">"+e+"</"+Ho+">"},Uo=function(e){e.write(Oo("")),e.close();var t=e.parentWindow.Object;return e=null,t},Do=function(){try{Wo=new ActiveXObject("htmlfile")}catch(s){}var e,t,i;Do="undefined"!=typeof document?document.domain&&Wo?Uo(Wo):(t=wo("iframe"),i="java"+Ho+":",t.style.display="none",Yo.appendChild(t),t.src=String(i),(e=t.contentWindow.document).open(),e.write(Oo("document.F=Object")),e.close(),e.F):Uo(Wo);for(var o=No.length;o--;)delete Do[Ko][No[o]];return Do()};Mo[Fo]=!0;var Ao=Object.create||function(e,t){var i;return null!==e?(Jo[Ko]=ko(e),i=new Jo,Jo[Ko]=null,i[Fo]=e):i=Do(),void 0===t?i:xo.f(i,t)},zo={},jo=to,Qo=io.concat("length","prototype");zo.f=Object.getOwnPropertyNames||function(e){return jo(e,Qo)};var Bo={},qo=y([].slice),$o=f,es=Q,ts=zo.f,is=qo,os="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];Bo.f=function(e){return os&&"Window"===$o(e)?function(e){try{return ts(e)}catch(t){return is(os)}}(e):ts(es(e))};var ss={};ss.f=Object.getOwnPropertySymbols;var rs=Si,ns=function(e,t,i,o){return o&&o.enumerable?e[t]=i:rs(e,t,i),e},as=ei,ds=function(e,t,i){return as.f(e,t,i)},cs={},ls=bt;cs.f=ls;var us,ms,hs,ps=$,bs=tt,_s=cs,ys=ei.f,vs=function(e){var t=ps.Symbol||(ps.Symbol={});bs(t,e)||ys(t,e,{value:_s.f(e)})},Ss=V,Zs=se,fs=bt,Ts=ns,Is=function(){var e=Zs("Symbol"),t=e&&e.prototype,i=t&&t.valueOf,o=fs("toPrimitive");t&&!t[o]&&Ts(t,o,(function(e){return Ss(i,this)}),{arity:1})},gs=vo,Rs=uo?{}.toString:function(){return"[object "+gs(this)+"]"},Xs=uo,Ls=ei.f,Cs=Si,Ws=tt,Gs=Rs,Vs=bt("toStringTag"),Es=function(e,t,i,o){var s=i?e:e&&e.prototype;s&&(Ws(s,Vs)||Ls(s,Vs,{configurable:!0,value:t}),o&&!Xs&&Cs(s,"toString",Gs))},Ps=X,ks=r.WeakMap,xs=Ps(ks)&&/native code/.test(String(ks)),Ns=r,Ms=q,Ys=Si,ws=tt,Ks=Ae,Hs=Po,Fs=ji,Js="Object already initialized",Os=Ns.TypeError,Us=Ns.WeakMap;if(xs||Ks.state){var Ds=Ks.state||(Ks.state=new Us);Ds.get=Ds.get,Ds.has=Ds.has,Ds.set=Ds.set,us=function(e,t){if(Ds.has(e))throw new Os(Js);return t.facade=e,Ds.set(e,t),t},ms=function(e){return Ds.get(e)||{}},hs=function(e){return Ds.has(e)}}else{var As=Hs("state");Fs[As]=!0,us=function(e,t){if(ws(e,As))throw new Os(Js);return t.facade=e,Ys(e,As,t),t},ms=function(e){return ws(e,As)?e[As]:{}},hs=function(e){return ws(e,As)}}var zs={set:us,get:ms,has:hs,enforce:function(e){return hs(e)?ms(e):us(e,{})},getterFor:function(e){return function(t){var i;if(!Ms(t)||(i=ms(t)).type!==e)throw new Os("Incompatible receiver, "+e+" required");return i}}},js=f,Qs=Array.isArray||function(e){return"Array"===js(e)},Bs=X,qs=Ae,$s=y(Function.toString);Bs(qs.inspectSource)||(qs.inspectSource=function(e){return $s(e)});var er=qs.inspectSource,tr=y,ir=n,or=X,sr=vo,rr=er,nr=function(){},ar=se("Reflect","construct"),dr=/^\s*(?:class|function)\b/,cr=tr(dr.exec),lr=!dr.test(nr),ur=function(e){if(!or(e))return!1;try{return ar(nr,[],e),!0}catch(t){return!1}},mr=function(e){if(!or(e))return!1;switch(sr(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return lr||!!cr(dr,rr(e))}catch(t){return!0}};mr.sham=!0;var hr=!ar||ir((function(){var e;return ur(ur.call)||!ur(Object)||!ur((function(){e=!0}))||e}))?mr:ur,pr=Qs,br=hr,_r=q,yr=bt("species"),vr=Array,Sr=function(e){var t;return pr(e)&&(t=e.constructor,(br(t)&&(t===vr||pr(t.prototype))||_r(t)&&null===(t=t[yr]))&&(t=void 0)),void 0===t?vr:t},Zr=function(e,t){return new(Sr(e))(0===t?0:t)},fr=$t,Tr=J,Ir=qe,gr=Ji,Rr=Zr,Xr=y([].push),Lr=function(e){var t=1===e,i=2===e,o=3===e,s=4===e,r=6===e,n=7===e,a=5===e||r;return function(d,c,l,u){for(var m,h,p=Ir(d),b=Tr(p),_=gr(b),y=fr(c,l),v=0,S=u||Rr,Z=t?S(d,_):i||n?S(d,0):void 0;_>v;v++)if((a||v in b)&&(h=y(m=b[v],v,p),e))if(t)Z[v]=h;else if(h)switch(e){case 3:return!0;case 5:return m;case 6:return v;case 2:Xr(Z,m)}else switch(e){case 4:return!1;case 7:Xr(Z,m)}return r?-1:o||s?s:Z}},Cr={forEach:Lr(0),map:Lr(1),filter:Lr(2),some:Lr(3),every:Lr(4),find:Lr(5),findIndex:Lr(6),filterReject:Lr(7)},Wr=Vi,Gr=r,Vr=V,Er=y,Pr=C,kr=Se,xr=n,Nr=tt,Mr=re,Yr=ri,wr=Q,Kr=Rt,Hr=fo,Fr=Y,Jr=Ao,Or=ro,Ur=zo,Dr=Bo,Ar=ss,zr=L,jr=ei,Qr=To,Br=E,qr=ns,$r=ds,en=je,tn=ji,on=nt,sn=bt,rn=cs,nn=vs,an=Is,dn=Es,cn=zs,ln=Cr.forEach,un=Po("hidden"),mn="Symbol",hn="prototype",pn=cn.set,bn=cn.getterFor(mn),_n=Object[hn],yn=Gr.Symbol,vn=yn&&yn[hn],Sn=Gr.RangeError,Zn=Gr.TypeError,fn=Gr.QObject,Tn=zr.f,In=jr.f,gn=Dr.f,Rn=Br.f,Xn=Er([].push),Ln=en("symbols"),Cn=en("op-symbols"),Wn=en("wks"),Gn=!fn||!fn[hn]||!fn[hn].findChild,Vn=function(e,t,i){var o=Tn(_n,t);o&&delete _n[t],In(e,t,i),o&&e!==_n&&In(_n,t,o)},En=Pr&&xr((function(){return 7!==Jr(In({},"a",{get:function(){return In(this,"a",{value:7}).a}})).a}))?Vn:In,Pn=function(e,t){var i=Ln[e]=Jr(vn);return pn(i,{type:mn,tag:e,description:t}),Pr||(i.description=t),i},kn=function(e,t,i){e===_n&&kn(Cn,t,i),Yr(e);var o=Kr(t);return Yr(i),Nr(Ln,o)?(i.enumerable?(Nr(e,un)&&e[un][o]&&(e[un][o]=!1),i=Jr(i,{enumerable:Fr(0,!1)})):(Nr(e,un)||In(e,un,Fr(1,Jr(null))),e[un][o]=!0),En(e,o,i)):In(e,o,i)},xn=function(e,t){Yr(e);var i=wr(t),o=Or(i).concat(wn(i));return ln(o,(function(t){Pr&&!Vr(Nn,i,t)||kn(e,t,i[t])})),e},Nn=function(e){var t=Kr(e),i=Vr(Rn,this,t);return!(this===_n&&Nr(Ln,t)&&!Nr(Cn,t))&&(!(i||!Nr(this,t)||!Nr(Ln,t)||Nr(this,un)&&this[un][t])||i)},Mn=function(e,t){var i=wr(e),o=Kr(t);if(i!==_n||!Nr(Ln,o)||Nr(Cn,o)){var s=Tn(i,o);return!s||!Nr(Ln,o)||Nr(i,un)&&i[un][o]||(s.enumerable=!0),s}},Yn=function(e){var t=gn(wr(e)),i=[];return ln(t,(function(e){Nr(Ln,e)||Nr(tn,e)||Xn(i,e)})),i},wn=function(e){var t=e===_n,i=gn(t?Cn:wr(e)),o=[];return ln(i,(function(e){!Nr(Ln,e)||t&&!Nr(_n,e)||Xn(o,Ln[e])})),o};kr||(yn=function(){if(Mr(vn,this))throw new Zn("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?Hr(arguments[0]):void 0,t=on(e),i=function(e){var o=void 0===this?Gr:this;o===_n&&Vr(i,Cn,e),Nr(o,un)&&Nr(o[un],t)&&(o[un][t]=!1);var s=Fr(1,e);try{En(o,t,s)}catch(r){if(!(r instanceof Sn))throw r;Vn(o,t,s)}};return Pr&&Gn&&En(_n,t,{configurable:!0,set:i}),Pn(t,e)},qr(vn=yn[hn],"toString",(function(){return bn(this).tag})),qr(yn,"withoutSetter",(function(e){return Pn(on(e),e)})),Br.f=Nn,jr.f=kn,Qr.f=xn,zr.f=Mn,Ur.f=Dr.f=Yn,Ar.f=wn,rn.f=function(e){return Pn(sn(e),e)},Pr&&$r(vn,"description",{configurable:!0,get:function(){return bn(this).description}})),Wr({global:!0,constructor:!0,wrap:!0,forced:!kr,sham:!kr},{Symbol:yn}),ln(Or(Wn),(function(e){nn(e)})),Wr({target:mn,stat:!0,forced:!kr},{useSetter:function(){Gn=!0},useSimple:function(){Gn=!1}}),Wr({target:"Object",stat:!0,forced:!kr,sham:!Pr},{create:function(e,t){return void 0===t?Jr(e):xn(Jr(e),t)},defineProperty:kn,defineProperties:xn,getOwnPropertyDescriptor:Mn}),Wr({target:"Object",stat:!0,forced:!kr},{getOwnPropertyNames:Yn}),an(),dn(yn,mn),tn[un]=!0;var Kn=Se&&!!Symbol.for&&!!Symbol.keyFor,Hn=Vi,Fn=se,Jn=tt,On=fo,Un=je,Dn=Kn,An=Un("string-to-symbol-registry"),zn=Un("symbol-to-string-registry");Hn({target:"Symbol",stat:!0,forced:!Dn},{for:function(e){var t=On(e);if(Jn(An,t))return An[t];var i=Fn("Symbol")(t);return An[t]=i,zn[i]=t,i}});var jn=Vi,Qn=tt,Bn=Re,qn=Le,$n=Kn,ea=je("symbol-to-string-registry");jn({target:"Symbol",stat:!0,forced:!$n},{keyFor:function(e){if(!Bn(e))throw new TypeError(qn(e)+" is not a symbol");if(Qn(ea,e))return ea[e]}});var ta=Qs,ia=X,oa=f,sa=fo,ra=y([].push),na=Vi,aa=se,da=m,ca=V,la=y,ua=n,ma=X,ha=Re,pa=qo,ba=function(e){if(ia(e))return e;if(ta(e)){for(var t=e.length,i=[],o=0;o<t;o++){var s=e[o];"string"==typeof s?ra(i,s):"number"!=typeof s&&"Number"!==oa(s)&&"String"!==oa(s)||ra(i,sa(s))}var r=i.length,n=!0;return function(e,t){if(n)return n=!1,t;if(ta(this))return t;for(var o=0;o<r;o++)if(i[o]===e)return t}}},_a=Se,ya=String,va=aa("JSON","stringify"),Sa=la(/./.exec),Za=la("".charAt),fa=la("".charCodeAt),Ta=la("".replace),Ia=la(1..toString),ga=/[\uD800-\uDFFF]/g,Ra=/^[\uD800-\uDBFF]$/,Xa=/^[\uDC00-\uDFFF]$/,La=!_a||ua((function(){var e=aa("Symbol")("stringify detection");return"[null]"!==va([e])||"{}"!==va({a:e})||"{}"!==va(Object(e))})),Ca=ua((function(){return'"\\udf06\\ud834"'!==va("\udf06\ud834")||'"\\udead"'!==va("\udead")})),Wa=function(e,t){var i=pa(arguments),o=ba(t);if(ma(o)||void 0!==e&&!ha(e))return i[1]=function(e,t){if(ma(o)&&(t=ca(o,this,ya(e),t)),!ha(t))return t},da(va,null,i)},Ga=function(e,t,i){var o=Za(i,t-1),s=Za(i,t+1);return Sa(Ra,e)&&!Sa(Xa,s)||Sa(Xa,e)&&!Sa(Ra,o)?"\\u"+Ia(fa(e,0),16):e};va&&na({target:"JSON",stat:!0,arity:3,forced:La||Ca},{stringify:function(e,t,i){var o=pa(arguments),s=da(La?Wa:va,null,o);return Ca&&"string"==typeof s?Ta(s,ga,Ga):s}});var Va=ss,Ea=qe;Vi({target:"Object",stat:!0,forced:!Se||n((function(){Va.f(1)}))},{getOwnPropertySymbols:function(e){var t=Va.f;return t?t(Ea(e)):[]}});var Pa=i($.Object.getOwnPropertySymbols),ka=n,xa=be,Na=bt("species"),Ma=function(e){return xa>=51||!ka((function(){var t=[];return(t.constructor={})[Na]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Ya=Cr.filter;Vi({target:"Array",proto:!0,forced:!Ma("filter")},{filter:function(e){return Ya(this,e,arguments.length>1?arguments[1]:void 0)}});var wa=r,Ka=$,Ha=function(e,t){var i=Ka[e+"Prototype"],o=i&&i[t];if(o)return o;var s=wa[e],r=s&&s.prototype;return r&&r[t]},Fa=Ha("Array","filter"),Ja=re,Oa=Fa,Ua=Array.prototype,Da=i((function(e){var t=e.filter;return e===Ua||Ja(Ua,e)&&t===Ua.filter?Oa:t})),Aa={exports:{}},za=Vi,ja=n,Qa=Q,Ba=L.f,qa=C;za({target:"Object",stat:!0,forced:!qa||ja((function(){Ba(1)})),sham:!qa},{getOwnPropertyDescriptor:function(e,t){return Ba(Qa(e),t)}});var $a=$.Object,ed=Aa.exports=function(e,t){return $a.getOwnPropertyDescriptor(e,t)};$a.getOwnPropertyDescriptor.sham&&(ed.sham=!0);var td=i(Aa.exports),id=C,od=Qs,sd=TypeError,rd=Object.getOwnPropertyDescriptor,nd=id&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}(),ad=TypeError,dd=function(e){if(e>9007199254740991)throw ad("Maximum allowed index exceeded");return e},cd=qe,ld=Ji,ud=nd?function(e,t){if(od(e)&&!rd(e,"length").writable)throw new sd("Cannot set read only .length");return e.length=t}:function(e,t){return e.length=t},md=dd;Vi({target:"Array",proto:!0,arity:1,forced:n((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(e){return e instanceof TypeError}}()},{push:function(e){var t=cd(this),i=ld(t),o=arguments.length;md(i+o);for(var s=0;s<o;s++)t[i]=arguments[s],i++;return ud(t,i),i}});var hd=Ha("Array","push"),pd=re,bd=hd,_d=Array.prototype,yd=i((function(e){var t=e.push;return e===_d||pd(_d,e)&&t===_d.push?bd:t})),vd=n,Sd=function(e,t){var i=[][e];return!!i&&vd((function(){i.call(null,t||function(){return 1},1)}))},Zd=Cr.forEach,fd=Sd("forEach")?[].forEach:function(e){return Zd(this,e,arguments.length>1?arguments[1]:void 0)};Vi({target:"Array",proto:!0,forced:[].forEach!==fd},{forEach:fd});var Td=Ha("Array","forEach"),Id=vo,gd=tt,Rd=re,Xd=Td,Ld=Array.prototype,Cd={DOMTokenList:!0,NodeList:!0},Wd=i((function(e){var t=e.forEach;return e===Ld||Rd(Ld,e)&&t===Ld.forEach||gd(Cd,Id(e))?Xd:t})),Gd=se,Vd=zo,Ed=ss,Pd=ri,kd=y([].concat),xd=Gd("Reflect","ownKeys")||function(e){var t=Vd.f(Pd(e)),i=Ed.f;return i?kd(t,i(e)):t},Nd=C,Md=ei,Yd=Y,wd=function(e,t,i){Nd?Md.f(e,t,Yd(0,i)):e[t]=i},Kd=xd,Hd=Q,Fd=L,Jd=wd;Vi({target:"Object",stat:!0,sham:!C},{getOwnPropertyDescriptors:function(e){for(var t,i,o=Hd(e),s=Fd.f,r=Kd(o),n={},a=0;r.length>a;)void 0!==(i=s(o,t=r[a++]))&&Jd(n,t,i);return n}});var Od=i($.Object.getOwnPropertyDescriptors),Ud={exports:{}},Dd=Vi,Ad=C,zd=To.f;Dd({target:"Object",stat:!0,forced:Object.defineProperties!==zd,sham:!Ad},{defineProperties:zd});var jd=$.Object,Qd=Ud.exports=function(e,t){return jd.defineProperties(e,t)};jd.defineProperties.sham&&(Qd.sham=!0);var Bd=i(Ud.exports),qd={exports:{}},$d=Vi,ec=C,tc=ei.f;$d({target:"Object",stat:!0,forced:Object.defineProperty!==tc,sham:!ec},{defineProperty:tc});var ic=$.Object,oc=qd.exports=function(e,t,i){return ic.defineProperty(e,t,i)};ic.defineProperty.sham&&(oc.sham=!0);var sc=i(qd.exports),rc=Vi,nc=n,ac=Qs,dc=q,cc=qe,lc=Ji,uc=dd,mc=wd,hc=Zr,pc=Ma,bc=be,_c=bt("isConcatSpreadable"),yc=bc>=51||!nc((function(){var e=[];return e[_c]=!1,e.concat()[0]!==e})),vc=function(e){if(!dc(e))return!1;var t=e[_c];return void 0!==t?!!t:ac(e)};rc({target:"Array",proto:!0,arity:1,forced:!yc||!pc("concat")},{concat:function(e){var t,i,o,s,r,n=cc(this),a=hc(n,0),d=0;for(t=-1,o=arguments.length;t<o;t++)if(vc(r=-1===t?n:arguments[t]))for(s=lc(r),uc(d+s),i=0;i<s;i++,d++)i in r&&mc(a,d,r[i]);else uc(d+1),mc(a,d++,r);return a.length=d,a}}),vs("asyncIterator"),vs("hasInstance"),vs("isConcatSpreadable"),vs("iterator"),vs("match"),vs("matchAll"),vs("replace"),vs("search"),vs("species"),vs("split");var Sc=Is;vs("toPrimitive"),Sc();var Zc=se,fc=Es;vs("toStringTag"),fc(Zc("Symbol"),"Symbol"),vs("unscopables"),Es(r.JSON,"JSON",!0);var Tc,Ic,gc,Rc=$.Symbol,Xc={},Lc=C,Cc=tt,Wc=Function.prototype,Gc=Lc&&Object.getOwnPropertyDescriptor,Vc=Cc(Wc,"name"),Ec={EXISTS:Vc,PROPER:Vc&&"something"===function(){}.name,CONFIGURABLE:Vc&&(!Lc||Lc&&Gc(Wc,"name").configurable)},Pc=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),kc=tt,xc=X,Nc=qe,Mc=Pc,Yc=Po("IE_PROTO"),wc=Object,Kc=wc.prototype,Hc=Mc?wc.getPrototypeOf:function(e){var t=Nc(e);if(kc(t,Yc))return t[Yc];var i=t.constructor;return xc(i)&&t instanceof i?i.prototype:t instanceof wc?Kc:null},Fc=n,Jc=X,Oc=q,Uc=Ao,Dc=Hc,Ac=ns,zc=bt("iterator"),jc=!1;[].keys&&("next"in(gc=[].keys())?(Ic=Dc(Dc(gc)))!==Object.prototype&&(Tc=Ic):jc=!0);var Qc=!Oc(Tc)||Fc((function(){var e={};return Tc[zc].call(e)!==e}));Jc((Tc=Qc?{}:Uc(Tc))[zc])||Ac(Tc,zc,(function(){return this}));var Bc={IteratorPrototype:Tc,BUGGY_SAFARI_ITERATORS:jc},qc=Bc.IteratorPrototype,$c=Ao,el=Y,tl=Es,il=Xc,ol=function(){return this},sl=function(e,t,i,o){var s=t+" Iterator";return e.prototype=$c(qc,{next:el(+!o,i)}),tl(e,s,!1,!0),il[s]=ol,e},rl=y,nl=Ve,al=q,dl=function(e){return al(e)||null===e},cl=String,ll=TypeError,ul=function(e,t,i){try{return rl(nl(Object.getOwnPropertyDescriptor(e,t)[i]))}catch(o){}},ml=q,hl=A,pl=function(e){if(dl(e))return e;throw new ll("Can't set "+cl(e)+" as a prototype")},bl=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,i={};try{(e=ul(Object.prototype,"__proto__","set"))(i,[]),t=i instanceof Array}catch(o){}return function(i,o){return hl(i),pl(o),ml(i)?(t?e(i,o):i.__proto__=o,i):i}}():void 0),_l=Vi,yl=V,vl=Ec,Sl=sl,Zl=Hc,fl=Es,Tl=ns,Il=Xc,gl=Bc,Rl=vl.PROPER,Xl=gl.BUGGY_SAFARI_ITERATORS,Ll=bt("iterator"),Cl="keys",Wl="values",Gl="entries",Vl=function(){return this},El=function(e,t,i,o,s,r,n){Sl(i,t,o);var a,d,c,l=function(e){if(e===s&&b)return b;if(!Xl&&e&&e in h)return h[e];switch(e){case Cl:case Wl:case Gl:return function(){return new i(this,e)}}return function(){return new i(this)}},u=t+" Iterator",m=!1,h=e.prototype,p=h[Ll]||h["@@iterator"]||s&&h[s],b=!Xl&&p||l(s),_="Array"===t&&h.entries||p;if(_&&(a=Zl(_.call(new e)))!==Object.prototype&&a.next&&(fl(a,u,!0,!0),Il[u]=Vl),Rl&&s===Wl&&p&&p.name!==Wl&&(m=!0,b=function(){return yl(p,this)}),s)if(d={values:l(Wl),keys:r?b:l(Cl),entries:l(Gl)},n)for(c in d)(Xl||m||!(c in h))&&Tl(h,c,d[c]);else _l({target:t,proto:!0,forced:Xl||m},d);return n&&h[Ll]!==b&&Tl(h,Ll,b,{name:s}),Il[t]=b,d},Pl=function(e,t){return{value:e,done:t}},kl=Q,xl=Xc,Nl=zs;ei.f;var Ml=El,Yl=Pl,wl="Array Iterator",Kl=Nl.set,Hl=Nl.getterFor(wl);Ml(Array,"Array",(function(e,t){Kl(this,{type:wl,target:kl(e),index:0,kind:t})}),(function(){var e=Hl(this),t=e.target,i=e.index++;if(!t||i>=t.length)return e.target=null,Yl(void 0,!0);switch(e.kind){case"keys":return Yl(i,!1);case"values":return Yl(t[i],!1)}return Yl([i,t[i]],!1)}),"values"),xl.Arguments=xl.Array;var Fl={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Jl=r,Ol=Es,Ul=Xc;for(var Dl in Fl)Ol(Jl[Dl],Dl),Ul[Dl]=Ul.Array;var Al=Rc,zl=bt,jl=ei.f,Ql=zl("metadata"),Bl=Function.prototype;void 0===Bl[Ql]&&jl(Bl,Ql,{value:null}),vs("asyncDispose"),vs("dispose"),vs("metadata");var ql=Al,$l=y,eu=se("Symbol"),tu=eu.keyFor,iu=$l(eu.prototype.valueOf),ou=eu.isRegisteredSymbol||function(e){try{return void 0!==tu(iu(e))}catch(t){return!1}};Vi({target:"Symbol",stat:!0},{isRegisteredSymbol:ou});for(var su=je,ru=se,nu=y,au=Re,du=bt,cu=ru("Symbol"),lu=cu.isWellKnownSymbol,uu=ru("Object","getOwnPropertyNames"),mu=nu(cu.prototype.valueOf),hu=su("wks"),pu=0,bu=uu(cu),_u=bu.length;pu<_u;pu++)try{var yu=bu[pu];au(cu[yu])&&du(yu)}catch(oK){}var vu=function(e){if(lu&&lu(e))return!0;try{for(var t=mu(e),i=0,o=uu(hu),s=o.length;i<s;i++)if(hu[o[i]]==t)return!0}catch(oK){}return!1};Vi({target:"Symbol",stat:!0,forced:!0},{isWellKnownSymbol:vu}),vs("customMatcher"),vs("observable"),Vi({target:"Symbol",stat:!0,name:"isRegisteredSymbol"},{isRegistered:ou}),Vi({target:"Symbol",stat:!0,name:"isWellKnownSymbol",forced:!0},{isWellKnown:vu}),vs("matcher"),vs("metadataKey"),vs("patternMatch"),vs("replaceAll");var Su=i(ql),Zu=y,fu=xi,Tu=fo,Iu=A,gu=Zu("".charAt),Ru=Zu("".charCodeAt),Xu=Zu("".slice),Lu=function(e){return function(t,i){var o,s,r=Tu(Iu(t)),n=fu(i),a=r.length;return n<0||n>=a?e?"":void 0:(o=Ru(r,n))<55296||o>56319||n+1===a||(s=Ru(r,n+1))<56320||s>57343?e?gu(r,n):o:e?Xu(r,n,n+2):s-56320+(o-55296<<10)+65536}},Cu={codeAt:Lu(!1),charAt:Lu(!0)},Wu=Cu.charAt,Gu=fo,Vu=zs,Eu=El,Pu=Pl,ku="String Iterator",xu=Vu.set,Nu=Vu.getterFor(ku);Eu(String,"String",(function(e){xu(this,{type:ku,string:Gu(e),index:0})}),(function(){var e,t=Nu(this),i=t.string,o=t.index;return o>=i.length?Pu(void 0,!0):(e=Wu(i,o),t.index+=e.length,Pu(e,!1))}));var Mu=i(cs.f("iterator"));function Yu(e){return(Yu="function"==typeof Su&&"symbol"==typeof Mu?function(e){return typeof e}:function(e){return e&&"function"==typeof Su&&e.constructor===Su&&e!==Su.prototype?"symbol":typeof e})(e)}var wu=i(cs.f("toPrimitive"));function Ku(e){var t=function(e,t){if("object"!=Yu(e)||!e)return e;var i=e[wu];if(void 0!==i){var o=i.call(e,t||"default");if("object"!=Yu(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==Yu(t)?t:t+""}function Hu(e,t,i){return(t=Ku(t))in e?sc(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function Fu(e,t){var i=co(e);if(Pa){var o=Pa(e);t&&(o=Da(o).call(o,(function(t){return td(e,t).enumerable}))),yd(i).apply(i,o)}return i}function Ju(e){for(var t=1;t<arguments.length;t++){var i,o,s=null!=arguments[t]?arguments[t]:{};t%2?Wd(i=Fu(Object(s),!0)).call(i,(function(t){Hu(e,t,s[t])})):Od?Bd(e,Od(s)):Wd(o=Fu(Object(s))).call(o,(function(t){sc(e,t,td(s,t))}))}return e}var Ou=(e=>(e[e.VIDEO_SOURCE_TYPE_EXTERNAL=0]="VIDEO_SOURCE_TYPE_EXTERNAL",e[e.VIDEO_SOURCE_TYPE_INTERNAL=1]="VIDEO_SOURCE_TYPE_INTERNAL",e))(Ou||{}),Uu=(e=>(e[e.AUDIO_SOURCE_TYPE_EXTERNAL=0]="AUDIO_SOURCE_TYPE_EXTERNAL",e[e.AUDIO_SOURCE_TYPE_INTERNAL=1]="AUDIO_SOURCE_TYPE_INTERNAL",e))(Uu||{}),Du=(e=>(e[e.QUIT=0]="QUIT",e[e.DROPPED=1]="DROPPED",e[e.SWITCH_TO_INVISIBLE=2]="SWITCH_TO_INVISIBLE",e[e.KICKED_BY_ADMIN=3]="KICKED_BY_ADMIN",e))(Du||{}),Au=(e=>(e.userLeave="userLeave",e.connectionLost="connectionLost",e.userDuplicateLogin="userDuplicateLogin",e.kickedByAdmin="kickedByAdmin",e.roleChanged="roleChanged",e.onUserTokenDidExpire="onUserTokenDidExpire",e))(Au||{}),zu=(e=>(e[e.CHANNEL_PROFILE_COMMUNICATION=0]="CHANNEL_PROFILE_COMMUNICATION",e[e.CHANNEL_PROFILE_LIVE_BROADCASTING=1]="CHANNEL_PROFILE_LIVE_BROADCASTING",e))(zu||{}),ju=(e=>(e[e.AUTO_SUBSCRIBE_MODE=0]="AUTO_SUBSCRIBE_MODE",e[e.MANUAL_SUBSCRIBE_MODE=1]="MANUAL_SUBSCRIBE_MODE",e))(ju||{}),Qu=(e=>(e[e.SUBSCRIBE_SUCC=0]="SUBSCRIBE_SUCC",e[e.SUBSCRIBE_FAIL=1]="SUBSCRIBE_FAIL",e))(Qu||{}),Bu=(e=>(e[e.PUBLISH_SUCC=0]="PUBLISH_SUCC",e[e.PUBLISH_FAIL=1]="PUBLISH_FAIL",e))(Bu||{}),qu=(e=>(e[e.MIRROR_MODE_OFF=0]="MIRROR_MODE_OFF",e[e.MIRROR_MODE_ON=1]="MIRROR_MODE_ON",e))(qu||{}),$u=(e=>(e[e.RENDER_MODE_HIDDEN=0]="RENDER_MODE_HIDDEN",e[e.RENDER_MODE_FIT=1]="RENDER_MODE_FIT",e[e.RENDER_MODE_FILL=2]="RENDER_MODE_FILL",e))($u||{}),em=(e=>(e[e.STREAM_INDEX_MAIN=0]="STREAM_INDEX_MAIN",e[e.STREAM_INDEX_SCREEN=1]="STREAM_INDEX_SCREEN",e))(em||{}),tm=(e=>(e[e.AUDIO=1]="AUDIO",e[e.VIDEO=2]="VIDEO",e[e.AUDIO_AND_VIDEO=3]="AUDIO_AND_VIDEO",e))(tm||{}),im=(e=>(e[e.STREAM_REMOVE_REASON_UNPUBLISH=0]="STREAM_REMOVE_REASON_UNPUBLISH",e[e.STREAM_REMOVE_REASON_PUBLISH_FAILED=1]="STREAM_REMOVE_REASON_PUBLISH_FAILED",e[e.STREAM_REMOVE_REASON_KEEP_LIVE_FAILED=2]="STREAM_REMOVE_REASON_KEEP_LIVE_FAILED",e[e.STREAM_REMOVE_REASON_CLIENT_DISCONNECTED=3]="STREAM_REMOVE_REASON_CLIENT_DISCONNECTED",e[e.STREAM_REMOVE_REASON_REPUBLISH=4]="STREAM_REMOVE_REASON_REPUBLISH",e[e.STREAM_REMOVE_REASON_OTHER=5]="STREAM_REMOVE_REASON_OTHER",e[e.STREAM_REMOVE_REASON_TOKEN_PRIVILEGE_EXPIRED=6]="STREAM_REMOVE_REASON_TOKEN_PRIVILEGE_EXPIRED",e))(im||{}),om=(e=>(e[e.CONNECTION_START=0]="CONNECTION_START",e[e.CONNECTION_STATE_DISCONNECTED=1]="CONNECTION_STATE_DISCONNECTED",e[e.CONNECTION_STATE_CONNECTING=2]="CONNECTION_STATE_CONNECTING",e[e.CONNECTION_STATE_CONNECTED=3]="CONNECTION_STATE_CONNECTED",e[e.CONNECTION_STATE_RECONNECTING=4]="CONNECTION_STATE_RECONNECTING",e[e.CONNECTION_STATE_RECONNECTED=5]="CONNECTION_STATE_RECONNECTED",e[e.CONNECTION_STATE_LOST=6]="CONNECTION_STATE_LOST",e))(om||{}),sm=(e=>(e.ICE_FAILED="iceFailed",e.NODE_CHANGE="nodeChange",e.JOIN_TIMEOUT="joinTimeout",e.NOTIFY_RECONNECT="notifyReconnect",e))(sm||{}),rm=(e=>(e.AUTO="auto",e.H264="h264",e.VP8="vp8",e.H265="h265",e))(rm||{}),nm=(e=>(e[e.MIRROR_TYPE_NONE=0]="MIRROR_TYPE_NONE",e[e.MIRROR_TYPE_RENDER=1]="MIRROR_TYPE_RENDER",e))(nm||{}),am=(e=>(e[e.NORMAL=0]="NORMAL",e[e.DISCONNECT=1]="DISCONNECT",e[e.RESET=2]="RESET",e))(am||{}),dm=(e=>(e[e.MICROPHONE=0]="MICROPHONE",e[e.AUDIOMIXING=1]="AUDIOMIXING",e))(dm||{}),cm=(e=>(e[e.domestic=0]="domestic",e[e.overseas=1]="overseas",e))(cm||{}),lm=(e=>(e[e.OFFLINE=0]="OFFLINE",e[e.ONLINE=1]="ONLINE",e[e.UNREACHABLE=2]="UNREACHABLE",e))(lm||{}),um=(e=>(e[e.AUDIO_AND_VIDEO=0]="AUDIO_AND_VIDEO",e[e.AUDIO_ONLY=1]="AUDIO_ONLY",e[e.VIDEO_ONLY=2]="VIDEO_ONLY",e))(um||{}),mm=(e=>(e[e.PREV_FRAME=0]="PREV_FRAME",e[e.OTHER_FRAME=1]="OTHER_FRAME",e))(mm||{}),hm=(e=>(e[e.DISABLE=0]="DISABLE",e[e.VIDEO_STREAM_LOW=1]="VIDEO_STREAM_LOW",e[e.AUDIO_ONLY=2]="AUDIO_ONLY",e))(hm||{}),pm=(e=>(e[e.LOW=0]="LOW",e[e.MEDIUM=100]="MEDIUM",e[e.HIGH=200]="HIGH",e))(pm||{}),bm=(e=>(e[e.UNKNOWN=0]="UNKNOWN",e[e.EXCELLENT=1]="EXCELLENT",e[e.GOOD=2]="GOOD",e[e.POOR=3]="POOR",e[e.BAD=4]="BAD",e[e.VBAD=5]="VBAD",e[e.DOWN=6]="DOWN",e))(bm||{}),_m=(e=>(e[e.Unknown=-1]="Unknown",e[e.SubscribeFallbackByBandwidth=0]="SubscribeFallbackByBandwidth",e[e.SubscribeRecoverByBandwidth=2]="SubscribeRecoverByBandwidth",e))(_m||{}),ym=(e=>(e[e.communication=0]="communication",e[e.chat=5]="chat",e[e.chatRoom=6]="chatRoom",e[e.coHost=9]="coHost",e[e.meeting=16]="meeting",e[e.classRoom=18]="classRoom",e))(ym||{}),vm=(e=>(e[e.default=0]="default",e[e.fluent=1]="fluent",e[e.standard=2]="standard",e[e.hd=3]="hd",e[e.standardStereo=4]="standardStereo",e[e.hdMono=5]="hdMono",e))(vm||{}),Sm=(e=>(e[e.AUTO_PLAY=0]="AUTO_PLAY",e[e.VIDEO_ONLY=1]="VIDEO_ONLY",e[e.PLAY_MANUALLY=2]="PLAY_MANUALLY",e))(Sm||{}),Zm=(e=>(e.LC="LC",e.HEv1="HEv1",e.HEv2="HEv2",e))(Zm||{}),fm=(e=>(e.H264="H264",e.H265="H265",e))(fm||{}),Tm=(e=>(e[e.ASR_ONLY=0]="ASR_ONLY",e[e.ASR_AND_TRANSLATION=1]="ASR_AND_TRANSLATION",e))(Tm||{}),Im=(e=>(e[e.STARTED=0]="STARTED",e[e.STOPPED=1]="STOPPED",e[e.ERROR=2]="ERROR",e[e.UPDATED=3]="UPDATED",e))(Im||{}),gm=(e=>(e[e.FORWARD_STREAM_STATE_SUCCESS=0]="FORWARD_STREAM_STATE_SUCCESS",e[e.FORWARD_STREAM_STATE_FAILURE=1]="FORWARD_STREAM_STATE_FAILURE",e))(gm||{}),Rm=(e=>(e[e.FORWARD_STREAM_ERROR_OK=0]="FORWARD_STREAM_ERROR_OK",e[e.FORWARD_STREAM_ERROR_INVALID_TOKEN=1202]="FORWARD_STREAM_ERROR_INVALID_TOKEN",e[e.FORWARD_STREAM_ERROR_RESPONSE=1203]="FORWARD_STREAM_ERROR_RESPONSE",e[e.FORWARD_STREAM_ERROR_REMOTE_KICKED=1204]="FORWARD_STREAM_ERROR_REMOTE_KICKED",e[e.FORWARD_STREAM_ERROR_NOT_SUPPORT=1205]="FORWARD_STREAM_ERROR_NOT_SUPPORT",e))(Rm||{}),Xm=(e=>(e[e.DEFAULT=0]="DEFAULT",e[e.HIGH=1]="HIGH",e))(Xm||{}),Lm=(e=>(e[e.VIDEO_ONLY_ONE=0]="VIDEO_ONLY_ONE",e[e.VIDEO_ON_DEMAND=1]="VIDEO_ON_DEMAND",e[e.VIDEO_ALWAYS_SIMULCAST=2]="VIDEO_ALWAYS_SIMULCAST",e))(Lm||{}),Cm=(e=>(e.VIDEO_STREAM_HIGH="high",e.VIDEO_STREAM_MID="mid",e.VIDEO_STREAM_LOW="low",e))(Cm||{}),Wm=(e=>(e[e.NONE=0]="NONE",e[e.AFTER_CAPTURE=1]="AFTER_CAPTURE",e[e.AFTER_PROCESS=2]="AFTER_PROCESS",e))(Wm||{}),Gm=(e=>(e[e.ROOM_MODE_RTC=0]="ROOM_MODE_RTC",e[e.ROOM_MODE_RTS_ONLY=1]="ROOM_MODE_RTS_ONLY",e))(Gm||{}),Vm=(e=>(e.PLAYER_VISIBLE="visible",e.PLAYER_INVISIBLE_BY_UNMOUNT="unmount",e.PLAYER_INVISIBLE_BY_SIZE="size",e.PLAYER_INVISIBLE_BY_STYLE="style",e.PLAYER_INVISIBLE_BY_POSITION="position",e.PLAYER_INVISIBLE_BY_COVERED="covered",e))(Vm||{}),Em=Object.freeze({__proto__:null,AAC_PROFILE:Zm,AudioProfileType:vm,AudioReportMode:dm,AudioSelectionPriority:Xm,AudioSourceType:Uu,ChannelProfile:zu,ConnectionState:om,EarMonitorPosition:Wm,FallbackOrRecoverReason:_m,ForwardStreamError:Rm,ForwardStreamState:gm,LocalMainReportMode:am,LogChannel:cm,MediaType:tm,MirrorMode:qu,MirrorType:nm,NetworkQuality:bm,PublicInterpolationMode:mm,PublicStreamType:um,PublishState:Bu,RTCAutoPlayPolicy:Sm,ReconnectReason:sm,RemoteUserPriority:pm,RoomMode:Gm,RoomProfileType:ym,SUBTITLE_MODE:Tm,SimulcastStreamType:Cm,StreamIndex:em,StreamRemoveReason:im,SubscribeFallbackOption:hm,SubscribeMode:ju,SubscribeState:Qu,SubtitleEventType:Im,TRANSCODING_VIDEO_CODEC:fm,USER_ONLINE_STATUS:lm,UserDisconnectionTag:Au,UserOfflineReason:Du,VideoCodecType:rm,VideoRenderMode:$u,VideoSimulcastMode:Lm,VideoSourceType:Ou,VisibilityStatus:Vm}),Pm=(e=>(e[e.AUTO=0]="AUTO",e[e.MODE_L=1]="MODE_L",e[e.MODE_R=2]="MODE_R",e[e.MODE_MIX=3]="MODE_MIX",e))(Pm||{}),km=(e=>(e[e.PLAYOUT=0]="PLAYOUT",e[e.PUBLISH=1]="PUBLISH",e[e.PLAYOUT_AND_PUBLISH=2]="PLAYOUT_AND_PUBLISH",e))(km||{}),xm=(e=>(e[e.AUDIO_MIXING_STATE_PRELOADED=0]="AUDIO_MIXING_STATE_PRELOADED",e[e.AUDIO_MIXING_STATE_PLAYING=1]="AUDIO_MIXING_STATE_PLAYING",e[e.AUDIO_MIXING_STATE_PAUSED=2]="AUDIO_MIXING_STATE_PAUSED",e[e.AUDIO_MIXING_STATE_STOPPED=3]="AUDIO_MIXING_STATE_STOPPED",e[e.AUDIO_MIXING_STATE_FAILED=4]="AUDIO_MIXING_STATE_FAILED",e[e.AUDIO_MIXING_STATE_FINISHED=5]="AUDIO_MIXING_STATE_FINISHED",e[e.AUDIO_MIXING_STATE_PCM_ENABLED=6]="AUDIO_MIXING_STATE_PCM_ENABLED",e[e.AUDIO_MIXING_STATE_PCM_DISABLED=7]="AUDIO_MIXING_STATE_PCM_DISABLED",e))(xm||{}),Nm=Object.freeze({__proto__:null,AudioMixingDualMonoMode:Pm,AudioMixingState:xm,AudioMixingType:km}),Mm=(e=>(e.onTrackEnded="onTrackEnded",e.onTrackMute="onTrackMute",e.onTrackUnmute="onTrackUnmute",e.onPlayerEvent="onPlayerEvent",e.onAutoplayFailed="onAutoplayFailed",e.onUserJoined="onUserJoined",e.onUserLeave="onUserLeave",e.onConnectionStateChanged="onConnectionStateChanged",e.onUserPublishStream="onUserPublishStream",e.onUserUnpublishStream="onUserUnpublishStream",e.onUserPublishScreen="onUserPublishScreen",e.onUserUnpublishScreen="onUserUnpublishScreen",e.onRoomMessageReceived="onRoomMessageReceived",e.onRoomBinaryMessageReceived="onRoomBinaryMessageReceived",e.onUserMessageReceived="onUserMessageReceived",e.onUserBinaryMessageReceived="onUserBinaryMessageReceived",e.onVideoFirstFrameRendered="onVideoFirstFrameRendered",e.onVideoFirstFrameDecoded="onVideoFirstFrameDecoded",e.onRemoteVideoFirstFrame="onRemoteVideoFirstFrame",e.onAudioFirstFrameDecoded="onAudioFirstFrameDecoded",e.onRemoteAudioFirstFrame="onRemoteAudioFirstFrame",e.onFirstPublicStreamVideoFrameRendered="onFirstPublicStreamVideoFrameRendered",e.onFirstPublicStreamVideoFrameDecoded="onFirstPublicStreamVideoFrameDecoded",e.onFirstPublicStreamAudioFrameDecoded="onFirstPublicStreamAudioFrameDecoded",e.onVideoDeviceStateChanged="onVideoDeviceStateChanged",e.onAudioDeviceStateChanged="onAudioDeviceStateChanged",e.onRemoteStreamStats="onRemoteStreamStats",e.onPublicStreamStats="onPublicStreamStats",e.onLocalStreamStats="onLocalStreamStats",e.onLocalStatsException="onLocalStatsException",e.onRemoteStatsException="onRemoteStatsException",e.onPublicStatsException="onPublicStatsException",e.onAudioVolumeIndication="onAudioVolumeIndication",e.onLocalAudioPropertiesReport="onLocalAudioPropertiesReport",e.onRemoteAudioPropertiesReport="onRemoteAudioPropertiesReport",e.onActiveSpeaker="onActiveSpeaker",e.onAudioPlaybackDeviceChanged="onAudioPlaybackDeviceChanged",e.onUserStartVideoCapture="onUserStartVideoCapture",e.onUserStopVideoCapture="onUserStopVideoCapture",e.onUserStartAudioCapture="onUserStartAudioCapture",e.onUserStopAudioCapture="onUserStopAudioCapture",e.onAutoPublishResult="onAutoPublishResult",e.onAutoSubscribeResult="onAutoSubscribeResult",e.onLiveTranscodingResult="onLiveTranscodingResult",e.onStreamMixingEvent="onStreamMixingEvent",e.onAudioPlaybackDeviceTestVolume="onAudioPlaybackDeviceTestVolume",e.onSEIMessageReceived="onSEIMessageReceived",e.onError="onError",e.onAudioMixingStateChanged="onAudioMixingStateChanged",e.onUserMessageReceivedOutsideRoom="onUserMessageReceivedOutsideRoom",e.onUserBinaryMessageReceivedOutsideRoom="onUserBinaryMessageReceivedOutsideRoom",e.onTokenWillExpire="onTokenWillExpire",e.onTokenPublishPrivilegeWillExpire="onTokenPublishPrivilegeWillExpire",e.onTokenPublishPrivilegeDidExpired="onTokenPublishPrivilegeDidExpired",e.onTokenSubscribePrivilegeWillExpire="onTokenSubscribePrivilegeWillExpire",e.onTokenSubscribePrivilegeDidExpired="onTokenSubscribePrivilegeDidExpired",e.onCloudProxyConnected="onCloudProxyConnected",e.onPushPublicStreamResult="onPushPublicStreamResult",e.onPublicStreamSEIMessageReceived="onPublicStreamSEIMessageReceived",e.onNetworkQuality="onNetworkQuality",e.onSimulcastSubscribeFallback="onSimulcastSubscribeFallback",e.onRemoteVideoSizeChanged="onRemoteVideoSizeChanged",e.onVideoStreamBanned="onVideoStreamBanned",e.onAudioStreamBanned="onAudioStreamBanned",e.onLocalVideoSizeChanged="onLocalVideoSizeChanged",e.onSubtitleStateChanged="onSubtitleStateChanged",e.onSubtitleMessageReceived="onSubtitleMessageReceived",e.onServerParamsSetResult="onServerParamsSetResult",e.onLocalStreamTrackChangedByExtension="onLocalStreamTrackChangedByExtension",e.onVendorConnectionStateChanged="onVendorConnectionStateChanged",e.onForwardStreamError="onForwardStreamError",e.onRejoinWithTcp="onRejoinWithTcp",e.onIceConnectWithTcp="onIceConnectWithTcp",e.onPublishRetry="onPublishRetry",e.onSubscribeRetry="onSubscribeRetry",e.onPublishResult="onPublishResult",e.onSubscribeResult="onSubscribeResult",e.onSEIStreamUpdate="onSEIStreamUpdate",e.onPlayerVisibility="onPlayerVisibility",e.onJitterBufferTargetStabled="onJitterBufferTargetStabled",e))(Mm||{}),Ym=Vi,wm=Qs,Km=y([].reverse),Hm=[1,2];Ym({target:"Array",proto:!0,forced:String(Hm)===String(Hm.reverse())},{reverse:function(){return wm(this)&&(this.length=this.length),Km(this)}});var Fm=Ha("Array","reverse"),Jm=re,Om=Fm,Um=Array.prototype,Dm=i((function(e){var t=e.reverse;return e===Um||Jm(Um,e)&&t===Um.reverse?Om:t})),Am="\t\n\v\f\r                　\u2028\u2029\ufeff",zm=A,jm=fo,Qm=Am,Bm=y("".replace),qm=RegExp("^["+Qm+"]+"),$m=RegExp("(^|[^"+Qm+"])["+Qm+"]+$"),eh=function(e){return function(t){var i=jm(zm(t));return 1&e&&(i=Bm(i,qm,"")),2&e&&(i=Bm(i,$m,"$1")),i}},th={start:eh(1),end:eh(2),trim:eh(3)},ih=Ec.PROPER,oh=n,sh=Am,rh=th.trim;Vi({target:"String",proto:!0,forced:function(e){return oh((function(){return!!sh[e]()||"​᠎"!=="​᠎"[e]()||ih&&sh[e].name!==e}))}("trim")},{trim:function(){return rh(this)}});var nh=Ha("String","trim"),ah=re,dh=nh,ch=String.prototype,lh=i((function(e){var t=e.trim;return"string"==typeof e||e===ch||ah(ch,e)&&t===ch.trim?dh:t})),uh=q,mh=f,hh=bt("match"),ph=function(e){var t;return uh(e)&&(void 0!==(t=e[hh])?!!t:"RegExp"===mh(e))},bh=ri,_h=V,yh=tt,vh=re,Sh=function(){var e=bh(this),t="";return e.hasIndices&&(t+="d"),e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.unicodeSets&&(t+="v"),e.sticky&&(t+="y"),t},Zh=RegExp.prototype,fh=function(e){var t=e.flags;return void 0!==t||"flags"in Zh||yh(e,"flags")||!vh(Zh,e)?t:_h(Sh,e)},Th=y,Ih=qe,gh=Math.floor,Rh=Th("".charAt),Xh=Th("".replace),Lh=Th("".slice),Ch=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,Wh=/\$([$&'`]|\d{1,2})/g,Gh=Vi,Vh=V,Eh=y,Ph=A,kh=X,xh=O,Nh=ph,Mh=fo,Yh=ke,wh=fh,Kh=function(e,t,i,o,s,r){var n=i+e.length,a=o.length,d=Wh;return void 0!==s&&(s=Ih(s),d=Ch),Xh(r,d,(function(r,d){var c;switch(Rh(d,0)){case"$":return"$";case"&":return e;case"`":return Lh(t,0,i);case"'":return Lh(t,n);case"<":c=s[Lh(d,1,-1)];break;default:var l=+d;if(0===l)return r;if(l>a){var u=gh(l/10);return 0===u?r:u<=a?void 0===o[u-1]?Rh(d,1):o[u-1]+Rh(d,1):r}c=o[l-1]}return void 0===c?"":c}))},Hh=bt("replace"),Fh=TypeError,Jh=Eh("".indexOf),Oh=Eh("".replace),Uh=Eh("".slice),Dh=Math.max;Gh({target:"String",proto:!0},{replaceAll:function(e,t){var i,o,s,r,n,a,d,c,l,u,m=Ph(this),h=0,p="";if(!xh(e)){if((i=Nh(e))&&(o=Mh(Ph(wh(e))),!~Jh(o,"g")))throw new Fh("`.replaceAll` does not allow non-global regexes");if(s=Yh(e,Hh))return Vh(s,e,m,t);if(i)return Oh(Mh(m),e,t)}for(r=Mh(m),n=Mh(e),(a=kh(t))||(t=Mh(t)),d=n.length,c=Dh(1,d),l=Jh(r,n);-1!==l;)u=a?Mh(t(n,l,r)):Kh(n,r,l,[],void 0,t),p+=Uh(r,h,l)+u,h=l+d,l=l+c>r.length?-1:Jh(r,n,l+c);return h<r.length&&(p+=Uh(r,h)),p}});var Ah,zh=Ha("String","replaceAll"),jh=re,Qh=zh,Bh=String.prototype,qh=i((function(e){var t=e.replaceAll;return"string"==typeof e||e===Bh||jh(Bh,e)&&t===Bh.replaceAll?Qh:t})),$h=new Uint8Array(16);function ep(){if(!Ah&&!(Ah="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Ah($h)}var tp=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;for(var ip=[],op=0;op<256;++op)ip.push((op+256).toString(16).substr(1));function sp(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=(ip[e[t+0]]+ip[e[t+1]]+ip[e[t+2]]+ip[e[t+3]]+"-"+ip[e[t+4]]+ip[e[t+5]]+"-"+ip[e[t+6]]+ip[e[t+7]]+"-"+ip[e[t+8]]+ip[e[t+9]]+"-"+ip[e[t+10]]+ip[e[t+11]]+ip[e[t+12]]+ip[e[t+13]]+ip[e[t+14]]+ip[e[t+15]]).toLowerCase();if(!function(e){return"string"==typeof e&&tp.test(e)}(i))throw TypeError("Stringified UUID is invalid");return i}function rp(e,t,i){var o=(e=e||{}).random||(e.rng||ep)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){i=i||0;for(var s=0;s<16;++s)t[i+s]=o[s];return t}return sp(o)}const np=()=>"undefined"==typeof window,ap=()=>rp(),dp=e=>"number"==typeof e;function cp(e){return null==e?"undefined | null":"string"==typeof e?e:JSON.stringify({contentHint:e.contentHint,enabled:e.enabled,id:e.id,kind:e.kind,label:e.label,muted:e.muted,readyState:e.readyState})}function lp(e){return null==e?"undefined | null":"string"==typeof e?e:JSON.stringify({id:e.id,active:e.active})}function up(e){return null==e?"undefined | null":"string"==typeof e?e:JSON.stringify({track:cp(e.track)})}function mp(e){return null==e?"undefined | null":"string"==typeof e?e:JSON.stringify({track:cp(e.track)})}function hp(e){return null==e?"undefined | null":"string"==typeof e?e:JSON.stringify({currentDirection:e.currentDirection,direction:e.direction,mid:e.mid,stopped:e.stopped,receiver:mp(e.receiver),sender:up(e.sender)})}const pp="@byted/ve-rtc",bp="@byted/ve-rtc-cache-size";var _p=new class{constructor(){Hu(this,"storeKey",void 0),Hu(this,"logLevel",void 0),Hu(this,"LogfileSize",void 0),Hu(this,"db",void 0),Hu(this,"logId",void 0),Hu(this,"cacheLog",void 0),Hu(this,"cachedSize",void 0),Hu(this,"preCacheTime",void 0),Hu(this,"timer",void 0),Hu(this,"_getSize",(e=>new Blob(e).size/1048576)),this.storeKey="",this.logId=1,this.cacheLog="",this.logLevel="none",this.LogfileSize=100,this._createStore()}_createStore(){if(np()||!window.indexedDB)return;const e=indexedDB.open("@byted/ve-rtc");e.onupgradeneeded=()=>{e.result.createObjectStore(pp);try{localStorage.removeItem(bp)}catch(oK){}},e.onerror=e=>{},e.onsuccess=()=>{this.db=e.result,this._getCachedSize()}}_getCachedSize(){try{const e=localStorage.getItem(bp);e?this.cachedSize=Number(e):this.values().then((e=>{this.cachedSize=this._getSize(e),this._setCachedSize()}))}catch(oK){}}_setCachedSize(){try{localStorage.setItem(bp,"".concat(this.cachedSize))}catch(oK){}}_getStore(e){if(this.db)return this.db.transaction(pp,e).objectStore(pp)}set(e){return new Promise(((t,i)=>{if("none"===this.logLevel)return t();if(e&&this.preCacheTime&&this.preCacheTime-Date.now()<1e3)return this.cacheLog+="\n\n".concat(this.logId,": ").concat(e),this.logId++,this.timer||(this.timer=setTimeout((()=>{this.set("")}),1e3-(this.preCacheTime-Date.now()))),t();clearTimeout(this.timer),this.timer=null;const o=this._getStore("readwrite");if(!o)return i("get store fail");this.cachedSize&&this.cachedSize>this.LogfileSize&&this.keyEarliest().then((e=>{this.get(e).then((t=>{this.del(e).then((()=>{this.cachedSize=this.cachedSize-this._getSize(["".concat(t)]),this._setCachedSize()}))}))}));const s=o.get(this.storeKey);s.onsuccess=()=>{try{const i="".concat(s.result||"").concat(this.cacheLog),r=e?"".concat(i?"\n\n":"").concat(this.logId,": ").concat(e):"";o.put("".concat(i).concat(r),this.storeKey),e&&this.logId++,this.cacheLog="",this.cachedSize=(this.cachedSize||0)+this._getSize(["".concat(this.cacheLog).concat(r)]),this._setCachedSize(),this.preCacheTime=Date.now(),t()}catch(r){if(!e)return i(r);this.cacheLog+="\n\n".concat(this.logId,": ").concat(e),this.logId++,i(r)}},s.onerror=t=>{if(!e)return i(t);this.cacheLog+="\n\n".concat(this.logId,": ").concat(e),this.logId++,i(t)}}))}get(e){return new Promise(((t,i)=>{const o=this._getStore("readonly");if(!o)return i();const s=o.get(e);s.onsuccess=()=>{t(s.result)},s.onerror=e=>{i(e)}}))}del(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.storeKey;return new Promise(((t,i)=>{const o=this._getStore("readwrite");if(!o)return i();const s=o.delete(e);s.onsuccess=()=>t(s.result),s.onerror=e=>i(e)}))}keyEarliest(){return this.keys().then((e=>{let t,i=Date.now();return e.forEach((e=>{if(!e||!e.length)return;const o=e.split("-")[0];Number(o)<i&&(i=Number(o),t=e)})),t}))}keys(){return new Promise(((e,t)=>{const i=this._getStore("readonly");if(!i)return t();if(i.getAllKeys){const o=i.getAllKeys();return o.onsuccess=()=>{e(o.result)},void(o.onerror=()=>{t()})}const o=[];i.openCursor().onsuccess=function(){this.result&&(o.push(this.result.key),this.result.continue())},i.transaction.oncomplete=()=>e(o)}))}values(){return new Promise(((e,t)=>{const i=this._getStore("readonly");if(!i)return t();if(i.getAll){const o=i.getAll();return o.onsuccess=()=>{e(o.result)},void(o.onerror=()=>{t()})}const o=[];i.openCursor().onsuccess=function(){this.result&&(o.push(this.result.value),this.result.continue())},i.transaction.oncomplete=()=>e(o)}))}download(e){e=e||this.storeKey,this.get(e).then((t=>{const i=document.createElement("a");i.download="".concat(e,".txt"),i.href="data:text/paint;utf-8,".concat(t||""),i.click()}))}};let yp=class{constructor(){Hu(this,"_all",{})}on(e,t){const i=this._all[e];i?i.push(t):this._all[e]=[t]}once(e,t){var i=this;const o=function(){t(...arguments),i.off(e,o)};this.on(e,o)}off(e,t){const i=this._all[e];null==i||i.splice(i.indexOf(t)>>>0,1)}emit(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];const s=this._all[e];null==s||s.slice().forEach((e=>e(...i)))}safeEmit(e){try{for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return this.emit(e,...i)}catch(oK){console.error(oK)}}destroy(){this._all={}}};const vp=["UPLOAD_CONSOLE_LENGTH_CUT","UPLOAD_REPORT_LIMIT"];const Sp=new class extends yp{constructor(){super(...arguments),Hu(this,"config",{UPLOAD_CONSOLE_ON:!1,UPLOAD_CONSOLE_LENGTH_CUT:200,UPLOAD_REPORT_LIMIT:45e4,ENABLE_REPORT_IDB_BUFFER:!1})}setParameter(e,t){if(function(e){return vp.includes(e)}(e))try{const i=Number(t);if(Number.isNaN(i))return;this.config[e]=i}catch(i){return void console.warn("Cannot convert core lib parameter ".concat(e,":").concat(t," into number"))}else this.config[e]=t;this.emit(e,this.config[e])}getParameter(e){return this.config[e]}getKeys(){return Object.keys(this.config)}};var Zp=Qs,fp=Ji,Tp=dd,Ip=$t,gp=function(e,t,i,o,s,r,n,a){for(var d,c,l=s,u=0,m=!!n&&Ip(n,a);u<o;)u in i&&(d=m?m(i[u],u,t):i[u],r>0&&Zp(d)?(c=fp(d),l=gp(e,t,d,c,l,r-1)-1):(Tp(l+1),e[l]=d),l++),u++;return l},Rp=gp,Xp=qe,Lp=Ji,Cp=xi,Wp=Zr;Vi({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,t=Xp(this),i=Lp(t),o=Wp(t,0);return o.length=Rp(o,t,t,i,0,void 0===e?1:Cp(e)),o}});var Gp=Ha("Array","flat"),Vp=re,Ep=Gp,Pp=Array.prototype,kp=i((function(e){var t=e.flat;return e===Pp||Vp(Pp,e)&&t===Pp.flat?Ep:t})),xp={};!function(e){var t="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var o=t.shift();if(o){if("object"!=typeof o)throw new TypeError(o+"must be non-object");for(var s in o)i(o,s)&&(e[s]=o[s])}}return e},e.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var o={arraySet:function(e,t,i,o,s){if(t.subarray&&e.subarray)e.set(t.subarray(i,i+o),s);else for(var r=0;r<o;r++)e[s+r]=t[i+r]},flattenChunks:function(e){var t,i,o,s,r,n;for(o=0,t=0,i=e.length;t<i;t++)o+=e[t].length;for(n=new Uint8Array(o),s=0,t=0,i=e.length;t<i;t++)r=e[t],n.set(r,s),s+=r.length;return n}},s={arraySet:function(e,t,i,o,s){for(var r=0;r<o;r++)e[s+r]=t[i+r]},flattenChunks:function(e){return[].concat.apply([],e)}};e.setTyped=function(t){t?(e.Buf8=Uint8Array,e.Buf16=Uint16Array,e.Buf32=Int32Array,e.assign(e,o)):(e.Buf8=Array,e.Buf16=Array,e.Buf32=Array,e.assign(e,s))},e.setTyped(t)}(xp);var Np={},Mp={},Yp={},wp=xp;function Kp(e){for(var t=e.length;--t>=0;)e[t]=0}var Hp=256,Fp=286,Jp=30,Op=15,Up=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],Dp=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Ap=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],zp=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],jp=new Array(576);Kp(jp);var Qp=new Array(60);Kp(Qp);var Bp=new Array(512);Kp(Bp);var qp=new Array(256);Kp(qp);var $p=new Array(29);Kp($p);var eb,tb,ib,ob=new Array(Jp);function sb(e,t,i,o,s){this.static_tree=e,this.extra_bits=t,this.extra_base=i,this.elems=o,this.max_length=s,this.has_stree=e&&e.length}function rb(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function nb(e){return e<256?Bp[e]:Bp[256+(e>>>7)]}function ab(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function db(e,t,i){e.bi_valid>16-i?(e.bi_buf|=t<<e.bi_valid&65535,ab(e,e.bi_buf),e.bi_buf=t>>16-e.bi_valid,e.bi_valid+=i-16):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=i)}function cb(e,t,i){db(e,i[2*t],i[2*t+1])}function lb(e,t){var i=0;do{i|=1&e,e>>>=1,i<<=1}while(--t>0);return i>>>1}function ub(e,t,i){var o,s,r=new Array(16),n=0;for(o=1;o<=Op;o++)r[o]=n=n+i[o-1]<<1;for(s=0;s<=t;s++){var a=e[2*s+1];0!==a&&(e[2*s]=lb(r[a]++,a))}}function mb(e){var t;for(t=0;t<Fp;t++)e.dyn_ltree[2*t]=0;for(t=0;t<Jp;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function hb(e){e.bi_valid>8?ab(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function pb(e,t,i,o){var s=2*t,r=2*i;return e[s]<e[r]||e[s]===e[r]&&o[t]<=o[i]}function bb(e,t,i){for(var o=e.heap[i],s=i<<1;s<=e.heap_len&&(s<e.heap_len&&pb(t,e.heap[s+1],e.heap[s],e.depth)&&s++,!pb(t,o,e.heap[s],e.depth));)e.heap[i]=e.heap[s],i=s,s<<=1;e.heap[i]=o}function _b(e,t,i){var o,s,r,n,a=0;if(0!==e.last_lit)do{o=e.pending_buf[e.d_buf+2*a]<<8|e.pending_buf[e.d_buf+2*a+1],s=e.pending_buf[e.l_buf+a],a++,0===o?cb(e,s,t):(cb(e,(r=qp[s])+Hp+1,t),0!==(n=Up[r])&&db(e,s-=$p[r],n),cb(e,r=nb(--o),i),0!==(n=Dp[r])&&db(e,o-=ob[r],n))}while(a<e.last_lit);cb(e,256,t)}function yb(e,t){var i,o,s,r=t.dyn_tree,n=t.stat_desc.static_tree,a=t.stat_desc.has_stree,d=t.stat_desc.elems,c=-1;for(e.heap_len=0,e.heap_max=573,i=0;i<d;i++)0!==r[2*i]?(e.heap[++e.heap_len]=c=i,e.depth[i]=0):r[2*i+1]=0;for(;e.heap_len<2;)r[2*(s=e.heap[++e.heap_len]=c<2?++c:0)]=1,e.depth[s]=0,e.opt_len--,a&&(e.static_len-=n[2*s+1]);for(t.max_code=c,i=e.heap_len>>1;i>=1;i--)bb(e,r,i);s=d;do{i=e.heap[1],e.heap[1]=e.heap[e.heap_len--],bb(e,r,1),o=e.heap[1],e.heap[--e.heap_max]=i,e.heap[--e.heap_max]=o,r[2*s]=r[2*i]+r[2*o],e.depth[s]=(e.depth[i]>=e.depth[o]?e.depth[i]:e.depth[o])+1,r[2*i+1]=r[2*o+1]=s,e.heap[1]=s++,bb(e,r,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var i,o,s,r,n,a,d=t.dyn_tree,c=t.max_code,l=t.stat_desc.static_tree,u=t.stat_desc.has_stree,m=t.stat_desc.extra_bits,h=t.stat_desc.extra_base,p=t.stat_desc.max_length,b=0;for(r=0;r<=Op;r++)e.bl_count[r]=0;for(d[2*e.heap[e.heap_max]+1]=0,i=e.heap_max+1;i<573;i++)(r=d[2*d[2*(o=e.heap[i])+1]+1]+1)>p&&(r=p,b++),d[2*o+1]=r,o>c||(e.bl_count[r]++,n=0,o>=h&&(n=m[o-h]),a=d[2*o],e.opt_len+=a*(r+n),u&&(e.static_len+=a*(l[2*o+1]+n)));if(0!==b){do{for(r=p-1;0===e.bl_count[r];)r--;e.bl_count[r]--,e.bl_count[r+1]+=2,e.bl_count[p]--,b-=2}while(b>0);for(r=p;0!==r;r--)for(o=e.bl_count[r];0!==o;)(s=e.heap[--i])>c||(d[2*s+1]!==r&&(e.opt_len+=(r-d[2*s+1])*d[2*s],d[2*s+1]=r),o--)}}(e,t),ub(r,c,e.bl_count)}function vb(e,t,i){var o,s,r=-1,n=t[1],a=0,d=7,c=4;for(0===n&&(d=138,c=3),t[2*(i+1)+1]=65535,o=0;o<=i;o++)s=n,n=t[2*(o+1)+1],++a<d&&s===n||(a<c?e.bl_tree[2*s]+=a:0!==s?(s!==r&&e.bl_tree[2*s]++,e.bl_tree[32]++):a<=10?e.bl_tree[34]++:e.bl_tree[36]++,a=0,r=s,0===n?(d=138,c=3):s===n?(d=6,c=3):(d=7,c=4))}function Sb(e,t,i){var o,s,r=-1,n=t[1],a=0,d=7,c=4;for(0===n&&(d=138,c=3),o=0;o<=i;o++)if(s=n,n=t[2*(o+1)+1],!(++a<d&&s===n)){if(a<c)do{cb(e,s,e.bl_tree)}while(0!=--a);else 0!==s?(s!==r&&(cb(e,s,e.bl_tree),a--),cb(e,16,e.bl_tree),db(e,a-3,2)):a<=10?(cb(e,17,e.bl_tree),db(e,a-3,3)):(cb(e,18,e.bl_tree),db(e,a-11,7));a=0,r=s,0===n?(d=138,c=3):s===n?(d=6,c=3):(d=7,c=4)}}Kp(ob);var Zb=!1;function fb(e,t,i,o){db(e,0+(o?1:0),3),function(e,t,i,o){hb(e),o&&(ab(e,i),ab(e,~i)),wp.arraySet(e.pending_buf,e.window,t,i,e.pending),e.pending+=i}(e,t,i,!0)}Yp._tr_init=function(e){Zb||(!function(){var e,t,i,o,s,r=new Array(16);for(i=0,o=0;o<28;o++)for($p[o]=i,e=0;e<1<<Up[o];e++)qp[i++]=o;for(qp[i-1]=o,s=0,o=0;o<16;o++)for(ob[o]=s,e=0;e<1<<Dp[o];e++)Bp[s++]=o;for(s>>=7;o<Jp;o++)for(ob[o]=s<<7,e=0;e<1<<Dp[o]-7;e++)Bp[256+s++]=o;for(t=0;t<=Op;t++)r[t]=0;for(e=0;e<=143;)jp[2*e+1]=8,e++,r[8]++;for(;e<=255;)jp[2*e+1]=9,e++,r[9]++;for(;e<=279;)jp[2*e+1]=7,e++,r[7]++;for(;e<=287;)jp[2*e+1]=8,e++,r[8]++;for(ub(jp,287,r),e=0;e<Jp;e++)Qp[2*e+1]=5,Qp[2*e]=lb(e,5);eb=new sb(jp,Up,257,Fp,Op),tb=new sb(Qp,Dp,0,Jp,Op),ib=new sb(new Array(0),Ap,0,19,7)}(),Zb=!0),e.l_desc=new rb(e.dyn_ltree,eb),e.d_desc=new rb(e.dyn_dtree,tb),e.bl_desc=new rb(e.bl_tree,ib),e.bi_buf=0,e.bi_valid=0,mb(e)},Yp._tr_stored_block=fb,Yp._tr_flush_block=function(e,t,i,o){var s,r,n=0;e.level>0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,i=4093624447;for(t=0;t<=31;t++,i>>>=1)if(1&i&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<Hp;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),yb(e,e.l_desc),yb(e,e.d_desc),n=function(e){var t;for(vb(e,e.dyn_ltree,e.l_desc.max_code),vb(e,e.dyn_dtree,e.d_desc.max_code),yb(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*zp[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),s=e.opt_len+3+7>>>3,(r=e.static_len+3+7>>>3)<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==t?fb(e,t,i,o):4===e.strategy||r===s?(db(e,2+(o?1:0),3),_b(e,jp,Qp)):(db(e,4+(o?1:0),3),function(e,t,i,o){var s;for(db(e,t-257,5),db(e,i-1,5),db(e,o-4,4),s=0;s<o;s++)db(e,e.bl_tree[2*zp[s]+1],3);Sb(e,e.dyn_ltree,t-1),Sb(e,e.dyn_dtree,i-1)}(e,e.l_desc.max_code+1,e.d_desc.max_code+1,n+1),_b(e,e.dyn_ltree,e.dyn_dtree)),mb(e),o&&hb(e)},Yp._tr_tally=function(e,t,i){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&i,e.last_lit++,0===t?e.dyn_ltree[2*i]++:(e.matches++,t--,e.dyn_ltree[2*(qp[i]+Hp+1)]++,e.dyn_dtree[2*nb(t)]++),e.last_lit===e.lit_bufsize-1},Yp._tr_align=function(e){db(e,2,3),cb(e,256,jp),function(e){16===e.bi_valid?(ab(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)};var Tb=function(e,t,i,o){for(var s=65535&e,r=e>>>16&65535,n=0;0!==i;){i-=n=i>2e3?2e3:i;do{r=r+(s=s+t[o++]|0)|0}while(--n);s%=65521,r%=65521}return s|r<<16};var Ib=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var o=0;o<8;o++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();var gb,Rb=function(e,t,i,o){var s=Ib,r=o+i;e^=-1;for(var n=o;n<r;n++)e=e>>>8^s[255&(e^t[n])];return~e},Xb={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},Lb=xp,Cb=Yp,Wb=Tb,Gb=Rb,Vb=Xb,Eb=-2,Pb=258,kb=262,xb=103,Nb=113,Mb=666;function Yb(e,t){return e.msg=Vb[t],t}function wb(e){return(e<<1)-(e>4?9:0)}function Kb(e){for(var t=e.length;--t>=0;)e[t]=0}function Hb(e){var t=e.state,i=t.pending;i>e.avail_out&&(i=e.avail_out),0!==i&&(Lb.arraySet(e.output,t.pending_buf,t.pending_out,i,e.next_out),e.next_out+=i,t.pending_out+=i,e.total_out+=i,e.avail_out-=i,t.pending-=i,0===t.pending&&(t.pending_out=0))}function Fb(e,t){Cb._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,Hb(e.strm)}function Jb(e,t){e.pending_buf[e.pending++]=t}function Ob(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function Ub(e,t){var i,o,s=e.max_chain_length,r=e.strstart,n=e.prev_length,a=e.nice_match,d=e.strstart>e.w_size-kb?e.strstart-(e.w_size-kb):0,c=e.window,l=e.w_mask,u=e.prev,m=e.strstart+Pb,h=c[r+n-1],p=c[r+n];e.prev_length>=e.good_match&&(s>>=2),a>e.lookahead&&(a=e.lookahead);do{if(c[(i=t)+n]===p&&c[i+n-1]===h&&c[i]===c[r]&&c[++i]===c[r+1]){r+=2,i++;do{}while(c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&r<m);if(o=Pb-(m-r),r=m-Pb,o>n){if(e.match_start=t,n=o,o>=a)break;h=c[r+n-1],p=c[r+n]}}}while((t=u[t&l])>d&&0!=--s);return n<=e.lookahead?n:e.lookahead}function Db(e){var t,i,o,s,r,n,a,d,c,l,u=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=u+(u-kb)){Lb.arraySet(e.window,e.window,u,u,0),e.match_start-=u,e.strstart-=u,e.block_start-=u,t=i=e.hash_size;do{o=e.head[--t],e.head[t]=o>=u?o-u:0}while(--i);t=i=u;do{o=e.prev[--t],e.prev[t]=o>=u?o-u:0}while(--i);s+=u}if(0===e.strm.avail_in)break;if(n=e.strm,a=e.window,d=e.strstart+e.lookahead,c=s,l=void 0,(l=n.avail_in)>c&&(l=c),i=0===l?0:(n.avail_in-=l,Lb.arraySet(a,n.input,n.next_in,l,d),1===n.state.wrap?n.adler=Wb(n.adler,a,l,d):2===n.state.wrap&&(n.adler=Gb(n.adler,a,l,d)),n.next_in+=l,n.total_in+=l,l),e.lookahead+=i,e.lookahead+e.insert>=3)for(r=e.strstart-e.insert,e.ins_h=e.window[r],e.ins_h=(e.ins_h<<e.hash_shift^e.window[r+1])&e.hash_mask;e.insert&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[r+3-1])&e.hash_mask,e.prev[r&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=r,r++,e.insert--,!(e.lookahead+e.insert<3)););}while(e.lookahead<kb&&0!==e.strm.avail_in)}function Ab(e,t){for(var i,o;;){if(e.lookahead<kb){if(Db(e),e.lookahead<kb&&0===t)return 1;if(0===e.lookahead)break}if(i=0,e.lookahead>=3&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==i&&e.strstart-i<=e.w_size-kb&&(e.match_length=Ub(e,i)),e.match_length>=3)if(o=Cb._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart}while(0!=--e.match_length);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+1])&e.hash_mask;else o=Cb._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(o&&(Fb(e,!1),0===e.strm.avail_out))return 1}return e.insert=e.strstart<2?e.strstart:2,4===t?(Fb(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(Fb(e,!1),0===e.strm.avail_out)?1:2}function zb(e,t){for(var i,o,s;;){if(e.lookahead<kb){if(Db(e),e.lookahead<kb&&0===t)return 1;if(0===e.lookahead)break}if(i=0,e.lookahead>=3&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=2,0!==i&&e.prev_length<e.max_lazy_match&&e.strstart-i<=e.w_size-kb&&(e.match_length=Ub(e,i),e.match_length<=5&&(1===e.strategy||3===e.match_length&&e.strstart-e.match_start>4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){s=e.strstart+e.lookahead-3,o=Cb._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=s&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+3-1])&e.hash_mask,i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart)}while(0!=--e.prev_length);if(e.match_available=0,e.match_length=2,e.strstart++,o&&(Fb(e,!1),0===e.strm.avail_out))return 1}else if(e.match_available){if((o=Cb._tr_tally(e,0,e.window[e.strstart-1]))&&Fb(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return 1}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(o=Cb._tr_tally(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<2?e.strstart:2,4===t?(Fb(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(Fb(e,!1),0===e.strm.avail_out)?1:2}function jb(e,t,i,o,s){this.good_length=e,this.max_lazy=t,this.nice_length=i,this.max_chain=o,this.func=s}function Qb(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=8,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Lb.Buf16(1146),this.dyn_dtree=new Lb.Buf16(122),this.bl_tree=new Lb.Buf16(78),Kb(this.dyn_ltree),Kb(this.dyn_dtree),Kb(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Lb.Buf16(16),this.heap=new Lb.Buf16(573),Kb(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Lb.Buf16(573),Kb(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function Bb(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=2,(t=e.state).pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?42:Nb,e.adler=2===t.wrap?0:1,t.last_flush=0,Cb._tr_init(t),0):Yb(e,Eb)}function qb(e){var t,i=Bb(e);return 0===i&&((t=e.state).window_size=2*t.w_size,Kb(t.head),t.max_lazy_match=gb[t.level].max_lazy,t.good_match=gb[t.level].good_length,t.nice_match=gb[t.level].nice_length,t.max_chain_length=gb[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=2,t.match_available=0,t.ins_h=0),i}function $b(e,t,i,o,s,r){if(!e)return Eb;var n=1;if(-1===t&&(t=6),o<0?(n=0,o=-o):o>15&&(n=2,o-=16),s<1||s>9||8!==i||o<8||o>15||t<0||t>9||r<0||r>4)return Yb(e,Eb);8===o&&(o=9);var a=new Qb;return e.state=a,a.strm=e,a.wrap=n,a.gzhead=null,a.w_bits=o,a.w_size=1<<a.w_bits,a.w_mask=a.w_size-1,a.hash_bits=s+7,a.hash_size=1<<a.hash_bits,a.hash_mask=a.hash_size-1,a.hash_shift=~~((a.hash_bits+3-1)/3),a.window=new Lb.Buf8(2*a.w_size),a.head=new Lb.Buf16(a.hash_size),a.prev=new Lb.Buf16(a.w_size),a.lit_bufsize=1<<s+6,a.pending_buf_size=4*a.lit_bufsize,a.pending_buf=new Lb.Buf8(a.pending_buf_size),a.d_buf=1*a.lit_bufsize,a.l_buf=3*a.lit_bufsize,a.level=t,a.strategy=r,a.method=i,qb(e)}gb=[new jb(0,0,0,0,(function(e,t){var i=65535;for(i>e.pending_buf_size-5&&(i=e.pending_buf_size-5);;){if(e.lookahead<=1){if(Db(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var o=e.block_start+i;if((0===e.strstart||e.strstart>=o)&&(e.lookahead=e.strstart-o,e.strstart=o,Fb(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-kb&&(Fb(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(Fb(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(Fb(e,!1),e.strm.avail_out),1)})),new jb(4,4,8,4,Ab),new jb(4,5,16,8,Ab),new jb(4,6,32,32,Ab),new jb(4,4,16,16,zb),new jb(8,16,32,32,zb),new jb(8,16,128,128,zb),new jb(8,32,128,256,zb),new jb(32,128,258,1024,zb),new jb(32,258,258,4096,zb)],Mp.deflateInit=function(e,t){return $b(e,t,8,15,8,0)},Mp.deflateInit2=$b,Mp.deflateReset=qb,Mp.deflateResetKeep=Bb,Mp.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?Eb:(e.state.gzhead=t,0):Eb},Mp.deflate=function(e,t){var i,o,s,r;if(!e||!e.state||t>5||t<0)return e?Yb(e,Eb):Eb;if(o=e.state,!e.output||!e.input&&0!==e.avail_in||o.status===Mb&&4!==t)return Yb(e,0===e.avail_out?-5:Eb);if(o.strm=e,i=o.last_flush,o.last_flush=t,42===o.status)if(2===o.wrap)e.adler=0,Jb(o,31),Jb(o,139),Jb(o,8),o.gzhead?(Jb(o,(o.gzhead.text?1:0)+(o.gzhead.hcrc?2:0)+(o.gzhead.extra?4:0)+(o.gzhead.name?8:0)+(o.gzhead.comment?16:0)),Jb(o,255&o.gzhead.time),Jb(o,o.gzhead.time>>8&255),Jb(o,o.gzhead.time>>16&255),Jb(o,o.gzhead.time>>24&255),Jb(o,9===o.level?2:o.strategy>=2||o.level<2?4:0),Jb(o,255&o.gzhead.os),o.gzhead.extra&&o.gzhead.extra.length&&(Jb(o,255&o.gzhead.extra.length),Jb(o,o.gzhead.extra.length>>8&255)),o.gzhead.hcrc&&(e.adler=Gb(e.adler,o.pending_buf,o.pending,0)),o.gzindex=0,o.status=69):(Jb(o,0),Jb(o,0),Jb(o,0),Jb(o,0),Jb(o,0),Jb(o,9===o.level?2:o.strategy>=2||o.level<2?4:0),Jb(o,3),o.status=Nb);else{var n=8+(o.w_bits-8<<4)<<8;n|=(o.strategy>=2||o.level<2?0:o.level<6?1:6===o.level?2:3)<<6,0!==o.strstart&&(n|=32),n+=31-n%31,o.status=Nb,Ob(o,n),0!==o.strstart&&(Ob(o,e.adler>>>16),Ob(o,65535&e.adler)),e.adler=1}if(69===o.status)if(o.gzhead.extra){for(s=o.pending;o.gzindex<(65535&o.gzhead.extra.length)&&(o.pending!==o.pending_buf_size||(o.gzhead.hcrc&&o.pending>s&&(e.adler=Gb(e.adler,o.pending_buf,o.pending-s,s)),Hb(e),s=o.pending,o.pending!==o.pending_buf_size));)Jb(o,255&o.gzhead.extra[o.gzindex]),o.gzindex++;o.gzhead.hcrc&&o.pending>s&&(e.adler=Gb(e.adler,o.pending_buf,o.pending-s,s)),o.gzindex===o.gzhead.extra.length&&(o.gzindex=0,o.status=73)}else o.status=73;if(73===o.status)if(o.gzhead.name){s=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>s&&(e.adler=Gb(e.adler,o.pending_buf,o.pending-s,s)),Hb(e),s=o.pending,o.pending===o.pending_buf_size)){r=1;break}r=o.gzindex<o.gzhead.name.length?255&o.gzhead.name.charCodeAt(o.gzindex++):0,Jb(o,r)}while(0!==r);o.gzhead.hcrc&&o.pending>s&&(e.adler=Gb(e.adler,o.pending_buf,o.pending-s,s)),0===r&&(o.gzindex=0,o.status=91)}else o.status=91;if(91===o.status)if(o.gzhead.comment){s=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>s&&(e.adler=Gb(e.adler,o.pending_buf,o.pending-s,s)),Hb(e),s=o.pending,o.pending===o.pending_buf_size)){r=1;break}r=o.gzindex<o.gzhead.comment.length?255&o.gzhead.comment.charCodeAt(o.gzindex++):0,Jb(o,r)}while(0!==r);o.gzhead.hcrc&&o.pending>s&&(e.adler=Gb(e.adler,o.pending_buf,o.pending-s,s)),0===r&&(o.status=xb)}else o.status=xb;if(o.status===xb&&(o.gzhead.hcrc?(o.pending+2>o.pending_buf_size&&Hb(e),o.pending+2<=o.pending_buf_size&&(Jb(o,255&e.adler),Jb(o,e.adler>>8&255),e.adler=0,o.status=Nb)):o.status=Nb),0!==o.pending){if(Hb(e),0===e.avail_out)return o.last_flush=-1,0}else if(0===e.avail_in&&wb(t)<=wb(i)&&4!==t)return Yb(e,-5);if(o.status===Mb&&0!==e.avail_in)return Yb(e,-5);if(0!==e.avail_in||0!==o.lookahead||0!==t&&o.status!==Mb){var a=2===o.strategy?function(e,t){for(var i;;){if(0===e.lookahead&&(Db(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,i=Cb._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,i&&(Fb(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(Fb(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(Fb(e,!1),0===e.strm.avail_out)?1:2}(o,t):3===o.strategy?function(e,t){for(var i,o,s,r,n=e.window;;){if(e.lookahead<=Pb){if(Db(e),e.lookahead<=Pb&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(o=n[s=e.strstart-1])===n[++s]&&o===n[++s]&&o===n[++s]){r=e.strstart+Pb;do{}while(o===n[++s]&&o===n[++s]&&o===n[++s]&&o===n[++s]&&o===n[++s]&&o===n[++s]&&o===n[++s]&&o===n[++s]&&s<r);e.match_length=Pb-(r-s),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(i=Cb._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(i=Cb._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),i&&(Fb(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(Fb(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(Fb(e,!1),0===e.strm.avail_out)?1:2}(o,t):gb[o.level].func(o,t);if(3!==a&&4!==a||(o.status=Mb),1===a||3===a)return 0===e.avail_out&&(o.last_flush=-1),0;if(2===a&&(1===t?Cb._tr_align(o):5!==t&&(Cb._tr_stored_block(o,0,0,!1),3===t&&(Kb(o.head),0===o.lookahead&&(o.strstart=0,o.block_start=0,o.insert=0))),Hb(e),0===e.avail_out))return o.last_flush=-1,0}return 4!==t?0:o.wrap<=0?1:(2===o.wrap?(Jb(o,255&e.adler),Jb(o,e.adler>>8&255),Jb(o,e.adler>>16&255),Jb(o,e.adler>>24&255),Jb(o,255&e.total_in),Jb(o,e.total_in>>8&255),Jb(o,e.total_in>>16&255),Jb(o,e.total_in>>24&255)):(Ob(o,e.adler>>>16),Ob(o,65535&e.adler)),Hb(e),o.wrap>0&&(o.wrap=-o.wrap),0!==o.pending?0:1)},Mp.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&t!==xb&&t!==Nb&&t!==Mb?Yb(e,Eb):(e.state=null,t===Nb?Yb(e,-3):0):Eb},Mp.deflateSetDictionary=function(e,t){var i,o,s,r,n,a,d,c,l=t.length;if(!e||!e.state)return Eb;if(2===(r=(i=e.state).wrap)||1===r&&42!==i.status||i.lookahead)return Eb;for(1===r&&(e.adler=Wb(e.adler,t,l,0)),i.wrap=0,l>=i.w_size&&(0===r&&(Kb(i.head),i.strstart=0,i.block_start=0,i.insert=0),c=new Lb.Buf8(i.w_size),Lb.arraySet(c,t,l-i.w_size,i.w_size,0),t=c,l=i.w_size),n=e.avail_in,a=e.next_in,d=e.input,e.avail_in=l,e.next_in=0,e.input=t,Db(i);i.lookahead>=3;){o=i.strstart,s=i.lookahead-2;do{i.ins_h=(i.ins_h<<i.hash_shift^i.window[o+3-1])&i.hash_mask,i.prev[o&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=o,o++}while(--s);i.strstart=o,i.lookahead=2,Db(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=2,i.match_available=0,e.next_in=a,e.input=d,e.avail_in=n,i.wrap=r,0},Mp.deflateInfo="pako deflate (from Nodeca project)";var e_={},t_=xp,i_=!0,o_=!0;try{String.fromCharCode.apply(null,[0])}catch(sK){i_=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(sK){o_=!1}for(var s_=new t_.Buf8(256),r_=0;r_<256;r_++)s_[r_]=r_>=252?6:r_>=248?5:r_>=240?4:r_>=224?3:r_>=192?2:1;function n_(e,t){if(t<65534&&(e.subarray&&o_||!e.subarray&&i_))return String.fromCharCode.apply(null,t_.shrinkBuf(e,t));for(var i="",o=0;o<t;o++)i+=String.fromCharCode(e[o]);return i}s_[254]=s_[254]=1,e_.string2buf=function(e){var t,i,o,s,r,n=e.length,a=0;for(s=0;s<n;s++)55296==(64512&(i=e.charCodeAt(s)))&&s+1<n&&56320==(64512&(o=e.charCodeAt(s+1)))&&(i=65536+(i-55296<<10)+(o-56320),s++),a+=i<128?1:i<2048?2:i<65536?3:4;for(t=new t_.Buf8(a),r=0,s=0;r<a;s++)55296==(64512&(i=e.charCodeAt(s)))&&s+1<n&&56320==(64512&(o=e.charCodeAt(s+1)))&&(i=65536+(i-55296<<10)+(o-56320),s++),i<128?t[r++]=i:i<2048?(t[r++]=192|i>>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},e_.buf2binstring=function(e){return n_(e,e.length)},e_.binstring2buf=function(e){for(var t=new t_.Buf8(e.length),i=0,o=t.length;i<o;i++)t[i]=e.charCodeAt(i);return t},e_.buf2string=function(e,t){var i,o,s,r,n=t||e.length,a=new Array(2*n);for(o=0,i=0;i<n;)if((s=e[i++])<128)a[o++]=s;else if((r=s_[s])>4)a[o++]=65533,i+=r-1;else{for(s&=2===r?31:3===r?15:7;r>1&&i<n;)s=s<<6|63&e[i++],r--;r>1?a[o++]=65533:s<65536?a[o++]=s:(s-=65536,a[o++]=55296|s>>10&1023,a[o++]=56320|1023&s)}return n_(a,o)},e_.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+s_[e[i]]>t?i:t};var a_=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},d_=Mp,c_=xp,l_=e_,u_=Xb,m_=a_,h_=Object.prototype.toString;function p_(e){if(!(this instanceof p_))return new p_(e);this.options=c_.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new m_,this.strm.avail_out=0;var i=d_.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(0!==i)throw new Error(u_[i]);if(t.header&&d_.deflateSetHeader(this.strm,t.header),t.dictionary){var o;if(o="string"==typeof t.dictionary?l_.string2buf(t.dictionary):"[object ArrayBuffer]"===h_.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,0!==(i=d_.deflateSetDictionary(this.strm,o)))throw new Error(u_[i]);this._dict_set=!0}}function b_(e,t){var i=new p_(t);if(i.push(e,!0),i.err)throw i.msg||u_[i.err];return i.result}p_.prototype.push=function(e,t){var i,o,s=this.strm,r=this.options.chunkSize;if(this.ended)return!1;o=t===~~t?t:!0===t?4:0,"string"==typeof e?s.input=l_.string2buf(e):"[object ArrayBuffer]"===h_.call(e)?s.input=new Uint8Array(e):s.input=e,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new c_.Buf8(r),s.next_out=0,s.avail_out=r),1!==(i=d_.deflate(s,o))&&0!==i)return this.onEnd(i),this.ended=!0,!1;0!==s.avail_out&&(0!==s.avail_in||4!==o&&2!==o)||("string"===this.options.to?this.onData(l_.buf2binstring(c_.shrinkBuf(s.output,s.next_out))):this.onData(c_.shrinkBuf(s.output,s.next_out)))}while((s.avail_in>0||0===s.avail_out)&&1!==i);return 4===o?(i=d_.deflateEnd(this.strm),this.onEnd(i),this.ended=!0,0===i):2!==o||(this.onEnd(0),s.avail_out=0,!0)},p_.prototype.onData=function(e){this.chunks.push(e)},p_.prototype.onEnd=function(e){0===e&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=c_.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},Np.Deflate=p_,Np.deflate=b_,Np.deflateRaw=function(e,t){return(t=t||{}).raw=!0,b_(e,t)},Np.gzip=function(e,t){return(t=t||{}).gzip=!0,b_(e,t)};var __={},y_=re,v_=fh,S_=RegExp.prototype,Z_=i((function(e){return e===S_||y_(S_,e)?v_(e):e.flags})),f_={},T_=xp,I_=15,g_=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],R_=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],X_=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],L_=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64],C_=xp,W_=Tb,G_=Rb,V_=function(e,t){var i,o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z,f,T,I,g,R,X;i=e.state,o=e.next_in,R=e.input,s=o+(e.avail_in-5),r=e.next_out,X=e.output,n=r-(t-e.avail_out),a=r+(e.avail_out-257),d=i.dmax,c=i.wsize,l=i.whave,u=i.wnext,m=i.window,h=i.hold,p=i.bits,b=i.lencode,_=i.distcode,y=(1<<i.lenbits)-1,v=(1<<i.distbits)-1;e:do{p<15&&(h+=R[o++]<<p,p+=8,h+=R[o++]<<p,p+=8),S=b[h&y];t:for(;;){if(h>>>=Z=S>>>24,p-=Z,0===(Z=S>>>16&255))X[r++]=65535&S;else{if(!(16&Z)){if(64&Z){if(32&Z){i.mode=12;break e}e.msg="invalid literal/length code",i.mode=30;break e}S=b[(65535&S)+(h&(1<<Z)-1)];continue t}for(f=65535&S,(Z&=15)&&(p<Z&&(h+=R[o++]<<p,p+=8),f+=h&(1<<Z)-1,h>>>=Z,p-=Z),p<15&&(h+=R[o++]<<p,p+=8,h+=R[o++]<<p,p+=8),S=_[h&v];;){if(h>>>=Z=S>>>24,p-=Z,16&(Z=S>>>16&255)){if(T=65535&S,p<(Z&=15)&&(h+=R[o++]<<p,(p+=8)<Z&&(h+=R[o++]<<p,p+=8)),(T+=h&(1<<Z)-1)>d){e.msg="invalid distance too far back",i.mode=30;break e}if(h>>>=Z,p-=Z,T>(Z=r-n)){if((Z=T-Z)>l&&i.sane){e.msg="invalid distance too far back",i.mode=30;break e}if(I=0,g=m,0===u){if(I+=c-Z,Z<f){f-=Z;do{X[r++]=m[I++]}while(--Z);I=r-T,g=X}}else if(u<Z){if(I+=c+u-Z,(Z-=u)<f){f-=Z;do{X[r++]=m[I++]}while(--Z);if(I=0,u<f){f-=Z=u;do{X[r++]=m[I++]}while(--Z);I=r-T,g=X}}}else if(I+=u-Z,Z<f){f-=Z;do{X[r++]=m[I++]}while(--Z);I=r-T,g=X}for(;f>2;)X[r++]=g[I++],X[r++]=g[I++],X[r++]=g[I++],f-=3;f&&(X[r++]=g[I++],f>1&&(X[r++]=g[I++]))}else{I=r-T;do{X[r++]=X[I++],X[r++]=X[I++],X[r++]=X[I++],f-=3}while(f>2);f&&(X[r++]=X[I++],f>1&&(X[r++]=X[I++]))}break}if(64&Z){e.msg="invalid distance code",i.mode=30;break e}S=_[(65535&S)+(h&(1<<Z)-1)]}}break}}while(o<s&&r<a);o-=f=p>>3,h&=(1<<(p-=f<<3))-1,e.next_in=o,e.next_out=r,e.avail_in=o<s?s-o+5:5-(o-s),e.avail_out=r<a?a-r+257:257-(r-a),i.hold=h,i.bits=p},E_=function(e,t,i,o,s,r,n,a){var d,c,l,u,m,h,p,b,_,y=a.bits,v=0,S=0,Z=0,f=0,T=0,I=0,g=0,R=0,X=0,L=0,C=null,W=0,G=new T_.Buf16(16),V=new T_.Buf16(16),E=null,P=0;for(v=0;v<=I_;v++)G[v]=0;for(S=0;S<o;S++)G[t[i+S]]++;for(T=y,f=I_;f>=1&&0===G[f];f--);if(T>f&&(T=f),0===f)return s[r++]=20971520,s[r++]=20971520,a.bits=1,0;for(Z=1;Z<f&&0===G[Z];Z++);for(T<Z&&(T=Z),R=1,v=1;v<=I_;v++)if(R<<=1,(R-=G[v])<0)return-1;if(R>0&&(0===e||1!==f))return-1;for(V[1]=0,v=1;v<I_;v++)V[v+1]=V[v]+G[v];for(S=0;S<o;S++)0!==t[i+S]&&(n[V[t[i+S]]++]=S);if(0===e?(C=E=n,h=19):1===e?(C=g_,W-=257,E=R_,P-=257,h=256):(C=X_,E=L_,h=-1),L=0,S=0,v=Z,m=r,I=T,g=0,l=-1,u=(X=1<<T)-1,1===e&&X>852||2===e&&X>592)return 1;for(;;){p=v-g,n[S]<h?(b=0,_=n[S]):n[S]>h?(b=E[P+n[S]],_=C[W+n[S]]):(b=96,_=0),d=1<<v-g,Z=c=1<<I;do{s[m+(L>>g)+(c-=d)]=p<<24|b<<16|_}while(0!==c);for(d=1<<v-1;L&d;)d>>=1;if(0!==d?(L&=d-1,L+=d):L=0,S++,0==--G[v]){if(v===f)break;v=t[i+n[S]]}if(v>T&&(L&u)!==l){for(0===g&&(g=T),m+=Z,R=1<<(I=v-g);I+g<f&&!((R-=G[I+g])<=0);)I++,R<<=1;if(X+=1<<I,1===e&&X>852||2===e&&X>592)return 1;s[l=L&u]=T<<24|I<<16|m-r}}return 0!==L&&(s[m+L]=v-g<<24|64<<16),a.bits=T,0},P_=-2,k_=12,x_=30;function N_(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function M_(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new C_.Buf16(320),this.work=new C_.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function Y_(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new C_.Buf32(852),t.distcode=t.distdyn=new C_.Buf32(592),t.sane=1,t.back=-1,0):P_}function w_(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,Y_(e)):P_}function K_(e,t){var i,o;return e&&e.state?(o=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?P_:(null!==o.window&&o.wbits!==t&&(o.window=null),o.wrap=i,o.wbits=t,w_(e))):P_}function H_(e,t){var i,o;return e?(o=new M_,e.state=o,o.window=null,0!==(i=K_(e,t))&&(e.state=null),i):P_}var F_,J_,O_=!0;function U_(e){if(O_){var t;for(F_=new C_.Buf32(512),J_=new C_.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(E_(1,e.lens,0,288,F_,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;E_(2,e.lens,0,32,J_,0,e.work,{bits:5}),O_=!1}e.lencode=F_,e.lenbits=9,e.distcode=J_,e.distbits=5}function D_(e,t,i,o){var s,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new C_.Buf8(r.wsize)),o>=r.wsize?(C_.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):((s=r.wsize-r.wnext)>o&&(s=o),C_.arraySet(r.window,t,i-o,s,r.wnext),(o-=s)?(C_.arraySet(r.window,t,i-o,o,0),r.wnext=o,r.whave=r.wsize):(r.wnext+=s,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=s))),0}f_.inflateReset=w_,f_.inflateReset2=K_,f_.inflateResetKeep=Y_,f_.inflateInit=function(e){return H_(e,15)},f_.inflateInit2=H_,f_.inflate=function(e,t){var i,o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z,f,T,I,g,R,X=0,L=new C_.Buf8(4),C=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return P_;(i=e.state).mode===k_&&(i.mode=13),n=e.next_out,s=e.output,d=e.avail_out,r=e.next_in,o=e.input,a=e.avail_in,c=i.hold,l=i.bits,u=a,m=d,I=0;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;l<16;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(2&i.wrap&&35615===c){i.check=0,L[0]=255&c,L[1]=c>>>8&255,i.check=G_(i.check,L,2,0),c=0,l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&c)<<8)+(c>>8))%31){e.msg="incorrect header check",i.mode=x_;break}if(8!=(15&c)){e.msg="unknown compression method",i.mode=x_;break}if(l-=4,T=8+(15&(c>>>=4)),0===i.wbits)i.wbits=T;else if(T>i.wbits){e.msg="invalid window size",i.mode=x_;break}i.dmax=1<<T,e.adler=i.check=1,i.mode=512&c?10:k_,c=0,l=0;break;case 2:for(;l<16;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(i.flags=c,8!=(255&Z_(i))){e.msg="unknown compression method",i.mode=x_;break}if(57344&Z_(i)){e.msg="unknown header flags set",i.mode=x_;break}i.head&&(i.head.text=c>>8&1),512&Z_(i)&&(L[0]=255&c,L[1]=c>>>8&255,i.check=G_(i.check,L,2,0)),c=0,l=0,i.mode=3;case 3:for(;l<32;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}i.head&&(i.head.time=c),512&Z_(i)&&(L[0]=255&c,L[1]=c>>>8&255,L[2]=c>>>16&255,L[3]=c>>>24&255,i.check=G_(i.check,L,4,0)),c=0,l=0,i.mode=4;case 4:for(;l<16;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}i.head&&(i.head.xflags=255&c,i.head.os=c>>8),512&Z_(i)&&(L[0]=255&c,L[1]=c>>>8&255,i.check=G_(i.check,L,2,0)),c=0,l=0,i.mode=5;case 5:if(1024&Z_(i)){for(;l<16;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}i.length=c,i.head&&(i.head.extra_len=c),512&Z_(i)&&(L[0]=255&c,L[1]=c>>>8&255,i.check=G_(i.check,L,2,0)),c=0,l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&Z_(i)&&((h=i.length)>a&&(h=a),h&&(i.head&&(T=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),C_.arraySet(i.head.extra,o,r,h,T)),512&Z_(i)&&(i.check=G_(i.check,o,h,r)),a-=h,r+=h,i.length-=h),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&Z_(i)){if(0===a)break e;h=0;do{T=o[r+h++],i.head&&T&&i.length<65536&&(i.head.name+=String.fromCharCode(T))}while(T&&h<a);if(512&Z_(i)&&(i.check=G_(i.check,o,h,r)),a-=h,r+=h,T)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&Z_(i)){if(0===a)break e;h=0;do{T=o[r+h++],i.head&&T&&i.length<65536&&(i.head.comment+=String.fromCharCode(T))}while(T&&h<a);if(512&Z_(i)&&(i.check=G_(i.check,o,h,r)),a-=h,r+=h,T)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&Z_(i)){for(;l<16;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(c!==(65535&i.check)){e.msg="header crc mismatch",i.mode=x_;break}c=0,l=0}i.head&&(i.head.hcrc=Z_(i)>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=k_;break;case 10:for(;l<32;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}e.adler=i.check=N_(c),c=0,l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=n,e.avail_out=d,e.next_in=r,e.avail_in=a,i.hold=c,i.bits=l,2;e.adler=i.check=1,i.mode=k_;case k_:if(5===t||6===t)break e;case 13:if(i.last){c>>>=7&l,l-=7&l,i.mode=27;break}for(;l<3;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}switch(i.last=1&c,l-=1,3&(c>>>=1)){case 0:i.mode=14;break;case 1:if(U_(i),i.mode=20,6===t){c>>>=2,l-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=x_}c>>>=2,l-=2;break;case 14:for(c>>>=7&l,l-=7&l;l<32;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if((65535&c)!=(c>>>16^65535)){e.msg="invalid stored block lengths",i.mode=x_;break}if(i.length=65535&c,c=0,l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(h=i.length){if(h>a&&(h=a),h>d&&(h=d),0===h)break e;C_.arraySet(s,o,r,h,n),a-=h,r+=h,d-=h,n+=h,i.length-=h;break}i.mode=k_;break;case 17:for(;l<14;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(i.nlen=257+(31&c),c>>>=5,l-=5,i.ndist=1+(31&c),c>>>=5,l-=5,i.ncode=4+(15&c),c>>>=4,l-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=x_;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;l<3;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}i.lens[C[i.have++]]=7&c,c>>>=3,l-=3}for(;i.have<19;)i.lens[C[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,g={bits:i.lenbits},I=E_(0,i.lens,0,19,i.lencode,0,i.work,g),i.lenbits=g.bits,I){e.msg="invalid code lengths set",i.mode=x_;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;y=(X=i.lencode[c&(1<<i.lenbits)-1])>>>16&255,v=65535&X,!((_=X>>>24)<=l);){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(v<16)c>>>=_,l-=_,i.lens[i.have++]=v;else{if(16===v){for(R=_+2;l<R;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(c>>>=_,l-=_,0===i.have){e.msg="invalid bit length repeat",i.mode=x_;break}T=i.lens[i.have-1],h=3+(3&c),c>>>=2,l-=2}else if(17===v){for(R=_+3;l<R;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}l-=_,T=0,h=3+(7&(c>>>=_)),c>>>=3,l-=3}else{for(R=_+7;l<R;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}l-=_,T=0,h=11+(127&(c>>>=_)),c>>>=7,l-=7}if(i.have+h>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=x_;break}for(;h--;)i.lens[i.have++]=T}}if(i.mode===x_)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=x_;break}if(i.lenbits=9,g={bits:i.lenbits},I=E_(1,i.lens,0,i.nlen,i.lencode,0,i.work,g),i.lenbits=g.bits,I){e.msg="invalid literal/lengths set",i.mode=x_;break}if(i.distbits=6,i.distcode=i.distdyn,g={bits:i.distbits},I=E_(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,g),i.distbits=g.bits,I){e.msg="invalid distances set",i.mode=x_;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(a>=6&&d>=258){e.next_out=n,e.avail_out=d,e.next_in=r,e.avail_in=a,i.hold=c,i.bits=l,V_(e,m),n=e.next_out,s=e.output,d=e.avail_out,r=e.next_in,o=e.input,a=e.avail_in,c=i.hold,l=i.bits,i.mode===k_&&(i.back=-1);break}for(i.back=0;y=(X=i.lencode[c&(1<<i.lenbits)-1])>>>16&255,v=65535&X,!((_=X>>>24)<=l);){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(y&&!(240&y)){for(S=_,Z=y,f=v;y=(X=i.lencode[f+((c&(1<<S+Z)-1)>>S)])>>>16&255,v=65535&X,!(S+(_=X>>>24)<=l);){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}c>>>=S,l-=S,i.back+=S}if(c>>>=_,l-=_,i.back+=_,i.length=v,0===y){i.mode=26;break}if(32&y){i.back=-1,i.mode=k_;break}if(64&y){e.msg="invalid literal/length code",i.mode=x_;break}i.extra=15&y,i.mode=22;case 22:if(i.extra){for(R=i.extra;l<R;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}i.length+=c&(1<<i.extra)-1,c>>>=i.extra,l-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;y=(X=i.distcode[c&(1<<i.distbits)-1])>>>16&255,v=65535&X,!((_=X>>>24)<=l);){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(!(240&y)){for(S=_,Z=y,f=v;y=(X=i.distcode[f+((c&(1<<S+Z)-1)>>S)])>>>16&255,v=65535&X,!(S+(_=X>>>24)<=l);){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}c>>>=S,l-=S,i.back+=S}if(c>>>=_,l-=_,i.back+=_,64&y){e.msg="invalid distance code",i.mode=x_;break}i.offset=v,i.extra=15&y,i.mode=24;case 24:if(i.extra){for(R=i.extra;l<R;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}i.offset+=c&(1<<i.extra)-1,c>>>=i.extra,l-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=x_;break}i.mode=25;case 25:if(0===d)break e;if(h=m-d,i.offset>h){if((h=i.offset-h)>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=x_;break}h>i.wnext?(h-=i.wnext,p=i.wsize-h):p=i.wnext-h,h>i.length&&(h=i.length),b=i.window}else b=s,p=n-i.offset,h=i.length;h>d&&(h=d),d-=h,i.length-=h;do{s[n++]=b[p++]}while(--h);0===i.length&&(i.mode=21);break;case 26:if(0===d)break e;s[n++]=i.length,d--,i.mode=21;break;case 27:if(i.wrap){for(;l<32;){if(0===a)break e;a--,c|=o[r++]<<l,l+=8}if(m-=d,e.total_out+=m,i.total+=m,m&&(e.adler=i.check=Z_(i)?G_(i.check,s,m,n-m):W_(i.check,s,m,n-m)),m=d,(Z_(i)?c:N_(c))!==i.check){e.msg="incorrect data check",i.mode=x_;break}c=0,l=0}i.mode=28;case 28:if(i.wrap&&Z_(i)){for(;l<32;){if(0===a)break e;a--,c+=o[r++]<<l,l+=8}if(c!==(4294967295&i.total)){e.msg="incorrect length check",i.mode=x_;break}c=0,l=0}i.mode=29;case 29:I=1;break e;case x_:I=-3;break e;case 31:return-4;default:return P_}return e.next_out=n,e.avail_out=d,e.next_in=r,e.avail_in=a,i.hold=c,i.bits=l,(i.wsize||m!==e.avail_out&&i.mode<x_&&(i.mode<27||4!==t))&&D_(e,e.output,e.next_out,m-e.avail_out),u-=e.avail_in,m-=e.avail_out,e.total_in+=u,e.total_out+=m,i.total+=m,i.wrap&&m&&(e.adler=i.check=Z_(i)?G_(i.check,s,m,e.next_out-m):W_(i.check,s,m,e.next_out-m)),e.data_type=i.bits+(i.last?64:0)+(i.mode===k_?128:0)+(20===i.mode||15===i.mode?256:0),(0===u&&0===m||4===t)&&0===I&&(I=-5),I},f_.inflateEnd=function(e){if(!e||!e.state)return P_;var t=e.state;return t.window&&(t.window=null),e.state=null,0},f_.inflateGetHeader=function(e,t){var i;return e&&e.state&&2&(i=e.state).wrap?(i.head=t,t.done=!1,0):P_},f_.inflateSetDictionary=function(e,t){var i,o=t.length;return e&&e.state?0!==(i=e.state).wrap&&11!==i.mode?P_:11===i.mode&&W_(1,t,o,0)!==i.check?-3:D_(e,t,o,o)?(i.mode=31,-4):(i.havedict=1,0):P_},f_.inflateInfo="pako inflate (from Nodeca project)";var A_={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};var z_=f_,j_=xp,Q_=e_,B_=A_,q_=Xb,$_=a_,ey=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1},ty=Object.prototype.toString;function iy(e){if(!(this instanceof iy))return new iy(e);this.options=j_.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&(15&t.windowBits||(t.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $_,this.strm.avail_out=0;var i=z_.inflateInit2(this.strm,t.windowBits);if(i!==B_.Z_OK)throw new Error(q_[i]);if(this.header=new ey,z_.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=Q_.string2buf(t.dictionary):"[object ArrayBuffer]"===ty.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=z_.inflateSetDictionary(this.strm,t.dictionary))!==B_.Z_OK))throw new Error(q_[i])}function oy(e,t){var i=new iy(t);if(i.push(e,!0),i.err)throw i.msg||q_[i.err];return i.result}iy.prototype.push=function(e,t){var i,o,s,r,n,a=this.strm,d=this.options.chunkSize,c=this.options.dictionary,l=!1;if(this.ended)return!1;o=t===~~t?t:!0===t?B_.Z_FINISH:B_.Z_NO_FLUSH,"string"==typeof e?a.input=Q_.binstring2buf(e):"[object ArrayBuffer]"===ty.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;do{if(0===a.avail_out&&(a.output=new j_.Buf8(d),a.next_out=0,a.avail_out=d),(i=z_.inflate(a,B_.Z_NO_FLUSH))===B_.Z_NEED_DICT&&c&&(i=z_.inflateSetDictionary(this.strm,c)),i===B_.Z_BUF_ERROR&&!0===l&&(i=B_.Z_OK,l=!1),i!==B_.Z_STREAM_END&&i!==B_.Z_OK)return this.onEnd(i),this.ended=!0,!1;a.next_out&&(0!==a.avail_out&&i!==B_.Z_STREAM_END&&(0!==a.avail_in||o!==B_.Z_FINISH&&o!==B_.Z_SYNC_FLUSH)||("string"===this.options.to?(s=Q_.utf8border(a.output,a.next_out),r=a.next_out-s,n=Q_.buf2string(a.output,s),a.next_out=r,a.avail_out=d-r,r&&j_.arraySet(a.output,a.output,s,r,0),this.onData(n)):this.onData(j_.shrinkBuf(a.output,a.next_out)))),0===a.avail_in&&0===a.avail_out&&(l=!0)}while((a.avail_in>0||0===a.avail_out)&&i!==B_.Z_STREAM_END);return i===B_.Z_STREAM_END&&(o=B_.Z_FINISH),o===B_.Z_FINISH?(i=z_.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===B_.Z_OK):o!==B_.Z_SYNC_FLUSH||(this.onEnd(B_.Z_OK),a.avail_out=0,!0)},iy.prototype.onData=function(e){this.chunks.push(e)},iy.prototype.onEnd=function(e){e===B_.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=j_.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},__.Inflate=iy,__.inflate=oy,__.inflateRaw=function(e,t){return(t=t||{}).raw=!0,oy(e,t)},__.ungzip=oy;var sy={};(0,xp.assign)(sy,Np,__,A_);var ry=i(sy);let ny=1;const ay="VERTC",dy=()=>window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;class cy{constructor(e){Hu(this,"storeName",void 0),Hu(this,"pendingList",[]),this.storeName=e,!np()&&dy()&&this._checkAndCreateStore(e)}async _checkAndCreateStore(e,t){const i=await cy._promiseLock.lock();if(dy().databases){let e;await new Promise((t=>{const i=()=>dy().databases().finally(t);e=setInterval(i,100),i()})).finally((()=>clearInterval(e)))}return new Promise((o=>{cy.db&&(cy.db.close(),delete cy.db);const s=t?dy().open(ay,t):dy().open(ay);s.onupgradeneeded=()=>{s.result.createObjectStore(e)},s.onerror=()=>{console.error("IndexedDBInterface error",s.error)},s.onsuccess=()=>{const t=s.result;cy.db=t;try{cy.db.transaction(this.storeName,"readonly"),this.pendingList.forEach((async e=>{let{txMode:t,pendResolve:i,pendReject:o}=e;try{i(await this._getStore(t))}catch(s){o()}})),o()}catch(r){o(this._checkAndCreateStore(e,t.version+1))}finally{i()}}}))}async _getStore(e){const t=await cy._promiseLock.lock();return new Promise(((i,o)=>{if(!cy.db)return this.pendingList.push({txMode:e,pendResolve:i,pendReject:o}),void t();try{i(cy.db.transaction(this.storeName,e).objectStore(this.storeName))}catch(s){return void this.pendingList.push({txMode:e,pendResolve:i,pendReject:o})}finally{t()}}))}async put2String(e,t){let i;try{i=JSON.stringify(e)}catch(o){i=e}return await this.put(i,t)}async get4String(e){const t=await this.get(e);let i;try{i=JSON.parse(t)}catch(o){i=t}return i}async put(e,t){const i=await this._getStore("readwrite");return new Promise(((o,s)=>{const r=i.put(e,t);r.onsuccess=()=>{o()},r.onerror=e=>{s(e)}}))}async get(e){const t=await this._getStore("readonly");return new Promise(((i,o)=>{const s=t.get(e);s.onsuccess=()=>{i(s.result)},s.onerror=e=>{o(e)}}))}async del(e){const t=await this._getStore("readwrite");return new Promise(((i,o)=>{const s=t.delete(e);s.onsuccess=()=>{i()},s.onerror=e=>{o(e)}}))}}Hu(cy,"db",void 0),Hu(cy,"state","init"),Hu(cy,"_promiseLock",new class{constructor(e){Hu(this,"lockingPromise",Promise.resolve()),Hu(this,"locks",0),Hu(this,"name",""),Hu(this,"lockId",void 0),this.lockId=ny++,e&&(this.name=e)}get isLocked(){return this.locks>0}lock(){let e;this.locks+=1;const t=new Promise((t=>{e=()=>{this.locks-=1,t()}})),i=this.lockingPromise.then((()=>e));return this.lockingPromise=this.lockingPromise.then((()=>t)),i}}("iDB"));var ly=zi.includes;Vi({target:"Array",proto:!0,forced:n((function(){return!Array(1).includes()}))},{includes:function(e){return ly(this,e,arguments.length>1?arguments[1]:void 0)}});var uy=Ha("Array","includes"),my=ph,hy=TypeError,py=bt("match"),by=Vi,_y=function(e){if(my(e))throw new hy("The method doesn't accept regular expressions");return e},yy=A,vy=fo,Sy=function(e){var t=/./;try{"/./"[e](t)}catch(i){try{return t[py]=!1,"/./"[e](t)}catch(o){}}return!1},Zy=y("".indexOf);by({target:"String",proto:!0,forced:!Sy("includes")},{includes:function(e){return!!~Zy(vy(yy(this)),vy(_y(e)),arguments.length>1?arguments[1]:void 0)}});var fy=Ha("String","includes"),Ty=re,Iy=uy,gy=fy,Ry=Array.prototype,Xy=String.prototype,Ly=i((function(e){var t=e.includes;return e===Ry||Ty(Ry,e)&&t===Ry.includes?Iy:"string"==typeof e||e===Xy||Ty(Xy,e)&&t===Xy.includes?gy:t}));function Cy(e,t){if(null==e)return{};var i,o,s=function(e,t){if(null==e)return{};var i={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(Ly(t).call(t,o))continue;i[o]=e[o]}return i}(e,t);if(Pa){var r=Pa(e);for(o=0;o<r.length;o++)i=r[o],Ly(t).call(t,i)||{}.propertyIsEnumerable.call(e,i)&&(s[i]=e[i])}return s}const Wy=["message"];var Gy,Vy,Ey=new class{constructor(){Hu(this,"name","LongStringReportor"),Hu(this,"inBuffer",[]),Hu(this,"outBuffer",[])}push(e){e.message&&this.inBuffer.push(Ju(Ju({},e),{},{message:{id:ap().slice(0,3),index:0,end:!0,msg:e.message}}))}splice(e){const t=[];let i=0;for(;this.outBuffer.length;){const o=JSON.stringify(this.outBuffer[0]).length;if(!(o<e))break;e-=o,i+=o,t.push(this.outBuffer.shift())}for(;this.inBuffer[0]&&e>0;){const o=this.inBuffer[0],{message:s}=o,r=Ju(Ju({},Cy(o,Wy)),{},{message:Ju(Ju({},s),{},{msg:""})}),n=JSON.stringify(r).length,a=e-n,d=Ju({},r);if(a>s.msg.length)d.message.msg=s.msg,this.inBuffer.shift();else{if(!(a>=10))break;{const e=s.msg.slice(0,a);d.message.msg=e,d.message.end=!1,this.inBuffer[0].message.msg=s.msg.slice(a),this.inBuffer[0].message.index++}}const c=JSON.stringify(d.message),l=c.length;e-=l+n,i+=l+n,t.push(Ju(Ju({},d),{},{message:c}))}return{payload:t,payloadSize:i}}unshift(e){this.outBuffer=e.concat(this.outBuffer)}get(){return[...this.outBuffer,...this.inBuffer.map((e=>Ju(Ju({},e),{},{message:JSON.stringify(e.message)})))]}set(e){e.forEach((e=>{!function(e){return void 0!==e.report_id}(e)?(e.message||(e.message=""),this.inBuffer.push(Ju(Ju({},e),{},{message:JSON.parse(e.message)}))):this.outBuffer.push(e)})),this.outBuffer=[].concat(this.outBuffer),this.inBuffer=[].concat(this.inBuffer)}isEmpty(){return 0===this.inBuffer.length&&0===this.outBuffer.length}};const Py=5e5,ky={product_line:"rtc",report_version:"5",os:"web",user_agent:np()?"":null===(Gy=navigator)||void 0===Gy?void 0:Gy.userAgent,platform:"web",product:"webrtc",app_state:"active"},xy="LogReportor",Ny="undefined"!=typeof window&&(window.location.search.includes("_rtc_debug_")||(null===(Vy=window.localStorage)||void 0===Vy?void 0:Vy.getItem("_rtc_debug_")));class My{constructor(e){Hu(this,"_buffer",void 0),this._buffer=new cy(e)}async set(e,t){await this._buffer.put2String(e,t)}async get(e){var t;let i=[];try{i=await this._buffer.get4String(e)}catch(o){}return null!==(t=i)&&void 0!==t?t:[]}}var Yy=new class{constructor(){Hu(this,"reportCommon",ky),Hu(this,"reportIds",new Map),Hu(this,"dataBuffer",[]),Hu(this,"reportorList",[]),Hu(this,"dbBuffer",void 0),Hu(this,"posting",!1),Hu(this,"sucSendTimer",void 0),Hu(this,"preSucTime",0),Hu(this,"errSendTimer",void 0),Hu(this,"errSendDelay",100),Hu(this,"_logServerUrl",void 0),Hu(this,"_retryCount",0),Hu(this,"_reportLimit",Py),Hu(this,"_disableTimeout",!1),np()||(window.addEventListener("beforeunload",(()=>{clearTimeout(this.errSendTimer),clearTimeout(this.sucSendTimer),this.send(void 0,!0)})),document.addEventListener("visibilitychange",(()=>{"visible"===document.visibilityState?this.setCommonStats({app_state:"active"}):"hidden"===document.visibilityState&&this.setCommonStats({app_state:"background"})})),Ny&&(window.__rtc_debug_reportor__=this)),Sp.on("UPLOAD_REPORT_LIMIT",(e=>{this.setReportLimit(e)})),Sp.on("ENABLE_REPORT_IDB_BUFFER",(e=>{e&&this.enableIndexedDBBuffer()})),setTimeout((()=>{this.reportorList.push(gv),this.reportorList.push(Ey)}))}setUrl(e){this._logServerUrl=e}setCommonStats(e){this.reportCommon=Object.assign(this.reportCommon,e)}getCommonStats(){return this.reportCommon}setReportLimit(e){this._reportLimit=Math.max(e,5e4),this._reportLimit=Math.min(e,5e5)}getReportId(e){var t;e=null!==(t=e)&&void 0!==t?t:"__global__",this.reportIds.has(e)||this.reportIds.set(e,0);let i=this.reportIds.get(e);return void 0===i&&(cv("no reportId in reportId map with engine-session-id ".concat(e),0,{}),i=0),this.reportIds.set(e,i+1),i}push(e){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1])this.send(e);else{var t;const i=null!==(t=e.engine_session_id)&&void 0!==t?t:"__global__";this.reportIds.has(i)||this.reportIds.set(i,0),this.dataBuffer.push(e),!this.posting&&!this.errSendTimer&&Date.now()-this.preSucTime>2e3&&(clearTimeout(this.sucSendTimer),this.send())}}enableIndexedDBBuffer(){this.dbBuffer||(this.dbBuffer=new My("ReportorDBBuffer"),this.dbBuffer.get(xy).then((e=>{e.forEach((e=>{this.push(e)}))})),this.reportorList.forEach((e=>{var t;null===(t=this.dbBuffer)||void 0===t||t.get(e.name).then((t=>{e.set(t)}))})))}backup(){try{var e;null===(e=this.dbBuffer)||void 0===e||e.set([...this.dataBuffer],xy),this.reportorList.forEach((e=>{var t;null===(t=this.dbBuffer)||void 0===t||t.set([...e.get()],e.name)}))}catch(t){cv("Error when save log into IDB",-1,t)}}unshift(e){this.dataBuffer=e[0].concat(this.dataBuffer),this.reportorList.forEach(((t,i)=>{var o;t.unshift(null!==(o=e[i+1])&&void 0!==o?o:[])}))}_splice(){let e=function(e,t){let i=0;for(let o=0;o<e.length;o++)if(i+=JSON.stringify(e[o]).length,i>t)return o;return e.length}(this.dataBuffer,this._reportLimit);0===e&&this.dataBuffer.length>0&&(this._reportLimit=JSON.stringify(this.dataBuffer[0]).length+10,e=1,cv("update report limit to ".concat(this._reportLimit),0,null));const t=this.dataBuffer.splice(0,e),i=JSON.stringify(t).length,o=[t];let s=this._reportLimit-i;return this.reportorList.forEach((e=>{const{payload:t,payloadSize:i}=e.splice(s);t.forEach((e=>{var t,i,o;void 0===e.report_id&&(e.report_id=this.getReportId(e.engine_session_id),!np()&&window.__onRTCReport&&(null===(t=(i=window).__onRTCReport)||void 0===t||t.call(i,null!==(o=e.engine_session_id)&&void 0!==o?o:"global",e,this.getCommonStats())))})),o.push(t),s-=i})),o}async send(e,t){this.backup();const i=this.reportorList.reduce(((e,t)=>e&&t.isEmpty()),!0);if(!e&&!this.dataBuffer.length&&i||!this._logServerUrl)return;e||(this.posting=!0);let o=[];e||(o=this._splice());const s=Ny,r={data:e||kp(o).call(o),header:Ju(Ju({},this.reportCommon),{},{http_retry_count:this._retryCount}),from:"web",os:"web",version:"1"},n={method:"POST",body:s?JSON.stringify(r):ry.gzip(JSON.stringify(r))};if(!this._disableTimeout)try{const e=new AbortController;n.signal=e.signal,setTimeout((()=>{e.abort()}),1e4)}catch(l){console.warn("AbortController is not supported"),this._disableTimeout=!0}s||(n.headers={"Content-Encoding":"gzip","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"});let a,d,c=null;try{a=await fetch(this._logServerUrl,n),200!==a.status&&304!==a.status||(c=JSON.parse(await a.text()))}catch(u){d=u}e||(this.posting=!1),c&&0===c.StatusCode?e||t||this.sucSend():(setTimeout((()=>{var e,t,i;cv("reportor post error, resJSON:".concat(null===(e=c)||void 0===e?void 0:e.toString()," err:").concat(d),null!==(t=null===(i=a)||void 0===i?void 0:i.status)&&void 0!==t?t:-1,d)}),0),e?this.send(e):(this.unshift(o),t?this.send():this.errSend()))}_getDataBufferTotalSize(){return this.dataBuffer.reduce(((e,t)=>e+JSON.stringify(t).length),0)}sucSend(){this.errSendDelay=100,this._retryCount=0,this.preSucTime=Date.now();const e=this._getDataBufferTotalSize()>1e6?1e3:2e3;this.sucSendTimer=setTimeout((()=>this.send()),e)}errSend(){this.errSendTimer=setTimeout((()=>{this.send(),delete this.errSendTimer}),this.errSendDelay),this.errSendDelay*=2,this._retryCount++}};class wy{constructor(e){Hu(this,"modifyIds",{pre_connection:!1}),this.id=e}report(e,t,i){const o=Ju(Ju(Ju({event_key:e,rtc_timestamp:Date.now()},this.modifyIds),t),{},{report_id:Yy.getReportId(this.modifyIds.engine_session_id)});var s,r;("object"==typeof i&&Object.keys(i).length>0&&(o.common_extra_info=JSON.stringify(i)),Object.keys(o).forEach((e=>{void 0!==o[e]&&""!==o[e]||delete o[e]})),!np()&&window.__onRTCReport)&&(null===(s=(r=window).__onRTCReport)||void 0===s||s.call(r,this.modifyIds.engine_session_id,o,Yy.getCommonStats()));"UT"!=={}.VITE_TEST&&Yy.push(o)}reportLog(e){const t=Ju(Ju({event_key:"rtc_invoke_status",sdk_api_name:"console_log",rtc_timestamp:Date.now()},this.modifyIds),{},{message:e});gv.push(t)}reportLongString(e,t){const i=Ju(Ju({event_key:"rtc_invoke_status",sdk_api_name:"sdk_long_string_".concat(e),rtc_timestamp:Date.now()},this.modifyIds),{},{message:t});Ey.push(i)}set(e){this.modifyIds=Object.assign(this.modifyIds,e)}destroy(){}}class Ky{constructor(e){Hu(this,"_preTime",Date.now()),Hu(this,"_one2oneNum",0),Hu(this,"_one2manyNum",0),Hu(this,"_one2oneMsgCache",new Map),Hu(this,"_one2manyMsgCache",new Map),Hu(this,"roomId",""),Hu(this,"userId",""),Hu(this,"rtsSessionId",""),Hu(this,"logger",void 0),Hu(this,"serverUrl","server"),this.id=e,this.logger=new xv("MessageReportor",1)}needReport(e){return!!Ky.config&&(Date.now()-this._preTime>=36e5&&(this._preTime=Date.now(),this._one2oneNum=0,this._one2manyNum=0),"one2one"===e&&this._one2oneNum<Ky.config.max_one2one_fpt_per_hour&&Math.random()<=Ky.config.one2one_fpt_ratio/100||"one2many"===e&&this._one2manyNum<Ky.config.max_one2many_fpt_per_hour&&Math.random()<=Ky.config.one2many_fpt_ratio/100)}cacheP2PMsg(e){var t;this._one2oneMsgCache.set(e.msg_id,Ju({config_version:(null===(t=Ky.config)||void 0===t?void 0:t.version)||""},e))}updateP2PMsg(e,t){const i=this._one2oneMsgCache.get(e);i&&this._one2oneMsgCache.set(e,Ju(Ju({},i),t))}cacheCustomMsg(e){var t;this._one2manyMsgCache.set(e.msg_id,Ju({config_version:(null===(t=Ky.config)||void 0===t?void 0:t.version)||""},e))}updateOne2ManyMsg(e,t){const i=this._one2manyMsgCache.get(e);i&&this._one2manyMsgCache.set(e,Ju(Ju({},i),t))}reportP2PMsg(e){const t=this._one2oneMsgCache.get(e);var i;t&&(this.logger.info("reportP2PMsg",t.type,JSON.stringify(t)),null===(i=mv(this.id))||void 0===i||i.report("rts_message",t))}reportOne2ManyMsg(e){const t=this._one2manyMsgCache.get(e);var i;t&&(this.logger.info("reportOne2ManyMsg",t.type,JSON.stringify(t)),null===(i=mv(this.id))||void 0===i||i.report("rts_message",t))}reportMsgRecv(e){var t,i;e.config_version=(null===(t=Ky.config)||void 0===t?void 0:t.version)||"",this.logger.info("reportMsgRecv",e.type,JSON.stringify(e)),null===(i=mv(this.id))||void 0===i||i.report("rts_message",e)}destroy(){this._one2manyNum=0,this._one2oneNum=0,this._one2manyMsgCache.clear(),this._one2oneMsgCache.clear(),this._preTime=Date.now(),this.roomId="",this.userId="",this.rtsSessionId=""}}Hu(Ky,"config",void 0);const Hy=new Map,Fy=(e,t)=>{const i=Hy.get(e);i&&(i.serverUrl=t)},Jy=e=>{new xv("MessageReportor",1).info("setConfig","get config: ".concat(JSON.stringify(e))),Ky.config=e},Oy=(e,t)=>{const i=Hy.get(e);i&&(i.rtsSessionId=t)},Uy=e=>{const t=Hy.get(e)||new Ky(e);return Hy.set(e,t),t},Dy=e=>{const t=Hy.get(e);t&&(t.destroy(),Hy.delete(e))},Ay=(e,t)=>{const i=Hy.get(e);i&&(i.roomId=t||"")},zy=(e,t)=>{const i=Hy.get(e);i&&(i.userId=t||"")},jy=(e,t)=>{const i=Hy.get(e);if(null!=i&&i.needReport("one2one")){const e=t.to?"one2one":"one2server";t.enable_report=!0,t.report_msg_id=t.id,i.cacheP2PMsg({rts_session_id:i.rtsSessionId,msg_id:"".concat(t.id),node_role:"src_sdk",from:t.from,to:t.to||i.serverUrl,msg_type:e,type:e,rts_room_id:t.room,req_ts:Date.now(),send_ts:Date.now(),ack_ts:Date.now(),msg_size:0,error_code:0,recv_msg_ts:0,fwd_msg_ts:0,reply_ack_ts:0,cur_dst_uid:""})}return t},Qy=(e,t,i)=>{var o;t.enable_report&&dp(t.report_msg_id)&&(null===(o=Hy.get(e))||void 0===o||o.updateP2PMsg("".concat(t.report_msg_id),{send_ts:Date.now(),msg_size:i}))},By=(e,t,i)=>{if(t.enable_report&&dp(t.report_msg_id)){const o=Hy.get(e);null==o||o.updateP2PMsg("".concat(t.report_msg_id),{ack_ts:Date.now(),error_code:i}),null==o||o.reportP2PMsg("".concat(t.report_msg_id))}},qy=(e,t,i)=>{const o=Hy.get(e);return null!=o&&o.needReport("one2many")&&(i.enable_report=!0,i.report_msg_id=t,o.cacheCustomMsg({rts_session_id:o.rtsSessionId,msg_id:"".concat(t),node_role:"src_sdk",from:i.clientId,to:o.roomId||i.roomId,msg_type:"one2many",type:"one2many",rts_room_id:o.roomId,req_ts:Date.now(),send_ts:Date.now(),ack_ts:Date.now(),msg_size:0,error_code:0,recv_msg_ts:0,fwd_msg_ts:0,reply_ack_ts:0,cur_dst_uid:""})),i},$y=(e,t,i)=>{if(t.enable_report&&dp(t.report_msg_id)){const o=Hy.get(e),s=t.to?"one2one":"one2many";null==o||o.reportMsgRecv({rts_session_id:o.rtsSessionId,msg_id:"".concat(t.report_msg_id),msg_size:i.msg_size,node_role:"dst_sdk",msg_type:s,type:s,rts_room_id:t.room,from:t.from,to:t.to||t.room,error_code:0,recv_msg_ts:i.recv_msg_ts,fwd_msg_ts:i.fwd_msg_ts,reply_ack_ts:Date.now(),cur_dst_uid:t.to?"":o.userId,config_version:"",req_ts:0,send_ts:0,ack_ts:0})}},ev=(e,t,i)=>{if(t.enable_report&&dp(t.report_msg_id)){const o=Hy.get(e);o&&(null==o||o.updateOne2ManyMsg("".concat(t.report_msg_id),{ack_ts:Date.now(),error_code:i}),null==o||o.reportOne2ManyMsg("".concat(t.report_msg_id)))}},tv=(e,t,i)=>{if(t.enable_report&&dp(t.report_msg_id)){const o=Hy.get(e);o&&o.updateOne2ManyMsg("".concat(t.report_msg_id),{send_ts:Date.now(),msg_size:i})}},iv=(e,t,i)=>{if(t.enable_report&&dp(t.report_msg_id)){const o=Hy.get(e);null==o||o.reportMsgRecv({rts_session_id:o.rtsSessionId,msg_id:"".concat(t.report_msg_id),msg_size:i.msg_size,node_role:"dst_sdk",msg_type:"one2many",type:"one2many",rts_room_id:t.roomId,from:t.clientId,to:t.roomId,error_code:0,recv_msg_ts:i.recv_msg_ts,fwd_msg_ts:i.fwd_msg_ts,reply_ack_ts:Date.now(),cur_dst_uid:o.userId,config_version:"",req_ts:0,send_ts:0,ack_ts:0})}};class ov{constructor(e){Hu(this,"_timer",void 0),Hu(this,"userMessage",{}),Hu(this,"roomMessage",{}),this.id=e,this._setTimer()}_setTimer(){const e=()=>{this._reportAndgReset(),clearTimeout(this._timer),this._timer=setTimeout(e,1e4)};e()}_reportAndgReset(){(Object.keys(this.userMessage).length||Object.keys(this.roomMessage).length)&&(this._report(),this._reset())}_report(){var e;null===(e=mv(this.id))||void 0===e||e.report("rtc_message_statistics",{dc_user_message:Object.keys(this.userMessage).map((e=>this.userMessage[e])),dc_room_message:Object.keys(this.roomMessage).map((e=>this.roomMessage[e])),media_server_ip:""})}_reset(){this.userMessage={},this.roomMessage={}}_checkInitUserMessage(e,t){this.userMessage["".concat(t,"-").concat(e)]||(this.userMessage["".concat(t,"-").concat(e)]={dc_peer_user_id:e,dc_send_total:0,dc_recv_total:0,dc_send_ack:0,dc_send_fail:0,dc_fail_timeout:0,dc_fail_no_receiver:0,dc_fail_no_relay_path:0,dc_cost_time:0,dc_cost_e2s:0,dc_cost_s2s:0,dc_least_time:Number(1/0),dc_most_time:0,dc_cost_peer_s2e:0,dc_send_ack_100:0,dc_send_ack_200:0,dc_send_ack_400:0,dc_send_ack_1s:0,dc_message_type:t,dc_send_binary:0})}_sendUserMessage(e,t,i){this._checkInitUserMessage(e,t),this.userMessage["".concat(t,"-").concat(e)].dc_send_total++,i&&this.userMessage["".concat(t,"-").concat(e)].dc_send_binary++}_recvUserMessage(e,t){this._checkInitUserMessage(e,t),this.userMessage["".concat(t,"-").concat(e)].dc_recv_total++}_sendUserFail(e,t,i){const o=this.userMessage["".concat(t,"-").concat(e)];o&&(o.dc_send_fail++,this._handleUserFail(o,i))}_handleUserFail(e,t){t&&(t.code||t.err)&&(["TIME_OUT","USER_MESSAGE_TIMEOUT"].includes(t.code)?e.dc_fail_timeout++:3===t.err?e.dc_fail_no_receiver++:4===t.err?e.dc_fail_no_relay_path++:1===t.err&&e.dc_fail_timeout++)}_sendUserAck(e,t,i,o,s){const r=this.userMessage["".concat(t,"-").concat(e)];r&&(r.dc_send_ack++,r.dc_cost_time+=i,r.dc_cost_s2s+=o||0,r.dc_cost_peer_s2e+=s,r.dc_cost_e2s+=i-(o||0)-s,i/2<=100?(r.dc_send_ack_100++,r.dc_send_ack_200++,r.dc_send_ack_400++,r.dc_send_ack_1s++):i/2<=200?(r.dc_send_ack_200++,r.dc_send_ack_400++,r.dc_send_ack_1s++):i/2<=400?(r.dc_send_ack_400++,r.dc_send_ack_1s++):i/2<=1e3&&r.dc_send_ack_1s++,i<r.dc_least_time&&(r.dc_least_time=i),i>r.dc_most_time&&(r.dc_most_time=i))}sendRoomMessage(e,t){this.roomMessage[e]||(this.roomMessage[e]={dc_room_id:e,dc_send_total:0,dc_send_ack:0,dc_cost_time:0,dc_least_time:Number(1/0),dc_most_time:0,dc_send_fail:0,dc_send_ack_100:0,dc_send_ack_200:0,dc_send_ack_400:0,dc_send_ack_1s:0,dc_send_binary:0}),this.roomMessage[e].dc_send_total++,t&&this.roomMessage[e].dc_send_binary++}sendRoomFail(e){const t=this.roomMessage[e];t&&t.dc_send_fail++}sendRoomAck(e,t){const i=this.roomMessage[e];i&&(i.dc_send_ack++,i.dc_cost_time+=t,t<i.dc_least_time&&(i.dc_least_time=t),t>i.dc_most_time&&(i.dc_most_time=t),t/2<=100?(i.dc_send_ack_100++,i.dc_send_ack_200++,i.dc_send_ack_400++,i.dc_send_ack_1s++):t/2<=200?(i.dc_send_ack_200++,i.dc_send_ack_400++,i.dc_send_ack_1s++):t/2<=400?(i.dc_send_ack_400++,i.dc_send_ack_1s++):t/2<=1e3&&i.dc_send_ack_1s++)}sendP2PMessage(e,t){this._sendUserMessage(e,"p2p",t)}recvP2PMessage(e){this._recvUserMessage(e,"p2p")}sendP2PFail(e,t){this._sendUserFail(e,"p2p",t)}sendP2PAck(e,t,i,o){this._sendUserAck(e,"p2p",t,i,o)}sendP2POutRoomMessage(e,t){this._sendUserMessage(e,"p2p_outside_room",t)}recvP2POutRoomMessage(e){this._recvUserMessage(e,"p2p_outside_room")}sendP2POutRoomFail(e,t){this._sendUserFail(e,"p2p_outside_room",t)}sendP2POutRoomAck(e,t,i,o){this._sendUserAck(e,"p2p_outside_room",t,i,o)}sendP2serverMessage(e){this._sendUserMessage("","p2server",e)}sendP2serverFail(e){this._sendUserFail("","p2server",e)}sendP2serveAck(e,t,i){this._sendUserAck("","p2server",e,t,i)}countP2PMessage(e,t,i,o,s){this.sendP2PMessage(t,i),e?this.sendP2PAck(t,Date.now()-o,s.s2s_time||0,s.s2e_time||0):this.sendP2PFail(t,s)}countRoomMessage(e,t,i,o){this.sendRoomMessage(t,i),e?this.sendRoomAck(t,Date.now()-o):this.sendRoomFail(t)}countUserMessageOutsideRoom(e,t,i,o,s){this.sendP2POutRoomMessage(t,i),e?this.sendP2POutRoomAck(t,Date.now()-o,s.s2s_time,s.s2e_time):this.sendP2POutRoomFail(t,s)}countServerMessage(e,t,i,o){this.sendP2serverMessage(t),e?(o=o||{},this.sendP2serveAck(Date.now()-i,o.s2s_time||0,o.s2e_time||0)):this.sendP2serverFail(o)}destroy(){this._reset(),clearTimeout(this._timer)}}const sv=e=>{Yy.setCommonStats(e)},rv=e=>{Yy.setUrl(e)},nv=new wy("global"),av=(e,t,i)=>{nv.report("rtc_sdk_api_call",{sdk_api_name:e,error_code:t,message:i})},dv=(e,t,i)=>{nv.report("rtc_sdk_callback",{sdk_callback_name:e,error_code:t,message:i})},cv=(e,t,i)=>{nv.report("rtc_error",{message:e,error_code:t},i)},lv=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",s=arguments.length>4?arguments[4]:void 0;nv.report("rtc_invoke_status",{sdk_api_name:e,message:t,error_code:i,stream_id:o,elapse:0},s)};const uv=new Map,mv=e=>uv.get(e),hv=(e,t)=>{const i=new wy(e);return i.set(Ju(Ju({},t),{},{engine_session_id:ap()})),i.report("sdk_init_engine",{start:Date.now(),type:"begin"}),uv.set(e,i),i},pv=new Map;function bv(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t=Object.assign({debounce:0},t);const{debounce:i,debounceTag:o}=t;function s(e,t,o,s){if(!i)return t(...o);{const r="".concat(s,"_").concat(e),n=pv.get(r);clearTimeout(n);const a=setTimeout((()=>{t(...o)}),i);pv.set(r,a)}}return function(t,i,r){if("function"==typeof r.value){const t=r.value;r.value=function(){for(var r,n,a=arguments.length,d=new Array(a),c=0;c<a;c++)d[c]=arguments[c];const l=this.engineId||this.id,u=ap(),m={};var h,p;(e.forEach(((e,t)=>{m[e]=d[t]})),"joinRoom"===i)&&(null===(h=mv(l))||void 0===h||h.set({room_id:d[1],user_id:null===(p=d[2])||void 0===p?void 0:p.userId}));let b,_="";if(o)try{_=o(...d)}catch(y){}s(i,_v,[l,i,d,m,{event_session_id:u}],"start_".concat(_));try{b=t.apply(this,d)}catch(v){throw s(i,yv,[l,i,v.message,v.code||-1,{event_session_id:u}],"end_".concat(_)),v}return"function"==typeof(null===(r=b)||void 0===r?void 0:r.then)?b.then((e=>(s(i,yv,[l,i,[null!=e?e:{}],0,{event_session_id:u}],"end_".concat(_)),e))).catch((e=>{throw s(i,yv,[l,i,e.message,e.code,{event_session_id:u}],"end_".concat(_)),e})):(s(i,yv,[l,i,[null!==(n=b)&&void 0!==n?n:{}],0,{event_session_id:u}],"end_".concat(_)),b)}}}}const _v=function(e,t,i,o){var s;let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const n=Ju({sdk_api_name:t,message:JSON.stringify(Zv(i)),error_code:0},r);null===(s=mv(e))||void 0===s||s.report("rtc_sdk_api_call",n,o)},yv=function(e,t,i){var o;let s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const r=Ju({sdk_callback_name:t,error_code:arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,message:JSON.stringify(Array.isArray(i)?Zv(i):i)},s);null===(o=mv(e))||void 0===o||o.report("rtc_sdk_callback",r)},vv=function(e,t,i){var o;let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",n=arguments.length>5?arguments[5]:void 0;null===(o=mv(e))||void 0===o||o.report("rtc_invoke_status",{sdk_api_name:t,message:i,error_code:s,stream_id:r,elapse:0},n)},Sv=10;function Zv(e){const t=e=>{if(null!=e&&e._reportName)return e._reportName;if(e instanceof HTMLElement)return e.toString();if(e instanceof ArrayBuffer||ArrayBuffer.isView(e)){const t=ArrayBuffer.isView(e)?e.buffer:e,o=t.byteLength;let s=[];if(o>Sv){var i;const e=new DataView(t);s=[...Array.from({length:Sv/2}).map(((t,i)=>e.getUint8(i))),"...",...Dm(i=Array.from({length:Sv/2}).map(((e,t)=>o-1-t))).call(i).map((t=>e.getUint8(t)))]}else s=Array.from(new Uint8Array(t));return"".concat(e.constructor.name,"(").concat(o,") [").concat(s.join(", "),"]")}if(e instanceof ImageData)return"ImageData";if(Array.isArray(e))return e.map(t);if(["[object Object]","[object MediaStreamTrack]","[object CanvasCaptureMediaStreamTrack]"].includes(Object.prototype.toString.call(e))){const i={};for(const o in e)i[o]=t(e[o]);return i}return e instanceof Function?"[User Function]":e};return e.map(t)}const fv="undefined"!=typeof window&&window.location.search.includes("_rtc_upload_console_");function Tv(e,t){return e.map((e=>{let i="";try{if("string"==typeof e)return e;if(void 0===e)return"undefined";if(null===e)return"null";if(e instanceof MediaStreamTrack)return cp(e);if(e instanceof MediaStream)return lp(e);if(e instanceof RTCRtpSender)return up(e);if(e instanceof RTCRtpReceiver)return mp(e);if(e instanceof RTCRtpTransceiver)return hp(e);i=JSON.stringify(e)}catch(o){i=e.toString()}return i&&i.length>=t&&(i=i.slice(0,t)),i})).join(", ")}var Iv,gv=new class{constructor(){Hu(this,"name","ConsoleReportor"),Hu(this,"_uuid","".concat(Math.floor(899*Math.random())+100)),Hu(this,"_consoleReportId",0),Hu(this,"_engineReportIdMap",new Map),Hu(this,"_enabled","NULL"),Hu(this,"_consoleCutLength",Sp.getParameter("UPLOAD_CONSOLE_LENGTH_CUT")),Hu(this,"buffer",[]),fv&&setTimeout((()=>{this.switchOn()}),0),Sp.on("UPLOAD_CONSOLE_ON",(e=>{e?this.switchOn():this.turnOff()})),Sp.on("UPLOAD_CONSOLE_LENGTH_CUT",(e=>{this._consoleCutLength=e}))}get enabled(){return"OFF"!==this._enabled}switchOn(){"NULL"===this._enabled&&(console.log("[LoggerReportor.constructor] console upload switch ON"),this._enabled="ON")}turnOff(){"NULL"===this._enabled&&(console.log("[LoggerReportor.constructor] console upload switch OFF"),this._enabled="OFF",this.buffer=[])}getEngineConsoleId(e){var t;const i=null!==(t=this._engineReportIdMap.get(e))&&void 0!==t?t:0;return this._engineReportIdMap.set(e,i+1),i}report(e,t,i,o,s,r,n,a,d){if("OFF"===this._enabled)return;const c=mv(t),l=this._consoleReportId++,u=this.getEngineConsoleId(t),m=Tv(d,this._consoleCutLength),h=[...d],p="".concat(a).replace(/%o|%s/gi,(()=>Tv([h.shift()],this._consoleCutLength))),b="[".concat(this._uuid,"-").concat(l,"][").concat(t,"-").concat(u,"]-").concat(i,"-").concat(e,"[").concat(o,"]").concat(s,"[").concat(r,".").concat(n,"] ").concat(p," ").concat(m);var _;c?c.reportLog(b):(_=b,nv.reportLog(_))}push(e){"OFF"!==this._enabled&&this.buffer.push(e)}splice(e){if("ON"!==this._enabled)return{payload:[],payloadSize:0};const{index:t,size:i}=function(e,t){let i=0;for(let o=0;o<e.length;o++){const s=JSON.stringify(e[o]).length;if(i+=s,i>t)return{index:o,size:i-s}}return{index:e.length,size:i}}(this.buffer,e);return{payload:this.buffer.splice(0,t),payloadSize:i}}unshift(e){this.buffer=e.concat(this.buffer)}get(){return this.buffer}set(e){this.buffer=e.concat(this.buffer)}isEmpty(){return"OFF"===this._enabled||0===this.buffer.length}};const Rv="[VERTC]",Xv="#0050b3",Lv={DEBUG:"rgba(0, 0, 0, 0)"," INFO":"rgba(93, 173, 226, 0)"," WARN":"rgba(255, 119, 0, 0.3)",ERROR:"rgba(255, 0, 0, 0.3)"," SUCC":"rgba(0, 119, 0, 0.3)"},Cv="undefined"!=typeof window&&(window.location.search.includes("_rtc_debug_")||(null===(Iv=window.localStorage)||void 0===Iv?void 0:Iv.getItem("_rtc_debug_")));const Wv=()=>{const e=new Date;return"".concat(e.toTimeString().split(" ")[0],":").concat(e.getMilliseconds().toString().padStart(3,"0"))};var Gv,Vv,Ev,Pv,kv,xv=class{constructor(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"global";Hu(this,"indent",void 0),Hu(this,"module",void 0),Hu(this,"_engineId",void 0),this.module=e,this.indent=t,this._engineId=i}_print(e,t){for(var i=arguments.length,o=new Array(i>2?i-2:0),s=2;s<i;s++)o[s-2]=arguments[s];const r=o.shift();try{const e=[...o],i="".concat(r).replace(/%o/gi,(()=>{const t=e.shift();return JSON.stringify(t)}));_p.set("".concat(Rv,"[").concat(this.module,".").concat(t,"] ").concat(i," ").concat(e.map((e=>JSON.stringify(e))).join(", ")))}catch(oK){}let n="";for(let d=0;d<this.indent;d++)n+="    ";const a=Wv();gv.report(Rv,this._engineId,a,e,n,this.module,t,r,o),Cv&&console.log("%c".concat(a,"-").concat(Rv,"%c[").concat(e,"]%c").concat(n,"[").concat(this.module,".").concat(t,"] ").concat(r),"color:".concat(Xv,";"),"background-color:".concat(Lv[e],";"),"color:".concat(Xv,";"),...o)}print(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._print(" INFO",e,...i)}debug(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._print("DEBUG",e,...i)}info(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._print(" INFO",e,...i)}warn(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._print(" WARN",e,...i)}error(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._print("ERROR",e,...i)}success(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._print(" SUCC",e,...i)}};const Nv=()=>"undefined"==typeof window,Mv=Nv()?"":window.navigator.userAgent;function Yv(){let e="none";return Nv()||(null!==Mv.match("Firefox")?e="mozilla":null!==Mv.match("Chrome")?(e="chrome-stable",null!==Mv.match("Electron")&&(e="electron")):(null!==Mv.match("Safari")||null!==Mv.match("AppleWebKit"))&&(e="safari")),e}const wv="mozilla"===Yv(),Kv="safari"===Yv(),Hv="chrome-stable"===Yv(),Fv=!Nv()&&/CriOS/i.test(Mv),Jv=!Nv()&&/Edg\//i.test(Mv),Ov=!Nv()&&/EdgA/i.test(Mv),Uv=!Nv()&&/EdgiOS/i.test(Mv),Dv=Jv||Ov||Uv,Av=!Nv()&&/DingTalk/i.test(navigator.userAgent),zv=!Nv()&&/OPR\//.test(navigator.userAgent),jv=!Nv()&&(!!/(iPad)/i.exec(Mv)||/Macintosh/i.test(Mv)&&"ontouchend"in document),Qv=!Nv()&&/Macintosh/i.test(Mv),Bv=!Nv()&&/MicroMessenger/i.test(Mv),qv=!Nv()&&Mv.toLowerCase().includes("mobile"),$v=!Nv()&&!!/(iPhone|iPad|iPod)/i.exec(Mv),eS=!Nv()&&/Android/i.test(Mv),tS=!Nv()&&/Windows/i.test(Mv),iS=!Nv()&&/OpenHarmony/i.test(Mv);let oS=0,sS="0";const rS=!Nv()&&(null===(Gv=Mv.match(/version\/(\d+)/i))||void 0===Gv?void 0:Gv[1]);var nS;Kv&&rS&&(oS=Number(rS),sS=null===(nS=navigator.userAgent.match(/version\/(\d+\.\d+)/i))||void 0===nS?void 0:nS[1]);const aS=!Nv()&&(null===(Vv=Mv.match(/Firefox\/(\d+)/i))||void 0===Vv?void 0:Vv[1]);wv&&aS&&(oS=Number(aS));const dS=oS,cS=oS,lS=sS,uS=null!==(Ev=!Nv()&&(null===(Pv=Mv.match(/ ([\d_]+) like Mac OS X/i))||void 0===Pv||null===(Pv=Pv[1])||void 0===Pv?void 0:Pv.split("_").map((e=>parseInt(e)))))&&void 0!==Ev?Ev:[];let mS=0;const hS=!Nv()&&(null===(kv=Mv.match(/Chrome\/(\d+)/i))||void 0===kv?void 0:kv[1]);hS&&(mS=Number(hS));const pS=mS,bS="VolcEngine",_S="RTC_DEVICE_ID",yS="RTC_ACCESS_NODE",vS="RTC_ACCESS_URLS",SS="ENGINE_WEB_CONFIG",ZS="SERVER_CONFIG";class fS{get(e){const t=localStorage.getItem(e);if(!t)return null;try{const i=JSON.parse(t);return i.ttl>0&&Date.now()-i.saveTime>i.ttl?(this.delete(e),null):i.message}catch(i){return null}}set(e,t){const i={ttl:arguments.length>2&&void 0!==arguments[2]?arguments[2]:-1,saveTime:Date.now(),message:t};try{return localStorage.setItem(e,JSON.stringify(i)),!0}catch(o){return!1}}getTtl(e){const t=localStorage.getItem(e);if(!t)return null;try{return JSON.parse(t).ttl}catch(i){return null}}delete(e){try{return localStorage.removeItem(e),!0}catch(t){return!1}}}var TS=new class extends fS{constructor(){super(...arguments),Hu(this,"_accessVersion","v2")}getDeviceId(){if(Nv())return"";let e=this.get(_S);return e&&!/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(e)||(e=function(e){let t="";for(let i=0;i<e;i++)t+=Math.floor(10*Math.random());return t}(16)),this.setDeviceId(e),e}setDeviceId(e){return sv({device_id:e}),this.set(_S,e),e}getAccessNode(e){return this.get("".concat(yS,"_").concat(e,"-").concat(bS,"-").concat(this._accessVersion))}setAccessNode(e,t,i){return this.set("".concat(yS,"_").concat(e,"-").concat(bS,"-").concat(this._accessVersion),t,1e3*i)}deleteAccessNode(e,t){let i=this.getAccessNode(e);const o=this.getTtl("".concat(yS,"_").concat(e,"-").concat(bS));Array.isArray(i)&&i.length>0&&(i=i.filter((e=>e.mediaID!==t.mediaID&&e.msgKey!==t.msgKey)),i.length>0?this.setAccessNode(e,i,o||0):this.clearAccessNode(e))}clearAccessNode(e){if(e)this.delete("".concat(yS,"_").concat(e,"-").concat(bS));else for(const t in localStorage)t.startsWith(yS)&&localStorage.removeItem(t)}getAccessUrls(){return this.get("".concat(vS,"-").concat(bS))}setAccessUrls(e){const t=e.map((e=>{let{host:t,path:i}=e;return"https://".concat(t).concat(i)}));return this.set("".concat(vS,"-").concat(bS),t)}clearAccessUrls(){this.delete("".concat(vS,"-").concat(bS))}getEngineWebConfig(e,t){var i;const o="".concat(e,"_").concat(t,"_").concat(this.getDeviceId()),s=this.get(SS),r=(null==s||null===(i=s.find((e=>e.key===o)))||void 0===i?void 0:i.config)||{};return Object.assign({},WZ("ENGINE_WEB_CONFIG"),r)}setEngineWebConfig(e,t,i){if(!i)return;const o="".concat(e,"_").concat(t,"_").concat(this.getDeviceId());let s=this.get(SS)||[];return s=s.filter((e=>e.key!==o)),s.push({key:o,config:i}),this.set(SS,s.slice(-5))}getServerConfig(e){var t;const i="".concat(e),o=this.get(ZS);return(null==o||null===(t=o.find((e=>e.key===i)))||void 0===t?void 0:t.config)||{}}setServerConfig(e,t){if(!t)return;const i="".concat(e);let o=this.get(ZS)||[];return o=o.filter((e=>e.key!==i)),o.push({key:i,config:t}),this.set(ZS,o.slice(-5))}};const IS=new xv("JoinRoomConfig",0);class gS{constructor(e){Hu(this,"_useTcpAfterJoinTimeout",gS.DEFAULT_CONF.useTcpAfterJoinTimeout),Hu(this,"_joinWithTcpOnly",gS.DEFAULT_CONF.joinWithTcpOnly),Hu(this,"_joinWithTcpOnlyDelay",gS.DEFAULT_CONF.joinWithTcpOnlyDelay),Hu(this,"_blackBrowserRegexList",[]),this._engineId=e,location.search.indexOf("__rtc_tcp_only__")>-1&&(this._joinWithTcpOnly=!0,this._joinWithTcpOnlyDelay=0),this._report()}static setDefaulConf(e){let{useTcpAfterJoinTimeout:t,joinWithTcpOnly:i,joinWithTcpOnlyDelay:o}=e;return"boolean"==typeof t&&(gS.DEFAULT_CONF.useTcpAfterJoinTimeout=t),"boolean"==typeof i&&(gS.DEFAULT_CONF.joinWithTcpOnly=i),"number"==typeof o&&(gS.DEFAULT_CONF.joinWithTcpOnlyDelay=Math.max(0,o)),gS.DEFAULT_CONF}get useTcpAfterJoinTimeout(){return this._useTcpAfterJoinTimeout}get useTcpJoin(){return this._joinWithTcpOnly}get useTcpJoinDelay(){return this._joinWithTcpOnlyDelay}isBlackBrower(){return this._blackBrowserRegexList.find((e=>new RegExp(e).test(navigator.userAgent)))}setServerConfig(e){var t,i,o;let s=!1;"boolean"==typeof(null==e||null===(t=e.use_tcp_after_join_timeout)||void 0===t?void 0:t.enable)&&(this._useTcpAfterJoinTimeout=e.use_tcp_after_join_timeout.enable,s=!0),"boolean"==typeof(null==e||null===(i=e.join_with_tcp_only)||void 0===i?void 0:i.enable)&&(this._joinWithTcpOnly=e.join_with_tcp_only.enable,s=!0),"number"==typeof(null==e||null===(o=e.join_with_tcp_only)||void 0===o?void 0:o.delay_ms)&&(this._joinWithTcpOnlyDelay=e.join_with_tcp_only.delay_ms,s=!0),e&&Array.isArray(e.black_browser_regex_list)&&(this._blackBrowserRegexList=e.black_browser_regex_list,s=!0),s&&this._report()}toString(){return JSON.stringify({use_tcp_after_join_timeout:this._useTcpAfterJoinTimeout,join_with_tcp_only:this._joinWithTcpOnly,join_with_tcp_only_delay:this._joinWithTcpOnlyDelay,black_browser_regex_list:this._blackBrowserRegexList})}_report(){IS.print("_report",this.toString()),vv(this._engineId,"web_join_room_config",this.toString())}}Hu(gS,"DEFAULT_CONF",{useTcpAfterJoinTimeout:!0,joinWithTcpOnly:!1,joinWithTcpOnlyDelay:5e3});var RS=(e=>(e.INVALID_ENGINE="INVALID_ENGINE",e.INVALID_PARAMS="INVALID_PARAMS",e.INVOKED_BEFORE_JOIN_ROOM="INVOKED_BEFORE_JOIN_ROOM",e.INVALID_TOKEN="INVALID_TOKEN",e.JOIN_ROOM_FAILED="JOIN_ROOM_FAILED",e.UPDATE_TOKEN_WITH_INVALID_TOKEN="UPDATE_TOKEN_WITH_INVALID_TOKEN",e.UPDATE_TOKEN_BEFORE_JOIN="UPDATE_TOKEN_BEFORE_JOIN",e.REPEAT_JOIN="REPEAT_JOIN",e.REPEAT_PUBLISH="REPEAT_PUBLISH",e.REPEAT_PUSH="REPEAT_PUSH",e.REPEAT_PLAY="REPEAT_PLAY",e.PUBLISH_BEFORE_JOIN="PUBLISH_BEFORE_JOIN",e.UNPUBLISH_BEFORE_JOIN="UNPUBLISH_BEFORE_JOIN",e.SUBSCRIBE_BEFORE_JOIN="SUBSCRIBE_BEFORE_JOIN",e.UNSUBSCRIBE_BEFORE_JOIN="UNSUBSCRIBE_BEFORE_JOIN",e.NO_PUBLISH_PERMISSION="NO_PUBLISH_PERMISSION",e.STREAM_NOT_EXIST="STREAM_NOT_EXIST",e.EMPTY_STREAM="EMPTY_STREAM",e.NOT_CONNECTED_YET="NOT_CONNECTED_YET",e.IM_BEFORE_JOIN="IM_BEFORE_JOIN",e.USER_NOT_EXIST="USER_NOT_EXIST",e.ALREADY_IN_ROOM="ALREADY_IN_ROOM",e.KICKED_OUT="KICKED_OUT",e.ROOM_DISMISS="ROOM_DISMISS",e.TOKEN_EXPIRED="TOKEN_EXPIRED",e.TOKEN_NO_PUBLISH_PERMISSION="TOKEN_NO_PUBLISH_PERMISSION",e.TOKEN_NO_SUBSCRIBE_PERMISSION="TOKEN_NO_SUBSCRIBE_PERMISSION",e.DUPLICATE_LOGIN="DUPLICATE_LOGIN",e.INVOKED_BEFORE_CAPTURE="INVOKED_BEFORE_CAPTURE",e.REPEAT_CAPTURE="REPEAT_CAPTURE",e.GET_VIDEO_TRACK_FAILED="GET_VIDEO_TRACK_FAILED",e.GET_AUDIO_TRACK_FAILED="GET_AUDIO_TRACK_FAILED",e.GET_SCREEN_TRACK_FAILED="GET_SCREEN_TRACK_FAILED",e.STREAM_TYPE_NOT_MATCH="STREAM_TYPE_NOT_MATCH",e.CANT_FIND_DOM="CANT_FIND_DOM",e.INVALID_DEVICE_ID="INVALID_DEVICE_ID",e.NO_PERMISSION="NO_PERMISSION",e.NOT_SUPPORTED="NOT_SUPPORTED",e.INTERRUPT="INTERRUPT",e.ICE_SERVER_WRONG="ICE_SERVER_WRONG",e.ESTABLISH_DATACHANNEL_FAILED="ESTABLISH_DATACHANNEL_FAILED",e.LOAD_RESOURCES_FAILED="LOAD_RESOURCES_FAILED",e.SIGNALING_CHANNEL_NOT_OPEN="SIGNALING_CHANNEL_NOT_OPEN",e.TIME_OUT="TIME_OUT",e.REFUSE_OPERATION_IN_DISCONNECT="REFUSE_OPERATION_IN_DISCONNECT",e.ADD_TRANSCEIVER_FAILED="ADD_TRANSCEIVER_FAILED",e.UPDATE_TRACK_FAILED="UPDATE_TRACK_FAILED",e.PUBLISH_FAILED="PUBLISH_FAILED",e.UNPUBLISH_FAILED="UNPUBLISH_FAILED",e.SUBSCRIBE_FAILED="SUBSCRIBE_FAILED",e.UNSUBSCRIBE_FAILED="UNSUBSCRIBE_FAILED",e.OPERATION_CANCEL="OPERATION_CANCEL",e.START_CLOUD_PROXY_AFTER_JOIN="START_CLOUD_PROXY_AFTER_JOIN",e.STOP_CLOUD_PROXY_BEFORE_LEAVE="STOP_CLOUD_PROXY_BEFORE_LEAVE",e.UNEXPECTED_ERROR="UNEXPECTED_ERROR",e.REPEAT_DEVICE_TEST="REPEAT_DEVICE_TEST",e.AUDIO_DEVICE_TEST_FAILED="AUDIO_DEVICE_RECORD_FAILED",e.ALREADY_LOGIN="ALREADY_LOGIN",e.LOGIN_FAILED="LOGIN_FAILED",e.NOT_LOGIN="NOT_LOGIN",e.RTM_DUPLICATE_LOGIN="RTM_DUPLICATE_LOGIN",e.RTM_TOKEN_ERROR="RTM_TOKEN_ERROR",e.USER_MESSAGE_TIMEOUT="USER_MESSAGE_TIMEOUT",e.USER_MESSAGE_BROKEN="USER_MESSAGE_BROKEN",e.USER_MESSAGE_NO_RECEIVER="USER_MESSAGE_NO_RECEIVER",e.USER_MESSAGE_NO_RELAYPATH="USER_MESSAGE_NO_RELAYPATH",e.USER_MESSAGE_EXCEED_QPS="USER_MESSAGE_EXCEED_QPS",e.USER_MESSAGE_SEND_TO_SERVER_ERROR="USER_MESSAGE_SEND_TO_SERVER_ERROR",e.USER_MESSAGE_SERVER_RESPONSE_ERROR="USER_MESSAGE_SERVER_RESPONSE_ERROR",e.USER_MESSAGE_NOT_JOIN="USER_MESSAGE_NOT_JOIN",e.USER_MESSAGE_INIT="USER_MESSAGE_INIT",e.USER_MESSAGE_NO_CONNECTION="USER_MESSAGE_NO_CONNECTION",e.USER_MESSAGE_NOT_LOGIN="USER_MESSAGE_NOT_LOGIN",e.USER_MESSAGE_SERVER_PARAMS_NOTSET="USER_MESSAGE_SERVER_PARAMS_NOTSET",e.USER_MESSAGE_UNKNOWN="USER_MESSAGE_UNKNOWN",e.START_PUBLIC_STREAM_BEFORE_JOIN="START_PUBLIC_STREAM_BEFORE_JOIN",e.RECONNECT_FAILED="RECONNECT_FAILED",e.SUBTITLE_ALREADY_ON="SUBTITLE_ALREADY_ON",e.SUBTITLE_NOT_TURNED_ON="SUBTITLE_NOT_TURNED_ON",e.SUBTITLE_ERR_POSTPROCESS="SUBTITLE_ERR_POSTPROCESS",e.SUBTITLE_ERR_CONNECTION_ERROR="SUBTITLE_ERR_CONNECTION_ERROR",e.SUBTITLE_ERR_PROCESS_ERROR="SUBTITLE_ERR_PROCESS_ERROR",e.SUBTITLE_ERR_UNKNOWN="SUBTITLE_ERR_UNKNOWN",e.UNEXPECTED_INVOKE_FORWARD_STREAM="UNEXPECTED_INVOKE_FORWARD_STREAM",e.ROOM_FORBIDDEN="ROOM_FORBIDDEN",e.USER_FORBIDDEN="USER_FORBIDDEN",e.ERR_ELECTRON_IS_NULL="ERR_ELECTRON_IS_NULL",e.ELECTRON_DESKTOP_CAPTURER_GET_SOURCES_ERROR="ELECTRON_DESKTOP_CAPTURER_GET_SOURCES_ERROR",e.SET_SIMULCAST_FAILED="SET_SIMULCAST_FAILED",e.MIXING_OLD_AND_NEW_APIS="MIXING_OLD_AND_NEW_APIS",e.WTN_PUSH_FAILED="WTN_PUSH_FAILED",e.WTN_PLAY_FAILED="WTN_PLAY_FAILED",e.NOT_ALLOWED_IN_RTS_ROOM="NOT_ALLOWED_IN_RTS_ROOM",e.NOT_ALLOWED_IN_RESTRICTED_MODE="NOT_ALLOWED_IN_RESTRICTED_MODE",e))(RS||{}),XS=(e=>(e[e.AUDIO_MIXING_ERROR_OK=0]="AUDIO_MIXING_ERROR_OK",e[e.AUDIO_MIXING_ERROR_PRELOAD_FAILED=1]="AUDIO_MIXING_ERROR_PRELOAD_FAILED",e[e.AUDIO_MIXING_ERROR_START_FAILED=2]="AUDIO_MIXING_ERROR_START_FAILED",e[e.AUDIO_MIXING_ERROR_ID_NOT_FOUND=3]="AUDIO_MIXING_ERROR_ID_NOT_FOUND",e[e.AUDIO_MIXING_ERROR_SET_POSITION_FAILED=4]="AUDIO_MIXING_ERROR_SET_POSITION_FAILED",e[e.AUDIO_MIXING_ERROR_INVALID_VOLUME=5]="AUDIO_MIXING_ERROR_INVALID_VOLUME",e[e.AUDIO_MIXING_ERROR_LOAD_CONFLICT=6]="AUDIO_MIXING_ERROR_LOAD_CONFLICT",e[e.AUDIO_MIXING_ERROR_ID_TYPE_NOT_MATCH=7]="AUDIO_MIXING_ERROR_ID_TYPE_NOT_MATCH",e[e.AUDIO_MIXING_ERROR_ID_TYPE_INVALID_PITCH=8]="AUDIO_MIXING_ERROR_ID_TYPE_INVALID_PITCH",e[e.AUDIO_MIXING_ERROR_INVALID_AUDIO_TRACK=9]="AUDIO_MIXING_ERROR_INVALID_AUDIO_TRACK",e))(XS||{});class LS extends Error{constructor(e,t,i){super(t),Hu(this,"code",void 0),Hu(this,"message",void 0),Hu(this,"error",void 0),this.code=e,this.message=t,this.error=i,Object.setPrototypeOf(this,LS.prototype)}toString(){return"SDKError: ".concat(this.code," ").concat(this.message)}}function CS(e,t){if("boolean"!=typeof e)throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,": The value should be boolean type."))}const WS=()=>!np()&&"function"==typeof HTMLVideoElement.prototype.requestVideoFrameCallback;function GS(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Number.POSITIVE_INFINITY;if(e<i||e>o||"number"!=typeof e){throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,": the value range is [").concat(i,", ").concat(o,"]. integer only"))}}function VS(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Number.POSITIVE_INFINITY;if(null==e)throw new LS(RS.INVALID_PARAMS,"".concat(t," cannot be empty"));if(!function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return"string"==typeof e&&e.length<=i&&e.length>=t}(e,i,o))throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,": The value should be string type. Length of the string: [").concat(i,",").concat(o,"]"))}function ES(e,t,i){if(!i.includes(e))throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,": The value can only be set as ").concat(JSON.stringify(i)))}function PS(e){if(!(e instanceof MediaStreamTrack))throw new LS(RS.INVALID_PARAMS,"Invalid track, The value should be MediaStreamTrack type.")}function kS(e,t){if(MS(e))throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,", should not be empty"))}function xS(e,t){if(!(e instanceof ArrayBuffer))throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,", should be ArrayBuffer"))}function NS(e){try{const t=navigator.mediaDevices.getSupportedConstraints();for(const i of Object.keys(e))t[i]||delete e[i]}catch(t){}}function MS(e){return null==e}function YS(e){if("string"!=typeof e||!/^[a-zA-Z0-9@._-]{1,128}$/.test(e))throw new LS(RS.INVALID_PARAMS,"The RoomId must be within 128 bytes. The supported characters: a-z,A-Z,0-9,@,-,_,.")}function wS(e){if("string"!=typeof e||!/^[a-zA-Z0-9@._-]{1,128}$/.test(e))throw new LS(RS.INVALID_PARAMS,"The userId must be within 128 bytes. The supported characters: a-z,A-Z,0-9,@,-,_,.")}function KS(e){if("string"!=typeof e||!/^[a-zA-Z0-9@._-]{1,128}$/.test(e))throw new LS(RS.INVALID_PARAMS,"The publicStreamId must be within 128 bytes. The supported characters: a-z,A-Z,0-9,@,-,_,.")}function HS(e){kS(e,"videoPlayerOption")}function FS(e,t){if("number"==typeof e&&!Number.isNaN(e)&&e>=1)return;const i=e;if(!(null!=i&&i.min||null!=i&&i.max||null!=i&&i.exact||null!=i&&i.ideal))throw new LS(RS.INVALID_PARAMS,"".concat(t," is not a valid ConstrainULong"))}function JS(e){!function(e,t){if(!Array.isArray(e))throw new LS(RS.INVALID_PARAMS,"Invalid ".concat(t,", should be array"))}(e,"videoEncoderConfig");for(const t of e)kS(t,"videoEncoderConfigItem"),GS(null==t?void 0:t.maxKbps,"maxKbps"),FS(null==t?void 0:t.width,"width"),FS(null==t?void 0:t.height,"height"),FS(null==t?void 0:t.frameRate,"frameRate")}function OS(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.NEGATIVE_INFINITY,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Number.POSITIVE_INFINITY;return GS(e,t,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY),e=(e=e>i?e:i)<o?e:o}var US=(e=>(e[e.NONE=0]="NONE",e))(US||{}),DS=r;Vi({global:!0,forced:DS.globalThis!==DS},{globalThis:DS});var AS=i(r),zS=(e=>(e.H264="H264",e.VP8="VP8",e.H265="H265",e))(zS||{}),jS=(e=>(e.H264="H264",e.VP8="VP8",e.ByteVC1="ByteVC1",e))(jS||{});const QS=async()=>{const e=[];return await aZ()&&await nZ()&&e.push(zS.H265),await oZ()&&await iZ()&&e.push(zS.H264),await rZ()&&await sZ()&&e.push(zS.VP8),e},BS={};function qS(e){const t=e.split("\n");let i=!1;for(const o of t)if(o.includes("level-asymmetry-allowed=1")&&o.includes("packetization-mode=1")&&o.includes("profile-level-id=42e0")){i=!0;break}if(i){const e=navigator.userAgent.toLowerCase();let t=!1;const i=[/miuibrowser/,/70.*HeyTapBrowser/i];for(const o of i)o.test(e)&&(t=!0);return!t}return!1}const $S=async e=>{const t=new RTCPeerConnection;t.addTransceiver("video",{direction:e});const i=await t.createOffer();return t.close(),i.sdp.toLowerCase()},eZ=async()=>{let e=await $S("sendonly");return navigator.userAgent.includes("VivoBrowser")&&(e=await $S("sendonly")),BS.h264encode=qS(e),BS.vp8encode=e.indexOf("vp8")>-1,BS.h265encode=e.indexOf("h265")>-1,BS},tZ=async()=>{let e=await $S("recvonly");return navigator.userAgent.includes("VivoBrowser")&&(e=await $S("recvonly")),BS.h264decode=qS(e),BS.vp8decode=e.indexOf("vp8")>-1,BS.h265decode=e.indexOf("h265")>-1,BS},iZ=async()=>{if(void 0===BS.h264encode)try{await eZ()}catch(e){return!1}return BS.h264encode||!1},oZ=async()=>{if(void 0===BS.h264decode)try{await tZ()}catch(e){return!1}return BS.h264decode||!1},sZ=async()=>{if(void 0===BS.vp8encode)try{await eZ()}catch(e){return!1}return BS.vp8encode||!1},rZ=async()=>{if(void 0===BS.vp8decode)try{await tZ()}catch(e){return!1}return BS.vp8decode||!1},nZ=async()=>{if(void 0===BS.h265encode)try{await eZ()}catch(e){return!1}return BS.h265encode||!1},aZ=async()=>{if(void 0===BS.h265decode)try{await tZ()}catch(e){return!1}return BS.h265decode||!1},dZ=()=>"undefined"!=typeof TransformStream&&"undefined"!=typeof RTCRtpSender&&"undefined"!=typeof RTCRtpReceiver&&"undefined"!=typeof RTCRtpScriptTransform&&"transform"in RTCRtpSender.prototype&&"transform"in RTCRtpReceiver.prototype&&_Z()&&yZ(),cZ=()=>"undefined"!=typeof TransformStream&&"undefined"!=typeof RTCRtpSender&&"undefined"!=typeof RTCRtpReceiver&&void 0!==RTCRtpSender.prototype.createEncodedStreams&&void 0!==RTCRtpReceiver.prototype.createEncodedStreams,lZ=()=>Qv?Hv&&pS>=70||wv&&cS>=80||Kv&&dS>=14:tS?Hv&&pS>=70||wv&&cS>=80:$v?uS[0]>=14:!(!eS&&!iS)&&(Hv&&pS>=86),uZ=Hv&&pS<=114,mZ=!wv||cS>=96,hZ=!(Kv&&dS<=14),pZ=eS&&Hv||$v&&uS[0]>=16,bZ=void 0!==AS&&"PressureObserver"in AS,_Z=()=>"undefined"!=typeof window&&window.Worker,yZ=()=>"undefined"!=typeof MessageChannel,vZ=!(Kv&&((null==lS?void 0:lS.includes("16.1"))||(null==lS?void 0:lS.includes("16.2"))||(null==lS?void 0:lS.includes("16.3")))),SZ=["jitterBufferTarget","playoutDelayHint","jitterBufferDelayHint"],ZZ=()=>{for(const e of SZ)if(RTCRtpReceiver.prototype.hasOwnProperty(e))return e;return null};var fZ;const TZ="access.rtc.volcvideo.com,access2-hl.rtc.volcvideo.com,rtcg-access.volcvideos.com".split(",");function IZ(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?(/^https?:\/\/.+/.test(e)||(e="https://".concat(e)),"".concat(e,"/dispatch/v1/AccessInfo?Action=GetAccessInfo")):""}const gZ="https://web-log-report.rtc.volcvideo.com/video/v1/webrtc_log/",RZ="common.rtc.volcvideo.com,rtcg.volcvideos.com".split(","),XZ={VERSION:"4.68.3",ICE_CONFIG_REQUEST_URLS_INTERNAL:TZ.map(IZ),ICE_CONFIG_REQUEST_URLS:[],EXPECTED_ADDR:"",LOG_SERVER_URL:gZ,CONFIG_REQUEST_DOMAINS:RZ,DEVICE_ID:"",OVERSEA:!1,PLATFORM:"",PRODUCT:"",FORCE_ENABLED_REPORT_CALLBACKS:[],SKIP_WEB_AUDIO_IN_TRACK:!1,ENFORCE_WEB_AUDIO_SUPPORTED:!1,AUDIO_STALL:!0,VIDEO_STALL:!0,VIDEO_STALL_100MS:!1,STATS_SCALLBACK_SUPPORT:!0,JOIN_ROOM_CONFIG:gS.DEFAULT_CONF,SIGNAL_COMPRESSION:!0,SIGNAL_CROP_JOINROOM:!0,VIDEO_STALL_DATA:500,AUDIO_STALL_DATA:200,IOS_SAFARI_ORIENTATION:!1,BLACK_FRAME_LIFETIME:6e4,FALLBACK_ENCODE_CODEC:"",SEI_TIME_OUT:2e3,SEI_COUNT_FPS:1,PRE_ICE:!1,STATS_LOOP_INTERVAL:1e3,HIDDEN_STATS:!1,UPLOAD_REMOTE_STATS:US.NONE,SDK_CODEC_NEGOTIATION:!0,AUDIO_CODEC:"OPUS",DISABLE_ENCODED_TRANSFORM:!1,SKIP_SEI_FILTER:!1,AREA_CODE:"",DISABLE_COMPUTE_PRESSURE:!1,SEND_MESSAGE_SYNC:!1,H264_HW_ENCODER:!1,GPU_URL:"",TURN_ON_JOIN_ROOM_FAILURE_CALLBACK:!1,ENABLE_FALLBACK_HANDLER:!1,ENABLE_STANDARD_HANDLER:(Hv||Dv)&&!$v,PC_KILLSWITCH:{},ENABLE_PLAY_AFTER_CLICK:!1,AUTOPLAY_WORKAROUND:!0,ENGINE_WEB_CONFIG:{},DISABLE_IOS_MUTE_WORKAROUND:!1,JITTER_STEPPER_INTERVAL_MS:1e3,JITTER_STEPPER_STEP_SIZE_MS:200,JITTER_STEPPER_MAX_AV_SYNC_DIFF:400,JITTER_STEPPER_MAX_SET_DIFF:500,JITTER_STEPPER_MAX_DIFF_EXCEED_COUNT:8,SUBSCRIBE_CUSTOM_EXTRA_PARAMS:{}},LZ="undefined"==typeof window?()=>Promise.resolve():null===(fZ=window)||void 0===fZ||null===(fZ=fZ.RTCPeerConnection)||void 0===fZ?void 0:fZ.prototype.setRemoteDescription;function CZ(e,t){if(av("setParameter",0,"key: ".concat(e,", value: ").concat(t)),"VERSION"===e)return;if("H264_HW_ENCODER"===e){if(XZ.H264_HW_ENCODER=!!t,t){(()=>{let e=!1;if("function"==typeof RTCRtpSender.getCapabilities){const{codecs:t}=RTCRtpSender.getCapabilities("video")||{};t&&t.length>0&&t.forEach((t=>{var i,o;(null!==(i=null==t||null===(o=t.sdpFmtpLine)||void 0===o?void 0:o.indexOf("profile-level-id=42001f"))&&void 0!==i?i:-1)>-1&&(e=!0)}))}return e})()?(av("setParameter",0,"key: ".concat(e,", value: ").concat(t," is executed as it met 42001f")),RTCPeerConnection.prototype.setRemoteDescription=function(e){var t;return LZ.call(this,{type:e.type,sdp:null===(t=e.sdp)||void 0===t?void 0:qh(t).call(t,"42e01f","42001f")})}):av("setParameter",0,"key: ".concat(e,", value: ").concat(t," fails as sdp contains no 42001f"))}else RTCPeerConnection.prototype.setRemoteDescription=LZ;return}if("GPU_URL"===e)return void(XZ.GPU_URL=t);if("JOIN_ROOM_CONFIG"===e)return gS.setDefaulConf(t);if("ICE_CONFIG_REQUEST_URLS"===e){const e="string"==typeof t?[t]:t;return XZ.ICE_CONFIG_REQUEST_URLS=e.map(IZ),TS.clearAccessUrls(),void TS.clearAccessNode()}if("VIDEO_STALL_DATA"===e)return void(XZ.VIDEO_STALL_DATA=Math.max(500,Number(t)));if("AUDIO_STALL_DATA"===e)return void(XZ.AUDIO_STALL_DATA=Math.max(200,Number(t)));if("VIDEO_STALL_100MS"===e)return void(XZ.VIDEO_STALL_100MS=WS()&&!!t);if("PLATFORM"===e&&"string"==typeof t)return void sv({platform:t});if("PRODUCT"===e&&"string"==typeof t)return void sv({product:t});if("FORCE_ENABLED_REPORT_CALLBACKS"===e){const e="string"==typeof t?[t]:t;return void(XZ.FORCE_ENABLED_REPORT_CALLBACKS=e)}if("LOG_SERVER_URL"===e){const e=t===cm.overseas?"https://web-log-report.volcvideos.com/video/v1/webrtc_log/":t===cm.domestic?gZ:"string"==typeof t?t:void 0;e&&(XZ.LOG_SERVER_URL=e,rv(e))}else if("OVERSEA"===e)return sv({extra_is_oversea:t?"1":"0"}),void(XZ.OVERSEA=t);if("CONFIG_REQUEST_DOMAINS"===e&&Array.isArray(t)&&t.length>0)return void(XZ.CONFIG_REQUEST_DOMAINS=t);if("SEI_TIME_OUT"===e&&"number"!=typeof t)return;if("SEI_COUNT_FPS"===e&&"number"!=typeof t)return;if("UPLOAD_REMOTE_STATS"===e&&"string"==typeof t){const e=t.split(",").map((e=>lh(e).call(e))).reduce(((e,t)=>"video"===t?e|tm.VIDEO:"audio"===t?e|tm.AUDIO:e),US.NONE);return void(XZ.UPLOAD_REMOTE_STATS=e)}"DEVICE_ID"===e&&TS.setDeviceId(t);Sp.getKeys().includes(e)?Sp.setParameter(e,t):Reflect.set(XZ,e,t)}function WZ(e){return"DEVICE_ID"===e?TS.getDeviceId():XZ[e]}function GZ(e,t,i){var o,s,r,n,a,d,c,l;return{type:"publicstream",action:t,publicStreamID:e,publicStreamMeta:{audio:{},video:{fps:(null===(o=i.video)||void 0===o?void 0:o.fps)||15,bitrate:1e3*((null===(s=i.video)||void 0===s?void 0:s.kBitRate)||40),width:(null===(r=i.video)||void 0===r?void 0:r.width)||640,height:(null===(n=i.video)||void 0===n?void 0:n.height)||360},layout:{layoutMode:2,interpolationMode:(null===(a=i.layout)||void 0===a?void 0:a.interpolationMode)||mm.PREV_FRAME,canvas:{bgColor:(null===(d=i.layout)||void 0===d?void 0:d.backgroundColor)||"#000000",bgImage:(null===(c=i.layout)||void 0===c?void 0:c.backgroundImage)||""},regions:(null===(l=i.layout)||void 0===l||null===(l=l.regions)||void 0===l?void 0:l.map((e=>({roomId:e.roomId,userId:e.userId,alterImage:e.alertImage||"",alpha:!e.alpha||Number(e.alpha)>1||Number(e.alpha)<=0?1:Number(e.alpha),x:!e.x||Number(e.x)>=1||Number(e.x)<0?0:Number(e.x),y:!e.y||Number(e.y)>=1||Number(e.y)<0?0:Number(e.y),w:!e.w||Number(e.w)>1||Number(e.w)<=0?1:Number(e.w),h:!e.h||Number(e.h)>1||Number(e.h)<=0?1:Number(e.h),zorder:!e.zorder||Number(e.zorder)<0||Number(e.zorder)>100?0:Number(e.zorder),renderMode:void 0===e.renderMode?1:e.renderMode,streamType:e.isScreenStream?1:0,mediaType:e.mediaType||0,sourceCrop:e.sourceCrop}))))||[]}}}}let VZ=[];function EZ(e){VZ=e}const PZ=(e,t)=>{const i=VZ;if(!i.length)return;const o=e[0],s=t.width||iT(o.width),r=t.height||iT(o.height),n=s*r;if(iT(o.width)*iT(o.height)<=n)return;let a,d,c=i[0];i.forEach((e=>{const t=iT(e.width)*iT(e.height);a||(n<t?a=e:c=e)})),d=a&&iT(a.width)*iT(a.height)-n<n-iT(c.width)*iT(c.height)?Object.assign({},a):Object.assign({},c);const l=e.filter((e=>!(d&&iT(e.width)*iT(e.height)>=n)||(d.maxKbps=Math.min(e.maxKbps,d.maxKbps),!1)));return l.unshift({width:s,height:r,frameRate:t.frameRate?Math.round(t.frameRate):l[0].frameRate,maxKbps:d.maxKbps}),l},kZ={width:640,height:480,frameRate:15,maxKbps:600},xZ={width:1920,height:1080,frameRate:15,maxKbps:3e3};let NZ;const MZ=new Uint8Array(16);function YZ(){if(!NZ&&(NZ="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!NZ))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return NZ(MZ)}const wZ=[];for(let rK=0;rK<256;++rK)wZ.push((rK+256).toString(16).slice(1));var KZ={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function HZ(e,t,i){if(KZ.randomUUID&&!t&&!e)return KZ.randomUUID();const o=(e=e||{}).random||(e.rng||YZ)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){i=i||0;for(let e=0;e<16;++e)t[i+e]=o[e];return t}return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return wZ[e[t+0]]+wZ[e[t+1]]+wZ[e[t+2]]+wZ[e[t+3]]+"-"+wZ[e[t+4]]+wZ[e[t+5]]+"-"+wZ[e[t+6]]+wZ[e[t+7]]+"-"+wZ[e[t+8]]+wZ[e[t+9]]+"-"+wZ[e[t+10]]+wZ[e[t+11]]+wZ[e[t+12]]+wZ[e[t+13]]+wZ[e[t+14]]+wZ[e[t+15]]}(o)}var FZ={exports:{}};var JZ,OZ,UZ={exports:{}},DZ=new Proxy({},{get(e,t){throw new Error(`Module "" has been externalized for browser compatibility. Cannot access ".${t}" in client code.  See http://vitejs.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.`)}}),AZ=o(Object.freeze({__proto__:null,default:DZ}));function zZ(){return JZ||(JZ=1,UZ.exports=(e=e||function(e,i){var o;if("undefined"!=typeof window&&window.crypto&&(o=window.crypto),"undefined"!=typeof self&&self.crypto&&(o=self.crypto),void 0!==AS&&AS.crypto&&(o=AS.crypto),!o&&"undefined"!=typeof window&&window.msCrypto&&(o=window.msCrypto),!o&&void 0!==t&&t.crypto&&(o=t.crypto),!o)try{o=AZ}catch(_){}var s=function(){if(o){if("function"==typeof o.getRandomValues)try{return o.getRandomValues(new Uint32Array(1))[0]}catch(_){}if("function"==typeof o.randomBytes)try{return o.randomBytes(4).readInt32LE()}catch(_){}}throw new Error("Native crypto module could not be used to get secure random number.")},r=Object.create||function(){function e(){}return function(t){var i;return e.prototype=t,i=new e,e.prototype=null,i}}(),n={},a=n.lib={},d=a.Base={extend:function(e){var t=r(this);return e&&t.mixIn(e),t.hasOwnProperty("init")&&this.init!==t.init||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},c=a.WordArray=d.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=t!=i?t:4*e.length},toString:function(e){return(e||u).stringify(this)},concat:function(e){var t=this.words,i=e.words,o=this.sigBytes,s=e.sigBytes;if(this.clamp(),o%4)for(var r=0;r<s;r++){var n=i[r>>>2]>>>24-r%4*8&255;t[o+r>>>2]|=n<<24-(o+r)%4*8}else for(var a=0;a<s;a+=4)t[o+a>>>2]=i[a>>>2];return this.sigBytes+=s,this},clamp:function(){var t=this.words,i=this.sigBytes;t[i>>>2]&=4294967295<<32-i%4*8,t.length=e.ceil(i/4)},clone:function(){var e=d.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],i=0;i<e;i+=4)t.push(s());return new c.init(t,e)}}),l=n.enc={},u=l.Hex={stringify:function(e){for(var t=e.words,i=e.sigBytes,o=[],s=0;s<i;s++){var r=t[s>>>2]>>>24-s%4*8&255;o.push((r>>>4).toString(16)),o.push((15&r).toString(16))}return o.join("")},parse:function(e){for(var t=e.length,i=[],o=0;o<t;o+=2)i[o>>>3]|=parseInt(e.substr(o,2),16)<<24-o%8*4;return new c.init(i,t/2)}},m=l.Latin1={stringify:function(e){for(var t=e.words,i=e.sigBytes,o=[],s=0;s<i;s++){var r=t[s>>>2]>>>24-s%4*8&255;o.push(String.fromCharCode(r))}return o.join("")},parse:function(e){for(var t=e.length,i=[],o=0;o<t;o++)i[o>>>2]|=(255&e.charCodeAt(o))<<24-o%4*8;return new c.init(i,t)}},h=l.Utf8={stringify:function(e){try{return decodeURIComponent(escape(m.stringify(e)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(e){return m.parse(unescape(encodeURIComponent(e)))}},p=a.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=h.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var i,o=this._data,s=o.words,r=o.sigBytes,n=this.blockSize,a=r/(4*n),d=(a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0))*n,l=e.min(4*d,r);if(d){for(var u=0;u<d;u+=n)this._doProcessBlock(s,u);i=s.splice(0,d),o.sigBytes-=l}return new c.init(i,l)},clone:function(){var e=d.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});a.Hasher=p.extend({cfg:d.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){p.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,i){return new e.init(i).finalize(t)}},_createHmacHelper:function(e){return function(t,i){return new b.HMAC.init(e,i).finalize(t)}}});var b=n.algo={};return n}(Math),e)),UZ.exports;var e}FZ.exports=(OZ=zZ(),function(){if("function"==typeof ArrayBuffer){var e=OZ.lib.WordArray,t=e.init,i=e.init=function(e){if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),(e instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array)&&(e=new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),e instanceof Uint8Array){for(var i=e.byteLength,o=[],s=0;s<i;s++)o[s>>>2]|=e[s]<<24-s%4*8;t.call(this,o,i)}else t.apply(this,arguments)};i.prototype=e}}(),OZ.lib.WordArray);var jZ,QZ=i(FZ.exports),BZ={exports:{}},qZ={exports:{}};function $Z(){return jZ||(jZ=1,function(e){e.exports=function(e){return function(){var t=e,i=t.lib.WordArray;function o(e,t,o){for(var s=[],r=0,n=0;n<t;n++)if(n%4){var a=o[e.charCodeAt(n-1)]<<n%4*2|o[e.charCodeAt(n)]>>>6-n%4*2;s[r>>>2]|=a<<24-r%4*8,r++}return i.create(s,r)}t.enc.Base64={stringify:function(e){var t=e.words,i=e.sigBytes,o=this._map;e.clamp();for(var s=[],r=0;r<i;r+=3)for(var n=(t[r>>>2]>>>24-r%4*8&255)<<16|(t[r+1>>>2]>>>24-(r+1)%4*8&255)<<8|t[r+2>>>2]>>>24-(r+2)%4*8&255,a=0;a<4&&r+.75*a<i;a++)s.push(o.charAt(n>>>6*(3-a)&63));var d=o.charAt(64);if(d)for(;s.length%4;)s.push(d);return s.join("")},parse:function(e){var t=e.length,i=this._map,s=this._reverseMap;if(!s){s=this._reverseMap=[];for(var r=0;r<i.length;r++)s[i.charCodeAt(r)]=r}var n=i.charAt(64);if(n){var a=e.indexOf(n);-1!==a&&(t=a)}return o(e,t,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),e.enc.Base64}(zZ())}(qZ)),qZ.exports}var ef,tf={exports:{}};function of(){return ef||(ef=1,function(e){e.exports=function(e){return function(t){var i=e,o=i.lib,s=o.WordArray,r=o.Hasher,n=i.algo,a=[];!function(){for(var e=0;e<64;e++)a[e]=4294967296*t.abs(t.sin(e+1))|0}();var d=n.MD5=r.extend({_doReset:function(){this._hash=new s.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,t){for(var i=0;i<16;i++){var o=t+i,s=e[o];e[o]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}var r=this._hash.words,n=e[t+0],d=e[t+1],h=e[t+2],p=e[t+3],b=e[t+4],_=e[t+5],y=e[t+6],v=e[t+7],S=e[t+8],Z=e[t+9],f=e[t+10],T=e[t+11],I=e[t+12],g=e[t+13],R=e[t+14],X=e[t+15],L=r[0],C=r[1],W=r[2],G=r[3];L=c(L,C,W,G,n,7,a[0]),G=c(G,L,C,W,d,12,a[1]),W=c(W,G,L,C,h,17,a[2]),C=c(C,W,G,L,p,22,a[3]),L=c(L,C,W,G,b,7,a[4]),G=c(G,L,C,W,_,12,a[5]),W=c(W,G,L,C,y,17,a[6]),C=c(C,W,G,L,v,22,a[7]),L=c(L,C,W,G,S,7,a[8]),G=c(G,L,C,W,Z,12,a[9]),W=c(W,G,L,C,f,17,a[10]),C=c(C,W,G,L,T,22,a[11]),L=c(L,C,W,G,I,7,a[12]),G=c(G,L,C,W,g,12,a[13]),W=c(W,G,L,C,R,17,a[14]),L=l(L,C=c(C,W,G,L,X,22,a[15]),W,G,d,5,a[16]),G=l(G,L,C,W,y,9,a[17]),W=l(W,G,L,C,T,14,a[18]),C=l(C,W,G,L,n,20,a[19]),L=l(L,C,W,G,_,5,a[20]),G=l(G,L,C,W,f,9,a[21]),W=l(W,G,L,C,X,14,a[22]),C=l(C,W,G,L,b,20,a[23]),L=l(L,C,W,G,Z,5,a[24]),G=l(G,L,C,W,R,9,a[25]),W=l(W,G,L,C,p,14,a[26]),C=l(C,W,G,L,S,20,a[27]),L=l(L,C,W,G,g,5,a[28]),G=l(G,L,C,W,h,9,a[29]),W=l(W,G,L,C,v,14,a[30]),L=u(L,C=l(C,W,G,L,I,20,a[31]),W,G,_,4,a[32]),G=u(G,L,C,W,S,11,a[33]),W=u(W,G,L,C,T,16,a[34]),C=u(C,W,G,L,R,23,a[35]),L=u(L,C,W,G,d,4,a[36]),G=u(G,L,C,W,b,11,a[37]),W=u(W,G,L,C,v,16,a[38]),C=u(C,W,G,L,f,23,a[39]),L=u(L,C,W,G,g,4,a[40]),G=u(G,L,C,W,n,11,a[41]),W=u(W,G,L,C,p,16,a[42]),C=u(C,W,G,L,y,23,a[43]),L=u(L,C,W,G,Z,4,a[44]),G=u(G,L,C,W,I,11,a[45]),W=u(W,G,L,C,X,16,a[46]),L=m(L,C=u(C,W,G,L,h,23,a[47]),W,G,n,6,a[48]),G=m(G,L,C,W,v,10,a[49]),W=m(W,G,L,C,R,15,a[50]),C=m(C,W,G,L,_,21,a[51]),L=m(L,C,W,G,I,6,a[52]),G=m(G,L,C,W,p,10,a[53]),W=m(W,G,L,C,f,15,a[54]),C=m(C,W,G,L,d,21,a[55]),L=m(L,C,W,G,S,6,a[56]),G=m(G,L,C,W,X,10,a[57]),W=m(W,G,L,C,y,15,a[58]),C=m(C,W,G,L,g,21,a[59]),L=m(L,C,W,G,b,6,a[60]),G=m(G,L,C,W,T,10,a[61]),W=m(W,G,L,C,h,15,a[62]),C=m(C,W,G,L,Z,21,a[63]),r[0]=r[0]+L|0,r[1]=r[1]+C|0,r[2]=r[2]+W|0,r[3]=r[3]+G|0},_doFinalize:function(){var e=this._data,i=e.words,o=8*this._nDataBytes,s=8*e.sigBytes;i[s>>>5]|=128<<24-s%32;var r=t.floor(o/4294967296),n=o;i[15+(s+64>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),i[14+(s+64>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e.sigBytes=4*(i.length+1),this._process();for(var a=this._hash,d=a.words,c=0;c<4;c++){var l=d[c];d[c]=16711935&(l<<8|l>>>24)|4278255360&(l<<24|l>>>8)}return a},clone:function(){var e=r.clone.call(this);return e._hash=this._hash.clone(),e}});function c(e,t,i,o,s,r,n){var a=e+(t&i|~t&o)+s+n;return(a<<r|a>>>32-r)+t}function l(e,t,i,o,s,r,n){var a=e+(t&o|i&~o)+s+n;return(a<<r|a>>>32-r)+t}function u(e,t,i,o,s,r,n){var a=e+(t^i^o)+s+n;return(a<<r|a>>>32-r)+t}function m(e,t,i,o,s,r,n){var a=e+(i^(t|~o))+s+n;return(a<<r|a>>>32-r)+t}i.MD5=r._createHelper(d),i.HmacMD5=r._createHmacHelper(d)}(Math),e.MD5}(zZ())}(tf)),tf.exports}var sf,rf={exports:{}},nf={exports:{}};function af(){return sf||(sf=1,function(e){e.exports=function(e){return i=(t=e).lib,o=i.WordArray,s=i.Hasher,r=t.algo,n=[],a=r.SHA1=s.extend({_doReset:function(){this._hash=new o.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var i=this._hash.words,o=i[0],s=i[1],r=i[2],a=i[3],d=i[4],c=0;c<80;c++){if(c<16)n[c]=0|e[t+c];else{var l=n[c-3]^n[c-8]^n[c-14]^n[c-16];n[c]=l<<1|l>>>31}var u=(o<<5|o>>>27)+d+n[c];u+=c<20?1518500249+(s&r|~s&a):c<40?1859775393+(s^r^a):c<60?(s&r|s&a|r&a)-1894007588:(s^r^a)-899497514,d=a,a=r,r=s<<30|s>>>2,s=o,o=u}i[0]=i[0]+o|0,i[1]=i[1]+s|0,i[2]=i[2]+r|0,i[3]=i[3]+a|0,i[4]=i[4]+d|0},_doFinalize:function(){var e=this._data,t=e.words,i=8*this._nDataBytes,o=8*e.sigBytes;return t[o>>>5]|=128<<24-o%32,t[14+(o+64>>>9<<4)]=Math.floor(i/4294967296),t[15+(o+64>>>9<<4)]=i,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=s.clone.call(this);return e._hash=this._hash.clone(),e}}),t.SHA1=s._createHelper(a),t.HmacSHA1=s._createHmacHelper(a),e.SHA1;var t,i,o,s,r,n,a}(zZ())}(nf)),nf.exports}var df,cf,lf={exports:{}};function uf(){return cf||(cf=1,function(e){e.exports=function(e){return i=(t=e).lib,o=i.Base,s=i.WordArray,r=t.algo,n=r.MD5,a=r.EvpKDF=o.extend({cfg:o.extend({keySize:4,hasher:n,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var i,o=this.cfg,r=o.hasher.create(),n=s.create(),a=n.words,d=o.keySize,c=o.iterations;a.length<d;){i&&r.update(i),i=r.update(e).finalize(t),r.reset();for(var l=1;l<c;l++)i=r.finalize(i),r.reset();n.concat(i)}return n.sigBytes=4*d,n}}),t.EvpKDF=function(e,t,i){return a.create(i).compute(e,t)},e.EvpKDF;var t,i,o,s,r,n,a}(zZ(),af(),df||(df=1,function(e){e.exports=function(e){var t,i,o;i=(t=e).lib.Base,o=t.enc.Utf8,t.algo.HMAC=i.extend({init:function(e,t){e=this._hasher=new e.init,"string"==typeof t&&(t=o.parse(t));var i=e.blockSize,s=4*i;t.sigBytes>s&&(t=e.finalize(t)),t.clamp();for(var r=this._oKey=t.clone(),n=this._iKey=t.clone(),a=r.words,d=n.words,c=0;c<i;c++)a[c]^=1549556828,d[c]^=909522486;r.sigBytes=n.sigBytes=s,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher,i=t.finalize(e);return t.reset(),t.finalize(this._oKey.clone().concat(i))}})}(zZ())}(lf)))}(rf)),rf.exports}var mf,hf={exports:{}};function pf(){return mf||(mf=1,function(e){e.exports=function(e){e.lib.Cipher||function(t){var i=e,o=i.lib,s=o.Base,r=o.WordArray,n=o.BufferedBlockAlgorithm,a=i.enc;a.Utf8;var d=a.Base64,c=i.algo.EvpKDF,l=o.Cipher=n.extend({cfg:s.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,i){this.cfg=this.cfg.extend(i),this._xformMode=e,this._key=t,this.reset()},reset:function(){n.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){return e&&this._append(e),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return"string"==typeof e?S:y}return function(t){return{encrypt:function(i,o,s){return e(o).encrypt(t,i,o,s)},decrypt:function(i,o,s){return e(o).decrypt(t,i,o,s)}}}}()});o.StreamCipher=l.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var u=i.mode={},m=o.BlockCipherMode=s.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),h=u.CBC=function(){var e=m.extend();function i(e,i,o){var s,r=this._iv;r?(s=r,this._iv=t):s=this._prevBlock;for(var n=0;n<o;n++)e[i+n]^=s[n]}return e.Encryptor=e.extend({processBlock:function(e,t){var o=this._cipher,s=o.blockSize;i.call(this,e,t,s),o.encryptBlock(e,t),this._prevBlock=e.slice(t,t+s)}}),e.Decryptor=e.extend({processBlock:function(e,t){var o=this._cipher,s=o.blockSize,r=e.slice(t,t+s);o.decryptBlock(e,t),i.call(this,e,t,s),this._prevBlock=r}}),e}(),p=(i.pad={}).Pkcs7={pad:function(e,t){for(var i=4*t,o=i-e.sigBytes%i,s=o<<24|o<<16|o<<8|o,n=[],a=0;a<o;a+=4)n.push(s);var d=r.create(n,o);e.concat(d)},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}};o.BlockCipher=l.extend({cfg:l.cfg.extend({mode:h,padding:p}),reset:function(){var e;l.reset.call(this);var t=this.cfg,i=t.iv,o=t.mode;this._xformMode==this._ENC_XFORM_MODE?e=o.createEncryptor:(e=o.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==e?this._mode.init(this,i&&i.words):(this._mode=e.call(o,this,i&&i.words),this._mode.__creator=e)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e,t=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(t.pad(this._data,this.blockSize),e=this._process(!0)):(e=this._process(!0),t.unpad(e)),e},blockSize:4});var b=o.CipherParams=s.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),_=(i.format={}).OpenSSL={stringify:function(e){var t=e.ciphertext,i=e.salt;return(i?r.create([1398893684,1701076831]).concat(i).concat(t):t).toString(d)},parse:function(e){var t,i=d.parse(e),o=i.words;return 1398893684==o[0]&&1701076831==o[1]&&(t=r.create(o.slice(2,4)),o.splice(0,4),i.sigBytes-=16),b.create({ciphertext:i,salt:t})}},y=o.SerializableCipher=s.extend({cfg:s.extend({format:_}),encrypt:function(e,t,i,o){o=this.cfg.extend(o);var s=e.createEncryptor(i,o),r=s.finalize(t),n=s.cfg;return b.create({ciphertext:r,key:i,iv:n.iv,algorithm:e,mode:n.mode,padding:n.padding,blockSize:e.blockSize,formatter:o.format})},decrypt:function(e,t,i,o){return o=this.cfg.extend(o),t=this._parse(t,o.format),e.createDecryptor(i,o).finalize(t.ciphertext)},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),v=(i.kdf={}).OpenSSL={execute:function(e,t,i,o,s){if(o||(o=r.random(8)),s)n=c.create({keySize:t+i,hasher:s}).compute(e,o);else var n=c.create({keySize:t+i}).compute(e,o);var a=r.create(n.words.slice(t),4*i);return n.sigBytes=4*t,b.create({key:n,iv:a,salt:o})}},S=o.PasswordBasedCipher=y.extend({cfg:y.cfg.extend({kdf:v}),encrypt:function(e,t,i,o){var s=(o=this.cfg.extend(o)).kdf.execute(i,e.keySize,e.ivSize,o.salt,o.hasher);o.iv=s.iv;var r=y.encrypt.call(this,e,t,s.key,o);return r.mixIn(s),r},decrypt:function(e,t,i,o){o=this.cfg.extend(o),t=this._parse(t,o.format);var s=o.kdf.execute(i,e.keySize,e.ivSize,t.salt,o.hasher);return o.iv=s.iv,y.decrypt.call(this,e,t,s.key,o)}})}()}(zZ(),uf())}(hf)),hf.exports}!function(e){e.exports=function(e){return function(){var t=e,i=t.lib.BlockCipher,o=t.algo,s=[],r=[],n=[],a=[],d=[],c=[],l=[],u=[],m=[],h=[];!function(){for(var e=[],t=0;t<256;t++)e[t]=t<128?t<<1:t<<1^283;var i=0,o=0;for(t=0;t<256;t++){var p=o^o<<1^o<<2^o<<3^o<<4;p=p>>>8^255&p^99,s[i]=p,r[p]=i;var b=e[i],_=e[b],y=e[_],v=257*e[p]^16843008*p;n[i]=v<<24|v>>>8,a[i]=v<<16|v>>>16,d[i]=v<<8|v>>>24,c[i]=v,v=16843009*y^65537*_^257*b^16843008*i,l[p]=v<<24|v>>>8,u[p]=v<<16|v>>>16,m[p]=v<<8|v>>>24,h[p]=v,i?(i=b^e[e[e[y^b]]],o^=e[e[o]]):i=o=1}}();var p=[0,1,2,4,8,16,32,64,128,27,54],b=o.AES=i.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,t=e.words,i=e.sigBytes/4,o=4*((this._nRounds=i+6)+1),r=this._keySchedule=[],n=0;n<o;n++)n<i?r[n]=t[n]:(c=r[n-1],n%i?i>6&&n%i==4&&(c=s[c>>>24]<<24|s[c>>>16&255]<<16|s[c>>>8&255]<<8|s[255&c]):(c=s[(c=c<<8|c>>>24)>>>24]<<24|s[c>>>16&255]<<16|s[c>>>8&255]<<8|s[255&c],c^=p[n/i|0]<<24),r[n]=r[n-i]^c);for(var a=this._invKeySchedule=[],d=0;d<o;d++){if(n=o-d,d%4)var c=r[n];else c=r[n-4];a[d]=d<4||n<=4?c:l[s[c>>>24]]^u[s[c>>>16&255]]^m[s[c>>>8&255]]^h[s[255&c]]}}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,n,a,d,c,s)},decryptBlock:function(e,t){var i=e[t+1];e[t+1]=e[t+3],e[t+3]=i,this._doCryptBlock(e,t,this._invKeySchedule,l,u,m,h,r),i=e[t+1],e[t+1]=e[t+3],e[t+3]=i},_doCryptBlock:function(e,t,i,o,s,r,n,a){for(var d=this._nRounds,c=e[t]^i[0],l=e[t+1]^i[1],u=e[t+2]^i[2],m=e[t+3]^i[3],h=4,p=1;p<d;p++){var b=o[c>>>24]^s[l>>>16&255]^r[u>>>8&255]^n[255&m]^i[h++],_=o[l>>>24]^s[u>>>16&255]^r[m>>>8&255]^n[255&c]^i[h++],y=o[u>>>24]^s[m>>>16&255]^r[c>>>8&255]^n[255&l]^i[h++],v=o[m>>>24]^s[c>>>16&255]^r[l>>>8&255]^n[255&u]^i[h++];c=b,l=_,u=y,m=v}b=(a[c>>>24]<<24|a[l>>>16&255]<<16|a[u>>>8&255]<<8|a[255&m])^i[h++],_=(a[l>>>24]<<24|a[u>>>16&255]<<16|a[m>>>8&255]<<8|a[255&c])^i[h++],y=(a[u>>>24]<<24|a[m>>>16&255]<<16|a[c>>>8&255]<<8|a[255&l])^i[h++],v=(a[m>>>24]<<24|a[c>>>16&255]<<16|a[l>>>8&255]<<8|a[255&u])^i[h++],e[t]=b,e[t+1]=_,e[t+2]=y,e[t+3]=v},keySize:8});t.AES=i._createHelper(b)}(),e.AES}(zZ(),$Z(),of(),uf(),pf())}(BZ);var bf=BZ.exports,_f={exports:{}};!function(e){e.exports=function(e){return e.enc.Hex}(zZ())}(_f);var yf=i(_f.exports),vf={exports:{}};!function(e){e.exports=function(e){return e.mode.CTR=(t=e.lib.BlockCipherMode.extend(),i=t.Encryptor=t.extend({processBlock:function(e,t){var i=this._cipher,o=i.blockSize,s=this._iv,r=this._counter;s&&(r=this._counter=s.slice(0),this._iv=void 0);var n=r.slice(0);i.encryptBlock(n,0),r[o-1]=r[o-1]+1|0;for(var a=0;a<o;a++)e[t+a]^=n[a]}}),t.Decryptor=i,t),e.mode.CTR;var t,i}(zZ(),pf())}(vf);var Sf=i(vf.exports),Zf={exports:{}};!function(e){e.exports=function(e){return e.pad.NoPadding={pad:function(){},unpad:function(){}},e.pad.NoPadding}(zZ(),pf())}(Zf);var ff=i(Zf.exports),Tf={},If={},gf={exports:{}},Rf=gf.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(e){return e.encoding?"rtpmap:%d %s/%s/%s":e.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(e){return null!=e.address?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%s trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(e){return null!=e.subtype?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/,names:["value","direction","encrypt-uri","uri","config"],format:function(e){return"extmap:%d"+(e.direction?"/%s":"%v")+(e["encrypt-uri"]?" %s":"%v")+" %s"+(e.config?" %s":"")}},{name:"extmapAllowMixed",reg:/^(extmap-allow-mixed)/},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(e){return null!=e.sessionConfig?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"connectionType",reg:/^connection:(new|existing)/,format:"connection:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%s"},{name:"ptime",reg:/^ptime:(\d*(?:\.\d*)*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*(?:\.\d*)*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation","network-id","network-cost"],format:function(e){var t="candidate:%s %d %s %d %s %d typ %s";return t+=null!=e.raddr?" raddr %s rport %d":"%v%v",t+=null!=e.tcptype?" tcptype %s":"%v",null!=e.generation&&(t+=" generation %d"),t+=null!=e["network-id"]?" network-id %d":"%v",t+=null!=e["network-cost"]?" network-cost %d":"%v"}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_-]*)(?::(.*))?/,names:["id","attribute","value"],format:function(e){var t="ssrc:%d";return null!=e.attribute&&(t+=" %s",null!=e.value&&(t+=":%s")),t}},{push:"ssrcGroups",reg:/^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{name:"sctpmap",reg:/^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/,names:["sctpmapNumber","app","maxMessageSize"],format:function(e){return null!=e.maxMessageSize?"sctpmap:%s %s %s":"sctpmap:%s %s"}},{name:"xGoogleFlag",reg:/^x-google-flag:([^\s]*)/,format:"x-google-flag:%s"},{push:"rids",reg:/^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/,names:["id","direction","params"],format:function(e){return e.params?"rid:%s %s %s":"rid:%s %s"}},{push:"imageattrs",reg:new RegExp("^imageattr:(\\d+|\\*)[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?"),names:["pt","dir1","attrs1","dir2","attrs2"],format:function(e){return"imageattr:%s %s %s"+(e.dir2?" %s %s":"")}},{name:"simulcast",reg:new RegExp("^simulcast:(send|recv) ([a-zA-Z0-9\\-_~;,]+)(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?$"),names:["dir1","list1","dir2","list2"],format:function(e){return"simulcast:%s %s"+(e.dir2?" %s %s":"")}},{name:"simulcast_03",reg:/^simulcast:[\s\t]+([\S+\s\t]+)$/,names:["value"],format:"simulcast: %s"},{name:"framerate",reg:/^framerate:(\d+(?:$|\.\d+))/,format:"framerate:%s"},{name:"sourceFilter",reg:/^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/,names:["filterMode","netType","addressTypes","destAddress","srcList"],format:"source-filter: %s %s %s %s %s"},{name:"bundleOnly",reg:/^(bundle-only)/},{name:"label",reg:/^label:(.+)/,format:"label:%s"},{name:"sctpPort",reg:/^sctp-port:(\d+)$/,format:"sctp-port:%s"},{name:"maxMessageSize",reg:/^max-message-size:(\d+)$/,format:"max-message-size:%s"},{push:"tsRefClocks",reg:/^ts-refclk:([^\s=]*)(?:=(\S*))?/,names:["clksrc","clksrcExt"],format:function(e){return"ts-refclk:%s"+(null!=e.clksrcExt?"=%s":"")}},{name:"mediaClk",reg:/^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/,names:["id","mediaClockName","mediaClockValue","rateNumerator","rateDenominator"],format:function(e){var t="mediaclk:";return t+=null!=e.id?"id=%s %s":"%v%s",t+=null!=e.mediaClockValue?"=%s":"",t+=null!=e.rateNumerator?" rate=%s":"",t+=null!=e.rateDenominator?"/%s":""}},{name:"keywords",reg:/^keywds:(.+)$/,format:"keywds:%s"},{name:"content",reg:/^content:(.+)/,format:"content:%s"},{name:"bfcpFloorCtrl",reg:/^floorctrl:(c-only|s-only|c-s)/,format:"floorctrl:%s"},{name:"bfcpConfId",reg:/^confid:(\d+)/,format:"confid:%s"},{name:"bfcpUserId",reg:/^userid:(\d+)/,format:"userid:%s"},{name:"bfcpFloorId",reg:/^floorid:(.+) (?:m-stream|mstrm):(.+)/,names:["id","mStream"],format:"floorid:%s mstrm:%s"},{push:"invalid",names:["value"]}]};Object.keys(Rf).forEach((function(e){Rf[e].forEach((function(e){e.reg||(e.reg=/(.*)/),e.format||(e.format="%s")}))}));var Xf=gf.exports;!function(e){var t=function(e){return String(Number(e))===e?Number(e):e},i=function(e,i,o){var s=e.name&&e.names;e.push&&!i[e.push]?i[e.push]=[]:s&&!i[e.name]&&(i[e.name]={});var r=e.push?{}:s?i[e.name]:i;!function(e,i,o,s){if(s&&!o)i[s]=t(e[1]);else for(var r=0;r<o.length;r+=1)null!=e[r+1]&&(i[o[r]]=t(e[r+1]))}(o.match(e.reg),r,e.names,e.name),e.push&&i[e.push].push(r)},o=Xf,s=RegExp.prototype.test.bind(/^([a-z])=(.*)/);e.parse=function(e){var t={},r=[],n=t;return e.split(/(\r\n|\r|\n)/).filter(s).forEach((function(e){var t=e[0],s=e.slice(2);"m"===t&&(r.push({rtp:[],fmtp:[]}),n=r[r.length-1]);for(var a=0;a<(o[t]||[]).length;a+=1){var d=o[t][a];if(d.reg.test(s))return i(d,n,s)}})),t.media=r,t};var r=function(e,i){var o=i.split(/=(.+)/,2);return 2===o.length?e[o[0]]=t(o[1]):1===o.length&&i.length>1&&(e[o[0]]=void 0),e};e.parseParams=function(e){return e.split(/;\s?/).reduce(r,{})},e.parseFmtpConfig=e.parseParams,e.parsePayloads=function(e){return e.toString().split(" ").map(Number)},e.parseRemoteCandidates=function(e){for(var i=[],o=e.split(" ").map(t),s=0;s<o.length;s+=3)i.push({component:o[s],ip:o[s+1],port:o[s+2]});return i},e.parseImageAttributes=function(e){return e.split(" ").map((function(e){return e.substring(1,e.length-1).split(",").reduce(r,{})}))},e.parseSimulcastStreamList=function(e){return e.split(";").map((function(e){return e.split(",").map((function(e){var i,o=!1;return"~"!==e[0]?i=t(e):(i=t(e.substring(1,e.length)),o=!0),{scid:i,paused:o}}))}))}}(If);var Lf,Cf=Xf,Wf=/%[sdv%]/g,Gf=function(e){var t=1,i=arguments,o=i.length;return e.replace(Wf,(function(e){if(t>=o)return e;var s=i[t];switch(t+=1,e){case"%%":return"%";case"%s":return String(s);case"%d":return Number(s);case"%v":return""}}))},Vf=function(e,t,i){var o=[e+"="+(t.format instanceof Function?t.format(t.push?i:i[t.name]):t.format)];if(t.names)for(var s=0;s<t.names.length;s+=1){var r=t.names[s];t.name?o.push(i[t.name][r]):o.push(i[t.names[s]])}else o.push(i[t.name]);return Gf.apply(null,o)},Ef=["v","o","s","i","u","e","p","c","b","t","r","z","a"],Pf=["i","c","b","a"],kf=If,xf=function(e,t){t=t||{},null==e.version&&(e.version=0),null==e.name&&(e.name=" "),e.media.forEach((function(e){null==e.payloads&&(e.payloads="")}));var i=t.outerOrder||Ef,o=t.innerOrder||Pf,s=[];return i.forEach((function(t){Cf[t].forEach((function(i){i.name in e&&null!=e[i.name]?s.push(Vf(t,i,e)):i.push in e&&null!=e[i.push]&&e[i.push].forEach((function(e){s.push(Vf(t,i,e))}))}))})),e.media.forEach((function(e){s.push(Vf("m",Cf.m[0],e)),o.forEach((function(t){Cf[t].forEach((function(i){i.name in e&&null!=e[i.name]?s.push(Vf(t,i,e)):i.push in e&&null!=e[i.push]&&e[i.push].forEach((function(e){s.push(Vf(t,i,e))}))}))}))})),s.join("\r\n")+"\r\n"},Nf=Xf;Tf.grammar=Nf,Tf.write=xf,Tf.parse=kf.parse,Tf.parseParams=kf.parseParams,Tf.parseFmtpConfig=kf.parseFmtpConfig,Tf.parsePayloads=kf.parsePayloads,Tf.parseRemoteCandidates=kf.parseRemoteCandidates,Tf.parseImageAttributes=kf.parseImageAttributes,Tf.parseSimulcastStreamList=kf.parseSimulcastStreamList;const Mf=new TextDecoder,Yf=new TextEncoder;let wf;const Kf=()=>HZ(),Hf=()=>Date.now();function Ff(e){let t=0;for(var i=arguments.length,o=new Array(i>1?i-1:0),s=1;s<i;s++)o[s-1]=arguments[s];for(const a of o)t+=a.length;const r=new e(t);let n=0;for(const a of o)r.set(a,n),n+=a.length;return r}class Jf{static token2auth(e,t,i,o){return o?"Bearer ".concat(o):"Basic ".concat(Jf.createUnsafeToken(e,t,i))}static createUnsafeToken(e,t,i){return window.btoa([e,t,i].filter((e=>null!==e)).join(":"))}static merge(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(const[i,o]of Object.entries(e))null!==o&&"object"==typeof o?Jf.merge(e[i],t[i]):void 0!==t[i]&&(e[i]=t[i])}static ab2str(e){return Mf.decode(e)}static ab2obj(e){try{const t=Jf.ab2str(e);return JSON.parse(t)}catch(t){return{}}}static str2ab(e){return Yf.encode(e).buffer}static async ab2b64str(e){if(WZ("SEND_MESSAGE_SYNC")){const t=String.fromCharCode.apply(null,new Uint8Array(e));return window.btoa(t)}return(await new Promise((t=>{const i=new FileReader;i.onload=()=>t(i.result),i.readAsDataURL(new Blob([e]))}))).split(",",2)[1]}static async b64str2ab(e,t){return fetch("data:application/octet;base64,".concat(e)).then((e=>e.arrayBuffer())).catch((i=>{throw t&&t.report("rtc_error",{error_code:2001,message:"".concat(i.message," -> ").concat(e)}),i}))}}function Of(e){return new Promise((t=>{setTimeout(t,e)}))}function Uf(){const e=Number("".concat(Math.random()).slice(-7).padEnd(7,"0")).toString(2).padEnd(28,"1").split(""),t=[];for(;e.length;)t.push(e.splice(0,7));return t.map(((e,i)=>{const o=i===t.length-1?"0":"1";return Number.parseInt(o+e.join(""),2)}))}const Df=()=>Math.floor(65535*Math.random());function Af(e){return"string"==typeof e&&e.indexOf("__web__rtc__rtt__")>-1}let zf;function jf(e){return Number(Math.max(-127,10*Math.log10(Math.pow(e/255,2))).toFixed(2))}function Qf(e){return(e&tm.AUDIO)===tm.AUDIO}function Bf(e){return(e&tm.VIDEO)===tm.VIDEO}function qf(e){const t={};return Object.keys(e).forEach((i=>{"object"==typeof e[i]?t[i]=qf(e[i]):i.startsWith("_")&&!WZ("HIDDEN_STATS")||(t[i]=e[i])})),t}function $f(e){return void 0===e}function eT(e){return function(t,i,o){const s=o.value;o.value=function(){console.warn("[RTC WebSDK]: Api: ".concat(i," has been abandoned from version ").concat(e));for(var t=arguments.length,o=new Array(t),r=0;r<t;r++)o[r]=arguments[r];return s.apply(this,o)}}}function tT(e){console.warn("[RTC WebSDK]: ".concat(e))}function iT(e){return"number"==typeof e?e:"number"==typeof(null==e?void 0:e.exact)?e.exact:"number"==typeof(null==e?void 0:e.ideal)?e.ideal:"number"==typeof(null==e?void 0:e.max)?e.max:"number"==typeof(null==e?void 0:e.min)?e.min:1}const oT=Math.pow(2,15);class sT{constructor(){Hu(this,"_id",void 0),this._id=Math.ceil(Math.random()*oT)}getMessageId(){return++this._id>oT&&(this._id=0),this._id}}const rT="undefined"!=typeof window&&(window.location.search.includes("_rtc_debug_")||!(null===(Lf=window.localStorage)||void 0===Lf||!Lf.getItem("_rtc_debug_")));function nT(e){const t=atob(e),i=t.length,o=new Uint8Array(i);for(let s=0;s<i;s++)o[s]=t.charCodeAt(s);return o}function aT(e){let t="";const i=e.byteLength;for(let o=0;o<i;o++)t+=String.fromCharCode(e[o]);return btoa(t)}function dT(e,t,i){const o=cT(e),s=cT(t),r=cT(i);return function(e){const t=e.toString(yf),i=new Uint8Array(t.length/2);for(let o=0;o<t.length;o+=2)i[o/2]=parseInt(t.substr(o,2),16);return i}(bf.encrypt(o,s,{iv:r,mode:Sf,padding:ff}).ciphertext)}function cT(e){const t=[];for(let i=0;i<e.length;i+=4)t.push(e[i]<<24|(e[i+1]||0)<<16|(e[i+2]||0)<<8|(e[i+3]||0));return QZ.create(t,e.length)}function lT(){return wf||(wf=function(){let e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(!t)return{renderer:"unknown(WebGLRenderingContext not existed)",vendor:"unknown(WebGLRenderingContext not existed)"};const i=t.getExtension("WEBGL_debug_renderer_info");if(!i)return{renderer:"unknown(info not existed)",vendor:"unknown(info not existed)"};const o=t.getParameter(i.UNMASKED_RENDERER_WEBGL),s=t.getParameter(i.UNMASKED_VENDOR_WEBGL);e&&e.parentNode&&e.parentNode.removeChild(e);return e=void 0,t=void 0,{renderer:o,vendor:s}}()),wf}function uT(e){var t,i;return e instanceof Error&&e.code?"".concat(e," | native.name=").concat(null===(t=e.error)||void 0===t?void 0:t.name," native.message=").concat(null===(i=e.error)||void 0===i?void 0:i.message):e instanceof Error?"NativeError: ".concat(e.name," ").concat(e.message):"UnknownError: ".concat(e)}function mT(e){const t=e.toLowerCase();return"h264"===t?zS.H264:"vp8"===t?zS.VP8:"bytevc1"===t||"h265"===t?zS.H265:null}function hT(e){if(!e)return[];const t=[];return e.split(",").forEach((e=>{const i=mT(lh(e).call(e));i&&t.push(i)})),t}function pT(e){return e.toLowerCase().includes("h265")?zS.H265:e.toLowerCase().includes("h264")?zS.H264:e.toLowerCase().includes("vp8")?zS.VP8:void 0}var bT,_T,yT,vT,ST,ZT,fT,TT,IT,gT,RT,XT;const LT={};function CT(e,t){try{return e[t].toString().includes("[native code]")?"native":"non-native"}catch(i){return"untouchable"}}const WT=("undefined"!=typeof window?[[null===(bT=window.RTCPeerConnection)||void 0===bT?void 0:bT.prototype,"RTCPeerConnection.prototype"],[window.RTCPeerConnection,"RTCPeerConnection"],[null===(_T=window.RTCDataChannel)||void 0===_T?void 0:_T.prototype,"RTCDataChannel.prototype"],[window.RTCDataChannel,"RTCDataChannel"],[null===(yT=window.MediaStreamTrack)||void 0===yT?void 0:yT.prototype,"MediaStreamTrack.prototype"],[window.MediaStreamTrack,"MediaStreamTrack"],[null===(vT=window.MediaStream)||void 0===vT?void 0:vT.prototype,"MediaStream.prototype"],[window.MediaStream,"MediaStream"],[null===(ST=window.HTMLAudioElement)||void 0===ST?void 0:ST.prototype,"HTMLAudioElement.prototype"],[null===(ZT=window.HTMLVideoElement)||void 0===ZT?void 0:ZT.prototype,"HTMLVideoElement.prototype"],[null===(fT=window.HTMLMediaElement)||void 0===fT?void 0:fT.prototype,"HTMLMediaElement.prototype"],[null!==(TT=null===(IT=window.AudioContext)||void 0===IT?void 0:IT.prototype)&&void 0!==TT?TT:null===(gT=window.webkitAudioContext)||void 0===gT?void 0:gT.prototype,"AudioContext.prototype"],[null===(RT=window.BaseAudioContext)||void 0===RT?void 0:RT.prototype,"BaseAudioContext.prototype"],[null===(XT=window.AudioNode)||void 0===XT?void 0:XT.prototype,"AudioNode.prototype"],[window.navigator.mediaDevices,"navigator.mediaDevices"],[window.console,"console"]]:[]).reduce(((e,t)=>{let[i,o]=t;return e.concat(function(e,t){return e?Object.getOwnPropertyNames(e).filter((t=>{if("peerIdentity"===t)return!1;try{return"function"==typeof e[t]||void 0===e[t]}catch(i){return!1}})).map((i=>({obj:e,prefix:t,attr:i}))):[]}(i,o))}),[]);"undefined"!=typeof window&&WT.push({obj:window.navigator.mediaDevices,prefix:"navigator.mediaDevices",attr:"getUserMedia"},{obj:window.navigator.mediaDevices,prefix:"navigator.mediaDevices",attr:"getDisplayMedia"},{obj:window.navigator.mediaDevices,prefix:"navigator.mediaDevices",attr:"enumerateDevices"},{obj:window.navigator.mediaDevices,prefix:"navigator.mediaDevices",attr:"getSupportedConstraints"});for(const{obj:rK,prefix:nK,attr:aK}of WT){const e="".concat(nK,".").concat(aK);LT[e]=CT(rK,aK)}rT&&console.log("RTC_AMBULANCE",LT);const GT=Object.entries(LT).filter((e=>{let[t,i]=e;return"non-native"===i})).map((e=>{let[t,i]=e;return t}));Object.keys(GT).length&&console.warn("RTC_AMBULANCE","have non-native code:\n",GT.join("\n"));let VT=!0,ET=!0;function PT(e,t,i){const o=e.match(t);return o&&o.length>=i&&parseInt(o[i],10)}function kT(e,t,i){if(!e.RTCPeerConnection)return;const o=e.RTCPeerConnection.prototype,s=o.addEventListener;o.addEventListener=function(e,o){if(e!==t)return s.apply(this,arguments);const r=e=>{const t=i(e);t&&(o.handleEvent?o.handleEvent(t):o(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(o,r),s.apply(this,[e,r])};const r=o.removeEventListener;o.removeEventListener=function(e,i){if(e!==t||!this._eventMap||!this._eventMap[t])return r.apply(this,arguments);if(!this._eventMap[t].has(i))return r.apply(this,arguments);const o=this._eventMap[t].get(i);return this._eventMap[t].delete(i),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,r.apply(this,[e,o])},Object.defineProperty(o,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function xT(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(VT=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function NT(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(ET=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function MT(){if("object"==typeof window){if(VT)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function YT(e,t){ET&&console.warn(e+" is deprecated, please use "+t+" instead.")}function wT(e){return"[object Object]"===Object.prototype.toString.call(e)}function KT(e){return wT(e)?Object.keys(e).reduce((function(t,i){const o=wT(e[i]),s=o?KT(e[i]):e[i],r=o&&!Object.keys(s).length;return void 0===s||r?t:Object.assign(t,{[i]:s})}),{}):e}function HT(e,t,i){t&&!i.has(t.id)&&(i.set(t.id,t),Object.keys(t).forEach((o=>{o.endsWith("Id")?HT(e,e.get(t[o]),i):o.endsWith("Ids")&&t[o].forEach((t=>{HT(e,e.get(t),i)}))})))}function FT(e,t,i){const o=i?"outbound-rtp":"inbound-rtp",s=new Map;if(null===t)return s;const r=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&r.push(e)})),r.forEach((t=>{e.forEach((i=>{i.type===o&&i.trackId===t.id&&HT(e,i,s)}))})),s}const JT=MT;function OT(e,t){const i=e&&e.navigator;if(!i.mediaDevices)return;const o=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((i=>{if("require"===i||"advanced"===i||"mediaSource"===i)return;const o="object"==typeof e[i]?e[i]:{ideal:e[i]};void 0!==o.exact&&"number"==typeof o.exact&&(o.min=o.max=o.exact);const s=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==o.ideal){t.optional=t.optional||[];let e={};"number"==typeof o.ideal?(e[s("min",i)]=o.ideal,t.optional.push(e),e={},e[s("max",i)]=o.ideal,t.optional.push(e)):(e[s("",i)]=o.ideal,t.optional.push(e))}void 0!==o.exact&&"number"!=typeof o.exact?(t.mandatory=t.mandatory||{},t.mandatory[s("",i)]=o.exact):["min","max"].forEach((e=>{void 0!==o[e]&&(t.mandatory=t.mandatory||{},t.mandatory[s(e,i)]=o[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},s=function(e,s){if(t.version>=61)return s(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,i){t in e&&!(i in e)&&(e[i]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=o(e.audio)}if(e&&"object"==typeof e.video){let r=e.video.facingMode;r=r&&("object"==typeof r?r:{ideal:r});const n=t.version<66;if(r&&("user"===r.exact||"environment"===r.exact||"user"===r.ideal||"environment"===r.ideal)&&(!i.mediaDevices.getSupportedConstraints||!i.mediaDevices.getSupportedConstraints().facingMode||n)){let t;if(delete e.video.facingMode,"environment"===r.exact||"environment"===r.ideal?t=["back","rear"]:"user"!==r.exact&&"user"!==r.ideal||(t=["front"]),t)return i.mediaDevices.enumerateDevices().then((i=>{let n=(i=i.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!n&&i.length&&t.includes("back")&&(n=i[i.length-1]),n&&(e.video.deviceId=r.exact?{exact:n.deviceId}:{ideal:n.deviceId}),e.video=o(e.video),JT("chrome: "+JSON.stringify(e)),s(e)}))}e.video=o(e.video)}return JT("chrome: "+JSON.stringify(e)),s(e)},r=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(i.getUserMedia=function(e,t,o){s(e,(e=>{i.webkitGetUserMedia(e,t,(e=>{o&&o(r(e))}))}))}.bind(i),i.mediaDevices.getUserMedia){const e=i.mediaDevices.getUserMedia.bind(i.mediaDevices);i.mediaDevices.getUserMedia=function(t){return s(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(r(e))))))}}}function UT(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function DT(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(i=>{let o;o=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===i.track.id)):{track:i.track};const s=new Event("track");s.track=i.track,s.receiver=o,s.transceiver={receiver:o},s.streams=[t.stream],this.dispatchEvent(s)})),t.stream.getTracks().forEach((i=>{let o;o=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===i.id)):{track:i};const s=new Event("track");s.track=i,s.receiver=o,s.transceiver={receiver:o},s.streams=[t.stream],this.dispatchEvent(s)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else kT(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function AT(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const i=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,o){let s=i.apply(this,arguments);return s||(s=t(this,e),this._senders.push(s)),s};const o=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){o.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const i=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],i.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const o=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],o.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function zT(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof e))return t.apply(this,[]);const s=function(e){const t={};return e.result().forEach((e=>{const i={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{i[t]=e.stat(t)})),t[i.id]=i})),t},r=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const o=function(e){i(r(s(e)))};return t.apply(this,[o,e])}return new Promise(((e,i)=>{t.apply(this,[function(t){e(r(s(t)))},i])})).then(i,o)}}function jT(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const i=e.RTCPeerConnection.prototype.addTrack;i&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=i.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>FT(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),kT(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>FT(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,i,o;return this.getSenders().forEach((i=>{i.track===e&&(t?o=!0:t=i)})),this.getReceivers().forEach((t=>(t.track===e&&(i?o=!0:i=t),t.track===e))),o||t&&i?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():i?i.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function QT(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,i){if(!i)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const o=t.apply(this,arguments);return this._shimmedLocalStreams[i.id]?-1===this._shimmedLocalStreams[i.id].indexOf(o)&&this._shimmedLocalStreams[i.id].push(o):this._shimmedLocalStreams[i.id]=[i,o],o};const i=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();i.apply(this,arguments);const o=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(o)};const o=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],o.apply(this,arguments)};const s=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const i=this._shimmedLocalStreams[t].indexOf(e);-1!==i&&this._shimmedLocalStreams[t].splice(i,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),s.apply(this,arguments)}}function BT(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return QT(e);const i=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=i.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const o=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const i=new e.MediaStream(t.getTracks());this._streams[t.id]=i,this._reverseStreams[i.id]=t,t=i}o.apply(this,[t])};const s=e.RTCPeerConnection.prototype.removeStream;function r(e,t){let i=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const o=e._reverseStreams[t],s=e._streams[o.id];i=i.replace(new RegExp(s.id,"g"),o.id)})),new RTCSessionDescription({type:t.type,sdp:i})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},s.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,i){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const o=[].slice.call(arguments,1);if(1!==o.length||!o[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single  stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const s=this._streams[i.id];if(s)s.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const o=new e.MediaStream([t]);this._streams[i.id]=o,this._reverseStreams[o.id]=i,this.addStream(o)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const i=e.RTCPeerConnection.prototype[t],o={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?i.apply(this,[t=>{const i=r(this,t);e[0].apply(null,[i])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):i.apply(this,arguments).then((e=>r(this,e)))}};e.RTCPeerConnection.prototype[t]=o[t]}));const n=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let i=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const o=e._reverseStreams[t],s=e._streams[o.id];i=i.replace(new RegExp(o.id,"g"),s.id)})),new RTCSessionDescription({type:t.type,sdp:i})}(this,arguments[0]),n.apply(this,arguments)):n.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:r(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((i=>{this._streams[i].getTracks().find((t=>e.track===t))&&(t=this._streams[i])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function qT(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const i=e.RTCPeerConnection.prototype[t],o={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=o[t]}))}function $T(e,t){kT(e,"negotiationneeded",(e=>{const i=e.target;if(!(t.version<72||i.getConfiguration&&"plan-b"===i.getConfiguration().sdpSemantics)||"stable"===i.signalingState)return e}))}var eI=Object.freeze({__proto__:null,fixNegotiationNeeded:$T,shimAddTrackRemoveTrack:BT,shimAddTrackRemoveTrackWithNative:QT,shimGetDisplayMedia:function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(i){return t(i).then((t=>{const o=i.video&&i.video.width,s=i.video&&i.video.height,r=i.video&&i.video.frameRate;return i.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:r||3}},o&&(i.video.mandatory.maxWidth=o),s&&(i.video.mandatory.maxHeight=s),e.navigator.mediaDevices.getUserMedia(i)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))},shimGetSendersWithDtmf:AT,shimGetStats:zT,shimGetUserMedia:OT,shimMediaStream:UT,shimOnTrack:DT,shimPeerConnection:qT,shimSenderReceiverGetStats:jT});function tI(e,t){const i=e&&e.navigator,o=e&&e.MediaStreamTrack;if(i.getUserMedia=function(e,t,o){YT("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),i.mediaDevices.getUserMedia(e).then(t,o)},!(t.version>55&&"autoGainControl"in i.mediaDevices.getSupportedConstraints())){const e=function(e,t,i){t in e&&!(i in e)&&(e[i]=e[t],delete e[t])},t=i.mediaDevices.getUserMedia.bind(i.mediaDevices);if(i.mediaDevices.getUserMedia=function(i){return"object"==typeof i&&"object"==typeof i.audio&&(i=JSON.parse(JSON.stringify(i)),e(i.audio,"autoGainControl","mozAutoGainControl"),e(i.audio,"noiseSuppression","mozNoiseSuppression")),t(i)},o&&o.prototype.getSettings){const t=o.prototype.getSettings;o.prototype.getSettings=function(){const i=t.apply(this,arguments);return e(i,"mozAutoGainControl","autoGainControl"),e(i,"mozNoiseSuppression","noiseSuppression"),i}}if(o&&o.prototype.applyConstraints){const t=o.prototype.applyConstraints;o.prototype.applyConstraints=function(i){return"audio"===this.kind&&"object"==typeof i&&(i=JSON.parse(JSON.stringify(i)),e(i,"autoGainControl","mozAutoGainControl"),e(i,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[i])}}}}function iI(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function oI(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const i=e.RTCPeerConnection.prototype[t],o={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=o[t]}));const i={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},o=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,s,r]=arguments;return o.apply(this,[e||null]).then((e=>{if(t.version<53&&!s)try{e.forEach((e=>{e.type=i[e.type]||e.type}))}catch(o){if("TypeError"!==o.name)throw o;e.forEach(((t,o)=>{e.set(o,Object.assign({},t,{type:i[t.type]||t.type}))}))}return e})).then(s,r)}}function sI(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const i=e.RTCPeerConnection.prototype.addTrack;i&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=i.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function rI(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),kT(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function nI(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){YT("removeStream","removeTrack"),this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function aI(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function dI(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const i=e.length>0;i&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const o=t.apply(this,arguments);if(i){const{sender:t}=o,i=t.getParameters();(!("encodings"in i)||1===i.encodings.length&&0===Object.keys(i.encodings[0]).length)&&(i.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(i).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return o})}function cI(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function lI(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function uI(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}var mI=Object.freeze({__proto__:null,shimAddTransceiver:dI,shimCreateAnswer:uI,shimCreateOffer:lI,shimGetDisplayMedia:function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(i){if(!i||!i.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===i.video?i.video={mediaSource:t}:i.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(i)})},shimGetParameters:cI,shimGetUserMedia:tI,shimOnTrack:iI,shimPeerConnection:oI,shimRTCDataChannel:aI,shimReceiverGetStats:rI,shimRemoveStream:nI,shimSenderGetStats:sI});function hI(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((i=>t.call(this,i,e))),e.getVideoTracks().forEach((i=>t.call(this,i,e)))},e.RTCPeerConnection.prototype.addTrack=function(e){for(var i=arguments.length,o=new Array(i>1?i-1:0),s=1;s<i;s++)o[s-1]=arguments[s];return o&&o.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const i=e.getTracks();this.getSenders().forEach((e=>{i.includes(e.track)&&this.removeTrack(e)}))})}}function pI(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const i=new Event("addstream");i.stream=t,e.dispatchEvent(i)}))}),t.apply(e,arguments)}}}function bI(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,i=t.createOffer,o=t.createAnswer,s=t.setLocalDescription,r=t.setRemoteDescription,n=t.addIceCandidate;t.createOffer=function(e,t){const o=arguments.length>=2?arguments[2]:arguments[0],s=i.apply(this,[o]);return t?(s.then(e,t),Promise.resolve()):s},t.createAnswer=function(e,t){const i=arguments.length>=2?arguments[2]:arguments[0],s=o.apply(this,[i]);return t?(s.then(e,t),Promise.resolve()):s};let a=function(e,t,i){const o=s.apply(this,[e]);return i?(o.then(t,i),Promise.resolve()):o};t.setLocalDescription=a,a=function(e,t,i){const o=r.apply(this,[e]);return i?(o.then(t,i),Promise.resolve()):o},t.setRemoteDescription=a,a=function(e,t,i){const o=n.apply(this,[e]);return i?(o.then(t,i),Promise.resolve()):o},t.addIceCandidate=a}function _I(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,i=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>i(yI(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,i,o){t.mediaDevices.getUserMedia(e).then(i,o)}.bind(t))}function yI(e){return e&&void 0!==e.video?Object.assign({},e,{video:KT(e.video)}):e}function vI(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,i){if(e&&e.iceServers){const t=[];for(let i=0;i<e.iceServers.length;i++){let o=e.iceServers[i];void 0===o.urls&&o.url?(YT("RTCIceServer.url","RTCIceServer.urls"),o=JSON.parse(JSON.stringify(o)),o.urls=o.url,delete o.url,t.push(o)):t.push(e.iceServers[i])}e.iceServers=t}return new t(e,i)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:()=>t.generateCertificate})}function SI(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function ZI(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const i=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&i?"sendrecv"===i.direction?i.setDirection?i.setDirection("sendonly"):i.direction="sendonly":"recvonly"===i.direction&&(i.setDirection?i.setDirection("inactive"):i.direction="inactive"):!0!==e.offerToReceiveVideo||i||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function fI(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var TI=Object.freeze({__proto__:null,shimAudioContext:fI,shimCallbacksAPI:bI,shimConstraints:yI,shimCreateOfferLegacy:ZI,shimGetUserMedia:_I,shimLocalStreamsAPI:hI,shimRTCIceServerUrls:vI,shimRemoteStreamsAPI:pI,shimTrackEventTransceiver:SI}),II={exports:{}};!function(e){const t={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};t.localCName=t.generateIdentifier(),t.splitLines=function(e){return lh(e).call(e).split("\n").map((e=>lh(e).call(e)))},t.splitSections=function(e){return e.split("\nm=").map(((e,t)=>{var i;return lh(i=t>0?"m="+e:e).call(i)+"\r\n"}))},t.getDescription=function(e){const i=t.splitSections(e);return i&&i[0]},t.getMediaSections=function(e){const i=t.splitSections(e);return i.shift(),i},t.matchPrefix=function(e,i){return t.splitLines(e).filter((e=>0===e.indexOf(i)))},t.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const i={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let o=8;o<t.length;o+=2)switch(t[o]){case"raddr":i.relatedAddress=t[o+1];break;case"rport":i.relatedPort=parseInt(t[o+1],10);break;case"tcptype":i.tcpType=t[o+1];break;case"ufrag":i.ufrag=t[o+1],i.usernameFragment=t[o+1];break;default:void 0===i[t[o]]&&(i[t[o]]=t[o+1])}return i},t.writeCandidate=function(e){const t=[];t.push(e.foundation);const i=e.component;"rtp"===i?t.push(1):"rtcp"===i?t.push(2):t.push(i),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port);const o=e.type;return t.push("typ"),t.push(o),"host"!==o&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},t.parseIceOptions=function(e){return e.substring(14).split(" ")},t.parseRtpMap=function(e){let t=e.substring(9).split(" ");const i={payloadType:parseInt(t.shift(),10)};return t=t[0].split("/"),i.name=t[0],i.clockRate=parseInt(t[1],10),i.channels=3===t.length?parseInt(t[2],10):1,i.numChannels=i.channels,i},t.writeRtpMap=function(e){let t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);const i=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==i?"/"+i:"")+"\r\n"},t.parseExtmap=function(e){const t=e.substring(9).split(" ");return{id:parseInt(t[0],10),direction:t[0].indexOf("/")>0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},t.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},t.parseFmtp=function(e){const t={};let i;const o=e.substring(e.indexOf(" ")+1).split(";");for(let n=0;n<o.length;n++){var s,r;i=lh(s=o[n]).call(s).split("="),t[lh(r=i[0]).call(r)]=i[1]}return t},t.writeFmtp=function(e){let t="",i=e.payloadType;if(void 0!==e.preferredPayloadType&&(i=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length){const o=[];Object.keys(e.parameters).forEach((t=>{void 0!==e.parameters[t]?o.push(t+"="+e.parameters[t]):o.push(t)})),t+="a=fmtp:"+i+" "+o.join(";")+"\r\n"}return t},t.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},t.writeRtcpFb=function(e){let t="",i=e.payloadType;return void 0!==e.preferredPayloadType&&(i=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+i+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},t.parseSsrcMedia=function(e){const t=e.indexOf(" "),i={ssrc:parseInt(e.substring(7,t),10)},o=e.indexOf(":",t);return o>-1?(i.attribute=e.substring(t+1,o),i.value=e.substring(o+1)):i.attribute=e.substring(t+1),i},t.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},t.getMid=function(e){const i=t.matchPrefix(e,"a=mid:")[0];if(i)return i.substring(6)},t.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,i){return{role:"auto",fingerprints:t.matchPrefix(e+i,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let i="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{i+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),i},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,i){return t.matchPrefix(e+i,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,i){const o=t.matchPrefix(e+i,"a=ice-ufrag:")[0],s=t.matchPrefix(e+i,"a=ice-pwd:")[0];return o&&s?{usernameFragment:o.substring(12),password:s.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const i={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},o=t.splitLines(e)[0].split(" ");i.profile=o[2];for(let r=3;r<o.length;r++){const s=o[r],n=t.matchPrefix(e,"a=rtpmap:"+s+" ")[0];if(n){const o=t.parseRtpMap(n),r=t.matchPrefix(e,"a=fmtp:"+s+" ");switch(o.parameters=r.length?t.parseFmtp(r[0]):{},o.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+s+" ").map(t.parseRtcpFb),i.codecs.push(o),o.name.toUpperCase()){case"RED":case"ULPFEC":i.fecMechanisms.push(o.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach((e=>{i.headerExtensions.push(t.parseExtmap(e))}));const s=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return i.codecs.forEach((e=>{s.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),i},t.writeRtpDescription=function(e,i){let o="";o+="m="+e+" ",o+=i.codecs.length>0?"9":"0",o+=" "+(i.profile||"UDP/TLS/RTP/SAVPF")+" ",o+=i.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",o+="c=IN IP4 0.0.0.0\r\n",o+="a=rtcp:9 IN IP4 0.0.0.0\r\n",i.codecs.forEach((e=>{o+=t.writeRtpMap(e),o+=t.writeFmtp(e),o+=t.writeRtcpFb(e)}));let s=0;return i.codecs.forEach((e=>{e.maxptime>s&&(s=e.maxptime)})),s>0&&(o+="a=maxptime:"+s+"\r\n"),i.headerExtensions&&i.headerExtensions.forEach((e=>{o+=t.writeExtmap(e)})),o},t.parseRtpEncodingParameters=function(e){const i=[],o=t.parseRtpParameters(e),s=-1!==o.fecMechanisms.indexOf("RED"),r=-1!==o.fecMechanisms.indexOf("ULPFEC"),n=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=n.length>0&&n[0].ssrc;let d;const c=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));c.length>0&&c[0].length>1&&c[0][0]===a&&(d=c[0][1]),o.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&d&&(t.rtx={ssrc:d}),i.push(t),s&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:r?"red+ulpfec":"red"},i.push(t))}})),0===i.length&&a&&i.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,i.forEach((e=>{e.maxBitrate=l}))),i},t.parseRtcpParameters=function(e){const i={},o=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];o&&(i.cname=o.value,i.ssrc=o.ssrc);const s=t.matchPrefix(e,"a=rtcp-rsize");i.reducedSize=s.length>0,i.compound=0===s.length;const r=t.matchPrefix(e,"a=rtcp-mux");return i.mux=r.length>0,i},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let i;const o=t.matchPrefix(e,"a=msid:");if(1===o.length)return i=o[0].substring(7).split(" "),{stream:i[0],track:i[1]};const s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return s.length>0?(i=s[0].value.split(" "),{stream:i[0],track:i[1]}):void 0},t.parseSctpDescription=function(e){const i=t.parseMLine(e),o=t.matchPrefix(e,"a=max-message-size:");let s;o.length>0&&(s=parseInt(o[0].substring(19),10)),isNaN(s)&&(s=65536);const r=t.matchPrefix(e,"a=sctp-port:");if(r.length>0)return{port:parseInt(r[0].substring(12),10),protocol:i.fmt,maxMessageSize:s};const n=t.matchPrefix(e,"a=sctpmap:");if(n.length>0){const e=n[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:s}}},t.writeSctpDescription=function(e,t){let i=[];return i="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&i.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),i.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,i,o){let s;const r=void 0!==i?i:2;s=e||t.generateSessionId();return"v=0\r\no="+(o||"thisisadapterortc")+" "+s+" "+r+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,i){const o=t.splitLines(e);for(let t=0;t<o.length;t++)switch(o[t]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return o[t].substring(2)}return i?t.getDirection(i):"sendrecv"},t.getKind=function(e){return t.splitLines(e)[0].split(" ")[0].substring(2)},t.isRejected=function(e){return"0"===e.split(" ",2)[1]},t.parseMLine=function(e){const i=t.splitLines(e)[0].substring(2).split(" ");return{kind:i[0],port:parseInt(i[1],10),protocol:i[2],fmt:i.slice(3).join(" ")}},t.parseOLine=function(e){const i=t.matchPrefix(e,"o=")[0].substring(2).split(" ");return{username:i[0],sessionId:i[1],sessionVersion:parseInt(i[2],10),netType:i[3],addressType:i[4],address:i[5]}},t.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;const i=t.splitLines(e);for(let t=0;t<i.length;t++)if(i[t].length<2||"="!==i[t].charAt(1))return!1;return!0},e.exports=t}(II);var gI=II.exports,RI=i(gI),XI=e({__proto__:null,default:RI},[gI]);function LI(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const i=new t(e),o=RI.parseCandidate(e.candidate);for(const e in o)e in i||Object.defineProperty(i,e,{value:o[e]});return i.toJSON=function(){return{candidate:i.candidate,sdpMid:i.sdpMid,sdpMLineIndex:i.sdpMLineIndex,usernameFragment:i.usernameFragment}},i}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,kT(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function CI(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||kT(e,"icecandidate",(e=>{if(e.candidate){const t=RI.parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function WI(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const i=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=RI.splitSections(e.sdp);return t.shift(),t.some((e=>{const t=RI.parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const i=parseInt(t[1],10);return i!=i?-1:i}(arguments[0]),i=function(e){let i=65536;return"firefox"===t.browser&&(i=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),i}(e),o=function(e,i){let o=65536;"firefox"===t.browser&&57===t.version&&(o=65535);const s=RI.matchPrefix(e.sdp,"a=max-message-size:");return s.length>0?o=parseInt(s[0].substring(19),10):"firefox"===t.browser&&-1!==i&&(o=2147483637),o}(arguments[0],e);let s;s=0===i&&0===o?Number.POSITIVE_INFINITY:0===i||0===o?Math.max(i,o):Math.min(i,o);const r={};Object.defineProperty(r,"maxMessageSize",{get:()=>s}),this._sctp=r}return i.apply(this,arguments)}}function GI(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const i=e.send;e.send=function(){return i.apply(e,arguments)}}const i=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=i.apply(this,arguments);return t(e),e},kT(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function VI(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const i=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const i=new Event("connectionstatechange",e);t.dispatchEvent(i)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),i.apply(this,arguments)}}))}function EI(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const i=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const i=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==lh(e).call(e))).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:i}):t.sdp=i}return i.apply(this,arguments)}}function PI(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const i=e.RTCPeerConnection.prototype.addIceCandidate;i&&0!==i.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():i.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function kI(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const i=e.RTCPeerConnection.prototype.setLocalDescription;i&&0!==i.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return i.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return i.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>i.apply(this,[e])))})}var xI=Object.freeze({__proto__:null,removeExtmapAllowMixed:EI,shimAddIceCandidateNullOrEmpty:PI,shimConnectionState:VI,shimMaxMessageSize:WI,shimParameterlessSetLocalDescription:kI,shimRTCIceCandidate:LI,shimRTCIceCandidateRelayProtocol:CI,shimSendThrowTypeError:GI});if(function(){let{window:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimSafari:!0};const i=MT,o=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:i}=e;if(i.mozGetUserMedia)t.browser="firefox",t.version=PT(i.userAgent,/Firefox\/(\d+)\./,1);else if(i.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=PT(i.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!i.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=PT(i.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}(e),s={browserDetails:o,commonShim:xI,extractVersion:PT,disableLog:xT,disableWarnings:NT,sdp:XI};switch(o.browser){case"chrome":if(!eI||!qT||!t.shimChrome)return i("Chrome shim is not included in this adapter release."),s;if(null===o.version)return i("Chrome shim can not determine version, not shimming."),s;i("adapter.js shimming chrome."),s.browserShim=eI,PI(e,o),kI(e),OT(e,o),UT(e),qT(e,o),DT(e),BT(e,o),AT(e),zT(e),jT(e),$T(e,o),LI(e),CI(e),VI(e),WI(e,o),GI(e),EI(e,o);break;case"firefox":if(!mI||!oI||!t.shimFirefox)return i("Firefox shim is not included in this adapter release."),s;i("adapter.js shimming firefox."),s.browserShim=mI,PI(e,o),kI(e),tI(e,o),oI(e,o),iI(e),nI(e),sI(e),rI(e),aI(e),dI(e),cI(e),lI(e),uI(e),LI(e),VI(e),WI(e,o),GI(e);break;case"safari":if(!TI||!t.shimSafari)return i("Safari shim is not included in this adapter release."),s;i("adapter.js shimming safari."),s.browserShim=TI,PI(e,o),kI(e),vI(e),ZI(e),bI(e),hI(e),pI(e),SI(e),_I(e),fI(e),LI(e),CI(e),WI(e,o),GI(e),EI(e,o);break;default:i("Unsupported browser!")}}({window:"undefined"==typeof window?void 0:window}),"undefined"!=typeof MediaStreamTrack){const e=MediaStreamTrack.prototype.getSettings;MediaStreamTrack.prototype.getSettings=function(){const t=e.call(this);return t.width&&(t.width=Math.floor(t.width)),t.height&&(t.height=Math.floor(t.height)),t.frameRate&&(t.frameRate=Math.floor(t.frameRate)),t}}var NI=Le,MI=TypeError,YI=qo,wI=Math.floor,KI=function(e,t){var i=e.length;if(i<8)for(var o,s,r=1;r<i;){for(s=r,o=e[r];s&&t(e[s-1],o)>0;)e[s]=e[--s];s!==r++&&(e[s]=o)}else for(var n=wI(i/2),a=KI(YI(e,0,n),t),d=KI(YI(e,n),t),c=a.length,l=d.length,u=0,m=0;u<c||m<l;)e[u+m]=u<c&&m<l?t(a[u],d[m])<=0?a[u++]:d[m++]:u<c?a[u++]:d[m++];return e},HI=KI,FI=de.match(/firefox\/(\d+)/i),JI=!!FI&&+FI[1],OI=/MSIE|Trident/.test(de),UI=de.match(/AppleWebKit\/(\d+)\./),DI=!!UI&&+UI[1],AI=Vi,zI=y,jI=Ve,QI=qe,BI=Ji,qI=function(e,t){if(!delete e[t])throw new MI("Cannot delete property "+NI(t)+" of "+NI(e))},$I=fo,eg=n,tg=HI,ig=Sd,og=JI,sg=OI,rg=be,ng=DI,ag=[],dg=zI(ag.sort),cg=zI(ag.push),lg=eg((function(){ag.sort(void 0)})),ug=eg((function(){ag.sort(null)})),mg=ig("sort"),hg=!eg((function(){if(rg)return rg<70;if(!(og&&og>3)){if(sg)return!0;if(ng)return ng<603;var e,t,i,o,s="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:i=3;break;case 68:case 71:i=4;break;default:i=2}for(o=0;o<47;o++)ag.push({k:t+o,v:i})}for(ag.sort((function(e,t){return t.v-e.v})),o=0;o<ag.length;o++)t=ag[o].k.charAt(0),s.charAt(s.length-1)!==t&&(s+=t);return"DGBEFHACIJK"!==s}}));AI({target:"Array",proto:!0,forced:lg||!ug||!mg||!hg},{sort:function(e){void 0!==e&&jI(e);var t=QI(this);if(hg)return void 0===e?dg(t):dg(t,e);var i,o,s=[],r=BI(t);for(o=0;o<r;o++)o in t&&cg(s,t[o]);for(tg(s,function(e){return function(t,i){return void 0===i?-1:void 0===t?1:void 0!==e?+e(t,i)||0:$I(t)>$I(i)?1:-1}}(e)),i=BI(s),o=0;o<i;)t[o]=s[o++];for(;o<r;)qI(t,o++);return t}});var pg=Ha("Array","sort"),bg=re,_g=pg,yg=Array.prototype,vg=i((function(e){var t=e.sort;return e===yg||bg(yg,e)&&t===yg.sort?_g:t})),Sg={exports:{}};!function(e){var t=Object.prototype.hasOwnProperty,i="~";function o(){}function s(e,t,i){this.fn=e,this.context=t,this.once=i||!1}function r(e,t,o,r,n){if("function"!=typeof o)throw new TypeError("The listener must be a function");var a=new s(o,r||e,n),d=i?i+t:t;return e._events[d]?e._events[d].fn?e._events[d]=[e._events[d],a]:e._events[d].push(a):(e._events[d]=a,e._eventsCount++),e}function n(e,t){0==--e._eventsCount?e._events=new o:delete e._events[t]}function a(){this._events=new o,this._eventsCount=0}Object.create&&(o.prototype=Object.create(null),(new o).__proto__||(i=!1)),a.prototype.eventNames=function(){var e,o,s=[];if(0===this._eventsCount)return s;for(o in e=this._events)t.call(e,o)&&s.push(i?o.slice(1):o);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(e)):s},a.prototype.listeners=function(e){var t=i?i+e:e,o=this._events[t];if(!o)return[];if(o.fn)return[o.fn];for(var s=0,r=o.length,n=new Array(r);s<r;s++)n[s]=o[s].fn;return n},a.prototype.listenerCount=function(e){var t=i?i+e:e,o=this._events[t];return o?o.fn?1:o.length:0},a.prototype.emit=function(e,t,o,s,r,n){var a=i?i+e:e;if(!this._events[a])return!1;var d,c,l=this._events[a],u=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),u){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,o),!0;case 4:return l.fn.call(l.context,t,o,s),!0;case 5:return l.fn.call(l.context,t,o,s,r),!0;case 6:return l.fn.call(l.context,t,o,s,r,n),!0}for(c=1,d=new Array(u-1);c<u;c++)d[c-1]=arguments[c];l.fn.apply(l.context,d)}else{var m,h=l.length;for(c=0;c<h;c++)switch(l[c].once&&this.removeListener(e,l[c].fn,void 0,!0),u){case 1:l[c].fn.call(l[c].context);break;case 2:l[c].fn.call(l[c].context,t);break;case 3:l[c].fn.call(l[c].context,t,o);break;case 4:l[c].fn.call(l[c].context,t,o,s);break;default:if(!d)for(m=1,d=new Array(u-1);m<u;m++)d[m-1]=arguments[m];l[c].fn.apply(l[c].context,d)}}return!0},a.prototype.on=function(e,t,i){return r(this,e,t,i,!1)},a.prototype.once=function(e,t,i){return r(this,e,t,i,!0)},a.prototype.removeListener=function(e,t,o,s){var r=i?i+e:e;if(!this._events[r])return this;if(!t)return n(this,r),this;var a=this._events[r];if(a.fn)a.fn!==t||s&&!a.once||o&&a.context!==o||n(this,r);else{for(var d=0,c=[],l=a.length;d<l;d++)(a[d].fn!==t||s&&!a[d].once||o&&a[d].context!==o)&&c.push(a[d]);c.length?this._events[r]=1===c.length?c[0]:c:n(this,r)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=i?i+e:e,this._events[t]&&n(this,t)):(this._events=new o,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=i,a.EventEmitter=a,e.exports=a}(Sg);var Zg=Sg.exports,fg=i(Zg);const Tg=new xv("VERTC",0);class Ig extends Zg.EventEmitter{safeEmit(e){const t=this.listenerCount(e);try{for(var i=arguments.length,o=new Array(i>1?i-1:0),s=1;s<i;s++)o[s-1]=arguments[s];return super.emit(e,...o)}catch(oK){return Tg.error("safeEmit","safeEmit() | event listener threw an error [event:%s]:%o",e,oK),console.error(oK),Boolean(t)}}async asyncEmit(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];await Promise.resolve().then((()=>{try{super.emit(e,...i)}catch(oK){Tg.error("safeEmit","safeEmit() | event listener threw an error [event:%s]:%o",e,oK),console.error(oK)}}))}}var gg=(e=>(e[e.BLACK=0]="BLACK",e[e.NORMAL=1]="NORMAL",e))(gg||{});const Rg={FRAMERATE_INPUT_TOO_LOW:1001,FRAMERATE_SENT_TOO_LOW:1002,SEND_VIDEO_BITRATE_TOO_LOW:1003,RECV_VIDEO_DECODE_FAILED:1005,AUDIO_INPUT_LEVEL_TOO_LOW:2001,AUDIO_OUTPUT_LEVEL_TOO_LOW:2002,SEND_AUDIO_BITRATE_TOO_LOW:2003,FRAMERATE_INPUT_TOO_LOW_RECOVER:3001,FRAMERATE_SENT_TOO_LOW_RECOVER:3002,SEND_VIDEO_BITRATE_TOO_LOW_RECOVER:3003,RECV_VIDEO_DECODE_FAILED_RECOVER:3005,AUDIO_INPUT_LEVEL_TOO_LOW_RECOVER:4001,AUDIO_OUTPUT_LEVEL_TOO_LOW_RECOVER:4002,SEND_AUDIO_BITRATE_TOO_LOW_RECOVER:4003};var Xg=(e=>(e.streamRemovedBySchedule308="stream removed",e.clientRePublish="client republish",e.publishStreamFaied="publish failed",e.clientUnPublish="client unpublished",e.clientDisconnected="client disconnected",e.videoMuted="video muted",e))(Xg||{}),Lg=(e=>(e.PushLimitWarn="PushLimitWarn",e.OTHER="OTHER",e))(Lg||{}),Cg=(e=>(e.CHANGE_CODEC="changeCodec",e))(Cg||{}),Wg=(e=>(e.ON_ADD_STREAM="onAddStream",e.ON_ADD_STREAM_LIST="onAddStreamList",e.ON_REMOVE_STREAM="onRemoveStream",e.ON_REMOVE_STREAM_LIST="onRemoveStreamList",e.USER_DISCONNECTION="userDisconnection",e.USER_DISCONNECTION_LIST="userDisconnectionList",e.USER_CONNECTION="userConnection",e.USER_CONNECTION_LIST="userConnectionList",e.ON_UPDATE_STREAM_ATTRIBUTES="onUpdateStreamAttributes",e.ON_UPDATE_ROOM_ATTRIBUTES="onUpdateRoomAttributes",e.ON_UPDATE_USER_ATTRIBUTES="onUpdateUserAttributes",e.ON_PUSH_TRACK="onPushTrack",e.ON_REMOVE_TRACK="onRemoveTrack",e.ON_CUSTOM_MESSAGE="onCustomMessage",e.NODE_CHANGE="nodeChange",e.USER_MESSAGE_RECEIVED="userMessageReceived",e.USER_BINARY_MESSAGE_RECEIVED="userBinaryMessageReceived",e.USER_MESSAGE_RECEIVED_OUTSIDE_ROOM="userMessageReceivedOutsideRoom",e.USER_BINARY_MESSAGE_RECEIVED_OUTSIDE_ROOM="userBinaryMessageReceivedOutsideRoom",e.POST_PROCESSING_MESSAGE="postProcessingMessage",e.ON_USER_TOKEN_WILL_EXPIRE="onUserTokenWillExpire",e.ON_TOKEN_PUBLISH_PRIVILEGE_WILL_EXPIRE="onTokenPublishPrivilegeWillExpire",e.ON_TOKEN_PUBLISH_PRIVILEGE_DID_EXPIRED="onTokenPublishPrivilegeDidExpired",e.ON_TOKEN_SUBSCRIBE_PRIVILEGE_WILL_EXPIRE="onTokenSubscribePrivilegeWillExpire",e.ON_TOKEN_SUBSCRIBE_PRIVILEGE_DID_EXPIRED="onTokenSubscribePrivilegeDidExpired",e.STREAM_CONTROL_MESSAGE="streamControlMessage",e.ON_SPEAKER_CHANGE="onSpeakerChange",e.ON_STREAM_FAILED="streamFailed",e.ON_NOTIFY_RECONNECT="notifyReconnect",e.ON_FORWARD_DST_ROOM_USER_KICK="onForwardDstRoomUserKick",e.ENGINE_CONTROL_MESSAGE="engineControlMessage",e.ON_STREAM_PUSHED_BY_OTHER="onStreamPushedByOther",e.ON_STREAM_PULL_STATE_CHANGED="onStreamPullStateChanged",e))(Wg||{}),Gg=(e=>(e.RSCP="RSCP",e.RTT="RTT",e.SSC="SSC",e))(Gg||{}),Vg=(e=>(e.ON_CONNECTION_STATE_CHANGE="onConnectionStateChange",e.ON_VENDOR_CONNECTION_STATE_CHANGE="onVendorConnectionStateChange",e.ABNORMAL_DISCONNECTION="normalConnection",e.ON_RECONNECT_FAILED="onReconnectFailed",e.CONNECT_WITH_TCP="onIceConnectWithTcp",e.JOIN_ROOM_FAILED_PRIVATE_CALLBACK="joinRoomFailurePrivateCallback",e))(Vg||{}),Eg=(e=>(e.userLeave="userLeave",e.connectionLost="connectionLost",e.userDuplicateLogin="userDuplicateLogin",e.kickedByAdmin="kickedByAdmin",e.roleChanged="roleChanged",e.onUserTokenDidExpire="onUserTokenDidExpire",e))(Eg||{}),Pg=(e=>(e[e.roomDismissByAdmin=2]="roomDismissByAdmin",e))(Pg||{}),kg=(e=>(e[e.LIMIT_MODE=1]="LIMIT_MODE",e[e.NORMAL_MODE=2]="NORMAL_MODE",e))(kg||{}),xg=(e=>(e[e.NORMAL=0]="NORMAL",e[e.BLACK=1]="BLACK",e))(xg||{}),Ng=(e=>(e[e.EXTERNAL=0]="EXTERNAL",e[e.INTERNAL=1]="INTERNAL",e))(Ng||{}),Mg=(e=>(e.AUDIO="audio",e.VIDEO="video",e))(Mg||{}),Yg=(e=>(e.MAIN="main",e.SCREEN="screen",e.PUBLIC="public",e.VIRTUAL="virtual",e))(Yg||{});class wg extends Ig{constructor(e,t,i){super(),Hu(this,"trackId",Kf()),Hu(this,"_logger",void 0),Hu(this,"trackInfo",void 0),Hu(this,"_originTrack",void 0),Hu(this,"_channelCount",void 0),this._ctx=e,this._logger=new xv("Track",4,e.id),this.trackInfo=i,this._originTrack=t,this._channelCount=t.getSettings().channelCount}get dummy(){return this.trackInfo.isDummy}get virtual(){return"virtual"===this.trackInfo.streamIndex}get isScreen(){return"screen"===this.trackInfo.streamIndex}get isPublic(){return"public"===this.trackInfo.streamIndex}get sourceType(){return this.trackInfo.sourceType}get mediaType(){return this.trackInfo.mediaType}get captureSessionId(){return this.trackInfo.captureSessionId}get streamIndex(){const{streamIndex:e}=this.trackInfo;return"main"===e?em.STREAM_INDEX_MAIN:"screen"===e?em.STREAM_INDEX_SCREEN:void 0}get channelCount(){var e;return null!==(e=this._channelCount)&&void 0!==e?e:0}get originTrack(){return this._originTrack}set originTrack(e){this._originTrack=e,this._channelCount=mediaTrack.getSettings().channelCount}get logger(){return this._logger.module=this.constructor.name,this._logger}destroy(){this._originTrack.stop()}}class Kg extends wg{constructor(e,t,i){super(e,t,i),Hu(this,"_mediaTrack",void 0),Hu(this,"_preProcessingTrack",void 0),Hu(this,"isTrackReady",void 0),Hu(this,"handleTrackEnded",(()=>{this.emit("track-ended",this),this.destroy()})),Hu(this,"handleMute",(()=>{this.emit("track-mute",this)})),Hu(this,"handleUnmute",(()=>{this.emit("track-unmute",this)})),this._initListeners(),this.isTrackReady=this.generatePreProcessingTrack()}get mediaTrack(){var e;return null!==(e=this._mediaTrack)&&void 0!==e?e:this._originTrack}set mediaTrack(e){this.mediaTrack.id!==e.id&&(this._mediaTrack=e,this.isTrackReady=this.generatePreProcessingTrack())}get preprocessingTrack(){var e;return null!==(e=this._preProcessingTrack)&&void 0!==e?e:this.mediaTrack}async generatePreProcessingTrack(){var e;const t=null===(e=this._preProcessingTrack)||void 0===e?void 0:e.id;this._preProcessingTrack=void 0;try{const e=await this._ctx.extensionManager.getPreProcessingTrack(this);e instanceof MediaStreamTrack&&(this._preProcessingTrack=e,t!==this._preProcessingTrack.id&&setTimeout((()=>{this.emit("needReplaceTrack")})))}catch(i){console.error(i)}}destroy(){var e,t;this._originTrack.removeEventListener("ended",this.handleTrackEnded),this._originTrack.removeEventListener("mute",this.handleMute),this._originTrack.removeEventListener("unmute",this.handleUnmute),null===(e=this._preProcessingTrack)||void 0===e||e.stop(),null===(t=this._mediaTrack)||void 0===t||t.stop(),super.destroy()}_initListeners(){this._originTrack instanceof MediaStreamTrack&&(this._originTrack.addEventListener("ended",this.handleTrackEnded),this._originTrack.addEventListener("mute",this.handleMute),this._originTrack.addEventListener("unmute",this.handleUnmute))}}class Hg extends wg{constructor(e,t,i){super(e,t,i),Hu(this,"_mediaTrack",void 0),this._originTrack=t}get mediaTrack(){var e;return null!==(e=this._mediaTrack)&&void 0!==e?e:this._originTrack}set mediaTrack(e){this.mediaTrack.id!==e.id&&(this._mediaTrack=e)}get preprocessingTrack(){return this.mediaTrack}}var Fg=(e=>(e[e.internal=0]="internal",e[e.external=1]="external",e[e.bypass=2]="bypass",e))(Fg||{});const Jg=new Uint8Array([109,167,53,190,103,90,72,1,170,89,63,164,194,199,19,85]),Og=new Uint8Array([109,167,53,190,103,90,72,1,170,89,63,164,194,199,19,84]),Ug=new Uint8Array([31,239,3,50,242,120,76,85,169,42,161,91,75,186,22]);function Dg(e){const t=[];for(;e>=255;)e-=255,t.push(255);return t.push(e),new Uint8Array(t)}function Ag(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=0;for(;255===e[t]&&t<e.byteLength;)t++,i+=255;return t<e.byteLength&&(i+=e[t++]),[i,t]}const zg=new Uint8Array([80,1]);class jg{static generateSEI(e,t){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const o=new Uint8Array([0,0,0,1]),s=t?zg:new Uint8Array([6]),r=new Uint8Array([5]),n=jg.__uuid||(i?Jg:Og),a=Dg(e.byteLength+n.byteLength),d=(e=>{const t=[];let i=0;for(const o of e)i>=2&&o<=3&&(t.push(3),i=0),0===o?i++:i=0,t.push(o);return new Uint8Array(t)})(e);return new Uint8Array([...o,...s,...r,...a,...n,...d,128])}static decodeSEIBody(e,t){const i=(e=>{const t=[];for(let i=0;i<e.length;i++)e[i]<=3&&0===e[i-1]&&0===e[i-2]||t.push(e[i]);return new Uint8Array(t)})(e=e.slice(0,e.length-1));if(i.byteLength<2)return;let o=0;const s=t?2:1;if(5!==i[s]&&100!==i[s])return;o+=1+s;const[r,n]=Ag(i,o);o=n;let a=2;const d=o+r;i.byteLength>=Og.byteLength&&r>=Og.byteLength&&(i.slice(o,o+Og.byteLength).toString()===Og.toString()||i.slice(o,o+Ug.byteLength).toString()===Ug.toString())?(o+=Og.byteLength,a=1):i.byteLength>=Og.byteLength&&r>=Og.byteLength&&i.slice(o,o+Jg.byteLength).toString()===Jg.toString()&&(o+=Jg.byteLength,a=0);return{type:a,payload:i.slice(o,d)}}static parseInternalSEI(e){const t=new Map;let i=0;if(0===e.type){for(;e.payload.byteLength-i>=2;){const[o,s]=Ag(e.payload,i);i=s;const[r,n]=Ag(e.payload,i);if(i=n,t.get(o)||!(r<=e.payload.byteLength-i))break;t.set(o,e.payload.slice(i,i+r)),i+=r}return t}}static makeInternalSei(e){const t=[];for(const[s,r]of e){const e=Dg(s),i=Dg(r.byteLength);t.push(e,i,r)}const i=t.reduce(((e,t)=>e+t.byteLength),0),o=new Uint8Array(i);return t.reduce(((e,t)=>(o.set(t,e),e+t.byteLength)),0),o}}Hu(jg,"__uuid",void 0);var Qg=Vi,Bg=y,qg=wi,$g=RangeError,eR=String.fromCharCode,tR=String.fromCodePoint,iR=Bg([].join);Qg({target:"String",stat:!0,arity:1,forced:!!tR&&1!==tR.length},{fromCodePoint:function(e){for(var t,i=[],o=arguments.length,s=0;o>s;){if(t=+arguments[s++],qg(t,1114111)!==t)throw new $g(t+" is not a valid code point");i[s]=t<65536?eR(t):eR(55296+((t-=65536)>>10),t%1024+56320)}return iR(i,"")}});var oR=r,sR=C,rR=Object.getOwnPropertyDescriptor,nR=function(e){if(!sR)return oR[e];var t=rR(oR,e);return t&&t.value},aR=n,dR=Ke,cR=bt("iterator"),lR=!aR((function(){var e=new URL("b?a=1&b=2&c=3","https://a"),t=e.searchParams,i=new URLSearchParams("a=1&a=2&b=3"),o="";return e.pathname="c%20d",t.forEach((function(e,i){t.delete("b"),o+=i+e})),i.delete("a",2),i.delete("b",void 0),!e.toJSON||!i.has("a",1)||i.has("a",2)||!i.has("a",void 0)||i.has("b")||!t.size&&dR||!t.sort||"https://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[cR]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("https://тест").host||"#%D0%B1"!==new URL("https://a#б").hash||"a1c3"!==o||"x"!==new URL("https://x",void 0).host})),uR=ns,mR=re,hR=TypeError,pR=function(e,t){if(mR(t,e))return e;throw new hR("Incorrect invocation")},bR=vo,_R=ke,yR=O,vR=Xc,SR=bt("iterator"),ZR=function(e){if(!yR(e))return _R(e,SR)||_R(e,"@@iterator")||vR[bR(e)]},fR=V,TR=Ve,IR=ri,gR=Le,RR=ZR,XR=TypeError,LR=function(e,t){var i=arguments.length<2?RR(e):t;if(TR(i))return IR(fR(i,e));throw new XR(gR(e)+" is not iterable")},CR=TypeError,WR=function(e,t){if(e<t)throw new CR("Not enough arguments");return e},GR=Vi,VR=r,ER=nR,PR=se,kR=V,xR=y,NR=C,MR=lR,YR=ns,wR=ds,KR=function(e,t,i){for(var o in t)i&&i.unsafe&&e[o]?e[o]=t[o]:uR(e,o,t[o],i);return e},HR=Es,FR=sl,JR=zs,OR=pR,UR=X,DR=tt,AR=$t,zR=vo,jR=ri,QR=q,BR=fo,qR=Ao,$R=Y,eX=LR,tX=ZR,iX=Pl,oX=WR,sX=HI,rX=bt("iterator"),nX="URLSearchParams",aX=nX+"Iterator",dX=JR.set,cX=JR.getterFor(nX),lX=JR.getterFor(aX),uX=ER("fetch"),mX=ER("Request"),hX=ER("Headers"),pX=mX&&mX.prototype,bX=hX&&hX.prototype,_X=VR.TypeError,yX=VR.encodeURIComponent,vX=String.fromCharCode,SX=PR("String","fromCodePoint"),ZX=parseInt,fX=xR("".charAt),TX=xR([].join),IX=xR([].push),gX=xR("".replace),RX=xR([].shift),XX=xR([].splice),LX=xR("".split),CX=xR("".slice),WX=xR(/./.exec),GX=/\+/g,VX=/^[0-9a-f]+$/i,EX=function(e,t){var i=CX(e,t,t+2);return WX(VX,i)?ZX(i,16):NaN},PX=function(e){for(var t=0,i=128;i>0&&e&i;i>>=1)t++;return t},kX=function(e){var t=null;switch(e.length){case 1:t=e[0];break;case 2:t=(31&e[0])<<6|63&e[1];break;case 3:t=(15&e[0])<<12|(63&e[1])<<6|63&e[2];break;case 4:t=(7&e[0])<<18|(63&e[1])<<12|(63&e[2])<<6|63&e[3]}return t>1114111?null:t},xX=function(e){for(var t=(e=gX(e,GX," ")).length,i="",o=0;o<t;){var s=fX(e,o);if("%"===s){if("%"===fX(e,o+1)||o+3>t){i+="%",o++;continue}var r=EX(e,o+1);if(r!=r){i+=s,o++;continue}o+=2;var n=PX(r);if(0===n)s=vX(r);else{if(1===n||n>4){i+="�",o++;continue}for(var a=[r],d=1;d<n&&!(++o+3>t||"%"!==fX(e,o));){var c=EX(e,o+1);if(c!=c){o+=3;break}if(c>191||c<128)break;IX(a,c),o+=2,d++}if(a.length!==n){i+="�";continue}var l=kX(a);null===l?i+="�":s=SX(l)}}i+=s,o++}return i},NX=/[!'()~]|%20/g,MX={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},YX=function(e){return MX[e]},wX=function(e){return gX(yX(e),NX,YX)},KX=FR((function(e,t){dX(this,{type:aX,target:cX(e).entries,index:0,kind:t})}),nX,(function(){var e=lX(this),t=e.target,i=e.index++;if(!t||i>=t.length)return e.target=null,iX(void 0,!0);var o=t[i];switch(e.kind){case"keys":return iX(o.key,!1);case"values":return iX(o.value,!1)}return iX([o.key,o.value],!1)}),!0),HX=function(e){this.entries=[],this.url=null,void 0!==e&&(QR(e)?this.parseObject(e):this.parseQuery("string"==typeof e?"?"===fX(e,0)?CX(e,1):e:BR(e)))};HX.prototype={type:nX,bindURL:function(e){this.url=e,this.update()},parseObject:function(e){var t,i,o,s,r,n,a,d=this.entries,c=tX(e);if(c)for(i=(t=eX(e,c)).next;!(o=kR(i,t)).done;){if(r=(s=eX(jR(o.value))).next,(n=kR(r,s)).done||(a=kR(r,s)).done||!kR(r,s).done)throw new _X("Expected sequence with length 2");IX(d,{key:BR(n.value),value:BR(a.value)})}else for(var l in e)DR(e,l)&&IX(d,{key:l,value:BR(e[l])})},parseQuery:function(e){if(e)for(var t,i,o=this.entries,s=LX(e,"&"),r=0;r<s.length;)(t=s[r++]).length&&(i=LX(t,"="),IX(o,{key:xX(RX(i)),value:xX(TX(i,"="))}))},serialize:function(){for(var e,t=this.entries,i=[],o=0;o<t.length;)e=t[o++],IX(i,wX(e.key)+"="+wX(e.value));return TX(i,"&")},update:function(){this.entries.length=0,this.parseQuery(this.url.query)},updateURL:function(){this.url&&this.url.update()}};var FX=function(){OR(this,JX);var e=dX(this,new HX(arguments.length>0?arguments[0]:void 0));NR||(this.size=e.entries.length)},JX=FX.prototype;if(KR(JX,{append:function(e,t){var i=cX(this);oX(arguments.length,2),IX(i.entries,{key:BR(e),value:BR(t)}),NR||this.length++,i.updateURL()},delete:function(e){for(var t=cX(this),i=oX(arguments.length,1),o=t.entries,s=BR(e),r=i<2?void 0:arguments[1],n=void 0===r?r:BR(r),a=0;a<o.length;){var d=o[a];if(d.key!==s||void 0!==n&&d.value!==n)a++;else if(XX(o,a,1),void 0!==n)break}NR||(this.size=o.length),t.updateURL()},get:function(e){var t=cX(this).entries;oX(arguments.length,1);for(var i=BR(e),o=0;o<t.length;o++)if(t[o].key===i)return t[o].value;return null},getAll:function(e){var t=cX(this).entries;oX(arguments.length,1);for(var i=BR(e),o=[],s=0;s<t.length;s++)t[s].key===i&&IX(o,t[s].value);return o},has:function(e){for(var t=cX(this).entries,i=oX(arguments.length,1),o=BR(e),s=i<2?void 0:arguments[1],r=void 0===s?s:BR(s),n=0;n<t.length;){var a=t[n++];if(a.key===o&&(void 0===r||a.value===r))return!0}return!1},set:function(e,t){var i=cX(this);oX(arguments.length,1);for(var o,s=i.entries,r=!1,n=BR(e),a=BR(t),d=0;d<s.length;d++)(o=s[d]).key===n&&(r?XX(s,d--,1):(r=!0,o.value=a));r||IX(s,{key:n,value:a}),NR||(this.size=s.length),i.updateURL()},sort:function(){var e=cX(this);sX(e.entries,(function(e,t){return e.key>t.key?1:-1})),e.updateURL()},forEach:function(e){for(var t,i=cX(this).entries,o=AR(e,arguments.length>1?arguments[1]:void 0),s=0;s<i.length;)o((t=i[s++]).value,t.key,this)},keys:function(){return new KX(this,"keys")},values:function(){return new KX(this,"values")},entries:function(){return new KX(this,"entries")}},{enumerable:!0}),YR(JX,rX,JX.entries,{name:"entries"}),YR(JX,"toString",(function(){return cX(this).serialize()}),{enumerable:!0}),NR&&wR(JX,"size",{get:function(){return cX(this).entries.length},configurable:!0,enumerable:!0}),HR(FX,nX),GR({global:!0,constructor:!0,forced:!MR},{URLSearchParams:FX}),!MR&&UR(hX)){var OX=xR(bX.has),UX=xR(bX.set),DX=function(e){if(QR(e)){var t,i=e.body;if(zR(i)===nX)return t=e.headers?new hX(e.headers):new hX,OX(t,"content-type")||UX(t,"content-type","application/x-www-form-urlencoded;charset=UTF-8"),qR(e,{body:$R(0,BR(i)),headers:$R(0,t)})}return e};if(UR(uX)&&GR({global:!0,enumerable:!0,dontCallGetSet:!0,forced:!0},{fetch:function(e){return uX(e,arguments.length>1?DX(arguments[1]):{})}}),UR(mX)){var AX=function(e){return OR(this,pX),new mX(e,arguments.length>1?DX(arguments[1]):{})};pX.constructor=AX,AX.prototype=pX,GR({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:AX})}}var zX,jX={URLSearchParams:FX,getState:cX},QX=C,BX=y,qX=V,$X=n,eL=ro,tL=ss,iL=E,oL=qe,sL=J,rL=Object.assign,nL=Object.defineProperty,aL=BX([].concat),dL=!rL||$X((function(){if(QX&&1!==rL({b:1},rL(nL({},"a",{enumerable:!0,get:function(){nL(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},i=Symbol("assign detection"),o="abcdefghijklmnopqrst";return e[i]=7,o.split("").forEach((function(e){t[e]=e})),7!==rL({},e)[i]||eL(rL({},t)).join("")!==o}))?function(e,t){for(var i=oL(e),o=arguments.length,s=1,r=tL.f,n=iL.f;o>s;)for(var a,d=sL(arguments[s++]),c=r?aL(eL(d),r(d)):eL(d),l=c.length,u=0;l>u;)a=c[u++],QX&&!qX(n,d,a)||(i[a]=d[a]);return i}:rL,cL=V,lL=ri,uL=ke,mL=function(e,t,i){var o,s;lL(e);try{if(!(o=uL(e,"return"))){if("throw"===t)throw i;return i}o=cL(o,e)}catch(oK){s=!0,o=oK}if("throw"===t)throw i;if(s)throw o;return lL(o),i},hL=ri,pL=mL,bL=Xc,_L=bt("iterator"),yL=Array.prototype,vL=function(e){return void 0!==e&&(bL.Array===e||yL[_L]===e)},SL=$t,ZL=V,fL=qe,TL=function(e,t,i,o){try{return o?t(hL(i)[0],i[1]):t(i)}catch(oK){pL(e,"throw",oK)}},IL=vL,gL=hr,RL=Ji,XL=wd,LL=LR,CL=ZR,WL=Array,GL=y,VL=2147483647,EL=/[^\0-\u007E]/,PL=/[.\u3002\uFF0E\uFF61]/g,kL="Overflow: input needs wider integers to process",xL=RangeError,NL=GL(PL.exec),ML=Math.floor,YL=String.fromCharCode,wL=GL("".charCodeAt),KL=GL([].join),HL=GL([].push),FL=GL("".replace),JL=GL("".split),OL=GL("".toLowerCase),UL=function(e){return e+22+75*(e<26)},DL=function(e,t,i){var o=0;for(e=i?ML(e/700):e>>1,e+=ML(e/t);e>455;)e=ML(e/35),o+=36;return ML(o+36*e/(e+38))},AL=function(e){var t=[];e=function(e){for(var t=[],i=0,o=e.length;i<o;){var s=wL(e,i++);if(s>=55296&&s<=56319&&i<o){var r=wL(e,i++);56320==(64512&r)?HL(t,((1023&s)<<10)+(1023&r)+65536):(HL(t,s),i--)}else HL(t,s)}return t}(e);var i,o,s=e.length,r=128,n=0,a=72;for(i=0;i<e.length;i++)(o=e[i])<128&&HL(t,YL(o));var d=t.length,c=d;for(d&&HL(t,"-");c<s;){var l=VL;for(i=0;i<e.length;i++)(o=e[i])>=r&&o<l&&(l=o);var u=c+1;if(l-r>ML((VL-n)/u))throw new xL(kL);for(n+=(l-r)*u,r=l,i=0;i<e.length;i++){if((o=e[i])<r&&++n>VL)throw new xL(kL);if(o===r){for(var m=n,h=36;;){var p=h<=a?1:h>=a+26?26:h-a;if(m<p)break;var b=m-p,_=36-p;HL(t,YL(UL(p+b%_))),m=ML(b/_),h+=36}HL(t,YL(UL(m))),a=DL(n,u,c===d),n=0,c++}}n++,r++}return KL(t,"")},zL=Vi,jL=C,QL=lR,BL=r,qL=$t,$L=y,eC=ns,tC=ds,iC=pR,oC=tt,sC=dL,rC=function(e){var t=fL(e),i=gL(this),o=arguments.length,s=o>1?arguments[1]:void 0,r=void 0!==s;r&&(s=SL(s,o>2?arguments[2]:void 0));var n,a,d,c,l,u,m=CL(t),h=0;if(!m||this===WL&&IL(m))for(n=RL(t),a=i?new this(n):WL(n);n>h;h++)u=r?s(t[h],h):t[h],XL(a,h,u);else for(a=i?new this:[],l=(c=LL(t,m)).next;!(d=ZL(l,c)).done;h++)u=r?TL(c,s,[d.value,h],!0):d.value,XL(a,h,u);return a.length=h,a},nC=qo,aC=Cu.codeAt,dC=function(e){var t,i,o=[],s=JL(FL(OL(e),PL,"."),".");for(t=0;t<s.length;t++)i=s[t],HL(o,NL(EL,i)?"xn--"+AL(i):i);return KL(o,".")},cC=fo,lC=Es,uC=WR,mC=jX,hC=zs,pC=hC.set,bC=hC.getterFor("URL"),_C=mC.URLSearchParams,yC=mC.getState,vC=BL.URL,SC=BL.TypeError,ZC=BL.parseInt,fC=Math.floor,TC=Math.pow,IC=$L("".charAt),gC=$L(/./.exec),RC=$L([].join),XC=$L(1..toString),LC=$L([].pop),CC=$L([].push),WC=$L("".replace),GC=$L([].shift),VC=$L("".split),EC=$L("".slice),PC=$L("".toLowerCase),kC=$L([].unshift),xC="Invalid scheme",NC="Invalid host",MC="Invalid port",YC=/[a-z]/i,wC=/[\d+-.a-z]/i,KC=/\d/,HC=/^0x/i,FC=/^[0-7]+$/,JC=/^\d+$/,OC=/^[\da-f]+$/i,UC=/[\0\t\n\r #%/:<>?@[\\\]^|]/,DC=/[\0\t\n\r #/:<>?@[\\\]^|]/,AC=/^[\u0000-\u0020]+/,zC=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,jC=/[\t\n\r]/g,QC=function(e){var t,i,o,s;if("number"==typeof e){for(t=[],i=0;i<4;i++)kC(t,e%256),e=fC(e/256);return RC(t,".")}if("object"==typeof e){for(t="",o=function(e){for(var t=null,i=1,o=null,s=0,r=0;r<8;r++)0!==e[r]?(s>i&&(t=o,i=s),o=null,s=0):(null===o&&(o=r),++s);return s>i?o:t}(e),i=0;i<8;i++)s&&0===e[i]||(s&&(s=!1),o===i?(t+=i?":":"::",s=!0):(t+=XC(e[i],16),i<7&&(t+=":")));return"["+t+"]"}return e},BC={},qC=sC({},BC,{" ":1,'"':1,"<":1,">":1,"`":1}),$C=sC({},qC,{"#":1,"?":1,"{":1,"}":1}),eW=sC({},$C,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),tW=function(e,t){var i=aC(e,0);return i>32&&i<127&&!oC(t,e)?e:encodeURIComponent(e)},iW={ftp:21,file:null,http:80,https:443,ws:80,wss:443},oW=function(e,t){var i;return 2===e.length&&gC(YC,IC(e,0))&&(":"===(i=IC(e,1))||!t&&"|"===i)},sW=function(e){var t;return e.length>1&&oW(EC(e,0,2))&&(2===e.length||"/"===(t=IC(e,2))||"\\"===t||"?"===t||"#"===t)},rW=function(e){return"."===e||"%2e"===PC(e)},nW={},aW={},dW={},cW={},lW={},uW={},mW={},hW={},pW={},bW={},_W={},yW={},vW={},SW={},ZW={},fW={},TW={},IW={},gW={},RW={},XW={},LW=function(e,t,i){var o,s,r,n=cC(e);if(t){if(s=this.parse(n))throw new SC(s);this.searchParams=null}else{if(void 0!==i&&(o=new LW(i,!0)),s=this.parse(n,null,o))throw new SC(s);(r=yC(new _C)).bindURL(this),this.searchParams=r}};LW.prototype={type:"URL",parse:function(e,t,i){var o,s,r,n,a,d=this,c=t||nW,l=0,u="",m=!1,h=!1,p=!1;for(e=cC(e),t||(d.scheme="",d.username="",d.password="",d.host=null,d.port=null,d.path=[],d.query=null,d.fragment=null,d.cannotBeABaseURL=!1,e=WC(e,AC,""),e=WC(e,zC,"$1")),e=WC(e,jC,""),o=rC(e);l<=o.length;){switch(s=o[l],c){case nW:if(!s||!gC(YC,s)){if(t)return xC;c=dW;continue}u+=PC(s),c=aW;break;case aW:if(s&&(gC(wC,s)||"+"===s||"-"===s||"."===s))u+=PC(s);else{if(":"!==s){if(t)return xC;u="",c=dW,l=0;continue}if(t&&(d.isSpecial()!==oC(iW,u)||"file"===u&&(d.includesCredentials()||null!==d.port)||"file"===d.scheme&&!d.host))return;if(d.scheme=u,t)return void(d.isSpecial()&&iW[d.scheme]===d.port&&(d.port=null));u="","file"===d.scheme?c=SW:d.isSpecial()&&i&&i.scheme===d.scheme?c=cW:d.isSpecial()?c=hW:"/"===o[l+1]?(c=lW,l++):(d.cannotBeABaseURL=!0,CC(d.path,""),c=gW)}break;case dW:if(!i||i.cannotBeABaseURL&&"#"!==s)return xC;if(i.cannotBeABaseURL&&"#"===s){d.scheme=i.scheme,d.path=nC(i.path),d.query=i.query,d.fragment="",d.cannotBeABaseURL=!0,c=XW;break}c="file"===i.scheme?SW:uW;continue;case cW:if("/"!==s||"/"!==o[l+1]){c=uW;continue}c=pW,l++;break;case lW:if("/"===s){c=bW;break}c=IW;continue;case uW:if(d.scheme=i.scheme,s===zX)d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=nC(i.path),d.query=i.query;else if("/"===s||"\\"===s&&d.isSpecial())c=mW;else if("?"===s)d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=nC(i.path),d.query="",c=RW;else{if("#"!==s){d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=nC(i.path),d.path.length--,c=IW;continue}d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,d.path=nC(i.path),d.query=i.query,d.fragment="",c=XW}break;case mW:if(!d.isSpecial()||"/"!==s&&"\\"!==s){if("/"!==s){d.username=i.username,d.password=i.password,d.host=i.host,d.port=i.port,c=IW;continue}c=bW}else c=pW;break;case hW:if(c=pW,"/"!==s||"/"!==IC(u,l+1))continue;l++;break;case pW:if("/"!==s&&"\\"!==s){c=bW;continue}break;case bW:if("@"===s){m&&(u="%40"+u),m=!0,r=rC(u);for(var b=0;b<r.length;b++){var _=r[b];if(":"!==_||p){var y=tW(_,eW);p?d.password+=y:d.username+=y}else p=!0}u=""}else if(s===zX||"/"===s||"?"===s||"#"===s||"\\"===s&&d.isSpecial()){if(m&&""===u)return"Invalid authority";l-=rC(u).length+1,u="",c=_W}else u+=s;break;case _W:case yW:if(t&&"file"===d.scheme){c=fW;continue}if(":"!==s||h){if(s===zX||"/"===s||"?"===s||"#"===s||"\\"===s&&d.isSpecial()){if(d.isSpecial()&&""===u)return NC;if(t&&""===u&&(d.includesCredentials()||null!==d.port))return;if(n=d.parseHost(u))return n;if(u="",c=TW,t)return;continue}"["===s?h=!0:"]"===s&&(h=!1),u+=s}else{if(""===u)return NC;if(n=d.parseHost(u))return n;if(u="",c=vW,t===yW)return}break;case vW:if(!gC(KC,s)){if(s===zX||"/"===s||"?"===s||"#"===s||"\\"===s&&d.isSpecial()||t){if(""!==u){var v=ZC(u,10);if(v>65535)return MC;d.port=d.isSpecial()&&v===iW[d.scheme]?null:v,u=""}if(t)return;c=TW;continue}return MC}u+=s;break;case SW:if(d.scheme="file","/"===s||"\\"===s)c=ZW;else{if(!i||"file"!==i.scheme){c=IW;continue}switch(s){case zX:d.host=i.host,d.path=nC(i.path),d.query=i.query;break;case"?":d.host=i.host,d.path=nC(i.path),d.query="",c=RW;break;case"#":d.host=i.host,d.path=nC(i.path),d.query=i.query,d.fragment="",c=XW;break;default:sW(RC(nC(o,l),""))||(d.host=i.host,d.path=nC(i.path),d.shortenPath()),c=IW;continue}}break;case ZW:if("/"===s||"\\"===s){c=fW;break}i&&"file"===i.scheme&&!sW(RC(nC(o,l),""))&&(oW(i.path[0],!0)?CC(d.path,i.path[0]):d.host=i.host),c=IW;continue;case fW:if(s===zX||"/"===s||"\\"===s||"?"===s||"#"===s){if(!t&&oW(u))c=IW;else if(""===u){if(d.host="",t)return;c=TW}else{if(n=d.parseHost(u))return n;if("localhost"===d.host&&(d.host=""),t)return;u="",c=TW}continue}u+=s;break;case TW:if(d.isSpecial()){if(c=IW,"/"!==s&&"\\"!==s)continue}else if(t||"?"!==s)if(t||"#"!==s){if(s!==zX&&(c=IW,"/"!==s))continue}else d.fragment="",c=XW;else d.query="",c=RW;break;case IW:if(s===zX||"/"===s||"\\"===s&&d.isSpecial()||!t&&("?"===s||"#"===s)){if(".."===(a=PC(a=u))||"%2e."===a||".%2e"===a||"%2e%2e"===a?(d.shortenPath(),"/"===s||"\\"===s&&d.isSpecial()||CC(d.path,"")):rW(u)?"/"===s||"\\"===s&&d.isSpecial()||CC(d.path,""):("file"===d.scheme&&!d.path.length&&oW(u)&&(d.host&&(d.host=""),u=IC(u,0)+":"),CC(d.path,u)),u="","file"===d.scheme&&(s===zX||"?"===s||"#"===s))for(;d.path.length>1&&""===d.path[0];)GC(d.path);"?"===s?(d.query="",c=RW):"#"===s&&(d.fragment="",c=XW)}else u+=tW(s,$C);break;case gW:"?"===s?(d.query="",c=RW):"#"===s?(d.fragment="",c=XW):s!==zX&&(d.path[0]+=tW(s,BC));break;case RW:t||"#"!==s?s!==zX&&("'"===s&&d.isSpecial()?d.query+="%27":d.query+="#"===s?"%23":tW(s,BC)):(d.fragment="",c=XW);break;case XW:s!==zX&&(d.fragment+=tW(s,qC))}l++}},parseHost:function(e){var t,i,o;if("["===IC(e,0)){if("]"!==IC(e,e.length-1))return NC;if(t=function(e){var t,i,o,s,r,n,a,d=[0,0,0,0,0,0,0,0],c=0,l=null,u=0,m=function(){return IC(e,u)};if(":"===m()){if(":"!==IC(e,1))return;u+=2,l=++c}for(;m();){if(8===c)return;if(":"!==m()){for(t=i=0;i<4&&gC(OC,m());)t=16*t+ZC(m(),16),u++,i++;if("."===m()){if(0===i)return;if(u-=i,c>6)return;for(o=0;m();){if(s=null,o>0){if(!("."===m()&&o<4))return;u++}if(!gC(KC,m()))return;for(;gC(KC,m());){if(r=ZC(m(),10),null===s)s=r;else{if(0===s)return;s=10*s+r}if(s>255)return;u++}d[c]=256*d[c]+s,2!=++o&&4!==o||c++}if(4!==o)return;break}if(":"===m()){if(u++,!m())return}else if(m())return;d[c++]=t}else{if(null!==l)return;u++,l=++c}}if(null!==l)for(n=c-l,c=7;0!==c&&n>0;)a=d[c],d[c--]=d[l+n-1],d[l+--n]=a;else if(8!==c)return;return d}(EC(e,1,-1)),!t)return NC;this.host=t}else if(this.isSpecial()){if(e=dC(e),gC(UC,e))return NC;if(t=function(e){var t,i,o,s,r,n,a,d=VC(e,".");if(d.length&&""===d[d.length-1]&&d.length--,(t=d.length)>4)return e;for(i=[],o=0;o<t;o++){if(""===(s=d[o]))return e;if(r=10,s.length>1&&"0"===IC(s,0)&&(r=gC(HC,s)?16:8,s=EC(s,8===r?1:2)),""===s)n=0;else{if(!gC(10===r?JC:8===r?FC:OC,s))return e;n=ZC(s,r)}CC(i,n)}for(o=0;o<t;o++)if(n=i[o],o===t-1){if(n>=TC(256,5-t))return null}else if(n>255)return null;for(a=LC(i),o=0;o<i.length;o++)a+=i[o]*TC(256,3-o);return a}(e),null===t)return NC;this.host=t}else{if(gC(DC,e))return NC;for(t="",i=rC(e),o=0;o<i.length;o++)t+=tW(i[o],BC);this.host=t}},cannotHaveUsernamePasswordPort:function(){return!this.host||this.cannotBeABaseURL||"file"===this.scheme},includesCredentials:function(){return""!==this.username||""!==this.password},isSpecial:function(){return oC(iW,this.scheme)},shortenPath:function(){var e=this.path,t=e.length;!t||"file"===this.scheme&&1===t&&oW(e[0],!0)||e.length--},serialize:function(){var e=this,t=e.scheme,i=e.username,o=e.password,s=e.host,r=e.port,n=e.path,a=e.query,d=e.fragment,c=t+":";return null!==s?(c+="//",e.includesCredentials()&&(c+=i+(o?":"+o:"")+"@"),c+=QC(s),null!==r&&(c+=":"+r)):"file"===t&&(c+="//"),c+=e.cannotBeABaseURL?n[0]:n.length?"/"+RC(n,"/"):"",null!==a&&(c+="?"+a),null!==d&&(c+="#"+d),c},setHref:function(e){var t=this.parse(e);if(t)throw new SC(t);this.searchParams.update()},getOrigin:function(){var e=this.scheme,t=this.port;if("blob"===e)try{return new CW(e.path[0]).origin}catch(oK){return"null"}return"file"!==e&&this.isSpecial()?e+"://"+QC(this.host)+(null!==t?":"+t:""):"null"},getProtocol:function(){return this.scheme+":"},setProtocol:function(e){this.parse(cC(e)+":",nW)},getUsername:function(){return this.username},setUsername:function(e){var t=rC(cC(e));if(!this.cannotHaveUsernamePasswordPort()){this.username="";for(var i=0;i<t.length;i++)this.username+=tW(t[i],eW)}},getPassword:function(){return this.password},setPassword:function(e){var t=rC(cC(e));if(!this.cannotHaveUsernamePasswordPort()){this.password="";for(var i=0;i<t.length;i++)this.password+=tW(t[i],eW)}},getHost:function(){var e=this.host,t=this.port;return null===e?"":null===t?QC(e):QC(e)+":"+t},setHost:function(e){this.cannotBeABaseURL||this.parse(e,_W)},getHostname:function(){var e=this.host;return null===e?"":QC(e)},setHostname:function(e){this.cannotBeABaseURL||this.parse(e,yW)},getPort:function(){var e=this.port;return null===e?"":cC(e)},setPort:function(e){this.cannotHaveUsernamePasswordPort()||(""===(e=cC(e))?this.port=null:this.parse(e,vW))},getPathname:function(){var e=this.path;return this.cannotBeABaseURL?e[0]:e.length?"/"+RC(e,"/"):""},setPathname:function(e){this.cannotBeABaseURL||(this.path=[],this.parse(e,TW))},getSearch:function(){var e=this.query;return e?"?"+e:""},setSearch:function(e){""===(e=cC(e))?this.query=null:("?"===IC(e,0)&&(e=EC(e,1)),this.query="",this.parse(e,RW)),this.searchParams.update()},getSearchParams:function(){return this.searchParams.facade},getHash:function(){var e=this.fragment;return e?"#"+e:""},setHash:function(e){""!==(e=cC(e))?("#"===IC(e,0)&&(e=EC(e,1)),this.fragment="",this.parse(e,XW)):this.fragment=null},update:function(){this.query=this.searchParams.serialize()||null}};var CW=function(e){var t=iC(this,WW),i=uC(arguments.length,1)>1?arguments[1]:void 0,o=pC(t,new LW(e,!1,i));jL||(t.href=o.serialize(),t.origin=o.getOrigin(),t.protocol=o.getProtocol(),t.username=o.getUsername(),t.password=o.getPassword(),t.host=o.getHost(),t.hostname=o.getHostname(),t.port=o.getPort(),t.pathname=o.getPathname(),t.search=o.getSearch(),t.searchParams=o.getSearchParams(),t.hash=o.getHash())},WW=CW.prototype,GW=function(e,t){return{get:function(){return bC(this)[e]()},set:t&&function(e){return bC(this)[t](e)},configurable:!0,enumerable:!0}};if(jL&&(tC(WW,"href",GW("serialize","setHref")),tC(WW,"origin",GW("getOrigin")),tC(WW,"protocol",GW("getProtocol","setProtocol")),tC(WW,"username",GW("getUsername","setUsername")),tC(WW,"password",GW("getPassword","setPassword")),tC(WW,"host",GW("getHost","setHost")),tC(WW,"hostname",GW("getHostname","setHostname")),tC(WW,"port",GW("getPort","setPort")),tC(WW,"pathname",GW("getPathname","setPathname")),tC(WW,"search",GW("getSearch","setSearch")),tC(WW,"searchParams",GW("getSearchParams")),tC(WW,"hash",GW("getHash","setHash"))),eC(WW,"toJSON",(function(){return bC(this).serialize()}),{enumerable:!0}),eC(WW,"toString",(function(){return bC(this).serialize()}),{enumerable:!0}),vC){var VW=vC.createObjectURL,EW=vC.revokeObjectURL;VW&&eC(CW,"createObjectURL",qL(VW,vC)),EW&&eC(CW,"revokeObjectURL",qL(EW,vC))}lC(CW,"URL"),zL({global:!0,constructor:!0,forced:!QL,sham:!jL},{URL:CW});var PW=Vi,kW=n,xW=WR,NW=fo,MW=lR,YW=se("URL"),wW=MW&&kW((function(){YW.canParse()})),KW=kW((function(){return 1!==YW.canParse.length}));PW({target:"URL",stat:!0,forced:!wW||KW},{canParse:function(e){var t=xW(arguments.length,1),i=NW(e),o=t<2||void 0===arguments[1]?void 0:NW(arguments[1]);try{return!!new YW(i,o)}catch(oK){return!1}}});var HW=Vi,FW=WR,JW=fo,OW=lR,UW=se("URL");HW({target:"URL",stat:!0,forced:!OW},{parse:function(e){var t=FW(arguments.length,1),i=JW(e),o=t<2||void 0===arguments[1]?void 0:JW(arguments[1]);try{return new UW(i,o)}catch(oK){return null}}});var DW=i($.URL);function AW(e){const t=PressureObserver.supportedSources;let i="thermal";i=null!=t&&t.includes("thermal")?"thermal":"cpu";const o=new PressureObserver((t=>{t.forEach((t=>{t.source===i&&e(t.state)}))}));return o.observe(i,{sampleInterval:2e3}),o}var zW=new class{constructor(){Hu(this,"_state",void 0),Hu(this,"_handler",!1)}init(){if(bZ&&!WZ("DISABLE_COMPUTE_PRESSURE")&&"UT"!=={}.VITE_TEST)try{if(_Z()){const e=new Blob(["(".concat(AW.toString(),")(self.postMessage)")],{type:"text/javascript"}),t=new Worker(DW.createObjectURL(e));t.onmessage=e=>{this._state=e.data},this._handler=t}else this._handler=AW((e=>{this._state=e}))}catch(e){}}get state(){return rT&&!np()&&(window.thermal_status=this._state),this._handler||this.init(),this._state}};const jW=["codec","inbound-rtp","outbound-rtp","remote-inbound-rtp","remote-outbound-rtp","media-source","csrc","peer-connection","data-channel","stream","track","transceiver","sender","receiver","transport","sctp-transport","candidate-pair","local-candidate","remote-candidate","certificate","ice-server"],QW=new Map;let BW=!0;const qW=async e=>new Promise((t=>{const i={all:[],getTrackStats:()=>[]},o=WZ("STATS_SCALLBACK_SUPPORT");if(BW&&Hv&&void 0===window.InstallTrigger&&uZ&&o)try{var s,r,n;null===(s=e.getStats((e=>{const i=[];e.result().forEach((e=>{if(jW.includes(e.type))return;const t={};e.names().forEach((function(i){t[i]=e.stat(i)})),i.push(Ju(Ju({},t),{},{id:e.id,type:e.type,timestamp:e.timestamp}))})),t({all:i,getTrackStats:e=>i.filter((t=>"ssrc"!==t.type||t.googTrackId===e))})})))||void 0===s||null===(r=s.then)||void 0===r||null===(r=r.call(s,(()=>{t(i)})))||void 0===r||null===(n=r.catch)||void 0===n||n.call(r,(()=>{BW=!1,t(i)}))}catch(a){BW=!1,t(i)}else t(i)})),$W=async e=>{var t;const i=await e.getStats(),o={all:[]},s=new Map;i.forEach((e=>{const t=s.get(e.type)||new Map;t.set(e.id,e),s.set(e.type,t),o.all.push(e)}));const r=(e,t)=>{e.forEach((e=>{var i,o,r,n;let a,d,{codecId:c,transportId:l,trackId:u,playoutId:m}=e;if(null===(i=s.get("codec"))||void 0===i||i.forEach((e=>{e.id===c&&t.add(e)})),null===(o=s.get("transport"))||void 0===o||o.forEach((e=>{e.id===l&&(a=e,t.add(e))})),null===(r=s.get("track"))||void 0===r||r.forEach((e=>{e.id===u&&t.add(e)})),null===(n=s.get("media-playout"))||void 0===n||n.forEach((e=>{e.id===m&&t.add(e)})),a){var h,p;const{localCertificateId:e,remoteCertificateId:i,selectedCandidatePairId:o}=a;null===(h=s.get("certificate"))||void 0===h||h.forEach((o=>{(o.id===e||o.id===i)&&t.add(o)})),null===(p=s.get("candidate-pair"))||void 0===p||p.forEach((e=>{e.id===o&&(d=e,t.add(e))}))}if(d){var b,_;const{localCandidateId:e,remoteCandidateId:i}=d;null===(b=s.get("local-candidate"))||void 0===b||b.forEach((i=>{i.id===e&&t.add(i)})),null===(_=s.get("remote-candidate"))||void 0===_||_.forEach((e=>{e.id===i&&t.add(e)}))}}))};var n;if(s.get("media-source"))null===(n=s.get("media-source"))||void 0===n||n.forEach((e=>{var t;const i=new Set;i.add(e);const n=[];null===(t=s.get("outbound-rtp"))||void 0===t||t.forEach((t=>{var o;t.mediaSourceId===e.id&&(i.add(t),n.push(t),null===(o=s.get("remote-inbound-rtp"))||void 0===o||o.forEach((e=>{e.localId===t.id&&i.add(e)})))})),r(n,i),o[e.trackIdentifier]=Array.from(i)}));else if(s.get("track")){var a;null===(a=s.get("track"))||void 0===a||a.forEach((e=>{var t;const i=new Set;i.add(e);const n=[];null===(t=s.get("outbound-rtp"))||void 0===t||t.forEach((t=>{var o;t.trackId===e.id&&(i.add(t),n.push(t),null===(o=s.get("remote-inbound-rtp"))||void 0===o||o.forEach((e=>{e.localId===t.id&&i.add(e)})))})),r(n,i),o[e.trackIdentifier]=Array.from(i)}))}return null===(t=s.get("inbound-rtp"))||void 0===t||t.forEach((e=>{var t;const i=new Set;i.add(e),null===(t=s.get("remote-outbound-rtp"))||void 0===t||t.forEach((t=>{t.localId===e.id&&i.add(t)})),r([e],i);let{trackIdentifier:n}=e;var a;n||(null===(a=s.get("track"))||void 0===a||a.forEach((t=>{t.id===e.trackId&&(n=t.trackIdentifier)})));o[n]=Array.from(i)})),o};class eG extends Ig{constructor(){super(...arguments),Hu(this,"resultStorage",new Map),Hu(this,"_continuousVideoEncodeFailure",0),Hu(this,"_remoteStreamDecodeStatus",new Map)}setLocalAudioStats(e){this.record("AUDIO_INPUT_LEVEL_TOO_LOW",this.checkAudioInputLevel(e)),this.record("SEND_AUDIO_BITRATE_TOO_LOW",this.checkSendAudioBitrate(e))}setLocalVideoStats(e,t){this.record("SEND_VIDEO_BITRATE_TOO_LOW",this.checkSendVideoBitrate(e)),this.record("FRAMERATE_SENT_TOO_LOW",this.checkFramerateSent(e)),this.record("FRAMERATE_INPUT_TOO_LOW",this.checkFramerateInput(e,t)),this.checkVideoEncodeFailure(e,t)}setRemoteAudioStats(e){this.record("AUDIO_OUTPUT_LEVEL_TOO_LOW",this.checkAudioOutputLevel(e))}setRemoteVideoStats(e,t){this.record("RECV_VIDEO_DECODE_FAILED",this.checkVideoDecode(e)),this.checkVideoDecodeFailure(e,t)}destroy(){this._continuousVideoEncodeFailure=0,this._remoteStreamDecodeStatus=new Map,this.resultStorage=new Map}record(e,t){this.resultStorage.has(e)||this.resultStorage.set(e,{result:[],isPrevNormal:!0});const i=this.resultStorage.get(e);if(i&&(i.result.push(t),i.result.length>=5)){const t=i.result.includes(!0);i.isPrevNormal&&!t&&this.emit("stats-exception",{exception:e,code:Rg[e]}),!i.isPrevNormal&&t&&this.emit("stats-exception",{exception:e+"_RECOVER",code:Rg[e]+2e3}),i.isPrevNormal=t,i.result=[]}}checkAudioOutputLevel(e){let t=e.receivedKBitrate,i=e.volume;return void 0!==window.__byte_receiveBitrate__&&(e.receivedKBitrate=window.__byte_receiveBitrate__),void 0!==window.__byte_receiveLevel__&&(i=window.__byte_receiveLevel__),!(t>0&&0===i)}checkVideoDecode(e){let t=e.receivedKBitrate,i=e.decoderOutputFrameRate;return void 0!==window.__byte_video_receiveBitrate__&&(t=window.__byte_video_receiveBitrate__),void 0!==window.__byte_decodeFrameRate__&&(i=window.__byte_decodeFrameRate__),0===t||0!==i}checkAudioInputLevel(e){let t=e._sendVolumeLevel;return void 0!==window.__byte_audio_input_level__&&(t=window.__byte_audio_input_level__),t>=5}checkSendAudioBitrate(e){let t=e.sendKBitrate;return void 0!==window.__byte_audio_sendBitrate__&&(t=window.__byte_audio_sendBitrate__),0!==t}checkFramerateInput(e,t){let i=t.getSettings().frameRate,o=e.frame_rate_input;if(void 0!==window.__byte_setFramerate__&&(i=window.__byte_setFramerate__),void 0!==window.__byte_frame_rate_input__&&(o=window.__byte_frame_rate_input__),!i||!o)return!0;if(e.is_screen){if(o<1)return!1}else if(i>10&&o<5||i<10&&i>=5&&o<=1)return!1;return!0}checkFramerateSent(e){void 0!==window.__byte_frame_rate_input__&&(e.frame_rate_input=window.__byte_frame_rate_input__),void 0!==window.__byte_frame_rate_sent__&&(e.frame_rate_sent=window.__byte_frame_rate_sent__);const t=e.frame_rate_input,i=e.frame_rate_sent;return!(t&&i&&t>5&&i<=1)}checkSendVideoBitrate(e){let t=e.sendKBitrate;return void 0!==window.__byte_video_sendBitrate__&&(t=window.__byte_video_sendBitrate__),0!==t}checkVideoEncodeFailure(e,t){const i=e.frame_rate_input;window.__createEncodeError__&&(e.frame_rate_sent=0,e.frame_rate_encoded=0);const o=e.frame_rate_sent,s=e.frame_rate_encoded,r=void 0!==i&&i>0&&void 0!==s&&0===s&&void 0!==o&&0===o,n=null!=e&&e.is_screen?10:5;var a;r?(this._continuousVideoEncodeFailure++,this._continuousVideoEncodeFailure>n&&(this.emit("rtc-encode-error",{codec:null==e?void 0:e.codecName,media_type:"video",track_frame_size_width:null==t?void 0:t.getSettings().width,track_frame_size_height:null==t?void 0:t.getSettings().height,track_frame_rate:null==t?void 0:t.getSettings().frameRate,stats_frame_size_width:null==e?void 0:e.frame_size_width,stats_frame_size_height:null==e?void 0:e.frame_size_height,stats_frame_rate_input:null==e?void 0:e.frame_rate_input,stats_frame_rate_sent:null==e?void 0:e.frame_rate_sent,stats_frame_rate_encoded:null==e?void 0:e.frame_rate_encoded,stats_frame_encoder_name:e.encoder_implementation,stats_is_hardware_encoder_enabled:XZ.H264_HW_ENCODER,stats_gpu_url:XZ.GPU_URL||(null===(a=lT())||void 0===a?void 0:a.renderer),is_screen:null==e?void 0:e.is_screen}),this._continuousVideoEncodeFailure=0)):this._continuousVideoEncodeFailure=0}checkVideoDecodeFailure(e,t){const i=e.stream_id;if(this._remoteStreamDecodeStatus.has(i)){const s=this._remoteStreamDecodeStatus.get(i),r=0===e.frame_rate_decoded&&e.packetsReceived>s.packets_received&&e.framesDecoded<10;var o;if(s.packets_received=e.packetsReceived,s.frames_decoded=e.framesDecoded,s.frame_rate_decoded=e.frame_rate_decoded,s.continuous_video_decode_failure=r?s.continuous_video_decode_failure+1:0,s.continuous_video_decode_failure>5)this.emit("rtc-decode-error",{codec:e.codecName,media_type:"video",track_frame_size_width:t.getSettings().width,track_frame_size_height:t.getSettings().height,track_frame_rate:t.getSettings().frameRate,stats_frame_size_width:e.frame_size_width,stats_frame_size_height:e.frame_size_height,stats_frame_rate_decode:e.frame_rate_decoded,stats_frame_rate_receive:e.frame_rate_received,stats_frame_decoder_name:e.decoder_name,stats_gpu_url:XZ.GPU_URL||(null===(o=lT())||void 0===o?void 0:o.renderer),is_screen:e.is_screen}),s.continuous_video_decode_failure=0}else this._remoteStreamDecodeStatus.set(i,{packets_received:e.packetsReceived,frames_decoded:e.framesDecoded,frame_rate_decoded:e.frame_rate_decoded,continuous_video_decode_failure:0})}}class tG extends Ig{constructor(e){super(),Hu(this,"_timer",void 0),Hu(this,"_reportTimer",void 0),Hu(this,"handler",void 0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_destroyed",!1),Hu(this,"_isReportStarted",!1),this._context=e,this._monitor=mv(e.id),this.logger=new xv("Stats",3,e.id)}setVar(e){this.handler=e}stopReport(e){this._isReportStarted&&(this.logger.info("stopReport","invoke"),this._isReportStarted=!1,clearTimeout(this._reportTimer),delete this._reportTimer,vv(this._context.id,"del_media_statistics_timer","reason: ".concat(e,", stack: ").concat((new Error).stack),0,this._stream.streamId||""),this._destroyed=!0)}filterIllegal(e){const t={};return Object.keys(e).forEach((i=>{null===e[i]||void 0===e[i]||Number.isNaN(e[i])||(t[i]=e[i])})),t}destroy(){this.logger.info("destroy","invoke"),vv(this._context.id,"media_statistics_destroy","".concat((new Error).stack),0,"".concat(this._stream.streamId)),this.stopReport("destroy"),clearTimeout(this._timer),this._destroyed=!0}}class iG extends tG{constructor(e,t){super(e),Hu(this,"_stats",{audioStats:{},videoStats:{}}),Hu(this,"_preReports",{audio:{},video:{}}),Hu(this,"statsMonitor",void 0),this._stream=t,this.statsMonitor=new eG,this.statsMonitor.on("stats-exception",(e=>{this.emit("stats-exception",e)})),this.statsMonitor.on("rtc-encode-error",(e=>{var t;this.logger.info("rtc_encode_error",JSON.stringify(e)),null===(t=this._monitor)||void 0===t||t.report("rtc_encode_error",e)}));const i=async()=>{this._stats=await this._getLocalStats(this._stream,this._preReports,!1),this._destroyed||(this._timer=setTimeout(i,WZ("STATS_LOOP_INTERVAL")))};i()}setLocalStreamStatsEvtInterval(e,t){if(this._isReportStarted)return;this.logger.info("setLocalStreamStatsEvtInterval","invoke"),this._isReportStarted=!0,this.setVar(t),this._destroyed=!1;const i={audio:{},video:{}},o=async()=>{const t=await this._getLocalStats(this._stream,i,!0);e(t),this._destroyed||(this._reportTimer=setTimeout(o,2e3))};o()}getLocalStats(){return this._stats}async _getLocalStats(e,t,i){var o,s,r,n,a,d,c;const l=void 0!==(null===(o=e.audioTrack)||void 0===o?void 0:o.mixType)&&e.audioTrack.mixType!==km.PLAYOUT?null!==(s=null===(r=e.audioTrack)||void 0===r?void 0:r.mixedAudioTrack)&&void 0!==s?s:null===(n=e.audioTrack)||void 0===n?void 0:n.preprocessingTrack:null===(a=e.audioTrack)||void 0===a?void 0:a.preprocessingTrack,u=null===(d=e.videoTrack)||void 0===d?void 0:d.preprocessingTrack;var m;0===Object.keys(t.audio).length&&0===Object.keys(t.video).length&&(await this.getAudioStats(l,t,null===(m=e.audioTrack)||void 0===m?void 0:m.getAudioLevel(),i),await this.getVideoStats(u,t,i),await Of(150));return{audioStats:await this.getAudioStats(l,t,null===(c=e.audioTrack)||void 0===c?void 0:c.getAudioLevel(),i),videoStats:await this.getVideoStats(u,t,i),isScreen:e.isScreen}}async getAudioStats(e,t,i,o){var s,r,n;const a={},d={timestamp:Date.now()},{streamId:c,audioMid:l,isScreen:u,pubAttributes:m,pubAudio:h,audioTrack:p}=this._stream,b={media_type:"audio",is_screen:!!u,direction:"up",stream_id:c,vid:l,connection_status:navigator.onLine,track_enabled:null==e?void 0:e.enabled,capture_state:m.localaudio?"capture_state_on":"capture_state_off",mute_state:h?"mute_state_off":"mute_state_on",thermal_status:zW.state,is_public_stream:this._stream.isPublicStream};if(p&&(b.playback_volume=p.getVolume()),!e||!this.handler)return a;const _=await(null===(s=this.handler.peer)||void 0===s?void 0:s.getStatsWithLowFrequency(e,!1,null===(r=this._stream.audioTransceiver)||void 0===r?void 0:r.sender));if(!_.length)return a;if(_.forEach((e=>{let{type:t,packetsSent:i,packetsLost:o,bytesSent:s,clockRate:r,roundTripTime:n,channels:c,audioLevel:l,mimeType:u,availableIncomingBitrate:m,availableOutgoingBitrate:h,bytesReceived:p,nominated:_,id:y,currentRoundTripTime:v,state:S,writable:Z,requestsReceived:f,responsesReceived:T,requestsSent:I,consentRequestsSent:g,responsesSent:R,jitter:X,candidateType:L,ip:C,address:W,networkType:G,port:V,protocol:E,nackCount:P,retransmittedBytesSent:k,retransmittedPacketsSent:x,audioInputLevel:N,ssrc:M,totalAudioEnergy:Y,totalSamplesDuration:w,mediaType:K,fractionLost:H}=e;"outbound-rtp"===t?(d.packetsSent=i,d.bytesSent=s,b.bytes=s,b.packetsSent=i,b.nackCount=P,b.ssrc=M,b.retransmitted_bytes_sent=k,b.retransmitted_packets_sent=x,d.retransmittedBytesSent=k,d.retransmittedPacketsSent=x):"remote-inbound-rtp"===t?(d.packetsLost=o,b.packetsLost=o,b.net_jitter=1e3*X,a.rtt=1e3*n,b.rtt=a.rtt,a._fractionLost=H||0):"codec"===t?(a.recordSampleRate=r,a.numChannels=c,b.codecName=u):"media-source"===t&&void 0!==l?(b.audio_level=l?-10*Math.log10(Math.pow(l,2)):l,b.volume=255*l,b.total_audio_energy=Y,b.totalInputDuration=w,b.send_level||(b.send_level=l)):"ssrc"===t&&"audio"===K?N&&(b.send_level=N):"candidate-pair"===t?(b.ice_available_incoming_bitrate=m,b.ice_available_outgoing_bitrate=h,b.ice_bytes_received=p,b.ice_bytes_sent=s,b.ice_nominated=Number(_),b.ice_pair_id=y,b.ice_pair_rtt=v,b.ice_pair_state=S,b.ice_pair_writable=Z,b.recv_ping_requests=f,b.recv_ping_responses=T,b.sent_ping_requests_before_first_response=I,b.sent_ping_requests_total=I+(g||0),b.sent_ping_responses=R):"local-candidate"===t?(b.local_candidate_type=L,b.local_ip=C||W,b.local_network_type=G,b.local_port=V,b.protocol=E):"remote-candidate"===t&&(b.remote_candidate_type=L,b.remote_ip=C||W,b.remote_port=V)})),b.send_level)b.send_level<1?b._sendVolumeLevel=32767*b.send_level:b._sendVolumeLevel=b.send_level;else{const e=(null==p?void 0:p.getAudioLevel())||0;b._sendVolumeLevel=Math.round(e/255*32767)}void 0===b.volume&&void 0!==i&&(b.volume=i,b.audio_level=i?-10*Math.log10(Math.pow(i/255,2)):i);const{audio:y}=t;if(!y.timestamp)return t.audio=d,this.filterIllegal(a);var v;(void 0!==d.packetsLost&&(a.audioLossRate=Math.max(0,d.packetsLost-y.packetsLost)/(d.packetsSent-y.packetsSent),a.audioLossRate=Number.isNaN(a.audioLossRate)?0:a.audioLossRate,b.fraction_lost=a.audioLossRate),a.statsInterval=d.timestamp-y.timestamp,b.stats_interval=a.statsInterval,a.sendKBitrate=(d.bytesSent-y.bytesSent||0)/a.statsInterval*8,b.mediaBitratebps=Math.round(1e3*a.sendKBitrate),b.sendKBitrate=a.sendKBitrate,b.bandwidth=Math.round(b.mediaBitratebps/1024),void 0!==d.retransmittedBytesSent&&(b.retransmitBitratebps=(d.retransmittedBytesSent-y.retransmittedBytesSent||0)/a.statsInterval),t.audio=d,b.vendor_mode=this._stream.vendorCode||0,b.pc_session_id=null===(n=this.handler)||void 0===n?void 0:n.peerConnectionId,o)?null===(v=this._monitor)||void 0===v||v.report("rtc_media_statistics",b):this.statsMonitor.setLocalAudioStats(b);return a._retransmittedRate=(d.retransmittedPacketsSent-y.retransmittedPacketsSent)/(d.packetsSent-y.packetsSent),void 0===a.audioLossRate&&(a.audioLossRate=a._retransmittedRate,b.fraction_lost=a.audioLossRate),a._fractionLost=Math.max(a._fractionLost,a.audioLossRate),a._sendVolumeLevel=b._sendVolumeLevel,this.filterIllegal(a)}async getVideoStats(e,t,i){var o,s,r;const n={},a={timestamp:Date.now(),simulcast:{}},{streamId:d,videoMid:c,isScreen:l,pubAttributes:u,enableSimulcast:m,pubVideo:h}=this._stream,p={media_type:"video",is_screen:!!l,direction:"up",stream_id:d,vid:c,connection_status:navigator.onLine,track_enabled:null==e?void 0:e.enabled,capture_state:u.localvideo?"capture_state_on":"capture_state_off",mute_state:h?"mute_state_off":"mute_state_on",thermal_status:zW.state,is_public_stream:this._stream.isPublicStream};if(!e||!this.handler)return n;p.cap_frame_width=e.getSettings().width,p.cap_frame_height=e.getSettings().height,p.frameRateSent=e.getSettings().frameRate,n.isScreen=l,p.is_intersecting=JSON.stringify(null===(o=this._stream)||void 0===o||null===(o=o.videoTrack)||void 0===o?void 0:o.intersection());const b=await(null===(s=this.handler.peer)||void 0===s?void 0:s.getStatsWithLowFrequency(e,!1,null===(r=this._stream.videoTransceiver)||void 0===r?void 0:r.sender));if(!b.length)return n;let _=0;b.forEach((e=>{const{type:i,framesEncoded:o,packetsLost:s,bytesSent:r,framesSent:d,retransmittedBytesSent:c,totalPacketSendDelay:l,totalEncodeTime:u,firCount:h,targetBitrate:b,roundTripTime:y,mimeType:v,frameWidth:S,frameHeight:Z,packetsSent:f,googActualEncBitrate:T,googAvailableReceiveBandwidth:I,googAvailableSendBandwidth:g,googAvgEncodeMs:R,googBucketDelay:X,googEncodeUsagePercent:L,googFrameRateInput:C,availableIncomingBitrate:W,availableOutgoingBitrate:G,bytesReceived:V,nominated:E,id:P,currentRoundTripTime:k,state:x,writable:N,candidateType:M,ip:Y,address:w,networkType:K,port:H,nackCount:F,pliCount:J,protocol:O,qpSum:U,requestsReceived:D,responsesReceived:A,googRetransmitBitrate:z,requestsSent:j,consentRequestsSent:Q,responsesSent:B,ssrc:q,googTargetEncBitrate:$,googTransmitBitrate:ee,retransmittedPacketsSent:te,encoderImplementation:ie,jitter:oe,rid:se,fractionLost:re,googAdaptationChanges:ne,qualityLimitationReason:ae,qualityLimitationDurations:de,googFirsReceived:ce,googFrameRateSent:le,keyFramesEncoded:ue,scalabilityMode:me,framesPerSecond:he,frames:pe}=e;"outbound-rtp"===i?(m&&(se?a.simulcast[se]=e:a.simulcast[_]=e,_++),a.framesEncoded=o||a.framesEncoded||0,p.key_frames_encoded=ue||0,a.bytesSent=r||a.bytesSent||0,a.framesSent=d||a.framesSent,p.bytes=r||p.bytes||0,a.packetsSent=f||a.packetsSent||0,p.packetsSent=f||p.packetsSent||0,p.nackCount=F||p.nackCount||0,p.pli_count=J||p.pli_count||0,p.qp_sum=U||p.qp_sum||0,p.ssrc=q||p.ssrc||0,p.retransmitted_packets_sent=te,a.retransmittedPacketsSent=te,a.retransmittedBytesSent=c,p.encoder_implementation=ie,p.qualityLimitationReason=ae,p.qualityLimitationDurations=de,p.scalabilityMode=me,void 0!==S&&((!n.encodedFrameWidth||S>n.encodedFrameWidth)&&(n.encodedFrameWidth=S),(!n.encodedFrameHeight||Z>n.encodedFrameHeight)&&(n.encodedFrameHeight=Z),p.frame_size_height=Z,p.frame_size_width=S)):"track"===i?(n.encodedFrameWidth=S,n.encodedFrameHeight=Z,p.frame_size_height=Z,p.frame_size_width=S):"remote-inbound-rtp"===i?(a.packetsLost=s,n.rtt=1e3*y,p.rtt=n.rtt,p.jitter=1e3*oe,p.packetsLost=s,n._fractionLost=re||0):"codec"===i?(n.codecType=v,p.codecName=v):"candidate-pair"===i?(p.ice_available_incoming_bitrate=W,p.ice_available_outgoing_bitrate=G,p.ice_bytes_received=V,p.ice_bytes_sent=r,p.ice_nominated=Number(E),p.ice_pair_id=P,p.ice_pair_rtt=k,p.ice_pair_state=x,p.ice_pair_writable=N,p.recv_ping_requests=D,p.recv_ping_responses=A,p.sent_ping_requests_before_first_response=j,p.sent_ping_requests_total=j+Q,p.sent_ping_responses=B):"local-candidate"===i?(p.local_candidate_type=M,p.local_ip=Y||w,p.local_network_type=K,p.local_port=H,p.protocol=O):"remote-candidate"===i?(p.remote_candidate_type=M,p.remote_ip=Y||w,p.remote_port=H):"VideoBwe"===i?(p.encBitratebps=T,p.available_receive_bandwidth=I,p.available_send_bandwidth=g,p.bucket_delay=X,p.retransmitBitratebps=z,p.targetEncBitratebps=$,p.transmit_bitrate=ee,n._sendBandWidth=Number(g)):"ssrc"===i&&(p.avg_encode_ms=R,p.encodeUsage=L,p.frame_rate_input=C,p.orignal_input_Framerate=Number(C),p.ddaptationChanges=ne,p.firsReceived=ce,p.frameRateSent=le);const{video:be}=t,_e=a.timestamp-be.timestamp;if("outbound-rtp"===i){const e=r-be.bytesSent,t=c-be.retransmittedBytesSent;p.encBitratebps=Math.round(8e3*(e-t)/_e),p.bucket_delay=l/f,p.retransmitBitratebps=Math.round(8e3*t/_e),p.targetEncBitratebps=b,p.transmit_bitrate=Math.round(1e3*(r-be.bytesSent)*8/_e),p.avg_encode_ms=1e3*u/o,p.firsReceived=h+J}else"candidate-pair"===i?(p.available_send_bandwidth=G,n._sendBandWidth=G):"media-source"===i&&(p.frame_rate_input=he,p.orignal_input_Framerate=Number(he),p.frame_input=pe)}));const{video:y}=t;if(!y.timestamp)return t.video=a,this.filterIllegal(n);n.statsInterval=a.timestamp-y.timestamp,p.stats_interval=n.statsInterval;const v=Object.keys(a.simulcast);if(m){var S;p.sim_enc_width=[],p.sim_enc_height=[],p.sim_enc_bps=[],p.sim_enc_framerate=[],p.sim_enc_key_frames=[],p.sim_rids=[],p.sim_enc_bandwidth=[],p.sim_sent_framerate=[],p.sim_fraction_lost=[],p.sim_keyencoded=[],p.active_sim_streams=this._context.videoProfile.activeSimStreams||[],p.sim_retransmittedRate=[];let e=!1;var Z;if(vg(v).call(v,((e,t)=>Number(e)-Number(t))).forEach((t=>{const{frameWidth:i,frameHeight:o,bytesSent:s,framesEncoded:r,framesSent:d,packetsLost:c,packetsSent:l,qualityLimitationReason:u,qualityLimitationDurations:m,qualityLimitationResolutionChanges:h,retransmittedPacketsSent:b,pliCount:_,keyFramesEncoded:v}=a.simulcast[t];void 0!==u&&(p.sim_qualityLimitationReason||(p.sim_qualityLimitationReason=[],p.sim_qualityLimitationDurations=[],p.sim_qualityLimitationResolutionChanges=[]),p.sim_qualityLimitationReason.push(u),p.sim_qualityLimitationDurations.push(m),p.sim_qualityLimitationResolutionChanges.push(h));const S=y.simulcast[t];if(p.sim_enc_width.push(i||0),p.sim_enc_height.push(o||0),p.sim_enc_key_frames.push(v||0),S){const o=(s-S.bytesSent||0)/n.statsInterval;p.sim_enc_bps.push(Math.round(8e3*o)),p.sim_enc_bandwidth.push(Math.round(8e3*o/1024));const a=1e3*(r-S.framesEncoded)/n.statsInterval;p.sim_enc_framerate.push(Math.round(a)),p.sim_rids.push(t);const u=void 0!==d?d-S.framesSent:r-S.framesEncoded,m=1e3*u/n.statsInterval;p.sim_sent_framerate.push(Math.round(m));let h=(c-S.packetsLost)/(l-S.packetsSent);n._retransmittedRate=(b-S.retransmittedPacketsSent)/(l-S.packetsSent),h=Number.isNaN(h)?0:h,p.sim_fraction_lost.push(h),p.sim_keyencoded.push(_-S.pliCount>0),p.sim_retransmittedRate.push(n._retransmittedRate),i>0&&!e&&(n.rid=t,n.sentKBitrate=8*o,n.encoderOutputFrameRate=a,n.encodedFrameCount=u,n.sentFrameRate=m,n.videoLossRate=h,e=!0)}})),p.vendor_mode=this._stream.vendorCode||0,p.pc_session_id=null===(S=this.handler)||void 0===S?void 0:S.peerConnectionId,i)null===(Z=this._monitor)||void 0===Z||Z.report("rtc_media_statistics",p)}else{var f,T;if(n.encodedFrameCount=void 0!==a.framesSent?a.framesSent-y.framesSent:a.framesEncoded-y.framesEncoded,n.sentKBitrate=(a.bytesSent-y.bytesSent||0)/n.statsInterval*8,p.bitrate=Math.round(1e3*n.sentKBitrate),p.bandwidth=Math.round(p.bitrate/1024),n.encoderOutputFrameRate=1e3*(a.framesEncoded-y.framesEncoded)/n.statsInterval,p.frame_rate_encoded=Math.round(n.encoderOutputFrameRate),n.sentFrameRate=1e3*n.encodedFrameCount/n.statsInterval,p.frame_rate_sent=Math.round(n.sentFrameRate),n.videoLossRate=Math.max(0,a.packetsLost-y.packetsLost)/(a.packetsSent-y.packetsSent),n.videoLossRate=Number.isNaN(n.videoLossRate)?0:n.videoLossRate,p.fraction_lost=n.videoLossRate,n._retransmittedRate=(a.retransmittedPacketsSent-y.retransmittedPacketsSent)/(a.packetsSent-y.packetsSent),p.vendor_mode=this._stream.vendorCode||0,p.pc_session_id=null===(f=this.handler)||void 0===f?void 0:f.peerConnectionId,p.sentKBitrate=n.sentKBitrate,n.inputFrameRate=p.orignal_input_Framerate,n.encoderName=p.encoder_implementation,i)null===(T=this._monitor)||void 0===T||T.report("rtc_media_statistics",p);else this.statsMonitor.setLocalVideoStats(p,e)}return t.video=a,n._fractionLost=Math.max(n._fractionLost,n.videoLossRate),n._captureResolutionWidth=p.cap_frame_width,n._captureResolutionHeight=p.cap_frame_height,this.filterIllegal(n)}destroy(){super.destroy(),this.statsMonitor.destroy()}}class oG extends tG{constructor(e,t){super(e),Hu(this,"_stats",{audioStats:{},videoStats:{}}),Hu(this,"_preReports",{audio:{},video:{}}),Hu(this,"statsMonitor",void 0),this._stream=t,this.statsMonitor=new eG,this.statsMonitor.on("stats-exception",(e=>{this.emit("stats-exception",e)})),this.statsMonitor.on("rtc-decode-error",(e=>{var t;this.logger.info("rtc_decode_error",JSON.stringify(e)),null===(t=this._monitor)||void 0===t||t.report("rtc_decode_error",e)}));const i=async()=>{this._stats=await this._getRemoteStreamStats(this._stream,this._preReports,!1),this._destroyed||(this._timer=setTimeout(i,WZ("STATS_LOOP_INTERVAL")))};i()}async setRemoteStreamStatsEvtInterval(e,t){if(this._isReportStarted)return;this.logger.info("setRemoteStreamStatsEvtInterval","invoke"),this._isReportStarted=!0,this.setVar(t),this._destroyed=!1;const i={audio:{},video:{}},o=async()=>{const t=await this._getRemoteStreamStats(this._stream,i,!0);e(t),this._destroyed||(this._reportTimer=setTimeout(o,2e3))};o()}getRemoteStreamStats(){return this._stats}async _getRemoteStreamStats(e,t,i){var o,s,r;const n=null===(o=e.videoTrack)||void 0===o?void 0:o.originTrack,a=null===(s=e.audioTrack)||void 0===s?void 0:s.originTrack;var d;0===Object.keys(t.audio).length&&0===Object.keys(t.video).length&&(await this.getRemoteAudioStats(a,t,null===(d=this._stream.audioTrack)||void 0===d?void 0:d.getAudioLevel(),i),await this.getRemoteVideoStats(n,t,i),await Of(150));return{audioStats:await this.getRemoteAudioStats(a,t,null===(r=this._stream.audioTrack)||void 0===r?void 0:r.getAudioLevel(),i),videoStats:await this.getRemoteVideoStats(n,t,i),isScreen:e.isScreen,userId:e.userId,streamId:e.streamId}}unsubscribe(){this.logger.info("unsubscribe","invoke"),super.stopReport("unsubscribe"),this._stream.stopAudioStallObserve()}async getRemoteAudioStats(e,t,i,o){var s,r,n,a;const d={},c={},{streamId:l,userId:u,isScreen:m,audioMid:h,subMediaType:p,_attributes:b,virtual:_,audioTrack:y}=this._stream,v={media_type:"audio",is_screen:!!m,direction:"down",stream_id:l,stream_user_id:u,vid:h,audio_mux:_,connection_status:navigator.onLine,track_enabled:null==e?void 0:e.enabled,mute_state:Qf(p)?"mute_state_off":"mute_state_on",remote_user_capture_state:b.localaudio?"capture_state_on":"capture_state_off",remote_user_mute_state:b.localaudio&&b.audiostream?"mute_state_off":"mute_state_on",thermal_status:zW.state,is_public_stream:this._stream.isPublicStream};if(y&&(v.playback_volume=y.getVolume()),!e||!this.handler)return d;const S=await(null===(s=this.handler.peer)||void 0===s?void 0:s.getStatsWithLowFrequency(e,!1,null===(r=this._stream.audioTransceiver)||void 0===r?void 0:r.receiver));if(!S.length)return d;S.forEach((e=>{let{type:t,packetsLost:o,packetsReceived:s,bytesReceived:r,jitterBufferDelay:n,jitterBufferTargetDelay:a,jitterBufferEmittedCount:u,clockRate:m,channels:h,totalSamplesReceived:p,concealedSamples:b,silentConcealedSamples:_,concealmentEvents:y,totalRoundTripTime:S,packetsDiscarded:Z,state:f,currentRoundTripTime:T,audioLevel:I,totalAudioEnergy:g,totalSamplesDuration:R,mimeType:X,googDecodingNormal:L,googDecodingMuted:C,availableIncomingBitrate:W,availableOutgoingBitrate:G,bytesSent:V,nominated:E,id:P,writable:k,jitter:x,candidateType:N,ip:M,address:Y,networkType:w,port:K,protocol:H,audioOutputLevel:F,requestsReceived:J,responsesReceived:O,requestsSent:U,consentRequestsSent:D,responsesSent:A,ssrc:z,nackCount:j,lastPacketReceivedTimestamp:Q,concealmentevents:B,fecPacketsReceived:q,retransmittedBytesReceived:$}=e;if("inbound-rtp"===t)c.packetsLost=o,c.packetsReceived=s,v.packetsLost=o,v.packetsReceived=s,v.packetsDiscarded=Z,v.nackCount=j,v.lastPacketReceivedTimestamp=Q,v.concealmentevents=B,c.bytesReceived=r,c.jitterBufferDelay=n,c.jitterBufferEmittedCount=u,c.jitterBufferTargetDelay=a,void 0!==p&&(c.totalSamplesReceived=p,d.concealedSamples=b,c.concealedSamples=b,c.silentConcealedSamples=_,v.concealedSamples=b,d.concealmentEvents=y,v.totalSamplesReceived=p),void 0!==q&&(v.fec_packets_received=q,c.fecPacketsReceived=q),v.jitter=1e3*x,v.ssrc=z,void 0!==I&&0!==I?(v.audio_level=I?-10*Math.log10(Math.pow(I,2)):I,v.volume=255*I):(v.volume=null!=i?i:255*I,v.audio_level=i?-10*Math.log10(Math.pow(i/255,2)):i),void 0!==g&&(v.total_audio_energy=g),void 0!==R&&(v.totalAudioDuration=R),c.retransmittedBytesReceived=$;else if("codec"===t)d.recordSampleRate=m,h&&(d.numChannels=h),v.codecName=X,d.codecType=X;else if("candidate-pair"===t){var ee;v.ice_available_incoming_bitrate=W,v.ice_available_outgoing_bitrate=G,v.ice_bytes_received=r,v.ice_bytes_sent=V,v.ice_nominated=Number(E),v.ice_pair_id=P,v.ice_pair_rtt=T,v.rtt=1e3*T,v.rtt&&null!==(ee=this._context.streamRTT)&&void 0!==ee&&null!==(ee=ee[l])&&void 0!==ee&&ee.audio&&(v.total_rtt_ms=Math.round(v.rtt+this._context.streamRTT[l].audio)),v.ice_pair_state=f,v.ice_pair_writable=k,v.recv_ping_requests=J,v.recv_ping_responses=O,v.sent_ping_requests_before_first_response=U,v.sent_ping_requests_total=U+(D||0),v.sent_ping_responses=A,"succeeded"===f&&(d.rtt=1e3*T,d.total_rtt=1e3*S)}else"track"===t&&void 0!==I?(0===I&&0!==i?(v.volume=i,v.audio_level=i?-10*Math.log10(Math.pow(i/255,2)):i):(v.audio_level=I?-10*Math.log10(Math.pow(I,2)):I,v.volume=255*I),v.total_audio_energy=g,v.totalAudioDuration=R):"ssrc"===t?(v.decodingNormal=L,v.recvAudioLevel=F,v.decodingMuted=C):"local-candidate"===t?(v.local_candidate_type=N,v.local_ip=M||Y,v.local_network_type=w,v.local_port=K,v.protocol=H):"remote-candidate"===t&&(v.remote_candidate_type=N,v.remote_ip=M||Y,v.remote_port=K)}));const{audio:Z}=t;if(!Z.timestamp)return c.timestamp=Date.now(),t.audio=c,this.filterIllegal(d);let f;if(void 0!==c.concealedSamples&&(v.interval_concealed_samples=c.concealedSamples-Z.concealedSamples,v.interval_samples_received=c.totalSamplesReceived-Z.totalSamplesReceived,v.interval_silent_concealed_samples=c.silentConcealedSamples-Z.silentConcealedSamples,f=await this._stream.updateAudioStallInfo(v,d,c)),c.timestamp=Date.now(),d.audioLossRate=Math.max(0,c.packetsLost-Z.packetsLost)/(c.packetsReceived-Z.packetsReceived+(c.packetsLost-Z.packetsLost)),d.audioLossRate=Number.isNaN(d.audioLossRate)?0:d.audioLossRate,v.fraction_lost=d.audioLossRate,d.statsInterval=c.timestamp-Z.timestamp,v.stats_interval=d.statsInterval,d.receivedKBitrate=(c.bytesReceived-Z.bytesReceived||0)/d.statsInterval*8,v.receivedKBitrate=d.receivedKBitrate,v.bandwidth=Math.round(1e3*d.receivedKBitrate/1024),void 0!==c.concealedSamples&&(d.receivedSampleRate=1e3*v.interval_samples_received/d.statsInterval),void 0!==c.fecPacketsReceived&&(v.fecBitratebps=(c.fecPacketsReceived-Z.fecPacketsReceived||0)/d.statsInterval),void 0!==c.jitterBufferDelay&&void 0!==c.jitterBufferEmittedCount&&(v.average_jitter_buffer_delay_ms=(c.jitterBufferDelay-Z.jitterBufferDelay)/(c.jitterBufferEmittedCount-Z.jitterBufferEmittedCount)*1e3,d.jitterBufferDelay=v.average_jitter_buffer_delay_ms),void 0!==c.jitterBufferTargetDelay&&void 0!==c.jitterBufferEmittedCount&&(v.average_jitter_buffer_target_delay_ms=(c.jitterBufferTargetDelay-Z.jitterBufferTargetDelay)/(c.jitterBufferEmittedCount-Z.jitterBufferEmittedCount)*1e3,d.jitterBufferTargetDelay=v.average_jitter_buffer_target_delay_ms),v.average_jitter_buffer_delay_ms&&v.total_rtt_ms&&(d.e2eDelay=v.average_jitter_buffer_delay_ms+v.total_rtt_ms),null!==(n=this._context.streamRTT)&&void 0!==n&&null!==(n=n[l])&&void 0!==n&&n.audio&&(d.totalRtt=(v.rtt?v.rtt:0)+this._context.streamRTT[l].audio),void 0!==Z.retransmittedBytesReceived&&void 0!==c.retransmittedBytesReceived){const e=c.retransmittedBytesReceived-Z.retransmittedBytesReceived;v.retransmitBitratebps=Math.round(8e3*e/d.stats_interval)}var T;(t.audio=c,v.vendor_mode=this._stream.vendorCode||0,v.pc_session_id=null===(a=this.handler)||void 0===a?void 0:a.peerConnectionId,o)?null===(T=this._monitor)||void 0===T||T.report("rtc_media_statistics",v,f):this.statsMonitor.setRemoteAudioStats(v);return this.filterIllegal(d)}async getRemoteVideoStats(e,t,i){var o,s,r,n,a;const d={},c={timestamp:Date.now()},{streamId:l,userId:u,isScreen:m,subMediaType:h,_attributes:p}=this._stream,b=Ju({media_type:"video",is_screen:!!m,direction:"down",stream_id:l,stream_user_id:u,vid:this._stream.videoMid,connection_status:navigator.onLine,track_enabled:null==e?void 0:e.enabled,mute_state:Bf(h)?"mute_state_off":"mute_state_on",remote_user_capture_state:p.localvideo?"capture_state_on":"capture_state_off",remote_user_mute_state:p.localvideo&&p.videostream?"mute_state_off":"mute_state_on",is_intersecting:JSON.stringify(null===(o=this._stream.videoTrack)||void 0===o?void 0:o.intersection()),thermal_status:zW.state,is_public_stream:this._stream.isPublicStream},this._stream.getVideoRenderInfo());if(!e||!this.handler)return d;d.isScreen=m;const _=await(null===(s=this.handler.peer)||void 0===s?void 0:s.getStatsWithLowFrequency(e,!1,null===(r=this._stream.videoTransceiver)||void 0===r?void 0:r.receiver));if(!_.length)return d;_.forEach((e=>{let{type:t,frameHeight:i,frameWidth:o,packetsLost:s,packetsReceived:r,bytesReceived:n,framesDecoded:a,jitterBufferDelay:u,jitterBufferTargetDelay:m,jitterBufferEmittedCount:h,mimeType:_,firCount:y,availableIncomingBitrate:v,availableOutgoingBitrate:S,bytesSent:Z,nominated:f,id:T,currentRoundTripTime:I,state:g,writable:R,candidateType:X,ip:L,address:C,networkType:W,port:G,nackCount:V,pliCount:E,protocol:P,requestsReceived:k,responsesReceived:x,requestsSent:N,consentRequestsSent:M,responsesSent:Y,ssrc:w,jitter:K,framesReceived:H,keyFramesDecoded:F,totalDecodeTime:J,decoderImplementation:O,lastPacketReceivedTimestamp:U,retransmittedBytesReceived:D,framesDropped:A}=e;if("inbound-rtp"===t){if(c.packetsLost=s,b.packetsLost=s,c.packetsReceived=r,b.packetsReceived=r,c.bytesReceived=n,b.bytes=n,c.framesDecoded=a,c.totalDecodeTime=J,c.jitterBufferDelay=u,c.jitterBufferTargetDelay=m,c.jitterBufferEmittedCount=h,b.fir_count=y,b.nackCount=V,c.nackCount=V,b.pli_count=E,b.ssrc=w,b.framesDropped=A,b.jitter=1e3*K,b.framesReceived=H,c.framesReceived=H,b.framesDecoded=a,b.key_frames_decoded=F,b.decoder_name=O,d.decoderName=O,b.last_packet_received_timestamp=U,c.retransmittedBytesReceived=D,void 0!==o){b.frame_size_width=o,b.frame_size_height=i;const e=null==p?void 0:p.alphaInfo;var z,j;if(null!=e&&e.enableAlpha)d.width=null!==(z=e.alphaWidth)&&void 0!==z?z:o,d.height=null!==(j=e.alphaHeight)&&void 0!==j?j:(null!=i?i:0)/2;else d.width=o,d.height=i}}else if("track"===t&&void 0!==o){b.frame_size_width=o,b.frame_size_height=i;const e=null==p?void 0:p.alphaInfo;var Q,B;if(null!=e&&e.enableAlpha)d.width=null!==(Q=e.alphaWidth)&&void 0!==Q?Q:o,d.height=null!==(B=e.alphaHeight)&&void 0!==B?B:(null!=i?i:0)/2;else d.width=o,d.height=i;void 0!==H&&(b.framesReceived=H,c.framesReceived=H)}else if("codec"===t){b.codecName=_,d.codecType=_;const e=pT(_);var q;if(void 0!==e)null===(q=this._stream._receiveSEIHandler)||void 0===q||q.setCodec(e)}else if("candidate-pair"===t){var $;b.ice_available_incoming_bitrate=v,b.ice_available_outgoing_bitrate=S,b.ice_bytes_received=n,b.ice_bytes_sent=Z,b.ice_nominated=Number(f),b.ice_pair_id=T,b.ice_pair_rtt=I,b.rtt=1e3*I,b.rtt&&null!==($=this._context.streamRTT)&&void 0!==$&&null!==($=$[l])&&void 0!==$&&$.video&&(b.total_rtt_ms=Math.round(b.rtt+(this._context.streamRTT[l].video||0))),d.rtt=b.rtt,b.ice_pair_state=g,b.ice_pair_writable=R,b.recv_ping_requests=k,b.recv_ping_responses=x,b.sent_ping_requests_before_first_response=N,b.sent_ping_requests_total=N+(M||0),b.sent_ping_responses=Y}else"local-candidate"===t?(b.local_candidate_type=X,b.local_ip=L||C,b.local_network_type=W,b.local_port=G,b.protocol=P):"remote-candidate"===t&&(b.remote_candidate_type=X,b.remote_ip=L||C,b.remote_port=G)}));const{video:y}=t;if(!y.timestamp)return t.video=c,this.filterIllegal(d);const v=Math.max(0,c.packetsLost-y.packetsLost),S=c.packetsReceived-y.packetsReceived;if(d.videoLossRate=v/(S+v),d._receivePackets=c.packetsReceived,d._receivePacketsLost=c.packetsLost,y.totalDecodeTime&&y.framesDecoded&&c.framesDecoded!==y.framesDecoded){const e=c.totalDecodeTime-y.totalDecodeTime,t=c.framesDecoded-y.framesDecoded;b.decode_elapse_per_frame=Number((e/t*1e3).toFixed(2))}d._retransmittedRate=(c.nackCount-y.nackCount)/(S+v),d.videoLossRate=Number.isNaN(d.videoLossRate)?0:d.videoLossRate,b.fraction_lost=d.videoLossRate,d.statsInterval=c.timestamp-y.timestamp,b.stats_interval=d.statsInterval,d.receivedKBitrate=(c.bytesReceived-y.bytesReceived||0)/d.statsInterval*8,b.bitrate=Math.round(1e3*d.receivedKBitrate),b.bandwidth=Math.round(b.bitrate/1024),d.decoderOutputFrameRate=1e3*(c.framesDecoded-y.framesDecoded)/d.statsInterval,d.receivedFrameRate=1e3*(c.framesReceived-y.framesReceived)/d.statsInterval,b.frame_rate_decoded=Math.round(d.decoderOutputFrameRate),b.frame_rate_received=Math.round(d.receivedFrameRate),void 0!==c.jitterBufferDelay&&void 0!==c.jitterBufferEmittedCount&&(b.average_jitter_buffer_delay_ms=(c.jitterBufferDelay-y.jitterBufferDelay)/(c.jitterBufferEmittedCount-y.jitterBufferEmittedCount)*1e3,d.jitterBufferDelay=b.average_jitter_buffer_delay_ms),void 0!==c.jitterBufferTargetDelay&&void 0!==c.jitterBufferEmittedCount&&(b.average_jitter_buffer_target_delay_ms=(c.jitterBufferTargetDelay-y.jitterBufferTargetDelay)/(c.jitterBufferEmittedCount-y.jitterBufferEmittedCount)*1e3,d.jitterBufferTargetDelay=b.average_jitter_buffer_target_delay_ms),b.average_jitter_buffer_delay_ms&&b.total_rtt_ms&&(d.e2eDelay=b.average_jitter_buffer_delay_ms+b.total_rtt_ms),null!==(n=this._context.streamRTT)&&void 0!==n&&null!==(n=n[l])&&void 0!==n&&n.video&&(d.totalRtt=(b.rtt?b.rtt:0)+(this._context.streamRTT[l].video||0)),t.video=c,this._stream.updateVideoStallInfo(b,d,i),b.vendor_mode=this._stream.vendorCode||0,b.pc_session_id=null===(a=this.handler)||void 0===a?void 0:a.peerConnectionId;const Z=null==p?void 0:p.alphaInfo;var f,T,I;null!=Z&&Z.enableAlpha&&void 0!==b.frame_size_width&&void 0!==b.frame_size_height?(d.frameSizeWidth=null!==(f=Z.alphaWidth)&&void 0!==f?f:b.frame_size_width,d.frameSizeHeight=null!==(T=Z.alphaHeight)&&void 0!==T?T:b.frame_size_height/2):(d.frameSizeWidth=b.frame_size_width,d.frameSizeHeight=b.frame_size_height);if(d.decoderName=b.decoder_name,void 0!==y.retransmittedBytesReceived&&void 0!==c.retransmittedBytesReceived){const e=c.retransmittedBytesReceived-y.retransmittedBytesReceived;b.retransmitBitratebps=Math.round(8e3*e/b.stats_interval)}i?null===(I=this._monitor)||void 0===I||I.report("rtc_media_statistics",b):this.statsMonitor.setRemoteVideoStats(b,e);return this.filterIllegal(d)}destroy(){super.destroy(),super.stopReport("destroy"),this._stream.stopAudioStallObserve(),this.statsMonitor.destroy()}}class sG{constructor(e){Hu(this,"_roomId",void 0),Hu(this,"_constraints",{}),Hu(this,"_profile",void 0),Hu(this,"_customMaxBitrate",0),this._appId=e}setRoomId(e){this._roomId=e}setAudioProfile(e){this._profile=e,this._customMaxBitrate=0}get customMaxBitrate(){return this._customMaxBitrate}setCustomMaxBitrate(e){const{audio_encode:t}=TS.getEngineWebConfig(this._appId,this._roomId||"");this._customMaxBitrate=null!=t&&t.bitrate?0:1e3*e}getOpusConfigStr(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const{audio_encode:t}=TS.getEngineWebConfig(this._appId,this._roomId||""),{sampleRate:i,channelCount:o}=this.getConstraints(),s="number"==typeof i?i:null==i?void 0:i.exact,r="number"==typeof o?o:null==o?void 0:o.exact,n={};e.split(";").forEach((e=>{const[t,i]=e.split("=");t&&i&&(n[t]=i)}));const a=(null==t?void 0:t.bitrate)||this._customMaxBitrate||this._getConfigByAudioProfile().bitrate;a&&(n.maxaveragebitrate=a);const d=(null==t?void 0:t.enc_sample_rate)||s;d&&(n["sprop-maxcapturerate"]=d);const c=(null==t?void 0:t.playback_rate)||s;return c&&(n.maxplaybackrate=c),(r&&r>1||null!=t&&t.stereo)&&(n["sprop-stereo"]=1,n.stereo=1),null!=t&&t.dtx&&(n.usedtx=1),Object.keys(n).map((e=>"".concat(e,"=").concat(n[e]))).join(";")}updateConstraints(e){this._constraints=Ju(Ju({},this._constraints),e)}getConstraints(){const e=Ju({},this._constraints),{audio_capture:t}=TS.getEngineWebConfig(this._appId,this._roomId||"");$f(null==t?void 0:t.sample_rate)||(e.sampleRate=t.sample_rate),$f(null==t?void 0:t.channel)||(e.channelCount=t.channel),$f(null==t?void 0:t.agc)||(e.autoGainControl=t.agc),$f(null==t?void 0:t.ans)||(e.noiseSuppression=t.ans),$f(null==t?void 0:t.aec)||(e.echoCancellation=t.aec);const{sampleRate:i,channel:o}=this._getConfigByAudioProfile();return $f(e.sampleRate)&&!$f(i)&&(e.sampleRate=i),$f(e.channelCount)&&!$f(o)&&(e.channelCount=o),e}_getConfigByAudioProfile(){const e={};switch(this._profile){case vm.fluent:e.sampleRate=16e3,e.bitrate=24e3;break;case vm.standard:e.sampleRate=48e3,e.bitrate=48e3;break;case vm.hd:e.sampleRate=48e3,e.bitrate=128e3,e.channel=2;break;case vm.standardStereo:e.sampleRate=48e3,e.bitrate=8e4,e.channel=2;break;case vm.hdMono:e.sampleRate=48e3,e.bitrate=128e3}return e}}var rG=(e=>(e[e.AUTOPLAY_FAILED=-1e3]="AUTOPLAY_FAILED",e[e.TRACK_ERROR=-1001]="TRACK_ERROR",e[e.Fetch_MODIFY=-1002]="Fetch_MODIFY",e[e.BLACK_BROWSER=-1003]="BLACK_BROWSER",e[e.DC_SEND_ERROR=-1004]="DC_SEND_ERROR",e[e.DUPLICATE_DOM=-1005]="DUPLICATE_DOM",e))(rG||{});const nG={start_interval:100,multiplier:2,max_interval:3e4};class aG{constructor(){Hu(this,"_times",0),Hu(this,"_config",nG),Hu(this,"initTs",Hf())}getRetryDelay(){return Math.min(this._config.max_interval,Math.pow(this._config.multiplier,this._times++)*this._config.start_interval)}setConfig(e){this._config=e}reset(){this._times=0}}class dG{constructor(e){Hu(this,"_logger",void 0),Hu(this,"_monitor",void 0),this._ctx=e;const t=TS.getServerConfig(this._ctx.appId);this._logger=new xv("DecisionConfig",1,this._ctx.id),this._monitor=mv(this._ctx.id),setTimeout((()=>{this.updateConfig(t,!0)}),0)}updateConfig(e,t){!t&&TS.setServerConfig(this._ctx.appId,e),e.rts_report&&Jy(e.rts_report),this._ctx.joinRoomConfig.setServerConfig(e.web_join_room),this._setRtsConfig(e.rts_config),this._setRtsQpsConfig(e.rts_qps),this._preConnect(e),this._getServerConfigExecutor(e,t)}_setRtsConfig(e){null!=e&&e.rts_mode&&e.rts_mode!==this._ctx.rtsMode&&(this._logger.print("_setRtsConfig","setRtsMode to %o",e.rts_mode),this._ctx.setRTSMode(e.rts_mode===kg.NORMAL_MODE?kg.NORMAL_MODE:kg.LIMIT_MODE))}_setRtsQpsConfig(e){this._logger.print("_setRtsQpsConfig",JSON.stringify(e)),this._ctx.setRtsQpsConf(e),Object.keys(this._ctx.rtsLimiter).length>0&&vv(this._ctx.id,"setRtsQpsConf",JSON.stringify(e))}_getServerConfigExecutor(e,t){var i,o,s,r,n,a,d,c,l,u,m;const{upload_console_length_cut:h,upload_report_limit:p}=(null==e?void 0:e.web_rtc_config)||{};if(Sp.setParameter("UPLOAD_CONSOLE_ON",!(null==e||null===(i=e.web_rtc_config)||void 0===i||!i.upload_console_on)),h&&Sp.setParameter("UPLOAD_CONSOLE_LENGTH_CUT",h),p&&Sp.setParameter("UPLOAD_REPORT_LIMIT",p),Sp.setParameter("ENABLE_REPORT_IDB_BUFFER",!(null==e||null===(o=e.web_rtc_config)||void 0===o||!o.enable_report_idb_buffer)),!1===(null==e||null===(s=e.web_rtc_config)||void 0===s?void 0:s.sdk_codec_negotiation)&&CZ("SDK_CODEC_NEGOTIATION",!1),void 0!==(null==e||null===(r=e.web_rtc_config)||void 0===r?void 0:r.ainr_enable_dump)&&CZ("AINR_ENABLE_DUMP",e.web_rtc_config.ainr_enable_dump),void 0!==(null==e||null===(n=e.web_rtc_config)||void 0===n?void 0:n.ainr_overload_threshold)&&CZ("AINR_OVERLOAD_THRESHOLD",e.web_rtc_config.ainr_overload_threshold),void 0!==(null==e||null===(a=e.web_rtc_config)||void 0===a?void 0:a.ainr_url))try{CZ("AINR_URL",JSON.parse(e.web_rtc_config.ainr_url))}catch(y){this._logger.warn("_getServerConfigExecutor","parse AINR_URLS error %o",y)}var b,_;(void 0!==(null==e||null===(d=e.web_rtc_config)||void 0===d?void 0:d.ainr_cache_time)&&CZ("AINR_CACHE_TIME",e.web_rtc_config.ainr_cache_time),void 0!==(null==e||null===(c=e.web_rtc_config)||void 0===c?void 0:c.ainr_dump_time)&&CZ("AINR_DUMP_TIME",e.web_rtc_config.ainr_dump_time),null!=e&&null!==(l=e.web_rtc_config)&&void 0!==l&&l.web_pc_killswitch&&(this._logger.print("web_pc_killswitch update: ",JSON.stringify(e.web_rtc_config.web_pc_killswitch)),this._ctx.pcKillSwitch=Ju(Ju({},this._ctx.pcKillSwitch),e.web_rtc_config.web_pc_killswitch)),"boolean"==typeof(null==e||null===(u=e.web_rtc_config)||void 0===u?void 0:u.fallback))&&(!1===(null==e?void 0:e.web_rtc_config.fallback)?this._ctx.enableFallbackHandler=!1:Array.isArray(null==e||null===(b=e.web_rtc_config)||void 0===b?void 0:b.fallback_ua_reg)?this._ctx.enableFallbackHandler=null==e?void 0:e.web_rtc_config.fallback_ua_reg.every((e=>"string"==typeof e&&new RegExp(e).test(navigator.userAgent))):this._ctx.enableFallbackHandler=!1);"boolean"==typeof(null==e||null===(m=e.web_rtc_config)||void 0===m?void 0:m.standard)&&(!1===(null==e?void 0:e.web_rtc_config.standard)?this._ctx.enableStandardHandler=!1:Array.isArray(null==e||null===(_=e.web_rtc_config)||void 0===_?void 0:_.standard_ua_reg)?this._ctx.enableStandardHandler=null==e?void 0:e.web_rtc_config.standard_ua_reg.every((e=>"string"==typeof e&&new RegExp(e).test(navigator.userAgent))):this._ctx.enableStandardHandler=!1)}_preConnect(e){var t;let i=WZ("PRE_ICE");var o;("boolean"==typeof(null==e||null===(t=e.web_rtc_config)||void 0===t?void 0:t.pre_ice)&&(i=e.web_rtc_config.pre_ice),i)&&(this._logger.print("preConnect","start pre ice connection."),this._ctx.signalingManager.connect(),null===(o=this._monitor)||void 0===o||o.set({pre_connection:!0}),this._ctx.isPreConnection=!0)}}class cG{constructor(e){Hu(this,"_reconnectTimer",void 0),Hu(this,"_retryFunc",void 0),Hu(this,"_abortControllers",[]),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_groupConfigId",Kf()),Hu(this,"_retryLimiter",new aG),Hu(this,"_timer",void 0),Hu(this,"_destroyed",!1),Hu(this,"_onlineListener",(()=>{this._reconnectTimer&&this._retryFunc&&(clearTimeout(this._reconnectTimer),this._retryFunc())})),Hu(this,"_decisionConfig",void 0),this._ctx=e,this._monitor=mv(e.id),this.logger=new xv("ICERequest",4,e.id),this._decisionConfig=new dG(e),window.addEventListener("online",this._onlineListener)}async getICENode(e){let t;this.logger.info("getICENode","invoke");try{if(t=await this._getAccessWithRetry(e),0===t.length)throw new Error("server return empty nodes.")}catch(i){throw this._reportRtcInvokeStatus("es.join.getNodeFailed",i),new LS(RS.ICE_SERVER_WRONG,"get ICE config failed: ".concat(i.message),i)}return this.logger.success("getICENode","success"),this._reportRtcInvokeStatus("es.join.getNodeSuccess",t),t}_getAccessWithRetry(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return 0!==t&&this.logger.info("_getAccessWithRetry()","invoke feedbackInfo: %o, 201count: %o",e,t),new Promise(((i,o)=>{this._getAccessNode(e).then((e=>{this._retryLimiter.reset(),i(e)})).catch((s=>{if(this._destroyed)return;if(Array.isArray(s)&&s.length>0){if(s.findIndex((e=>400<=e.code&&e.code<500))>-1)return this._retryLimiter.reset(),o(new Error("HTTP request failed(4xx)"));if(s.every((e=>{var t;return 201===e.code||201===(null===(t=e.error)||void 0===t?void 0:t.code)}))&&t++,3===t)return this._retryLimiter.reset(),o(new Error("HTTP request failed(201)"))}const r=this._retryLimiter.getRetryDelay();this.logger.warn("_getAccessWithRetry()","_getAccessWithRetry error, will retry after ".concat(r,"ms"),s),this._retryFunc=()=>{this._getAccessWithRetry(e,t).then(i).catch(o)},this._reconnectTimer=self.setTimeout(this._retryFunc,r)}))}))}async _getAccessNode(e){return new Promise(((t,i)=>{const o=TS.getAccessNode(this._ctx.appId);if(o){const i=(Array.isArray(o)?o:[o]).map((e=>(e.cache_status=!0,e)));this.logger.info("getAccessNode","use cache node."),t(i),this._timer=setTimeout((()=>{this._getAccessNodeFromServer(e).catch((()=>{})),this._reportRtcInvokeStatus("es.R.node.cache",o),delete this._timer}),0)}else this._getAccessNodeFromServer(e).then(t).catch(i)}))}async _getAccessNodeFromServer(e){const{urls:t,needFallback:i}=this._getAccessUrls();return this.getICEConfigFromServer(t,e).then((e=>{const{nodes:t,decisionConfig:i}=e;return!this._ctx.useCloudProxy&&(null==t?void 0:t.length)>0&&TS.setAccessNode(this._ctx.appId,t,e.ttl||11200),i&&this._decisionConfig.updateConfig(i,!1),e.dispatchDomains&&!this._ctx.useCloudProxy&&TS.setAccessUrls(e.dispatchDomains),t})).catch((t=>{if(i)return this._reportRtcInvokeStatus("es.R.req.fallback",""),TS.clearAccessUrls(),this._getAccessNodeFromServer(e);throw t}))}_getAccessUrls(){let e=TS.getAccessUrls()||[],t=!0;return 0!==e.length?this._reportRtcInvokeStatus("es.R.req.cache.urls",e):(t=!1,e=XZ.ICE_CONFIG_REQUEST_URLS,0!==e.length?this._reportRtcInvokeStatus("es.R.req.external.urls",e):(e=XZ.ICE_CONFIG_REQUEST_URLS_INTERNAL,this._reportRtcInvokeStatus("es.R.req.internal.urls",e))),{urls:e,needFallback:t}}async getICEConfigFromServer(e,t){var i;const o={appID:this._ctx.appId,deviceID:TS.getDeviceId(),os:"web",sdkVersion:XZ.VERSION,isOversea:XZ.OVERSEA,expectedAddr:WZ("EXPECTED_ADDR"),productPlatform:"VolcEngine",enableCloudProxy:this._ctx.useCloudProxy,expectedIDC:this._ctx.expectedIDC,decisionKeys:["rts_report","web_join_room","web_rtc_config","rts_qps","rts_config"],accessParams:JSON.stringify({requireICEUfragV2:!0}),userAgent:null===(i=navigator)||void 0===i?void 0:i.userAgent};var s;t&&(o.feedbackInfo=t,"ICE_FAILED"!==(null===(s=t[0])||void 0===s||null===(s=s.feedbackReason)||void 0===s?void 0:s.type)&&delete o.expectedAddr);"AREA_CODE_US_OPCO"===WZ("AREA_CODE")&&(o.mediaArea=JSON.stringify([{AreaList:["GEO:US_OPCO"],Attribute:"include"}]),o.accessArea=JSON.stringify([{AreaList:["GEO:US_OPCO"],Attribute:"include"}]));return(e=>new Promise(((t,i)=>{let o=(e=Array.isArray(e)?e:[]).length;const s=[];0===o?i([]):e.forEach((e=>{e.then((e=>{t(e)}),(e=>{o--,s.push(e),0===o&&i(s)}))}))})))(e.map((e=>this._httpRequest(e,o))))}async _httpRequest(e,t){var i;const o=Kf();t.connectSessionID=o;const s=Date.now();null===(i=this._monitor)||void 0===i||i.report("rtc_get_access",{error_code:0,message:JSON.stringify(t),elapse:0,type:"request",host:e,config_id:o,group_config_id:this._groupConfigId});const r=new AbortController;let n;this._abortControllers.push(r);try{var a;try{n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},mode:"cors",body:JSON.stringify(t),signal:r.signal})}catch(u){var d;if(l=fetch,!Function.prototype.toString.call(l).includes("[native code]"))null===(d=this._monitor)||void 0===d||d.report("rtc_error",{error_code:rG.Fetch_MODIFY,message:"get access failed, possibly due to modifying the browser's Fetch API."},{origin_error:u});throw u}if(this._abortControllers=this._abortControllers.filter((e=>e!==r)),200!==n.status)throw{message:n.statusText,code:n.status};const i=await n.json();if(200!==i.code)throw i;return null===(a=this._monitor)||void 0===a||a.report("rtc_get_access",{error_code:200,message:JSON.stringify(i),elapse:Date.now()-s,type:"response",host:e,config_id:o,group_config_id:this._groupConfigId}),i}catch(m){var c;throw null===(c=this._monitor)||void 0===c||c.report("rtc_get_access",{error_code:Number((null==m?void 0:m.code)||(null==m?void 0:m.server_code)),message:null==m?void 0:m.message,elapse:Date.now()-s,type:"response",host:e,config_id:o,group_config_id:this._groupConfigId},{error:JSON.stringify(m)}),m}var l}destroy(){this._destroyed=!0,window.removeEventListener("online",this._onlineListener),this._abortControllers.forEach((e=>e.abort("engine destroy"))),this._reconnectTimer&&(window.clearTimeout(this._reconnectTimer),delete this._reconnectTimer),this._timer&&(window.clearTimeout(this._timer),delete this._timer)}_reportRtcInvokeStatus(e,t){var i;null===(i=this._monitor)||void 0===i||i.report("rtc_invoke_status",{sdk_api_name:e,message:t,error_code:0,stream_id:"",elapse:0,group_config_id:this._groupConfigId})}}function lG(e,t){return Ju(Ju({},e),t)}function uG(e){const t={};return Object.keys(e).forEach((i=>{const o=e[i];try{Array.isArray(o)?t[i]=o.map((e=>null!==e&&"object"==typeof e?uG(e):e)):t[i]=null!==o&&"object"==typeof o?uG(o):o}catch(s){}})),t}function mG(e){return null===e?[]:Object.keys(e).map((t=>e[t]))}const hG=new xv("FirefoxHandler",3),pG=Math.pow(2,32),bG="kp34Za0H+aVf862l";function _G(e){return e>pG-18?(hG.warn("generateAllSsrc","reset start id",e),_G(e=e-pG+1e4+18)):{audio:e,audioFec:e+1,audioRtx:e+2,video:e+3,videoFec:e+4,videoRtx:e+5,next:e+18}}const yG=function(e,t,i){return[{id:i,attribute:"cname",value:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"o/i14u9pJrxRKAsu"},{id:i,attribute:"msid",value:"".concat(e," ").concat(e,"-").concat(t)},{id:i,attribute:"mslabel",value:"".concat(e)},{id:i,attribute:"label",value:"".concat(e,"-").concat(t)}]},vG=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const o=t.video,s=t.videoRtx,r=t.videoFec,n=[o,s],{cname:a,flexfec:d}=i;d&&n.push(r);const c=n.reduce(((t,i)=>t.concat(yG(e,"video",i,a))),[]),l=[{semantics:"FID",ssrcs:"".concat(o," ").concat(s)}];return d&&l.push({semantics:"FEC-FR",ssrcs:"".concat(o," ").concat(r)}),{ssrcs:c,ssrcGroups:l}};function SG(e){return e.direction="inactive",e.port=0,delete e.ext,delete e.ssrcs,delete e.ssrcGroups,delete e.simulcast,delete e.simulcast_03,delete e.rids,delete e.extmapAllowMixed,delete e.msid,delete e.bundleOnly,e}const ZG=function(e,t,i){let o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const s=Ju(Ju({},e),{},{media:[]});return o&&(s.invalid=[{value:"realx-exts:rscp"}]),t&&s.media.push(uG(t)),i&&s.media.push(uG(i)),delete s.groups,delete s.msidSemantic,VG(s)};function fG(e){const t={},{publicIPs:i,certFingerprint:o,iceParams:s,iceConfig:r}=e;return t.fingerprint={type:"sha-256",hash:o},t.icePwd=s.serverIcePwd,t.iceUfrag=TG(s.serverIceUfrag),t.candidates=function(e,t){if(!Array.isArray(e))return[];let i=0;const o=2130706431,s=[];return e.forEach((e=>{const r={component:1,ip:e.ip,type:"host",generation:e.generation};e.udpPorts&&!t.tcpOnly&&e.udpPorts.forEach((e=>{s.push(Ju(Ju({},r),{},{foundation:i++,transport:"udp",port:e,priority:o}))})),e.tcpPorts&&e.tcpPorts.forEach((e=>{s.push(Ju(Ju({},r),{},{foundation:i++,transport:"tcp",port:e,tcptype:"passive",priority:o-1e3}))}))})),s}(i,r),t.setup="active",t.iceOptions="renomination",t}const TG=e=>{const t=(new TextEncoder).encode("PREC"),i=nT(e),o=new Uint8Array(4);crypto.getRandomValues(o);const s=new Uint8Array(2);s[0]=0,s[1]=1;return aT(Ff(Uint8Array,t,i,o,s))};var IG=(e=>(e[e.kICEConfigTypeSrtpDtlsType=0]="kICEConfigTypeSrtpDtlsType",e[e.kICEConfigTypeRenominationType=1]="kICEConfigTypeRenominationType",e[e.kICEConfigTypeTcpType=2]="kICEConfigTypeTcpType",e[e.kICEConfigTypeMultiSendType=3]="kICEConfigTypeMultiSendType",e[e.kICEConfigTypeKcpType=4]="kICEConfigTypeKcpType",e[e.kICEConfigTypeSrtpSdesType=5]="kICEConfigTypeSrtpSdesType",e))(IG||{});function gG(e){let{random:t,serverUfrag:i,serverPwd:o,clientPwd:s,options:r}=e,n=0;const a=(new TextEncoder).encode("WPRE");n+=4,t||(t=new Uint8Array(4),crypto.getRandomValues(t)),n+=4;const d=nT(i);n+=1,n+=d.byteLength;const c=dT(nT(s),nT(o).subarray(0,16),nT(i).subarray(0,16));n+=1,n+=c.byteLength;const l=new Uint8Array(Object.keys(r).reduce(((e,t)=>{const i=Number(t);return e.push(i),e.push(r[i]?1:0),e}),[]));n+=l.byteLength;let u=Ff(Uint8Array,a,t,[d.byteLength],d,[c.byteLength],c,l);u.byteLength%3!=0&&(u=Ff(Uint8Array,u,new Uint8Array(3-u.byteLength%3).fill(255)));return[aT(u),aT(Ff(Uint8Array,t,d.subarray(0,20)))]}const RG=(e,t)=>{if(!Array.isArray(e.fmtp)||!Array.isArray(e.rtp))return;for(let o=0;o<e.rtp.length;o++){if(e.rtp[o].codec.toUpperCase()===t.toUpperCase()){e.rtp.unshift(e.rtp.splice(o,1)[0]);break}}const i=[];e.rtp.forEach((e=>i.push(e.payload))),e.payloads=i.join(" ")},XG=(e,t)=>{let i=0;if(!Array.isArray(e.fmtp)||!Array.isArray(e.rtp))return;for(const s of e.fmtp)if(s.config.includes("level-asymmetry-allowed=1")&&s.config.includes("packetization-mode=1")&&s.config.includes("profile-level-id=42e0")){i=s.payload;break}for(let s=0;s<e.rtp.length;s++){const o=e.rtp[s];if("H264"===t){if(o.payload===i){e.rtp.unshift(e.rtp.splice(s,1)[0]);break}}else if(o.codec===t){e.rtp.unshift(e.rtp.splice(s,1)[0]);break}}const o=[];e.rtp.forEach((e=>o.push(e.payload))),e.payloads=o.join(" ")},LG=e=>{e.media.forEach((e=>{"audio"!==e.type&&"video"!==e.type||e.rtp.forEach((t=>{e.rtcpFb||(e.rtcpFb=[]),e.rtcpFb.find((e=>e.payload===t.payload&&"rrtr"===e.type))||e.rtcpFb.push({payload:t.payload,type:"rrtr"})}))}))},CG=function(e,t,i){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{rrtr:!1};const s={},r={};let n=-1;const a=[];return Array.isArray(e.fmtp)&&e.fmtp.forEach((e=>{let{payload:t,config:i}=e;if(i.startsWith("apt=")){const e=i.slice(4);s[t]=e}else i.includes("42e0")&&i.includes("packetization-mode=1")&&(n=t)})),Array.isArray(e.rtp)&&(e.rtp=e.rtp.filter((e=>{const i=e.codec,o=e.payload;let d;switch(i){case"H264":return d=!1,t.map((e=>{"H264"===e&&o===n&&(r[o]=o,a.push(o),d=!0)})),d;case"rtx":return!!r[s[o]]&&(r[o]=o,!0);case"red":case"ulpfec":case"flexfec-03":return r[o]=o,!0;default:return d=!1,t.map((e=>{e===i&&(r[o]=o,a.push(o),d=!0)})),d}}))),Array.isArray(e.fmtp)&&(e.fmtp=e.fmtp.filter((e=>r[e.payload]))),Array.isArray(e.rtcpFb)?e.rtcpFb=e.rtcpFb.filter((e=>r[e.payload])):e.rtcpFb=[],o.rrtr&&a.forEach((t=>{var i;null===(i=e.rtcpFb)||void 0===i||i.push({payload:t,type:"rrtr"})})),GG(e,i),Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>{if("http://www.webrtc.org/experiments/rtp-hdrext/video-content-type"!==e.uri&&"http://www.webrtc.org/experiments/rtp-hdrext/video-timing"!==e.uri&&"http://www.webrtc.org/experiments/rtp-hdrext/color-space"!==e.uri)return e}))),"string"==typeof e.payloads&&(e.payloads=e.payloads.split(" ").filter((e=>r[e])).join(" ")),e},WG=function(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{rrtr:!1};const o={};if(Array.isArray(e.rtp)&&(e.rtp=e.rtp.filter((e=>{const t=e.codec,i=e.payload;return("opus"===t||"red"===t)&&(o[i]=i,!0)}))),Array.isArray(e.rtcpFb)||(e.rtcpFb=[]),i.rrtr&&Object.keys(o).forEach((t=>{var i;null===(i=e.rtcpFb)||void 0===i||i.push({payload:Number(t),type:"rrtr"})})),GG(e,t),"string"==typeof e.payloads){const t=[];e.payloads.split(" ").forEach((e=>{o[e]&&t.push(e)})),e.payloads=t.join(" ")}return e},GG=(e,t)=>{e.iceOptions&&delete e.iceOptions,e.icePwd&&(t.icePwd=e.icePwd,delete e.icePwd),e.iceUfrag&&(t.iceUfrag=e.iceUfrag,delete e.iceUfrag),e.fingerprint&&(t.fingerprint=e.fingerprint,delete e.fingerprint)},VG=e=>PG(e,"H265","ByteVC1"),EG=e=>PG(e,"ByteVC1","H265"),PG=(e,t,i)=>{const o="string"==typeof e?Tf.parse(e):e;return o.media=o.media.map((e=>("video"===e.type&&(e.rtp=e.rtp.map((e=>(e.codec===t&&(e.codec=i),e)))),e))),Tf.write(o)};function kG(e,t){const i=(new Error).stack;if(!e){cv("[DCHECK FAILED] ".concat(t),-1,{stack:i});for(var o=arguments.length,s=new Array(o>2?o-2:0),r=2;r<o;r++)s[r-2]=arguments[r];throw console.error("[DCHECK FAILED]",t,...s),new Error("[DCHECK FAILED], ".concat(t))}}const xG=cZ(),NG={iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"};var MG=(e=>(e[e.DC_ERROR=0]="DC_ERROR",e[e.DC_CLOSE=1]="DC_CLOSE",e[e.ICE_FAILED=2]="ICE_FAILED",e[e.DESTROY=3]="DESTROY",e[e.TIMEOUT=4]="TIMEOUT",e))(MG||{});let YG=0;class wG extends Ig{constructor(e,t){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];super(),Hu(this,"uuid",(YG++).toString()),Hu(this,"_peerConnectionId",""),Hu(this,"audioTrack4ff",void 0),Hu(this,"_pc",void 0),Hu(this,"_dc",void 0),Hu(this,"_iceNode",void 0),Hu(this,"_initSctpEvents",!1),Hu(this,"_monitor",void 0),Hu(this,"_offerIce",{}),Hu(this,"_answerIce",{}),Hu(this,"_offerSession",void 0),Hu(this,"_answerSession",void 0),Hu(this,"_offerMlines",[]),Hu(this,"_answerMlines",[]),Hu(this,"_connectReject",void 0),Hu(this,"_closeManually",!1),Hu(this,"_logger",void 0),Hu(this,"_destroyed",!1),Hu(this,"_reportTimer",void 0),Hu(this,"_onLineCheckerTimer",void 0),Hu(this,"_clearPeerListeners",void 0),Hu(this,"_peerConfig",void 0),Hu(this,"_iceStartTs",0),Hu(this,"_icePreStepTs",0),this._ctx=e,this._groupConnectionId=t,this._isReconnect=i,this._monitor=mv(e.id),this._logger=new xv("PeerConnection_".concat(this.uuid),4,e.id),this._ctx.enableFallbackHandler&&this._logger.warn("ctor","PeerConnection running in fallback mode"),this._peerConfig=KG(e),this._pc=new RTCPeerConnection(this._peerConfig),this._pc.ontrack=e=>{var t;const i=null===(t=e.streams)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.id;this._print("pc.ontrack","".concat(e.track.kind," ").concat(e.track.id," ").concat(i)),"ff-stream"===i&&(this.audioTrack4ff=e.track),this.emit("ontrack",e)},this._pc.onconnectionstatechange=()=>{this._print("onconnectionstatechange","".concat(this._pc.connectionState,". ice -> ").concat(this._pc.iceConnectionState)),"failed"!==this._pc.iceConnectionState&&"closed"!==this._pc.iceConnectionState&&"failed"!==this._pc.connectionState?"disconnected"!==this._pc.connectionState?"connecting"!==this._pc.connectionState&&"connected"!==this._pc.connectionState||clearInterval(this._onLineCheckerTimer):navigator.onLine?this.emit("disconnect",QG.ICE_FAILED):this._onLineCheckerTimer=setInterval((()=>{navigator.onLine&&(clearInterval(this._onLineCheckerTimer),this.emit("disconnect",QG.ICE_FAILED))}),1e3):this.emit("disconnect",QG.ICE_FAILED)},this._pc.oniceconnectionstatechange=()=>{const e=this._pc.iceConnectionState;this._report("rtc_pre_ice_state",{message:e,ice_state:e.toUpperCase()}),this.emit("ice_state",e)}}static checkSupported(){if(!RTCPeerConnection)throw new LS(RS.NOT_SUPPORTED,"missing RTCPeerConnection API.");["addTransceiver","createDataChannel","createOffer","setLocalDescription","setRemoteDescription"].forEach((e=>{var t;if(null===(t=RTCPeerConnection)||void 0===t||null===(t=t.prototype)||void 0===t||!t[e])throw new LS(RS.NOT_SUPPORTED,"missing peer.".concat(e," API."))}))}getOriginRTCPeerConnection(){return this._pc}getConnectionId(){return this._peerConnectionId}getGroupConnectionId(){return this._groupConnectionId}getIceConnectionState(){return this._pc.iceConnectionState}async createOfferSdp(){let{sdp:e}=await this._pc.createOffer();return e}_reportFailureIPCallback(){var e,t;this.emit("join_room_failed_private_callback",(t=null===(e=this._iceNode)||void 0===e?void 0:e.publicIPs)&&0!==t.length?t.map((e=>{const{ip:t,tcpPorts:i,udpPorts:o}=e;return{ip:t,tcpPorts:i,udpPorts:o}})):[])}async startIceConnect(e){if(this._ctx.enableStandardHandler&&!this._ctx.enableFallbackHandler)return this.startIceConnectStandard(e);this.emit("__startIceConnect_hook",e),this._print("connect","invoke. %o",e),this._iceNode=e,this._closeManually=!1;const t=this._pc.createDataChannel("signaling",{negotiated:!0,id:100});t.binaryType="arraybuffer",this._dc=t;const{offerIce:i,answerIce:o}=this._genIceInfo(e);this._offerIce=i,this._answerIce=o,wv&&cS<138&&(this._pc.addTransceiver("audio",{direction:"recvonly"}),this._pc.addTransceiver("video",{direction:"recvonly"}));const s=await this.createOfferSdp();if(!s)throw new LS(RS.NOT_SUPPORTED,"create offer sdp failed.");const r=Tf.parse(s);this._peerConnectionId=o.iceUfrag||"";const n=!i.iceUfrag&&!i.icePwd;if(n){var a,d;const t="renomination"===(null===(a=r.media[0])||void 0===a?void 0:a.iceOptions)||!this._ctx.enableFallbackHandler&&this._ctx.pcKillSwitch.sld_iceoption_renomination;t||(delete i.iceOptions,delete o.iceOptions),delete i.iceUfrag,delete i.icePwd;const[s,n]=gG({serverUfrag:e.iceParams.serverIceUfrag,serverPwd:e.iceParams.serverIcePwd,clientPwd:null===(d=r.media[0])||void 0===d?void 0:d.icePwd,options:{[IG.kICEConfigTypeSrtpDtlsType]:!0,[IG.kICEConfigTypeRenominationType]:t}});this._peerConnectionId=n,o.iceUfrag=s,this._logger.info("use serverUfrag v2",JSON.stringify({dtls:!0,renomination:t}))}this.reportRtcPreIce("ice_start");const[c]=r.media;if(this._offerIce.fingerprint=r.fingerprint||c.fingerprint,wv||this._ctx.enableFallbackHandler){r.media=r.media.map((e=>{const t=Ju(Ju({},e),this._offerIce);var i,o,s,r;"video"===t.type&&(mZ?(t.ext=null===(i=t.ext)||void 0===i?void 0:i.filter((e=>-1===e.uri.indexOf("abs-send-time"))),t.rtcpFb=null===(o=t.rtcpFb)||void 0===o?void 0:o.filter((e=>"goog-remb"!==e.type))):(t.rtcpFb=null===(s=t.rtcpFb)||void 0===s?void 0:s.filter((e=>"transport-cc"!==e.type)),t.ext=null===(r=t.ext)||void 0===r?void 0:r.filter((e=>-1===e.uri.indexOf("transport")))));return t})),hZ&&LG(r);const e=Ju({},r);e.fingerprint=this._answerIce.fingerprint,e.media=e.media.map((e=>(delete(e=Ju(Ju({},e),this._answerIce)).bundleOnly,e.port=9,"application"===e.type?e.sctpmap={sctpmapNumber:5e3,app:"webrtc-datachannel",maxMessageSize:262144}:("audio"===e.type&&(e.msid="ff-stream ff-stream-audio"),e.direction="sendonly"),e))),hZ&&LG(e),this._ctx.enableFallbackHandler?await this.setLocalDescription(s):await this.setLocalDescription(Tf.write(r)),await this.setRemoteDescription(Tf.write(e))}else{delete r.media,this._offerSession=Ju({},r),this._answerSession=Ju({},r),this._answerSession.fingerprint&&(this._answerSession.fingerprint=this._answerIce.fingerprint);const e=0;n&&(this._offerIce.iceUfrag=c.iceUfrag,this._offerIce.icePwd=c.icePwd),this._offerMlines=[Ju(Ju(Ju({},c),this._offerIce),{},{mid:"".concat(e)})],this._answerMlines=[Ju(Ju(Ju({},c),this._answerIce),{},{sctpmap:{sctpmapNumber:5e3,app:"webrtc-datachannel",maxMessageSize:262144},mid:"".concat(e)})],this.setDescription()}return this._reportTransportStats(),await new Promise(((e,i)=>{this._connectReject=i;const o=setTimeout((()=>{var e;this.reportRtcPreIce("timeout"),this._reportFailureIPCallback(),null===(e=this._connectReject)||void 0===e||e.call(this,{code:4,message:"connect timeout"}),delete this._connectReject}),8e3),s=()=>{this._print("connect","dataChannel open"),this._reportRtcInvokeStatus("es.dc.open",""),this.reportRtcPreIce("datachannel_opened"),clearTimeout(o),e(""),delete this._connectReject},r=e=>{var t,i,s,r;this._report("rtc_signaling_msg_error",{error_code:null==e||null===(t=e.error)||void 0===t?void 0:t.sdpLineNumber,message:null==e||null===(i=e.error)||void 0===i?void 0:i.errorDetail,reason:"invalid data"}),this._reportRtcInvokeStatus("es.dc.error",""),this._reportFailureIPCallback(),null===(s=this._connectReject)||void 0===s||s.call(this,{message:"dc.onerror, ".concat(null===(r=e.error)||void 0===r?void 0:r.errorDetail),code:0}),this.emit("disconnect",QG.DC_ERROR),delete this._connectReject,clearTimeout(o)},n=()=>{var e;this._reportRtcInvokeStatus("es.dc.close",""),this._closeManually||this._reportFailureIPCallback(),null===(e=this._connectReject)||void 0===e||e.call(this,{message:"dc.onclose",code:1}),this.reportRtcPreIce("datachannel_closed"),this.emit("disconnect",QG.DC_CLOSE),delete this._connectReject,clearTimeout(o)},a=()=>{"connected"===this._pc.iceConnectionState?this.reportRtcPreIce("ice_connected"):"failed"!==this._pc.iceConnectionState&&"closed"!==this._pc.iceConnectionState||(this._reportFailureIPCallback(),this.reportRtcPreIce("ice_failed"))},d=()=>{var e;"failed"!==this._pc.iceConnectionState&&"closed"!==this._pc.iceConnectionState&&"failed"!==this._pc.connectionState||(this._reportFailureIPCallback(),null===(e=this._connectReject)||void 0===e||e.call(this,{message:"pc.connectionstatechange -> ".concat(this._pc.connectionState,", ice -> ").concat(this._pc.iceConnectionState),code:2}),delete this._connectReject,clearTimeout(o))};t.addEventListener("open",s),t.addEventListener("error",r),t.addEventListener("close",n),this._pc.addEventListener("iceconnectionstatechange",a),this._pc.addEventListener("connectionstatechange",d),this._clearPeerListeners=()=>{t.removeEventListener("open",s),t.removeEventListener("error",r),t.removeEventListener("close",n),this._pc.removeEventListener("iceconnectionstatechange",a),this._pc.removeEventListener("connectionstatechange",d)}})),this._print("connect","dataChannel establish success"),t}async startIceConnectStandard(e){this._print("connect","standard invoke. %o",e),this._iceNode=e;const t=this._pc.createDataChannel("signaling",{negotiated:!0,id:100});t.binaryType="arraybuffer",this._dc=t;const{offerIce:i,answerIce:o}=this._genIceInfo(e);this._offerIce=i,this._answerIce=o,wv&&cS<138&&(this._pc.addTransceiver("audio",{direction:"recvonly"}),this._pc.addTransceiver("video",{direction:"recvonly"}));const s=await this.createOfferSdp();if(!s)throw new LS(RS.NOT_SUPPORTED,"create offer sdp failed.");const r=Tf.parse(s);this._answerSession=Ju({},r),this._answerSession.fingerprint&&(this._answerSession.fingerprint=this._answerIce.fingerprint);const n=r.media.find((e=>"application"===e.type));this._peerConnectionId=o.iceUfrag||"";if(!i.iceUfrag&&!i.icePwd){const t=this._ctx.pcKillSwitch.sld_iceoption_renomination||"renomination"===(null==n?void 0:n.iceOptions);t||(delete i.iceOptions,delete o.iceOptions),delete i.iceUfrag,delete i.icePwd;const[s,r]=gG({serverUfrag:e.iceParams.serverIceUfrag,serverPwd:e.iceParams.serverIcePwd,clientPwd:null==n?void 0:n.icePwd,options:{[IG.kICEConfigTypeSrtpDtlsType]:!0,[IG.kICEConfigTypeRenominationType]:t}});this._peerConnectionId=r,o.iceUfrag=s,this._logger.info("use serverUfrag v2",JSON.stringify({dtls:!0,renomination:t}))}this.reportRtcPreIce("ice_start"),this._offerIce.fingerprint=r.fingerprint||n.fingerprint;const a=Ju({},r);return a.fingerprint=this._answerIce.fingerprint,a.media=a.media.map((e=>{if("application"===(e=Ju(Ju({},e),this._answerIce)).type&&(e.sctpmap={sctpmapNumber:5e3,app:"webrtc-datachannel",maxMessageSize:262144}),wv)if(delete e.bundleOnly,e.port=9,"audio"===e.type)e.msid="ff-stream ff-stream-audio",e.direction="sendonly";else if("video"===e.type){var t,i,o,s;if(mZ)e.ext=null===(t=e.ext)||void 0===t?void 0:t.filter((e=>-1===e.uri.indexOf("abs-send-time"))),e.rtcpFb=null===(i=e.rtcpFb)||void 0===i?void 0:i.filter((e=>"goog-remb"!==e.type));else e.rtcpFb=null===(o=e.rtcpFb)||void 0===o?void 0:o.filter((e=>"transport-cc"!==e.type)),e.ext=null===(s=e.ext)||void 0===s?void 0:s.filter((e=>-1===e.uri.indexOf("transport")));e.direction="sendonly"}return e})),"v1"===this.getIceVersion()||this._ctx.pcKillSwitch.sld_iceoption_renomination?(r.media=r.media.map((e=>e=Ju(Ju({},e),this._offerIce))),await this.setLocalDescription(Tf.write(r))):await this.setLocalDescription(s),await this.setRemoteDescription(Tf.write(a)),this._reportTransportStats(),await new Promise(((e,i)=>{this._connectReject=i;const o=setTimeout((()=>{var e;this.reportRtcPreIce("timeout"),null===(e=this._connectReject)||void 0===e||e.call(this,{code:4,message:"connect timeout"}),delete this._connectReject}),8e3),s=()=>{this._print("connect","dataChannel open"),this._reportRtcInvokeStatus("es.dc.open",""),this.reportRtcPreIce("datachannel_opened"),clearTimeout(o),e(""),delete this._connectReject},r=e=>{var t,i,s,r;this._report("rtc_signaling_msg_error",{error_code:null==e||null===(t=e.error)||void 0===t?void 0:t.sdpLineNumber,message:null==e||null===(i=e.error)||void 0===i?void 0:i.errorDetail,reason:"invalid data"}),this._reportRtcInvokeStatus("es.dc.error",""),null===(s=this._connectReject)||void 0===s||s.call(this,{message:"dc.onerror, ".concat(null===(r=e.error)||void 0===r?void 0:r.errorDetail),code:0}),this.emit("disconnect",QG.DC_ERROR),delete this._connectReject,clearTimeout(o)},n=()=>{var e;this._reportRtcInvokeStatus("es.dc.close",""),null===(e=this._connectReject)||void 0===e||e.call(this,{message:"dc.onclose",code:1}),this.reportRtcPreIce("datachannel_closed"),this.emit("disconnect",QG.DC_CLOSE),delete this._connectReject,clearTimeout(o)},a=()=>{"connected"===this._pc.iceConnectionState?this.reportRtcPreIce("ice_connected"):"failed"!==this._pc.iceConnectionState&&"closed"!==this._pc.iceConnectionState||this.reportRtcPreIce("ice_failed")},d=()=>{var e;"failed"!==this._pc.iceConnectionState&&"closed"!==this._pc.iceConnectionState&&"failed"!==this._pc.connectionState||(null===(e=this._connectReject)||void 0===e||e.call(this,{message:"pc.connectionstatechange -> ".concat(this._pc.connectionState,", ice -> ").concat(this._pc.iceConnectionState),code:2}),delete this._connectReject,clearTimeout(o))};t.addEventListener("open",s),t.addEventListener("error",r),t.addEventListener("close",n),this._pc.addEventListener("iceconnectionstatechange",a),this._pc.addEventListener("connectionstatechange",d),this._clearPeerListeners=()=>{t.removeEventListener("open",s),t.removeEventListener("error",r),t.removeEventListener("close",n),this._pc.removeEventListener("iceconnectionstatechange",a),this._pc.removeEventListener("connectionstatechange",d)}})),this._print("connect","dataChannel establish success"),t}async setDescription(e){this._print("setDescription","invoke."),this._offerSession.media=this._offerMlines,this._answerSession.media=this._answerMlines;const t=[];this._offerMlines.forEach((e=>{"inactive"!==e.direction&&e.mid&&t.push(e.mid)})),this._offerSession.groups&&this._answerSession.groups&&(this._offerSession.groups[0].mids=t.join(" "),this._answerSession.groups[0].mids=t.join(" "));const i=Hf();e&&this._report("rtc_begin_create_offer",{direction:"local"===e.streamUserId?"up":"down",stream_id:e.streamId,stream_user_id:e.streamUserId,pc_session_id:this._peerConnectionId,vendor_mode:0}),e&&this._report("rtc_create_offer",{error_code:0,direction:"local"===e.streamUserId?"up":"down",stream_id:e.streamId,stream_user_id:e.streamUserId,elapse:Hf()-i}),await this.setLocalDescription(Tf.write(this._offerSession),e),await this.setRemoteDescription(Tf.write(this._answerSession),e)}async setLocalDescription(e,t){const i=Hf();try{if(await this._pc.setLocalDescription({type:"offer",sdp:e}),this._report("rtc_set_description",{error_code:0,message:e,is_local:"1",direction:"local"===(null==t?void 0:t.streamUserId)?"up":"down",stream_id:(null==t?void 0:t.streamId)||"",stream_user_id:(null==t?void 0:t.streamUserId)||"",elapse:Hf()-i},{type:"offer"}),!this._initSctpEvents){var o;this._initSctpEvents=!0;const e=null===(o=this._pc)||void 0===o?void 0:o.sctp;e&&(e.onstatechange=()=>{this._reportRtcInvokeStatus("sctp","sctp state change TO: ".concat(e.state))},e.transport&&(e.transport.onstatechange=()=>{var t;this._reportRtcInvokeStatus("dtls","dtls state change TO: ".concat(null==e||null===(t=e.transport)||void 0===t?void 0:t.state))}))}}catch(s){throw console.error("setLocal",s),this._report("rtc_set_description",{error_code:-1,message:s.message+e,is_local:"1",direction:"local"===(null==t?void 0:t.streamUserId)?"up":"down",stream_id:"",stream_user_id:"",elapse:Hf()-i},{type:"offer"}),s}}async setRemoteDescription(e,t){const i=Hf();try{await this._pc.setRemoteDescription({type:"answer",sdp:e}),this._report("rtc_set_description",{error_code:0,message:e,is_local:"0",direction:"local"===(null==t?void 0:t.streamUserId)?"up":"down",stream_id:(null==t?void 0:t.streamId)||"",stream_user_id:(null==t?void 0:t.streamUserId)||"",elapse:Hf()-i},{type:"answer"})}catch(o){throw console.error("setRemote",o),this._report("rtc_set_description",{error_code:-1,message:o.message+e,is_local:"0",direction:"local"===(null==t?void 0:t.streamUserId)?"up":"down",stream_id:(null==t?void 0:t.streamId)||"",stream_user_id:(null==t?void 0:t.streamUserId)||"",elapse:Hf()-i},{type:"answer"}),o}}closeIceConnect(){var e,t,i,o,s;this._closeManually=!0,null===(e=this._connectReject)||void 0===e||e.call(this,{code:3,message:"invoke destroy()"}),delete this._connectReject,this._closeManually=!0,null===(t=this._pc)||void 0===t||t.close(),null===(i=this._dc)||void 0===i||i.close(),delete this._dc,this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.oniceconnectionstatechange=null,s=this._pc,QW.has(s)&&QW.delete(s),null===(o=this._clearPeerListeners)||void 0===o||o.call(this),delete this._clearPeerListeners}reportRtcPreIce(e){var t;const i=Hf();"ice_start"===e&&(this._iceStartTs=i,this._icePreStepTs=i),this._report("rtc_pre_ice",{connect_event:e,message:e,elapse:i-this._icePreStepTs,total_elapse:i-this._iceStartTs,cache_status:!(null===(t=this._iceNode)||void 0===t||!t.cache_status),is_reconnect:this._isReconnect}),this._icePreStepTs=i}getStatsWithLowFrequency(e,t,i){return(async(e,t,i,o)=>{const s=null==t?void 0:t.id;if(!(e instanceof RTCPeerConnection))return[];if(wv||Kv){const i=[];try{(o?await o.getStats():await e.getStats(t)).forEach((e=>{i.push(e)}))}catch(d){}return i}let r=QW.get(e);(!r||Date.now()-r.timestamp>150)&&(r={timestamp:Date.now(),statsPromise:$W(e),extraStatsPromise:qW(e)},QW.set(e,r));const n=await r.statsPromise;let a=(s?n[s]:n.all)||[];if(!i){const e=await r.extraStatsPromise;a=a.concat((s?e.getTrackStats(s):e.all)||[])}return a})(this._pc,e,t,i)}getIceVersion(){var e,t;return null!==(e=this._iceNode)&&void 0!==e&&e.iceParams.clientIceUfrag||null!==(t=this._iceNode)&&void 0!==t&&t.iceParams.clientIcePwd?"v1":"v2"}createAnswerSdp(e,t){kG(this._answerSession,"_answerSession should be existed");const i=Ju({},this._answerSession);i.media=e,i.groups=t;return Tf.write(i)}destroy(){this._print("destroy",this._peerConnectionId),super.removeAllListeners(),this.closeIceConnect(),this._destroyed=!0,this._reportTimer&&(clearTimeout(this._reportTimer),delete this._reportTimer),this._onLineCheckerTimer&&(clearInterval(this._onLineCheckerTimer),delete this._onLineCheckerTimer),delete this._pc}_genIceInfo(e){var t,i;return{offerIce:{iceUfrag:null===(t=e.iceParams)||void 0===t?void 0:t.clientIceUfrag,icePwd:null===(i=e.iceParams)||void 0===i?void 0:i.clientIcePwd,iceOptions:"renomination"},answerIce:fG(e)}}async _reportTransportStats(){const e=await this.getStatsWithLowFrequency(),t={};var i;(e.forEach((e=>{"transport"===e.type?(t.dtls_state=e.dtlsState,t.bytes_received=e.bytesReceived,t.bytes_sent=e.bytesSent,t.ice_state=e.iceState,t.packets_received=e.packetsReceived,t.packets_sent=e.packetsSent,t.selected_candidate_pair_changes=e.selectedCandidatePairChanges):"local-candidate"===e.type||"remote-candidate"===e.type?t.candidates_info=[...t.candidates_info||[],{id:e.id,is_remote:e.isRemote,port:e.port,protocol:e.protocol,candidate_type:e.candidateType,priority:e.priority,network_type:e.networkType,candidate_ip:e.ip}]:"candidate-pair"===e.type&&(t.candidatePairsInfo={},t.candidatePairsInfo.candidate_state=e.state,t.candidatePairsInfo.writable_state=e.writable,t.candidatePairsInfo.sent_ping_requests_total=e.requestsSent,t.candidatePairsInfo.recv_ping_requests=e.requestsReceived,t.candidatePairsInfo.sent_ping_responses=e.responsesSent,t.candidatePairsInfo.recv_ping_responses=e.responsesReceived,t.candidatePairsInfo.current_rtt=e.currentRoundTripTime,t.candidatePairsInfo.total_rtt=e.totalRoundTripTime,["localCandidateId","remoteCandidateId","bytesSent","bytesReceived","availableOutgoingBitrate","availableIncomingBitrate","bytesDiscardedOnSend","consentRequestsSent","packetsDiscardedOnSend","lastPacketReceivedTimestamp","lastPacketSentTimestamp"].forEach((i=>{var o;void 0!==e[i]&&(t.candidatePairsInfo[(o=i,o.replace(/[A-Z]/g,(e=>"_".concat(e.toLowerCase()))))]=e[i])})))})),Object.keys(t).length>0)&&(null===(i=this._monitor)||void 0===i||i.report("rtc_transport_statistics",t));if(!this._destroyed){const e="connected"===this._pc.iceConnectionState&&"connected"===this._pc.connectionState;this._reportTimer=setTimeout((()=>{this._reportTransportStats()}),e?5e3:1e3)}}_print(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];this._logger.info("".concat(e),...i)}_report(e,t,i){var o,s,r;null===(o=this._monitor)||void 0===o||o.report(e,Ju(Ju({},t),{},{connection_id:this._peerConnectionId,group_connection_id:this._groupConnectionId}),Ju(Ju({},i),{},{tcp_only:null===(s=this._iceNode)||void 0===s?void 0:s.iceConfig.tcpOnly,ms_addr:JSON.stringify((null===(r=this._iceNode)||void 0===r?void 0:r.publicIPs.map((e=>({ip:e.ip,tcp:e.tcpPorts,udp:e.udpPorts}))))||[])}))}_reportRtcInvokeStatus(e,t){this._report("rtc_invoke_status",{sdk_api_name:e,message:t,error_code:0,stream_id:"",elapse:0})}}const KG=e=>{const t=Ju({},NG);return e.pcKillSwitch.ctor_sdpsemantics_add&&(t.sdpSemantics="unified-plan"),e.pcKillSwitch.ctor_encodedinsetablestream_add&&xG&&!WZ("DISABLE_ENCODED_TRANSFORM")&&(t.encodedInsertableStreams=!0),t};var HG=(e=>(e[e.SEND=0]="SEND",e[e.FEEDBACK=1]="FEEDBACK",e))(HG||{}),FG=(e=>(e[e.P2P=0]="P2P",e[e.SIGNAL=1]="SIGNAL",e[e.BROADCAST=2]="BROADCAST",e[e.BUSINESS_SERVER=3]="BUSINESS_SERVER",e))(FG||{}),JG=(e=>(e[e.SUCCESS=0]="SUCCESS",e[e.TIMEOUT=1]="TIMEOUT",e[e.BROKEN=2]="BROKEN",e[e.NO_RECEIVER=3]="NO_RECEIVER",e[e.NO_RELAYPATH=4]="NO_RELAYPATH",e[e.EXCEED_QPS=5]="EXCEED_QPS",e[e.SEND_TO_SERVER_ERROR=17]="SEND_TO_SERVER_ERROR",e[e.SERVER_RESPONSE_ERROR=18]="SERVER_RESPONSE_ERROR",e[e.NOT_JOIN=100]="NOT_JOIN",e[e.NOT_LOGIN=105]="NOT_LOGIN",e[e.SERVER_PARAMS_NOTSET=106]="SERVER_PARAMS_NOTSET",e[e.UNKNOWN=1e3]="UNKNOWN",e))(JG||{});const OG={0:[0,"success"],1:[RS.USER_MESSAGE_TIMEOUT,"timeout, failed to send."],2:[RS.USER_MESSAGE_BROKEN,"dataChannel broken, failed to send."],3:[RS.USER_MESSAGE_NO_RECEIVER,"cannot find the receiver."],4:[RS.USER_MESSAGE_NO_RECEIVER,"cannot find relay path."],5:[RS.USER_MESSAGE_EXCEED_QPS,"cannot find relay path."],17:[RS.USER_MESSAGE_SEND_TO_SERVER_ERROR,"failed to send to business server."],18:[RS.USER_MESSAGE_SERVER_RESPONSE_ERROR,"business server response error."],100:[RS.USER_MESSAGE_NOT_JOIN,"not join room"],105:[RS.USER_MESSAGE_NOT_LOGIN,"not login."],106:[RS.USER_MESSAGE_SERVER_PARAMS_NOTSET,"server param is not set."],1e3:[RS.USER_MESSAGE_UNKNOWN,"unknown."]},UG=["msg"],DG=[],AG=[Wg.ENGINE_CONTROL_MESSAGE];var zG=(e=>(e[e.C2S=0]="C2S",e[e.C2C=1]="C2C",e[e.C2GW=2]="C2GW",e[e.C2CDirect=3]="C2CDirect",e[e.C2RTM=4]="C2RTM",e))(zG||{});class jG extends Zg.EventEmitter{constructor(e,t,i){super(),Hu(this,"_singlingCache",new Map),Hu(this,"_p2pCache",new Map),Hu(this,"_rttIds",{}),Hu(this,"_p2pMessageId",new sT),Hu(this,"_clearDataChannelListener",void 0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),this.id=e,this._dataChannel=t,this.connectionIds=i,this._clearDataChannelListener=this._handleHandler(),this._monitor=mv(e),this.logger=new xv("DataChannelSignaling",3,e)}destroy(){this._clearDataChannelListener(),delete this._dataChannel,this._singlingCache.forEach(((e,t)=>{e.error(new LS(RS.OPERATION_CANCEL,"disconnect")),this._singlingCache.delete(t)})),this._singlingCache.clear(),this._p2pCache.clear(),this._rttIds={}}sendSignaling(e,t,i){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:6e4;return new Promise(((s,r)=>{var n;const a=this._genHeader(i);a.id=Uf();const d=a.id.join("-"),c=Ju({error_code:0,message:JSON.stringify(t),signaling_event:"call-".concat(e),signaling_type:"Send",stream_id:t.streamId,stream_user_id:t.streamUserId,direction:"up",event_session_id:d},this.connectionIds);null===(n=this._monitor)||void 0===n||n.report("rtc_signaling",c);const l="customMessage"===e;l&&qy(this.id,Number(a.id.join("")),t);const u=setTimeout((()=>{this._singlingCache.delete(d),r(new LS(RS.TIME_OUT,"".concat(e," message time out"))),l&&ev(this.id,t,999)}),o);this._singlingCache.set(d,{start:Hf(),signalingType:e,success:e=>{clearTimeout(u),s(e),l&&ev(this.id,t,0)},error:e=>{clearTimeout(u),r(e),l&&ev(this.id,t,e.code)},id:d}),this.logger.info("Signal",">>>>>> [".concat(e,"{").concat(a.functionType,"}][").concat(d,"]"),t),this._sendMessage(e,a,t)}))}sendPingSignaling(){return this.sendSignaling("CheckConnectivity",{ts:Date.now()},{functionType:2})}async sendP2PMessage(e,t){let{msg:i}=e,o=Cy(e,UG);const s=i instanceof ArrayBuffer;return this._sendP2PMessage(jy(this.id,Ju(Ju({ver:1,id:this._p2pMessageId.getMessageId(),time:Date.now(),dir:HG.SEND,type:FG.P2P,err:JG.SUCCESS},o),{},{binary:s,msg:s?await Jf.ab2b64str(i):i})),t)}_sendP2PMessage(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=this._genHeader(Ju(Ju({needAck:!0,functionType:1},t),{},{id:Uf()}));return Af(e.msg)?this._rttIds[e.id]=e.id:e.dir===HG.SEND&&this.logger.info("_sendP2PMessage [DC Signaling p2p{".concat(i.functionType,"} >>]"),JSON.stringify(e)),new Promise(((t,o)=>{if(e.dir===HG.SEND){const i=setTimeout((()=>{this._p2pCache.delete(e.id),o(new LS(RS.USER_MESSAGE_TIMEOUT,"P2P message timeout")),By(this.id,e,999)}),12e3);this._p2pCache.set(e.id,{success:(o,s)=>{clearTimeout(i),t(s),By(this.id,e,0)},error:t=>{clearTimeout(i),By(this.id,e,t.err);const[s,r]=OG[t.err]||[RS.USER_MESSAGE_UNKNOWN,"err: ".concat(t.err,", msg: ").concat(t.msg)];o({err:t.err,code:s,message:t.msg||r})}})}try{this._sendMessage("p2p",i,e)}catch(s){throw s.code===RS.NOT_CONNECTED_YET&&(s.code=RS.USER_MESSAGE_BROKEN),s}}))}_sendMessage(e,t,i){if(!this._dataChannel||"open"!==this._dataChannel.readyState)throw new LS(RS.NOT_CONNECTED_YET,"DataChannel not open");const o=WZ("SIGNAL_COMPRESSION")||t.zip,s=t.version+(Number(o)<<4)+(Number(t.encrypt)<<5),r=Number(t.needAck)+(Number(t.direction)<<1)+(Number(t.functionType)<<2)+(Number(t.binary)<<6),n=Jf.str2ab(JSON.stringify([e,i])),a=Ff(Uint8Array,[s,r,...t.id||[]],o||t.zip?ry.deflate(new Uint8Array(n)):new Uint8Array(n));try{this._dataChannel.send(a.buffer)}catch(c){var d;throw null===(d=this._monitor)||void 0===d||d.report("rtc_error",{message:"datachannel send error: ".concat(c.message),error_code:rG.DC_SEND_ERROR}),c}"p2p"===e?Qy(this.id,i,a.buffer.byteLength):"customMessage"===e&&tv(this.id,i,a.buffer.byteLength)}_dispartData(e){const t=new Uint8Array(e);let i=0;const o=t[i++],s=t[i++],r={version:15&o,zip:!(16&~o),encrypt:!(32&~o),needAck:!(1&~s),direction:(2&s)>>1,functionType:(60&s)>>2,binary:!(64&~s)};if(r.needAck||1===r.direction){for(;i<=6;i++)if(128&~t[i]){i++;break}r.id=Array.from(t.slice(2,i))}return{header:r,data:t.slice(i)}}_feedbackSignaling(e,t,i){const o=this._genHeader({needAck:!0,direction:1,id:e.split("-").map((e=>Number(e)))});DG.includes(t)||this.logger.info("Signal",">>>>>> [".concat(t,"-res][").concat(e,"]")),this._sendMessage("".concat(t,"-res"),o,i)}async _handleMessage(e){const t=Date.now(),{byteLength:i}=e,o=this._dispartData(e);let{data:s}=o;const{header:r}=o;if(r.zip){const e=new ry.Inflate;e.push(s,!0),s=e.result}const n=Jf.ab2str(s);let a=[];try{a=JSON.parse(n)}catch(c){var d;if(c instanceof Error)null===(d=this._monitor)||void 0===d||d.report("rtc_signaling_msg_error",Ju({error_code:-1,message:c.message,reason:"message parse failed"},this.connectionIds));return}switch(r.functionType){case 0:case 4:this.C2S(r,a,n,i,t);break;case 1:this.C2C(a,i,t);break;case 2:this.C2GW(r,a,n)}}async C2S(e,t,i,o,s){var r;const n=(null===(r=e.id)||void 0===r?void 0:r.join("-"))||"";if(1===e.direction)this._handleAckMessage(n,t[0]||{},i,e.functionType);else if(Array.isArray(t)){var a;const r=t[0];t=t[1],DG.includes(r)||this.logger.info("Signal","<<<<<< ".concat(r,"{").concat(e.functionType,"}"),t,n),AG.includes(r)||this._feedbackSignaling(n,r,r===Wg.ON_CUSTOM_MESSAGE?Ju(Ju({},t),{},{message:""}):""),t.binary&&"string"==typeof t.message&&(t.message=await Jf.b64str2ab(t.message,this._monitor));const d=Date.now();this.emit(r,Ju({},t)),r===Wg.ON_CUSTOM_MESSAGE&&iv(this.id,t,{msg_size:o,recv_msg_ts:s,fwd_msg_ts:d}),null===(a=this._monitor)||void 0===a||a.report("rtc_signaling",Ju({error_code:0,message:i,signaling_event:"on-".concat(r),signaling_type:"Recv",stream_id:t.streamId,stream_user_id:t.clientId,direction:"down"},this.connectionIds))}}async C2C(e,t,i){var o,s,r,n;Array.isArray(e)&&(e=e[1]);const a=null===(o=e)||void 0===o?void 0:o.id;switch(this._rttIds[a]||(null===(s=e)||void 0===s?void 0:s.dir)===HG.FEEDBACK||Af(null===(r=e)||void 0===r?void 0:r.msg)?delete this._rttIds[a]:this.logger.info("Signal","<<<<<< p2p response",e),e.dir){case HG.SEND:const o=Date.now();if(!Af(null===(n=e)||void 0===n?void 0:n.msg)){const{binary:t,msg:i,room:o,to:s,from:r}=e,n=""===o?t?Wg.USER_BINARY_MESSAGE_RECEIVED_OUTSIDE_ROOM:Wg.USER_MESSAGE_RECEIVED_OUTSIDE_ROOM:t?Wg.USER_BINARY_MESSAGE_RECEIVED:Wg.USER_MESSAGE_RECEIVED;s?this.emit(n,Ju(Ju({},e),{},{msg:t?await Jf.b64str2ab(i,this._monitor):i})):this.emit(Wg.ON_CUSTOM_MESSAGE,{clientId:r,binary:t,message:t?await Jf.b64str2ab(i,this._monitor):i})}this._sendP2PMessage(Ju(Ju({},e),{},{dir:HG.FEEDBACK,msg:""})),$y(this.id,e,{msg_size:t,recv_msg_ts:i,fwd_msg_ts:o});break;case HG.FEEDBACK:this._handleP2PMsgFeedback(e)}}C2GW(e,t,i){if(1===e.direction){var o;const s=(null===(o=e.id)||void 0===o?void 0:o.join("-"))||"";this._handleAckMessage(s,t[0]||{},i,e.functionType)}else{const[o,n={}]=t;if("RXMediaMsg"===o){var s;const{type:e,data:t}=n;switch(null===(s=this._monitor)||void 0===s||s.report("rtc_signaling",Ju({error_code:0,message:i,signaling_event:"on-".concat(e),signaling_type:"Recv",stream_id:"",stream_user_id:"",direction:"down"},this.connectionIds)),e){case"RSCP":try{const i=JSON.parse(t);Array.isArray(i)&&this.emit(e,i)}catch(r){}break;case"RTT":try{const i=JSON.parse(t);i.length&&this.emit(e,i[0])}catch(r){}break;case"SSC":try{const i=JSON.parse(t);i.length&&(this.logger.info("Signal","<<<<<< ".concat(e),i),this.emit(e,i[0]))}catch(r){}}}else"engineControlMessage"===o&&this.C2S(e,t,i,0,0)}}_handleHandler(){const e=e=>{this.logger.warn("_handleHandler","dataChannel close",e)},t=e=>{this.logger.error("_handleHandler","dataChannel error",e)},i=e=>{this._handleMessage(e.data)};return this._dataChannel.addEventListener("close",e),this._dataChannel.addEventListener("error",t),this._dataChannel.addEventListener("message",i),()=>{const o=this._dataChannel;null==o||o.removeEventListener("close",e),null==o||o.removeEventListener("error",t),null==o||o.removeEventListener("message",i)}}_genHeader(){return Ju({version:2,zip:!1,encrypt:!1,needAck:!0,direction:0,functionType:0,binary:!1},arguments.length>0&&void 0!==arguments[0]?arguments[0]:{})}_handleAckMessage(e,t,i,o){var s;const r=this._singlingCache.get(e);r&&(this._singlingCache.delete(e),200===t.code?r.success(t):r.error(t),this.logger.info("Signal","<<<<<< [".concat(r.signalingType,"{").concat(o,"}-ack] ").concat(e),t));const n=Ju({error_code:0,message:i,signaling_event:null==r?void 0:r.signalingType,signaling_type:"Ack",stream_id:"",stream_user_id:"",direction:"down",elapse:r?Hf()-r.start:0},this.connectionIds);null!=r&&r.id&&(n.event_session_id=r.id),null===(s=this._monitor)||void 0===s||s.report("rtc_signaling",n)}_handleP2PMsgFeedback(e){const t=this._p2pCache.get(e.id);t&&(this._p2pCache.delete(e.id),e.err===JG.SUCCESS?t.success(e.id,e):t.error(e))}}var QG=(e=>(e.ICE_FAILED="ice failed",e.DC_ERROR="datachannel onerror",e.DC_CLOSE="datachannel onclose",e.NODE_CHANGE="recv nodeChange signaling",e.NOTIFY_RECONNECT="recv notifyReconnect signaling",e.JOIN_TIMEOUT="joinRoom timeout, retry with tcp only",e))(QG||{});class BG extends Ig{constructor(e){super(),Hu(this,"id",void 0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_getAccessManager",void 0),Hu(this,"_connectionPool",new Map),Hu(this,"_curConnection",void 0),Hu(this,"_hasReportBrowerWarning",!1),Hu(this,"_reconnectTimer",void 0),Hu(this,"_connecting",!1),Hu(this,"_isFirstTimeConnected",!0),Hu(this,"_feedbackNodes",[]),Hu(this,"_preIceStartTime",-1),Hu(this,"_tcpOnlyTimer",void 0),Hu(this,"_destroyed",!1),this._ctx=e,this.id=e.id,this._monitor=mv(this.id),this.logger=new xv("ConnectionManager",3,this.id),this.logger.info("constructor","invoke"),this._getAccessManager=new cG(e)}startup(){this.logger.info("connect","invoke");try{wG.checkSupported()}catch(e){this.asyncEmit("disconnected",e)}this._connecting||(this._onConnectStart(),Promise.resolve().then((()=>this.emit("__onGetIceConfigHook"))),this._getAccess())}async reconnectByNodeChange(e){var t,i,o;this.logger.info("reconnectByNodeChange","invoke %o",e);const{nodes:s,reason:r}=e;null===(t=this._monitor)||void 0===t||t.report("rtc_node_change",{error_code:0,message:JSON.stringify(e),reason:JSON.stringify(r)}),TS.clearAccessNode(this._ctx.appId),null===(i=this._curConnection)||void 0===i||i.pc.reportRtcPreIce("node_change");const n=(null===(o=this._curConnection)||void 0===o||null===(o=o.node.publicIPs[0])||void 0===o?void 0:o.ip)||"";this._closeCurrentConnection(),this._clearConnectionPool(),this._clearReconnectTimer(),this._onConnectStart("recv nodeChange signaling"),Array.isArray(s)&&s.length>0?this._startIceConnect(s):this._getAccess([{feedbackIP:n,feedbackReason:{type:"NODE_CHANGED",reason:r}}])}async reconnect(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.logger.info("reconnect","invoke. ".concat(t?"ICE over TCP":"")),this._closeCurrentConnection(),this._clearConnectionPool(),this._clearReconnectTimer(),this._onConnectStart(e),this._getAccess(void 0,t)}shotdown(){this.logger.info("destroy","invoke"),this._destroyed=!0,this.asyncEmit("disconnected",new LS(RS.OPERATION_CANCEL,"destroy")).then((()=>{super.removeAllListeners()})),this._clearReconnectTimer(),this._clearConnectionPool(),this._getAccessManager.destroy(),this._closeCurrentConnection()}_getAccess(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this._getAccessManager.getICENode(e).then((e=>{this.emit("__onGetIceSuccessHook",e),this._startIceConnect(e,t)})).catch((e=>{this.asyncEmit("disconnected",e)})).finally((()=>{this._feedbackNodes=[]}))}_startIceConnect(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this._destroyed)return;this.logger.info("_startIceConnect","invoke");const i=ap();this._preIceStartTime=Hf();const o=this._ctx.joinRoomConfig.useTcpJoin,s=this._ctx.joinRoomConfig.useTcpJoinDelay,r=async o=>{t&&((o=uG(o)).iceConfig.tcpOnly=!0);const s={node:o};try{const t=new wG(this._ctx,i,!this._isFirstTimeConnected);s.pc=t,this._addJoinRoomFailedPrivateHandler(t),this._connectionPool.set(t.uuid,s);const r=await t.startIceConnect(o),n=new jG(this.id,r,{connection_id:t.getConnectionId(),group_connection_id:i});s.signaling=n,t.reportRtcPreIce("datachannel_send_ping"),await n.sendPingSignaling(),t.reportRtcPreIce("datachannel_recv_pong"),this._onConnectSuccess({node:o,pc:t,signaling:n,dc:r}),this.safeEmit("__onConnectSuccessHook",e.length)}catch(r){this._onConnectionFailed(s,r)}};this.emit("__onIceConnectStartHook"),e.forEach(r),o&&!t&&(this.logger.info("_startIceConnect","tcp-only will try after ".concat(s,"ms")),this._tcpOnlyTimer=setTimeout((()=>{this.emit("connectWidthTcp"),e.forEach((e=>{(e=uG(e)).iceConfig.tcpOnly=!0,r(e)})),delete this._tcpOnlyTimer}),s))}_onConnectSuccess(e){var t;(this.logger.info("connect","peer_%s connect success.",e.pc.uuid),this.emit("__onIceConnectSuccessHook",e),this._curConnection)?(e.pc.destroy(),e.signaling.destroy(),this._connectionPool.delete(e.pc.uuid)):(this._curConnection=e,this._addConnectionHandler(e.pc),null===(t=this._monitor)||void 0===t||t.set({connection_id:e.pc.getConnectionId()}),this._connectionPool.delete(e.pc.uuid),this._feedbackNodes.forEach((e=>this._feedbackBySignaling(e))),this._feedbackNodes=[],this._onConnectEnded(e))}_onConnectionFailed(e,t){var i,o;(this.logger.info("connect","peer_%s connect failed. %s",(null===(i=e.pc)||void 0===i?void 0:i.uuid)||"",t.message),this.emit("__onIceConnectFailedHook",e),t.code!==MG.DESTROY&&t.code!==RS.OPERATION_CANCEL)&&(this._curConnection?this._feedbackBySignaling(e.node):this._feedbackNodes.push(e.node),this.logger.info("connect","remove cache node"),TS.deleteAccessNode(this._ctx.appId,e.node),e.pc&&(this._connectionPool.delete(e.pc.uuid),e.pc.destroy()),null===(o=e.signaling)||void 0===o||o.destroy(),0!==this._connectionPool.size||this._curConnection||this._destroyed||(this.logger.error("connect","establish peerConnection failed"),this._checkBrowserUA(),Hf()-this._preIceStartTime<1e3?(this._clearReconnectTimer(),this._reconnectTimer=setTimeout((()=>{delete this._reconnectTimer,this._reconnectWithIceFailed(this._feedbackNodes)}),1e3)):this._reconnectWithIceFailed(this._feedbackNodes)))}_feedbackBySignaling(e){var t;null===(t=this._curConnection)||void 0===t||t.signaling.sendSignaling("scheduleMessage",{type:"feedback",body:{feedbackIP:e.publicIPs[0].ip,feedbackReason:{type:"ICE_FAILED",reason:{}}}})}async _reconnectWithIceFailed(e){this._onConnectStart("ice failed"),this.logger.warn("reconnect","because of ice failed"),this._getAccess(e.map((e=>({feedbackIP:e.publicIPs[0].ip,feedbackReason:{type:"ICE_FAILED",reason:{}}}))))}_checkBrowserUA(){var e;!this._hasReportBrowerWarning&&this._ctx.joinRoomConfig.isBlackBrower()&&(this._hasReportBrowerWarning=!0,null===(e=this._monitor)||void 0===e||e.report("rtc_error",{error_code:rG.BLACK_BROWSER,message:"failed to establish data-channel, and the current browser is on the browser blacklist."}))}_onConnectStart(e){var t;this.logger.info("_onConnectStart","invoke, reason: ".concat(e||"init")),this._connecting=!0,e?this.asyncEmit("reconnecting",e):this.asyncEmit("connecting");const i=ap();var o;(null===(t=this._monitor)||void 0===t||t.set({connect_session_id:i}),this._isFirstTimeConnected)||(null===(o=this._monitor)||void 0===o||o.report("rtc_reconnect",{error_code:1002,message:"peerconnection reconnecting",reconnect_id:i,reconnect_type:"peerconnection"},{reason:e}))}_onConnectEnded(e){var t;(this.logger.info("_onConnectEnded","invoke"),this._connecting=!1,this._isFirstTimeConnected)||(null===(t=this._monitor)||void 0===t||t.report("rtc_reconnected",{message:"peerconnection reconnected",reconnect_type:"peerconnection"}));this._isFirstTimeConnected=!1,this.asyncEmit("connected",e),e.node.iceConfig.tcpOnly&&(this.logger.info("_onConnectEnded","use tcp only"),vv(this._ctx.id,"connected_with_tcp_only",JSON.stringify(e.node))),this._tcpOnlyTimer&&(window.clearTimeout(this._tcpOnlyTimer),delete this._tcpOnlyTimer),this._clearConnectionPool()}_addConnectionHandler(e){e.on("disconnect",(e=>{this._closeCurrentConnection(),this._clearReconnectTimer(),navigator.onLine?this.reconnect(e):this._reconnectTimer=setTimeout((()=>this.reconnect(e)),3e3)}))}_addJoinRoomFailedPrivateHandler(e){e.on("join_room_failed_private_callback",(e=>{this.emit("joinRoomFailedPrivateCallback",e)})),e.on("__startIceConnect_hook",(e=>{this.emit("__startIceConnect_hook",e)}))}_closeCurrentConnection(){var e,t;null===(e=this._curConnection)||void 0===e||e.pc.destroy(),null===(t=this._curConnection)||void 0===t||t.signaling.destroy(),delete this._curConnection}_clearConnectionPool(){this._connectionPool.forEach(((e,t)=>{var i,o;null===(i=e.signaling)||void 0===i||i.destroy(),null===(o=e.pc)||void 0===o||o.destroy(),this._connectionPool.delete(t)}))}_clearReconnectTimer(){this._reconnectTimer&&(window.clearTimeout(this._reconnectTimer),delete this._reconnectTimer)}}var qG=i(cs.f("asyncIterator")),$G=tt,eV=xd,tV=L,iV=ei,oV=q,sV=Si,rV=Error,nV=y("".replace),aV=String(new rV("zxcasd").stack),dV=/\n\s*at [^:]*:[^\n]*/,cV=dV.test(aV),lV=Y,uV=!n((function(){var e=new Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",lV(1,7)),7!==e.stack)})),mV=Si,hV=function(e,t){if(cV&&"string"==typeof e&&!rV.prepareStackTrace)for(;t--;)e=nV(e,dV,"");return e},pV=uV,bV=Error.captureStackTrace,_V=$t,yV=V,vV=ri,SV=Le,ZV=vL,fV=Ji,TV=re,IV=LR,gV=ZR,RV=mL,XV=TypeError,LV=function(e,t){this.stopped=e,this.result=t},CV=LV.prototype,WV=function(e,t,i){var o,s,r,n,a,d,c,l=i&&i.that,u=!(!i||!i.AS_ENTRIES),m=!(!i||!i.IS_RECORD),h=!(!i||!i.IS_ITERATOR),p=!(!i||!i.INTERRUPTED),b=_V(t,l),_=function(e){return o&&RV(o,"normal",e),new LV(!0,e)},y=function(e){return u?(vV(e),p?b(e[0],e[1],_):b(e[0],e[1])):p?b(e,_):b(e)};if(m)o=e.iterator;else if(h)o=e;else{if(!(s=gV(e)))throw new XV(SV(e)+" is not iterable");if(ZV(s)){for(r=0,n=fV(e);n>r;r++)if((a=y(e[r]))&&TV(CV,a))return a;return new LV(!1)}o=IV(e,s)}for(d=m?e.next:o.next;!(c=yV(d,o)).done;){try{a=y(c.value)}catch(oK){RV(o,"throw",oK)}if("object"==typeof a&&a&&TV(CV,a))return a}return new LV(!1)},GV=fo,VV=Vi,EV=re,PV=Hc,kV=bl,xV=function(e,t,i){for(var o=eV(t),s=iV.f,r=tV.f,n=0;n<o.length;n++){var a=o[n];$G(e,a)||i&&$G(i,a)||s(e,a,r(t,a))}},NV=Ao,MV=Si,YV=Y,wV=function(e,t){oV(t)&&"cause"in t&&sV(e,"cause",t.cause)},KV=function(e,t,i,o){pV&&(bV?bV(e,t):mV(e,"stack",hV(i,o)))},HV=WV,FV=function(e,t){return void 0===e?arguments.length<2?"":t:GV(e)},JV=bt("toStringTag"),OV=Error,UV=[].push,DV=function(e,t){var i,o=EV(AV,this);kV?i=kV(new OV,o?PV(this):AV):(i=o?this:NV(AV),MV(i,JV,"Error")),void 0!==t&&MV(i,"message",FV(t)),KV(i,DV,i.stack,1),arguments.length>2&&wV(i,arguments[2]);var s=[];return HV(e,UV,{that:s}),MV(i,"errors",s),i};kV?kV(DV,OV):xV(DV,OV,{name:!0});var AV=DV.prototype=NV(OV.prototype,{constructor:YV(1,DV),message:YV(1,""),name:YV(1,"AggregateError")});VV({global:!0,constructor:!0,arity:2},{AggregateError:DV});var zV,jV,QV,BV,qV=r,$V=de,eE=f,tE=function(e){return $V.slice(0,e.length)===e},iE=tE("Bun/")?"BUN":tE("Cloudflare-Workers")?"CLOUDFLARE":tE("Deno/")?"DENO":tE("Node.js/")?"NODE":qV.Bun&&"string"==typeof Bun.version?"BUN":qV.Deno&&"object"==typeof Deno.version?"DENO":"process"===eE(qV.process)?"NODE":qV.window&&qV.document?"BROWSER":"REST",oE="NODE"===iE,sE=se,rE=ds,nE=C,aE=bt("species"),dE=hr,cE=Le,lE=TypeError,uE=ri,mE=function(e){if(dE(e))return e;throw new lE(cE(e)+" is not a constructor")},hE=O,pE=bt("species"),bE=function(e,t){var i,o=uE(e).constructor;return void 0===o||hE(i=uE(o)[pE])?t:mE(i)},_E=/(?:ipad|iphone|ipod).*applewebkit/i.test(de),yE=r,vE=m,SE=$t,ZE=X,fE=tt,TE=n,IE=Go,gE=qo,RE=Wt,XE=WR,LE=_E,CE=oE,WE=yE.setImmediate,GE=yE.clearImmediate,VE=yE.process,EE=yE.Dispatch,PE=yE.Function,kE=yE.MessageChannel,xE=yE.String,NE=0,ME={},YE="onreadystatechange";TE((function(){zV=yE.location}));var wE=function(e){if(fE(ME,e)){var t=ME[e];delete ME[e],t()}},KE=function(e){return function(){wE(e)}},HE=function(e){wE(e.data)},FE=function(e){yE.postMessage(xE(e),zV.protocol+"//"+zV.host)};WE&&GE||(WE=function(e){XE(arguments.length,1);var t=ZE(e)?e:PE(e),i=gE(arguments,1);return ME[++NE]=function(){vE(t,void 0,i)},jV(NE),NE},GE=function(e){delete ME[e]},CE?jV=function(e){VE.nextTick(KE(e))}:EE&&EE.now?jV=function(e){EE.now(KE(e))}:kE&&!LE?(BV=(QV=new kE).port2,QV.port1.onmessage=HE,jV=SE(BV.postMessage,BV)):yE.addEventListener&&ZE(yE.postMessage)&&!yE.importScripts&&zV&&"file:"!==zV.protocol&&!TE(FE)?(jV=FE,yE.addEventListener("message",HE,!1)):jV=YE in RE("script")?function(e){IE.appendChild(RE("script"))[YE]=function(){IE.removeChild(this),wE(e)}}:function(e){setTimeout(KE(e),0)});var JE={set:WE,clear:GE},OE=function(){this.head=null,this.tail=null};OE.prototype={add:function(e){var t={item:e,next:null},i=this.tail;i?i.next=t:this.head=t,this.tail=t},get:function(){var e=this.head;if(e)return null===(this.head=e.next)&&(this.tail=null),e.item}};var UE,DE,AE,zE,jE,QE=OE,BE=/ipad|iphone|ipod/i.test(de)&&"undefined"!=typeof Pebble,qE=/web0s(?!.*chrome)/i.test(de),$E=r,eP=nR,tP=$t,iP=JE.set,oP=QE,sP=_E,rP=BE,nP=qE,aP=oE,dP=$E.MutationObserver||$E.WebKitMutationObserver,cP=$E.document,lP=$E.process,uP=$E.Promise,mP=eP("queueMicrotask");if(!mP){var hP=new oP,pP=function(){var e,t;for(aP&&(e=lP.domain)&&e.exit();t=hP.get();)try{t()}catch(oK){throw hP.head&&UE(),oK}e&&e.enter()};sP||aP||nP||!dP||!cP?!rP&&uP&&uP.resolve?((zE=uP.resolve(void 0)).constructor=uP,jE=tP(zE.then,zE),UE=function(){jE(pP)}):aP?UE=function(){lP.nextTick(pP)}:(iP=tP(iP,$E),UE=function(){iP(pP)}):(DE=!0,AE=cP.createTextNode(""),new dP(pP).observe(AE,{characterData:!0}),UE=function(){AE.data=DE=!DE}),mP=function(e){hP.head||UE(),hP.add(e)}}var bP=mP,_P=function(e){try{return{error:!1,value:e()}}catch(oK){return{error:!0,value:oK}}},yP=r.Promise,vP=r,SP=yP,ZP=X,fP=jt,TP=er,IP=bt,gP=iE,RP=be,XP=SP&&SP.prototype,LP=IP("species"),CP=!1,WP=ZP(vP.PromiseRejectionEvent),GP={CONSTRUCTOR:fP("Promise",(function(){var e=TP(SP),t=e!==String(SP);if(!t&&66===RP)return!0;if(!XP.catch||!XP.finally)return!0;if(!RP||RP<51||!/native code/.test(e)){var i=new SP((function(e){e(1)})),o=function(e){e((function(){}),(function(){}))};if((i.constructor={})[LP]=o,!(CP=i.then((function(){}))instanceof o))return!0}return!(t||"BROWSER"!==gP&&"DENO"!==gP||WP)})),REJECTION_EVENT:WP,SUBCLASSING:CP},VP={},EP=Ve,PP=TypeError,kP=function(e){var t,i;this.promise=new e((function(e,o){if(void 0!==t||void 0!==i)throw new PP("Bad Promise constructor");t=e,i=o})),this.resolve=EP(t),this.reject=EP(i)};VP.f=function(e){return new kP(e)};var xP,NP,MP=Vi,YP=oE,wP=r,KP=V,HP=ns,FP=Es,JP=function(e){var t=sE(e);nE&&t&&!t[aE]&&rE(t,aE,{configurable:!0,get:function(){return this}})},OP=Ve,UP=X,DP=q,AP=pR,zP=bE,jP=JE.set,QP=bP,BP=function(e,t){try{1===arguments.length?console.error(e):console.error(e,t)}catch(oK){}},qP=_P,$P=QE,ek=zs,tk=yP,ik=GP,ok=VP,sk="Promise",rk=ik.CONSTRUCTOR,nk=ik.REJECTION_EVENT,ak=ek.getterFor(sk),dk=ek.set,ck=tk&&tk.prototype,lk=tk,uk=ck,mk=wP.TypeError,hk=wP.document,pk=wP.process,bk=ok.f,_k=bk,yk=!!(hk&&hk.createEvent&&wP.dispatchEvent),vk="unhandledrejection",Sk=function(e){var t;return!(!DP(e)||!UP(t=e.then))&&t},Zk=function(e,t){var i,o,s,r=t.value,n=1===t.state,a=n?e.ok:e.fail,d=e.resolve,c=e.reject,l=e.domain;try{a?(n||(2===t.rejection&&Rk(t),t.rejection=1),!0===a?i=r:(l&&l.enter(),i=a(r),l&&(l.exit(),s=!0)),i===e.promise?c(new mk("Promise-chain cycle")):(o=Sk(i))?KP(o,i,d,c):d(i)):c(r)}catch(oK){l&&!s&&l.exit(),c(oK)}},fk=function(e,t){e.notified||(e.notified=!0,QP((function(){for(var i,o=e.reactions;i=o.get();)Zk(i,e);e.notified=!1,t&&!e.rejection&&Ik(e)})))},Tk=function(e,t,i){var o,s;yk?((o=hk.createEvent("Event")).promise=t,o.reason=i,o.initEvent(e,!1,!0),wP.dispatchEvent(o)):o={promise:t,reason:i},!nk&&(s=wP["on"+e])?s(o):e===vk&&BP("Unhandled promise rejection",i)},Ik=function(e){KP(jP,wP,(function(){var t,i=e.facade,o=e.value;if(gk(e)&&(t=qP((function(){YP?pk.emit("unhandledRejection",o,i):Tk(vk,i,o)})),e.rejection=YP||gk(e)?2:1,t.error))throw t.value}))},gk=function(e){return 1!==e.rejection&&!e.parent},Rk=function(e){KP(jP,wP,(function(){var t=e.facade;YP?pk.emit("rejectionHandled",t):Tk("rejectionhandled",t,e.value)}))},Xk=function(e,t,i){return function(o){e(t,o,i)}},Lk=function(e,t,i){e.done||(e.done=!0,i&&(e=i),e.value=t,e.state=2,fk(e,!0))},Ck=function(e,t,i){if(!e.done){e.done=!0,i&&(e=i);try{if(e.facade===t)throw new mk("Promise can't be resolved itself");var o=Sk(t);o?QP((function(){var i={done:!1};try{KP(o,t,Xk(Ck,i,e),Xk(Lk,i,e))}catch(oK){Lk(i,oK,e)}})):(e.value=t,e.state=1,fk(e,!1))}catch(oK){Lk({done:!1},oK,e)}}};rk&&(uk=(lk=function(e){AP(this,uk),OP(e),KP(xP,this);var t=ak(this);try{e(Xk(Ck,t),Xk(Lk,t))}catch(oK){Lk(t,oK)}}).prototype,(xP=function(e){dk(this,{type:sk,done:!1,notified:!1,parent:!1,reactions:new $P,rejection:!1,state:0,value:null})}).prototype=HP(uk,"then",(function(e,t){var i=ak(this),o=bk(zP(this,lk));return i.parent=!0,o.ok=!UP(e)||e,o.fail=UP(t)&&t,o.domain=YP?pk.domain:void 0,0===i.state?i.reactions.add(o):QP((function(){Zk(o,i)})),o.promise})),NP=function(){var e=new xP,t=ak(e);this.promise=e,this.resolve=Xk(Ck,t),this.reject=Xk(Lk,t)},ok.f=bk=function(e){return e===lk||undefined===e?new NP(e):_k(e)}),MP({global:!0,constructor:!0,wrap:!0,forced:rk},{Promise:lk}),FP(lk,sk,!1,!0),JP(sk);var Wk=bt("iterator"),Gk=!1;try{var Vk=0,Ek={next:function(){return{done:!!Vk++}},return:function(){Gk=!0}};Ek[Wk]=function(){return this},Array.from(Ek,(function(){throw 2}))}catch(oK){}var Pk=yP,kk=GP.CONSTRUCTOR||!function(e,t){try{if(!t&&!Gk)return!1}catch(oK){return!1}var i=!1;try{var o={};o[Wk]=function(){return{next:function(){return{done:i=!0}}}},e(o)}catch(oK){}return i}((function(e){Pk.all(e).then(void 0,(function(){}))})),xk=V,Nk=Ve,Mk=VP,Yk=_P,wk=WV;Vi({target:"Promise",stat:!0,forced:kk},{all:function(e){var t=this,i=Mk.f(t),o=i.resolve,s=i.reject,r=Yk((function(){var i=Nk(t.resolve),r=[],n=0,a=1;wk(e,(function(e){var d=n++,c=!1;a++,xk(i,t,e).then((function(e){c||(c=!0,r[d]=e,--a||o(r))}),s)})),--a||o(r)}));return r.error&&s(r.value),i.promise}});var Kk=Vi,Hk=GP.CONSTRUCTOR;yP&&yP.prototype,Kk({target:"Promise",proto:!0,forced:Hk,real:!0},{catch:function(e){return this.then(void 0,e)}});var Fk=V,Jk=Ve,Ok=VP,Uk=_P,Dk=WV;Vi({target:"Promise",stat:!0,forced:kk},{race:function(e){var t=this,i=Ok.f(t),o=i.reject,s=Uk((function(){var s=Jk(t.resolve);Dk(e,(function(e){Fk(s,t,e).then(i.resolve,o)}))}));return s.error&&o(s.value),i.promise}});var Ak=VP;Vi({target:"Promise",stat:!0,forced:GP.CONSTRUCTOR},{reject:function(e){var t=Ak.f(this);return(0,t.reject)(e),t.promise}});var zk=ri,jk=q,Qk=VP,Bk=function(e,t){if(zk(e),jk(t)&&t.constructor===e)return t;var i=Qk.f(e);return(0,i.resolve)(t),i.promise},qk=Vi,$k=yP,ex=GP.CONSTRUCTOR,tx=Bk,ix=se("Promise"),ox=!ex;qk({target:"Promise",stat:!0,forced:true},{resolve:function(e){return tx(ox&&this===ix?$k:this,e)}});var sx=V,rx=Ve,nx=VP,ax=_P,dx=WV;Vi({target:"Promise",stat:!0,forced:kk},{allSettled:function(e){var t=this,i=nx.f(t),o=i.resolve,s=i.reject,r=ax((function(){var i=rx(t.resolve),s=[],r=0,n=1;dx(e,(function(e){var a=r++,d=!1;n++,sx(i,t,e).then((function(e){d||(d=!0,s[a]={status:"fulfilled",value:e},--n||o(s))}),(function(e){d||(d=!0,s[a]={status:"rejected",reason:e},--n||o(s))}))})),--n||o(s)}));return r.error&&s(r.value),i.promise}});var cx=V,lx=Ve,ux=se,mx=VP,hx=_P,px=WV,bx="No one promise resolved";Vi({target:"Promise",stat:!0,forced:kk},{any:function(e){var t=this,i=ux("AggregateError"),o=mx.f(t),s=o.resolve,r=o.reject,n=hx((function(){var o=lx(t.resolve),n=[],a=0,d=1,c=!1;px(e,(function(e){var l=a++,u=!1;d++,cx(o,t,e).then((function(e){u||c||(c=!0,s(e))}),(function(e){u||c||(u=!0,n[l]=e,--d||r(new i(n,bx)))}))})),--d||r(new i(n,bx))}));return n.error&&r(n.value),o.promise}});var _x=Vi,yx=m,vx=qo,Sx=VP,Zx=Ve,fx=_P,Tx=r.Promise,Ix=!1;_x({target:"Promise",stat:!0,forced:!Tx||!Tx.try||fx((function(){Tx.try((function(e){Ix=8===e}),8)})).error||!Ix},{try:function(e){var t=arguments.length>1?vx(arguments,1):[],i=Sx.f(this),o=fx((function(){return yx(Zx(e),void 0,t)}));return(o.error?i.reject:i.resolve)(o.value),i.promise}});var gx=VP;Vi({target:"Promise",stat:!0},{withResolvers:function(){var e=gx.f(this);return{promise:e.promise,resolve:e.resolve,reject:e.reject}}});var Rx=Vi,Xx=yP,Lx=n,Cx=se,Wx=X,Gx=bE,Vx=Bk,Ex=Xx&&Xx.prototype;Rx({target:"Promise",proto:!0,real:!0,forced:!!Xx&&Lx((function(){Ex.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=Gx(this,Cx("Promise")),i=Wx(e);return this.then(i?function(i){return Vx(t,e()).then((function(){return i}))}:e,i?function(i){return Vx(t,e()).then((function(){throw i}))}:e)}});var Px=i($.Promise);function kx(e){function t(e){if(Object(e)!==e)return Px.reject(new TypeError(e+" is not an object."));var t=e.done;return Px.resolve(e.value).then((function(e){return{value:e,done:t}}))}return(kx=function(e){this.s=e,this.n=e.next}).prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var i=this.s.return;return void 0===i?Px.resolve({value:e,done:!0}):t(i.apply(this.s,arguments))},throw:function(e){var i=this.s.return;return void 0===i?Px.reject(e):t(i.apply(this.s,arguments))}},new kx(e)}class xx extends Zg.EventEmitter{constructor(e,t){super(),Hu(this,"_context",void 0),Hu(this,"peerConnectionMode",0),Hu(this,"id",void 0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_nextSsrc",Math.floor(Math.random()*pG+1e4)),Hu(this,"_aSendonlyAnswerTpl",void 0),Hu(this,"_vSendonlyAnswerTpl",void 0),Hu(this,"_enableSubFlexfec",!1),Hu(this,"audioTrack4ff",void 0),Hu(this,"setLocalDescription",void 0),Hu(this,"setRemoteDescription",void 0),this.peer=t,this.id=e.id,this._monitor=mv(this.id),this.logger=new xv("BasicHandler",3,e.id),this.setLocalDescription=t.setLocalDescription.bind(t),this.setRemoteDescription=t.setRemoteDescription.bind(t),this._context=e,this.peer.on("ontrack",(e=>{this.emit("ontrack",e)}))}destroy(){this.logger.info("destroy",this.peerConnectionId||""),super.removeAllListeners()}get _peerConnection(){return this.peer.getOriginRTCPeerConnection()}getTransceivers(){return this._peerConnection.getTransceivers()}getConnectionState(){return this._peerConnection.connectionState}internalPublish(e){const{stream:t,videoTrack:i,audioTrack:o,pubAudio:s,pubVideo:r}=e,n={direction:"sendonly",streams:[t]},a={direction:"sendonly",streams:[t]},{sendEncodings:d,videoDescriptions:c,subVideoDescriptions:l,activeSimulcastStreams:u}=this._context.videoProfile.genVideoDescriptions(e);a.sendEncodings=d,this._context.videoProfile.activeSimStreams=u,this.logger.info("publish videoTransceiverInit videoDescriptions","",a,c);let m=null==o?void 0:o.preprocessingTrack;(null==o?void 0:o.mixType)!==km.PLAYOUT&&null!=o&&o.mixedAudioTrack&&(m=null==o?void 0:o.mixedAudioTrack),m=s&&m?m:"audio";let h=null==i?void 0:i.preprocessingTrack;h=r&&h?h:"video";try{this._reportRtcInvokeStatus("Handler.internalPublish",JSON.stringify({aTrack:cp(m),vTrack:cp(h),audioTransceiverInit:n,videoTransceiverInit:a}))}catch(oK){}return{semantics:"unified-plan",videoDescriptions:c,subVideoDescriptions:l,audioTransceiverInit:{track:m,init:n},videoTransceiverInit:{track:h,init:a}}}async setCurrentDescription(){}createAVMlineAnswerTpl(e){const t=Tf.parse(e);t.media.forEach((e=>{if("audio"===e.type){if("sendonly"===e.direction){const t=null==e?void 0:e.rtp.find((e=>"opus"===e.codec));if(t&&null!=e&&e.fmtp){const i=null==e?void 0:e.fmtp.find((e=>e.payload===t.payload));i&&this._context&&(i.config+=";stereo=1;sprop-stereo=1")}this._aSendonlyAnswerTpl=e}}else"video"===e.type&&("sendonly"===e.direction&&(this._vSendonlyAnswerTpl=e),Array.isArray(e.rtp)&&e.rtp.forEach((e=>{var t;null!==(t=e.codec)&&void 0!==t&&t.includes("flexfec")&&(this._enableSubFlexfec=!0)})))})),hZ&&LG(t)}get peerConnectionId(){return this.peer.getConnectionId()||""}addBitrateLimit(e,t){null==e||e.rtp.forEach((i=>{let{codec:o,payload:s}=i;if(["vp8","h264"].includes(o.toLocaleLowerCase())){const i=e.fmtp.find((e=>e.payload===s));i?i.config=[...i.config.split(";"),"x-google-min-bitrate=100","x-google-start-bitrate=".concat(t)].join(";"):e.fmtp.push({payload:s,config:"x-google-min-bitrate=100;x-google-start-bitrate=".concat(t)})}}))}_report(e,t,i){var o;null===(o=this._monitor)||void 0===o||o.report(e,Ju(Ju({},t),{},{connection_id:this.peer.getConnectionId(),group_connection_id:this.peer.getGroupConnectionId()}),i)}_reportRtcInvokeStatus(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",s=arguments.length>4?arguments[4]:void 0;this._report("rtc_invoke_status",{sdk_api_name:e,message:t,error_code:i,stream_id:o,elapse:0},s)}}const Nx=new xv("queue",4);var Mx=(e=>(e[e.ADD=0]="ADD",e[e.CLOSE=1]="CLOSE",e))(Mx||{}),Yx=(e=>(e.publish="publish",e.unpublish="unpublish",e.subscribe="subscribe",e.unsubscribe="unsubscribe",e.pushtrack="pushtrack",e.removetrack="removetrack",e))(Yx||{});const wx={publish:"unpublish",subscribe:"unsubscribe",pushtrack:"removetrack"},Kx={publish:0,subscribe:0,pushtrack:0,unpublish:1,unsubscribe:1,removetrack:1};class Hx extends fg{constructor(){super(),Hu(this,"_queue",void 0),this._queue=[]}get queue(){return this._queue}enqueue(e){const t=this._queue.length;let i="";return this._queue=this._queue.filter((t=>t.streamId!==e.streamId||e.action!==wx[t.action]||(i=t.streamId,Nx.info("offsetStreamId",i),!1))),this._queue.length===t&&this._queue.push(e),this.emit("start"),i}dequeue(){if(!this._queue.length)return null;let e=this._queue.length;Hv&&pS>=86&&pS<=92&&(e=Math.min(this._queue.length,5));const t=Kx[this._queue[0].action];for(let i=1;i<e;i++)if(Kx[this._queue[i].action]!==t)return{sdpStrategy:t,items:this._queue.splice(0,i)};return{sdpStrategy:t,items:this._queue.splice(0,e)}}destroy(){this._queue=[]}}const Fx=cZ()||dZ();class Jx extends xx{constructor(e,t){var i;super(e,t),Hu(this,"name","chrome"),Hu(this,"_queueBusy",!1),Hu(this,"_sdpQueue",void 0),Hu(this,"_aSendonlyOfferTpl",void 0),Hu(this,"_vSendonlyOfferTpl",void 0),Hu(this,"_aRecvonlyOfferTpl",void 0),Hu(this,"_vRecvonlyOfferTpl",void 0),Hu(this,"_mid",10),Hu(this,"_inactiveMlineIndex",[]),Hu(this,"setDescription",void 0),this.logger=new xv("ChromeHandler",3,e.id),this.setDescription=t.setDescription.bind(t),this._sdpQueue=new Hx,this._sdpQueue.on("start",(()=>{this._queueBusy||"stable"!==this._peerConnection.signalingState||(this.logger.info("dequeue start"),this.dequeue())})),null===(i=this._context.monitor)||void 0===i||i.set({handler_mode:"chrome"})}destroy(){super.destroy(),this._sdpQueue.destroy()}async publish(e){var t;const{stream:i,enableSimulcast:o}=e,{videoDescriptions:s,subVideoDescriptions:r,audioTransceiverInit:n,videoTransceiverInit:a}=super.internalPublish(e),d=_G(this._nextSsrc);this._nextSsrc=d.next;const c="".concat(this._mid++),l="".concat(this._mid++),u=Ju(Ju(Ju({},this._aSendonlyOfferTpl),this.peer._offerIce),{},{mid:c,msid:"".concat(i.id," ").concat(i.id,"-audio"),ssrcs:yG(i.id,"audio",d.audio,bG)}),m=Ju(Ju(Ju({},this._vSendonlyOfferTpl),this.peer._offerIce),{},{mid:l,msid:"".concat(i.id," ").concat(i.id,"-video")});if(o){this.logger.info("subVideoDesc","desc: %o ",r),delete m.ssrcGroups,delete m.ssrcs;const e=[];m.rids=s.map((t=>{let{rid:i}=t;return e.unshift(i),{id:i,direction:"send"}})),m.simulcast={dir1:"send",list1:e.join(";")}}else{const{ssrcs:e,ssrcGroups:t}=vG(i.id,d,{cname:bG});m.ssrcs=e,m.ssrcGroups=t}if(null!==(t=this._context.serverConfig)&&void 0!==t&&t.audioRed&&Array.isArray(u.rtp)){this.logger.info("audioCodec","use Red");const e=u.rtp.findIndex((e=>"red"===e.codec));if(-1!==e){const[t]=u.rtp.splice(e,1);u.rtp.unshift(t)}const t=[];u.rtp.forEach((e=>t.push(e.payload))),u.payloads=t.join(" ")}Array.isArray(m.ext)&&(WZ("IOS_SAFARI_ORIENTATION")||!Kv&&!$v||(m.ext=m.ext.filter((e=>{var t;return!(null!=e&&null!==(t=e.uri)&&void 0!==t&&t.includes("video-orientation"))}))),m.ext=m.ext.filter((e=>{var t;return!(null!=e&&null!==(t=e.uri)&&void 0!==t&&t.includes("framemarking"))})));const h=null==u?void 0:u.rtp.find((e=>"opus"===e.codec));if(h&&u.fmtp){const e=u.fmtp.find((e=>e.payload===h.payload));e&&this._context.audioProfileManager&&(e.config=this._context.audioProfileManager.getOpusConfigStr(e.config))}return o||Kv||this.addBitrateLimit(m,e.videoEncodeConfig[0].maxKbps),e.audioMLine=u,e.videoMLine=m,{partialSdp:ZG(this.peer._offerSession,u,m),audioMid:c,videoMid:l,type:"incroffer",semantics:"unified-plan",videoDescriptions:s,subVideoDescriptions:r,audioTransceiverInit:n,videoTransceiverInit:a,peerConnectionMode:this.peerConnectionMode}}async subscribe(e,t){var i,o;this.logger.info("subscribe");if(!this._aRecvonlyOfferTpl||!this._vRecvonlyOfferTpl){const e=await this._genOfferSdp();await this.createAVMlineOfferTpl(e)}let s,r,n,a,d="",c="",l=!1,u=!1;e.audioMLine=s,e.videoMLine=r,e.virtual?(d="".concat(this._mid++),l=!0):t.multiChatMode?(d="".concat(this._mid++),c="".concat(this._mid++),u=!0):(l=!0,u=!0,d="".concat(this._mid++),c="".concat(this._mid++)),d&&(s=Ju(Ju({},uG(this._aRecvonlyOfferTpl)),{},{mid:d})),l&&(e.audioMLine=s,n={track:"audio",init:{direction:"recvonly"}}),c&&(r=Ju(Ju({},uG(this._vRecvonlyOfferTpl)),{},{mid:c})),u&&(e.videoMLine=r,a={track:"video",init:{direction:"recvonly"}});const m=ZG(this.peer._offerSession,s,r);let h,p;if(!e.enableVendorMode&&!t.multiChatMode&&!e.virtual&&this._aSendonlyAnswerTpl&&this._vSendonlyAnswerTpl){var b;h=_G(this._nextSsrc),this._nextSsrc=h.next;const t=Ju(Ju(Ju({},this._aSendonlyAnswerTpl),this.peer._answerIce),{},{mid:d,msid:"".concat(e.streamId).concat(this._context.avSync?"":"-audio"," ").concat(e.streamId,"-audio"),ssrcs:yG(e.streamId,"audio",h.audio)}),i=Ju(Ju(Ju({},this._vSendonlyAnswerTpl),this.peer._answerIce),{},{mid:c,msid:"".concat(e.streamId).concat(this._context.avSync?"":"-video"," ").concat(e.streamId,"-video")},vG(e.streamId,h,{flexfec:this._enableSubFlexfec}));p={sdp:Tf.write(Ju(Ju({},this.peer._answerSession),{},{media:[t,i]})),sequenceId:e.sequenceId?++e.sequenceId:0},null===(b=h)||void 0===b||delete b.next}const _=null===(i=s)||void 0===i?void 0:i.rtp.find((e=>"opus"===e.codec));if(_&&null!==(o=s)&&void 0!==o&&o.fmtp){var y;const e=null===(y=s)||void 0===y?void 0:y.fmtp.find((e=>e.payload===_.payload));e&&this._context&&(e.config+=";stereo=1;sprop-stereo=1")}if(e.isPublic&&pS>=86){var v,S;const e=null===(v=r)||void 0===v?void 0:v.rtp.filter((e=>"H264"===e.codec));var Z;if(null!=e&&e.length&&null!==(S=r)&&void 0!==S&&S.fmtp)null===(Z=r)||void 0===Z||Z.fmtp.forEach((t=>{e.find((e=>e.payload===t.payload))&&(t.config+=";sps-pps-idr-in-keyframe=1")}))}return{partialSdp:m,audioMid:d,videoMid:c,type:"incroffer",semantics:"unified-plan",audioTransceiverInit:n,videoTransceiverInit:a,allSsrc:h,peerConnectionMode:this.peerConnectionMode,signalingAck:p}}async handleAck(e){return this.logger.info("handleAck()","item: %o",e),this._sdpQueue.enqueue(e)}async dequeue(){this._queueBusy=!0;const e=this._sdpQueue.dequeue();if(this.logger.info("dequeue()","ret: %o",e),!e)return void(this._queueBusy=!1);const t=[];try{const{items:h,sdpStrategy:p}=e,b=[],_=[],y=[];if(p===Mx.ADD){delete Ju({},this.peer._answerIce).candidates;var i,o=!1,s=!1;try{for(var r,n=function(e){var t,i,o,s=2;for(void 0!==Su&&(i=qG,o=Mu);s--;){if(i&&null!=(t=e[i]))return t.call(e);if(o&&null!=(t=e[o]))return new kx(t.call(e));i="@@asyncIterator",o="@@iterator"}throw new TypeError("Object is not async iterable")}(h);o=!(r=await n.next()).done;o=!1){const e=r.value;{var a;const{audioMid:i,videoMid:o,action:s,audioTransceiverInit:r,videoTransceiverInit:n,signalingAck:l,stream:u,videoCodec:m,onSuccess:h,onFail:p}=e,v=u instanceof xM;if(h&&y.push(h),p&&t.push(p),v&&l.sequenceId<u.sequenceId)break;const S=Tf.parse(l.sdp);if(!Array.isArray(S.media))break;vg(a=S.media).call(a,((e,t)=>{var i;return null==e||null===(i=e.type)||void 0===i?void 0:i.localeCompare(null==t?void 0:t.type)}));const Z=S.media.find((e=>"audio"===e.type)),f=S.media.find((e=>"video"===e.type));if(!Z||!f)break;const T=Ju(Ju(Ju({},Z),this.peer._answerIce),{},{mid:i}),I=Ju(Ju(Ju({},f),this.peer._answerIce),{},{mid:o}),{audioMLine:g,videoMLine:R,audioTransceiver:X,videoTransceiver:L}=u,C={audio:void 0,video:void 0};if(g){let e=this.peer._offerMlines.findIndex((e=>e.mid===i));var d;if(X){if(this._reportRtcInvokeStatus("chromeHandler.updateTrack",JSON.stringify({audioStreamTrack:cp(null===(d=u.audioTrack)||void 0===d?void 0:d.preprocessingTrack)})),-1===e){this.logger.error("dequeue","audio mid not found when update sdp, %s from %o",i,this.peer._offerMlines);continue}}else r&&g&&(u.audioTransceiver=this._peerConnection.addTransceiver(r.track,r.init),C.audio=u.audioTransceiver,this._reportRtcInvokeStatus("chromeHandler.addTrack",JSON.stringify({audioStreamTrack:cp(r.track)})),e=this._inactiveMlineIndex.shift(),e||(e=this.peer._offerMlines.length),Fx&&u.initAudioEncodedTransform());s===Yx.publish&&"OPUS"!==WZ("AUDIO_CODEC")&&(RG(g,WZ("AUDIO_CODEC")),RG(T,WZ("AUDIO_CODEC"))),this.peer._offerMlines[e]=Ju({},g),this.peer._answerMlines[e]=Ju({},T)}if(R){let e=this.peer._offerMlines.findIndex((e=>e.mid===o));var c;if(L){if(this._reportRtcInvokeStatus("chromeHandler.updateTrack",JSON.stringify({audioStreamTrack:cp(null===(c=u.videoTrack)||void 0===c?void 0:c.preprocessingTrack)})),-1===e){this.logger.error("dequeue","video mid not found when update sdp, %s from %o",o,this.peer._offerMlines);continue}}else n&&R&&(u.videoTransceiver=this._peerConnection.addTransceiver(n.track,n.init),this._reportRtcInvokeStatus("chromeHandler.addTrack",JSON.stringify({videoStreamTrack:cp(n.track)})),C.video=u.videoTransceiver,e=this._inactiveMlineIndex.shift(),e||(e=this.peer._offerMlines.length),Fx&&u.initVideoEncodedTransform());this.peer._offerMlines[e]=Ju({},R),s===Yx.publish&&m&&(XG(R,m),XG(I,m)),this.peer._answerMlines[e]=I}b.push(u.streamId||""),_.push(v?u.userId:"local"),v&&(u.sequenceId=l.sequenceId,C.audio&&C.video&&u.jitterBufferStepper.setReceivers({audio:C.audio.receiver,video:C.video.receiver}))}}}catch(u){s=!0,i=u}finally{try{o&&null!=n.return&&await n.return()}finally{if(s)throw i}}}else{var l;const e={};h.forEach((t=>{const{audioMid:i,videoMid:o,action:s}=t;e[i]=i,s!==Yx.removetrack&&(e[o]=o),e[i]=i})),this.peer._offerMlines=this.peer._offerMlines.map(((t,i)=>(t.mid&&e[t.mid]&&(t=SG(t),this._inactiveMlineIndex.push(i)),t))),this._inactiveMlineIndex=[...new Set(this._inactiveMlineIndex)],vg(l=this._inactiveMlineIndex).call(l,((e,t)=>e-t)),this.peer._answerMlines=this.peer._answerMlines.map((t=>(t.mid&&e[t.mid]&&(t=SG(t)),t)))}try{await this.peer.getOriginRTCPeerConnection().createOffer(),await this.setDescription(b.length?{streamId:b.join(","),streamUserId:_.join(",")}:void 0)}catch(m){throw"have-local-offer"===this._peerConnection.signalingState&&await this._peerConnection.setLocalDescription({type:"rollback"}),m}try{y.forEach((e=>e()))}catch(oK){}this.logger.info("dequeue","loop")}catch(u){this.logger.error("dequeue","unknown error: %o",u),t.forEach((e=>e(u)))}finally{this.dequeue()}}async getDefaultSdp(){const e=await this._genOfferSdp();this.createAVMlineOfferTpl(e);const t=Tf.parse(e),i=[];return t.media=t.media.filter((e=>"recvonly"===e.direction&&(Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"!==e.uri))),i.push("".concat(e.mid)),!0))),t.groups=[{mids:i.join(" "),type:"BUNDLE"}],hZ&&LG(t),{sdp:Tf.write(t),semantics:"unified-plan",type:"incroffer"}}async rollback(e){let{stream:t}=e;t instanceof kM||await this.handleAck({action:Yx.unsubscribe,streamId:t.streamId,audioMid:t.audioMid,videoMid:t.videoMid,stream:t}),delete t.audioMLine,delete t.videoMLine}createAVMlineOfferTpl(e){const t=Tf.parse(e);t.media.forEach((e=>{e.icePwd=this.peer._offerIce.icePwd,e.iceUfrag=this.peer._offerIce.iceUfrag,"audio"===e.type?"sendonly"===e.direction?this._aSendonlyOfferTpl=e:(Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"!==e.uri))),this._aRecvonlyOfferTpl=e):"video"===e.type&&("sendonly"===e.direction?this._vSendonlyOfferTpl=e:(Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"!==e.uri))),this._vRecvonlyOfferTpl=e))})),hZ&&LG(t)}async _genOfferSdp(){let e;try{if(e=await async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(zf)return zf;const t=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});t.createDataChannel("default"),t.addTransceiver("audio",{direction:"recvonly"}),t.addTransceiver("video",{direction:"recvonly"}),e&&(t.addTransceiver("audio",{direction:"sendonly"}),t.addTransceiver("video",{direction:"sendonly"}));const i=await t.createOffer();return t.close(),zf=i.sdp,i.sdp}(!0),!e)throw"pc.createOffer() return empty."}catch(t){const e="Get offer Error. ".concat(t.message|t);throw new LS(RS.NOT_SUPPORTED,e)}return e}}class Ox extends xx{constructor(e,t){var i;super(e,t),Hu(this,"name","firefox"),Hu(this,"_aRecvonlyOfferTpl",void 0),this.logger=new xv("FirefoxHandler",3,e.id),null===(i=this._context.monitor)||void 0===i||i.set({handler_mode:"firefox"})}async publish(e){var t,i;const{videoDescriptions:o,subVideoDescriptions:s,audioTransceiverInit:r,videoTransceiverInit:n}=super.internalPublish(e);e.audioTransceiver=this._peerConnection.addTransceiver(r.track,r.init),Array.isArray(n.init.sendEncodings)&&1===n.init.sendEncodings.length&&(n.init.sendEncodings=n.init.sendEncodings.map((e=>(delete e.rid,e)))),e.videoTransceiver=this._peerConnection.addTransceiver(n.track,n.init);const a=Hf();this._report("rtc_begin_create_offer",{direction:"up",stream_id:"",stream_user_id:"",pc_session_id:this.peerConnectionId,vendor_mode:0});const d=await this.peer.createOfferSdp();this._report("rtc_create_offer",{direction:"up",error_code:0,stream_id:"",stream_user_id:"",elapse:Hf()-a});const c=Tf.parse(d);c.media=null===(t=c.media)||void 0===t?void 0:t.map((e=>Ju(Ju({},e),this.peer._offerIce))),LG(c),await this.setLocalDescription(Tf.write(c));const l=e.audioTransceiver.mid,u=e.videoTransceiver.mid;let m=null,h=null;return c.media=null===(i=c.media)||void 0===i?void 0:i.map((e=>{if("".concat(e.mid)===l){var t;m=e;const o=null===(t=m)||void 0===t?void 0:t.rtp.find((e=>"opus"===e.codec));if(o&&m.fmtp){var i;const e=m.fmtp.find((e=>e.payload===o.payload));e&&null!==(i=this._context)&&void 0!==i&&i.audioProfileManager&&(e.config=this._context.audioProfileManager.getOpusConfigStr(e.config))}}else"".concat(e.mid)===u&&(h=e);return e})),this.addBitrateLimit(h,e.videoEncodeConfig[0].maxKbps),await this.setLocalDescription(Tf.write(c)),e.initVideoEncodedTransform(),e.initAudioEncodedTransform(),{partialSdp:ZG(c,m,h),audioMid:l,videoMid:u,type:"incroffer",semantics:"unified-plan",videoDescriptions:o,subVideoDescriptions:s,audioTransceiverInit:r,videoTransceiverInit:n,peerConnectionMode:this.peerConnectionMode}}async _internalChangePubCodec(){const{localDescription:e}=this._peerConnection;e&&(await this.peer.createOfferSdp(),await this._peerConnection.setLocalDescription(e))}async subscribe(e,t){var i,o,s,r;this.logger.info("subscribe()");let n,a,d="",c="",l=!1,u=!1;e.virtual?l=!0:(t.multiChatMode||(l=!0),u=!0),l&&(e.audioTransceiver=this._peerConnection.addTransceiver("audio",{direction:"recvonly"})),u&&(e.videoTransceiver=this._peerConnection.addTransceiver("video",{direction:"recvonly"})),e.audioTransceiver&&e.videoTransceiver&&e.jitterBufferStepper.setReceivers({audio:e.audioTransceiver.receiver,video:e.videoTransceiver.receiver});const m=Hf();this._report("rtc_begin_create_offer",{direction:"up",stream_id:e.streamId,stream_user_id:e.userId,pc_session_id:this.peerConnectionId,vendor_mode:0});const h=await this.peer.createOfferSdp();this._report("rtc_create_offer",{error_code:0,direction:"up",stream_id:e.streamId,stream_user_id:e.userId,elapse:Hf()-m});const p=Tf.parse(h);let b,_;if(p.media=null===(i=p.media)||void 0===i?void 0:i.map((e=>Ju(Ju({},e),this.peer._offerIce))),p.media.map((e=>{var t,i,o,s;"video"===e.type&&(mZ?(e.ext=null===(t=e.ext)||void 0===t?void 0:t.filter((e=>-1===e.uri.indexOf("abs-send-time"))),e.rtcpFb=null===(i=e.rtcpFb)||void 0===i?void 0:i.filter((e=>"goog-remb"!==e.type))):(e.rtcpFb=null===(o=e.rtcpFb)||void 0===o?void 0:o.filter((e=>"transport-cc"!==e.type)),e.ext=null===(s=e.ext)||void 0===s?void 0:s.filter((e=>-1===e.uri.indexOf("transport")))))})),hZ&&LG(p),await this.setLocalDescription(Tf.write(p),{streamId:e.streamId||"",streamUserId:e.userId}),d=null===(o=e.audioTransceiver)||void 0===o?void 0:o.mid,c=null===(s=e.videoTransceiver)||void 0===s?void 0:s.mid,null===(r=p.media)||void 0===r||r.forEach((e=>{"".concat(e.mid)===d?n=e:"".concat(e.mid)===c&&(a=e)})),d&&n||(d="audio_".concat(c),n=Ju(Ju({},this._aRecvonlyOfferTpl),{},{mid:d})),e.audioMid=d,e.videoMid=c,!t.multiChatMode&&!e.virtual&&this._aSendonlyAnswerTpl&&this._aSendonlyAnswerTpl){var y,v,S;b=_G(this._nextSsrc),this._nextSsrc=b.next;const t=Ju(Ju(Ju({},this._aSendonlyAnswerTpl),this.peer._answerIce),{},{mid:d,msid:"".concat(e.streamId).concat(null!==(y=this._context)&&void 0!==y&&y.avSync?"":"-audio"," ").concat(e.streamId,"-audio"),ssrcs:yG(e.streamId,"audio",b.audio)}),i=Ju(Ju(Ju({},this._vSendonlyAnswerTpl),this.peer._answerIce),{},{mid:c,msid:"".concat(e.streamId).concat(null!==(v=this._context)&&void 0!==v&&v.avSync?"":"-video"," ").concat(e.streamId,"-video")},vG(e.streamId,b,{flexfec:this._enableSubFlexfec}));_={sdp:Tf.write(Ju(Ju({},this.peer._answerSession),{},{media:[t,i]})),sequenceId:e.sequenceId?++e.sequenceId:0},null===(S=b)||void 0===S||delete S.next}return e.initVideoEncodedTransform(),e.initAudioEncodedTransform(),{partialSdp:ZG(p,n,a,!1),audioMid:d,videoMid:c,type:"incroffer",semantics:"unified-plan",audioTransceiverInit:e.audioTransceiver?{track:"audio",init:{direction:"recvonly"}}:void 0,videoTransceiverInit:e.videoTransceiver?{track:"video",init:{direction:"recvonly"}}:void 0,allSsrc:b,peerConnectionMode:this.peerConnectionMode,signalingAck:_}}async handleAck(e){const{stream:t,action:i}=e;if(i===Yx.removetrack)return"";if(i===Yx.unpublish||i===Yx.unsubscribe){try{await this.close(t),"function"==typeof e.onSuccess&&e.onSuccess()}catch(n){"function"==typeof e.onFail&&e.onFail(n)}return t.streamId||""}const{signalingAck:o,videoCodec:s}=e,r=Tf.parse(o.sdp);try{await this._internalSetRemoteDescription(r.media,t,s),"function"==typeof e.onSuccess&&e.onSuccess()}catch(n){"function"==typeof e.onFail&&e.onFail(n)}return""}async _internalSetRemoteDescription(e,t,i){var o,s;const r={},n=Tf.parse(null===(o=this._peerConnection.remoteDescription)||void 0===o?void 0:o.sdp);n.media.forEach((e=>{void 0!==e.mid&&(r[e.mid]=e)})),e.forEach((e=>{if("audio"===(e=Ju(Ju({},e),this.peer._answerIce)).type&&(t.audioMid?(e.mid=t.audioMid,r[t.audioMid]=e):r[e.mid]=e),"video"===e.type){if(t instanceof kM&&cS<=87){const t={};Array.isArray(e.rtp)&&(e.rtp=e.rtp.filter((e=>"rtx"!==e.codec||(t[e.payload]=e.payload,!1)))),"string"==typeof e.payloads&&(e.payloads=e.payloads.split(" ").filter((e=>!t[e])).join(" ")),Array.isArray(e.fmtp)&&(e.fmtp=e.fmtp.filter((e=>!t[e.payload]))),Array.isArray(e.rtcpFb)&&(e.fmtp=e.fmtp.filter((e=>!t[e.payload])))}i&&XG(e,i),t.videoMid?(e.mid=t.videoMid,r[t.videoMid]=e):r[e.mid]=e}}));const a=Tf.parse(null===(s=this._peerConnection.localDescription)||void 0===s?void 0:s.sdp),d=a.media.map((e=>{const t=r[e.mid];return"inactive"===e.direction?e:t}));n.groups=a.groups,n.media=d,n.media.map((e=>{if("video"===e.type){var t,i,o,s,r;if(mZ)e.ext=null===(t=e.ext)||void 0===t?void 0:t.filter((e=>-1===e.uri.indexOf("abs-send-time"))),e.rtcpFb=null===(i=e.rtcpFb)||void 0===i?void 0:i.filter((e=>"goog-remb"!==e.type));else e.rtcpFb=null===(o=e.rtcpFb)||void 0===o?void 0:o.filter((e=>"transport-cc"!==e.type)),e.ext=null===(s=e.ext)||void 0===s?void 0:s.filter((e=>-1===e.uri.indexOf("transport")));if(cS>=138)e.ext=null===(r=e.ext)||void 0===r?void 0:r.filter((e=>!e.uri.includes("sdes:mid")))}})),hZ&&LG(n),await this.setRemoteDescription(Tf.write(n))}async getDefaultSdp(){const e=new RTCPeerConnection;e.addTransceiver("audio",{direction:"recvonly"}),e.addTransceiver("video",{direction:"recvonly"});const t=await e.createOffer(),i=Tf.parse(t.sdp);this.createAVMlineOfferTpl(t.sdp);const o=[];return i.media=i.media.filter((e=>{if("recvonly"===e.direction){const t="template_".concat(e.type);return e.mid=t,o.push(t),!0}return!1})),hZ&&LG(i),i.groups=[{mids:o.join(" "),type:"BUNDLE"}],e.close(),{sdp:Tf.write(i),semantics:"unified-plan",type:"incroffer"}}async rollback(e){let{msid:t,stream:i,audioMid:o,videoMid:s}=e;return this.logger.warn("rollback()"),this.close(i,o,s)}async close(e,t,i){var o;this.logger.info("close()");const s=e.audioMid||t,r=e.videoMid||i,n={};e.audioTransceiver&&s&&(e.audioTransceiver.stop(),n[s]=s),e.videoTransceiver&&r&&(e.videoTransceiver.stop(),n[r]=r),e instanceof xM&&e.jitterBufferStepper.setReceivers(void 0);const a=[],d=await this.peer.createOfferSdp(),c=Tf.parse(d);c.media=c.media.map((e=>(n[e.mid]&&(e=SG(e)),"inactive"!==e.direction&&a.push(e.mid),Ju(Ju({},e),this.peer._offerIce))));const l=Tf.parse(null===(o=this._peerConnection.remoteDescription)||void 0===o?void 0:o.sdp),u={};l.media.forEach((e=>{void 0!==e.mid&&(u[e.mid]=e)})),l.media=c.media.map((e=>"inactive"===e.direction?e:u[e.mid])),c.groups&&l.groups&&(c.groups[0].mids=a.join(" "),l.groups[0].mids=a.join(" ")),await this.setLocalDescription(Tf.write(c)),await this.setRemoteDescription(Tf.write(l))}async setCurrentDescription(){await this.peer.createOfferSdp(),this._peerConnection.localDescription&&this._peerConnection.remoteDescription&&(await this._peerConnection.setLocalDescription(this._peerConnection.localDescription),await this._peerConnection.setRemoteDescription(this._peerConnection.remoteDescription))}createAVMlineOfferTpl(e){const t=Tf.parse(e);t.media.forEach((e=>{"audio"===e.type&&(this._aRecvonlyOfferTpl=e)})),hZ&&LG(t)}}class Ux extends xx{constructor(e,t){var i,o;super(e,t),Hu(this,"name","fallback"),Hu(this,"_aRecvonlyOfferTpl",void 0),this.logger=new xv("FallbackHandler",3,e.id),this.logger.warn("ctor","using fallback handler"),null===(i=this._context.monitor)||void 0===i||i.report("rtc_error",{message:"using fallback handler",error_code:-1}),null===(o=this._context.monitor)||void 0===o||o.set({handler_mode:"fallback"})}async publish(e){var t;const{videoDescriptions:i,subVideoDescriptions:o,audioTransceiverInit:s,videoTransceiverInit:r}=super.internalPublish(e);e.audioTransceiver=this._peerConnection.addTransceiver(s.track,s.init),Array.isArray(r.init.sendEncodings)&&1===r.init.sendEncodings.length&&(r.init.sendEncodings=r.init.sendEncodings.map((e=>(delete e.rid,e)))),e.videoTransceiver=this._peerConnection.addTransceiver(r.track,r.init);const n=Hf();this._report("rtc_begin_create_offer",{direction:"up",stream_id:"",stream_user_id:"",pc_session_id:this.peerConnectionId,vendor_mode:0});const a=await this.peer.createOfferSdp();this._report("rtc_create_offer",{direction:"up",error_code:0,stream_id:"",stream_user_id:"",elapse:Hf()-n});const d=Tf.parse(a);await this.setLocalDescription(a);const c=e.audioTransceiver.mid,l=e.videoTransceiver.mid;let u=null,m=null;return d.media=null===(t=d.media)||void 0===t?void 0:t.map((e=>("".concat(e.mid)===c?u=e:"".concat(e.mid)===l&&(m=e),e))),e.initVideoEncodedTransform(),e.initAudioEncodedTransform(),{partialSdp:ZG(d,u,m),audioMid:c,videoMid:l,type:"incroffer",semantics:"unified-plan",videoDescriptions:i,subVideoDescriptions:o,audioTransceiverInit:s,videoTransceiverInit:r,peerConnectionMode:this.peerConnectionMode}}async _internalChangePubCodec(){const{localDescription:e}=this._peerConnection;e&&(await this.peer.createOfferSdp(),await this._peerConnection.setLocalDescription(e))}async subscribe(e,t){var i,o,s;this.logger.info("subscribe()");let r,n,a="",d="",c=!1,l=!1;e.virtual?c=!0:(t.multiChatMode||(c=!0),l=!0),c&&(e.audioTransceiver=this._peerConnection.addTransceiver("audio",{direction:"recvonly"})),l&&(e.videoTransceiver=this._peerConnection.addTransceiver("video",{direction:"recvonly"}));const u=Hf();this._report("rtc_begin_create_offer",{direction:"up",stream_id:e.streamId,stream_user_id:e.userId,pc_session_id:this.peerConnectionId,vendor_mode:0});const m=await this.peer.createOfferSdp();this._report("rtc_create_offer",{error_code:0,direction:"up",stream_id:e.streamId,stream_user_id:e.userId,elapse:Hf()-u});const h=Tf.parse(m);let p,b;if(await this.setLocalDescription(m,{streamId:e.streamId||"",streamUserId:e.userId}),a=null===(i=e.audioTransceiver)||void 0===i?void 0:i.mid,d=null===(o=e.videoTransceiver)||void 0===o?void 0:o.mid,null===(s=h.media)||void 0===s||s.forEach((e=>{"".concat(e.mid)===a?r=e:"".concat(e.mid)===d&&(n=e)})),a&&r||(a="audio_".concat(d),r=Ju(Ju({},this._aRecvonlyOfferTpl),{},{mid:a})),e.audioMid=a,e.videoMid=d,!t.multiChatMode&&!e.virtual&&this._aSendonlyAnswerTpl&&this._aSendonlyAnswerTpl){var _,y,v;p=_G(this._nextSsrc),this._nextSsrc=p.next;const t=Ju(Ju(Ju({},this._aSendonlyAnswerTpl),this.peer._answerIce),{},{mid:a,msid:"".concat(e.streamId).concat(null!==(_=this._context)&&void 0!==_&&_.avSync?"":"-audio"," ").concat(e.streamId,"-audio"),ssrcs:yG(e.streamId,"audio",p.audio)}),i=Ju(Ju(Ju({},this._vSendonlyAnswerTpl),this.peer._answerIce),{},{mid:d,msid:"".concat(e.streamId).concat(null!==(y=this._context)&&void 0!==y&&y.avSync?"":"-video"," ").concat(e.streamId,"-video")},vG(e.streamId,p,{flexfec:this._enableSubFlexfec}));b={sdp:Tf.write(Ju(Ju({},this.peer._answerSession),{},{media:[t,i]})),sequenceId:e.sequenceId?++e.sequenceId:0},null===(v=p)||void 0===v||delete v.next}return e.initVideoEncodedTransform(),e.initAudioEncodedTransform(),{partialSdp:ZG(h,r,n,!1),audioMid:a,videoMid:d,type:"incroffer",semantics:"unified-plan",audioTransceiverInit:e.audioTransceiver?{track:"audio",init:{direction:"recvonly"}}:void 0,videoTransceiverInit:e.videoTransceiver?{track:"video",init:{direction:"recvonly"}}:void 0,allSsrc:p,peerConnectionMode:this.peerConnectionMode,signalingAck:b}}async handleAck(e){const{stream:t,action:i}=e;if(i===Yx.removetrack)return"";if(i===Yx.unpublish||i===Yx.unsubscribe){try{await this.close(t),"function"==typeof e.onSuccess&&e.onSuccess()}catch(n){"function"==typeof e.onFail&&e.onFail(n)}return t.streamId||""}const{signalingAck:o,videoCodec:s}=e,r=Tf.parse(o.sdp);try{await this._internalSetRemoteDescription(r.media,t,s),"function"==typeof e.onSuccess&&e.onSuccess()}catch(n){"function"==typeof e.onFail&&e.onFail(n)}return""}async _internalSetRemoteDescription(e,t,i){var o,s;const r={},n=Tf.parse(null===(o=this._peerConnection.remoteDescription)||void 0===o?void 0:o.sdp);n.media.forEach((e=>{void 0!==e.mid&&(r[e.mid]=e)})),e.forEach((e=>{"audio"===(e=Ju(Ju({},e),this.peer._answerIce)).type&&(t.audioMid?(e.mid=t.audioMid,r[t.audioMid]=e):r[e.mid]=e),"video"===e.type&&(i&&XG(e,i),t.videoMid?(e.mid=t.videoMid,r[t.videoMid]=e):r[e.mid]=e)}));const a=Tf.parse(null===(s=this._peerConnection.localDescription)||void 0===s?void 0:s.sdp),d=a.media.map((e=>{const t=r[e.mid];return"inactive"===e.direction?e:t}));n.groups=a.groups,n.media=d,n.media.map((e=>{var t,i,o,s;"video"===e.type&&(mZ?(e.ext=null===(t=e.ext)||void 0===t?void 0:t.filter((e=>-1===e.uri.indexOf("abs-send-time"))),e.rtcpFb=null===(i=e.rtcpFb)||void 0===i?void 0:i.filter((e=>"goog-remb"!==e.type))):(e.rtcpFb=null===(o=e.rtcpFb)||void 0===o?void 0:o.filter((e=>"transport-cc"!==e.type)),e.ext=null===(s=e.ext)||void 0===s?void 0:s.filter((e=>-1===e.uri.indexOf("transport")))))})),await this.setRemoteDescription(Tf.write(n))}async getDefaultSdp(){const e=new RTCPeerConnection;e.addTransceiver("audio",{direction:"recvonly"}),e.addTransceiver("video",{direction:"recvonly"});const t=await e.createOffer(),i=Tf.parse(t.sdp);this.createAVMlineOfferTpl(t.sdp);const o=[];return i.media=i.media.filter((e=>{if("recvonly"===e.direction){const t="template_".concat(e.type);return e.mid=t,o.push(t),!0}return!1})),i.groups=[{mids:o.join(" "),type:"BUNDLE"}],e.close(),{sdp:Tf.write(i),semantics:"unified-plan",type:"incroffer"}}async rollback(e){let{msid:t,stream:i,audioMid:o,videoMid:s}=e;return this.logger.warn("rollback()"),this.close(i,o,s)}async close(e,t,i){var o;this.logger.info("close()");const s=e.audioMid||t,r=e.videoMid||i,n={};e.audioTransceiver&&s&&(e.audioTransceiver.stop(),n[s]=s),e.videoTransceiver&&r&&(e.videoTransceiver.stop(),n[r]=r);const a=[],d=await this.peer.createOfferSdp(),c=Tf.parse(d);c.media=c.media.map((e=>(n[e.mid]&&(e=SG(e)),"inactive"!==e.direction&&a.push(e.mid),Ju(Ju({},e),this.peer._offerIce))));const l=Tf.parse(null===(o=this._peerConnection.remoteDescription)||void 0===o?void 0:o.sdp),u={};l.media.forEach((e=>{void 0!==e.mid&&(u[e.mid]=e)})),l.media=c.media.map((e=>"inactive"===e.direction?e:u[e.mid])),c.groups&&l.groups&&(c.groups[0].mids=a.join(" "),l.groups[0].mids=a.join(" ")),await this.setLocalDescription(d),await this.setRemoteDescription(Tf.write(l))}async setCurrentDescription(){await this.peer.createOfferSdp(),this._peerConnection.localDescription&&this._peerConnection.remoteDescription&&(await this._peerConnection.setLocalDescription(this._peerConnection.localDescription),await this._peerConnection.setRemoteDescription(this._peerConnection.remoteDescription))}createAVMlineOfferTpl(e){Tf.parse(e).media.forEach((e=>{"audio"===e.type&&(this._aRecvonlyOfferTpl=e)}))}}var Dx=Object.defineProperty,Ax=Object.getOwnPropertyDescriptor,zx=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?Ax(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&Dx(t,i,r),r};class jx{constructor(e){Hu(this,"_queue",[]),Hu(this,"_runningTask",[]),Hu(this,"executor",void 0),Hu(this,"busy",!1),this.executor=e}add(e){const{promise:t,resolve:i,reject:o}=eN();return this._queue.push({item:e,resolve:i,reject:o}),this.busy||this._emit(),t}destroy(){[...this._queue,...this._runningTask].forEach((e=>{let{reject:t}=e;t(new LS(RS.OPERATION_CANCEL,"queue close"))})),this.busy=!1,this._queue=[]}async _emit(){const e=this._queue;if(this._runningTask=e,this._queue=[],0===e.length)return void(this.busy=!1);const t=e.map((e=>e.item)),i=e.map((e=>e.resolve)),o=e.map((e=>e.reject));try{this.busy=!0;const e=await this.executor(t);i.forEach((t=>t(e)))}catch(s){o.forEach((e=>e(s)))}this._runningTask=[],setTimeout((()=>{this._emit()}))}}function Qx(){return cZ()||dZ()}class Bx extends xx{constructor(e,t){var i;super(e,t),Hu(this,"name","standard"),Hu(this,"_applyQueue",new jx(this.apply.bind(this))),Hu(this,"_createQueue",new jx(this.create.bind(this))),Hu(this,"_pqueue",new $x),Hu(this,"_midMap",new Map),Hu(this,"_aRecvonlyOfferTpl",void 0),this.logger=new xv("StandardHandler",3,e.id),this.logger.warn("ctor","using standard handler"),null===(i=this._context.monitor)||void 0===i||i.set({handler_mode:"standard"}),this._peerConnection.addTransceiver("audio",{direction:"recvonly"}),this._peerConnection.addTransceiver("video",{direction:"recvonly"})}async publish(e){var t;this.logger.info("publish()","streamId: ".concat(e.streamId));const{videoDescriptions:i,subVideoDescriptions:o,audioTransceiverInit:s,videoTransceiverInit:r}=super.internalPublish(e);e.audioTransceiver=this._peerConnection.addTransceiver(s.track,Ju(Ju({},s.init),{},{direction:"sendonly"})),Array.isArray(r.init.sendEncodings)&&1===r.init.sendEncodings.length&&(r.init.sendEncodings=r.init.sendEncodings.map((e=>(delete e.rid,e)))),e.videoTransceiver=this._peerConnection.addTransceiver(r.track,Ju(Ju({},r.init),{},{direction:"sendonly"}));const n=Hf();this._report("rtc_begin_create_offer",{direction:"up",stream_id:"",stream_user_id:"local",pc_session_id:this.peerConnectionId,vendor_mode:0});const a=await this._createQueue.add();this._report("rtc_create_offer",{direction:"up",error_code:0,stream_id:"",stream_user_id:"local",elapse:Hf()-n});const d=e.audioTransceiver.mid,c=e.videoTransceiver.mid;kG(d&&c,"Transceiver not return MID after setLocalDescription"),e.audioMid=d,e.videoMid=c;let l=null,u=null;const m=Tf.parse(a);return m.media=null===(t=m.media)||void 0===t?void 0:t.map((e=>("".concat(e.mid)===d?l=e:"".concat(e.mid)===c&&(u=e),e))),Qx()&&(e.initVideoEncodedTransform(),e.initAudioEncodedTransform()),{partialSdp:ZG(m,l,u),audioMid:d,videoMid:c,type:"incroffer",semantics:"unified-plan",videoDescriptions:i,subVideoDescriptions:o,audioTransceiverInit:s,videoTransceiverInit:r,peerConnectionMode:this.peerConnectionMode}}async subscribe(e,t){var i,o,s,r,n;this.logger.info("subscribe()","streamId: ".concat(e.streamId));let a,d,c=!1,l=!1;e.virtual?c=!0:(t.multiChatMode||(c=!0),l=!0),c&&(e.audioTransceiver=this._peerConnection.addTransceiver("audio",{direction:"recvonly"})),l&&(e.videoTransceiver=this._peerConnection.addTransceiver("video",{direction:"recvonly"})),e.audioTransceiver&&e.videoTransceiver&&e.jitterBufferStepper.setReceivers({video:e.videoTransceiver.receiver,audio:e.audioTransceiver.receiver});const u=Hf();this._report("rtc_begin_create_offer",{direction:"down",stream_id:e.streamId,stream_user_id:e.userId,pc_session_id:this.peerConnectionId,vendor_mode:0});const m=await this._createQueue.add();this._report("rtc_create_offer",{error_code:0,direction:"down",stream_id:e.streamId,stream_user_id:e.userId,elapse:Hf()-u});let h=null!==(i=null===(o=e.audioTransceiver)||void 0===o?void 0:o.mid)&&void 0!==i?i:void 0;const p=null!==(s=null===(r=e.videoTransceiver)||void 0===r?void 0:r.mid)&&void 0!==s?s:void 0,b=Tf.parse(m);let _,y;if(null===(n=b.media)||void 0===n||n.forEach((e=>{"".concat(e.mid)===h?a=e:"".concat(e.mid)===p&&(d=e)})),h&&a||(h="audio_".concat(p),a=Ju(Ju({},this._aRecvonlyOfferTpl),{},{mid:h})),e.audioMid=h,e.videoMid=p,!t.multiChatMode&&!e.virtual&&this._aSendonlyAnswerTpl&&this._aSendonlyAnswerTpl){var v,S,Z;_=this._generateAllSsrc();const t=Ju(Ju(Ju({},this._aSendonlyAnswerTpl),this.peer._answerIce),{},{mid:h,msid:"".concat(e.streamId).concat(null!==(v=this._context)&&void 0!==v&&v.avSync?"":"-audio"," ").concat(e.streamId,"-audio"),ssrcs:yG(e.streamId,"audio",_.audio)}),i=Ju(Ju(Ju({},this._vSendonlyAnswerTpl),this.peer._answerIce),{},{mid:p,msid:"".concat(e.streamId).concat(null!==(S=this._context)&&void 0!==S&&S.avSync?"":"-video"," ").concat(e.streamId,"-video")},vG(e.streamId,_,{flexfec:this._enableSubFlexfec}));y={sdp:Tf.write(Ju(Ju({},this.peer._answerSession),{},{media:[t,i]})),sequenceId:e.sequenceId?++e.sequenceId:0},null===(Z=_)||void 0===Z||delete Z.next}return Qx()&&(e.initVideoEncodedTransform(),e.initAudioEncodedTransform()),{partialSdp:ZG(b,a,d),audioMid:h,videoMid:p||"",type:"incroffer",semantics:"unified-plan",audioTransceiverInit:e.audioTransceiver?{track:"audio",init:{direction:"recvonly"}}:void 0,videoTransceiverInit:e.videoTransceiver?{track:"video",init:{direction:"recvonly"}}:void 0,allSsrc:_,peerConnectionMode:this.peerConnectionMode,signalingAck:y}}async handleAck(e){const{stream:t,action:i}=e;if(i===Yx.removetrack)return"";if(i===Yx.unpublish||i===Yx.unsubscribe){try{await this.close(t),"function"==typeof e.onSuccess&&e.onSuccess()}catch(n){"function"==typeof e.onFail&&e.onFail(n)}return t.streamId||""}const{signalingAck:o,videoCodec:s}=e,r=Tf.parse(o.sdp);try{await this._internalSetRemoteDescription(r.media,t,s),"function"==typeof e.onSuccess&&e.onSuccess()}catch(n){"function"==typeof e.onFail&&e.onFail(n)}return""}async _internalSetRemoteDescription(e,t,i){e.forEach((e=>{"audio"===(e=Ju(Ju({},e),this.peer._answerIce)).type&&(t.audioMid?(e.mid=t.audioMid,this._midMap.set(t.audioMid,e)):this._midMap.set(e.mid,e)),"video"===e.type&&(i&&XG(e,i),t.videoMid?(e.mid=t.videoMid,this._midMap.set(t.videoMid,e)):this._midMap.set(e.mid,e))}));t instanceof kM?this.handlePublishAction({stream:t,videoCodec:i}):this.handleSubscribeAction({stream:t}),await this._applyQueue.add()}handlePublishAction(e){var t;const{videoCodec:i,stream:o}=e,s=o.audioMid?this._midMap.get(o.audioMid):void 0,r=o.videoMid?this._midMap.get(o.videoMid):void 0;this._context.pcKillSwitch.sld_rtcpfb_rrtr_add&&hZ&&(qx.addRRTR(s),qx.addRRTR(r));const n=null!==(t=this._context.serverConfig)&&void 0!==t&&t.audioRed?"RED":WZ("AUDIO_CODEC");"OPUS"!==n&&s&&RG(s,n),this._context.pcKillSwitch.sld_fmtp_opus_add&&qx.decorateOpusConfig(s,this._context.audioProfileManager),wv&&cS<=87&&qx.removeRtxInMLine(r),i&&r&&XG(r,i),this._context.pcKillSwitch.sld_ext_sdesmid_remove&&wv&&cS>=138&&qx.removeExtSdesMid(r),this._context.pcKillSwitch.sld_fmtp_bitrate_add&&(o.enableSimulcast||Kv||!r||this.addBitrateLimit(r,o.videoEncodeConfig[0].maxKbps)),wv&&qx.selectCC(r,mZ?"tcc":"remb"),o.audioMid&&s&&this._midMap.set(o.audioMid,s),o.videoMid&&r&&this._midMap.set(o.videoMid,r)}handleSubscribeAction(e){const{stream:t}=e,i=t.audioMid?this._midMap.get(t.audioMid):void 0,o=t.videoMid?this._midMap.get(t.videoMid):void 0;wv||(qx.removeRtpStreamId(i),qx.removeRtpStreamId(o)),this._context.pcKillSwitch.sld_rtcpfb_rrtr_add&&hZ&&(qx.addRRTR(i),qx.addRRTR(o)),this._context.pcKillSwitch.sld_fmtp_opus_add&&qx.decorateOpusConfig(i),WZ("IOS_SAFARI_ORIENTATION")||!Kv&&!$v||qx.removeExtVideoOrientation(o),this._context.pcKillSwitch.sld_fmtp_sps_add&&t.isPublic&&Hv&&pS>=86&&qx.decorateSpsPpsIdrInKeyframe(o),t.audioMid&&i&&this._midMap.set(t.audioMid,i),t.videoMid&&o&&this._midMap.set(t.videoMid,o)}async getDefaultSdp(){const e=new RTCPeerConnection;e.addTransceiver("audio",{direction:"recvonly"}),e.addTransceiver("video",{direction:"recvonly"});const t=await e.createOffer(),i=Tf.parse(t.sdp);this.createAVMlineOfferTpl(t.sdp);const o=[];return i.media=i.media.filter((e=>{if("recvonly"===e.direction){const t="template_".concat(e.type);return e.mid=t,o.push(t),!0}return!1})),hZ&&LG(i),i.groups=[{mids:o.join(" "),type:"BUNDLE"}],e.close(),{sdp:Tf.write(i),semantics:"unified-plan",type:"incroffer"}}async rollback(e){let{msid:t,stream:i,audioMid:o,videoMid:s}=e;return this.logger.warn("rollback()"),this.close(i,o,s)}async close(e,t,i){this.logger.info("close()");const o=e.audioMid||t,s=e.videoMid||i;if(e.audioTransceiver&&o)try{e.audioTransceiver.stop(),delete e.audioTransceiver,e instanceof xM&&e.jitterBufferStepper.setReceivers(void 0)}catch(a){}if(e.videoTransceiver&&s)try{e.videoTransceiver.stop(),delete e.videoTransceiver,e instanceof xM&&e.jitterBufferStepper.setReceivers(void 0)}catch(d){}const r=o?this._midMap.get(o):void 0,n=s?this._midMap.get(s):void 0;r&&SG(r),n&&SG(n),o&&r&&this._midMap.set(o,r),s&&n&&this._midMap.set(s,n),await this._applyQueue.add()}async setCurrentDescription(){await this._applyQueue.add()}createAVMlineOfferTpl(e){Tf.parse(e).media.forEach((e=>{"audio"===e.type&&(this._aRecvonlyOfferTpl=e)}))}_generateAllSsrc(){const e=_G(this._nextSsrc);return this._nextSsrc=e.next,e}async create(){this.logger.info("RTCPeerConnection create");const e=await this.peer.createOfferSdp();return kG(e,"RTCPeerConnection not return SDP"),await this.peer.setLocalDescription(e),e}async apply(){this.logger.info("RTCPeerConnection apply");let e=await this.peer.createOfferSdp();kG(e,"RTCPeerConnection not return SDP",e);const t=Tf.parse(e);e=this.generateOffer(t,e);const i=this.generateAnswer(t);await this.setLocalDescription(e),await this.setRemoteDescription(i)}generateOffer(e,t){let i=!1;return"v1"===this.peer.getIceVersion()&&wv&&(e.media=e.media.map((e=>Ju(Ju({},e),this.peer._offerIce))),i=!0),this._context.pcKillSwitch.sld_fmtp_opus_add&&(e.media=e.media.map((e=>{if("audio"===e.type){const t="sendonly"===e.direction;qx.decorateOpusConfig(e,t?this._context.audioProfileManager:void 0)}return e})),i=!0),this._context.pcKillSwitch.sld_rtcpfb_rrtr_add&&(e.media=e.media.map((e=>(!hZ||"audio"!==e.type&&"video"!==e.type||qx.addRRTR(e),e))),i=!0),i?Tf.write(e):t}generateAnswer(e){const t=[];return e.media.forEach((e=>{if("application"===e.type){kG(void 0!==e.mid,"should always have mid in mline",e);let i=this._midMap.get(e.mid);return i||(i=this.generateDCAnswer(e),this._midMap.set(e.mid,i)),void t.push(Ju({},i))}const i="".concat(e.mid);kG(i,"No MID in offer m-line: ".concat(e));let o=this._midMap.get(i);o||(this.logger.info("generateInactiveAnswerMLine","mid: %o, mLine: %o",e.mid,e),o=this.generateInactiveAnswerMLine(e)),t.push(o)})),this.peer.createAnswerSdp(t,e.groups)}generateInactiveAnswerMLine(e){return Ju(Ju(Ju({},e),this.peer._answerIce),{},{direction:"inactive"})}generateDCAnswer(e){const t=Ju(Ju(Ju({},e),this.peer._answerIce),{},{sctpmap:{sctpmapNumber:5e3,app:"webrtc-datachannel",maxMessageSize:262144}});return wv&&(delete t.bundleOnly,t.port=9),t}destroy(){super.destroy(),this._pqueue.destroy(),this._applyQueue.destroy(),this._createQueue.destroy()}}zx([function(e,t,i){const o=i.value;return i.value=async function(){const e=this.logger;e.info("SDP Lock","pending task %o",t);const i=await this._pqueue.enqueue(0);e.info("SDP Lock","running task %o",t);try{for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];return await(null==o?void 0:o.apply(this,r))}finally{e.info("SDP Lock","unlocking by task %o",t),i()}},i}],Bx.prototype,"create",1),zx([function(e,t,i){const o=i.value;return i.value=async function(){const e=this.logger;e.info("SDP Lock","pending task %o",t);const i=await this._pqueue.enqueue(1);e.info("SDP Lock","running task %o",t);try{for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];return await(null==o?void 0:o.apply(this,r))}finally{e.info("SDP Lock","unlocking by task %o",t),i()}},i}],Bx.prototype,"apply",1);const qx={decorateOpusConfig(e,t){if(!e)return;const i=null==e?void 0:e.rtp.find((e=>"opus"===e.codec));if(!i||!e.fmtp)return;const o=e.fmtp.find((e=>e.payload===i.payload));o&&(t&&(o.config=t.getOpusConfigStr(o.config)),o.config=tN(o.config))},removeRtxInMLine(e){var t;if(!e)return;const i=[];e.rtp=e.rtp.filter((e=>("rtx"===e.codec&&i.push(e.payload),"rtx"!==e.codec))),e.fmtp=e.fmtp.filter((e=>i.includes(e.payload))),e.payloads=null===(t=e.payloads)||void 0===t?void 0:t.split(" ").filter((e=>!i.includes(parseInt(e)))).join(" ")},removeExtSdesMid(e){var t;e&&(e.ext=null===(t=e.ext)||void 0===t?void 0:t.filter((e=>!e.uri.includes("sdes:mid"))))},selectCC(e,t){var i,o;if(e)if("tcc"===t)e.ext=null===(i=e.ext)||void 0===i?void 0:i.filter((e=>-1===e.uri.indexOf("abs-send-time"))),e.rtcpFb=null===(o=e.rtcpFb)||void 0===o?void 0:o.filter((e=>"goog-remb"!==e.type));else if("remb"===t){var s,r;e.rtcpFb=null===(s=e.rtcpFb)||void 0===s?void 0:s.filter((e=>"transport-cc"!==e.type)),e.ext=null===(r=e.ext)||void 0===r?void 0:r.filter((e=>-1===e.uri.indexOf("transport")))}},addRRTR(e){e&&e.rtp.forEach((t=>{e.rtcpFb||(e.rtcpFb=[]),e.rtcpFb.find((e=>e.payload===t.payload&&"rrtr"===e.type))||e.rtcpFb.push({payload:t.payload,type:"rrtr"})}))},removeRtpStreamId(e){e&&Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"!==e.uri)))},decorateSpsPpsIdrInKeyframe(e){if(!e)return;const t=e.rtp.filter((e=>"H264"===e.codec));t.length&&e.fmtp&&e.fmtp.forEach((e=>{t.find((t=>t.payload===e.payload))&&(e.config+=";sps-pps-idr-in-keyframe=1")}))},removeExtVideoOrientation(e){e&&Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>!e.uri.includes("video-orientation"))))},removeExtFramemarking(e){e&&Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>!e.uri.includes("framemarking"))))}};class $x{constructor(){Hu(this,"queue",[]),Hu(this,"processing",!1)}async enqueue(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;const{promise:t,resolve:i}=eN(),o={priority:e,resolve:i},s=this.queue.findIndex((t=>t.priority>e));return-1===s?this.queue.push(o):this.queue.splice(s,0,o),this.tryProcess(),await t,this.processing=!0,()=>{this.processing=!1,this.tryProcess()}}destroy(){this.queue.forEach((e=>{let{resolve:t}=e;t()})),this.queue=[],this.processing=!1}tryProcess(){if(this.processing)return;const e=this.queue.shift();e&&e.resolve()}}function eN(){let e,t;const i=new Promise(((i,o)=>{e=i,t=o}));if(!e||!t)throw Error("Broken Implement of Promise");return{promise:i,resolve:e,reject:t}}const tN=e=>{const t={};return e.split(";").forEach((e=>{const[i,o]=e.split("=");i&&o&&(t[i]=o)})),t["sprop-stereo"]=1,t.stereo=1,Object.keys(t).map((e=>"".concat(e,"=").concat(t[e]))).join(";")},iN={[QG.ICE_FAILED]:sm.ICE_FAILED,[QG.DC_ERROR]:sm.ICE_FAILED,[QG.DC_CLOSE]:sm.ICE_FAILED,[QG.NODE_CHANGE]:sm.NODE_CHANGE,[QG.NOTIFY_RECONNECT]:sm.NOTIFY_RECONNECT,[QG.JOIN_TIMEOUT]:sm.JOIN_TIMEOUT};class oN extends Ig{constructor(e){super(),Hu(this,"_connectionManager",void 0),Hu(this,"_dataChannelSignal",void 0),Hu(this,"_state",void 0),Hu(this,"_connectionLostTimer",void 0),Hu(this,"_isReconnecting",!1),Hu(this,"logger",void 0),this._ctx=e,this.logger=new xv("SignalingManager",1,e.id),this.logger.info("constructor","invoke"),this._connectionManager=new BG(e),this._addConnectorHandler()}connect(){return this.isConnected()?Promise.resolve():new Promise(((e,t)=>{this._connectionManager.once("connected",(()=>e())),this._connectionManager.once("disconnected",t),this._connectionManager.startup()}))}reconnect(e,t){this._connectionManager.reconnect(e,t)}sendSignaling(e,t,i,o){if(!this._dataChannelSignal)throw new LS(RS.NOT_CONNECTED_YET,"signaling channel is not connected");return this._dataChannelSignal.sendSignaling(e,t,i,o)}sendP2PMessage(e,t){if(!this._dataChannelSignal)throw new LS(RS.NOT_CONNECTED_YET,"signaling channel is not connected");return this._dataChannelSignal.sendP2PMessage(e,t)}destroy(){var e,t;this.logger.info("destroy()"),this._clearConnectionLostTimer(),this._connectionManager.shotdown(),null===(e=this._ctx.handler)||void 0===e||e.destroy(),this._ctx.handler=void 0,null===(t=this._dataChannelSignal)||void 0===t||t.destroy(),this._state&&this._setState(om.CONNECTION_STATE_DISCONNECTED),this.removeAllListeners()}isConnected(){return this._state===om.CONNECTION_STATE_CONNECTED||this._state===om.CONNECTION_STATE_RECONNECTED}isReconnecting(){return this._state===om.CONNECTION_STATE_CONNECTING||this._state===om.CONNECTION_STATE_RECONNECTING}_setState(e,t){if(this._state===e)return;this._state=e;const i={state:e};t&&(i.reason=iN[t]||sm.ICE_FAILED),this.safeEmit(Vg.ON_CONNECTION_STATE_CHANGE,i)}_addConnectorHandler(){var e=this;this._connectionManager.on("connected",(e=>{var t,i,o;this.logger.info("connectStateChange","connected"),this._clearConnectionLostTimer(),null===(t=this._dataChannelSignal)||void 0===t||t.destroy(),this._ctx.peerConnection=e.pc,this._ctx.handler=(i=this._ctx,o=e.pc,i.enableFallbackHandler?new Ux(i,o):i.enableStandardHandler?new Bx(i,o):wv?new Ox(i,o):new Jx(i,o)),this._dataChannelSignal=e.signaling,this._addSignalEventHandler(),this._setState(this._isReconnecting?om.CONNECTION_STATE_RECONNECTED:om.CONNECTION_STATE_CONNECTED)})),this._connectionManager.on("disconnected",(e=>{this._clearConnectionLostTimer(),this._setState(om.CONNECTION_STATE_DISCONNECTED),this.logger.error("connectStateChange","disconnected. %o",e.message),this._isReconnecting&&this.safeEmit(Vg.ON_RECONNECT_FAILED)})),this._connectionManager.on("connecting",(()=>{this._isReconnecting=!1,this._ctx.handler=void 0,this._setState(om.CONNECTION_STATE_CONNECTING),this.logger.info("connectStateChange","connecting")})),this._connectionManager.on("reconnecting",(e=>{this._setState(om.CONNECTION_STATE_DISCONNECTED,e),this._connectionLostTimer||(this._connectionLostTimer=setTimeout((()=>{this.safeEmit(Vg.ON_CONNECTION_STATE_CHANGE,{state:om.CONNECTION_STATE_LOST})}),1e4)),this._isReconnecting=!0,this._ctx.handler=void 0,this._setState(om.CONNECTION_STATE_RECONNECTING,e),this.logger.warn("connectStateChange","reconnecting")})),this._connectionManager.on("connectWidthTcp",(()=>{this.safeEmit(Vg.CONNECT_WITH_TCP)})),["__onGetIceConfigHook","__onIceConnectSuccessHook","__onConnectSuccessHook","__startIceConnect_hook"].forEach((t=>{this._connectionManager.on(t,(function(){for(var i=arguments.length,o=new Array(i),s=0;s<i;s++)o[s]=arguments[s];return e.emit(t,...o)}))})),this._connectionManager.on("joinRoomFailedPrivateCallback",(e=>{this.safeEmit(Vg.JOIN_ROOM_FAILED_PRIVATE_CALLBACK,e)}))}_clearConnectionLostTimer(){this._connectionLostTimer&&(clearTimeout(this._connectionLostTimer),delete this._connectionLostTimer)}_addSignalEventHandler(){var e,t;[Wg.ON_ADD_STREAM,Wg.ON_ADD_STREAM_LIST,Wg.ON_REMOVE_STREAM,Wg.ON_REMOVE_STREAM_LIST,Wg.USER_CONNECTION,Wg.USER_CONNECTION_LIST,Wg.USER_DISCONNECTION,Wg.USER_DISCONNECTION_LIST,Wg.ON_UPDATE_STREAM_ATTRIBUTES,Wg.ON_UPDATE_ROOM_ATTRIBUTES,Wg.ON_PUSH_TRACK,Wg.ON_REMOVE_TRACK,Wg.ON_CUSTOM_MESSAGE,Wg.USER_MESSAGE_RECEIVED_OUTSIDE_ROOM,Wg.USER_BINARY_MESSAGE_RECEIVED_OUTSIDE_ROOM,Wg.USER_MESSAGE_RECEIVED,Wg.USER_BINARY_MESSAGE_RECEIVED,Wg.POST_PROCESSING_MESSAGE,Wg.ON_USER_TOKEN_WILL_EXPIRE,Wg.ON_TOKEN_PUBLISH_PRIVILEGE_WILL_EXPIRE,Wg.ON_TOKEN_PUBLISH_PRIVILEGE_DID_EXPIRED,Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_WILL_EXPIRE,Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_DID_EXPIRED,Wg.STREAM_CONTROL_MESSAGE,Wg.ENGINE_CONTROL_MESSAGE,Wg.ON_UPDATE_USER_ATTRIBUTES,Wg.ON_SPEAKER_CHANGE,Wg.ON_STREAM_FAILED,Wg.ON_FORWARD_DST_ROOM_USER_KICK,Wg.ON_STREAM_PULL_STATE_CHANGED,Wg.ON_STREAM_PUSHED_BY_OTHER,Gg.RSCP,Gg.RTT,Gg.SSC].forEach((e=>{var t;null===(t=this._dataChannelSignal)||void 0===t||t.on(e,(t=>{this.safeEmit(e,t)}))})),null===(e=this._dataChannelSignal)||void 0===e||e.on(Wg.NODE_CHANGE,(e=>{this._connectionManager.reconnectByNodeChange(e)})),null===(t=this._dataChannelSignal)||void 0===t||t.on(Wg.ON_NOTIFY_RECONNECT,(()=>{this._connectionManager.reconnect(QG.NOTIFY_RECONNECT)}))}}const sN=new xv("Locker",2);let rN=1;class nN{constructor(e){Hu(this,"lockingPromise",Promise.resolve()),Hu(this,"locks",0),Hu(this,"name",""),Hu(this,"lockId",void 0),Hu(this,"closeReason",void 0),this.lockId=rN++,e&&(this.name=e),sN.info("lock-".concat(this.name,"-").concat(this.lockId),"is created.")}get isLocked(){return this.locks>0}lock(){let e;this.locks+=1,sN.info("lock-".concat(this.name,"-").concat(this.lockId),"locked, current queue ".concat(this.locks,"."));const t=new Promise((t=>{e=()=>{this.locks-=1,sN.info("lock-".concat(this.name,"-").concat(this.lockId),"unlocked, current queue ".concat(this.locks,".")),t()}})),i=this.lockingPromise.then((()=>e));return this.lockingPromise=this.lockingPromise.then((()=>t)),i}}var aN=(e=>(e.NORMAL_USER="normalUser",e.SILENT_USER="silentUser",e))(aN||{});const dN=[{maxLayers:3,totalPixels:2073600},{maxLayers:3,totalPixels:921600},{maxLayers:3,totalPixels:518400},{maxLayers:2,totalPixels:230400},{maxLayers:2,totalPixels:129600},{maxLayers:1,totalPixels:57600},{maxLayers:1,totalPixels:0}];function cN(e,t,i){var o;const s=e?null===(o=i.find((t=>t.rid===e)))||void 0===o?void 0:o.maxkbps:i[0].maxkbps;return Math.min(null!=s?s:Number.POSITIVE_INFINITY,t)}const lN=(e,t)=>{var i,o,s,r;let n=0,a=-1;const{videoDescriptions:d,subVideoDescriptions:c}=(null==t?void 0:t.attributes)||{},l=Array.isArray(c)?c:d;let u=-1;const m=e.width*e.height;for(let _=0;_<(null==l?void 0:l.length);_++){var h,p;if(m>=(null===(h=l[_])||void 0===h?void 0:h.width)*(null===(p=l[_])||void 0===p?void 0:p.height)){u=_;break}}let b=l[0];if(-1===u)u=l.length-1,b=l[u];else if(0!==u){const e=l[u-1].width*l[u-1].height,t=(e-m)/(e-l[u].width*l[u].height);b=t<.1?l[u-1]:l[u],u=t<.1?u-1:u}return a=null!==(i=null===(o=b)||void 0===o?void 0:o.sub_index)&&void 0!==i?i:-1,n=null!==(s=null===(r=b)||void 0===r?void 0:r.video_index)&&void 0!==s?s:u,{spatialLayer:n,spatialSubLayer:a}},uN=e=>({width:iT(e.width),height:iT(e.height),frameRate:iT(e.frameRate),maxKbps:e.maxKbps}),mN=e=>{let{width:t,height:i}=e;return iT(t)*iT(i)},hN=(e,t)=>{const i=iT(e.width)/iT(t.width)||1,o=iT(e.height)/iT(t.height)||1;Math.floor(i)===i&&Math.floor(o)===o||tT("setLocalSimulcastMode: The resolution setting needs to be an integer multiple")},pN=["preferCodecName"];class bN{constructor(e){Hu(this,"_captureDeviceId",void 0),Hu(this,"_contentHint",void 0),Hu(this,"_videoCaptureConf",Ju({},kZ)),Hu(this,"_mainPreferCodec",void 0),Hu(this,"_screenPreferCodec",void 0),Hu(this,"_remoteVideoConfig",new Map),Hu(this,"_remoteSimulcastStreamType",new Map),Hu(this,"_simulcastMode",Lm.VIDEO_ONLY_ONE),Hu(this,"_highVideoEncodeConf",uN(kZ)),Hu(this,"_midVideoEncodeConf",void 0),Hu(this,"_lowVideoEncodeConf",void 0),Hu(this,"_screenEncodeConfig",xZ),Hu(this,"_invalidVideoEncodeConf",void 0),Hu(this,"activeSimStreams",[]),Hu(this,"_logger",void 0),Hu(this,"_apiVersion",void 0),this._ctx=e,this._logger=new xv("EngineVideoProfile",1,e.id)}setCaptureDeviceId(e){this._captureDeviceId=e}setCaptureConfig(e){this._videoCaptureConf=Ju(Ju({},this._videoCaptureConf),e)}getCaptureConfig(e){e=e||this._captureDeviceId;const t=Ju({},this._videoCaptureConf);return"user"===e||"environment"===e||"left"===e||"right"===e?(delete t.deviceId,t.facingMode=e):e&&(!Av||$v?t.deviceId={exact:e}:delete t.deviceId),t}getContentHint(){return this._contentHint}getPreferCodec(e){return e?this._screenPreferCodec:this._mainPreferCodec}setRemoteUserVideoConfig(e,t){"object"==typeof t?this._remoteVideoConfig.set(e,t):this._remoteSimulcastStreamType.set(e,t)}getSubLayer(e,t){const i=this._remoteSimulcastStreamType.get(e.userId),o=this._remoteVideoConfig.get(e.userId);if(i){var s,r,n,a,d,c;const{videoDescriptions:t,subVideoDescriptions:o}=e.attributes||{},l=Array.isArray(o)?o:t;let u;return 1===l.length?u=0:2===l.length?u=i===Cm.VIDEO_STREAM_HIGH?0:1:l.length>=3&&(u={[Cm.VIDEO_STREAM_HIGH]:0,[Cm.VIDEO_STREAM_MID]:1,[Cm.VIDEO_STREAM_LOW]:2}[i]),{spatialLayer:null!==(s=null!==(r=u&&(null===(n=l[u])||void 0===n?void 0:n.video_index))&&void 0!==r?r:u)&&void 0!==s?s:0,spatialSubLayer:null!==(a=null!==(d=u&&(null===(c=l[u])||void 0===c?void 0:c.sub_index))&&void 0!==d?d:u)&&void 0!==a?a:-1}}return o?lN(o,e):t?lN(t,e):void 0}getSimulcastMode(){return this._simulcastMode}async setSimulcastMode(e,t){if(wv||zv||14===(null==uS?void 0:uS[0]))throw new LS(RS.NOT_SUPPORTED,"Simulcast is not supported");if(this._simulcastMode!==e){if(null!=t&&t.hasPublished){var i,o;if(null!==(i=t.localStream)&&void 0!==i&&i.videoHasPublish||null!==(o=t.localStream)&&void 0!==o&&o.audioHasPublish)throw new LS(RS.SET_SIMULCAST_FAILED,"Cannot change simulcast mode after publishing the video streams");this._logger.print("setSimulcastMode()","change simulcast mode and unpublish."),await t.unpublish()}this._simulcastMode=e,e!==Lm.VIDEO_ONLY_ONE&&this._autoGenerateSubVideoEncodeConfig()}}closeSimulcast(){this._simulcastMode=Lm.VIDEO_ONLY_ONE}async setVideoEncodeConfigPolyfill(e){if(Array.isArray(e)){JS(e);const[t,...i]=e;this.setVideoEncodeConfig(t),await this.setSubVideoEncodeConfig(Dm(i).call(i))}else this.setVideoEncodeConfig(e)}setVideoEncodeConfig(e){JS([e]);const t=this._midVideoEncodeConf||this._lowVideoEncodeConf;t&&mN(t)>=mN(e)?(this._logger.warn("setVideoEncodeConfig","smaller then substream"),this._invalidVideoEncodeConf=uN(e),e=t):delete this._invalidVideoEncodeConf;const i=Ju({},e),{preferCodecName:o}=i,s=Cy(i,pN);NS(s),this._logger.print("setVideoEncodeConfig","update encode config",e),this._highVideoEncodeConf=uN(e),this._contentHint=e.contentHint,this._mainPreferCodec=o,this._logger.print("setVideoEncodeConfig","update capture config",s),this._videoCaptureConf=s}async setSubVideoEncodeConfig(e,t,i){if(this._logger.print("setSubVideoEncodeConfig","%o, published=%s",e,null==t?void 0:t.hasPublished),e&&e.length>0){JS(e),vg(e).call(e,((e,t)=>mN(e)-mN(t)));const r=this._invalidVideoEncodeConf||this._highVideoEncodeConf,n=e[e.length-1];if(mN(n)>=mN(r))throw new LS(RS.SET_SIMULCAST_FAILED,"The resolution cannot exceed the mainstream");if(null!=t&&t.hasPublished&&e.length!==this._getSubLayers().length){var o,s;if(null!==(o=t.localStream)&&void 0!==o&&o.videoHasPublish||null!==(s=t.localStream)&&void 0!==s&&s.audioHasPublish)throw new LS(RS.SET_SIMULCAST_FAILED,"Cannot change the number of substreams after publishing the video streams");await t.unpublish()}e.length>2&&(vv(this._ctx.id,"simulcast_over_limit","setLocalSimulcastMode: You can set parameters for up to 2 streams"),tT("setLocalSimulcastMode: You can set parameters for up to 2 streams"));const[a,d]=e;a&&(hN(r,a),this._lowVideoEncodeConf=uN(a)),d&&(hN(r,d),this._midVideoEncodeConf=uN(d)),this._invalidVideoEncodeConf&&(this.setVideoEncodeConfig(this._invalidVideoEncodeConf),await(null==i?void 0:i.updateVideoCaptureConfig(this._ctx.videoProfile.getCaptureConfig())))}else this._autoGenerateSubVideoEncodeConfig()}genVideoDescriptions(e){var t,i;const o=[];let s=[];const r=[],n=[];let{width:a,height:d,frameRate:c,maxKbps:l}=e.videoEncodeConfig[0];a=iT(a),d=iT(d);const u=null===(t=e.videoTrack)||void 0===t?void 0:t.preprocessingTrack,{width:m,height:h,frameRate:p}=null!==(i=null==u?void 0:u.getSettings())&&void 0!==i?i:{};m&&(a=Math.floor(m)),h&&(d=Math.floor(h)),p&&(c=Math.floor(p)),("number"!=typeof c||Number.isNaN(c))&&(c=30),o.push({width:a,height:d,framerate:c,maxkbps:l,rid:"0"}),r.unshift({maxBitrate:1e3*l,rid:"0",maxFramerate:c});const{serverConfig:b}=this._ctx;if(!(e.isScreen||this._simulcastMode===Lm.VIDEO_ONLY_ONE||wv&&"VP8"!==(null==b?void 0:b.videoCodec))){const e=((e,t)=>{const i=dN.findIndex((i=>e*t>=i.totalPixels)),o=e*t;if(0===i)return dN[i].maxLayers;const s=dN[i-1].totalPixels;return(s-o)/(s-dN[i].totalPixels)<.1?dN[i-1].maxLayers:dN[i].maxLayers})(a,d);if(e>1){const t=this._getSubVideoEncodeConfig(e,{width:a,height:d});this._logger.info("simulcast() ","simulcastLayers: %o",t),n.push(!0),t.forEach(((e,t)=>{const i={maxBitrate:1e3*e.maxkbps,scaleResolutionDownBy:e.scaleResolutionDownBy,rid:"".concat(t+1),maxFramerate:e.frameRate};r.unshift(i),o.push({width:e.width,height:e.height,framerate:e.frameRate,maxkbps:e.maxkbps,rid:"".concat(t+1)}),n.push(!0)})),null!=b&&b.simulcastOnDemand&&(s=o.map(((e,t)=>Ju(Ju({},e),{},{video_index:t,sub_index:t}))))}}return null!=b&&b.e2eFeedback&&(s=o.map(((e,t)=>Ju(Ju({},e),{},{video_index:t,sub_index:t})))),{videoDescriptions:o,subVideoDescriptions:s,sendEncodings:r,activeSimulcastStreams:n}}getVideoEncodeConfig(){return[this._highVideoEncodeConf,this._midVideoEncodeConf,this._lowVideoEncodeConf].filter((e=>e))}setScreenEncodeConfig(e){this._screenEncodeConfig=e}getScreenEncodeConfig(){return this._screenEncodeConfig}checkSimulcastApiVersion(e){if(this._apiVersion){if(this._apiVersion!==e){const e="mixing old and new apis, please use ".concat("new"===this._apiVersion?"setLocalSimulcastMode/setRemoteSimulcastStreamType":"enableSimulcastMode/setRemoteVideoConfig"," instead.");throw vv(this._ctx.id,"mixingOldAndNewApis",e),new LS(RS.MIXING_OLD_AND_NEW_APIS,e)}}else this._apiVersion=e}destroy(){this._videoCaptureConf=kZ,this._highVideoEncodeConf=uN(kZ),delete this._invalidVideoEncodeConf,this._remoteVideoConfig.clear(),this._remoteSimulcastStreamType.clear()}_autoGenerateSubVideoEncodeConfig(){this._logger.print("_autoGenerateSubVideoEncodeConfig()","generate low stream.");const e=this._highVideoEncodeConf,t=iT(e.width),i=iT(e.height),o=Math.min(t,i)/90;this._lowVideoEncodeConf={width:Math.floor(t/o),height:Math.floor(i/o),maxKbps:100,frameRate:10}}_getSubLayers(){const e=[];return this._midVideoEncodeConf&&e.push(this._midVideoEncodeConf),this._lowVideoEncodeConf&&e.push(this._lowVideoEncodeConf),e}_getSubVideoEncodeConfig(e,t){return this._getSubLayers().slice(1-e).map((e=>{if(e.width>e.height&&t.width<t.height||e.width<e.height&&t.width>t.height){const t=e.width;e.width=e.height,e.height=t}const i=iT(e.width),o=iT(e.height),s=Math.max(t.width/i,t.height/o);return{width:Math.floor(t.width/s),height:Math.floor(t.height/s),scaleResolutionDownBy:s,frameRate:iT(e.frameRate)||15,maxkbps:e.maxKbps||600}}))}__autoResetVideoEncoderConfig(e){const t=PZ(this.getVideoEncodeConfig(),e);t&&(this.setVideoEncodeConfigPolyfill(t),this._logger.print("autoResetVideoEncoderConfig() result",JSON.stringify(t)),vv(this._ctx.id,"autoResetVideoEncoderConfig",JSON.stringify(t)))}}class _N{constructor(e){Hu(this,"_sendTimes",[]),Hu(this,"_bufferSizeLimit",void 0),Hu(this,"_totalSizeLimitPerSecond",void 0),Hu(this,"_limitModeInterval",void 0),Hu(this,"_limitModeQPS",void 0),Hu(this,"_interval",void 0),Hu(this,"_qps",void 0),this.setLimitMode(e)}setLimitMode(e){e===kg.LIMIT_MODE?(this._bufferSizeLimit=1,this._totalSizeLimitPerSecond=30720,this._limitModeInterval=1e3,this._limitModeQPS=60):(this._bufferSizeLimit=64,delete this._totalSizeLimitPerSecond,delete this._limitModeInterval,delete this._limitModeQPS)}setQPS(e,t){this._interval=e,this._qps=t}check(e){var t,i;const o=Date.now(),s=function(e){var t,i;let o,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:64;if(!e||0===(null==e?void 0:e.byteLength))throw new LS(RS.INVALID_PARAMS,"The message cannot be empty");if(e instanceof ArrayBuffer)o=e;else{if("string"!=typeof e)throw new LS(RS.INVALID_PARAMS,"The message must be string or ArrayBuffer");o=Jf.str2ab(e)}if((null===(t=o)||void 0===t?void 0:t.byteLength)>1024*s)throw new LS(RS.INVALID_PARAMS,"The message length must be less than ".concat(s,"KB"));return null!==(i=o.byteLength)&&void 0!==i?i:0}(e,this._bufferSizeLimit);if("number"==typeof this._totalSizeLimitPerSecond){if(this._sendTimes.reduce(((e,t)=>o-t.ts<1e3?e+t.size:e),0)+s>this._totalSizeLimitPerSecond)throw new LS(RS.USER_MESSAGE_EXCEED_QPS,"user message exceed total size(".concat(this._totalSizeLimitPerSecond,")"))}const r=null!==(t=this._limitModeInterval)&&void 0!==t?t:this._interval,n=null!==(i=this._limitModeQPS)&&void 0!==i?i:this._qps;if("number"==typeof r&&"number"==typeof n)if(this._sendTimes.length<n)this._sendTimes.push({ts:o,size:s});else{if(o-this._sendTimes[0].ts<r)throw new LS(RS.USER_MESSAGE_EXCEED_QPS,"user message exceed qps(".concat(n,")"));this._sendTimes.splice(0,1),this._sendTimes.push({ts:o,size:s})}}}var yN=(e=>(e[e.CAPTURE=0]="CAPTURE",e[e.PRE_PROCESSING=1]="PRE_PROCESSING",e[e.ENCODE=2]="ENCODE",e[e.TRANSFER=3]="TRANSFER",e[e.POST_PROCESSING=4]="POST_PROCESSING",e[e.DECODE=5]="DECODE",e[e.RENDERING=6]="RENDERING",e))(yN||{}),vN=(e=>(e[e.STREAM_INDEX_MAIN=0]="STREAM_INDEX_MAIN",e[e.STREAM_INDEX_SCREEN=1]="STREAM_INDEX_SCREEN",e))(vN||{});class SN{constructor(e){Hu(this,"_plugins",new Map),this.id=e}register(e){const t=this._plugins.get(e.type)||[];if(t.findIndex((t=>t.name===e.name))>-1)throw new Error("Failed to register ".concat(e.name,": name is repeated."));t.push(e),this._plugins.set(e.type,t)}getPluginsByType(e){return this._plugins.get(e)||[]}getPluginByName(e,t){return(this._plugins.get(e)||[]).find((e=>e.name===t))}async getPreProcessingTrack(e){const t=this._plugins.get(1)||[];let i=e.mediaTrack;for(const o of t)i=await o.effect(e,i);return i}destroy(){this._plugins.forEach((e=>{e.forEach((e=>e.destroy()))})),this._plugins.clear()}}const ZN="IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWZ1bmN0aW9uIHIodCl7aWYodC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXQuZGVmYXVsdDtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSl7dmFyIHI9ZnVuY3Rpb24gdCgpe2lmKHRoaXMgaW5zdGFuY2VvZiB0KXt2YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGFyZ3VtZW50cyksbmV3KEZ1bmN0aW9uLmJpbmQuYXBwbHkoZSxyKSl9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZX1lbHNlIHI9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsZSxuLmdldD9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W2VdfX0pfSkpLHJ9dmFyIG49e2V4cG9ydHM6e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09PU1hdGgmJnR9LG89aSgib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxpKCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxpKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGkoIm9iamVjdCI9PXR5cGVvZiB0JiZ0KXx8aSgib2JqZWN0Ij09dHlwZW9mIHQmJnQpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKGUpe3JldHVybiEwfX0sYT0hcygoZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbigpe30uYmluZCgpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0Lmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKX0pKSxjPWEsdT1GdW5jdGlvbi5wcm90b3R5cGUsbD11LmFwcGx5LGg9dS5jYWxsLGQ9Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmFwcGx5fHwoYz9oLmJpbmQobCk6ZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseShsLGFyZ3VtZW50cyl9KSxmPWEscD1GdW5jdGlvbi5wcm90b3R5cGUsXz1wLmNhbGwsZz1mJiZwLmJpbmQuYmluZChfLF8pLG09Zj9nOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBfLmFwcGx5KHQsYXJndW1lbnRzKX19LHk9bSx2PXkoe30udG9TdHJpbmcpLGI9eSgiIi5zbGljZSksdz1mdW5jdGlvbih0KXtyZXR1cm4gYih2KHQpLDgsLTEpfSxTPXcsaz1tLE89ZnVuY3Rpb24odCl7aWYoIkZ1bmN0aW9uIj09PVModCkpcmV0dXJuIGsodCl9LEU9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsLHg9dm9pZCAwPT09RSYmdm9pZCAwIT09RT9mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdHx8dD09PUV9OmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fSxBPXt9LEM9IXMoKGZ1bmN0aW9uKCl7cmV0dXJuIDchPT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSksST1hLFQ9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsQj1JP1QuYmluZChUKTpmdW5jdGlvbigpe3JldHVybiBULmFwcGx5KFQsYXJndW1lbnRzKX0sTD17fSxSPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLE49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcix6PU4mJiFSLmNhbGwoezE6Mn0sMSk7TC5mPXo/ZnVuY3Rpb24odCl7dmFyIGU9Tih0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpSO3ZhciBELFAsTT1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX0sRj1zLFU9dyxqPU9iamVjdCxIPW0oIiIuc3BsaXQpLEo9RigoZnVuY3Rpb24oKXtyZXR1cm4haigieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVybiJTdHJpbmciPT09VSh0KT9IKHQsIiIpOmoodCl9OmosSz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0sVz1LLFo9VHlwZUVycm9yLEc9ZnVuY3Rpb24odCl7aWYoVyh0KSl0aHJvdyBuZXcgWigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH0sVj1KLFg9RyxZPWZ1bmN0aW9uKHQpe3JldHVybiBWKFgodCkpfSwkPXgscT1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6JCh0KX0sUT17fSx0dD1RLGV0PW8scnQ9eCxudD1mdW5jdGlvbih0KXtyZXR1cm4gcnQodCk/dDp2b2lkIDB9LGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9udCh0dFt0XSl8fG50KGV0W3RdKTp0dFt0XSYmdHRbdF1bZV18fGV0W3RdJiZldFt0XVtlXX0sb3Q9bSh7fS5pc1Byb3RvdHlwZU9mKSxzdD1vLm5hdmlnYXRvcixhdD1zdCYmc3QudXNlckFnZW50LGN0PW8sdXQ9YXQ/U3RyaW5nKGF0KToiIixsdD1jdC5wcm9jZXNzLGh0PWN0LkRlbm8sZHQ9bHQmJmx0LnZlcnNpb25zfHxodCYmaHQudmVyc2lvbixmdD1kdCYmZHQudjg7ZnQmJihQPShEPWZ0LnNwbGl0KCIuIikpWzBdPjAmJkRbMF08ND8xOisoRFswXStEWzFdKSksIVAmJnV0JiYoIShEPXV0Lm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8RFsxXT49NzQpJiYoRD11dC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKFA9K0RbMV0pO3ZhciBwdD1QLF90PXB0LGd0PXMsbXQ9by5TdHJpbmcseXQ9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhZ3QoKGZ1bmN0aW9uKCl7dmFyIHQ9U3ltYm9sKCJzeW1ib2wgZGV0ZWN0aW9uIik7cmV0dXJuIW10KHQpfHwhKE9iamVjdCh0KWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZfdCYmX3Q8NDF9KSksdnQ9eXQmJiFTeW1ib2wuc2hhbSYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IsYnQ9aXQsd3Q9eCxTdD1vdCxrdD1PYmplY3QsT3Q9dnQ/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXt2YXIgZT1idCgiU3ltYm9sIik7cmV0dXJuIHd0KGUpJiZTdChlLnByb3RvdHlwZSxrdCh0KSl9LEV0PVN0cmluZyx4dD1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIEV0KHQpfWNhdGNoKGUpe3JldHVybiJPYmplY3QifX0sQXQ9eCxDdD14dCxJdD1UeXBlRXJyb3IsVHQ9ZnVuY3Rpb24odCl7aWYoQXQodCkpcmV0dXJuIHQ7dGhyb3cgbmV3IEl0KEN0KHQpKyIgaXMgbm90IGEgZnVuY3Rpb24iKX0sQnQ9VHQsTHQ9SyxSdD1CLE50PXgsenQ9cSxEdD1UeXBlRXJyb3IsUHQ9e2V4cG9ydHM6e319LE10PW8sRnQ9T2JqZWN0LmRlZmluZVByb3BlcnR5LFV0PW8sanQ9ZnVuY3Rpb24odCxlKXt0cnl7RnQoTXQsdCx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KX1jYXRjaChyKXtNdFt0XT1lfXJldHVybiBlfSxIdD0iX19jb3JlLWpzX3NoYXJlZF9fIixKdD1QdC5leHBvcnRzPVV0W0h0XXx8anQoSHQse30pOyhKdC52ZXJzaW9uc3x8KEp0LnZlcnNpb25zPVtdKSkucHVzaCh7dmVyc2lvbjoiMy4zOS4wIixtb2RlOiJwdXJlIixjb3B5cmlnaHQ6IsKpIDIwMTQtMjAyNCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSIsbGljZW5zZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zOS4wL0xJQ0VOU0UiLHNvdXJjZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMifSk7dmFyIEt0PVB0LmV4cG9ydHMsV3Q9S3QsWnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gV3RbdF18fChXdFt0XT1lfHx7fSl9LEd0PUcsVnQ9T2JqZWN0LFh0PWZ1bmN0aW9uKHQpe3JldHVybiBWdChHdCh0KSl9LFl0PVh0LCR0PW0oe30uaGFzT3duUHJvcGVydHkpLHF0PU9iamVjdC5oYXNPd258fGZ1bmN0aW9uKHQsZSl7cmV0dXJuICR0KFl0KHQpLGUpfSxRdD1tLHRlPTAsZWU9TWF0aC5yYW5kb20oKSxyZT1RdCgxLi50b1N0cmluZyksbmU9ZnVuY3Rpb24odCl7cmV0dXJuIlN5bWJvbCgiKyh2b2lkIDA9PT10PyIiOnQpKyIpXyIrcmUoKyt0ZStlZSwzNil9LGllPVp0LG9lPXF0LHNlPW5lLGFlPXl0LGNlPXZ0LHVlPW8uU3ltYm9sLGxlPWllKCJ3a3MiKSxoZT1jZT91ZS5mb3J8fHVlOnVlJiZ1ZS53aXRob3V0U2V0dGVyfHxzZSxkZT1mdW5jdGlvbih0KXtyZXR1cm4gb2UobGUsdCl8fChsZVt0XT1hZSYmb2UodWUsdCk/dWVbdF06aGUoIlN5bWJvbC4iK3QpKSxsZVt0XX0sZmU9QixwZT1xLF9lPU90LGdlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFtlXTtyZXR1cm4gTHQocik/dm9pZCAwOkJ0KHIpfSxtZT1mdW5jdGlvbih0LGUpe3ZhciByLG47aWYoInN0cmluZyI9PT1lJiZOdChyPXQudG9TdHJpbmcpJiYhenQobj1SdChyLHQpKSlyZXR1cm4gbjtpZihOdChyPXQudmFsdWVPZikmJiF6dChuPVJ0KHIsdCkpKXJldHVybiBuO2lmKCJzdHJpbmciIT09ZSYmTnQocj10LnRvU3RyaW5nKSYmIXp0KG49UnQocix0KSkpcmV0dXJuIG47dGhyb3cgbmV3IER0KCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX0seWU9VHlwZUVycm9yLHZlPWRlKCJ0b1ByaW1pdGl2ZSIpLGJlPWZ1bmN0aW9uKHQsZSl7aWYoIXBlKHQpfHxfZSh0KSlyZXR1cm4gdDt2YXIgcixuPWdlKHQsdmUpO2lmKG4pe2lmKHZvaWQgMD09PWUmJihlPSJkZWZhdWx0Iikscj1mZShuLHQsZSksIXBlKHIpfHxfZShyKSlyZXR1cm4gcjt0aHJvdyBuZXcgeWUoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT1lJiYoZT0ibnVtYmVyIiksbWUodCxlKX0sd2U9T3QsU2U9ZnVuY3Rpb24odCl7dmFyIGU9YmUodCwic3RyaW5nIik7cmV0dXJuIHdlKGUpP2U6ZSsiIn0sa2U9cSxPZT1vLmRvY3VtZW50LEVlPWtlKE9lKSYma2UoT2UuY3JlYXRlRWxlbWVudCkseGU9ZnVuY3Rpb24odCl7cmV0dXJuIEVlP09lLmNyZWF0ZUVsZW1lbnQodCk6e319LEFlPXhlLENlPSFDJiYhcygoZnVuY3Rpb24oKXtyZXR1cm4gNyE9PU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBZSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpLEllPUMsVGU9QixCZT1MLExlPU0sUmU9WSxOZT1TZSx6ZT1xdCxEZT1DZSxQZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO0EuZj1JZT9QZTpmdW5jdGlvbih0LGUpe2lmKHQ9UmUodCksZT1OZShlKSxEZSl0cnl7cmV0dXJuIFBlKHQsZSl9Y2F0Y2gocil7fWlmKHplKHQsZSkpcmV0dXJuIExlKCFUZShCZS5mLHQsZSksdFtlXSl9O3ZhciBNZT1zLEZlPXgsVWU9LyN8XC5wcm90b3R5cGVcLi8samU9ZnVuY3Rpb24odCxlKXt2YXIgcj1KZVtIZSh0KV07cmV0dXJuIHI9PT1XZXx8ciE9PUtlJiYoRmUoZSk/TWUoZSk6ISFlKX0sSGU9amUubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCkucmVwbGFjZShVZSwiLiIpLnRvTG93ZXJDYXNlKCl9LEplPWplLmRhdGE9e30sS2U9amUuTkFUSVZFPSJOIixXZT1qZS5QT0xZRklMTD0iUCIsWmU9amUsR2U9VHQsVmU9YSxYZT1PKE8uYmluZCksWWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gR2UodCksdm9pZCAwPT09ZT90OlZlP1hlKHQsZSk6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fSwkZT17fSxxZT1DJiZzKChmdW5jdGlvbigpe3JldHVybiA0MiE9PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSgoZnVuY3Rpb24oKXt9KSwicHJvdG90eXBlIix7dmFsdWU6NDIsd3JpdGFibGU6ITF9KS5wcm90b3R5cGV9KSksUWU9cSx0cj1TdHJpbmcsZXI9VHlwZUVycm9yLHJyPWZ1bmN0aW9uKHQpe2lmKFFlKHQpKXJldHVybiB0O3Rocm93IG5ldyBlcih0cih0KSsiIGlzIG5vdCBhbiBvYmplY3QiKX0sbnI9Qyxpcj1DZSxvcj1xZSxzcj1ycixhcj1TZSxjcj1UeXBlRXJyb3IsdXI9T2JqZWN0LmRlZmluZVByb3BlcnR5LGxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaHI9ImVudW1lcmFibGUiLGRyPSJjb25maWd1cmFibGUiLGZyPSJ3cml0YWJsZSI7JGUuZj1ucj9vcj9mdW5jdGlvbih0LGUscil7aWYoc3IodCksZT1hcihlKSxzcihyKSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmInByb3RvdHlwZSI9PT1lJiYidmFsdWUiaW4gciYmZnIgaW4gciYmIXJbZnJdKXt2YXIgbj1scih0LGUpO24mJm5bZnJdJiYodFtlXT1yLnZhbHVlLHI9e2NvbmZpZ3VyYWJsZTpkciBpbiByP3JbZHJdOm5bZHJdLGVudW1lcmFibGU6aHIgaW4gcj9yW2hyXTpuW2hyXSx3cml0YWJsZTohMX0pfXJldHVybiB1cih0LGUscil9OnVyOmZ1bmN0aW9uKHQsZSxyKXtpZihzcih0KSxlPWFyKGUpLHNyKHIpLGlyKXRyeXtyZXR1cm4gdXIodCxlLHIpfWNhdGNoKG4pe31pZigiZ2V0ImluIHJ8fCJzZXQiaW4gcil0aHJvdyBuZXcgY3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHImJih0W2VdPXIudmFsdWUpLHR9O3ZhciBwcj0kZSxfcj1NLGdyPUM/ZnVuY3Rpb24odCxlLHIpe3JldHVybiBwci5mKHQsZSxfcigxLHIpKX06ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0W2VdPXIsdH0sbXI9byx5cj1kLHZyPU8sYnI9eCx3cj1BLmYsU3I9WmUsa3I9USxPcj1ZZSxFcj1ncix4cj1xdCxBcj1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihyLG4saSl7aWYodGhpcyBpbnN0YW5jZW9mIGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQocik7Y2FzZSAyOnJldHVybiBuZXcgdChyLG4pfXJldHVybiBuZXcgdChyLG4saSl9cmV0dXJuIHlyKHQsdGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gZS5wcm90b3R5cGU9dC5wcm90b3R5cGUsZX0sQ3I9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYyx1LGwsaD10LnRhcmdldCxkPXQuZ2xvYmFsLGY9dC5zdGF0LHA9dC5wcm90byxfPWQ/bXI6Zj9tcltoXTptcltoXSYmbXJbaF0ucHJvdG90eXBlLGc9ZD9rcjprcltoXXx8RXIoa3IsaCx7fSlbaF0sbT1nLnByb3RvdHlwZTtmb3IobyBpbiBlKW49IShyPVNyKGQ/bzpoKyhmPyIuIjoiIyIpK28sdC5mb3JjZWQpKSYmXyYmeHIoXyxvKSxhPWdbb10sbiYmKGM9dC5kb250Q2FsbEdldFNldD8obD13cihfLG8pKSYmbC52YWx1ZTpfW29dKSxzPW4mJmM/YzplW29dLChyfHxwfHx0eXBlb2YgYSE9dHlwZW9mIHMpJiYodT10LmJpbmQmJm4/T3Iocyxtcik6dC53cmFwJiZuP0FyKHMpOnAmJmJyKHMpP3ZyKHMpOnMsKHQuc2hhbXx8cyYmcy5zaGFtfHxhJiZhLnNoYW0pJiZFcih1LCJzaGFtIiwhMCksRXIoZyxvLHUpLHAmJih4cihrcixpPWgrIlByb3RvdHlwZSIpfHxFcihrcixpLHt9KSxFcihrcltpXSxvLHMpLHQucmVhbCYmbSYmKHJ8fCFtW29dKSYmRXIobSxvLHMpKSl9LElyPUNyLFRyPUMsQnI9JGUuZjtJcih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSE9PUJyLHNoYW06IVRyfSx7ZGVmaW5lUHJvcGVydHk6QnJ9KTt2YXIgTHI9US5PYmplY3QsUnI9bi5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gTHIuZGVmaW5lUHJvcGVydHkodCxlLHIpfTtMci5kZWZpbmVQcm9wZXJ0eS5zaGFtJiYoUnIuc2hhbT0hMCk7dmFyIE5yPWUobi5leHBvcnRzKSx6cj13LERyPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJBcnJheSI9PT16cih0KX0sUHI9TWF0aC5jZWlsLE1yPU1hdGguZmxvb3IsRnI9TWF0aC50cnVuY3x8ZnVuY3Rpb24odCl7dmFyIGU9K3Q7cmV0dXJuKGU+MD9NcjpQcikoZSl9LFVyPWZ1bmN0aW9uKHQpe3ZhciBlPSt0O3JldHVybiBlIT1lfHwwPT09ZT8wOkZyKGUpfSxqcj1VcixIcj1NYXRoLm1pbixKcj1mdW5jdGlvbih0KXt2YXIgZT1qcih0KTtyZXR1cm4gZT4wP0hyKGUsOTAwNzE5OTI1NDc0MDk5MSk6MH0sS3I9ZnVuY3Rpb24odCl7cmV0dXJuIEpyKHQubGVuZ3RoKX0sV3I9VHlwZUVycm9yLFpyPWZ1bmN0aW9uKHQpe2lmKHQ+OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBXcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7cmV0dXJuIHR9LEdyPUMsVnI9JGUsWHI9TSxZcj1mdW5jdGlvbih0LGUscil7R3I/VnIuZih0LGUsWHIoMCxyKSk6dFtlXT1yfSwkcj17fTskcltkZSgidG9TdHJpbmdUYWciKV09InoiO3ZhciBxcj0iW29iamVjdCB6XSI9PT1TdHJpbmcoJHIpLFFyPXFyLHRuPXgsZW49dyxybj1kZSgidG9TdHJpbmdUYWciKSxubj1PYmplY3Qsb249IkFyZ3VtZW50cyI9PT1lbihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLHNuPVFyP2VuOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihyPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHIpe319KGU9bm4odCkscm4pKT9yOm9uP2VuKGUpOiJPYmplY3QiPT09KG49ZW4oZSkpJiZ0bihlLmNhbGxlZSk/IkFyZ3VtZW50cyI6bn0sYW49eCxjbj1LdCx1bj1tKEZ1bmN0aW9uLnRvU3RyaW5nKTthbihjbi5pbnNwZWN0U291cmNlKXx8KGNuLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHVuKHQpfSk7dmFyIGxuPWNuLmluc3BlY3RTb3VyY2UsaG49bSxkbj1zLGZuPXgscG49c24sX249bG4sZ249ZnVuY3Rpb24oKXt9LG1uPWl0KCJSZWZsZWN0IiwiY29uc3RydWN0IikseW49L15ccyooPzpjbGFzc3xmdW5jdGlvbilcYi8sdm49aG4oeW4uZXhlYyksYm49IXluLnRlc3QoZ24pLHduPWZ1bmN0aW9uKHQpe2lmKCFmbih0KSlyZXR1cm4hMTt0cnl7cmV0dXJuIG1uKGduLFtdLHQpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sU249ZnVuY3Rpb24odCl7aWYoIWZuKHQpKXJldHVybiExO3N3aXRjaChwbih0KSl7Y2FzZSJBc3luY0Z1bmN0aW9uIjpjYXNlIkdlbmVyYXRvckZ1bmN0aW9uIjpjYXNlIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iOnJldHVybiExfXRyeXtyZXR1cm4gYm58fCEhdm4oeW4sX24odCkpfWNhdGNoKGUpe3JldHVybiEwfX07U24uc2hhbT0hMDt2YXIga249IW1ufHxkbigoZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gd24od24uY2FsbCl8fCF3bihPYmplY3QpfHwhd24oKGZ1bmN0aW9uKCl7dD0hMH0pKXx8dH0pKT9Tbjp3bixPbj1EcixFbj1rbix4bj1xLEFuPWRlKCJzcGVjaWVzIiksQ249QXJyYXksSW49ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIE9uKHQpJiYoZT10LmNvbnN0cnVjdG9yLChFbihlKSYmKGU9PT1Dbnx8T24oZS5wcm90b3R5cGUpKXx8eG4oZSkmJm51bGw9PT0oZT1lW0FuXSkpJiYoZT12b2lkIDApKSx2b2lkIDA9PT1lP0NuOmV9LFRuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyhJbih0KSkoMD09PWU/MDplKX0sQm49cyxMbj1wdCxSbj1kZSgic3BlY2llcyIpLE5uPWZ1bmN0aW9uKHQpe3JldHVybiBMbj49NTF8fCFCbigoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4oZS5jb25zdHJ1Y3Rvcj17fSlbUm5dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSkpfSx6bj1DcixEbj1zLFBuPURyLE1uPXEsRm49WHQsVW49S3Isam49WnIsSG49WXIsSm49VG4sS249Tm4sV249cHQsWm49ZGUoImlzQ29uY2F0U3ByZWFkYWJsZSIpLEduPVduPj01MXx8IURuKChmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0W1puXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pKSxWbj1mdW5jdGlvbih0KXtpZighTW4odCkpcmV0dXJuITE7dmFyIGU9dFtabl07cmV0dXJuIHZvaWQgMCE9PWU/ISFlOlBuKHQpfTt6bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsYXJpdHk6MSxmb3JjZWQ6IUdufHwhS24oImNvbmNhdCIpfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8scz1Gbih0aGlzKSxhPUpuKHMsMCksYz0wO2ZvcihlPS0xLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKWlmKFZuKG89LTE9PT1lP3M6YXJndW1lbnRzW2VdKSlmb3IoaT1VbihvKSxqbihjK2kpLHI9MDtyPGk7cisrLGMrKylyIGluIG8mJkhuKGEsYyxvW3JdKTtlbHNlIGpuKGMrMSksSG4oYSxjKyssbyk7cmV0dXJuIGEubGVuZ3RoPWMsYX19KTt2YXIgWG49c24sWW49U3RyaW5nLCRuPWZ1bmN0aW9uKHQpe2lmKCJTeW1ib2wiPT09WG4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmciKTtyZXR1cm4gWW4odCl9LHFuPXt9LFFuPVVyLHRpPU1hdGgubWF4LGVpPU1hdGgubWluLHJpPVksbmk9ZnVuY3Rpb24odCxlKXt2YXIgcj1Rbih0KTtyZXR1cm4gcjwwP3RpKHIrZSwwKTplaShyLGUpfSxpaT1LcixvaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3ZhciBpPXJpKGUpLG89aWkoaSk7aWYoMD09PW8pcmV0dXJuIXQmJi0xO3ZhciBzLGE9bmkobixvKTtpZih0JiZyIT1yKXtmb3IoO28+YTspaWYoKHM9aVthKytdKSE9cylyZXR1cm4hMH1lbHNlIGZvcig7bz5hO2ErKylpZigodHx8YSBpbiBpKSYmaVthXT09PXIpcmV0dXJuIHR8fGF8fDA7cmV0dXJuIXQmJi0xfX0sc2k9e2luY2x1ZGVzOm9pKCEwKSxpbmRleE9mOm9pKCExKX0sYWk9e30sY2k9cXQsdWk9WSxsaT1zaS5pbmRleE9mLGhpPWFpLGRpPW0oW10ucHVzaCksZmk9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXVpKHQpLGk9MCxvPVtdO2ZvcihyIGluIG4pIWNpKGhpLHIpJiZjaShuLHIpJiZkaShvLHIpO2Zvcig7ZS5sZW5ndGg+aTspY2kobixyPWVbaSsrXSkmJih+bGkobyxyKXx8ZGkobyxyKSk7cmV0dXJuIG99LHBpPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl0sX2k9ZmksZ2k9cGksbWk9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiBfaSh0LGdpKX0seWk9Qyx2aT1xZSxiaT0kZSx3aT1ycixTaT1ZLGtpPW1pO3FuLmY9eWkmJiF2aT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe3dpKHQpO2Zvcih2YXIgcixuPVNpKGUpLGk9a2koZSksbz1pLmxlbmd0aCxzPTA7bz5zOyliaS5mKHQscj1pW3MrK10sbltyXSk7cmV0dXJuIHR9O3ZhciBPaSxFaT1pdCgiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiKSx4aT1uZSxBaT1adCgia2V5cyIpLENpPWZ1bmN0aW9uKHQpe3JldHVybiBBaVt0XXx8KEFpW3RdPXhpKHQpKX0sSWk9cnIsVGk9cW4sQmk9cGksTGk9YWksUmk9RWksTmk9eGUsemk9InByb3RvdHlwZSIsRGk9InNjcmlwdCIsUGk9Q2koIklFX1BST1RPIiksTWk9ZnVuY3Rpb24oKXt9LEZpPWZ1bmN0aW9uKHQpe3JldHVybiI8IitEaSsiPiIrdCsiPC8iK0RpKyI+In0sVWk9ZnVuY3Rpb24odCl7dC53cml0ZShGaSgiIikpLHQuY2xvc2UoKTt2YXIgZT10LnBhcmVudFdpbmRvdy5PYmplY3Q7cmV0dXJuIHQ9bnVsbCxlfSxqaT1mdW5jdGlvbigpe3RyeXtPaT1uZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaChpKXt9dmFyIHQsZSxyO2ppPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQuZG9tYWluJiZPaT9VaShPaSk6KGU9TmkoImlmcmFtZSIpLHI9ImphdmEiK0RpKyI6IixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFJpLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZyhyKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKEZpKCJkb2N1bWVudC5GPU9iamVjdCIpKSx0LmNsb3NlKCksdC5GKTpVaShPaSk7Zm9yKHZhciBuPUJpLmxlbmd0aDtuLS07KWRlbGV0ZSBqaVt6aV1bQmlbbl1dO3JldHVybiBqaSgpfTtMaVtQaV09ITA7dmFyIEhpPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIG51bGwhPT10PyhNaVt6aV09SWkodCkscj1uZXcgTWksTWlbemldPW51bGwscltQaV09dCk6cj1qaSgpLHZvaWQgMD09PWU/cjpUaS5mKHIsZSl9LEppPXt9LEtpPWZpLFdpPXBpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7SmkuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIEtpKHQsV2kpfTt2YXIgWmk9e30sR2k9bShbXS5zbGljZSksVmk9dyxYaT1ZLFlpPUppLmYsJGk9R2kscWk9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTtaaS5mPWZ1bmN0aW9uKHQpe3JldHVybiBxaSYmIldpbmRvdyI9PT1WaSh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIFlpKHQpfWNhdGNoKGUpe3JldHVybiAkaShxaSl9fSh0KTpZaShYaSh0KSl9O3ZhciBRaT17fTtRaS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIHRvPWdyLGVvPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBuJiZuLmVudW1lcmFibGU/dFtlXT1yOnRvKHQsZSxyKSx0fSxybz0kZSxubz17fSxpbz1kZTtuby5mPWlvO3ZhciBvbyxzbyxhbyxjbz1RLHVvPXF0LGxvPW5vLGhvPSRlLmYsZm89ZnVuY3Rpb24odCl7dmFyIGU9Y28uU3ltYm9sfHwoY28uU3ltYm9sPXt9KTt1byhlLHQpfHxobyhlLHQse3ZhbHVlOmxvLmYodCl9KX0scG89Qixfbz1pdCxnbz1kZSxtbz1lbyx5bz1mdW5jdGlvbigpe3ZhciB0PV9vKCJTeW1ib2wiKSxlPXQmJnQucHJvdG90eXBlLHI9ZSYmZS52YWx1ZU9mLG49Z28oInRvUHJpbWl0aXZlIik7ZSYmIWVbbl0mJm1vKGUsbiwoZnVuY3Rpb24odCl7cmV0dXJuIHBvKHIsdGhpcyl9KSx7YXJpdHk6MX0pfSx2bz1zbixibz1xcj97fS50b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrdm8odGhpcykrIl0ifSx3bz1xcixTbz0kZS5mLGtvPWdyLE9vPXF0LEVvPWJvLHhvPWRlKCJ0b1N0cmluZ1RhZyIpLEFvPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXI/dDp0JiZ0LnByb3RvdHlwZTtpJiYoT28oaSx4byl8fFNvKGkseG8se2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTplfSksbiYmIXdvJiZrbyhpLCJ0b1N0cmluZyIsRW8pKX0sQ289eCxJbz1vLldlYWtNYXAsVG89Q28oSW8pJiYvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKElvKSksQm89byxMbz1xLFJvPWdyLE5vPXF0LHpvPUt0LERvPUNpLFBvPWFpLE1vPSJPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCIsRm89Qm8uVHlwZUVycm9yLFVvPUJvLldlYWtNYXA7aWYoVG98fHpvLnN0YXRlKXt2YXIgam89em8uc3RhdGV8fCh6by5zdGF0ZT1uZXcgVW8pO2pvLmdldD1qby5nZXQsam8uaGFzPWpvLmhhcyxqby5zZXQ9am8uc2V0LG9vPWZ1bmN0aW9uKHQsZSl7aWYoam8uaGFzKHQpKXRocm93IG5ldyBGbyhNbyk7cmV0dXJuIGUuZmFjYWRlPXQsam8uc2V0KHQsZSksZX0sc289ZnVuY3Rpb24odCl7cmV0dXJuIGpvLmdldCh0KXx8e319LGFvPWZ1bmN0aW9uKHQpe3JldHVybiBqby5oYXModCl9fWVsc2V7dmFyIEhvPURvKCJzdGF0ZSIpO1BvW0hvXT0hMCxvbz1mdW5jdGlvbih0LGUpe2lmKE5vKHQsSG8pKXRocm93IG5ldyBGbyhNbyk7cmV0dXJuIGUuZmFjYWRlPXQsUm8odCxIbyxlKSxlfSxzbz1mdW5jdGlvbih0KXtyZXR1cm4gTm8odCxIbyk/dFtIb106e319LGFvPWZ1bmN0aW9uKHQpe3JldHVybiBObyh0LEhvKX19dmFyIEpvPXtzZXQ6b28sZ2V0OnNvLGhhczphbyxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBhbyh0KT9zbyh0KTpvbyh0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcjtpZighTG8oZSl8fChyPXNvKGUpKS50eXBlIT09dCl0aHJvdyBuZXcgRm8oIkluY29tcGF0aWJsZSByZWNlaXZlciwgIit0KyIgcmVxdWlyZWQiKTtyZXR1cm4gcn19fSxLbz1ZZSxXbz1KLFpvPVh0LEdvPUtyLFZvPVRuLFhvPW0oW10ucHVzaCksWW89ZnVuY3Rpb24odCl7dmFyIGU9MT09PXQscj0yPT09dCxuPTM9PT10LGk9ND09PXQsbz02PT09dCxzPTc9PT10LGE9NT09PXR8fG87cmV0dXJuIGZ1bmN0aW9uKGMsdSxsLGgpe2Zvcih2YXIgZCxmLHA9Wm8oYyksXz1XbyhwKSxnPUdvKF8pLG09S28odSxsKSx5PTAsdj1ofHxWbyxiPWU/dihjLGcpOnJ8fHM/dihjLDApOnZvaWQgMDtnPnk7eSsrKWlmKChhfHx5IGluIF8pJiYoZj1tKGQ9X1t5XSx5LHApLHQpKWlmKGUpYlt5XT1mO2Vsc2UgaWYoZilzd2l0Y2godCl7Y2FzZSAzOnJldHVybiEwO2Nhc2UgNTpyZXR1cm4gZDtjYXNlIDY6cmV0dXJuIHk7Y2FzZSAyOlhvKGIsZCl9ZWxzZSBzd2l0Y2godCl7Y2FzZSA0OnJldHVybiExO2Nhc2UgNzpYbyhiLGQpfXJldHVybiBvPy0xOm58fGk/aTpifX0sJG89e2ZvckVhY2g6WW8oMCksbWFwOllvKDEpLGZpbHRlcjpZbygyKSxzb21lOllvKDMpLGV2ZXJ5OllvKDQpLGZpbmQ6WW8oNSksZmluZEluZGV4OllvKDYpLGZpbHRlclJlamVjdDpZbyg3KX0scW89Q3IsUW89byx0cz1CLGVzPW0scnM9Qyxucz15dCxpcz1zLG9zPXF0LHNzPW90LGFzPXJyLGNzPVksdXM9U2UsbHM9JG4saHM9TSxkcz1IaSxmcz1taSxwcz1KaSxfcz1aaSxncz1RaSxtcz1BLHlzPSRlLHZzPXFuLGJzPUwsd3M9ZW8sU3M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByby5mKHQsZSxyKX0sa3M9WnQsT3M9YWksRXM9bmUseHM9ZGUsQXM9bm8sQ3M9Zm8sSXM9eW8sVHM9QW8sQnM9Sm8sTHM9JG8uZm9yRWFjaCxScz1DaSgiaGlkZGVuIiksTnM9IlN5bWJvbCIsenM9InByb3RvdHlwZSIsRHM9QnMuc2V0LFBzPUJzLmdldHRlckZvcihOcyksTXM9T2JqZWN0W3pzXSxGcz1Rby5TeW1ib2wsVXM9RnMmJkZzW3pzXSxqcz1Rby5SYW5nZUVycm9yLEhzPVFvLlR5cGVFcnJvcixKcz1Rby5RT2JqZWN0LEtzPW1zLmYsV3M9eXMuZixacz1fcy5mLEdzPWJzLmYsVnM9ZXMoW10ucHVzaCksWHM9a3MoInN5bWJvbHMiKSxZcz1rcygib3Atc3ltYm9scyIpLCRzPWtzKCJ3a3MiKSxxcz0hSnN8fCFKc1t6c118fCFKc1t6c10uZmluZENoaWxkLFFzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1LcyhNcyxlKTtuJiZkZWxldGUgTXNbZV0sV3ModCxlLHIpLG4mJnQhPT1NcyYmV3MoTXMsZSxuKX0sdGE9cnMmJmlzKChmdW5jdGlvbigpe3JldHVybiA3IT09ZHMoV3Moe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gV3ModGhpcywiYSIse3ZhbHVlOjd9KS5hfX0pKS5hfSkpP1FzOldzLGVhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9WHNbdF09ZHMoVXMpO3JldHVybiBEcyhyLHt0eXBlOk5zLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxyc3x8KHIuZGVzY3JpcHRpb249ZSkscn0scmE9ZnVuY3Rpb24odCxlLHIpe3Q9PT1NcyYmcmEoWXMsZSxyKSxhcyh0KTt2YXIgbj11cyhlKTtyZXR1cm4gYXMociksb3MoWHMsbik/KHIuZW51bWVyYWJsZT8ob3ModCxScykmJnRbUnNdW25dJiYodFtSc11bbl09ITEpLHI9ZHMocix7ZW51bWVyYWJsZTpocygwLCExKX0pKToob3ModCxScyl8fFdzKHQsUnMsaHMoMSxkcyhudWxsKSkpLHRbUnNdW25dPSEwKSx0YSh0LG4scikpOldzKHQsbixyKX0sbmE9ZnVuY3Rpb24odCxlKXthcyh0KTt2YXIgcj1jcyhlKSxuPWZzKHIpLmNvbmNhdChhYShyKSk7cmV0dXJuIExzKG4sKGZ1bmN0aW9uKGUpe3JzJiYhdHMoaWEscixlKXx8cmEodCxlLHJbZV0pfSkpLHR9LGlhPWZ1bmN0aW9uKHQpe3ZhciBlPXVzKHQpLHI9dHMoR3MsdGhpcyxlKTtyZXR1cm4hKHRoaXM9PT1NcyYmb3MoWHMsZSkmJiFvcyhZcyxlKSkmJighKHJ8fCFvcyh0aGlzLGUpfHwhb3MoWHMsZSl8fG9zKHRoaXMsUnMpJiZ0aGlzW1JzXVtlXSl8fHIpfSxvYT1mdW5jdGlvbih0LGUpe3ZhciByPWNzKHQpLG49dXMoZSk7aWYociE9PU1zfHwhb3MoWHMsbil8fG9zKFlzLG4pKXt2YXIgaT1LcyhyLG4pO3JldHVybiFpfHwhb3MoWHMsbil8fG9zKHIsUnMpJiZyW1JzXVtuXXx8KGkuZW51bWVyYWJsZT0hMCksaX19LHNhPWZ1bmN0aW9uKHQpe3ZhciBlPVpzKGNzKHQpKSxyPVtdO3JldHVybiBMcyhlLChmdW5jdGlvbih0KXtvcyhYcyx0KXx8b3MoT3MsdCl8fFZzKHIsdCl9KSkscn0sYWE9ZnVuY3Rpb24odCl7dmFyIGU9dD09PU1zLHI9WnMoZT9Zczpjcyh0KSksbj1bXTtyZXR1cm4gTHMociwoZnVuY3Rpb24odCl7IW9zKFhzLHQpfHxlJiYhb3MoTXMsdCl8fFZzKG4sWHNbdF0pfSkpLG59O25zfHwoRnM9ZnVuY3Rpb24oKXtpZihzcyhVcyx0aGlzKSl0aHJvdyBuZXcgSHMoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9scyhhcmd1bWVudHNbMF0pOnZvaWQgMCxlPUVzKHQpLHI9ZnVuY3Rpb24odCl7dmFyIG49dm9pZCAwPT09dGhpcz9Rbzp0aGlzO249PT1NcyYmdHMocixZcyx0KSxvcyhuLFJzKSYmb3MobltSc10sZSkmJihuW1JzXVtlXT0hMSk7dmFyIGk9aHMoMSx0KTt0cnl7dGEobixlLGkpfWNhdGNoKG8pe2lmKCEobyBpbnN0YW5jZW9mIGpzKSl0aHJvdyBvO1FzKG4sZSxpKX19O3JldHVybiBycyYmcXMmJnRhKE1zLGUse2NvbmZpZ3VyYWJsZTohMCxzZXQ6cn0pLGVhKGUsdCl9LHdzKFVzPUZzW3pzXSwidG9TdHJpbmciLChmdW5jdGlvbigpe3JldHVybiBQcyh0aGlzKS50YWd9KSksd3MoRnMsIndpdGhvdXRTZXR0ZXIiLChmdW5jdGlvbih0KXtyZXR1cm4gZWEoRXModCksdCl9KSksYnMuZj1pYSx5cy5mPXJhLHZzLmY9bmEsbXMuZj1vYSxwcy5mPV9zLmY9c2EsZ3MuZj1hYSxBcy5mPWZ1bmN0aW9uKHQpe3JldHVybiBlYSh4cyh0KSx0KX0scnMmJlNzKFVzLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHModGhpcykuZGVzY3JpcHRpb259fSkpLHFvKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsd3JhcDohMCxmb3JjZWQ6IW5zLHNoYW06IW5zfSx7U3ltYm9sOkZzfSksTHMoZnMoJHMpLChmdW5jdGlvbih0KXtDcyh0KX0pKSxxbyh7dGFyZ2V0Ok5zLHN0YXQ6ITAsZm9yY2VkOiFuc30se3VzZVNldHRlcjpmdW5jdGlvbigpe3FzPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtxcz0hMX19KSxxbyh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFucyxzaGFtOiFyc30se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP2RzKHQpOm5hKGRzKHQpLGUpfSxkZWZpbmVQcm9wZXJ0eTpyYSxkZWZpbmVQcm9wZXJ0aWVzOm5hLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpvYX0pLHFvKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IW5zfSx7Z2V0T3duUHJvcGVydHlOYW1lczpzYX0pLElzKCksVHMoRnMsTnMpLE9zW1JzXT0hMDt2YXIgY2E9eXQmJiEhU3ltYm9sLmZvciYmISFTeW1ib2wua2V5Rm9yLHVhPUNyLGxhPWl0LGhhPXF0LGRhPSRuLGZhPVp0LHBhPWNhLF9hPWZhKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksZ2E9ZmEoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKTt1YSh7dGFyZ2V0OiJTeW1ib2wiLHN0YXQ6ITAsZm9yY2VkOiFwYX0se2ZvcjpmdW5jdGlvbih0KXt2YXIgZT1kYSh0KTtpZihoYShfYSxlKSlyZXR1cm4gX2FbZV07dmFyIHI9bGEoIlN5bWJvbCIpKGUpO3JldHVybiBfYVtlXT1yLGdhW3JdPWUscn19KTt2YXIgbWE9Q3IseWE9cXQsdmE9T3QsYmE9eHQsd2E9Y2EsU2E9WnQoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKTttYSh7dGFyZ2V0OiJTeW1ib2wiLHN0YXQ6ITAsZm9yY2VkOiF3YX0se2tleUZvcjpmdW5jdGlvbih0KXtpZighdmEodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihiYSh0KSsiIGlzIG5vdCBhIHN5bWJvbCIpO2lmKHlhKFNhLHQpKXJldHVybiBTYVt0XX19KTt2YXIga2E9RHIsT2E9eCxFYT13LHhhPSRuLEFhPW0oW10ucHVzaCksQ2E9Q3IsSWE9aXQsVGE9ZCxCYT1CLExhPW0sUmE9cyxOYT14LHphPU90LERhPUdpLFBhPWZ1bmN0aW9uKHQpe2lmKE9hKHQpKXJldHVybiB0O2lmKGthKHQpKXtmb3IodmFyIGU9dC5sZW5ndGgscj1bXSxuPTA7bjxlO24rKyl7dmFyIGk9dFtuXTsic3RyaW5nIj09dHlwZW9mIGk/QWEocixpKToibnVtYmVyIiE9dHlwZW9mIGkmJiJOdW1iZXIiIT09RWEoaSkmJiJTdHJpbmciIT09RWEoaSl8fEFhKHIseGEoaSkpfXZhciBvPXIubGVuZ3RoLHM9ITA7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYocylyZXR1cm4gcz0hMSxlO2lmKGthKHRoaXMpKXJldHVybiBlO2Zvcih2YXIgbj0wO248bztuKyspaWYocltuXT09PXQpcmV0dXJuIGV9fX0sTWE9eXQsRmE9U3RyaW5nLFVhPUlhKCJKU09OIiwic3RyaW5naWZ5IiksamE9TGEoLy4vLmV4ZWMpLEhhPUxhKCIiLmNoYXJBdCksSmE9TGEoIiIuY2hhckNvZGVBdCksS2E9TGEoIiIucmVwbGFjZSksV2E9TGEoMS4udG9TdHJpbmcpLFphPS9bXHVEODAwLVx1REZGRl0vZyxHYT0vXltcdUQ4MDAtXHVEQkZGXSQvLFZhPS9eW1x1REMwMC1cdURGRkZdJC8sWGE9IU1hfHxSYSgoZnVuY3Rpb24oKXt2YXIgdD1JYSgiU3ltYm9sIikoInN0cmluZ2lmeSBkZXRlY3Rpb24iKTtyZXR1cm4iW251bGxdIiE9PVVhKFt0XSl8fCJ7fSIhPT1VYSh7YTp0fSl8fCJ7fSIhPT1VYShPYmplY3QodCkpfSkpLFlhPVJhKChmdW5jdGlvbigpe3JldHVybiciXFx1ZGYwNlxcdWQ4MzQiJyE9PVVhKCJcdWRmMDZcdWQ4MzQiKXx8JyJcXHVkZWFkIichPT1VYSgiXHVkZWFkIil9KSksJGE9ZnVuY3Rpb24odCxlKXt2YXIgcj1EYShhcmd1bWVudHMpLG49UGEoZSk7aWYoTmEobil8fHZvaWQgMCE9PXQmJiF6YSh0KSlyZXR1cm4gclsxXT1mdW5jdGlvbih0LGUpe2lmKE5hKG4pJiYoZT1CYShuLHRoaXMsRmEodCksZSkpLCF6YShlKSlyZXR1cm4gZX0sVGEoVWEsbnVsbCxyKX0scWE9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPUhhKHIsZS0xKSxpPUhhKHIsZSsxKTtyZXR1cm4gamEoR2EsdCkmJiFqYShWYSxpKXx8amEoVmEsdCkmJiFqYShHYSxuKT8iXFx1IitXYShKYSh0LDApLDE2KTp0fTtVYSYmQ2Eoe3RhcmdldDoiSlNPTiIsc3RhdDohMCxhcml0eTozLGZvcmNlZDpYYXx8WWF9LHtzdHJpbmdpZnk6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPURhKGFyZ3VtZW50cyksaT1UYShYYT8kYTpVYSxudWxsLG4pO3JldHVybiBZYSYmInN0cmluZyI9PXR5cGVvZiBpP0thKGksWmEscWEpOml9fSk7dmFyIFFhPVFpLHRjPVh0O0NyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXl0fHxzKChmdW5jdGlvbigpe1FhLmYoMSl9KSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7dmFyIGU9UWEuZjtyZXR1cm4gZT9lKHRjKHQpKTpbXX19KSxmbygiYXN5bmNJdGVyYXRvciIpLGZvKCJoYXNJbnN0YW5jZSIpLGZvKCJpc0NvbmNhdFNwcmVhZGFibGUiKSxmbygiaXRlcmF0b3IiKSxmbygibWF0Y2giKSxmbygibWF0Y2hBbGwiKSxmbygicmVwbGFjZSIpLGZvKCJzZWFyY2giKSxmbygic3BlY2llcyIpLGZvKCJzcGxpdCIpO3ZhciBlYz15bztmbygidG9QcmltaXRpdmUiKSxlYygpO3ZhciByYz1pdCxuYz1BbztmbygidG9TdHJpbmdUYWciKSxuYyhyYygiU3ltYm9sIiksIlN5bWJvbCIpLGZvKCJ1bnNjb3BhYmxlcyIpLEFvKG8uSlNPTiwiSlNPTiIsITApO3ZhciBpYyxvYyxzYyxhYz1RLlN5bWJvbCxjYz17fSx1Yz1DLGxjPXF0LGhjPUZ1bmN0aW9uLnByb3RvdHlwZSxkYz11YyYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixmYz1sYyhoYywibmFtZSIpLHBjPXtFWElTVFM6ZmMsUFJPUEVSOmZjJiYic29tZXRoaW5nIj09PWZ1bmN0aW9uKCl7fS5uYW1lLENPTkZJR1VSQUJMRTpmYyYmKCF1Y3x8dWMmJmRjKGhjLCJuYW1lIikuY29uZmlndXJhYmxlKX0sX2M9IXMoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuY29uc3RydWN0b3I9bnVsbCxPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IHQpIT09dC5wcm90b3R5cGV9KSksZ2M9cXQsbWM9eCx5Yz1YdCx2Yz1fYyxiYz1DaSgiSUVfUFJPVE8iKSx3Yz1PYmplY3QsU2M9d2MucHJvdG90eXBlLGtjPXZjP3djLmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3ZhciBlPXljKHQpO2lmKGdjKGUsYmMpKXJldHVybiBlW2JjXTt2YXIgcj1lLmNvbnN0cnVjdG9yO3JldHVybiBtYyhyKSYmZSBpbnN0YW5jZW9mIHI/ci5wcm90b3R5cGU6ZSBpbnN0YW5jZW9mIHdjP1NjOm51bGx9LE9jPXMsRWM9eCx4Yz1xLEFjPUhpLENjPWtjLEljPWVvLFRjPWRlKCJpdGVyYXRvciIpLEJjPSExO1tdLmtleXMmJigibmV4dCJpbihzYz1bXS5rZXlzKCkpPyhvYz1DYyhDYyhzYykpKSE9PU9iamVjdC5wcm90b3R5cGUmJihpYz1vYyk6QmM9ITApO3ZhciBMYz0heGMoaWMpfHxPYygoZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gaWNbVGNdLmNhbGwodCkhPT10fSkpO0VjKChpYz1MYz97fTpBYyhpYykpW1RjXSl8fEljKGljLFRjLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpO3ZhciBSYz17SXRlcmF0b3JQcm90b3R5cGU6aWMsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpCY30sTmM9UmMuSXRlcmF0b3JQcm90b3R5cGUsemM9SGksRGM9TSxQYz1BbyxNYz1jYyxGYz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxVYz1DcixqYz1CLEhjPXBjLEpjPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPXpjKE5jLHtuZXh0OkRjKCshbixyKX0pLFBjKHQsaSwhMSwhMCksTWNbaV09RmMsdH0sS2M9a2MsV2M9QW8sWmM9ZW8sR2M9Y2MsVmM9UmMsWGM9SGMuUFJPUEVSLFljPVZjLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMsJGM9ZGUoIml0ZXJhdG9yIikscWM9ImtleXMiLFFjPSJ2YWx1ZXMiLHR1PSJlbnRyaWVzIixldT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxydT1mdW5jdGlvbih0LGUscixuLGksbyxzKXtKYyhyLGUsbik7dmFyIGEsYyx1LGw9ZnVuY3Rpb24odCl7aWYodD09PWkmJl8pcmV0dXJuIF87aWYoIVljJiZ0JiZ0IGluIGYpcmV0dXJuIGZbdF07c3dpdGNoKHQpe2Nhc2UgcWM6Y2FzZSBRYzpjYXNlIHR1OnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyl9fSxoPWUrIiBJdGVyYXRvciIsZD0hMSxmPXQucHJvdG90eXBlLHA9ZlskY118fGZbIkBAaXRlcmF0b3IiXXx8aSYmZltpXSxfPSFZYyYmcHx8bChpKSxnPSJBcnJheSI9PT1lJiZmLmVudHJpZXN8fHA7aWYoZyYmKGE9S2MoZy5jYWxsKG5ldyB0KSkpIT09T2JqZWN0LnByb3RvdHlwZSYmYS5uZXh0JiYoV2MoYSxoLCEwLCEwKSxHY1toXT1ldSksWGMmJmk9PT1RYyYmcCYmcC5uYW1lIT09UWMmJihkPSEwLF89ZnVuY3Rpb24oKXtyZXR1cm4gamMocCx0aGlzKX0pLGkpaWYoYz17dmFsdWVzOmwoUWMpLGtleXM6bz9fOmwocWMpLGVudHJpZXM6bCh0dSl9LHMpZm9yKHUgaW4gYykoWWN8fGR8fCEodSBpbiBmKSkmJlpjKGYsdSxjW3VdKTtlbHNlIFVjKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6WWN8fGR9LGMpO3JldHVybiBzJiZmWyRjXSE9PV8mJlpjKGYsJGMsXyx7bmFtZTppfSksR2NbZV09XyxjfSxudT1mdW5jdGlvbih0LGUpe3JldHVybnt2YWx1ZTp0LGRvbmU6ZX19LGl1PVksb3U9Y2Msc3U9Sm87JGUuZjt2YXIgYXU9cnUsY3U9bnUsdXU9IkFycmF5IEl0ZXJhdG9yIixsdT1zdS5zZXQsaHU9c3UuZ2V0dGVyRm9yKHV1KTthdShBcnJheSwiQXJyYXkiLChmdW5jdGlvbih0LGUpe2x1KHRoaXMse3R5cGU6dXUsdGFyZ2V0Oml1KHQpLGluZGV4OjAsa2luZDplfSl9KSwoZnVuY3Rpb24oKXt2YXIgdD1odSh0aGlzKSxlPXQudGFyZ2V0LHI9dC5pbmRleCsrO2lmKCFlfHxyPj1lLmxlbmd0aClyZXR1cm4gdC50YXJnZXQ9bnVsbCxjdSh2b2lkIDAsITApO3N3aXRjaCh0LmtpbmQpe2Nhc2Uia2V5cyI6cmV0dXJuIGN1KHIsITEpO2Nhc2UidmFsdWVzIjpyZXR1cm4gY3UoZVtyXSwhMSl9cmV0dXJuIGN1KFtyLGVbcl1dLCExKX0pLCJ2YWx1ZXMiKSxvdS5Bcmd1bWVudHM9b3UuQXJyYXk7dmFyIGR1PXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfSxmdT1vLHB1PUFvLF91PWNjO2Zvcih2YXIgZ3UgaW4gZHUpcHUoZnVbZ3VdLGd1KSxfdVtndV09X3UuQXJyYXk7dmFyIG11PWFjLHl1PWRlLHZ1PSRlLmYsYnU9eXUoIm1ldGFkYXRhIiksd3U9RnVuY3Rpb24ucHJvdG90eXBlO3ZvaWQgMD09PXd1W2J1XSYmdnUod3UsYnUse3ZhbHVlOm51bGx9KSxmbygiYXN5bmNEaXNwb3NlIiksZm8oImRpc3Bvc2UiKSxmbygibWV0YWRhdGEiKTt2YXIgU3U9bXUsa3U9bSxPdT1pdCgiU3ltYm9sIiksRXU9T3Uua2V5Rm9yLHh1PWt1KE91LnByb3RvdHlwZS52YWx1ZU9mKSxBdT1PdS5pc1JlZ2lzdGVyZWRTeW1ib2x8fGZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdm9pZCAwIT09RXUoeHUodCkpfWNhdGNoKGUpe3JldHVybiExfX07Q3Ioe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwfSx7aXNSZWdpc3RlcmVkU3ltYm9sOkF1fSk7Zm9yKHZhciBDdT1adCxJdT1pdCxUdT1tLEJ1PU90LEx1PWRlLFJ1PUl1KCJTeW1ib2wiKSxOdT1SdS5pc1dlbGxLbm93blN5bWJvbCx6dT1JdSgiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIpLER1PVR1KFJ1LnByb3RvdHlwZS52YWx1ZU9mKSxQdT1DdSgid2tzIiksTXU9MCxGdT16dShSdSksVXU9RnUubGVuZ3RoO011PFV1O011KyspdHJ5e3ZhciBqdT1GdVtNdV07QnUoUnVbanVdKSYmTHUoanUpfWNhdGNoKGVtKXt9dmFyIEh1PWZ1bmN0aW9uKHQpe2lmKE51JiZOdSh0KSlyZXR1cm4hMDt0cnl7Zm9yKHZhciBlPUR1KHQpLHI9MCxuPXp1KFB1KSxpPW4ubGVuZ3RoO3I8aTtyKyspaWYoUHVbbltyXV09PWUpcmV0dXJuITB9Y2F0Y2goZW0pe31yZXR1cm4hMX07Q3Ioe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwLGZvcmNlZDohMH0se2lzV2VsbEtub3duU3ltYm9sOkh1fSksZm8oImN1c3RvbU1hdGNoZXIiKSxmbygib2JzZXJ2YWJsZSIpLENyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxuYW1lOiJpc1JlZ2lzdGVyZWRTeW1ib2wifSx7aXNSZWdpc3RlcmVkOkF1fSksQ3Ioe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwLG5hbWU6ImlzV2VsbEtub3duU3ltYm9sIixmb3JjZWQ6ITB9LHtpc1dlbGxLbm93bjpIdX0pLGZvKCJtYXRjaGVyIiksZm8oIm1ldGFkYXRhS2V5IiksZm8oInBhdHRlcm5NYXRjaCIpLGZvKCJyZXBsYWNlQWxsIik7dmFyIEp1PWUoU3UpLEt1PW0sV3U9VXIsWnU9JG4sR3U9RyxWdT1LdSgiIi5jaGFyQXQpLFh1PUt1KCIiLmNoYXJDb2RlQXQpLFl1PUt1KCIiLnNsaWNlKSwkdT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgbixpLG89WnUoR3UoZSkpLHM9V3UociksYT1vLmxlbmd0aDtyZXR1cm4gczwwfHxzPj1hP3Q/IiI6dm9pZCAwOihuPVh1KG8scykpPDU1Mjk2fHxuPjU2MzE5fHxzKzE9PT1hfHwoaT1YdShvLHMrMSkpPDU2MzIwfHxpPjU3MzQzP3Q/VnUobyxzKTpuOnQ/WXUobyxzLHMrMik6aS01NjMyMCsobi01NTI5Njw8MTApKzY1NTM2fX0scXU9e2NvZGVBdDokdSghMSksY2hhckF0OiR1KCEwKX0uY2hhckF0LFF1PSRuLHRsPUpvLGVsPXJ1LHJsPW51LG5sPSJTdHJpbmcgSXRlcmF0b3IiLGlsPXRsLnNldCxvbD10bC5nZXR0ZXJGb3IobmwpO2VsKFN0cmluZywiU3RyaW5nIiwoZnVuY3Rpb24odCl7aWwodGhpcyx7dHlwZTpubCxzdHJpbmc6UXUodCksaW5kZXg6MH0pfSksKGZ1bmN0aW9uKCl7dmFyIHQsZT1vbCh0aGlzKSxyPWUuc3RyaW5nLG49ZS5pbmRleDtyZXR1cm4gbj49ci5sZW5ndGg/cmwodm9pZCAwLCEwKToodD1xdShyLG4pLGUuaW5kZXgrPXQubGVuZ3RoLHJsKHQsITEpKX0pKTt2YXIgc2w9ZShuby5mKCJpdGVyYXRvciIpKTtmdW5jdGlvbiBhbCh0KXtyZXR1cm4oYWw9ImZ1bmN0aW9uIj09dHlwZW9mIEp1JiYic3ltYm9sIj09dHlwZW9mIHNsP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBKdSYmdC5jb25zdHJ1Y3Rvcj09PUp1JiZ0IT09SnUucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9dmFyIGNsPWUobm8uZigidG9QcmltaXRpdmUiKSk7ZnVuY3Rpb24gdWwodCl7dmFyIGU9ZnVuY3Rpb24odCxlKXtpZigib2JqZWN0IiE9YWwodCl8fCF0KXJldHVybiB0O3ZhciByPXRbY2xdO2lmKHZvaWQgMCE9PXIpe3ZhciBuPXIuY2FsbCh0LGV8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPWFsKG4pKXJldHVybiBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09ZT9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PWFsKGUpP2U6ZSsiIn1mdW5jdGlvbiBsbCh0LGUscil7cmV0dXJuKGU9dWwoZSkpaW4gdD9Ocih0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH12YXIgaGwsZGw9byxmbD1RLHBsPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZmxbdCsiUHJvdG90eXBlIl0sbj1yJiZyW2VdO2lmKG4pcmV0dXJuIG47dmFyIGk9ZGxbdF0sbz1pJiZpLnByb3RvdHlwZTtyZXR1cm4gbyYmb1tlXX0sX2w9cSxnbD13LG1sPWRlKCJtYXRjaCIpLHlsPXJyLHZsPUIsYmw9cXQsd2w9b3QsU2w9ZnVuY3Rpb24oKXt2YXIgdD15bCh0aGlzKSxlPSIiO3JldHVybiB0Lmhhc0luZGljZXMmJihlKz0iZCIpLHQuZ2xvYmFsJiYoZSs9ImciKSx0Lmlnbm9yZUNhc2UmJihlKz0iaSIpLHQubXVsdGlsaW5lJiYoZSs9Im0iKSx0LmRvdEFsbCYmKGUrPSJzIiksdC51bmljb2RlJiYoZSs9InUiKSx0LnVuaWNvZGVTZXRzJiYoZSs9InYiKSx0LnN0aWNreSYmKGUrPSJ5IiksZX0sa2w9UmVnRXhwLnByb3RvdHlwZSxPbD1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gRWwoKXtpZighaGwmJiEoaGw9InVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8mJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHwidW5kZWZpbmVkIiE9dHlwZW9mIG1zQ3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0bykpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gaGwoT2wpfXZhciB4bD0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7Zm9yKHZhciBBbD1bXSxDbD0wO0NsPDI1NjsrK0NsKUFsLnB1c2goKENsKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gSWwodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAscj0oQWxbdFtlKzBdXStBbFt0W2UrMV1dK0FsW3RbZSsyXV0rQWxbdFtlKzNdXSsiLSIrQWxbdFtlKzRdXStBbFt0W2UrNV1dKyItIitBbFt0W2UrNl1dK0FsW3RbZSs3XV0rIi0iK0FsW3RbZSs4XV0rQWxbdFtlKzldXSsiLSIrQWxbdFtlKzEwXV0rQWxbdFtlKzExXV0rQWxbdFtlKzEyXV0rQWxbdFtlKzEzXV0rQWxbdFtlKzE0XV0rQWxbdFtlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmeGwudGVzdCh0KX0ocikpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gcn1mdW5jdGlvbiBUbCh0LGUscil7dmFyIG49KHQ9dHx8e30pLnJhbmRvbXx8KHQucm5nfHxFbCkoKTtpZihuWzZdPTE1Jm5bNl18NjQsbls4XT02MyZuWzhdfDEyOCxlKXtyPXJ8fDA7Zm9yKHZhciBpPTA7aTwxNjsrK2kpZVtyK2ldPW5baV07cmV0dXJuIGV9cmV0dXJuIElsKG4pfWNvbnN0IEJsPSgpPT4idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdztmdW5jdGlvbiBMbCh0KXtyZXR1cm4gbnVsbD09dD8idW5kZWZpbmVkIHwgbnVsbCI6InN0cmluZyI9PXR5cGVvZiB0P3Q6SlNPTi5zdHJpbmdpZnkoe2NvbnRlbnRIaW50OnQuY29udGVudEhpbnQsZW5hYmxlZDp0LmVuYWJsZWQsaWQ6dC5pZCxraW5kOnQua2luZCxsYWJlbDp0LmxhYmVsLG11dGVkOnQubXV0ZWQscmVhZHlTdGF0ZTp0LnJlYWR5U3RhdGV9KX1mdW5jdGlvbiBSbCh0KXtyZXR1cm4gbnVsbD09dD8idW5kZWZpbmVkIHwgbnVsbCI6InN0cmluZyI9PXR5cGVvZiB0P3Q6SlNPTi5zdHJpbmdpZnkoe3RyYWNrOkxsKHQudHJhY2spfSl9ZnVuY3Rpb24gTmwodCl7cmV0dXJuIG51bGw9PXQ/InVuZGVmaW5lZCB8IG51bGwiOiJzdHJpbmciPT10eXBlb2YgdD90OkpTT04uc3RyaW5naWZ5KHt0cmFjazpMbCh0LnRyYWNrKX0pfWNvbnN0IHpsPSJAYnl0ZWQvdmUtcnRjIixEbD0iQGJ5dGVkL3ZlLXJ0Yy1jYWNoZS1zaXplIjt2YXIgUGw9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7bGwodGhpcywic3RvcmVLZXkiLHZvaWQgMCksbGwodGhpcywibG9nTGV2ZWwiLHZvaWQgMCksbGwodGhpcywiTG9nZmlsZVNpemUiLHZvaWQgMCksbGwodGhpcywiZGIiLHZvaWQgMCksbGwodGhpcywibG9nSWQiLHZvaWQgMCksbGwodGhpcywiY2FjaGVMb2ciLHZvaWQgMCksbGwodGhpcywiY2FjaGVkU2l6ZSIsdm9pZCAwKSxsbCh0aGlzLCJwcmVDYWNoZVRpbWUiLHZvaWQgMCksbGwodGhpcywidGltZXIiLHZvaWQgMCksbGwodGhpcywiX2dldFNpemUiLCh0PT5uZXcgQmxvYih0KS5zaXplLzEwNDg1NzYpKSx0aGlzLnN0b3JlS2V5PSIiLHRoaXMubG9nSWQ9MSx0aGlzLmNhY2hlTG9nPSIiLHRoaXMubG9nTGV2ZWw9Im5vbmUiLHRoaXMuTG9nZmlsZVNpemU9MTAwLHRoaXMuX2NyZWF0ZVN0b3JlKCl9X2NyZWF0ZVN0b3JlKCl7aWYoQmwoKXx8IXdpbmRvdy5pbmRleGVkREIpcmV0dXJuO2NvbnN0IHQ9aW5kZXhlZERCLm9wZW4oIkBieXRlZC92ZS1ydGMiKTt0Lm9udXBncmFkZW5lZWRlZD0oKT0+e3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKHpsKTt0cnl7bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oRGwpfWNhdGNoKGVtKXt9fSx0Lm9uZXJyb3I9dD0+e30sdC5vbnN1Y2Nlc3M9KCk9Pnt0aGlzLmRiPXQucmVzdWx0LHRoaXMuX2dldENhY2hlZFNpemUoKX19X2dldENhY2hlZFNpemUoKXt0cnl7Y29uc3QgdD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShEbCk7dD90aGlzLmNhY2hlZFNpemU9TnVtYmVyKHQpOnRoaXMudmFsdWVzKCkudGhlbigodD0+e3RoaXMuY2FjaGVkU2l6ZT10aGlzLl9nZXRTaXplKHQpLHRoaXMuX3NldENhY2hlZFNpemUoKX0pKX1jYXRjaChlbSl7fX1fc2V0Q2FjaGVkU2l6ZSgpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShEbCwiIi5jb25jYXQodGhpcy5jYWNoZWRTaXplKSl9Y2F0Y2goZW0pe319X2dldFN0b3JlKHQpe2lmKHRoaXMuZGIpcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oemwsdCkub2JqZWN0U3RvcmUoemwpfXNldCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLHIpPT57aWYoIm5vbmUiPT09dGhpcy5sb2dMZXZlbClyZXR1cm4gZSgpO2lmKHQmJnRoaXMucHJlQ2FjaGVUaW1lJiZ0aGlzLnByZUNhY2hlVGltZS1EYXRlLm5vdygpPDFlMylyZXR1cm4gdGhpcy5jYWNoZUxvZys9IlxuXG4iLmNvbmNhdCh0aGlzLmxvZ0lkLCI6ICIpLmNvbmNhdCh0KSx0aGlzLmxvZ0lkKyssdGhpcy50aW1lcnx8KHRoaXMudGltZXI9c2V0VGltZW91dCgoKCk9Pnt0aGlzLnNldCgiIil9KSwxZTMtKHRoaXMucHJlQ2FjaGVUaW1lLURhdGUubm93KCkpKSksZSgpO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGw7Y29uc3Qgbj10aGlzLl9nZXRTdG9yZSgicmVhZHdyaXRlIik7aWYoIW4pcmV0dXJuIHIoImdldCBzdG9yZSBmYWlsIik7dGhpcy5jYWNoZWRTaXplJiZ0aGlzLmNhY2hlZFNpemU+dGhpcy5Mb2dmaWxlU2l6ZSYmdGhpcy5rZXlFYXJsaWVzdCgpLnRoZW4oKHQ9Pnt0aGlzLmdldCh0KS50aGVuKChlPT57dGhpcy5kZWwodCkudGhlbigoKCk9Pnt0aGlzLmNhY2hlZFNpemU9dGhpcy5jYWNoZWRTaXplLXRoaXMuX2dldFNpemUoWyIiLmNvbmNhdChlKV0pLHRoaXMuX3NldENhY2hlZFNpemUoKX0pKX0pKX0pKTtjb25zdCBpPW4uZ2V0KHRoaXMuc3RvcmVLZXkpO2kub25zdWNjZXNzPSgpPT57dHJ5e2NvbnN0IHI9IiIuY29uY2F0KGkucmVzdWx0fHwiIikuY29uY2F0KHRoaXMuY2FjaGVMb2cpLG89dD8iIi5jb25jYXQocj8iXG5cbiI6IiIpLmNvbmNhdCh0aGlzLmxvZ0lkLCI6ICIpLmNvbmNhdCh0KToiIjtuLnB1dCgiIi5jb25jYXQocikuY29uY2F0KG8pLHRoaXMuc3RvcmVLZXkpLHQmJnRoaXMubG9nSWQrKyx0aGlzLmNhY2hlTG9nPSIiLHRoaXMuY2FjaGVkU2l6ZT0odGhpcy5jYWNoZWRTaXplfHwwKSt0aGlzLl9nZXRTaXplKFsiIi5jb25jYXQodGhpcy5jYWNoZUxvZykuY29uY2F0KG8pXSksdGhpcy5fc2V0Q2FjaGVkU2l6ZSgpLHRoaXMucHJlQ2FjaGVUaW1lPURhdGUubm93KCksZSgpfWNhdGNoKG8pe2lmKCF0KXJldHVybiByKG8pO3RoaXMuY2FjaGVMb2crPSJcblxuIi5jb25jYXQodGhpcy5sb2dJZCwiOiAiKS5jb25jYXQodCksdGhpcy5sb2dJZCsrLHIobyl9fSxpLm9uZXJyb3I9ZT0+e2lmKCF0KXJldHVybiByKGUpO3RoaXMuY2FjaGVMb2crPSJcblxuIi5jb25jYXQodGhpcy5sb2dJZCwiOiAiKS5jb25jYXQodCksdGhpcy5sb2dJZCsrLHIoZSl9fSkpfWdldCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLHIpPT57Y29uc3Qgbj10aGlzLl9nZXRTdG9yZSgicmVhZG9ubHkiKTtpZighbilyZXR1cm4gcigpO2NvbnN0IGk9bi5nZXQodCk7aS5vbnN1Y2Nlc3M9KCk9PntlKGkucmVzdWx0KX0saS5vbmVycm9yPXQ9PntyKHQpfX0pKX1kZWwoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5zdG9yZUtleTtyZXR1cm4gbmV3IFByb21pc2UoKChlLHIpPT57Y29uc3Qgbj10aGlzLl9nZXRTdG9yZSgicmVhZHdyaXRlIik7aWYoIW4pcmV0dXJuIHIoKTtjb25zdCBpPW4uZGVsZXRlKHQpO2kub25zdWNjZXNzPSgpPT5lKGkucmVzdWx0KSxpLm9uZXJyb3I9dD0+cih0KX0pKX1rZXlFYXJsaWVzdCgpe3JldHVybiB0aGlzLmtleXMoKS50aGVuKCh0PT57bGV0IGUscj1EYXRlLm5vdygpO3JldHVybiB0LmZvckVhY2goKHQ9PntpZighdHx8IXQubGVuZ3RoKXJldHVybjtjb25zdCBuPXQuc3BsaXQoIi0iKVswXTtOdW1iZXIobik8ciYmKHI9TnVtYmVyKG4pLGU9dCl9KSksZX0pKX1rZXlzKCl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5fZ2V0U3RvcmUoInJlYWRvbmx5Iik7aWYoIXIpcmV0dXJuIGUoKTtpZihyLmdldEFsbEtleXMpe2NvbnN0IG49ci5nZXRBbGxLZXlzKCk7cmV0dXJuIG4ub25zdWNjZXNzPSgpPT57dChuLnJlc3VsdCl9LHZvaWQobi5vbmVycm9yPSgpPT57ZSgpfSl9Y29uc3Qgbj1bXTtyLm9wZW5DdXJzb3IoKS5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt0aGlzLnJlc3VsdCYmKG4ucHVzaCh0aGlzLnJlc3VsdC5rZXkpLHRoaXMucmVzdWx0LmNvbnRpbnVlKCkpfSxyLnRyYW5zYWN0aW9uLm9uY29tcGxldGU9KCk9PnQobil9KSl9dmFsdWVzKCl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5fZ2V0U3RvcmUoInJlYWRvbmx5Iik7aWYoIXIpcmV0dXJuIGUoKTtpZihyLmdldEFsbCl7Y29uc3Qgbj1yLmdldEFsbCgpO3JldHVybiBuLm9uc3VjY2Vzcz0oKT0+e3Qobi5yZXN1bHQpfSx2b2lkKG4ub25lcnJvcj0oKT0+e2UoKX0pfWNvbnN0IG49W107ci5vcGVuQ3Vyc29yKCkub25zdWNjZXNzPWZ1bmN0aW9uKCl7dGhpcy5yZXN1bHQmJihuLnB1c2godGhpcy5yZXN1bHQudmFsdWUpLHRoaXMucmVzdWx0LmNvbnRpbnVlKCkpfSxyLnRyYW5zYWN0aW9uLm9uY29tcGxldGU9KCk9PnQobil9KSl9ZG93bmxvYWQodCl7dD10fHx0aGlzLnN0b3JlS2V5LHRoaXMuZ2V0KHQpLnRoZW4oKGU9Pntjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyLmRvd25sb2FkPSIiLmNvbmNhdCh0LCIudHh0Iiksci5ocmVmPSJkYXRhOnRleHQvcGFpbnQ7dXRmLTgsIi5jb25jYXQoZXx8IiIpLHIuY2xpY2soKX0pKX19O2NsYXNzIE1se2NvbnN0cnVjdG9yKCl7bGwodGhpcywiX2FsbCIse30pfW9uKHQsZSl7Y29uc3Qgcj10aGlzLl9hbGxbdF07cj9yLnB1c2goZSk6dGhpcy5fYWxsW3RdPVtlXX1vbmNlKHQsZSl7dmFyIHI9dGhpcztjb25zdCBuPWZ1bmN0aW9uKCl7ZSguLi5hcmd1bWVudHMpLHIub2ZmKHQsbil9O3RoaXMub24odCxuKX1vZmYodCxlKXtjb25zdCByPXRoaXMuX2FsbFt0XTtudWxsPT1yfHxyLnNwbGljZShyLmluZGV4T2YoZSk+Pj4wLDEpfWVtaXQodCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO2NvbnN0IGk9dGhpcy5fYWxsW3RdO251bGw9PWl8fGkuc2xpY2UoKS5mb3JFYWNoKCh0PT50KC4uLnIpKSl9c2FmZUVtaXQodCl7dHJ5e2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KGU+MT9lLTE6MCksbj0xO248ZTtuKyspcltuLTFdPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5lbWl0KHQsLi4ucil9Y2F0Y2goZW0pe2NvbnNvbGUuZXJyb3IoZW0pfX1kZXN0cm95KCl7dGhpcy5fYWxsPXt9fX1jb25zdCBGbD1bIlVQTE9BRF9DT05TT0xFX0xFTkdUSF9DVVQiLCJVUExPQURfUkVQT1JUX0xJTUlUIl07Y29uc3QgVWw9bmV3IGNsYXNzIGV4dGVuZHMgTWx7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLGxsKHRoaXMsImNvbmZpZyIse1VQTE9BRF9DT05TT0xFX09OOiExLFVQTE9BRF9DT05TT0xFX0xFTkdUSF9DVVQ6MjAwLFVQTE9BRF9SRVBPUlRfTElNSVQ6NDVlNCxFTkFCTEVfUkVQT1JUX0lEQl9CVUZGRVI6ITF9KX1zZXRQYXJhbWV0ZXIodCxlKXtpZihmdW5jdGlvbih0KXtyZXR1cm4gRmwuaW5jbHVkZXModCl9KHQpKXRyeXtjb25zdCByPU51bWJlcihlKTtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuO3RoaXMuY29uZmlnW3RdPXJ9Y2F0Y2gocil7cmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJDYW5ub3QgY29udmVydCBjb3JlIGxpYiBwYXJhbWV0ZXIgIi5jb25jYXQodCwiOiIpLmNvbmNhdChlLCIgaW50byBudW1iZXIiKSl9ZWxzZSB0aGlzLmNvbmZpZ1t0XT1lO3RoaXMuZW1pdCh0LHRoaXMuY29uZmlnW3RdKX1nZXRQYXJhbWV0ZXIodCl7cmV0dXJuIHRoaXMuY29uZmlnW3RdfWdldEtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5jb25maWcpfX07dmFyIGpsPVh0LEhsPW1pO0NyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6cygoZnVuY3Rpb24oKXtIbCgxKX0pKX0se2tleXM6ZnVuY3Rpb24odCl7cmV0dXJuIEhsKGpsKHQpKX19KTt2YXIgSmw9ZShRLk9iamVjdC5rZXlzKSxLbD1lKFEuT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyksV2w9JG8uZmlsdGVyO0NyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IU5uKCJmaWx0ZXIiKX0se2ZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gV2wodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTt2YXIgWmw9cGwoIkFycmF5IiwiZmlsdGVyIiksR2w9b3QsVmw9WmwsWGw9QXJyYXkucHJvdG90eXBlLFlsPWUoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZmlsdGVyO3JldHVybiB0PT09WGx8fEdsKFhsLHQpJiZlPT09WGwuZmlsdGVyP1ZsOmV9KSksJGw9e2V4cG9ydHM6e319LHFsPUNyLFFsPXMsdGg9WSxlaD1BLmYscmg9QztxbCh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFyaHx8UWwoKGZ1bmN0aW9uKCl7ZWgoMSl9KSksc2hhbTohcmh9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZWgodGgodCksZSl9fSk7dmFyIG5oPVEuT2JqZWN0LGloPSRsLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmguZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSl9O25oLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYoaWguc2hhbT0hMCk7dmFyIG9oPWUoJGwuZXhwb3J0cyksc2g9QyxhaD1EcixjaD1UeXBlRXJyb3IsdWg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixsaD1zaCYmIWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcylyZXR1cm4hMDt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCJsZW5ndGgiLHt3cml0YWJsZTohMX0pLmxlbmd0aD0xfWNhdGNoKGVtKXtyZXR1cm4gZW0gaW5zdGFuY2VvZiBUeXBlRXJyb3J9fSgpLGhoPVh0LGRoPUtyLGZoPWxoP2Z1bmN0aW9uKHQsZSl7aWYoYWgodCkmJiF1aCh0LCJsZW5ndGgiKS53cml0YWJsZSl0aHJvdyBuZXcgY2goIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgiKTtyZXR1cm4gdC5sZW5ndGg9ZX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZW5ndGg9ZX0scGg9WnI7Q3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGFyaXR5OjEsZm9yY2VkOnMoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyOTQ5NjcyOTchPT1bXS5wdXNoLmNhbGwoe2xlbmd0aDo0Mjk0OTY3Mjk2fSwxKX0pKXx8IWZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS5wdXNoKCl9Y2F0Y2goZW0pe3JldHVybiBlbSBpbnN0YW5jZW9mIFR5cGVFcnJvcn19KCl9LHtwdXNoOmZ1bmN0aW9uKHQpe3ZhciBlPWhoKHRoaXMpLHI9ZGgoZSksbj1hcmd1bWVudHMubGVuZ3RoO3BoKHIrbik7Zm9yKHZhciBpPTA7aTxuO2krKyllW3JdPWFyZ3VtZW50c1tpXSxyKys7cmV0dXJuIGZoKGUscikscn19KTt2YXIgX2g9cGwoIkFycmF5IiwicHVzaCIpLGdoPW90LG1oPV9oLHloPUFycmF5LnByb3RvdHlwZSx2aD1lKChmdW5jdGlvbih0KXt2YXIgZT10LnB1c2g7cmV0dXJuIHQ9PT15aHx8Z2goeWgsdCkmJmU9PT15aC5wdXNoP21oOmV9KSksYmg9cyx3aD0kby5mb3JFYWNoLFNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9W11bdF07cmV0dXJuISFyJiZiaCgoZnVuY3Rpb24oKXtyLmNhbGwobnVsbCxlfHxmdW5jdGlvbigpe3JldHVybiAxfSwxKX0pKX0oImZvckVhY2giKT9bXS5mb3JFYWNoOmZ1bmN0aW9uKHQpe3JldHVybiB3aCh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfTtDcih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOltdLmZvckVhY2ghPT1TaH0se2ZvckVhY2g6U2h9KTt2YXIga2g9cGwoIkFycmF5IiwiZm9yRWFjaCIpLE9oPXNuLEVoPXF0LHhoPW90LEFoPWtoLENoPUFycmF5LnByb3RvdHlwZSxJaD17RE9NVG9rZW5MaXN0OiEwLE5vZGVMaXN0OiEwfSxUaD1lKChmdW5jdGlvbih0KXt2YXIgZT10LmZvckVhY2g7cmV0dXJuIHQ9PT1DaHx8eGgoQ2gsdCkmJmU9PT1DaC5mb3JFYWNofHxFaChJaCxPaCh0KSk/QWg6ZX0pKSxCaD1pdCxMaD1KaSxSaD1RaSxOaD1ycix6aD1tKFtdLmNvbmNhdCksRGg9QmgoIlJlZmxlY3QiLCJvd25LZXlzIil8fGZ1bmN0aW9uKHQpe3ZhciBlPUxoLmYoTmgodCkpLHI9UmguZjtyZXR1cm4gcj96aChlLHIodCkpOmV9LFBoPVksTWg9QSxGaD1ZcjtDcih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohQ30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbj1QaCh0KSxpPU1oLmYsbz1EaChuKSxzPXt9LGE9MDtvLmxlbmd0aD5hOyl2b2lkIDAhPT0ocj1pKG4sZT1vW2ErK10pKSYmRmgocyxlLHIpO3JldHVybiBzfX0pO3ZhciBVaD1lKFEuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpLGpoPXtleHBvcnRzOnt9fSxIaD1DcixKaD1DLEtoPXFuLmY7SGgoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuZGVmaW5lUHJvcGVydGllcyE9PUtoLHNoYW06IUpofSx7ZGVmaW5lUHJvcGVydGllczpLaH0pO3ZhciBXaD1RLk9iamVjdCxaaD1qaC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdoLmRlZmluZVByb3BlcnRpZXModCxlKX07V2guZGVmaW5lUHJvcGVydGllcy5zaGFtJiYoWmguc2hhbT0hMCk7dmFyIEdoPWUoamguZXhwb3J0cyk7ZnVuY3Rpb24gVmgodCxlKXt2YXIgcj1KbCh0KTtpZihLbCl7dmFyIG49S2wodCk7ZSYmKG49WWwobikuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm4gb2godCxlKS5lbnVtZXJhYmxlfSkpKSx2aChyKS5hcHBseShyLG4pfXJldHVybiByfWZ1bmN0aW9uIFhoKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByLG4saT1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9UaChyPVZoKE9iamVjdChpKSwhMCkpLmNhbGwociwoZnVuY3Rpb24oZSl7bGwodCxlLGlbZV0pfSkpOlVoP0doKHQsVWgoaSkpOlRoKG49VmgoT2JqZWN0KGkpKSkuY2FsbChuLChmdW5jdGlvbihlKXtOcih0LGUsb2goaSxlKSl9KSl9cmV0dXJuIHR9dmFyIFloPURyLCRoPUtyLHFoPVpyLFFoPVllLHRkPWZ1bmN0aW9uKHQsZSxyLG4saSxvLHMsYSl7Zm9yKHZhciBjLHUsbD1pLGg9MCxkPSEhcyYmUWgocyxhKTtoPG47KWggaW4gciYmKGM9ZD9kKHJbaF0saCxlKTpyW2hdLG8+MCYmWWgoYyk/KHU9JGgoYyksbD10ZCh0LGUsYyx1LGwsby0xKS0xKToocWgobCsxKSx0W2xdPWMpLGwrKyksaCsrO3JldHVybiBsfSxlZD10ZCxyZD1YdCxuZD1LcixpZD1VcixvZD1UbjtDcih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtmbGF0OmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLGU9cmQodGhpcykscj1uZChlKSxuPW9kKGUsMCk7cmV0dXJuIG4ubGVuZ3RoPWVkKG4sZSxlLHIsMCx2b2lkIDA9PT10PzE6aWQodCkpLG59fSk7dmFyIHNkPXBsKCJBcnJheSIsImZsYXQiKSxhZD1vdCxjZD1zZCx1ZD1BcnJheS5wcm90b3R5cGUsbGQ9ZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5mbGF0O3JldHVybiB0PT09dWR8fGFkKHVkLHQpJiZlPT09dWQuZmxhdD9jZDplfSkpLGhkPXt9OyFmdW5jdGlvbih0KXt2YXIgZT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDE2QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgSW50MzJBcnJheTtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfXQuYXNzaWduPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7ZS5sZW5ndGg7KXt2YXIgbj1lLnNoaWZ0KCk7aWYobil7aWYoIm9iamVjdCIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IobisibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBpIGluIG4pcihuLGkpJiYodFtpXT1uW2ldKX19cmV0dXJuIHR9LHQuc2hyaW5rQnVmPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGVuZ3RoPT09ZT90OnQuc3ViYXJyYXk/dC5zdWJhcnJheSgwLGUpOih0Lmxlbmd0aD1lLHQpfTt2YXIgbj17YXJyYXlTZXQ6ZnVuY3Rpb24odCxlLHIsbixpKXtpZihlLnN1YmFycmF5JiZ0LnN1YmFycmF5KXQuc2V0KGUuc3ViYXJyYXkocixyK24pLGkpO2Vsc2UgZm9yKHZhciBvPTA7bzxuO28rKyl0W2krb109ZVtyK29dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8scztmb3Iobj0wLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbis9dFtlXS5sZW5ndGg7Zm9yKHM9bmV3IFVpbnQ4QXJyYXkobiksaT0wLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbz10W2VdLHMuc2V0KG8saSksaSs9by5sZW5ndGg7cmV0dXJuIHN9fSxpPXthcnJheVNldDpmdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz0wO288bjtvKyspdFtpK29dPWVbcitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbih0KXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sdCl9fTt0LnNldFR5cGVkPWZ1bmN0aW9uKGUpe2U/KHQuQnVmOD1VaW50OEFycmF5LHQuQnVmMTY9VWludDE2QXJyYXksdC5CdWYzMj1JbnQzMkFycmF5LHQuYXNzaWduKHQsbikpOih0LkJ1Zjg9QXJyYXksdC5CdWYxNj1BcnJheSx0LkJ1ZjMyPUFycmF5LHQuYXNzaWduKHQsaSkpfSx0LnNldFR5cGVkKGUpfShoZCk7dmFyIGRkPXt9LGZkPXt9LHBkPXt9LF9kPWhkO2Z1bmN0aW9uIGdkKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDstLWU+PTA7KXRbZV09MH12YXIgbWQ9MjU2LHlkPTI4Nix2ZD0zMCxiZD0xNSx3ZD1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXSxTZD1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sa2Q9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddLE9kPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxFZD1uZXcgQXJyYXkoNTc2KTtnZChFZCk7dmFyIHhkPW5ldyBBcnJheSg2MCk7Z2QoeGQpO3ZhciBBZD1uZXcgQXJyYXkoNTEyKTtnZChBZCk7dmFyIENkPW5ldyBBcnJheSgyNTYpO2dkKENkKTt2YXIgSWQ9bmV3IEFycmF5KDI5KTtnZChJZCk7dmFyIFRkLEJkLExkLFJkPW5ldyBBcnJheSh2ZCk7ZnVuY3Rpb24gTmQodCxlLHIsbixpKXt0aGlzLnN0YXRpY190cmVlPXQsdGhpcy5leHRyYV9iaXRzPWUsdGhpcy5leHRyYV9iYXNlPXIsdGhpcy5lbGVtcz1uLHRoaXMubWF4X2xlbmd0aD1pLHRoaXMuaGFzX3N0cmVlPXQmJnQubGVuZ3RofWZ1bmN0aW9uIHpkKHQsZSl7dGhpcy5keW5fdHJlZT10LHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz1lfWZ1bmN0aW9uIERkKHQpe3JldHVybiB0PDI1Nj9BZFt0XTpBZFsyNTYrKHQ+Pj43KV19ZnVuY3Rpb24gUGQodCxlKXt0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmZSx0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT1lPj4+OCYyNTV9ZnVuY3Rpb24gTWQodCxlLHIpe3QuYmlfdmFsaWQ+MTYtcj8odC5iaV9idWZ8PWU8PHQuYmlfdmFsaWQmNjU1MzUsUGQodCx0LmJpX2J1ZiksdC5iaV9idWY9ZT4+MTYtdC5iaV92YWxpZCx0LmJpX3ZhbGlkKz1yLTE2KToodC5iaV9idWZ8PWU8PHQuYmlfdmFsaWQmNjU1MzUsdC5iaV92YWxpZCs9cil9ZnVuY3Rpb24gRmQodCxlLHIpe01kKHQsclsyKmVdLHJbMiplKzFdKX1mdW5jdGlvbiBVZCh0LGUpe3ZhciByPTA7ZG97cnw9MSZ0LHQ+Pj49MSxyPDw9MX13aGlsZSgtLWU+MCk7cmV0dXJuIHI+Pj4xfWZ1bmN0aW9uIGpkKHQsZSxyKXt2YXIgbixpLG89bmV3IEFycmF5KDE2KSxzPTA7Zm9yKG49MTtuPD1iZDtuKyspb1tuXT1zPXMrcltuLTFdPDwxO2ZvcihpPTA7aTw9ZTtpKyspe3ZhciBhPXRbMippKzFdOzAhPT1hJiYodFsyKmldPVVkKG9bYV0rKyxhKSl9fWZ1bmN0aW9uIEhkKHQpe3ZhciBlO2ZvcihlPTA7ZTx5ZDtlKyspdC5keW5fbHRyZWVbMiplXT0wO2ZvcihlPTA7ZTx2ZDtlKyspdC5keW5fZHRyZWVbMiplXT0wO2ZvcihlPTA7ZTwxOTtlKyspdC5ibF90cmVlWzIqZV09MDt0LmR5bl9sdHJlZVs1MTJdPTEsdC5vcHRfbGVuPXQuc3RhdGljX2xlbj0wLHQubGFzdF9saXQ9dC5tYXRjaGVzPTB9ZnVuY3Rpb24gSmQodCl7dC5iaV92YWxpZD44P1BkKHQsdC5iaV9idWYpOnQuYmlfdmFsaWQ+MCYmKHQucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPXQuYmlfYnVmKSx0LmJpX2J1Zj0wLHQuYmlfdmFsaWQ9MH1mdW5jdGlvbiBLZCh0LGUscixuKXt2YXIgaT0yKmUsbz0yKnI7cmV0dXJuIHRbaV08dFtvXXx8dFtpXT09PXRbb10mJm5bZV08PW5bcl19ZnVuY3Rpb24gV2QodCxlLHIpe2Zvcih2YXIgbj10LmhlYXBbcl0saT1yPDwxO2k8PXQuaGVhcF9sZW4mJihpPHQuaGVhcF9sZW4mJktkKGUsdC5oZWFwW2krMV0sdC5oZWFwW2ldLHQuZGVwdGgpJiZpKyssIUtkKGUsbix0LmhlYXBbaV0sdC5kZXB0aCkpOyl0LmhlYXBbcl09dC5oZWFwW2ldLHI9aSxpPDw9MTt0LmhlYXBbcl09bn1mdW5jdGlvbiBaZCh0LGUscil7dmFyIG4saSxvLHMsYT0wO2lmKDAhPT10Lmxhc3RfbGl0KWRve249dC5wZW5kaW5nX2J1Zlt0LmRfYnVmKzIqYV08PDh8dC5wZW5kaW5nX2J1Zlt0LmRfYnVmKzIqYSsxXSxpPXQucGVuZGluZ19idWZbdC5sX2J1ZithXSxhKyssMD09PW4/RmQodCxpLGUpOihGZCh0LChvPUNkW2ldKSttZCsxLGUpLDAhPT0ocz13ZFtvXSkmJk1kKHQsaS09SWRbb10scyksRmQodCxvPURkKC0tbiksciksMCE9PShzPVNkW29dKSYmTWQodCxuLT1SZFtvXSxzKSl9d2hpbGUoYTx0Lmxhc3RfbGl0KTtGZCh0LDI1NixlKX1mdW5jdGlvbiBHZCh0LGUpe3ZhciByLG4saSxvPWUuZHluX3RyZWUscz1lLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxhPWUuc3RhdF9kZXNjLmhhc19zdHJlZSxjPWUuc3RhdF9kZXNjLmVsZW1zLHU9LTE7Zm9yKHQuaGVhcF9sZW49MCx0LmhlYXBfbWF4PTU3MyxyPTA7cjxjO3IrKykwIT09b1syKnJdPyh0LmhlYXBbKyt0LmhlYXBfbGVuXT11PXIsdC5kZXB0aFtyXT0wKTpvWzIqcisxXT0wO2Zvcig7dC5oZWFwX2xlbjwyOylvWzIqKGk9dC5oZWFwWysrdC5oZWFwX2xlbl09dTwyPysrdTowKV09MSx0LmRlcHRoW2ldPTAsdC5vcHRfbGVuLS0sYSYmKHQuc3RhdGljX2xlbi09c1syKmkrMV0pO2ZvcihlLm1heF9jb2RlPXUscj10LmhlYXBfbGVuPj4xO3I+PTE7ci0tKVdkKHQsbyxyKTtpPWM7ZG97cj10LmhlYXBbMV0sdC5oZWFwWzFdPXQuaGVhcFt0LmhlYXBfbGVuLS1dLFdkKHQsbywxKSxuPXQuaGVhcFsxXSx0LmhlYXBbLS10LmhlYXBfbWF4XT1yLHQuaGVhcFstLXQuaGVhcF9tYXhdPW4sb1syKmldPW9bMipyXStvWzIqbl0sdC5kZXB0aFtpXT0odC5kZXB0aFtyXT49dC5kZXB0aFtuXT90LmRlcHRoW3JdOnQuZGVwdGhbbl0pKzEsb1syKnIrMV09b1syKm4rMV09aSx0LmhlYXBbMV09aSsrLFdkKHQsbywxKX13aGlsZSh0LmhlYXBfbGVuPj0yKTt0LmhlYXBbLS10LmhlYXBfbWF4XT10LmhlYXBbMV0sZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYz1lLmR5bl90cmVlLHU9ZS5tYXhfY29kZSxsPWUuc3RhdF9kZXNjLnN0YXRpY190cmVlLGg9ZS5zdGF0X2Rlc2MuaGFzX3N0cmVlLGQ9ZS5zdGF0X2Rlc2MuZXh0cmFfYml0cyxmPWUuc3RhdF9kZXNjLmV4dHJhX2Jhc2UscD1lLnN0YXRfZGVzYy5tYXhfbGVuZ3RoLF89MDtmb3Iobz0wO288PWJkO28rKyl0LmJsX2NvdW50W29dPTA7Zm9yKGNbMip0LmhlYXBbdC5oZWFwX21heF0rMV09MCxyPXQuaGVhcF9tYXgrMTtyPDU3MztyKyspKG89Y1syKmNbMioobj10LmhlYXBbcl0pKzFdKzFdKzEpPnAmJihvPXAsXysrKSxjWzIqbisxXT1vLG4+dXx8KHQuYmxfY291bnRbb10rKyxzPTAsbj49ZiYmKHM9ZFtuLWZdKSxhPWNbMipuXSx0Lm9wdF9sZW4rPWEqKG8rcyksaCYmKHQuc3RhdGljX2xlbis9YSoobFsyKm4rMV0rcykpKTtpZigwIT09Xyl7ZG97Zm9yKG89cC0xOzA9PT10LmJsX2NvdW50W29dOylvLS07dC5ibF9jb3VudFtvXS0tLHQuYmxfY291bnRbbysxXSs9Mix0LmJsX2NvdW50W3BdLS0sXy09Mn13aGlsZShfPjApO2ZvcihvPXA7MCE9PW87by0tKWZvcihuPXQuYmxfY291bnRbb107MCE9PW47KShpPXQuaGVhcFstLXJdKT51fHwoY1syKmkrMV0hPT1vJiYodC5vcHRfbGVuKz0oby1jWzIqaSsxXSkqY1syKmldLGNbMippKzFdPW8pLG4tLSl9fSh0LGUpLGpkKG8sdSx0LmJsX2NvdW50KX1mdW5jdGlvbiBWZCh0LGUscil7dmFyIG4saSxvPS0xLHM9ZVsxXSxhPTAsYz03LHU9NDtmb3IoMD09PXMmJihjPTEzOCx1PTMpLGVbMioocisxKSsxXT02NTUzNSxuPTA7bjw9cjtuKyspaT1zLHM9ZVsyKihuKzEpKzFdLCsrYTxjJiZpPT09c3x8KGE8dT90LmJsX3RyZWVbMippXSs9YTowIT09aT8oaSE9PW8mJnQuYmxfdHJlZVsyKmldKyssdC5ibF90cmVlWzMyXSsrKTphPD0xMD90LmJsX3RyZWVbMzRdKys6dC5ibF90cmVlWzM2XSsrLGE9MCxvPWksMD09PXM/KGM9MTM4LHU9Myk6aT09PXM/KGM9Nix1PTMpOihjPTcsdT00KSl9ZnVuY3Rpb24gWGQodCxlLHIpe3ZhciBuLGksbz0tMSxzPWVbMV0sYT0wLGM9Nyx1PTQ7Zm9yKDA9PT1zJiYoYz0xMzgsdT0zKSxuPTA7bjw9cjtuKyspaWYoaT1zLHM9ZVsyKihuKzEpKzFdLCEoKythPGMmJmk9PT1zKSl7aWYoYTx1KWRve0ZkKHQsaSx0LmJsX3RyZWUpfXdoaWxlKDAhPS0tYSk7ZWxzZSAwIT09aT8oaSE9PW8mJihGZCh0LGksdC5ibF90cmVlKSxhLS0pLEZkKHQsMTYsdC5ibF90cmVlKSxNZCh0LGEtMywyKSk6YTw9MTA/KEZkKHQsMTcsdC5ibF90cmVlKSxNZCh0LGEtMywzKSk6KEZkKHQsMTgsdC5ibF90cmVlKSxNZCh0LGEtMTEsNykpO2E9MCxvPWksMD09PXM/KGM9MTM4LHU9Myk6aT09PXM/KGM9Nix1PTMpOihjPTcsdT00KX19Z2QoUmQpO3ZhciBZZD0hMTtmdW5jdGlvbiAkZCh0LGUscixuKXtNZCh0LDArKG4/MTowKSwzKSxmdW5jdGlvbih0LGUscixuKXtKZCh0KSxuJiYoUGQodCxyKSxQZCh0LH5yKSksX2QuYXJyYXlTZXQodC5wZW5kaW5nX2J1Zix0LndpbmRvdyxlLHIsdC5wZW5kaW5nKSx0LnBlbmRpbmcrPXJ9KHQsZSxyLCEwKX1wZC5fdHJfaW5pdD1mdW5jdGlvbih0KXtZZHx8KCFmdW5jdGlvbigpe3ZhciB0LGUscixuLGksbz1uZXcgQXJyYXkoMTYpO2ZvcihyPTAsbj0wO248Mjg7bisrKWZvcihJZFtuXT1yLHQ9MDt0PDE8PHdkW25dO3QrKylDZFtyKytdPW47Zm9yKENkW3ItMV09bixpPTAsbj0wO248MTY7bisrKWZvcihSZFtuXT1pLHQ9MDt0PDE8PFNkW25dO3QrKylBZFtpKytdPW47Zm9yKGk+Pj03O248dmQ7bisrKWZvcihSZFtuXT1pPDw3LHQ9MDt0PDE8PFNkW25dLTc7dCsrKUFkWzI1NitpKytdPW47Zm9yKGU9MDtlPD1iZDtlKyspb1tlXT0wO2Zvcih0PTA7dDw9MTQzOylFZFsyKnQrMV09OCx0Kyssb1s4XSsrO2Zvcig7dDw9MjU1OylFZFsyKnQrMV09OSx0Kyssb1s5XSsrO2Zvcig7dDw9Mjc5OylFZFsyKnQrMV09Nyx0Kyssb1s3XSsrO2Zvcig7dDw9Mjg3OylFZFsyKnQrMV09OCx0Kyssb1s4XSsrO2ZvcihqZChFZCwyODcsbyksdD0wO3Q8dmQ7dCsrKXhkWzIqdCsxXT01LHhkWzIqdF09VWQodCw1KTtUZD1uZXcgTmQoRWQsd2QsMjU3LHlkLGJkKSxCZD1uZXcgTmQoeGQsU2QsMCx2ZCxiZCksTGQ9bmV3IE5kKG5ldyBBcnJheSgwKSxrZCwwLDE5LDcpfSgpLFlkPSEwKSx0LmxfZGVzYz1uZXcgemQodC5keW5fbHRyZWUsVGQpLHQuZF9kZXNjPW5ldyB6ZCh0LmR5bl9kdHJlZSxCZCksdC5ibF9kZXNjPW5ldyB6ZCh0LmJsX3RyZWUsTGQpLHQuYmlfYnVmPTAsdC5iaV92YWxpZD0wLEhkKHQpfSxwZC5fdHJfc3RvcmVkX2Jsb2NrPSRkLHBkLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbih0LGUscixuKXt2YXIgaSxvLHM9MDt0LmxldmVsPjA/KDI9PT10LnN0cm0uZGF0YV90eXBlJiYodC5zdHJtLmRhdGFfdHlwZT1mdW5jdGlvbih0KXt2YXIgZSxyPTQwOTM2MjQ0NDc7Zm9yKGU9MDtlPD0zMTtlKysscj4+Pj0xKWlmKDEmciYmMCE9PXQuZHluX2x0cmVlWzIqZV0pcmV0dXJuIDA7aWYoMCE9PXQuZHluX2x0cmVlWzE4XXx8MCE9PXQuZHluX2x0cmVlWzIwXXx8MCE9PXQuZHluX2x0cmVlWzI2XSlyZXR1cm4gMTtmb3IoZT0zMjtlPG1kO2UrKylpZigwIT09dC5keW5fbHRyZWVbMiplXSlyZXR1cm4gMTtyZXR1cm4gMH0odCkpLEdkKHQsdC5sX2Rlc2MpLEdkKHQsdC5kX2Rlc2MpLHM9ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKFZkKHQsdC5keW5fbHRyZWUsdC5sX2Rlc2MubWF4X2NvZGUpLFZkKHQsdC5keW5fZHRyZWUsdC5kX2Rlc2MubWF4X2NvZGUpLEdkKHQsdC5ibF9kZXNjKSxlPTE4O2U+PTMmJjA9PT10LmJsX3RyZWVbMipPZFtlXSsxXTtlLS0pO3JldHVybiB0Lm9wdF9sZW4rPTMqKGUrMSkrNSs1KzQsZX0odCksaT10Lm9wdF9sZW4rMys3Pj4+Mywobz10LnN0YXRpY19sZW4rMys3Pj4+Myk8PWkmJihpPW8pKTppPW89cis1LHIrNDw9aSYmLTEhPT1lPyRkKHQsZSxyLG4pOjQ9PT10LnN0cmF0ZWd5fHxvPT09aT8oTWQodCwyKyhuPzE6MCksMyksWmQodCxFZCx4ZCkpOihNZCh0LDQrKG4/MTowKSwzKSxmdW5jdGlvbih0LGUscixuKXt2YXIgaTtmb3IoTWQodCxlLTI1Nyw1KSxNZCh0LHItMSw1KSxNZCh0LG4tNCw0KSxpPTA7aTxuO2krKylNZCh0LHQuYmxfdHJlZVsyKk9kW2ldKzFdLDMpO1hkKHQsdC5keW5fbHRyZWUsZS0xKSxYZCh0LHQuZHluX2R0cmVlLHItMSl9KHQsdC5sX2Rlc2MubWF4X2NvZGUrMSx0LmRfZGVzYy5tYXhfY29kZSsxLHMrMSksWmQodCx0LmR5bl9sdHJlZSx0LmR5bl9kdHJlZSkpLEhkKHQpLG4mJkpkKHQpfSxwZC5fdHJfdGFsbHk9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0LnBlbmRpbmdfYnVmW3QuZF9idWYrMip0Lmxhc3RfbGl0XT1lPj4+OCYyNTUsdC5wZW5kaW5nX2J1Zlt0LmRfYnVmKzIqdC5sYXN0X2xpdCsxXT0yNTUmZSx0LnBlbmRpbmdfYnVmW3QubF9idWYrdC5sYXN0X2xpdF09MjU1JnIsdC5sYXN0X2xpdCsrLDA9PT1lP3QuZHluX2x0cmVlWzIqcl0rKzoodC5tYXRjaGVzKyssZS0tLHQuZHluX2x0cmVlWzIqKENkW3JdK21kKzEpXSsrLHQuZHluX2R0cmVlWzIqRGQoZSldKyspLHQubGFzdF9saXQ9PT10LmxpdF9idWZzaXplLTF9LHBkLl90cl9hbGlnbj1mdW5jdGlvbih0KXtNZCh0LDIsMyksRmQodCwyNTYsRWQpLGZ1bmN0aW9uKHQpezE2PT09dC5iaV92YWxpZD8oUGQodCx0LmJpX2J1ZiksdC5iaV9idWY9MCx0LmJpX3ZhbGlkPTApOnQuYmlfdmFsaWQ+PTgmJih0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmdC5iaV9idWYsdC5iaV9idWY+Pj04LHQuYmlfdmFsaWQtPTgpfSh0KX07dmFyIHFkPWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT02NTUzNSZ0LG89dD4+PjE2JjY1NTM1LHM9MDswIT09cjspe3ItPXM9cj4yZTM/MmUzOnI7ZG97bz1vKyhpPWkrZVtuKytdfDApfDB9d2hpbGUoLS1zKTtpJT02NTUyMSxvJT02NTUyMX1yZXR1cm4gaXxvPDwxNn07dmFyIFFkPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9W10scj0wO3I8MjU2O3IrKyl7dD1yO2Zvcih2YXIgbj0wO248ODtuKyspdD0xJnQ/Mzk4ODI5MjM4NF50Pj4+MTp0Pj4+MTtlW3JdPXR9cmV0dXJuIGV9KCk7dmFyIHRmLGVmPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPVFkLG89bityO3RePS0xO2Zvcih2YXIgcz1uO3M8bztzKyspdD10Pj4+OF5pWzI1NSYodF5lW3NdKV07cmV0dXJufnR9LHJmPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sbmY9aGQsb2Y9cGQsc2Y9cWQsYWY9ZWYsY2Y9cmYsdWY9LTIsbGY9MjU4LGhmPTI2MixkZj0xMDMsZmY9MTEzLHBmPTY2NjtmdW5jdGlvbiBfZih0LGUpe3JldHVybiB0Lm1zZz1jZltlXSxlfWZ1bmN0aW9uIGdmKHQpe3JldHVybih0PDwxKS0odD40Pzk6MCl9ZnVuY3Rpb24gbWYodCl7Zm9yKHZhciBlPXQubGVuZ3RoOy0tZT49MDspdFtlXT0wfWZ1bmN0aW9uIHlmKHQpe3ZhciBlPXQuc3RhdGUscj1lLnBlbmRpbmc7cj50LmF2YWlsX291dCYmKHI9dC5hdmFpbF9vdXQpLDAhPT1yJiYobmYuYXJyYXlTZXQodC5vdXRwdXQsZS5wZW5kaW5nX2J1ZixlLnBlbmRpbmdfb3V0LHIsdC5uZXh0X291dCksdC5uZXh0X291dCs9cixlLnBlbmRpbmdfb3V0Kz1yLHQudG90YWxfb3V0Kz1yLHQuYXZhaWxfb3V0LT1yLGUucGVuZGluZy09ciwwPT09ZS5wZW5kaW5nJiYoZS5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gdmYodCxlKXtvZi5fdHJfZmx1c2hfYmxvY2sodCx0LmJsb2NrX3N0YXJ0Pj0wP3QuYmxvY2tfc3RhcnQ6LTEsdC5zdHJzdGFydC10LmJsb2NrX3N0YXJ0LGUpLHQuYmxvY2tfc3RhcnQ9dC5zdHJzdGFydCx5Zih0LnN0cm0pfWZ1bmN0aW9uIGJmKHQsZSl7dC5wZW5kaW5nX2J1Zlt0LnBlbmRpbmcrK109ZX1mdW5jdGlvbiB3Zih0LGUpe3QucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPWU+Pj44JjI1NSx0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmZX1mdW5jdGlvbiBTZih0LGUpe3ZhciByLG4saT10Lm1heF9jaGFpbl9sZW5ndGgsbz10LnN0cnN0YXJ0LHM9dC5wcmV2X2xlbmd0aCxhPXQubmljZV9tYXRjaCxjPXQuc3Ryc3RhcnQ+dC53X3NpemUtaGY/dC5zdHJzdGFydC0odC53X3NpemUtaGYpOjAsdT10LndpbmRvdyxsPXQud19tYXNrLGg9dC5wcmV2LGQ9dC5zdHJzdGFydCtsZixmPXVbbytzLTFdLHA9dVtvK3NdO3QucHJldl9sZW5ndGg+PXQuZ29vZF9tYXRjaCYmKGk+Pj0yKSxhPnQubG9va2FoZWFkJiYoYT10Lmxvb2thaGVhZCk7ZG97aWYodVsocj1lKStzXT09PXAmJnVbcitzLTFdPT09ZiYmdVtyXT09PXVbb10mJnVbKytyXT09PXVbbysxXSl7bys9MixyKys7ZG97fXdoaWxlKHVbKytvXT09PXVbKytyXSYmdVsrK29dPT09dVsrK3JdJiZ1Wysrb109PT11Wysrcl0mJnVbKytvXT09PXVbKytyXSYmdVsrK29dPT09dVsrK3JdJiZ1Wysrb109PT11Wysrcl0mJnVbKytvXT09PXVbKytyXSYmdVsrK29dPT09dVsrK3JdJiZvPGQpO2lmKG49bGYtKGQtbyksbz1kLWxmLG4+cyl7aWYodC5tYXRjaF9zdGFydD1lLHM9bixuPj1hKWJyZWFrO2Y9dVtvK3MtMV0scD11W28rc119fX13aGlsZSgoZT1oW2UmbF0pPmMmJjAhPS0taSk7cmV0dXJuIHM8PXQubG9va2FoZWFkP3M6dC5sb29rYWhlYWR9ZnVuY3Rpb24ga2YodCl7dmFyIGUscixuLGksbyxzLGEsYyx1LGwsaD10Lndfc2l6ZTtkb3tpZihpPXQud2luZG93X3NpemUtdC5sb29rYWhlYWQtdC5zdHJzdGFydCx0LnN0cnN0YXJ0Pj1oKyhoLWhmKSl7bmYuYXJyYXlTZXQodC53aW5kb3csdC53aW5kb3csaCxoLDApLHQubWF0Y2hfc3RhcnQtPWgsdC5zdHJzdGFydC09aCx0LmJsb2NrX3N0YXJ0LT1oLGU9cj10Lmhhc2hfc2l6ZTtkb3tuPXQuaGVhZFstLWVdLHQuaGVhZFtlXT1uPj1oP24taDowfXdoaWxlKC0tcik7ZT1yPWg7ZG97bj10LnByZXZbLS1lXSx0LnByZXZbZV09bj49aD9uLWg6MH13aGlsZSgtLXIpO2krPWh9aWYoMD09PXQuc3RybS5hdmFpbF9pbilicmVhaztpZihzPXQuc3RybSxhPXQud2luZG93LGM9dC5zdHJzdGFydCt0Lmxvb2thaGVhZCx1PWksbD12b2lkIDAsKGw9cy5hdmFpbF9pbik+dSYmKGw9dSkscj0wPT09bD8wOihzLmF2YWlsX2luLT1sLG5mLmFycmF5U2V0KGEscy5pbnB1dCxzLm5leHRfaW4sbCxjKSwxPT09cy5zdGF0ZS53cmFwP3MuYWRsZXI9c2Yocy5hZGxlcixhLGwsYyk6Mj09PXMuc3RhdGUud3JhcCYmKHMuYWRsZXI9YWYocy5hZGxlcixhLGwsYykpLHMubmV4dF9pbis9bCxzLnRvdGFsX2luKz1sLGwpLHQubG9va2FoZWFkKz1yLHQubG9va2FoZWFkK3QuaW5zZXJ0Pj0zKWZvcihvPXQuc3Ryc3RhcnQtdC5pbnNlcnQsdC5pbnNfaD10LndpbmRvd1tvXSx0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbbysxXSkmdC5oYXNoX21hc2s7dC5pbnNlcnQmJih0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbbyszLTFdKSZ0Lmhhc2hfbWFzayx0LnByZXZbbyZ0LndfbWFza109dC5oZWFkW3QuaW5zX2hdLHQuaGVhZFt0Lmluc19oXT1vLG8rKyx0Lmluc2VydC0tLCEodC5sb29rYWhlYWQrdC5pbnNlcnQ8MykpOyk7fXdoaWxlKHQubG9va2FoZWFkPGhmJiYwIT09dC5zdHJtLmF2YWlsX2luKX1mdW5jdGlvbiBPZih0LGUpe2Zvcih2YXIgcixuOzspe2lmKHQubG9va2FoZWFkPGhmKXtpZihrZih0KSx0Lmxvb2thaGVhZDxoZiYmMD09PWUpcmV0dXJuIDE7aWYoMD09PXQubG9va2FoZWFkKWJyZWFrfWlmKHI9MCx0Lmxvb2thaGVhZD49MyYmKHQuaW5zX2g9KHQuaW5zX2g8PHQuaGFzaF9zaGlmdF50LndpbmRvd1t0LnN0cnN0YXJ0KzMtMV0pJnQuaGFzaF9tYXNrLHI9dC5wcmV2W3Quc3Ryc3RhcnQmdC53X21hc2tdPXQuaGVhZFt0Lmluc19oXSx0LmhlYWRbdC5pbnNfaF09dC5zdHJzdGFydCksMCE9PXImJnQuc3Ryc3RhcnQtcjw9dC53X3NpemUtaGYmJih0Lm1hdGNoX2xlbmd0aD1TZih0LHIpKSx0Lm1hdGNoX2xlbmd0aD49MylpZihuPW9mLl90cl90YWxseSh0LHQuc3Ryc3RhcnQtdC5tYXRjaF9zdGFydCx0Lm1hdGNoX2xlbmd0aC0zKSx0Lmxvb2thaGVhZC09dC5tYXRjaF9sZW5ndGgsdC5tYXRjaF9sZW5ndGg8PXQubWF4X2xhenlfbWF0Y2gmJnQubG9va2FoZWFkPj0zKXt0Lm1hdGNoX2xlbmd0aC0tO2Rve3Quc3Ryc3RhcnQrKyx0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbdC5zdHJzdGFydCszLTFdKSZ0Lmhhc2hfbWFzayxyPXQucHJldlt0LnN0cnN0YXJ0JnQud19tYXNrXT10LmhlYWRbdC5pbnNfaF0sdC5oZWFkW3QuaW5zX2hdPXQuc3Ryc3RhcnR9d2hpbGUoMCE9LS10Lm1hdGNoX2xlbmd0aCk7dC5zdHJzdGFydCsrfWVsc2UgdC5zdHJzdGFydCs9dC5tYXRjaF9sZW5ndGgsdC5tYXRjaF9sZW5ndGg9MCx0Lmluc19oPXQud2luZG93W3Quc3Ryc3RhcnRdLHQuaW5zX2g9KHQuaW5zX2g8PHQuaGFzaF9zaGlmdF50LndpbmRvd1t0LnN0cnN0YXJ0KzFdKSZ0Lmhhc2hfbWFzaztlbHNlIG49b2YuX3RyX3RhbGx5KHQsMCx0LndpbmRvd1t0LnN0cnN0YXJ0XSksdC5sb29rYWhlYWQtLSx0LnN0cnN0YXJ0Kys7aWYobiYmKHZmKHQsITEpLDA9PT10LnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gdC5pbnNlcnQ9dC5zdHJzdGFydDwyP3Quc3Ryc3RhcnQ6Miw0PT09ZT8odmYodCwhMCksMD09PXQuc3RybS5hdmFpbF9vdXQ/Mzo0KTp0Lmxhc3RfbGl0JiYodmYodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpPzE6Mn1mdW5jdGlvbiBFZih0LGUpe2Zvcih2YXIgcixuLGk7Oyl7aWYodC5sb29rYWhlYWQ8aGYpe2lmKGtmKHQpLHQubG9va2FoZWFkPGhmJiYwPT09ZSlyZXR1cm4gMTtpZigwPT09dC5sb29rYWhlYWQpYnJlYWt9aWYocj0wLHQubG9va2FoZWFkPj0zJiYodC5pbnNfaD0odC5pbnNfaDw8dC5oYXNoX3NoaWZ0XnQud2luZG93W3Quc3Ryc3RhcnQrMy0xXSkmdC5oYXNoX21hc2sscj10LnByZXZbdC5zdHJzdGFydCZ0LndfbWFza109dC5oZWFkW3QuaW5zX2hdLHQuaGVhZFt0Lmluc19oXT10LnN0cnN0YXJ0KSx0LnByZXZfbGVuZ3RoPXQubWF0Y2hfbGVuZ3RoLHQucHJldl9tYXRjaD10Lm1hdGNoX3N0YXJ0LHQubWF0Y2hfbGVuZ3RoPTIsMCE9PXImJnQucHJldl9sZW5ndGg8dC5tYXhfbGF6eV9tYXRjaCYmdC5zdHJzdGFydC1yPD10Lndfc2l6ZS1oZiYmKHQubWF0Y2hfbGVuZ3RoPVNmKHQsciksdC5tYXRjaF9sZW5ndGg8PTUmJigxPT09dC5zdHJhdGVneXx8Mz09PXQubWF0Y2hfbGVuZ3RoJiZ0LnN0cnN0YXJ0LXQubWF0Y2hfc3RhcnQ+NDA5NikmJih0Lm1hdGNoX2xlbmd0aD0yKSksdC5wcmV2X2xlbmd0aD49MyYmdC5tYXRjaF9sZW5ndGg8PXQucHJldl9sZW5ndGgpe2k9dC5zdHJzdGFydCt0Lmxvb2thaGVhZC0zLG49b2YuX3RyX3RhbGx5KHQsdC5zdHJzdGFydC0xLXQucHJldl9tYXRjaCx0LnByZXZfbGVuZ3RoLTMpLHQubG9va2FoZWFkLT10LnByZXZfbGVuZ3RoLTEsdC5wcmV2X2xlbmd0aC09Mjtkb3srK3Quc3Ryc3RhcnQ8PWkmJih0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbdC5zdHJzdGFydCszLTFdKSZ0Lmhhc2hfbWFzayxyPXQucHJldlt0LnN0cnN0YXJ0JnQud19tYXNrXT10LmhlYWRbdC5pbnNfaF0sdC5oZWFkW3QuaW5zX2hdPXQuc3Ryc3RhcnQpfXdoaWxlKDAhPS0tdC5wcmV2X2xlbmd0aCk7aWYodC5tYXRjaF9hdmFpbGFibGU9MCx0Lm1hdGNoX2xlbmd0aD0yLHQuc3Ryc3RhcnQrKyxuJiYodmYodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfWVsc2UgaWYodC5tYXRjaF9hdmFpbGFibGUpe2lmKChuPW9mLl90cl90YWxseSh0LDAsdC53aW5kb3dbdC5zdHJzdGFydC0xXSkpJiZ2Zih0LCExKSx0LnN0cnN0YXJ0KyssdC5sb29rYWhlYWQtLSwwPT09dC5zdHJtLmF2YWlsX291dClyZXR1cm4gMX1lbHNlIHQubWF0Y2hfYXZhaWxhYmxlPTEsdC5zdHJzdGFydCsrLHQubG9va2FoZWFkLS19cmV0dXJuIHQubWF0Y2hfYXZhaWxhYmxlJiYobj1vZi5fdHJfdGFsbHkodCwwLHQud2luZG93W3Quc3Ryc3RhcnQtMV0pLHQubWF0Y2hfYXZhaWxhYmxlPTApLHQuaW5zZXJ0PXQuc3Ryc3RhcnQ8Mj90LnN0cnN0YXJ0OjIsND09PWU/KHZmKHQsITApLDA9PT10LnN0cm0uYXZhaWxfb3V0PzM6NCk6dC5sYXN0X2xpdCYmKHZmKHQsITEpLDA9PT10LnN0cm0uYXZhaWxfb3V0KT8xOjJ9ZnVuY3Rpb24geGYodCxlLHIsbixpKXt0aGlzLmdvb2RfbGVuZ3RoPXQsdGhpcy5tYXhfbGF6eT1lLHRoaXMubmljZV9sZW5ndGg9cix0aGlzLm1heF9jaGFpbj1uLHRoaXMuZnVuYz1pfWZ1bmN0aW9uIEFmKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9OCx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgbmYuQnVmMTYoMTE0NiksdGhpcy5keW5fZHRyZWU9bmV3IG5mLkJ1ZjE2KDEyMiksdGhpcy5ibF90cmVlPW5ldyBuZi5CdWYxNig3OCksbWYodGhpcy5keW5fbHRyZWUpLG1mKHRoaXMuZHluX2R0cmVlKSxtZih0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBuZi5CdWYxNigxNiksdGhpcy5oZWFwPW5ldyBuZi5CdWYxNig1NzMpLG1mKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBuZi5CdWYxNig1NzMpLG1mKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIENmKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPyh0LnRvdGFsX2luPXQudG90YWxfb3V0PTAsdC5kYXRhX3R5cGU9MiwoZT10LnN0YXRlKS5wZW5kaW5nPTAsZS5wZW5kaW5nX291dD0wLGUud3JhcDwwJiYoZS53cmFwPS1lLndyYXApLGUuc3RhdHVzPWUud3JhcD80MjpmZix0LmFkbGVyPTI9PT1lLndyYXA/MDoxLGUubGFzdF9mbHVzaD0wLG9mLl90cl9pbml0KGUpLDApOl9mKHQsdWYpfWZ1bmN0aW9uIElmKHQpe3ZhciBlLHI9Q2YodCk7cmV0dXJuIDA9PT1yJiYoKGU9dC5zdGF0ZSkud2luZG93X3NpemU9MiplLndfc2l6ZSxtZihlLmhlYWQpLGUubWF4X2xhenlfbWF0Y2g9dGZbZS5sZXZlbF0ubWF4X2xhenksZS5nb29kX21hdGNoPXRmW2UubGV2ZWxdLmdvb2RfbGVuZ3RoLGUubmljZV9tYXRjaD10ZltlLmxldmVsXS5uaWNlX2xlbmd0aCxlLm1heF9jaGFpbl9sZW5ndGg9dGZbZS5sZXZlbF0ubWF4X2NoYWluLGUuc3Ryc3RhcnQ9MCxlLmJsb2NrX3N0YXJ0PTAsZS5sb29rYWhlYWQ9MCxlLmluc2VydD0wLGUubWF0Y2hfbGVuZ3RoPWUucHJldl9sZW5ndGg9MixlLm1hdGNoX2F2YWlsYWJsZT0wLGUuaW5zX2g9MCkscn1mdW5jdGlvbiBUZih0LGUscixuLGksbyl7aWYoIXQpcmV0dXJuIHVmO3ZhciBzPTE7aWYoLTE9PT1lJiYoZT02KSxuPDA/KHM9MCxuPS1uKTpuPjE1JiYocz0yLG4tPTE2KSxpPDF8fGk+OXx8OCE9PXJ8fG48OHx8bj4xNXx8ZTwwfHxlPjl8fG88MHx8bz40KXJldHVybiBfZih0LHVmKTs4PT09biYmKG49OSk7dmFyIGE9bmV3IEFmO3JldHVybiB0LnN0YXRlPWEsYS5zdHJtPXQsYS53cmFwPXMsYS5nemhlYWQ9bnVsbCxhLndfYml0cz1uLGEud19zaXplPTE8PGEud19iaXRzLGEud19tYXNrPWEud19zaXplLTEsYS5oYXNoX2JpdHM9aSs3LGEuaGFzaF9zaXplPTE8PGEuaGFzaF9iaXRzLGEuaGFzaF9tYXNrPWEuaGFzaF9zaXplLTEsYS5oYXNoX3NoaWZ0PX5+KChhLmhhc2hfYml0cyszLTEpLzMpLGEud2luZG93PW5ldyBuZi5CdWY4KDIqYS53X3NpemUpLGEuaGVhZD1uZXcgbmYuQnVmMTYoYS5oYXNoX3NpemUpLGEucHJldj1uZXcgbmYuQnVmMTYoYS53X3NpemUpLGEubGl0X2J1ZnNpemU9MTw8aSs2LGEucGVuZGluZ19idWZfc2l6ZT00KmEubGl0X2J1ZnNpemUsYS5wZW5kaW5nX2J1Zj1uZXcgbmYuQnVmOChhLnBlbmRpbmdfYnVmX3NpemUpLGEuZF9idWY9MSphLmxpdF9idWZzaXplLGEubF9idWY9MyphLmxpdF9idWZzaXplLGEubGV2ZWw9ZSxhLnN0cmF0ZWd5PW8sYS5tZXRob2Q9cixJZih0KX10Zj1bbmV3IHhmKDAsMCwwLDAsKGZ1bmN0aW9uKHQsZSl7dmFyIHI9NjU1MzU7Zm9yKHI+dC5wZW5kaW5nX2J1Zl9zaXplLTUmJihyPXQucGVuZGluZ19idWZfc2l6ZS01KTs7KXtpZih0Lmxvb2thaGVhZDw9MSl7aWYoa2YodCksMD09PXQubG9va2FoZWFkJiYwPT09ZSlyZXR1cm4gMTtpZigwPT09dC5sb29rYWhlYWQpYnJlYWt9dC5zdHJzdGFydCs9dC5sb29rYWhlYWQsdC5sb29rYWhlYWQ9MDt2YXIgbj10LmJsb2NrX3N0YXJ0K3I7aWYoKDA9PT10LnN0cnN0YXJ0fHx0LnN0cnN0YXJ0Pj1uKSYmKHQubG9va2FoZWFkPXQuc3Ryc3RhcnQtbix0LnN0cnN0YXJ0PW4sdmYodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxO2lmKHQuc3Ryc3RhcnQtdC5ibG9ja19zdGFydD49dC53X3NpemUtaGYmJih2Zih0LCExKSwwPT09dC5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDF9cmV0dXJuIHQuaW5zZXJ0PTAsND09PWU/KHZmKHQsITApLDA9PT10LnN0cm0uYXZhaWxfb3V0PzM6NCk6KHQuc3Ryc3RhcnQ+dC5ibG9ja19zdGFydCYmKHZmKHQsITEpLHQuc3RybS5hdmFpbF9vdXQpLDEpfSkpLG5ldyB4Zig0LDQsOCw0LE9mKSxuZXcgeGYoNCw1LDE2LDgsT2YpLG5ldyB4Zig0LDYsMzIsMzIsT2YpLG5ldyB4Zig0LDQsMTYsMTYsRWYpLG5ldyB4Zig4LDE2LDMyLDMyLEVmKSxuZXcgeGYoOCwxNiwxMjgsMTI4LEVmKSxuZXcgeGYoOCwzMiwxMjgsMjU2LEVmKSxuZXcgeGYoMzIsMTI4LDI1OCwxMDI0LEVmKSxuZXcgeGYoMzIsMjU4LDI1OCw0MDk2LEVmKV0sZmQuZGVmbGF0ZUluaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGYodCxlLDgsMTUsOCwwKX0sZmQuZGVmbGF0ZUluaXQyPVRmLGZkLmRlZmxhdGVSZXNldD1JZixmZC5kZWZsYXRlUmVzZXRLZWVwPUNmLGZkLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5zdGF0ZT8yIT09dC5zdGF0ZS53cmFwP3VmOih0LnN0YXRlLmd6aGVhZD1lLDApOnVmfSxmZC5kZWZsYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLG87aWYoIXR8fCF0LnN0YXRlfHxlPjV8fGU8MClyZXR1cm4gdD9fZih0LHVmKTp1ZjtpZihuPXQuc3RhdGUsIXQub3V0cHV0fHwhdC5pbnB1dCYmMCE9PXQuYXZhaWxfaW58fG4uc3RhdHVzPT09cGYmJjQhPT1lKXJldHVybiBfZih0LDA9PT10LmF2YWlsX291dD8tNTp1Zik7aWYobi5zdHJtPXQscj1uLmxhc3RfZmx1c2gsbi5sYXN0X2ZsdXNoPWUsNDI9PT1uLnN0YXR1cylpZigyPT09bi53cmFwKXQuYWRsZXI9MCxiZihuLDMxKSxiZihuLDEzOSksYmYobiw4KSxuLmd6aGVhZD8oYmYobiwobi5nemhlYWQudGV4dD8xOjApKyhuLmd6aGVhZC5oY3JjPzI6MCkrKG4uZ3poZWFkLmV4dHJhPzQ6MCkrKG4uZ3poZWFkLm5hbWU/ODowKSsobi5nemhlYWQuY29tbWVudD8xNjowKSksYmYobiwyNTUmbi5nemhlYWQudGltZSksYmYobixuLmd6aGVhZC50aW1lPj44JjI1NSksYmYobixuLmd6aGVhZC50aW1lPj4xNiYyNTUpLGJmKG4sbi5nemhlYWQudGltZT4+MjQmMjU1KSxiZihuLDk9PT1uLmxldmVsPzI6bi5zdHJhdGVneT49Mnx8bi5sZXZlbDwyPzQ6MCksYmYobiwyNTUmbi5nemhlYWQub3MpLG4uZ3poZWFkLmV4dHJhJiZuLmd6aGVhZC5leHRyYS5sZW5ndGgmJihiZihuLDI1NSZuLmd6aGVhZC5leHRyYS5sZW5ndGgpLGJmKG4sbi5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLG4uZ3poZWFkLmhjcmMmJih0LmFkbGVyPWFmKHQuYWRsZXIsbi5wZW5kaW5nX2J1ZixuLnBlbmRpbmcsMCkpLG4uZ3ppbmRleD0wLG4uc3RhdHVzPTY5KTooYmYobiwwKSxiZihuLDApLGJmKG4sMCksYmYobiwwKSxiZihuLDApLGJmKG4sOT09PW4ubGV2ZWw/MjpuLnN0cmF0ZWd5Pj0yfHxuLmxldmVsPDI/NDowKSxiZihuLDMpLG4uc3RhdHVzPWZmKTtlbHNle3ZhciBzPTgrKG4ud19iaXRzLTg8PDQpPDw4O3N8PShuLnN0cmF0ZWd5Pj0yfHxuLmxldmVsPDI/MDpuLmxldmVsPDY/MTo2PT09bi5sZXZlbD8yOjMpPDw2LDAhPT1uLnN0cnN0YXJ0JiYoc3w9MzIpLHMrPTMxLXMlMzEsbi5zdGF0dXM9ZmYsd2YobixzKSwwIT09bi5zdHJzdGFydCYmKHdmKG4sdC5hZGxlcj4+PjE2KSx3ZihuLDY1NTM1JnQuYWRsZXIpKSx0LmFkbGVyPTF9aWYoNjk9PT1uLnN0YXR1cylpZihuLmd6aGVhZC5leHRyYSl7Zm9yKGk9bi5wZW5kaW5nO24uZ3ppbmRleDwoNjU1MzUmbi5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKG4ucGVuZGluZyE9PW4ucGVuZGluZ19idWZfc2l6ZXx8KG4uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYodC5hZGxlcj1hZih0LmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLHlmKHQpLGk9bi5wZW5kaW5nLG4ucGVuZGluZyE9PW4ucGVuZGluZ19idWZfc2l6ZSkpOyliZihuLDI1NSZuLmd6aGVhZC5leHRyYVtuLmd6aW5kZXhdKSxuLmd6aW5kZXgrKztuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKHQuYWRsZXI9YWYodC5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSxuLmd6aW5kZXg9PT1uLmd6aGVhZC5leHRyYS5sZW5ndGgmJihuLmd6aW5kZXg9MCxuLnN0YXR1cz03Myl9ZWxzZSBuLnN0YXR1cz03MztpZig3Mz09PW4uc3RhdHVzKWlmKG4uZ3poZWFkLm5hbWUpe2k9bi5wZW5kaW5nO2Rve2lmKG4ucGVuZGluZz09PW4ucGVuZGluZ19idWZfc2l6ZSYmKG4uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYodC5hZGxlcj1hZih0LmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLHlmKHQpLGk9bi5wZW5kaW5nLG4ucGVuZGluZz09PW4ucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31vPW4uZ3ppbmRleDxuLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmbi5nemhlYWQubmFtZS5jaGFyQ29kZUF0KG4uZ3ppbmRleCsrKTowLGJmKG4sbyl9d2hpbGUoMCE9PW8pO24uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYodC5hZGxlcj1hZih0LmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLDA9PT1vJiYobi5nemluZGV4PTAsbi5zdGF0dXM9OTEpfWVsc2Ugbi5zdGF0dXM9OTE7aWYoOTE9PT1uLnN0YXR1cylpZihuLmd6aGVhZC5jb21tZW50KXtpPW4ucGVuZGluZztkb3tpZihuLnBlbmRpbmc9PT1uLnBlbmRpbmdfYnVmX3NpemUmJihuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKHQuYWRsZXI9YWYodC5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSx5Zih0KSxpPW4ucGVuZGluZyxuLnBlbmRpbmc9PT1uLnBlbmRpbmdfYnVmX3NpemUpKXtvPTE7YnJlYWt9bz1uLmd6aW5kZXg8bi5nemhlYWQuY29tbWVudC5sZW5ndGg/MjU1Jm4uZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChuLmd6aW5kZXgrKyk6MCxiZihuLG8pfXdoaWxlKDAhPT1vKTtuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKHQuYWRsZXI9YWYodC5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSwwPT09byYmKG4uc3RhdHVzPWRmKX1lbHNlIG4uc3RhdHVzPWRmO2lmKG4uc3RhdHVzPT09ZGYmJihuLmd6aGVhZC5oY3JjPyhuLnBlbmRpbmcrMj5uLnBlbmRpbmdfYnVmX3NpemUmJnlmKHQpLG4ucGVuZGluZysyPD1uLnBlbmRpbmdfYnVmX3NpemUmJihiZihuLDI1NSZ0LmFkbGVyKSxiZihuLHQuYWRsZXI+PjgmMjU1KSx0LmFkbGVyPTAsbi5zdGF0dXM9ZmYpKTpuLnN0YXR1cz1mZiksMCE9PW4ucGVuZGluZyl7aWYoeWYodCksMD09PXQuYXZhaWxfb3V0KXJldHVybiBuLmxhc3RfZmx1c2g9LTEsMH1lbHNlIGlmKDA9PT10LmF2YWlsX2luJiZnZihlKTw9Z2YocikmJjQhPT1lKXJldHVybiBfZih0LC01KTtpZihuLnN0YXR1cz09PXBmJiYwIT09dC5hdmFpbF9pbilyZXR1cm4gX2YodCwtNSk7aWYoMCE9PXQuYXZhaWxfaW58fDAhPT1uLmxvb2thaGVhZHx8MCE9PWUmJm4uc3RhdHVzIT09cGYpe3ZhciBhPTI9PT1uLnN0cmF0ZWd5P2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciByOzspe2lmKDA9PT10Lmxvb2thaGVhZCYmKGtmKHQpLDA9PT10Lmxvb2thaGVhZCkpe2lmKDA9PT1lKXJldHVybiAxO2JyZWFrfWlmKHQubWF0Y2hfbGVuZ3RoPTAscj1vZi5fdHJfdGFsbHkodCwwLHQud2luZG93W3Quc3Ryc3RhcnRdKSx0Lmxvb2thaGVhZC0tLHQuc3Ryc3RhcnQrKyxyJiYodmYodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiB0Lmluc2VydD0wLDQ9PT1lPyh2Zih0LCEwKSwwPT09dC5zdHJtLmF2YWlsX291dD8zOjQpOnQubGFzdF9saXQmJih2Zih0LCExKSwwPT09dC5zdHJtLmF2YWlsX291dCk/MToyfShuLGUpOjM9PT1uLnN0cmF0ZWd5P2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvLHM9dC53aW5kb3c7Oyl7aWYodC5sb29rYWhlYWQ8PWxmKXtpZihrZih0KSx0Lmxvb2thaGVhZDw9bGYmJjA9PT1lKXJldHVybiAxO2lmKDA9PT10Lmxvb2thaGVhZClicmVha31pZih0Lm1hdGNoX2xlbmd0aD0wLHQubG9va2FoZWFkPj0zJiZ0LnN0cnN0YXJ0PjAmJihuPXNbaT10LnN0cnN0YXJ0LTFdKT09PXNbKytpXSYmbj09PXNbKytpXSYmbj09PXNbKytpXSl7bz10LnN0cnN0YXJ0K2xmO2Rve313aGlsZShuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZpPG8pO3QubWF0Y2hfbGVuZ3RoPWxmLShvLWkpLHQubWF0Y2hfbGVuZ3RoPnQubG9va2FoZWFkJiYodC5tYXRjaF9sZW5ndGg9dC5sb29rYWhlYWQpfWlmKHQubWF0Y2hfbGVuZ3RoPj0zPyhyPW9mLl90cl90YWxseSh0LDEsdC5tYXRjaF9sZW5ndGgtMyksdC5sb29rYWhlYWQtPXQubWF0Y2hfbGVuZ3RoLHQuc3Ryc3RhcnQrPXQubWF0Y2hfbGVuZ3RoLHQubWF0Y2hfbGVuZ3RoPTApOihyPW9mLl90cl90YWxseSh0LDAsdC53aW5kb3dbdC5zdHJzdGFydF0pLHQubG9va2FoZWFkLS0sdC5zdHJzdGFydCsrKSxyJiYodmYodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiB0Lmluc2VydD0wLDQ9PT1lPyh2Zih0LCEwKSwwPT09dC5zdHJtLmF2YWlsX291dD8zOjQpOnQubGFzdF9saXQmJih2Zih0LCExKSwwPT09dC5zdHJtLmF2YWlsX291dCk/MToyfShuLGUpOnRmW24ubGV2ZWxdLmZ1bmMobixlKTtpZigzIT09YSYmNCE9PWF8fChuLnN0YXR1cz1wZiksMT09PWF8fDM9PT1hKXJldHVybiAwPT09dC5hdmFpbF9vdXQmJihuLmxhc3RfZmx1c2g9LTEpLDA7aWYoMj09PWEmJigxPT09ZT9vZi5fdHJfYWxpZ24obik6NSE9PWUmJihvZi5fdHJfc3RvcmVkX2Jsb2NrKG4sMCwwLCExKSwzPT09ZSYmKG1mKG4uaGVhZCksMD09PW4ubG9va2FoZWFkJiYobi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSkpLHlmKHQpLDA9PT10LmF2YWlsX291dCkpcmV0dXJuIG4ubGFzdF9mbHVzaD0tMSwwfXJldHVybiA0IT09ZT8wOm4ud3JhcDw9MD8xOigyPT09bi53cmFwPyhiZihuLDI1NSZ0LmFkbGVyKSxiZihuLHQuYWRsZXI+PjgmMjU1KSxiZihuLHQuYWRsZXI+PjE2JjI1NSksYmYobix0LmFkbGVyPj4yNCYyNTUpLGJmKG4sMjU1JnQudG90YWxfaW4pLGJmKG4sdC50b3RhbF9pbj4+OCYyNTUpLGJmKG4sdC50b3RhbF9pbj4+MTYmMjU1KSxiZihuLHQudG90YWxfaW4+PjI0JjI1NSkpOih3ZihuLHQuYWRsZXI+Pj4xNiksd2Yobiw2NTUzNSZ0LmFkbGVyKSkseWYodCksbi53cmFwPjAmJihuLndyYXA9LW4ud3JhcCksMCE9PW4ucGVuZGluZz8wOjEpfSxmZC5kZWZsYXRlRW5kPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPzQyIT09KGU9dC5zdGF0ZS5zdGF0dXMpJiY2OSE9PWUmJjczIT09ZSYmOTEhPT1lJiZlIT09ZGYmJmUhPT1mZiYmZSE9PXBmP19mKHQsdWYpOih0LnN0YXRlPW51bGwsZT09PWZmP19mKHQsLTMpOjApOnVmfSxmZC5kZWZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxvLHMsYSxjLHUsbD1lLmxlbmd0aDtpZighdHx8IXQuc3RhdGUpcmV0dXJuIHVmO2lmKDI9PT0obz0ocj10LnN0YXRlKS53cmFwKXx8MT09PW8mJjQyIT09ci5zdGF0dXN8fHIubG9va2FoZWFkKXJldHVybiB1Zjtmb3IoMT09PW8mJih0LmFkbGVyPXNmKHQuYWRsZXIsZSxsLDApKSxyLndyYXA9MCxsPj1yLndfc2l6ZSYmKDA9PT1vJiYobWYoci5oZWFkKSxyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApLHU9bmV3IG5mLkJ1Zjgoci53X3NpemUpLG5mLmFycmF5U2V0KHUsZSxsLXIud19zaXplLHIud19zaXplLDApLGU9dSxsPXIud19zaXplKSxzPXQuYXZhaWxfaW4sYT10Lm5leHRfaW4sYz10LmlucHV0LHQuYXZhaWxfaW49bCx0Lm5leHRfaW49MCx0LmlucHV0PWUsa2Yocik7ci5sb29rYWhlYWQ+PTM7KXtuPXIuc3Ryc3RhcnQsaT1yLmxvb2thaGVhZC0yO2Rve3IuaW5zX2g9KHIuaW5zX2g8PHIuaGFzaF9zaGlmdF5yLndpbmRvd1tuKzMtMV0pJnIuaGFzaF9tYXNrLHIucHJldltuJnIud19tYXNrXT1yLmhlYWRbci5pbnNfaF0sci5oZWFkW3IuaW5zX2hdPW4sbisrfXdoaWxlKC0taSk7ci5zdHJzdGFydD1uLHIubG9va2FoZWFkPTIsa2Yocil9cmV0dXJuIHIuc3Ryc3RhcnQrPXIubG9va2FoZWFkLHIuYmxvY2tfc3RhcnQ9ci5zdHJzdGFydCxyLmluc2VydD1yLmxvb2thaGVhZCxyLmxvb2thaGVhZD0wLHIubWF0Y2hfbGVuZ3RoPXIucHJldl9sZW5ndGg9MixyLm1hdGNoX2F2YWlsYWJsZT0wLHQubmV4dF9pbj1hLHQuaW5wdXQ9Yyx0LmF2YWlsX2luPXMsci53cmFwPW8sMH0sZmQuZGVmbGF0ZUluZm89InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiO3ZhciBCZj17fSxMZj1oZCxSZj0hMCxOZj0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2gocm0pe1JmPSExfXRyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKHJtKXtOZj0hMX1mb3IodmFyIHpmPW5ldyBMZi5CdWY4KDI1NiksRGY9MDtEZjwyNTY7RGYrKyl6ZltEZl09RGY+PTI1Mj82OkRmPj0yNDg/NTpEZj49MjQwPzQ6RGY+PTIyND8zOkRmPj0xOTI/MjoxO2Z1bmN0aW9uIFBmKHQsZSl7aWYoZTw2NTUzNCYmKHQuc3ViYXJyYXkmJk5mfHwhdC5zdWJhcnJheSYmUmYpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsTGYuc2hyaW5rQnVmKHQsZSkpO2Zvcih2YXIgcj0iIixuPTA7bjxlO24rKylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbbl0pO3JldHVybiByfXpmWzI1NF09emZbMjU0XT0xLEJmLnN0cmluZzJidWY9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxzPXQubGVuZ3RoLGE9MDtmb3IoaT0wO2k8cztpKyspNTUyOTY9PSg2NDUxMiYocj10LmNoYXJDb2RlQXQoaSkpKSYmaSsxPHMmJjU2MzIwPT0oNjQ1MTImKG49dC5jaGFyQ29kZUF0KGkrMSkpKSYmKHI9NjU1MzYrKHItNTUyOTY8PDEwKSsobi01NjMyMCksaSsrKSxhKz1yPDEyOD8xOnI8MjA0OD8yOnI8NjU1MzY/Mzo0O2ZvcihlPW5ldyBMZi5CdWY4KGEpLG89MCxpPTA7bzxhO2krKyk1NTI5Nj09KDY0NTEyJihyPXQuY2hhckNvZGVBdChpKSkpJiZpKzE8cyYmNTYzMjA9PSg2NDUxMiYobj10LmNoYXJDb2RlQXQoaSsxKSkpJiYocj02NTUzNisoci01NTI5Njw8MTApKyhuLTU2MzIwKSxpKyspLHI8MTI4P2VbbysrXT1yOnI8MjA0OD8oZVtvKytdPTE5MnxyPj4+NixlW28rK109MTI4fDYzJnIpOnI8NjU1MzY/KGVbbysrXT0yMjR8cj4+PjEyLGVbbysrXT0xMjh8cj4+PjYmNjMsZVtvKytdPTEyOHw2MyZyKTooZVtvKytdPTI0MHxyPj4+MTgsZVtvKytdPTEyOHxyPj4+MTImNjMsZVtvKytdPTEyOHxyPj4+NiY2MyxlW28rK109MTI4fDYzJnIpO3JldHVybiBlfSxCZi5idWYyYmluc3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBQZih0LHQubGVuZ3RoKX0sQmYuYmluc3RyaW5nMmJ1Zj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IExmLkJ1ZjgodC5sZW5ndGgpLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspZVtyXT10LmNoYXJDb2RlQXQocik7cmV0dXJuIGV9LEJmLmJ1ZjJzdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzPWV8fHQubGVuZ3RoLGE9bmV3IEFycmF5KDIqcyk7Zm9yKG49MCxyPTA7cjxzOylpZigoaT10W3IrK10pPDEyOClhW24rK109aTtlbHNlIGlmKChvPXpmW2ldKT40KWFbbisrXT02NTUzMyxyKz1vLTE7ZWxzZXtmb3IoaSY9Mj09PW8/MzE6Mz09PW8/MTU6NztvPjEmJnI8czspaT1pPDw2fDYzJnRbcisrXSxvLS07bz4xP2FbbisrXT02NTUzMzppPDY1NTM2P2FbbisrXT1pOihpLT02NTUzNixhW24rK109NTUyOTZ8aT4+MTAmMTAyMyxhW24rK109NTYzMjB8MTAyMyZpKX1yZXR1cm4gUGYoYSxuKX0sQmYudXRmOGJvcmRlcj1mdW5jdGlvbih0LGUpe3ZhciByO2ZvcigoZT1lfHx0Lmxlbmd0aCk+dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxyPWUtMTtyPj0wJiYxMjg9PSgxOTImdFtyXSk7KXItLTtyZXR1cm4gcjwwfHwwPT09cj9lOnIremZbdFtyXV0+ZT9yOmV9O3ZhciBNZj1mdW5jdGlvbigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9LEZmPWZkLFVmPWhkLGpmPUJmLEhmPXJmLEpmPU1mLEtmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gV2YodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgV2YpKXJldHVybiBuZXcgV2YodCk7dGhpcy5vcHRpb25zPVVmLmFzc2lnbih7bGV2ZWw6LTEsbWV0aG9kOjgsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTowLHRvOiIifSx0fHx7fSk7dmFyIGU9dGhpcy5vcHRpb25zO2UucmF3JiZlLndpbmRvd0JpdHM+MD9lLndpbmRvd0JpdHM9LWUud2luZG93Qml0czplLmd6aXAmJmUud2luZG93Qml0cz4wJiZlLndpbmRvd0JpdHM8MTYmJihlLndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBKZix0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIHI9RmYuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSxlLmxldmVsLGUubWV0aG9kLGUud2luZG93Qml0cyxlLm1lbUxldmVsLGUuc3RyYXRlZ3kpO2lmKDAhPT1yKXRocm93IG5ldyBFcnJvcihIZltyXSk7aWYoZS5oZWFkZXImJkZmLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLGUuaGVhZGVyKSxlLmRpY3Rpb25hcnkpe3ZhciBuO2lmKG49InN0cmluZyI9PXR5cGVvZiBlLmRpY3Rpb25hcnk/amYuc3RyaW5nMmJ1ZihlLmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1LZi5jYWxsKGUuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkoZS5kaWN0aW9uYXJ5KTplLmRpY3Rpb25hcnksMCE9PShyPUZmLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxuKSkpdGhyb3cgbmV3IEVycm9yKEhmW3JdKTt0aGlzLl9kaWN0X3NldD0hMH19ZnVuY3Rpb24gWmYodCxlKXt2YXIgcj1uZXcgV2YoZSk7aWYoci5wdXNoKHQsITApLHIuZXJyKXRocm93IHIubXNnfHxIZltyLmVycl07cmV0dXJuIHIucmVzdWx0fVdmLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPXRoaXMuc3RybSxvPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtuPWU9PT1+fmU/ZTohMD09PWU/NDowLCJzdHJpbmciPT10eXBlb2YgdD9pLmlucHV0PWpmLnN0cmluZzJidWYodCk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUtmLmNhbGwodCk/aS5pbnB1dD1uZXcgVWludDhBcnJheSh0KTppLmlucHV0PXQsaS5uZXh0X2luPTAsaS5hdmFpbF9pbj1pLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09aS5hdmFpbF9vdXQmJihpLm91dHB1dD1uZXcgVWYuQnVmOChvKSxpLm5leHRfb3V0PTAsaS5hdmFpbF9vdXQ9byksMSE9PShyPUZmLmRlZmxhdGUoaSxuKSkmJjAhPT1yKXJldHVybiB0aGlzLm9uRW5kKHIpLHRoaXMuZW5kZWQ9ITAsITE7MCE9PWkuYXZhaWxfb3V0JiYoMCE9PWkuYXZhaWxfaW58fDQhPT1uJiYyIT09bil8fCgic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLm9uRGF0YShqZi5idWYyYmluc3RyaW5nKFVmLnNocmlua0J1ZihpLm91dHB1dCxpLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKFVmLnNocmlua0J1ZihpLm91dHB1dCxpLm5leHRfb3V0KSkpfXdoaWxlKChpLmF2YWlsX2luPjB8fDA9PT1pLmF2YWlsX291dCkmJjEhPT1yKTtyZXR1cm4gND09PW4/KHI9RmYuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQociksdGhpcy5lbmRlZD0hMCwwPT09cik6MiE9PW58fCh0aGlzLm9uRW5kKDApLGkuYXZhaWxfb3V0PTAsITApfSxXZi5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHQpe3RoaXMuY2h1bmtzLnB1c2godCl9LFdmLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXswPT09dCYmKCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PVVmLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj10LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LGRkLkRlZmxhdGU9V2YsZGQuZGVmbGF0ZT1aZixkZC5kZWZsYXRlUmF3PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8e30pLnJhdz0hMCxaZih0LGUpfSxkZC5nemlwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8e30pLmd6aXA9ITAsWmYodCxlKX07dmFyIEdmPXt9LFZmPW90LFhmPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZmxhZ3M7cmV0dXJuIHZvaWQgMCE9PWV8fCJmbGFncyJpbiBrbHx8YmwodCwiZmxhZ3MiKXx8IXdsKGtsLHQpP2U6dmwoU2wsdCl9LFlmPVJlZ0V4cC5wcm90b3R5cGUsJGY9ZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1ZZnx8VmYoWWYsdCk/WGYodCk6dC5mbGFnc30pKSxxZj17fSxRZj1oZCx0cD0xNSxlcD1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLHJwPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sbnA9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLGlwPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sb3A9aGQsc3A9cWQsYXA9ZWYsY3A9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYyx1LGwsaCxkLGYscCxfLGcsbSx5LHYsYix3LFMsayxPLEUseDtyPXQuc3RhdGUsbj10Lm5leHRfaW4sRT10LmlucHV0LGk9bisodC5hdmFpbF9pbi01KSxvPXQubmV4dF9vdXQseD10Lm91dHB1dCxzPW8tKGUtdC5hdmFpbF9vdXQpLGE9bysodC5hdmFpbF9vdXQtMjU3KSxjPXIuZG1heCx1PXIud3NpemUsbD1yLndoYXZlLGg9ci53bmV4dCxkPXIud2luZG93LGY9ci5ob2xkLHA9ci5iaXRzLF89ci5sZW5jb2RlLGc9ci5kaXN0Y29kZSxtPSgxPDxyLmxlbmJpdHMpLTEseT0oMTw8ci5kaXN0Yml0cyktMTt0OmRve3A8MTUmJihmKz1FW24rK108PHAscCs9OCxmKz1FW24rK108PHAscCs9OCksdj1fW2YmbV07ZTpmb3IoOzspe2lmKGY+Pj49Yj12Pj4+MjQscC09YiwwPT09KGI9dj4+PjE2JjI1NSkpeFtvKytdPTY1NTM1JnY7ZWxzZXtpZighKDE2JmIpKXtpZig2NCZiKXtpZigzMiZiKXtyLm1vZGU9MTI7YnJlYWsgdH10Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9MzA7YnJlYWsgdH12PV9bKDY1NTM1JnYpKyhmJigxPDxiKS0xKV07Y29udGludWUgZX1mb3Iodz02NTUzNSZ2LChiJj0xNSkmJihwPGImJihmKz1FW24rK108PHAscCs9OCksdys9ZiYoMTw8YiktMSxmPj4+PWIscC09YikscDwxNSYmKGYrPUVbbisrXTw8cCxwKz04LGYrPUVbbisrXTw8cCxwKz04KSx2PWdbZiZ5XTs7KXtpZihmPj4+PWI9dj4+PjI0LHAtPWIsMTYmKGI9dj4+PjE2JjI1NSkpe2lmKFM9NjU1MzUmdixwPChiJj0xNSkmJihmKz1FW24rK108PHAsKHArPTgpPGImJihmKz1FW24rK108PHAscCs9OCkpLChTKz1mJigxPDxiKS0xKT5jKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT0zMDticmVhayB0fWlmKGY+Pj49YixwLT1iLFM+KGI9by1zKSl7aWYoKGI9Uy1iKT5sJiZyLnNhbmUpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPTMwO2JyZWFrIHR9aWYoaz0wLE89ZCwwPT09aCl7aWYoays9dS1iLGI8dyl7dy09Yjtkb3t4W28rK109ZFtrKytdfXdoaWxlKC0tYik7az1vLVMsTz14fX1lbHNlIGlmKGg8Yil7aWYoays9dStoLWIsKGItPWgpPHcpe3ctPWI7ZG97eFtvKytdPWRbaysrXX13aGlsZSgtLWIpO2lmKGs9MCxoPHcpe3ctPWI9aDtkb3t4W28rK109ZFtrKytdfXdoaWxlKC0tYik7az1vLVMsTz14fX19ZWxzZSBpZihrKz1oLWIsYjx3KXt3LT1iO2Rve3hbbysrXT1kW2srK119d2hpbGUoLS1iKTtrPW8tUyxPPXh9Zm9yKDt3PjI7KXhbbysrXT1PW2srK10seFtvKytdPU9baysrXSx4W28rK109T1trKytdLHctPTM7dyYmKHhbbysrXT1PW2srK10sdz4xJiYoeFtvKytdPU9baysrXSkpfWVsc2V7az1vLVM7ZG97eFtvKytdPXhbaysrXSx4W28rK109eFtrKytdLHhbbysrXT14W2srK10sdy09M313aGlsZSh3PjIpO3cmJih4W28rK109eFtrKytdLHc+MSYmKHhbbysrXT14W2srK10pKX1icmVha31pZig2NCZiKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixyLm1vZGU9MzA7YnJlYWsgdH12PWdbKDY1NTM1JnYpKyhmJigxPDxiKS0xKV19fWJyZWFrfX13aGlsZShuPGkmJm88YSk7bi09dz1wPj4zLGYmPSgxPDwocC09dzw8MykpLTEsdC5uZXh0X2luPW4sdC5uZXh0X291dD1vLHQuYXZhaWxfaW49bjxpP2ktbis1OjUtKG4taSksdC5hdmFpbF9vdXQ9bzxhP2EtbysyNTc6MjU3LShvLWEpLHIuaG9sZD1mLHIuYml0cz1wfSx1cD1mdW5jdGlvbih0LGUscixuLGksbyxzLGEpe3ZhciBjLHUsbCxoLGQsZixwLF8sZyxtPWEuYml0cyx5PTAsdj0wLGI9MCx3PTAsUz0wLGs9MCxPPTAsRT0wLHg9MCxBPTAsQz1udWxsLEk9MCxUPW5ldyBRZi5CdWYxNigxNiksQj1uZXcgUWYuQnVmMTYoMTYpLEw9bnVsbCxSPTA7Zm9yKHk9MDt5PD10cDt5KyspVFt5XT0wO2Zvcih2PTA7djxuO3YrKylUW2Vbcit2XV0rKztmb3IoUz1tLHc9dHA7dz49MSYmMD09PVRbd107dy0tKTtpZihTPncmJihTPXcpLDA9PT13KXJldHVybiBpW28rK109MjA5NzE1MjAsaVtvKytdPTIwOTcxNTIwLGEuYml0cz0xLDA7Zm9yKGI9MTtiPHcmJjA9PT1UW2JdO2IrKyk7Zm9yKFM8YiYmKFM9YiksRT0xLHk9MTt5PD10cDt5KyspaWYoRTw8PTEsKEUtPVRbeV0pPDApcmV0dXJuLTE7aWYoRT4wJiYoMD09PXR8fDEhPT13KSlyZXR1cm4tMTtmb3IoQlsxXT0wLHk9MTt5PHRwO3krKylCW3krMV09Qlt5XStUW3ldO2Zvcih2PTA7djxuO3YrKykwIT09ZVtyK3ZdJiYoc1tCW2Vbcit2XV0rK109dik7aWYoMD09PXQ/KEM9TD1zLGY9MTkpOjE9PT10PyhDPWVwLEktPTI1NyxMPXJwLFItPTI1NyxmPTI1Nik6KEM9bnAsTD1pcCxmPS0xKSxBPTAsdj0wLHk9YixkPW8saz1TLE89MCxsPS0xLGg9KHg9MTw8UyktMSwxPT09dCYmeD44NTJ8fDI9PT10JiZ4PjU5MilyZXR1cm4gMTtmb3IoOzspe3A9eS1PLHNbdl08Zj8oXz0wLGc9c1t2XSk6c1t2XT5mPyhfPUxbUitzW3ZdXSxnPUNbSStzW3ZdXSk6KF89OTYsZz0wKSxjPTE8PHktTyxiPXU9MTw8aztkb3tpW2QrKEE+Pk8pKyh1LT1jKV09cDw8MjR8Xzw8MTZ8Z313aGlsZSgwIT09dSk7Zm9yKGM9MTw8eS0xO0EmYzspYz4+PTE7aWYoMCE9PWM/KEEmPWMtMSxBKz1jKTpBPTAsdisrLDA9PS0tVFt5XSl7aWYoeT09PXcpYnJlYWs7eT1lW3Irc1t2XV19aWYoeT5TJiYoQSZoKSE9PWwpe2ZvcigwPT09TyYmKE89UyksZCs9YixFPTE8PChrPXktTyk7aytPPHcmJiEoKEUtPVRbaytPXSk8PTApOylrKyssRTw8PTE7aWYoeCs9MTw8aywxPT09dCYmeD44NTJ8fDI9PT10JiZ4PjU5MilyZXR1cm4gMTtpW2w9QSZoXT1TPDwyNHxrPDwxNnxkLW99fXJldHVybiAwIT09QSYmKGlbZCtBXT15LU88PDI0fDY0PDwxNiksYS5iaXRzPVMsMH0sbHA9LTIsaHA9MTIsZHA9MzA7ZnVuY3Rpb24gZnAodCl7cmV0dXJuKHQ+Pj4yNCYyNTUpKyh0Pj4+OCY2NTI4MCkrKCg2NTI4MCZ0KTw8OCkrKCgyNTUmdCk8PDI0KX1mdW5jdGlvbiBwcCgpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgb3AuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IG9wLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIF9wKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPyhlPXQuc3RhdGUsdC50b3RhbF9pbj10LnRvdGFsX291dD1lLnRvdGFsPTAsdC5tc2c9IiIsZS53cmFwJiYodC5hZGxlcj0xJmUud3JhcCksZS5tb2RlPTEsZS5sYXN0PTAsZS5oYXZlZGljdD0wLGUuZG1heD0zMjc2OCxlLmhlYWQ9bnVsbCxlLmhvbGQ9MCxlLmJpdHM9MCxlLmxlbmNvZGU9ZS5sZW5keW49bmV3IG9wLkJ1ZjMyKDg1MiksZS5kaXN0Y29kZT1lLmRpc3RkeW49bmV3IG9wLkJ1ZjMyKDU5MiksZS5zYW5lPTEsZS5iYWNrPS0xLDApOmxwfWZ1bmN0aW9uIGdwKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPygoZT10LnN0YXRlKS53c2l6ZT0wLGUud2hhdmU9MCxlLnduZXh0PTAsX3AodCkpOmxwfWZ1bmN0aW9uIG1wKHQsZSl7dmFyIHIsbjtyZXR1cm4gdCYmdC5zdGF0ZT8obj10LnN0YXRlLGU8MD8ocj0wLGU9LWUpOihyPTErKGU+PjQpLGU8NDgmJihlJj0xNSkpLGUmJihlPDh8fGU+MTUpP2xwOihudWxsIT09bi53aW5kb3cmJm4ud2JpdHMhPT1lJiYobi53aW5kb3c9bnVsbCksbi53cmFwPXIsbi53Yml0cz1lLGdwKHQpKSk6bHB9ZnVuY3Rpb24geXAodCxlKXt2YXIgcixuO3JldHVybiB0PyhuPW5ldyBwcCx0LnN0YXRlPW4sbi53aW5kb3c9bnVsbCwwIT09KHI9bXAodCxlKSkmJih0LnN0YXRlPW51bGwpLHIpOmxwfXZhciB2cCxicCx3cD0hMDtmdW5jdGlvbiBTcCh0KXtpZih3cCl7dmFyIGU7Zm9yKHZwPW5ldyBvcC5CdWYzMig1MTIpLGJwPW5ldyBvcC5CdWYzMigzMiksZT0wO2U8MTQ0Oyl0LmxlbnNbZSsrXT04O2Zvcig7ZTwyNTY7KXQubGVuc1tlKytdPTk7Zm9yKDtlPDI4MDspdC5sZW5zW2UrK109Nztmb3IoO2U8Mjg4Oyl0LmxlbnNbZSsrXT04O2Zvcih1cCgxLHQubGVucywwLDI4OCx2cCwwLHQud29yayx7Yml0czo5fSksZT0wO2U8MzI7KXQubGVuc1tlKytdPTU7dXAoMix0LmxlbnMsMCwzMixicCwwLHQud29yayx7Yml0czo1fSksd3A9ITF9dC5sZW5jb2RlPXZwLHQubGVuYml0cz05LHQuZGlzdGNvZGU9YnAsdC5kaXN0Yml0cz01fWZ1bmN0aW9uIGtwKHQsZSxyLG4pe3ZhciBpLG89dC5zdGF0ZTtyZXR1cm4gbnVsbD09PW8ud2luZG93JiYoby53c2l6ZT0xPDxvLndiaXRzLG8ud25leHQ9MCxvLndoYXZlPTAsby53aW5kb3c9bmV3IG9wLkJ1Zjgoby53c2l6ZSkpLG4+PW8ud3NpemU/KG9wLmFycmF5U2V0KG8ud2luZG93LGUsci1vLndzaXplLG8ud3NpemUsMCksby53bmV4dD0wLG8ud2hhdmU9by53c2l6ZSk6KChpPW8ud3NpemUtby53bmV4dCk+biYmKGk9biksb3AuYXJyYXlTZXQoby53aW5kb3csZSxyLW4saSxvLnduZXh0KSwobi09aSk/KG9wLmFycmF5U2V0KG8ud2luZG93LGUsci1uLG4sMCksby53bmV4dD1uLG8ud2hhdmU9by53c2l6ZSk6KG8ud25leHQrPWksby53bmV4dD09PW8ud3NpemUmJihvLnduZXh0PTApLG8ud2hhdmU8by53c2l6ZSYmKG8ud2hhdmUrPWkpKSksMH1xZi5pbmZsYXRlUmVzZXQ9Z3AscWYuaW5mbGF0ZVJlc2V0Mj1tcCxxZi5pbmZsYXRlUmVzZXRLZWVwPV9wLHFmLmluZmxhdGVJbml0PWZ1bmN0aW9uKHQpe3JldHVybiB5cCh0LDE1KX0scWYuaW5mbGF0ZUluaXQyPXlwLHFmLmluZmxhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYyx1LGwsaCxkLGYscCxfLGcsbSx5LHYsYix3LFMsayxPLEUseD0wLEE9bmV3IG9wLkJ1ZjgoNCksQz1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIXR8fCF0LnN0YXRlfHwhdC5vdXRwdXR8fCF0LmlucHV0JiYwIT09dC5hdmFpbF9pbilyZXR1cm4gbHA7KHI9dC5zdGF0ZSkubW9kZT09PWhwJiYoci5tb2RlPTEzKSxzPXQubmV4dF9vdXQsaT10Lm91dHB1dCxjPXQuYXZhaWxfb3V0LG89dC5uZXh0X2luLG49dC5pbnB1dCxhPXQuYXZhaWxfaW4sdT1yLmhvbGQsbD1yLmJpdHMsaD1hLGQ9YyxrPTA7dDpmb3IoOzspc3dpdGNoKHIubW9kZSl7Y2FzZSAxOmlmKDA9PT1yLndyYXApe3IubW9kZT0xMzticmVha31mb3IoO2w8MTY7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZigyJnIud3JhcCYmMzU2MTU9PT11KXtyLmNoZWNrPTAsQVswXT0yNTUmdSxBWzFdPXU+Pj44JjI1NSxyLmNoZWNrPWFwKHIuY2hlY2ssQSwyLDApLHU9MCxsPTAsci5tb2RlPTI7YnJlYWt9aWYoci5mbGFncz0wLHIuaGVhZCYmKHIuaGVhZC5kb25lPSExKSwhKDEmci53cmFwKXx8KCgoMjU1JnUpPDw4KSsodT4+OCkpJTMxKXt0Lm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsci5tb2RlPWRwO2JyZWFrfWlmKDghPSgxNSZ1KSl7dC5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixyLm1vZGU9ZHA7YnJlYWt9aWYobC09NCxTPTgrKDE1Jih1Pj4+PTQpKSwwPT09ci53Yml0cylyLndiaXRzPVM7ZWxzZSBpZihTPnIud2JpdHMpe3QubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixyLm1vZGU9ZHA7YnJlYWt9ci5kbWF4PTE8PFMsdC5hZGxlcj1yLmNoZWNrPTEsci5tb2RlPTUxMiZ1PzEwOmhwLHU9MCxsPTA7YnJlYWs7Y2FzZSAyOmZvcig7bDwxNjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWlmKHIuZmxhZ3M9dSw4IT0oMjU1JiRmKHIpKSl7dC5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixyLm1vZGU9ZHA7YnJlYWt9aWYoNTczNDQmJGYocikpe3QubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLHIubW9kZT1kcDticmVha31yLmhlYWQmJihyLmhlYWQudGV4dD11Pj44JjEpLDUxMiYkZihyKSYmKEFbMF09MjU1JnUsQVsxXT11Pj4+OCYyNTUsci5jaGVjaz1hcChyLmNoZWNrLEEsMiwwKSksdT0wLGw9MCxyLm1vZGU9MztjYXNlIDM6Zm9yKDtsPDMyOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5oZWFkJiYoci5oZWFkLnRpbWU9dSksNTEyJiRmKHIpJiYoQVswXT0yNTUmdSxBWzFdPXU+Pj44JjI1NSxBWzJdPXU+Pj4xNiYyNTUsQVszXT11Pj4+MjQmMjU1LHIuY2hlY2s9YXAoci5jaGVjayxBLDQsMCkpLHU9MCxsPTAsci5tb2RlPTQ7Y2FzZSA0OmZvcig7bDwxNjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fXIuaGVhZCYmKHIuaGVhZC54ZmxhZ3M9MjU1JnUsci5oZWFkLm9zPXU+PjgpLDUxMiYkZihyKSYmKEFbMF09MjU1JnUsQVsxXT11Pj4+OCYyNTUsci5jaGVjaz1hcChyLmNoZWNrLEEsMiwwKSksdT0wLGw9MCxyLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCYkZihyKSl7Zm9yKDtsPDE2Oyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5sZW5ndGg9dSxyLmhlYWQmJihyLmhlYWQuZXh0cmFfbGVuPXUpLDUxMiYkZihyKSYmKEFbMF09MjU1JnUsQVsxXT11Pj4+OCYyNTUsci5jaGVjaz1hcChyLmNoZWNrLEEsMiwwKSksdT0wLGw9MH1lbHNlIHIuaGVhZCYmKHIuaGVhZC5leHRyYT1udWxsKTtyLm1vZGU9NjtjYXNlIDY6aWYoMTAyNCYkZihyKSYmKChmPXIubGVuZ3RoKT5hJiYoZj1hKSxmJiYoci5oZWFkJiYoUz1yLmhlYWQuZXh0cmFfbGVuLXIubGVuZ3RoLHIuaGVhZC5leHRyYXx8KHIuaGVhZC5leHRyYT1uZXcgQXJyYXkoci5oZWFkLmV4dHJhX2xlbikpLG9wLmFycmF5U2V0KHIuaGVhZC5leHRyYSxuLG8sZixTKSksNTEyJiRmKHIpJiYoci5jaGVjaz1hcChyLmNoZWNrLG4sZixvKSksYS09ZixvKz1mLHIubGVuZ3RoLT1mKSxyLmxlbmd0aCkpYnJlYWsgdDtyLmxlbmd0aD0wLHIubW9kZT03O2Nhc2UgNzppZigyMDQ4JiRmKHIpKXtpZigwPT09YSlicmVhayB0O2Y9MDtkb3tTPW5bbytmKytdLHIuaGVhZCYmUyYmci5sZW5ndGg8NjU1MzYmJihyLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShTKSl9d2hpbGUoUyYmZjxhKTtpZig1MTImJGYocikmJihyLmNoZWNrPWFwKHIuY2hlY2ssbixmLG8pKSxhLT1mLG8rPWYsUylicmVhayB0fWVsc2Ugci5oZWFkJiYoci5oZWFkLm5hbWU9bnVsbCk7ci5sZW5ndGg9MCxyLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiYkZihyKSl7aWYoMD09PWEpYnJlYWsgdDtmPTA7ZG97Uz1uW28rZisrXSxyLmhlYWQmJlMmJnIubGVuZ3RoPDY1NTM2JiYoci5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoUykpfXdoaWxlKFMmJmY8YSk7aWYoNTEyJiRmKHIpJiYoci5jaGVjaz1hcChyLmNoZWNrLG4sZixvKSksYS09ZixvKz1mLFMpYnJlYWsgdH1lbHNlIHIuaGVhZCYmKHIuaGVhZC5jb21tZW50PW51bGwpO3IubW9kZT05O2Nhc2UgOTppZig1MTImJGYocikpe2Zvcig7bDwxNjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWlmKHUhPT0oNjU1MzUmci5jaGVjaykpe3QubXNnPSJoZWFkZXIgY3JjIG1pc21hdGNoIixyLm1vZGU9ZHA7YnJlYWt9dT0wLGw9MH1yLmhlYWQmJihyLmhlYWQuaGNyYz0kZihyKT4+OSYxLHIuaGVhZC5kb25lPSEwKSx0LmFkbGVyPXIuY2hlY2s9MCxyLm1vZGU9aHA7YnJlYWs7Y2FzZSAxMDpmb3IoO2w8MzI7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH10LmFkbGVyPXIuY2hlY2s9ZnAodSksdT0wLGw9MCxyLm1vZGU9MTE7Y2FzZSAxMTppZigwPT09ci5oYXZlZGljdClyZXR1cm4gdC5uZXh0X291dD1zLHQuYXZhaWxfb3V0PWMsdC5uZXh0X2luPW8sdC5hdmFpbF9pbj1hLHIuaG9sZD11LHIuYml0cz1sLDI7dC5hZGxlcj1yLmNoZWNrPTEsci5tb2RlPWhwO2Nhc2UgaHA6aWYoNT09PWV8fDY9PT1lKWJyZWFrIHQ7Y2FzZSAxMzppZihyLmxhc3Qpe3U+Pj49NyZsLGwtPTcmbCxyLm1vZGU9Mjc7YnJlYWt9Zm9yKDtsPDM7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1zd2l0Y2goci5sYXN0PTEmdSxsLT0xLDMmKHU+Pj49MSkpe2Nhc2UgMDpyLm1vZGU9MTQ7YnJlYWs7Y2FzZSAxOmlmKFNwKHIpLHIubW9kZT0yMCw2PT09ZSl7dT4+Pj0yLGwtPTI7YnJlYWsgdH1icmVhaztjYXNlIDI6ci5tb2RlPTE3O2JyZWFrO2Nhc2UgMzp0Lm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixyLm1vZGU9ZHB9dT4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSAxNDpmb3IodT4+Pj03JmwsbC09NyZsO2w8MzI7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZigoNjU1MzUmdSkhPSh1Pj4+MTZeNjU1MzUpKXt0Lm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsci5tb2RlPWRwO2JyZWFrfWlmKHIubGVuZ3RoPTY1NTM1JnUsdT0wLGw9MCxyLm1vZGU9MTUsNj09PWUpYnJlYWsgdDtjYXNlIDE1OnIubW9kZT0xNjtjYXNlIDE2OmlmKGY9ci5sZW5ndGgpe2lmKGY+YSYmKGY9YSksZj5jJiYoZj1jKSwwPT09ZilicmVhayB0O29wLmFycmF5U2V0KGksbixvLGYscyksYS09ZixvKz1mLGMtPWYscys9ZixyLmxlbmd0aC09ZjticmVha31yLm1vZGU9aHA7YnJlYWs7Y2FzZSAxNzpmb3IoO2w8MTQ7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZihyLm5sZW49MjU3KygzMSZ1KSx1Pj4+PTUsbC09NSxyLm5kaXN0PTErKDMxJnUpLHU+Pj49NSxsLT01LHIubmNvZGU9NCsoMTUmdSksdT4+Pj00LGwtPTQsci5ubGVuPjI4Nnx8ci5uZGlzdD4zMCl7dC5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixyLm1vZGU9ZHA7YnJlYWt9ci5oYXZlPTAsci5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtyLmhhdmU8ci5uY29kZTspe2Zvcig7bDwzOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5sZW5zW0Nbci5oYXZlKytdXT03JnUsdT4+Pj0zLGwtPTN9Zm9yKDtyLmhhdmU8MTk7KXIubGVuc1tDW3IuaGF2ZSsrXV09MDtpZihyLmxlbmNvZGU9ci5sZW5keW4sci5sZW5iaXRzPTcsTz17Yml0czpyLmxlbmJpdHN9LGs9dXAoMCxyLmxlbnMsMCwxOSxyLmxlbmNvZGUsMCxyLndvcmssTyksci5sZW5iaXRzPU8uYml0cyxrKXt0Lm1zZz0iaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IixyLm1vZGU9ZHA7YnJlYWt9ci5oYXZlPTAsci5tb2RlPTE5O2Nhc2UgMTk6Zm9yKDtyLmhhdmU8ci5ubGVuK3IubmRpc3Q7KXtmb3IoO209KHg9ci5sZW5jb2RlW3UmKDE8PHIubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmeCwhKChnPXg+Pj4yNCk8PWwpOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9aWYoeTwxNil1Pj4+PWcsbC09ZyxyLmxlbnNbci5oYXZlKytdPXk7ZWxzZXtpZigxNj09PXkpe2ZvcihFPWcrMjtsPEU7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZih1Pj4+PWcsbC09ZywwPT09ci5oYXZlKXt0Lm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsci5tb2RlPWRwO2JyZWFrfVM9ci5sZW5zW3IuaGF2ZS0xXSxmPTMrKDMmdSksdT4+Pj0yLGwtPTJ9ZWxzZSBpZigxNz09PXkpe2ZvcihFPWcrMztsPEU7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1sLT1nLFM9MCxmPTMrKDcmKHU+Pj49ZykpLHU+Pj49MyxsLT0zfWVsc2V7Zm9yKEU9Zys3O2w8RTspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWwtPWcsUz0wLGY9MTErKDEyNyYodT4+Pj1nKSksdT4+Pj03LGwtPTd9aWYoci5oYXZlK2Y+ci5ubGVuK3IubmRpc3Qpe3QubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixyLm1vZGU9ZHA7YnJlYWt9Zm9yKDtmLS07KXIubGVuc1tyLmhhdmUrK109U319aWYoci5tb2RlPT09ZHApYnJlYWs7aWYoMD09PXIubGVuc1syNTZdKXt0Lm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixyLm1vZGU9ZHA7YnJlYWt9aWYoci5sZW5iaXRzPTksTz17Yml0czpyLmxlbmJpdHN9LGs9dXAoMSxyLmxlbnMsMCxyLm5sZW4sci5sZW5jb2RlLDAsci53b3JrLE8pLHIubGVuYml0cz1PLmJpdHMsayl7dC5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsci5tb2RlPWRwO2JyZWFrfWlmKHIuZGlzdGJpdHM9NixyLmRpc3Rjb2RlPXIuZGlzdGR5bixPPXtiaXRzOnIuZGlzdGJpdHN9LGs9dXAoMixyLmxlbnMsci5ubGVuLHIubmRpc3Qsci5kaXN0Y29kZSwwLHIud29yayxPKSxyLmRpc3RiaXRzPU8uYml0cyxrKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixyLm1vZGU9ZHA7YnJlYWt9aWYoci5tb2RlPTIwLDY9PT1lKWJyZWFrIHQ7Y2FzZSAyMDpyLm1vZGU9MjE7Y2FzZSAyMTppZihhPj02JiZjPj0yNTgpe3QubmV4dF9vdXQ9cyx0LmF2YWlsX291dD1jLHQubmV4dF9pbj1vLHQuYXZhaWxfaW49YSxyLmhvbGQ9dSxyLmJpdHM9bCxjcCh0LGQpLHM9dC5uZXh0X291dCxpPXQub3V0cHV0LGM9dC5hdmFpbF9vdXQsbz10Lm5leHRfaW4sbj10LmlucHV0LGE9dC5hdmFpbF9pbix1PXIuaG9sZCxsPXIuYml0cyxyLm1vZGU9PT1ocCYmKHIuYmFjaz0tMSk7YnJlYWt9Zm9yKHIuYmFjaz0wO209KHg9ci5sZW5jb2RlW3UmKDE8PHIubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmeCwhKChnPXg+Pj4yNCk8PWwpOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9aWYobSYmISgyNDAmbSkpe2Zvcih2PWcsYj1tLHc9eTttPSh4PXIubGVuY29kZVt3KygodSYoMTw8ditiKS0xKT4+dildKT4+PjE2JjI1NSx5PTY1NTM1JngsISh2KyhnPXg+Pj4yNCk8PWwpOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9dT4+Pj12LGwtPXYsci5iYWNrKz12fWlmKHU+Pj49ZyxsLT1nLHIuYmFjays9ZyxyLmxlbmd0aD15LDA9PT1tKXtyLm1vZGU9MjY7YnJlYWt9aWYoMzImbSl7ci5iYWNrPS0xLHIubW9kZT1ocDticmVha31pZig2NCZtKXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9ZHA7YnJlYWt9ci5leHRyYT0xNSZtLHIubW9kZT0yMjtjYXNlIDIyOmlmKHIuZXh0cmEpe2ZvcihFPXIuZXh0cmE7bDxFOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5sZW5ndGgrPXUmKDE8PHIuZXh0cmEpLTEsdT4+Pj1yLmV4dHJhLGwtPXIuZXh0cmEsci5iYWNrKz1yLmV4dHJhfXIud2FzPXIubGVuZ3RoLHIubW9kZT0yMztjYXNlIDIzOmZvcig7bT0oeD1yLmRpc3Rjb2RlW3UmKDE8PHIuZGlzdGJpdHMpLTFdKT4+PjE2JjI1NSx5PTY1NTM1JngsISgoZz14Pj4+MjQpPD1sKTspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWlmKCEoMjQwJm0pKXtmb3Iodj1nLGI9bSx3PXk7bT0oeD1yLmRpc3Rjb2RlW3crKCh1JigxPDx2K2IpLTEpPj52KV0pPj4+MTYmMjU1LHk9NjU1MzUmeCwhKHYrKGc9eD4+PjI0KTw9bCk7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH11Pj4+PXYsbC09dixyLmJhY2srPXZ9aWYodT4+Pj1nLGwtPWcsci5iYWNrKz1nLDY0Jm0pe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHIubW9kZT1kcDticmVha31yLm9mZnNldD15LHIuZXh0cmE9MTUmbSxyLm1vZGU9MjQ7Y2FzZSAyNDppZihyLmV4dHJhKXtmb3IoRT1yLmV4dHJhO2w8RTspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fXIub2Zmc2V0Kz11JigxPDxyLmV4dHJhKS0xLHU+Pj49ci5leHRyYSxsLT1yLmV4dHJhLHIuYmFjays9ci5leHRyYX1pZihyLm9mZnNldD5yLmRtYXgpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPWRwO2JyZWFrfXIubW9kZT0yNTtjYXNlIDI1OmlmKDA9PT1jKWJyZWFrIHQ7aWYoZj1kLWMsci5vZmZzZXQ+Zil7aWYoKGY9ci5vZmZzZXQtZik+ci53aGF2ZSYmci5zYW5lKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT1kcDticmVha31mPnIud25leHQ/KGYtPXIud25leHQscD1yLndzaXplLWYpOnA9ci53bmV4dC1mLGY+ci5sZW5ndGgmJihmPXIubGVuZ3RoKSxfPXIud2luZG93fWVsc2UgXz1pLHA9cy1yLm9mZnNldCxmPXIubGVuZ3RoO2Y+YyYmKGY9YyksYy09ZixyLmxlbmd0aC09Zjtkb3tpW3MrK109X1twKytdfXdoaWxlKC0tZik7MD09PXIubGVuZ3RoJiYoci5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT1jKWJyZWFrIHQ7aVtzKytdPXIubGVuZ3RoLGMtLSxyLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihyLndyYXApe2Zvcig7bDwzMjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHV8PW5bbysrXTw8bCxsKz04fWlmKGQtPWMsdC50b3RhbF9vdXQrPWQsci50b3RhbCs9ZCxkJiYodC5hZGxlcj1yLmNoZWNrPSRmKHIpP2FwKHIuY2hlY2ssaSxkLHMtZCk6c3Aoci5jaGVjayxpLGQscy1kKSksZD1jLCgkZihyKT91OmZwKHUpKSE9PXIuY2hlY2spe3QubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsci5tb2RlPWRwO2JyZWFrfXU9MCxsPTB9ci5tb2RlPTI4O2Nhc2UgMjg6aWYoci53cmFwJiYkZihyKSl7Zm9yKDtsPDMyOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9aWYodSE9PSg0Mjk0OTY3Mjk1JnIudG90YWwpKXt0Lm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsci5tb2RlPWRwO2JyZWFrfXU9MCxsPTB9ci5tb2RlPTI5O2Nhc2UgMjk6az0xO2JyZWFrIHQ7Y2FzZSBkcDprPS0zO2JyZWFrIHQ7Y2FzZSAzMTpyZXR1cm4tNDtkZWZhdWx0OnJldHVybiBscH1yZXR1cm4gdC5uZXh0X291dD1zLHQuYXZhaWxfb3V0PWMsdC5uZXh0X2luPW8sdC5hdmFpbF9pbj1hLHIuaG9sZD11LHIuYml0cz1sLChyLndzaXplfHxkIT09dC5hdmFpbF9vdXQmJnIubW9kZTxkcCYmKHIubW9kZTwyN3x8NCE9PWUpKSYma3AodCx0Lm91dHB1dCx0Lm5leHRfb3V0LGQtdC5hdmFpbF9vdXQpLGgtPXQuYXZhaWxfaW4sZC09dC5hdmFpbF9vdXQsdC50b3RhbF9pbis9aCx0LnRvdGFsX291dCs9ZCxyLnRvdGFsKz1kLHIud3JhcCYmZCYmKHQuYWRsZXI9ci5jaGVjaz0kZihyKT9hcChyLmNoZWNrLGksZCx0Lm5leHRfb3V0LWQpOnNwKHIuY2hlY2ssaSxkLHQubmV4dF9vdXQtZCkpLHQuZGF0YV90eXBlPXIuYml0cysoci5sYXN0PzY0OjApKyhyLm1vZGU9PT1ocD8xMjg6MCkrKDIwPT09ci5tb2RlfHwxNT09PXIubW9kZT8yNTY6MCksKDA9PT1oJiYwPT09ZHx8ND09PWUpJiYwPT09ayYmKGs9LTUpLGt9LHFmLmluZmxhdGVFbmQ9ZnVuY3Rpb24odCl7aWYoIXR8fCF0LnN0YXRlKXJldHVybiBscDt2YXIgZT10LnN0YXRlO3JldHVybiBlLndpbmRvdyYmKGUud2luZG93PW51bGwpLHQuc3RhdGU9bnVsbCwwfSxxZi5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHQmJnQuc3RhdGUmJjImKHI9dC5zdGF0ZSkud3JhcD8oci5oZWFkPWUsZS5kb25lPSExLDApOmxwfSxxZi5pbmZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbih0LGUpe3ZhciByLG49ZS5sZW5ndGg7cmV0dXJuIHQmJnQuc3RhdGU/MCE9PShyPXQuc3RhdGUpLndyYXAmJjExIT09ci5tb2RlP2xwOjExPT09ci5tb2RlJiZzcCgxLGUsbiwwKSE9PXIuY2hlY2s/LTM6a3AodCxlLG4sbik/KHIubW9kZT0zMSwtNCk6KHIuaGF2ZWRpY3Q9MSwwKTpscH0scWYuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiO3ZhciBPcD17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fTt2YXIgRXA9cWYseHA9aGQsQXA9QmYsQ3A9T3AsSXA9cmYsVHA9TWYsQnA9ZnVuY3Rpb24oKXt0aGlzLnRleHQ9MCx0aGlzLnRpbWU9MCx0aGlzLnhmbGFncz0wLHRoaXMub3M9MCx0aGlzLmV4dHJhPW51bGwsdGhpcy5leHRyYV9sZW49MCx0aGlzLm5hbWU9IiIsdGhpcy5jb21tZW50PSIiLHRoaXMuaGNyYz0wLHRoaXMuZG9uZT0hMX0sTHA9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBScCh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBScCkpcmV0dXJuIG5ldyBScCh0KTt0aGlzLm9wdGlvbnM9eHAuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSx0fHx7fSk7dmFyIGU9dGhpcy5vcHRpb25zO2UucmF3JiZlLndpbmRvd0JpdHM+PTAmJmUud2luZG93Qml0czwxNiYmKGUud2luZG93Qml0cz0tZS53aW5kb3dCaXRzLDA9PT1lLndpbmRvd0JpdHMmJihlLndpbmRvd0JpdHM9LTE1KSksIShlLndpbmRvd0JpdHM+PTAmJmUud2luZG93Qml0czwxNil8fHQmJnQud2luZG93Qml0c3x8KGUud2luZG93Qml0cys9MzIpLGUud2luZG93Qml0cz4xNSYmZS53aW5kb3dCaXRzPDQ4JiYoMTUmZS53aW5kb3dCaXRzfHwoZS53aW5kb3dCaXRzfD0xNSkpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IFRwLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgcj1FcC5pbmZsYXRlSW5pdDIodGhpcy5zdHJtLGUud2luZG93Qml0cyk7aWYociE9PUNwLlpfT0spdGhyb3cgbmV3IEVycm9yKElwW3JdKTtpZih0aGlzLmhlYWRlcj1uZXcgQnAsRXAuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpLGUuZGljdGlvbmFyeSYmKCJzdHJpbmciPT10eXBlb2YgZS5kaWN0aW9uYXJ5P2UuZGljdGlvbmFyeT1BcC5zdHJpbmcyYnVmKGUuZGljdGlvbmFyeSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUxwLmNhbGwoZS5kaWN0aW9uYXJ5KSYmKGUuZGljdGlvbmFyeT1uZXcgVWludDhBcnJheShlLmRpY3Rpb25hcnkpKSxlLnJhdyYmKHI9RXAuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLGUuZGljdGlvbmFyeSkpIT09Q3AuWl9PSykpdGhyb3cgbmV3IEVycm9yKElwW3JdKX1mdW5jdGlvbiBOcCh0LGUpe3ZhciByPW5ldyBScChlKTtpZihyLnB1c2godCwhMCksci5lcnIpdGhyb3cgci5tc2d8fElwW3IuZXJyXTtyZXR1cm4gci5yZXN1bHR9UnAucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGE9dGhpcy5zdHJtLGM9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSx1PXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LGw9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtuPWU9PT1+fmU/ZTohMD09PWU/Q3AuWl9GSU5JU0g6Q3AuWl9OT19GTFVTSCwic3RyaW5nIj09dHlwZW9mIHQ/YS5pbnB1dD1BcC5iaW5zdHJpbmcyYnVmKHQpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1McC5jYWxsKHQpP2EuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkodCk6YS5pbnB1dD10LGEubmV4dF9pbj0wLGEuYXZhaWxfaW49YS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWEuYXZhaWxfb3V0JiYoYS5vdXRwdXQ9bmV3IHhwLkJ1ZjgoYyksYS5uZXh0X291dD0wLGEuYXZhaWxfb3V0PWMpLChyPUVwLmluZmxhdGUoYSxDcC5aX05PX0ZMVVNIKSk9PT1DcC5aX05FRURfRElDVCYmdSYmKHI9RXAuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHUpKSxyPT09Q3AuWl9CVUZfRVJST1ImJiEwPT09bCYmKHI9Q3AuWl9PSyxsPSExKSxyIT09Q3AuWl9TVFJFQU1fRU5EJiZyIT09Q3AuWl9PSylyZXR1cm4gdGhpcy5vbkVuZChyKSx0aGlzLmVuZGVkPSEwLCExO2EubmV4dF9vdXQmJigwIT09YS5hdmFpbF9vdXQmJnIhPT1DcC5aX1NUUkVBTV9FTkQmJigwIT09YS5hdmFpbF9pbnx8biE9PUNwLlpfRklOSVNIJiZuIT09Q3AuWl9TWU5DX0ZMVVNIKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvPyhpPUFwLnV0Zjhib3JkZXIoYS5vdXRwdXQsYS5uZXh0X291dCksbz1hLm5leHRfb3V0LWkscz1BcC5idWYyc3RyaW5nKGEub3V0cHV0LGkpLGEubmV4dF9vdXQ9byxhLmF2YWlsX291dD1jLW8sbyYmeHAuYXJyYXlTZXQoYS5vdXRwdXQsYS5vdXRwdXQsaSxvLDApLHRoaXMub25EYXRhKHMpKTp0aGlzLm9uRGF0YSh4cC5zaHJpbmtCdWYoYS5vdXRwdXQsYS5uZXh0X291dCkpKSksMD09PWEuYXZhaWxfaW4mJjA9PT1hLmF2YWlsX291dCYmKGw9ITApfXdoaWxlKChhLmF2YWlsX2luPjB8fDA9PT1hLmF2YWlsX291dCkmJnIhPT1DcC5aX1NUUkVBTV9FTkQpO3JldHVybiByPT09Q3AuWl9TVFJFQU1fRU5EJiYobj1DcC5aX0ZJTklTSCksbj09PUNwLlpfRklOSVNIPyhyPUVwLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKHIpLHRoaXMuZW5kZWQ9ITAscj09PUNwLlpfT0spOm4hPT1DcC5aX1NZTkNfRkxVU0h8fCh0aGlzLm9uRW5kKENwLlpfT0spLGEuYXZhaWxfb3V0PTAsITApfSxScC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHQpe3RoaXMuY2h1bmtzLnB1c2godCl9LFJwLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXt0PT09Q3AuWl9PSyYmKCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PXhwLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj10LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LEdmLkluZmxhdGU9UnAsR2YuaW5mbGF0ZT1OcCxHZi5pbmZsYXRlUmF3PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8e30pLnJhdz0hMCxOcCh0LGUpfSxHZi51bmd6aXA9TnA7dmFyIHpwPXt9OygwLGhkLmFzc2lnbikoenAsZGQsR2YsT3ApO3ZhciBEcD1lKHpwKTtsZXQgUHA9MTtjb25zdCBNcD0iX19ydGNfdW1kX25hbWVfXyIsRnA9KCk9PndpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQjtjbGFzcyBVcHtjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJzdG9yZU5hbWUiLHZvaWQgMCksbGwodGhpcywicGVuZGluZ0xpc3QiLFtdKSx0aGlzLnN0b3JlTmFtZT10LCFCbCgpJiZGcCgpJiZ0aGlzLl9jaGVja0FuZENyZWF0ZVN0b3JlKHQpfWFzeW5jIF9jaGVja0FuZENyZWF0ZVN0b3JlKHQsZSl7Y29uc3Qgcj1hd2FpdCBVcC5fcHJvbWlzZUxvY2subG9jaygpO2lmKEZwKCkuZGF0YWJhc2VzKXtsZXQgdDthd2FpdCBuZXcgUHJvbWlzZSgoZT0+e2NvbnN0IHI9KCk9PkZwKCkuZGF0YWJhc2VzKCkuZmluYWxseShlKTt0PXNldEludGVydmFsKHIsMTAwKSxyKCl9KSkuZmluYWxseSgoKCk9PmNsZWFySW50ZXJ2YWwodCkpKX1yZXR1cm4gbmV3IFByb21pc2UoKG49PntVcC5kYiYmKFVwLmRiLmNsb3NlKCksZGVsZXRlIFVwLmRiKTtjb25zdCBpPWU/RnAoKS5vcGVuKE1wLGUpOkZwKCkub3BlbihNcCk7aS5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntpLnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0KX0saS5vbmVycm9yPSgpPT57Y29uc29sZS5lcnJvcigiSW5kZXhlZERCSW50ZXJmYWNlIGVycm9yIixpLmVycm9yKX0saS5vbnN1Y2Nlc3M9KCk9Pntjb25zdCBlPWkucmVzdWx0O1VwLmRiPWU7dHJ5e1VwLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkb25seSIpLHRoaXMucGVuZGluZ0xpc3QuZm9yRWFjaCgoYXN5bmMgdD0+e2xldHt0eE1vZGU6ZSxwZW5kUmVzb2x2ZTpyLHBlbmRSZWplY3Q6bn09dDt0cnl7cihhd2FpdCB0aGlzLl9nZXRTdG9yZShlKSl9Y2F0Y2goaSl7bigpfX0pKSxuKCl9Y2F0Y2gobyl7bih0aGlzLl9jaGVja0FuZENyZWF0ZVN0b3JlKHQsZS52ZXJzaW9uKzEpKX1maW5hbGx5e3IoKX19fSkpfWFzeW5jIF9nZXRTdG9yZSh0KXtjb25zdCBlPWF3YWl0IFVwLl9wcm9taXNlTG9jay5sb2NrKCk7cmV0dXJuIG5ldyBQcm9taXNlKCgocixuKT0+e2lmKCFVcC5kYilyZXR1cm4gdGhpcy5wZW5kaW5nTGlzdC5wdXNoKHt0eE1vZGU6dCxwZW5kUmVzb2x2ZTpyLHBlbmRSZWplY3Q6bn0pLHZvaWQgZSgpO3RyeXtyKFVwLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLHQpLm9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKSl9Y2F0Y2goaSl7cmV0dXJuIHZvaWQgdGhpcy5wZW5kaW5nTGlzdC5wdXNoKHt0eE1vZGU6dCxwZW5kUmVzb2x2ZTpyLHBlbmRSZWplY3Q6bn0pfWZpbmFsbHl7ZSgpfX0pKX1hc3luYyBwdXQyU3RyaW5nKHQsZSl7bGV0IHI7dHJ5e3I9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cj10fXJldHVybiBhd2FpdCB0aGlzLnB1dChyLGUpfWFzeW5jIGdldDRTdHJpbmcodCl7Y29uc3QgZT1hd2FpdCB0aGlzLmdldCh0KTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKGUpfWNhdGNoKG4pe3I9ZX1yZXR1cm4gcn1hc3luYyBwdXQodCxlKXtjb25zdCByPWF3YWl0IHRoaXMuX2dldFN0b3JlKCJyZWFkd3JpdGUiKTtyZXR1cm4gbmV3IFByb21pc2UoKChuLGkpPT57Y29uc3Qgbz1yLnB1dCh0LGUpO28ub25zdWNjZXNzPSgpPT57bigpfSxvLm9uZXJyb3I9dD0+e2kodCl9fSkpfWFzeW5jIGdldCh0KXtjb25zdCBlPWF3YWl0IHRoaXMuX2dldFN0b3JlKCJyZWFkb25seSIpO3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbik9Pntjb25zdCBpPWUuZ2V0KHQpO2kub25zdWNjZXNzPSgpPT57cihpLnJlc3VsdCl9LGkub25lcnJvcj10PT57bih0KX19KSl9YXN5bmMgZGVsKHQpe2NvbnN0IGU9YXdhaXQgdGhpcy5fZ2V0U3RvcmUoInJlYWR3cml0ZSIpO3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbik9Pntjb25zdCBpPWUuZGVsZXRlKHQpO2kub25zdWNjZXNzPSgpPT57cigpfSxpLm9uZXJyb3I9dD0+e24odCl9fSkpfX1sbChVcCwiZGIiLHZvaWQgMCksbGwoVXAsInN0YXRlIiwiaW5pdCIpLGxsKFVwLCJfcHJvbWlzZUxvY2siLG5ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJsb2NraW5nUHJvbWlzZSIsUHJvbWlzZS5yZXNvbHZlKCkpLGxsKHRoaXMsImxvY2tzIiwwKSxsbCh0aGlzLCJuYW1lIiwiIiksbGwodGhpcywibG9ja0lkIix2b2lkIDApLHRoaXMubG9ja0lkPVBwKyssdCYmKHRoaXMubmFtZT10KX1nZXQgaXNMb2NrZWQoKXtyZXR1cm4gdGhpcy5sb2Nrcz4wfWxvY2soKXtsZXQgdDt0aGlzLmxvY2tzKz0xO2NvbnN0IGU9bmV3IFByb21pc2UoKGU9Pnt0PSgpPT57dGhpcy5sb2Nrcy09MSxlKCl9fSkpLHI9dGhpcy5sb2NraW5nUHJvbWlzZS50aGVuKCgoKT0+dCkpO3JldHVybiB0aGlzLmxvY2tpbmdQcm9taXNlPXRoaXMubG9ja2luZ1Byb21pc2UudGhlbigoKCk9PmUpKSxyfX0oImlEQiIpKTt2YXIganA9c2kuaW5jbHVkZXM7Q3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzKChmdW5jdGlvbigpe3JldHVybiFBcnJheSgxKS5pbmNsdWRlcygpfSkpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIGpwKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7dmFyIEhwPXBsKCJBcnJheSIsImluY2x1ZGVzIiksSnA9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIF9sKHQpJiYodm9pZCAwIT09KGU9dFttbF0pPyEhZToiUmVnRXhwIj09PWdsKHQpKX0sS3A9VHlwZUVycm9yLFdwPWRlKCJtYXRjaCIpLFpwPUNyLEdwPWZ1bmN0aW9uKHQpe2lmKEpwKHQpKXRocm93IG5ldyBLcCgiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIHR9LFZwPUcsWHA9JG4sWXA9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXsiLy4vIlt0XShlKX1jYXRjaChyKXt0cnl7cmV0dXJuIGVbV3BdPSExLCIvLi8iW3RdKGUpfWNhdGNoKG4pe319cmV0dXJuITF9LCRwPW0oIiIuaW5kZXhPZik7WnAoe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IVlwKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF+JHAoWHAoVnAodGhpcykpLFhwKEdwKHQpKSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7dmFyIHFwPXBsKCJTdHJpbmciLCJpbmNsdWRlcyIpLFFwPW90LHRfPUhwLGVfPXFwLHJfPUFycmF5LnByb3RvdHlwZSxuXz1TdHJpbmcucHJvdG90eXBlLGlfPWUoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5jbHVkZXM7cmV0dXJuIHQ9PT1yX3x8UXAocl8sdCkmJmU9PT1yXy5pbmNsdWRlcz90Xzoic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT1uX3x8UXAobl8sdCkmJmU9PT1uXy5pbmNsdWRlcz9lXzplfSkpO2Z1bmN0aW9uIG9fKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgcixuLGk9ZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybnt9O3ZhciByPXt9O2Zvcih2YXIgbiBpbiB0KWlmKHt9Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSl7aWYoaV8oZSkuY2FsbChlLG4pKWNvbnRpbnVlO3Jbbl09dFtuXX1yZXR1cm4gcn0odCxlKTtpZihLbCl7dmFyIG89S2wodCk7Zm9yKG49MDtuPG8ubGVuZ3RoO24rKylyPW9bbl0saV8oZSkuY2FsbChlLHIpfHx7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQscikmJihpW3JdPXRbcl0pfXJldHVybiBpfWNvbnN0IHNfPVsibWVzc2FnZSJdO3ZhciBhXyxjXyx1Xz1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtsbCh0aGlzLCJuYW1lIiwiTG9uZ1N0cmluZ1JlcG9ydG9yIiksbGwodGhpcywiaW5CdWZmZXIiLFtdKSxsbCh0aGlzLCJvdXRCdWZmZXIiLFtdKX1wdXNoKHQpe3QubWVzc2FnZSYmdGhpcy5pbkJ1ZmZlci5wdXNoKFhoKFhoKHt9LHQpLHt9LHttZXNzYWdlOntpZDpUbCgpLnNsaWNlKDAsMyksaW5kZXg6MCxlbmQ6ITAsbXNnOnQubWVzc2FnZX19KSl9c3BsaWNlKHQpe2NvbnN0IGU9W107bGV0IHI9MDtmb3IoO3RoaXMub3V0QnVmZmVyLmxlbmd0aDspe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkodGhpcy5vdXRCdWZmZXJbMF0pLmxlbmd0aDtpZighKG48dCkpYnJlYWs7dC09bixyKz1uLGUucHVzaCh0aGlzLm91dEJ1ZmZlci5zaGlmdCgpKX1mb3IoO3RoaXMuaW5CdWZmZXJbMF0mJnQ+MDspe2NvbnN0IG49dGhpcy5pbkJ1ZmZlclswXSx7bWVzc2FnZTppfT1uLG89WGgoWGgoe30sb18obixzXykpLHt9LHttZXNzYWdlOlhoKFhoKHt9LGkpLHt9LHttc2c6IiJ9KX0pLHM9SlNPTi5zdHJpbmdpZnkobykubGVuZ3RoLGE9dC1zLGM9WGgoe30sbyk7aWYoYT5pLm1zZy5sZW5ndGgpYy5tZXNzYWdlLm1zZz1pLm1zZyx0aGlzLmluQnVmZmVyLnNoaWZ0KCk7ZWxzZXtpZighKGE+PTEwKSlicmVhazt7Y29uc3QgdD1pLm1zZy5zbGljZSgwLGEpO2MubWVzc2FnZS5tc2c9dCxjLm1lc3NhZ2UuZW5kPSExLHRoaXMuaW5CdWZmZXJbMF0ubWVzc2FnZS5tc2c9aS5tc2cuc2xpY2UoYSksdGhpcy5pbkJ1ZmZlclswXS5tZXNzYWdlLmluZGV4Kyt9fWNvbnN0IHU9SlNPTi5zdHJpbmdpZnkoYy5tZXNzYWdlKSxsPXUubGVuZ3RoO3QtPWwrcyxyKz1sK3MsZS5wdXNoKFhoKFhoKHt9LGMpLHt9LHttZXNzYWdlOnV9KSl9cmV0dXJue3BheWxvYWQ6ZSxwYXlsb2FkU2l6ZTpyfX11bnNoaWZ0KHQpe3RoaXMub3V0QnVmZmVyPXQuY29uY2F0KHRoaXMub3V0QnVmZmVyKX1nZXQoKXtyZXR1cm5bLi4udGhpcy5vdXRCdWZmZXIsLi4udGhpcy5pbkJ1ZmZlci5tYXAoKHQ9PlhoKFhoKHt9LHQpLHt9LHttZXNzYWdlOkpTT04uc3RyaW5naWZ5KHQubWVzc2FnZSl9KSkpXX1zZXQodCl7dC5mb3JFYWNoKCh0PT57IWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LnJlcG9ydF9pZH0odCk/KHQubWVzc2FnZXx8KHQubWVzc2FnZT0iIiksdGhpcy5pbkJ1ZmZlci5wdXNoKFhoKFhoKHt9LHQpLHt9LHttZXNzYWdlOkpTT04ucGFyc2UodC5tZXNzYWdlKX0pKSk6dGhpcy5vdXRCdWZmZXIucHVzaCh0KX0pKSx0aGlzLm91dEJ1ZmZlcj1bXS5jb25jYXQodGhpcy5vdXRCdWZmZXIpLHRoaXMuaW5CdWZmZXI9W10uY29uY2F0KHRoaXMuaW5CdWZmZXIpfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMuaW5CdWZmZXIubGVuZ3RoJiYwPT09dGhpcy5vdXRCdWZmZXIubGVuZ3RofX07Y29uc3QgbF89NWU1LGhfPXtwcm9kdWN0X2xpbmU6InJ0YyIscmVwb3J0X3ZlcnNpb246IjUiLG9zOiJ3ZWIiLHVzZXJfYWdlbnQ6QmwoKT8iIjpudWxsPT09KGFfPW5hdmlnYXRvcil8fHZvaWQgMD09PWFfP3ZvaWQgMDphXy51c2VyQWdlbnQscGxhdGZvcm06IndlYiIscHJvZHVjdDoid2VicnRjIixhcHBfc3RhdGU6ImFjdGl2ZSJ9LGRfPSJMb2dSZXBvcnRvciIsZl89InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKCJfcnRjX2RlYnVnXyIpfHwobnVsbD09PShjXz13aW5kb3cubG9jYWxTdG9yYWdlKXx8dm9pZCAwPT09Y18/dm9pZCAwOmNfLmdldEl0ZW0oIl9ydGNfZGVidWdfIikpKTtjbGFzcyBwX3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJfYnVmZmVyIix2b2lkIDApLHRoaXMuX2J1ZmZlcj1uZXcgVXAodCl9YXN5bmMgc2V0KHQsZSl7YXdhaXQgdGhpcy5fYnVmZmVyLnB1dDJTdHJpbmcodCxlKX1hc3luYyBnZXQodCl7dmFyIGU7bGV0IHI9W107dHJ5e3I9YXdhaXQgdGhpcy5fYnVmZmVyLmdldDRTdHJpbmcodCl9Y2F0Y2gobil7fXJldHVybiBudWxsIT09KGU9cikmJnZvaWQgMCE9PWU/ZTpbXX19dmFyIF9fPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe2xsKHRoaXMsInJlcG9ydENvbW1vbiIsaF8pLGxsKHRoaXMsInJlcG9ydElkcyIsbmV3IE1hcCksbGwodGhpcywiZGF0YUJ1ZmZlciIsW10pLGxsKHRoaXMsInJlcG9ydG9yTGlzdCIsW10pLGxsKHRoaXMsImRiQnVmZmVyIix2b2lkIDApLGxsKHRoaXMsInBvc3RpbmciLCExKSxsbCh0aGlzLCJzdWNTZW5kVGltZXIiLHZvaWQgMCksbGwodGhpcywicHJlU3VjVGltZSIsMCksbGwodGhpcywiZXJyU2VuZFRpbWVyIix2b2lkIDApLGxsKHRoaXMsImVyclNlbmREZWxheSIsMTAwKSxsbCh0aGlzLCJfbG9nU2VydmVyVXJsIix2b2lkIDApLGxsKHRoaXMsIl9yZXRyeUNvdW50IiwwKSxsbCh0aGlzLCJfcmVwb3J0TGltaXQiLGxfKSxsbCh0aGlzLCJfZGlzYWJsZVRpbWVvdXQiLCExKSxCbCgpfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsKCgpPT57Y2xlYXJUaW1lb3V0KHRoaXMuZXJyU2VuZFRpbWVyKSxjbGVhclRpbWVvdXQodGhpcy5zdWNTZW5kVGltZXIpLHRoaXMuc2VuZCh2b2lkIDAsITApfSkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLCgoKT0+eyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT90aGlzLnNldENvbW1vblN0YXRzKHthcHBfc3RhdGU6ImFjdGl2ZSJ9KToiaGlkZGVuIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmdGhpcy5zZXRDb21tb25TdGF0cyh7YXBwX3N0YXRlOiJiYWNrZ3JvdW5kIn0pfSkpLGZfJiYod2luZG93Ll9fcnRjX2RlYnVnX3JlcG9ydG9yX189dGhpcykpLFVsLm9uKCJVUExPQURfUkVQT1JUX0xJTUlUIiwodD0+e3RoaXMuc2V0UmVwb3J0TGltaXQodCl9KSksVWwub24oIkVOQUJMRV9SRVBPUlRfSURCX0JVRkZFUiIsKHQ9Pnt0JiZ0aGlzLmVuYWJsZUluZGV4ZWREQkJ1ZmZlcigpfSkpLHNldFRpbWVvdXQoKCgpPT57dGhpcy5yZXBvcnRvckxpc3QucHVzaChPXyksdGhpcy5yZXBvcnRvckxpc3QucHVzaCh1Xyl9KSl9c2V0VXJsKHQpe3RoaXMuX2xvZ1NlcnZlclVybD10fXNldENvbW1vblN0YXRzKHQpe3RoaXMucmVwb3J0Q29tbW9uPU9iamVjdC5hc3NpZ24odGhpcy5yZXBvcnRDb21tb24sdCl9Z2V0Q29tbW9uU3RhdHMoKXtyZXR1cm4gdGhpcy5yZXBvcnRDb21tb259c2V0UmVwb3J0TGltaXQodCl7dGhpcy5fcmVwb3J0TGltaXQ9TWF0aC5tYXgodCw1ZTQpLHRoaXMuX3JlcG9ydExpbWl0PU1hdGgubWluKHQsNWU1KX1nZXRSZXBvcnRJZCh0KXt2YXIgZTt0PW51bGwhPT0oZT10KSYmdm9pZCAwIT09ZT9lOiJfX2dsb2JhbF9fIix0aGlzLnJlcG9ydElkcy5oYXModCl8fHRoaXMucmVwb3J0SWRzLnNldCh0LDApO2xldCByPXRoaXMucmVwb3J0SWRzLmdldCh0KTtyZXR1cm4gdm9pZCAwPT09ciYmKHlfKCJubyByZXBvcnRJZCBpbiByZXBvcnRJZCBtYXAgd2l0aCBlbmdpbmUtc2Vzc2lvbi1pZCAiLmNvbmNhdCh0KSwwLHt9KSxyPTApLHRoaXMucmVwb3J0SWRzLnNldCh0LHIrMSkscn1wdXNoKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0pdGhpcy5zZW5kKHQpO2Vsc2V7dmFyIGU7Y29uc3Qgcj1udWxsIT09KGU9dC5lbmdpbmVfc2Vzc2lvbl9pZCkmJnZvaWQgMCE9PWU/ZToiX19nbG9iYWxfXyI7dGhpcy5yZXBvcnRJZHMuaGFzKHIpfHx0aGlzLnJlcG9ydElkcy5zZXQociwwKSx0aGlzLmRhdGFCdWZmZXIucHVzaCh0KSwhdGhpcy5wb3N0aW5nJiYhdGhpcy5lcnJTZW5kVGltZXImJkRhdGUubm93KCktdGhpcy5wcmVTdWNUaW1lPjJlMyYmKGNsZWFyVGltZW91dCh0aGlzLnN1Y1NlbmRUaW1lciksdGhpcy5zZW5kKCkpfX1lbmFibGVJbmRleGVkREJCdWZmZXIoKXt0aGlzLmRiQnVmZmVyfHwodGhpcy5kYkJ1ZmZlcj1uZXcgcF8oIlJlcG9ydG9yREJCdWZmZXIiKSx0aGlzLmRiQnVmZmVyLmdldChkXykudGhlbigodD0+e3QuZm9yRWFjaCgodD0+e3RoaXMucHVzaCh0KX0pKX0pKSx0aGlzLnJlcG9ydG9yTGlzdC5mb3JFYWNoKCh0PT57dmFyIGU7bnVsbD09PShlPXRoaXMuZGJCdWZmZXIpfHx2b2lkIDA9PT1lfHxlLmdldCh0Lm5hbWUpLnRoZW4oKGU9Pnt0LnNldChlKX0pKX0pKSl9YmFja3VwKCl7dHJ5e3ZhciB0O251bGw9PT0odD10aGlzLmRiQnVmZmVyKXx8dm9pZCAwPT09dHx8dC5zZXQoWy4uLnRoaXMuZGF0YUJ1ZmZlcl0sZF8pLHRoaXMucmVwb3J0b3JMaXN0LmZvckVhY2goKHQ9Pnt2YXIgZTtudWxsPT09KGU9dGhpcy5kYkJ1ZmZlcil8fHZvaWQgMD09PWV8fGUuc2V0KFsuLi50LmdldCgpXSx0Lm5hbWUpfSkpfWNhdGNoKGUpe3lfKCJFcnJvciB3aGVuIHNhdmUgbG9nIGludG8gSURCIiwtMSxlKX19dW5zaGlmdCh0KXt0aGlzLmRhdGFCdWZmZXI9dFswXS5jb25jYXQodGhpcy5kYXRhQnVmZmVyKSx0aGlzLnJlcG9ydG9yTGlzdC5mb3JFYWNoKCgoZSxyKT0+e3ZhciBuO2UudW5zaGlmdChudWxsIT09KG49dFtyKzFdKSYmdm9pZCAwIT09bj9uOltdKX0pKX1fc3BsaWNlKCl7bGV0IHQ9ZnVuY3Rpb24odCxlKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKHIrPUpTT04uc3RyaW5naWZ5KHRbbl0pLmxlbmd0aCxyPmUpcmV0dXJuIG47cmV0dXJuIHQubGVuZ3RofSh0aGlzLmRhdGFCdWZmZXIsdGhpcy5fcmVwb3J0TGltaXQpOzA9PT10JiZ0aGlzLmRhdGFCdWZmZXIubGVuZ3RoPjAmJih0aGlzLl9yZXBvcnRMaW1pdD1KU09OLnN0cmluZ2lmeSh0aGlzLmRhdGFCdWZmZXJbMF0pLmxlbmd0aCsxMCx0PTEseV8oInVwZGF0ZSByZXBvcnQgbGltaXQgdG8gIi5jb25jYXQodGhpcy5fcmVwb3J0TGltaXQpLDAsbnVsbCkpO2NvbnN0IGU9dGhpcy5kYXRhQnVmZmVyLnNwbGljZSgwLHQpLHI9SlNPTi5zdHJpbmdpZnkoZSkubGVuZ3RoLG49W2VdO2xldCBpPXRoaXMuX3JlcG9ydExpbWl0LXI7cmV0dXJuIHRoaXMucmVwb3J0b3JMaXN0LmZvckVhY2goKHQ9Pntjb25zdHtwYXlsb2FkOmUscGF5bG9hZFNpemU6cn09dC5zcGxpY2UoaSk7ZS5mb3JFYWNoKCh0PT57dmFyIGUscixuO3ZvaWQgMD09PXQucmVwb3J0X2lkJiYodC5yZXBvcnRfaWQ9dGhpcy5nZXRSZXBvcnRJZCh0LmVuZ2luZV9zZXNzaW9uX2lkKSwhQmwoKSYmd2luZG93Ll9fb25SVENSZXBvcnQmJihudWxsPT09KGU9KHI9d2luZG93KS5fX29uUlRDUmVwb3J0KXx8dm9pZCAwPT09ZXx8ZS5jYWxsKHIsbnVsbCE9PShuPXQuZW5naW5lX3Nlc3Npb25faWQpJiZ2b2lkIDAhPT1uP246Imdsb2JhbCIsdCx0aGlzLmdldENvbW1vblN0YXRzKCkpKSl9KSksbi5wdXNoKGUpLGktPXJ9KSksbn1hc3luYyBzZW5kKHQsZSl7dGhpcy5iYWNrdXAoKTtjb25zdCByPXRoaXMucmVwb3J0b3JMaXN0LnJlZHVjZSgoKHQsZSk9PnQmJmUuaXNFbXB0eSgpKSwhMCk7aWYoIXQmJiF0aGlzLmRhdGFCdWZmZXIubGVuZ3RoJiZyfHwhdGhpcy5fbG9nU2VydmVyVXJsKXJldHVybjt0fHwodGhpcy5wb3N0aW5nPSEwKTtsZXQgbj1bXTt0fHwobj10aGlzLl9zcGxpY2UoKSk7Y29uc3QgaT1mXyxvPXtkYXRhOnR8fGxkKG4pLmNhbGwobiksaGVhZGVyOlhoKFhoKHt9LHRoaXMucmVwb3J0Q29tbW9uKSx7fSx7aHR0cF9yZXRyeV9jb3VudDp0aGlzLl9yZXRyeUNvdW50fSksZnJvbToid2ViIixvczoid2ViIix2ZXJzaW9uOiIxIn0scz17bWV0aG9kOiJQT1NUIixib2R5Omk/SlNPTi5zdHJpbmdpZnkobyk6RHAuZ3ppcChKU09OLnN0cmluZ2lmeShvKSl9O2lmKCF0aGlzLl9kaXNhYmxlVGltZW91dCl0cnl7Y29uc3QgdD1uZXcgQWJvcnRDb250cm9sbGVyO3Muc2lnbmFsPXQuc2lnbmFsLHNldFRpbWVvdXQoKCgpPT57dC5hYm9ydCgpfSksMWU0KX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkFib3J0Q29udHJvbGxlciBpcyBub3Qgc3VwcG9ydGVkIiksdGhpcy5fZGlzYWJsZVRpbWVvdXQ9ITB9aXx8KHMuaGVhZGVycz17IkNvbnRlbnQtRW5jb2RpbmciOiJnemlwIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04In0pO2xldCBhLGMsdT1udWxsO3RyeXthPWF3YWl0IGZldGNoKHRoaXMuX2xvZ1NlcnZlclVybCxzKSwyMDAhPT1hLnN0YXR1cyYmMzA0IT09YS5zdGF0dXN8fCh1PUpTT04ucGFyc2UoYXdhaXQgYS50ZXh0KCkpKX1jYXRjaChoKXtjPWh9dHx8KHRoaXMucG9zdGluZz0hMSksdSYmMD09PXUuU3RhdHVzQ29kZT90fHxlfHx0aGlzLnN1Y1NlbmQoKTooc2V0VGltZW91dCgoKCk9Pnt2YXIgdCxlLHI7eV8oInJlcG9ydG9yIHBvc3QgZXJyb3IsIHJlc0pTT046Ii5jb25jYXQobnVsbD09PSh0PXUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnRvU3RyaW5nKCksIiBlcnI6IikuY29uY2F0KGMpLG51bGwhPT0oZT1udWxsPT09KHI9YSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzKSYmdm9pZCAwIT09ZT9lOi0xLGMpfSksMCksdD90aGlzLnNlbmQodCk6KHRoaXMudW5zaGlmdChuKSxlP3RoaXMuc2VuZCgpOnRoaXMuZXJyU2VuZCgpKSl9X2dldERhdGFCdWZmZXJUb3RhbFNpemUoKXtyZXR1cm4gdGhpcy5kYXRhQnVmZmVyLnJlZHVjZSgoKHQsZSk9PnQrSlNPTi5zdHJpbmdpZnkoZSkubGVuZ3RoKSwwKX1zdWNTZW5kKCl7dGhpcy5lcnJTZW5kRGVsYXk9MTAwLHRoaXMuX3JldHJ5Q291bnQ9MCx0aGlzLnByZVN1Y1RpbWU9RGF0ZS5ub3coKTtjb25zdCB0PXRoaXMuX2dldERhdGFCdWZmZXJUb3RhbFNpemUoKT4xZTY/MWUzOjJlMzt0aGlzLnN1Y1NlbmRUaW1lcj1zZXRUaW1lb3V0KCgoKT0+dGhpcy5zZW5kKCkpLHQpfWVyclNlbmQoKXt0aGlzLmVyclNlbmRUaW1lcj1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuc2VuZCgpLGRlbGV0ZSB0aGlzLmVyclNlbmRUaW1lcn0pLHRoaXMuZXJyU2VuZERlbGF5KSx0aGlzLmVyclNlbmREZWxheSo9Mix0aGlzLl9yZXRyeUNvdW50Kyt9fTtjbGFzcyBnX3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJfcHJlVGltZSIsRGF0ZS5ub3coKSksbGwodGhpcywiX29uZTJvbmVOdW0iLDApLGxsKHRoaXMsIl9vbmUybWFueU51bSIsMCksbGwodGhpcywiX29uZTJvbmVNc2dDYWNoZSIsbmV3IE1hcCksbGwodGhpcywiX29uZTJtYW55TXNnQ2FjaGUiLG5ldyBNYXApLGxsKHRoaXMsInJvb21JZCIsIiIpLGxsKHRoaXMsInVzZXJJZCIsIiIpLGxsKHRoaXMsInJ0c1Nlc3Npb25JZCIsIiIpLGxsKHRoaXMsImxvZ2dlciIsdm9pZCAwKSxsbCh0aGlzLCJzZXJ2ZXJVcmwiLCJzZXJ2ZXIiKSx0aGlzLmlkPXQsdGhpcy5sb2dnZXI9bmV3IHpfKCJNZXNzYWdlUmVwb3J0b3IiLDEpfW5lZWRSZXBvcnQodCl7cmV0dXJuISFnXy5jb25maWcmJihEYXRlLm5vdygpLXRoaXMuX3ByZVRpbWU+PTM2ZTUmJih0aGlzLl9wcmVUaW1lPURhdGUubm93KCksdGhpcy5fb25lMm9uZU51bT0wLHRoaXMuX29uZTJtYW55TnVtPTApLCJvbmUyb25lIj09PXQmJnRoaXMuX29uZTJvbmVOdW08Z18uY29uZmlnLm1heF9vbmUyb25lX2ZwdF9wZXJfaG91ciYmTWF0aC5yYW5kb20oKTw9Z18uY29uZmlnLm9uZTJvbmVfZnB0X3JhdGlvLzEwMHx8Im9uZTJtYW55Ij09PXQmJnRoaXMuX29uZTJtYW55TnVtPGdfLmNvbmZpZy5tYXhfb25lMm1hbnlfZnB0X3Blcl9ob3VyJiZNYXRoLnJhbmRvbSgpPD1nXy5jb25maWcub25lMm1hbnlfZnB0X3JhdGlvLzEwMCl9Y2FjaGVQMlBNc2codCl7dmFyIGU7dGhpcy5fb25lMm9uZU1zZ0NhY2hlLnNldCh0Lm1zZ19pZCxYaCh7Y29uZmlnX3ZlcnNpb246KG51bGw9PT0oZT1nXy5jb25maWcpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnZlcnNpb24pfHwiIn0sdCkpfXVwZGF0ZVAyUE1zZyh0LGUpe2NvbnN0IHI9dGhpcy5fb25lMm9uZU1zZ0NhY2hlLmdldCh0KTtyJiZ0aGlzLl9vbmUyb25lTXNnQ2FjaGUuc2V0KHQsWGgoWGgoe30sciksZSkpfWNhY2hlQ3VzdG9tTXNnKHQpe3ZhciBlO3RoaXMuX29uZTJtYW55TXNnQ2FjaGUuc2V0KHQubXNnX2lkLFhoKHtjb25maWdfdmVyc2lvbjoobnVsbD09PShlPWdfLmNvbmZpZyl8fHZvaWQgMD09PWU/dm9pZCAwOmUudmVyc2lvbil8fCIifSx0KSl9dXBkYXRlT25lMk1hbnlNc2codCxlKXtjb25zdCByPXRoaXMuX29uZTJtYW55TXNnQ2FjaGUuZ2V0KHQpO3ImJnRoaXMuX29uZTJtYW55TXNnQ2FjaGUuc2V0KHQsWGgoWGgoe30sciksZSkpfXJlcG9ydFAyUE1zZyh0KXtjb25zdCBlPXRoaXMuX29uZTJvbmVNc2dDYWNoZS5nZXQodCk7dmFyIHI7ZSYmKHRoaXMubG9nZ2VyLmluZm8oInJlcG9ydFAyUE1zZyIsZS50eXBlLEpTT04uc3RyaW5naWZ5KGUpKSxudWxsPT09KHI9Yl8odGhpcy5pZCkpfHx2b2lkIDA9PT1yfHxyLnJlcG9ydCgicnRzX21lc3NhZ2UiLGUpKX1yZXBvcnRPbmUyTWFueU1zZyh0KXtjb25zdCBlPXRoaXMuX29uZTJtYW55TXNnQ2FjaGUuZ2V0KHQpO3ZhciByO2UmJih0aGlzLmxvZ2dlci5pbmZvKCJyZXBvcnRPbmUyTWFueU1zZyIsZS50eXBlLEpTT04uc3RyaW5naWZ5KGUpKSxudWxsPT09KHI9Yl8odGhpcy5pZCkpfHx2b2lkIDA9PT1yfHxyLnJlcG9ydCgicnRzX21lc3NhZ2UiLGUpKX1yZXBvcnRNc2dSZWN2KHQpe3ZhciBlLHI7dC5jb25maWdfdmVyc2lvbj0obnVsbD09PShlPWdfLmNvbmZpZyl8fHZvaWQgMD09PWU/dm9pZCAwOmUudmVyc2lvbil8fCIiLHRoaXMubG9nZ2VyLmluZm8oInJlcG9ydE1zZ1JlY3YiLHQudHlwZSxKU09OLnN0cmluZ2lmeSh0KSksbnVsbD09PShyPWJfKHRoaXMuaWQpKXx8dm9pZCAwPT09cnx8ci5yZXBvcnQoInJ0c19tZXNzYWdlIix0KX1kZXN0cm95KCl7dGhpcy5fb25lMm1hbnlOdW09MCx0aGlzLl9vbmUyb25lTnVtPTAsdGhpcy5fb25lMm1hbnlNc2dDYWNoZS5jbGVhcigpLHRoaXMuX29uZTJvbmVNc2dDYWNoZS5jbGVhcigpLHRoaXMuX3ByZVRpbWU9RGF0ZS5ub3coKSx0aGlzLnJvb21JZD0iIix0aGlzLnVzZXJJZD0iIix0aGlzLnJ0c1Nlc3Npb25JZD0iIn19bGwoZ18sImNvbmZpZyIsdm9pZCAwKTtjb25zdCBtXz1uZXcgY2xhc3N7Y29uc3RydWN0b3IodCl7bGwodGhpcywibW9kaWZ5SWRzIix7cHJlX2Nvbm5lY3Rpb246ITF9KSx0aGlzLmlkPXR9cmVwb3J0KHQsZSxyKXtjb25zdCBuPVhoKFhoKFhoKHtldmVudF9rZXk6dCxydGNfdGltZXN0YW1wOkRhdGUubm93KCl9LHRoaXMubW9kaWZ5SWRzKSxlKSx7fSx7cmVwb3J0X2lkOl9fLmdldFJlcG9ydElkKHRoaXMubW9kaWZ5SWRzLmVuZ2luZV9zZXNzaW9uX2lkKX0pO3ZhciBpLG87KCJvYmplY3QiPT10eXBlb2YgciYmT2JqZWN0LmtleXMocikubGVuZ3RoPjAmJihuLmNvbW1vbl9leHRyYV9pbmZvPUpTT04uc3RyaW5naWZ5KHIpKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKCh0PT57dm9pZCAwIT09blt0XSYmIiIhPT1uW3RdfHxkZWxldGUgblt0XX0pKSwhQmwoKSYmd2luZG93Ll9fb25SVENSZXBvcnQpJiYobnVsbD09PShpPShvPXdpbmRvdykuX19vblJUQ1JlcG9ydCl8fHZvaWQgMD09PWl8fGkuY2FsbChvLHRoaXMubW9kaWZ5SWRzLmVuZ2luZV9zZXNzaW9uX2lkLG4sX18uZ2V0Q29tbW9uU3RhdHMoKSkpOyJVVCIhPT17fS5WSVRFX1RFU1QmJl9fLnB1c2gobil9cmVwb3J0TG9nKHQpe2NvbnN0IGU9WGgoWGgoe2V2ZW50X2tleToicnRjX2ludm9rZV9zdGF0dXMiLHNka19hcGlfbmFtZToiY29uc29sZV9sb2ciLHJ0Y190aW1lc3RhbXA6RGF0ZS5ub3coKX0sdGhpcy5tb2RpZnlJZHMpLHt9LHttZXNzYWdlOnR9KTtPXy5wdXNoKGUpfXJlcG9ydExvbmdTdHJpbmcodCxlKXtjb25zdCByPVhoKFhoKHtldmVudF9rZXk6InJ0Y19pbnZva2Vfc3RhdHVzIixzZGtfYXBpX25hbWU6InNka19sb25nX3N0cmluZ18iLmNvbmNhdCh0KSxydGNfdGltZXN0YW1wOkRhdGUubm93KCl9LHRoaXMubW9kaWZ5SWRzKSx7fSx7bWVzc2FnZTplfSk7dV8ucHVzaChyKX1zZXQodCl7dGhpcy5tb2RpZnlJZHM9T2JqZWN0LmFzc2lnbih0aGlzLm1vZGlmeUlkcyx0KX1kZXN0cm95KCl7fX0oImdsb2JhbCIpLHlfPSh0LGUscik9PnttXy5yZXBvcnQoInJ0Y19lcnJvciIse21lc3NhZ2U6dCxlcnJvcl9jb2RlOmV9LHIpfTtjb25zdCB2Xz1uZXcgTWFwLGJfPXQ9PnZfLmdldCh0KSx3Xz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcygiX3J0Y191cGxvYWRfY29uc29sZV8iKTtmdW5jdGlvbiBTXyh0LGUpe3JldHVybiB0Lm1hcCgodD0+e2xldCByPSIiO3RyeXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYodm9pZCAwPT09dClyZXR1cm4idW5kZWZpbmVkIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYodCBpbnN0YW5jZW9mIE1lZGlhU3RyZWFtVHJhY2spcmV0dXJuIExsKHQpO2lmKHQgaW5zdGFuY2VvZiBNZWRpYVN0cmVhbSlyZXR1cm4gbnVsbD09KGk9dCk/InVuZGVmaW5lZCB8IG51bGwiOiJzdHJpbmciPT10eXBlb2YgaT9pOkpTT04uc3RyaW5naWZ5KHtpZDppLmlkLGFjdGl2ZTppLmFjdGl2ZX0pO2lmKHQgaW5zdGFuY2VvZiBSVENSdHBTZW5kZXIpcmV0dXJuIFJsKHQpO2lmKHQgaW5zdGFuY2VvZiBSVENSdHBSZWNlaXZlcilyZXR1cm4gTmwodCk7aWYodCBpbnN0YW5jZW9mIFJUQ1J0cFRyYW5zY2VpdmVyKXJldHVybiBudWxsPT0obj10KT8idW5kZWZpbmVkIHwgbnVsbCI6InN0cmluZyI9PXR5cGVvZiBuP246SlNPTi5zdHJpbmdpZnkoe2N1cnJlbnREaXJlY3Rpb246bi5jdXJyZW50RGlyZWN0aW9uLGRpcmVjdGlvbjpuLmRpcmVjdGlvbixtaWQ6bi5taWQsc3RvcHBlZDpuLnN0b3BwZWQscmVjZWl2ZXI6Tmwobi5yZWNlaXZlciksc2VuZGVyOlJsKG4uc2VuZGVyKX0pO3I9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobyl7cj10LnRvU3RyaW5nKCl9dmFyIG4saTtyZXR1cm4gciYmci5sZW5ndGg+PWUmJihyPXIuc2xpY2UoMCxlKSkscn0pKS5qb2luKCIsICIpfXZhciBrXyxPXz1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtsbCh0aGlzLCJuYW1lIiwiQ29uc29sZVJlcG9ydG9yIiksbGwodGhpcywiX3V1aWQiLCIiLmNvbmNhdChNYXRoLmZsb29yKDg5OSpNYXRoLnJhbmRvbSgpKSsxMDApKSxsbCh0aGlzLCJfY29uc29sZVJlcG9ydElkIiwwKSxsbCh0aGlzLCJfZW5naW5lUmVwb3J0SWRNYXAiLG5ldyBNYXApLGxsKHRoaXMsIl9lbmFibGVkIiwiTlVMTCIpLGxsKHRoaXMsIl9jb25zb2xlQ3V0TGVuZ3RoIixVbC5nZXRQYXJhbWV0ZXIoIlVQTE9BRF9DT05TT0xFX0xFTkdUSF9DVVQiKSksbGwodGhpcywiYnVmZmVyIixbXSksd18mJnNldFRpbWVvdXQoKCgpPT57dGhpcy5zd2l0Y2hPbigpfSksMCksVWwub24oIlVQTE9BRF9DT05TT0xFX09OIiwodD0+e3Q/dGhpcy5zd2l0Y2hPbigpOnRoaXMudHVybk9mZigpfSkpLFVsLm9uKCJVUExPQURfQ09OU09MRV9MRU5HVEhfQ1VUIiwodD0+e3RoaXMuX2NvbnNvbGVDdXRMZW5ndGg9dH0pKX1nZXQgZW5hYmxlZCgpe3JldHVybiJPRkYiIT09dGhpcy5fZW5hYmxlZH1zd2l0Y2hPbigpeyJOVUxMIj09PXRoaXMuX2VuYWJsZWQmJihjb25zb2xlLmxvZygiW0xvZ2dlclJlcG9ydG9yLmNvbnN0cnVjdG9yXSBjb25zb2xlIHVwbG9hZCBzd2l0Y2ggT04iKSx0aGlzLl9lbmFibGVkPSJPTiIpfXR1cm5PZmYoKXsiTlVMTCI9PT10aGlzLl9lbmFibGVkJiYoY29uc29sZS5sb2coIltMb2dnZXJSZXBvcnRvci5jb25zdHJ1Y3Rvcl0gY29uc29sZSB1cGxvYWQgc3dpdGNoIE9GRiIpLHRoaXMuX2VuYWJsZWQ9Ik9GRiIsdGhpcy5idWZmZXI9W10pfWdldEVuZ2luZUNvbnNvbGVJZCh0KXt2YXIgZTtjb25zdCByPW51bGwhPT0oZT10aGlzLl9lbmdpbmVSZXBvcnRJZE1hcC5nZXQodCkpJiZ2b2lkIDAhPT1lP2U6MDtyZXR1cm4gdGhpcy5fZW5naW5lUmVwb3J0SWRNYXAuc2V0KHQscisxKSxyfXJlcG9ydCh0LGUscixuLGksbyxzLGEsYyl7aWYoIk9GRiI9PT10aGlzLl9lbmFibGVkKXJldHVybjtjb25zdCB1PWJfKGUpLGw9dGhpcy5fY29uc29sZVJlcG9ydElkKyssaD10aGlzLmdldEVuZ2luZUNvbnNvbGVJZChlKSxkPVNfKGMsdGhpcy5fY29uc29sZUN1dExlbmd0aCksZj1bLi4uY10scD0iIi5jb25jYXQoYSkucmVwbGFjZSgvJW98JXMvZ2ksKCgpPT5TXyhbZi5zaGlmdCgpXSx0aGlzLl9jb25zb2xlQ3V0TGVuZ3RoKSkpLF89IlsiLmNvbmNhdCh0aGlzLl91dWlkLCItIikuY29uY2F0KGwsIl1bIikuY29uY2F0KGUsIi0iKS5jb25jYXQoaCwiXS0iKS5jb25jYXQociwiLSIpLmNvbmNhdCh0LCJbIikuY29uY2F0KG4sIl0iKS5jb25jYXQoaSwiWyIpLmNvbmNhdChvLCIuIikuY29uY2F0KHMsIl0gIikuY29uY2F0KHAsIiAiKS5jb25jYXQoZCk7dmFyIGc7dT91LnJlcG9ydExvZyhfKTooZz1fLG1fLnJlcG9ydExvZyhnKSl9cHVzaCh0KXsiT0ZGIiE9PXRoaXMuX2VuYWJsZWQmJnRoaXMuYnVmZmVyLnB1c2godCl9c3BsaWNlKHQpe2lmKCJPTiIhPT10aGlzLl9lbmFibGVkKXJldHVybntwYXlsb2FkOltdLHBheWxvYWRTaXplOjB9O2NvbnN0e2luZGV4OmUsc2l6ZTpyfT1mdW5jdGlvbih0LGUpe2xldCByPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9SlNPTi5zdHJpbmdpZnkodFtuXSkubGVuZ3RoO2lmKHIrPWkscj5lKXJldHVybntpbmRleDpuLHNpemU6ci1pfX1yZXR1cm57aW5kZXg6dC5sZW5ndGgsc2l6ZTpyfX0odGhpcy5idWZmZXIsdCk7cmV0dXJue3BheWxvYWQ6dGhpcy5idWZmZXIuc3BsaWNlKDAsZSkscGF5bG9hZFNpemU6cn19dW5zaGlmdCh0KXt0aGlzLmJ1ZmZlcj10LmNvbmNhdCh0aGlzLmJ1ZmZlcil9Z2V0KCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCh0KXt0aGlzLmJ1ZmZlcj10LmNvbmNhdCh0aGlzLmJ1ZmZlcil9aXNFbXB0eSgpe3JldHVybiJPRkYiPT09dGhpcy5fZW5hYmxlZHx8MD09PXRoaXMuYnVmZmVyLmxlbmd0aH19O2NvbnN0IEVfPSJbVkVSVENdIix4Xz0iIzAwNTBiMyIsQV89e0RFQlVHOiJyZ2JhKDAsIDAsIDAsIDApIiwiIElORk8iOiJyZ2JhKDkzLCAxNzMsIDIyNiwgMCkiLCIgV0FSTiI6InJnYmEoMjU1LCAxMTksIDAsIDAuMykiLEVSUk9SOiJyZ2JhKDI1NSwgMCwgMCwgMC4zKSIsIiBTVUNDIjoicmdiYSgwLCAxMTksIDAsIDAuMykifSxDXz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoIl9ydGNfZGVidWdfIil8fChudWxsPT09KGtfPXdpbmRvdy5sb2NhbFN0b3JhZ2UpfHx2b2lkIDA9PT1rXz92b2lkIDA6a18uZ2V0SXRlbSgiX3J0Y19kZWJ1Z18iKSkpO2NvbnN0IElfPSgpPT57Y29uc3QgdD1uZXcgRGF0ZTtyZXR1cm4iIi5jb25jYXQodC50b1RpbWVTdHJpbmcoKS5zcGxpdCgiICIpWzBdLCI6IikuY29uY2F0KHQuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCIwIikpfTt2YXIgVF8sQl8sTF8sUl8sTl8sel89Y2xhc3N7Y29uc3RydWN0b3IodCxlKXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06Imdsb2JhbCI7bGwodGhpcywiaW5kZW50Iix2b2lkIDApLGxsKHRoaXMsIm1vZHVsZSIsdm9pZCAwKSxsbCh0aGlzLCJfZW5naW5lSWQiLHZvaWQgMCksdGhpcy5tb2R1bGU9dCx0aGlzLmluZGVudD1lLHRoaXMuX2VuZ2luZUlkPXJ9X3ByaW50KHQsZSl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkocj4yP3ItMjowKSxpPTI7aTxyO2krKyluW2ktMl09YXJndW1lbnRzW2ldO2NvbnN0IG89bi5zaGlmdCgpO3RyeXtjb25zdCB0PVsuLi5uXSxyPSIiLmNvbmNhdChvKS5yZXBsYWNlKC8lby9naSwoKCk9Pntjb25zdCBlPXQuc2hpZnQoKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9KSk7UGwuc2V0KCIiLmNvbmNhdChFXywiWyIpLmNvbmNhdCh0aGlzLm1vZHVsZSwiLiIpLmNvbmNhdChlLCJdICIpLmNvbmNhdChyLCIgIikuY29uY2F0KHQubWFwKCh0PT5KU09OLnN0cmluZ2lmeSh0KSkpLmpvaW4oIiwgIikpKX1jYXRjaChlbSl7fWxldCBzPSIiO2ZvcihsZXQgYz0wO2M8dGhpcy5pbmRlbnQ7YysrKXMrPSIgICAgIjtjb25zdCBhPUlfKCk7T18ucmVwb3J0KEVfLHRoaXMuX2VuZ2luZUlkLGEsdCxzLHRoaXMubW9kdWxlLGUsbyxuKSxDXyYmY29uc29sZS5sb2coIiVjIi5jb25jYXQoYSwiLSIpLmNvbmNhdChFXywiJWNbIikuY29uY2F0KHQsIl0lYyIpLmNvbmNhdChzLCJbIikuY29uY2F0KHRoaXMubW9kdWxlLCIuIikuY29uY2F0KGUsIl0gIikuY29uY2F0KG8pLCJjb2xvcjoiLmNvbmNhdCh4XywiOyIpLCJiYWNrZ3JvdW5kLWNvbG9yOiIuY29uY2F0KEFfW3RdLCI7IiksImNvbG9yOiIuY29uY2F0KHhfLCI7IiksLi4ubil9cHJpbnQodCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO3RoaXMuX3ByaW50KCIgSU5GTyIsdCwuLi5yKX1kZWJ1Zyh0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShlPjE/ZS0xOjApLG49MTtuPGU7bisrKXJbbi0xXT1hcmd1bWVudHNbbl07dGhpcy5fcHJpbnQoIkRFQlVHIix0LC4uLnIpfWluZm8odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO3RoaXMuX3ByaW50KCIgSU5GTyIsdCwuLi5yKX13YXJuKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KGU+MT9lLTE6MCksbj0xO248ZTtuKyspcltuLTFdPWFyZ3VtZW50c1tuXTt0aGlzLl9wcmludCgiIFdBUk4iLHQsLi4ucil9ZXJyb3IodCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO3RoaXMuX3ByaW50KCJFUlJPUiIsdCwuLi5yKX1zdWNjZXNzKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KGU+MT9lLTE6MCksbj0xO248ZTtuKyspcltuLTFdPWFyZ3VtZW50c1tuXTt0aGlzLl9wcmludCgiIFNVQ0MiLHQsLi4ucil9fTtjb25zdCBEXz0oKT0+InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3csUF89RF8oKT8iIjp3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtmdW5jdGlvbiBNXygpe2xldCB0PSJub25lIjtyZXR1cm4gRF8oKXx8KG51bGwhPT1QXy5tYXRjaCgiRmlyZWZveCIpP3Q9Im1vemlsbGEiOm51bGwhPT1QXy5tYXRjaCgiQ2hyb21lIik/KHQ9ImNocm9tZS1zdGFibGUiLG51bGwhPT1QXy5tYXRjaCgiRWxlY3Ryb24iKSYmKHQ9ImVsZWN0cm9uIikpOihudWxsIT09UF8ubWF0Y2goIlNhZmFyaSIpfHxudWxsIT09UF8ubWF0Y2goIkFwcGxlV2ViS2l0IikpJiYodD0ic2FmYXJpIikpLHR9TV8oKTtjb25zdCBGXz0ic2FmYXJpIj09PU1fKCksVV89ImNocm9tZS1zdGFibGUiPT09TV8oKSxqXz0hRF8oKSYmL0VkZ1wvL2kudGVzdChQXyksSF89IURfKCkmJi9FZGdBL2kudGVzdChQXyksSl89IURfKCkmJi9FZGdpT1MvaS50ZXN0KFBfKSxLXz1qX3x8SF98fEpfOyFEXygpJiZQXy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJtb2JpbGUiKTtjb25zdCBXXz0hRF8oKSYmISEvKGlQaG9uZXxpUGFkfGlQb2QpL2kuZXhlYyhQXyksWl89IURfKCkmJi9BbmRyb2lkL2kudGVzdChQXyk7bGV0IEdfPSIwIjtjb25zdCBWXz0hRF8oKSYmKG51bGw9PT0oVF89UF8ubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKXx8dm9pZCAwPT09VF8/dm9pZCAwOlRfWzFdKTt2YXIgWF87Rl8mJlZfJiYoR189bnVsbD09PShYXz1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC92ZXJzaW9uXC8oXGQrXC5cZCspL2kpKXx8dm9pZCAwPT09WF8/dm9pZCAwOlhfWzFdKTshRF8oKSYmKG51bGw9PT0oQl89UF8ubWF0Y2goL0ZpcmVmb3hcLyhcZCspL2kpKXx8dm9pZCAwPT09Ql98fEJfWzFdKTtjb25zdCBZXz1HXywkXz1udWxsIT09KExfPSFEXygpJiYobnVsbD09PShSXz1QXy5tYXRjaCgvIChbXGRfXSspIGxpa2UgTWFjIE9TIFgvaSkpfHx2b2lkIDA9PT1SX3x8bnVsbD09PShSXz1SX1sxXSl8fHZvaWQgMD09PVJfP3ZvaWQgMDpSXy5zcGxpdCgiXyIpLm1hcCgodD0+cGFyc2VJbnQodCkpKSkpJiZ2b2lkIDAhPT1MXz9MXzpbXTshRF8oKSYmKG51bGw9PT0oTl89UF8ubWF0Y2goL0Nocm9tZVwvKFxkKykvaSkpfHx2b2lkIDA9PT1OX3x8Tl9bMV0pO2NvbnN0IHFfPSJfX3J0Y19wcm9kdWN0UGxhdGZvcm1fXyIsUV89IlJUQ19ERVZJQ0VfSUQiLHRnPSJSVENfQUNDRVNTX05PREUiLGVnPSJSVENfQUNDRVNTX1VSTFMiLHJnPSJFTkdJTkVfV0VCX0NPTkZJRyIsbmc9IlNFUlZFUl9DT05GSUciO2NsYXNzIGlne2dldCh0KXtjb25zdCBlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpO2lmKCFlKXJldHVybiBudWxsO3RyeXtjb25zdCByPUpTT04ucGFyc2UoZSk7cmV0dXJuIHIudHRsPjAmJkRhdGUubm93KCktci5zYXZlVGltZT5yLnR0bD8odGhpcy5kZWxldGUodCksbnVsbCk6ci5tZXNzYWdlfWNhdGNoKHIpe3JldHVybiBudWxsfX1zZXQodCxlKXtjb25zdCByPXt0dGw6YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOi0xLHNhdmVUaW1lOkRhdGUubm93KCksbWVzc2FnZTplfTt0cnl7cmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHQsSlNPTi5zdHJpbmdpZnkocikpLCEwfWNhdGNoKG4pe3JldHVybiExfX1nZXRUdGwodCl7Y29uc3QgZT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0KTtpZighZSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSkudHRsfWNhdGNoKHIpe3JldHVybiBudWxsfX1kZWxldGUodCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19fXZhciBvZz1uZXcgY2xhc3MgZXh0ZW5kcyBpZ3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksbGwodGhpcywiX2FjY2Vzc1ZlcnNpb24iLCJ2MiIpfWdldERldmljZUlkKCl7aWYoRF8oKSlyZXR1cm4iIjtsZXQgdD10aGlzLmdldChRXyk7cmV0dXJuIHQmJiEvXlswLTlhLWZdezh9KC1bMC05YS1mXXs0fSl7M30tWzAtOWEtZl17MTJ9JC8udGVzdCh0KXx8KHQ9ZnVuY3Rpb24odCl7bGV0IGU9IiI7Zm9yKGxldCByPTA7cjx0O3IrKyllKz1NYXRoLmZsb29yKDEwKk1hdGgucmFuZG9tKCkpO3JldHVybiBlfSgxNikpLHRoaXMuc2V0RGV2aWNlSWQodCksdH1zZXREZXZpY2VJZCh0KXt2YXIgZTtyZXR1cm4gZT17ZGV2aWNlX2lkOnR9LF9fLnNldENvbW1vblN0YXRzKGUpLHRoaXMuc2V0KFFfLHQpLHR9Z2V0QWNjZXNzTm9kZSh0KXtyZXR1cm4gdGhpcy5nZXQoIiIuY29uY2F0KHRnLCJfIikuY29uY2F0KHQsIi0iKS5jb25jYXQocV8sIi0iKS5jb25jYXQodGhpcy5fYWNjZXNzVmVyc2lvbikpfXNldEFjY2Vzc05vZGUodCxlLHIpe3JldHVybiB0aGlzLnNldCgiIi5jb25jYXQodGcsIl8iKS5jb25jYXQodCwiLSIpLmNvbmNhdChxXywiLSIpLmNvbmNhdCh0aGlzLl9hY2Nlc3NWZXJzaW9uKSxlLDFlMypyKX1kZWxldGVBY2Nlc3NOb2RlKHQsZSl7bGV0IHI9dGhpcy5nZXRBY2Nlc3NOb2RlKHQpO2NvbnN0IG49dGhpcy5nZXRUdGwoIiIuY29uY2F0KHRnLCJfIikuY29uY2F0KHQsIi0iKS5jb25jYXQocV8pKTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aD4wJiYocj1yLmZpbHRlcigodD0+dC5tZWRpYUlEIT09ZS5tZWRpYUlEJiZ0Lm1zZ0tleSE9PWUubXNnS2V5KSksci5sZW5ndGg+MD90aGlzLnNldEFjY2Vzc05vZGUodCxyLG58fDApOnRoaXMuY2xlYXJBY2Nlc3NOb2RlKHQpKX1jbGVhckFjY2Vzc05vZGUodCl7aWYodCl0aGlzLmRlbGV0ZSgiIi5jb25jYXQodGcsIl8iKS5jb25jYXQodCwiLSIpLmNvbmNhdChxXykpO2Vsc2UgZm9yKGNvbnN0IGUgaW4gbG9jYWxTdG9yYWdlKWUuc3RhcnRzV2l0aCh0ZykmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEFjY2Vzc1VybHMoKXtyZXR1cm4gdGhpcy5nZXQoIiIuY29uY2F0KGVnLCItIikuY29uY2F0KHFfKSl9c2V0QWNjZXNzVXJscyh0KXtjb25zdCBlPXQubWFwKCh0PT57bGV0e2hvc3Q6ZSxwYXRoOnJ9PXQ7cmV0dXJuImh0dHBzOi8vIi5jb25jYXQoZSkuY29uY2F0KHIpfSkpO3JldHVybiB0aGlzLnNldCgiIi5jb25jYXQoZWcsIi0iKS5jb25jYXQocV8pLGUpfWNsZWFyQWNjZXNzVXJscygpe3RoaXMuZGVsZXRlKCIiLmNvbmNhdChlZywiLSIpLmNvbmNhdChxXykpfWdldEVuZ2luZVdlYkNvbmZpZyh0LGUpe3ZhciByO2NvbnN0IG49IiIuY29uY2F0KHQsIl8iKS5jb25jYXQoZSwiXyIpLmNvbmNhdCh0aGlzLmdldERldmljZUlkKCkpLGk9dGhpcy5nZXQocmcpLG89KG51bGw9PWl8fG51bGw9PT0ocj1pLmZpbmQoKHQ9PnQua2V5PT09bikpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5jb25maWcpfHx7fTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxmdW5jdGlvbih0KXtpZigiREVWSUNFX0lEIj09PXQpcmV0dXJuIG9nLmdldERldmljZUlkKCk7cmV0dXJuIF9nW3RdfSgiRU5HSU5FX1dFQl9DT05GSUciKSxvKX1zZXRFbmdpbmVXZWJDb25maWcodCxlLHIpe2lmKCFyKXJldHVybjtjb25zdCBuPSIiLmNvbmNhdCh0LCJfIikuY29uY2F0KGUsIl8iKS5jb25jYXQodGhpcy5nZXREZXZpY2VJZCgpKTtsZXQgaT10aGlzLmdldChyZyl8fFtdO3JldHVybiBpPWkuZmlsdGVyKCh0PT50LmtleSE9PW4pKSxpLnB1c2goe2tleTpuLGNvbmZpZzpyfSksdGhpcy5zZXQocmcsaS5zbGljZSgtNSkpfWdldFNlcnZlckNvbmZpZyh0KXt2YXIgZTtjb25zdCByPSIiLmNvbmNhdCh0KSxuPXRoaXMuZ2V0KG5nKTtyZXR1cm4obnVsbD09bnx8bnVsbD09PShlPW4uZmluZCgodD0+dC5rZXk9PT1yKSkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNvbmZpZyl8fHt9fXNldFNlcnZlckNvbmZpZyh0LGUpe2lmKCFlKXJldHVybjtjb25zdCByPSIiLmNvbmNhdCh0KTtsZXQgbj10aGlzLmdldChuZyl8fFtdO3JldHVybiBuPW4uZmlsdGVyKCh0PT50LmtleSE9PXIpKSxuLnB1c2goe2tleTpyLGNvbmZpZzplfSksdGhpcy5zZXQobmcsbi5zbGljZSgtNSkpfX07Y29uc3Qgc2c9bmV3IHpfKCJKb2luUm9vbUNvbmZpZyIsMCk7Y2xhc3MgYWd7Y29uc3RydWN0b3IodCl7bGwodGhpcywiX3VzZVRjcEFmdGVySm9pblRpbWVvdXQiLGFnLkRFRkFVTFRfQ09ORi51c2VUY3BBZnRlckpvaW5UaW1lb3V0KSxsbCh0aGlzLCJfam9pbldpdGhUY3BPbmx5IixhZy5ERUZBVUxUX0NPTkYuam9pbldpdGhUY3BPbmx5KSxsbCh0aGlzLCJfam9pbldpdGhUY3BPbmx5RGVsYXkiLGFnLkRFRkFVTFRfQ09ORi5qb2luV2l0aFRjcE9ubHlEZWxheSksbGwodGhpcywiX2JsYWNrQnJvd3NlclJlZ2V4TGlzdCIsW10pLHRoaXMuX2VuZ2luZUlkPXQsbG9jYXRpb24uc2VhcmNoLmluZGV4T2YoIl9fcnRjX3RjcF9vbmx5X18iKT4tMSYmKHRoaXMuX2pvaW5XaXRoVGNwT25seT0hMCx0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheT0wKSx0aGlzLl9yZXBvcnQoKX1zdGF0aWMgc2V0RGVmYXVsQ29uZih0KXtsZXR7dXNlVGNwQWZ0ZXJKb2luVGltZW91dDplLGpvaW5XaXRoVGNwT25seTpyLGpvaW5XaXRoVGNwT25seURlbGF5Om59PXQ7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZSYmKGFnLkRFRkFVTFRfQ09ORi51c2VUY3BBZnRlckpvaW5UaW1lb3V0PWUpLCJib29sZWFuIj09dHlwZW9mIHImJihhZy5ERUZBVUxUX0NPTkYuam9pbldpdGhUY3BPbmx5PXIpLCJudW1iZXIiPT10eXBlb2YgbiYmKGFnLkRFRkFVTFRfQ09ORi5qb2luV2l0aFRjcE9ubHlEZWxheT1NYXRoLm1heCgwLG4pKSxhZy5ERUZBVUxUX0NPTkZ9Z2V0IHVzZVRjcEFmdGVySm9pblRpbWVvdXQoKXtyZXR1cm4gdGhpcy5fdXNlVGNwQWZ0ZXJKb2luVGltZW91dH1nZXQgdXNlVGNwSm9pbigpe3JldHVybiB0aGlzLl9qb2luV2l0aFRjcE9ubHl9Z2V0IHVzZVRjcEpvaW5EZWxheSgpe3JldHVybiB0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheX1pc0JsYWNrQnJvd2VyKCl7cmV0dXJuIHRoaXMuX2JsYWNrQnJvd3NlclJlZ2V4TGlzdC5maW5kKCh0PT5uZXcgUmVnRXhwKHQpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpKX1zZXRTZXJ2ZXJDb25maWcodCl7dmFyIGUscixuO2xldCBpPSExOyJib29sZWFuIj09dHlwZW9mKG51bGw9PXR8fG51bGw9PT0oZT10LnVzZV90Y3BfYWZ0ZXJfam9pbl90aW1lb3V0KXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5lbmFibGUpJiYodGhpcy5fdXNlVGNwQWZ0ZXJKb2luVGltZW91dD10LnVzZV90Y3BfYWZ0ZXJfam9pbl90aW1lb3V0LmVuYWJsZSxpPSEwKSwiYm9vbGVhbiI9PXR5cGVvZihudWxsPT10fHxudWxsPT09KHI9dC5qb2luX3dpdGhfdGNwX29ubHkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmVuYWJsZSkmJih0aGlzLl9qb2luV2l0aFRjcE9ubHk9dC5qb2luX3dpdGhfdGNwX29ubHkuZW5hYmxlLGk9ITApLCJudW1iZXIiPT10eXBlb2YobnVsbD09dHx8bnVsbD09PShuPXQuam9pbl93aXRoX3RjcF9vbmx5KXx8dm9pZCAwPT09bj92b2lkIDA6bi5kZWxheV9tcykmJih0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheT10LmpvaW5fd2l0aF90Y3Bfb25seS5kZWxheV9tcyxpPSEwKSx0JiZBcnJheS5pc0FycmF5KHQuYmxhY2tfYnJvd3Nlcl9yZWdleF9saXN0KSYmKHRoaXMuX2JsYWNrQnJvd3NlclJlZ2V4TGlzdD10LmJsYWNrX2Jyb3dzZXJfcmVnZXhfbGlzdCxpPSEwKSxpJiZ0aGlzLl9yZXBvcnQoKX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh7dXNlX3RjcF9hZnRlcl9qb2luX3RpbWVvdXQ6dGhpcy5fdXNlVGNwQWZ0ZXJKb2luVGltZW91dCxqb2luX3dpdGhfdGNwX29ubHk6dGhpcy5fam9pbldpdGhUY3BPbmx5LGpvaW5fd2l0aF90Y3Bfb25seV9kZWxheTp0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheSxibGFja19icm93c2VyX3JlZ2V4X2xpc3Q6dGhpcy5fYmxhY2tCcm93c2VyUmVnZXhMaXN0fSl9X3JlcG9ydCgpe3NnLnByaW50KCJfcmVwb3J0Iix0aGlzLnRvU3RyaW5nKCkpLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbjtsZXQgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XToiIixzPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwO251bGw9PT0obj1iXyh0KSl8fHZvaWQgMD09PW58fG4ucmVwb3J0KCJydGNfaW52b2tlX3N0YXR1cyIse3Nka19hcGlfbmFtZTplLG1lc3NhZ2U6cixlcnJvcl9jb2RlOmksc3RyZWFtX2lkOm8sZWxhcHNlOjB9LHMpfSh0aGlzLl9lbmdpbmVJZCwid2ViX2pvaW5fcm9vbV9jb25maWciLHRoaXMudG9TdHJpbmcoKSl9fWxsKGFnLCJERUZBVUxUX0NPTkYiLHt1c2VUY3BBZnRlckpvaW5UaW1lb3V0OiEwLGpvaW5XaXRoVGNwT25seTohMSxqb2luV2l0aFRjcE9ubHlEZWxheTo1ZTN9KTt2YXIgY2c9KHQ9Pih0W3QuTk9ORT0wXT0iTk9ORSIsdCkpKGNnfHx7fSksdWc9bztDcih7Z2xvYmFsOiEwLGZvcmNlZDp1Zy5nbG9iYWxUaGlzIT09dWd9LHtnbG9iYWxUaGlzOnVnfSk7dmFyIGxnLGhnPWUobyksZGc9KHQ9Pih0LkgyNjQ9IkgyNjQiLHQuVlA4PSJWUDgiLHQuSDI2NT0iSDI2NSIsdCkpKGRnfHx7fSk7Wl8mJlVffHxXXyYmJF9bMF0sRl8mJigobnVsbD09WV8/dm9pZCAwOllfLmluY2x1ZGVzKCIxNi4xIikpfHwobnVsbD09WV8/dm9pZCAwOllfLmluY2x1ZGVzKCIxNi4yIikpfHxudWxsPT1ZX3x8WV8uaW5jbHVkZXMoIjE2LjMiKSk7Y29uc3QgZmc9Il9fcnRjX2FjY2Vzc0RvbWFpbnNfXyIuc3BsaXQoIiwiKTtjb25zdCBwZz0iX19ydGNfY29uZmlnRG9tYWluc19fIi5zcGxpdCgiLCIpLF9nPXtWRVJTSU9OOiJfX1BMQUNFSE9MREVSX1ZFUlNJT05fXyIsSUNFX0NPTkZJR19SRVFVRVNUX1VSTFNfSU5URVJOQUw6ZmcubWFwKChmdW5jdGlvbigpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiIjtyZXR1cm4gdD8oL15odHRwcz86XC9cLy4rLy50ZXN0KHQpfHwodD0iaHR0cHM6Ly8iLmNvbmNhdCh0KSksIiIuY29uY2F0KHQsIi9kaXNwYXRjaC92MS9BY2Nlc3NJbmZvP0FjdGlvbj1HZXRBY2Nlc3NJbmZvIikpOiIifSkpLElDRV9DT05GSUdfUkVRVUVTVF9VUkxTOltdLEVYUEVDVEVEX0FERFI6IiIsTE9HX1NFUlZFUl9VUkw6Il9fcnRjX2RvbWVzdGljTG9nU2VydmVyVXJsX18iLENPTkZJR19SRVFVRVNUX0RPTUFJTlM6cGcsREVWSUNFX0lEOiIiLE9WRVJTRUE6ITEsUExBVEZPUk06IiIsUFJPRFVDVDoiIixGT1JDRV9FTkFCTEVEX1JFUE9SVF9DQUxMQkFDS1M6W10sU0tJUF9XRUJfQVVESU9fSU5fVFJBQ0s6ITEsRU5GT1JDRV9XRUJfQVVESU9fU1VQUE9SVEVEOiExLEFVRElPX1NUQUxMOiEwLFZJREVPX1NUQUxMOiEwLFZJREVPX1NUQUxMXzEwME1TOiExLFNUQVRTX1NDQUxMQkFDS19TVVBQT1JUOiEwLEpPSU5fUk9PTV9DT05GSUc6YWcuREVGQVVMVF9DT05GLFNJR05BTF9DT01QUkVTU0lPTjohMCxTSUdOQUxfQ1JPUF9KT0lOUk9PTTohMCxWSURFT19TVEFMTF9EQVRBOjUwMCxBVURJT19TVEFMTF9EQVRBOjIwMCxJT1NfU0FGQVJJX09SSUVOVEFUSU9OOiExLEJMQUNLX0ZSQU1FX0xJRkVUSU1FOjZlNCxGQUxMQkFDS19FTkNPREVfQ09ERUM6IiIsU0VJX1RJTUVfT1VUOjJlMyxTRUlfQ09VTlRfRlBTOjEsUFJFX0lDRTohMSxTVEFUU19MT09QX0lOVEVSVkFMOjFlMyxISURERU5fU1RBVFM6ITEsVVBMT0FEX1JFTU9URV9TVEFUUzpjZy5OT05FLFNES19DT0RFQ19ORUdPVElBVElPTjohMCxBVURJT19DT0RFQzoiT1BVUyIsRElTQUJMRV9FTkNPREVEX1RSQU5TRk9STTohMSxTS0lQX1NFSV9GSUxURVI6ITEsQVJFQV9DT0RFOiIiLERJU0FCTEVfQ09NUFVURV9QUkVTU1VSRTohMSxTRU5EX01FU1NBR0VfU1lOQzohMSxIMjY0X0hXX0VOQ09ERVI6ITEsR1BVX1VSTDoiIixUVVJOX09OX0pPSU5fUk9PTV9GQUlMVVJFX0NBTExCQUNLOiExLEVOQUJMRV9GQUxMQkFDS19IQU5ETEVSOiExLEVOQUJMRV9TVEFOREFSRF9IQU5ETEVSOihVX3x8S18pJiYhV18sUENfS0lMTFNXSVRDSDp7fSxFTkFCTEVfUExBWV9BRlRFUl9DTElDSzohMSxBVVRPUExBWV9XT1JLQVJPVU5EOiEwLEVOR0lORV9XRUJfQ09ORklHOnt9LERJU0FCTEVfSU9TX01VVEVfV09SS0FST1VORDohMSxKSVRURVJfU1RFUFBFUl9JTlRFUlZBTF9NUzoxZTMsSklUVEVSX1NURVBQRVJfU1RFUF9TSVpFX01TOjIwMCxKSVRURVJfU1RFUFBFUl9NQVhfQVZfU1lOQ19ESUZGOjQwMCxKSVRURVJfU1RFUFBFUl9NQVhfU0VUX0RJRkY6NTAwLEpJVFRFUl9TVEVQUEVSX01BWF9ESUZGX0VYQ0VFRF9DT1VOVDo4LFNVQlNDUklCRV9DVVNUT01fRVhUUkFfUEFSQU1TOnt9fTsidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8bnVsbD09PShsZz13aW5kb3cpfHx2b2lkIDA9PT1sZ3x8bnVsbD09PShsZz1sZy5SVENQZWVyQ29ubmVjdGlvbil8fHZvaWQgMD09PWxnfHxsZy5wcm90b3R5cGUuc2V0UmVtb3RlRGVzY3JpcHRpb247dmFyIGdnLG1nLHlnPXtleHBvcnRzOnt9fSx2Zz1uZXcgUHJveHkoe30se2dldCh0LGUpe3Rocm93IG5ldyBFcnJvcihgTW9kdWxlICIiIGhhcyBiZWVuIGV4dGVybmFsaXplZCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5LiBDYW5ub3QgYWNjZXNzICIuJHtlfSIgaW4gY2xpZW50IGNvZGUuICBTZWUgaHR0cDovL3ZpdGVqcy5kZXYvZ3VpZGUvdHJvdWJsZXNob290aW5nLmh0bWwjbW9kdWxlLWV4dGVybmFsaXplZC1mb3ItYnJvd3Nlci1jb21wYXRpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuYCl9fSksYmc9cihPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OnZnfSkpO2Z1bmN0aW9uIHdnKCl7cmV0dXJuIGdnfHwoZ2c9MSx5Zy5leHBvcnRzPShlPWV8fGZ1bmN0aW9uKGUscil7dmFyIG47aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jcnlwdG8mJihuPXdpbmRvdy5jcnlwdG8pLCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jcnlwdG8mJihuPXNlbGYuY3J5cHRvKSx2b2lkIDAhPT1oZyYmaGcuY3J5cHRvJiYobj1oZy5jcnlwdG8pLCFuJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm1zQ3J5cHRvJiYobj13aW5kb3cubXNDcnlwdG8pLCFuJiZ2b2lkIDAhPT10JiZ0LmNyeXB0byYmKG49dC5jcnlwdG8pLCFuKXRyeXtuPWJnfWNhdGNoKGcpe312YXIgaT1mdW5jdGlvbigpe2lmKG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmdldFJhbmRvbVZhbHVlcyl0cnl7cmV0dXJuIG4uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF19Y2F0Y2goZyl7fWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLnJhbmRvbUJ5dGVzKXRyeXtyZXR1cm4gbi5yYW5kb21CeXRlcyg0KS5yZWFkSW50MzJMRSgpfWNhdGNoKGcpe319dGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgY3J5cHRvIG1vZHVsZSBjb3VsZCBub3QgYmUgdXNlZCB0byBnZXQgc2VjdXJlIHJhbmRvbSBudW1iZXIuIil9LG89T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXt2YXIgcjtyZXR1cm4gdC5wcm90b3R5cGU9ZSxyPW5ldyB0LHQucHJvdG90eXBlPW51bGwscn19KCkscz17fSxhPXMubGliPXt9LGM9YS5CYXNlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzKTtyZXR1cm4gdCYmZS5taXhJbih0KSxlLmhhc093blByb3BlcnR5KCJpbml0IikmJnRoaXMuaW5pdCE9PWUuaW5pdHx8KGUuaW5pdD1mdW5jdGlvbigpe2UuJHN1cGVyLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksZS5pbml0LnByb3RvdHlwZT1lLGUuJHN1cGVyPXRoaXMsZX0sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5leHRlbmQoKTtyZXR1cm4gdC5pbml0LmFwcGx5KHQsYXJndW1lbnRzKSx0fSxpbml0OmZ1bmN0aW9uKCl7fSxtaXhJbjpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodGhpc1tlXT10W2VdKTt0Lmhhc093blByb3BlcnR5KCJ0b1N0cmluZyIpJiYodGhpcy50b1N0cmluZz10LnRvU3RyaW5nKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyl9fSx1PWEuV29yZEFycmF5PWMuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKHQsZSl7dD10aGlzLndvcmRzPXR8fFtdLHRoaXMuc2lnQnl0ZXM9ZSE9cj9lOjQqdC5sZW5ndGh9LHRvU3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybih0fHxoKS5zdHJpbmdpZnkodGhpcyl9LGNvbmNhdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLndvcmRzLHI9dC53b3JkcyxuPXRoaXMuc2lnQnl0ZXMsaT10LnNpZ0J5dGVzO2lmKHRoaXMuY2xhbXAoKSxuJTQpZm9yKHZhciBvPTA7bzxpO28rKyl7dmFyIHM9cltvPj4+Ml0+Pj4yNC1vJTQqOCYyNTU7ZVtuK28+Pj4yXXw9czw8MjQtKG4rbyklNCo4fWVsc2UgZm9yKHZhciBhPTA7YTxpO2ErPTQpZVtuK2E+Pj4yXT1yW2E+Pj4yXTtyZXR1cm4gdGhpcy5zaWdCeXRlcys9aSx0aGlzfSxjbGFtcDpmdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHMscj10aGlzLnNpZ0J5dGVzO3Rbcj4+PjJdJj00Mjk0OTY3Mjk1PDwzMi1yJTQqOCx0Lmxlbmd0aD1lLmNlaWwoci80KX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1jLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIHQud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKSx0fSxyYW5kb206ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQ7cis9NCllLnB1c2goaSgpKTtyZXR1cm4gbmV3IHUuaW5pdChlLHQpfX0pLGw9cy5lbmM9e30saD1sLkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LndvcmRzLHI9dC5zaWdCeXRlcyxuPVtdLGk9MDtpPHI7aSsrKXt2YXIgbz1lW2k+Pj4yXT4+PjI0LWklNCo4JjI1NTtuLnB1c2goKG8+Pj40KS50b1N0cmluZygxNikpLG4ucHVzaCgoMTUmbykudG9TdHJpbmcoMTYpKX1yZXR1cm4gbi5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9W10sbj0wO248ZTtuKz0yKXJbbj4+PjNdfD1wYXJzZUludCh0LnN1YnN0cihuLDIpLDE2KTw8MjQtbiU4KjQ7cmV0dXJuIG5ldyB1LmluaXQocixlLzIpfX0sZD1sLkxhdGluMT17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LndvcmRzLHI9dC5zaWdCeXRlcyxuPVtdLGk9MDtpPHI7aSsrKXt2YXIgbz1lW2k+Pj4yXT4+PjI0LWklNCo4JjI1NTtuLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShvKSl9cmV0dXJuIG4uam9pbigiIil9LHBhcnNlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPVtdLG49MDtuPGU7bisrKXJbbj4+PjJdfD0oMjU1JnQuY2hhckNvZGVBdChuKSk8PDI0LW4lNCo4O3JldHVybiBuZXcgdS5pbml0KHIsZSl9fSxmPWwuVXRmOD17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShkLnN0cmluZ2lmeSh0KSkpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIFVURi04IGRhdGEiKX19LHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBkLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0KSkpfX0scD1hLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG09Yy5leHRlbmQoe3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fZGF0YT1uZXcgdS5pbml0LHRoaXMuX25EYXRhQnl0ZXM9MH0sX2FwcGVuZDpmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PWYucGFyc2UodCkpLHRoaXMuX2RhdGEuY29uY2F0KHQpLHRoaXMuX25EYXRhQnl0ZXMrPXQuc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciByLG49dGhpcy5fZGF0YSxpPW4ud29yZHMsbz1uLnNpZ0J5dGVzLHM9dGhpcy5ibG9ja1NpemUsYT1vLyg0KnMpLGM9KGE9dD9lLmNlaWwoYSk6ZS5tYXgoKDB8YSktdGhpcy5fbWluQnVmZmVyU2l6ZSwwKSkqcyxsPWUubWluKDQqYyxvKTtpZihjKXtmb3IodmFyIGg9MDtoPGM7aCs9cyl0aGlzLl9kb1Byb2Nlc3NCbG9jayhpLGgpO3I9aS5zcGxpY2UoMCxjKSxuLnNpZ0J5dGVzLT1sfXJldHVybiBuZXcgdS5pbml0KHIsbCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9Yy5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKSx0fSxfbWluQnVmZmVyU2l6ZTowfSk7YS5IYXNoZXI9cC5leHRlbmQoe2NmZzpjLmV4dGVuZCgpLGluaXQ6ZnVuY3Rpb24odCl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHQpLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtwLnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSx1cGRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FwcGVuZCh0KSx0aGlzLl9wcm9jZXNzKCksdGhpc30sZmluYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2FwcGVuZCh0KSx0aGlzLl9kb0ZpbmFsaXplKCl9LGJsb2NrU2l6ZToxNixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiBuZXcgdC5pbml0KHIpLmZpbmFsaXplKGUpfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7cmV0dXJuIG5ldyBfLkhNQUMuaW5pdCh0LHIpLmZpbmFsaXplKGUpfX19KTt2YXIgXz1zLmFsZ289e307cmV0dXJuIHN9KE1hdGgpLGUpKSx5Zy5leHBvcnRzO3ZhciBlfW1nPXdnKCksZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIpe3ZhciB0PW1nLmxpYi5Xb3JkQXJyYXksZT10LmluaXQscj10LmluaXQ9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYodD1uZXcgVWludDhBcnJheSh0KSksKHQgaW5zdGFuY2VvZiBJbnQ4QXJyYXl8fCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXkmJnQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8dCBpbnN0YW5jZW9mIEludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MTZBcnJheXx8dCBpbnN0YW5jZW9mIEludDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkmJih0PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpKSx0IGluc3RhbmNlb2YgVWludDhBcnJheSl7Zm9yKHZhciByPXQuYnl0ZUxlbmd0aCxuPVtdLGk9MDtpPHI7aSsrKW5baT4+PjJdfD10W2ldPDwyNC1pJTQqODtlLmNhbGwodGhpcyxuLHIpfWVsc2UgZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3IucHJvdG90eXBlPXR9fSgpLG1nLmxpYi5Xb3JkQXJyYXk7dmFyIFNnLGtnPXtleHBvcnRzOnt9fTtmdW5jdGlvbiBPZygpe3JldHVybiBTZ3x8KFNnPTEsZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQscj1lLmxpYi5Xb3JkQXJyYXk7ZnVuY3Rpb24gbih0LGUsbil7Zm9yKHZhciBpPVtdLG89MCxzPTA7czxlO3MrKylpZihzJTQpe3ZhciBhPW5bdC5jaGFyQ29kZUF0KHMtMSldPDxzJTQqMnxuW3QuY2hhckNvZGVBdChzKV0+Pj42LXMlNCoyO2lbbz4+PjJdfD1hPDwyNC1vJTQqOCxvKyt9cmV0dXJuIHIuY3JlYXRlKGksbyl9ZS5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC53b3JkcyxyPXQuc2lnQnl0ZXMsbj10aGlzLl9tYXA7dC5jbGFtcCgpO2Zvcih2YXIgaT1bXSxvPTA7bzxyO28rPTMpZm9yKHZhciBzPShlW28+Pj4yXT4+PjI0LW8lNCo4JjI1NSk8PDE2fChlW28rMT4+PjJdPj4+MjQtKG8rMSklNCo4JjI1NSk8PDh8ZVtvKzI+Pj4yXT4+PjI0LShvKzIpJTQqOCYyNTUsYT0wO2E8NCYmbysuNzUqYTxyO2ErKylpLnB1c2gobi5jaGFyQXQocz4+PjYqKDMtYSkmNjMpKTt2YXIgYz1uLmNoYXJBdCg2NCk7aWYoYylmb3IoO2kubGVuZ3RoJTQ7KWkucHVzaChjKTtyZXR1cm4gaS5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj10aGlzLl9tYXAsaT10aGlzLl9yZXZlcnNlTWFwO2lmKCFpKXtpPXRoaXMuX3JldmVyc2VNYXA9W107Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspaVtyLmNoYXJDb2RlQXQobyldPW99dmFyIHM9ci5jaGFyQXQoNjQpO2lmKHMpe3ZhciBhPXQuaW5kZXhPZihzKTstMSE9PWEmJihlPWEpfXJldHVybiBuKHQsZSxpKX0sX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0ifX0oKSx0LmVuYy5CYXNlNjR9KHdnKCkpfShrZykpLGtnLmV4cG9ydHN9dmFyIEVnLHhnPXtleHBvcnRzOnt9fTtmdW5jdGlvbiBBZygpe3JldHVybiBFZ3x8KEVnPTEsZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10LG49ci5saWIsaT1uLldvcmRBcnJheSxvPW4uSGFzaGVyLHM9ci5hbGdvLGE9W107IWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDw2NDt0KyspYVt0XT00Mjk0OTY3Mjk2KmUuYWJzKGUuc2luKHQrMSkpfDB9KCk7dmFyIGM9cy5NRDU9by5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgaS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTA7cjwxNjtyKyspe3ZhciBuPWUrcixpPXRbbl07dFtuXT0xNjcxMTkzNSYoaTw8OHxpPj4+MjQpfDQyNzgyNTUzNjAmKGk8PDI0fGk+Pj44KX12YXIgbz10aGlzLl9oYXNoLndvcmRzLHM9dFtlKzBdLGM9dFtlKzFdLGY9dFtlKzJdLHA9dFtlKzNdLF89dFtlKzRdLGc9dFtlKzVdLG09dFtlKzZdLHk9dFtlKzddLHY9dFtlKzhdLGI9dFtlKzldLHc9dFtlKzEwXSxTPXRbZSsxMV0saz10W2UrMTJdLE89dFtlKzEzXSxFPXRbZSsxNF0seD10W2UrMTVdLEE9b1swXSxDPW9bMV0sST1vWzJdLFQ9b1szXTtBPXUoQSxDLEksVCxzLDcsYVswXSksVD11KFQsQSxDLEksYywxMixhWzFdKSxJPXUoSSxULEEsQyxmLDE3LGFbMl0pLEM9dShDLEksVCxBLHAsMjIsYVszXSksQT11KEEsQyxJLFQsXyw3LGFbNF0pLFQ9dShULEEsQyxJLGcsMTIsYVs1XSksST11KEksVCxBLEMsbSwxNyxhWzZdKSxDPXUoQyxJLFQsQSx5LDIyLGFbN10pLEE9dShBLEMsSSxULHYsNyxhWzhdKSxUPXUoVCxBLEMsSSxiLDEyLGFbOV0pLEk9dShJLFQsQSxDLHcsMTcsYVsxMF0pLEM9dShDLEksVCxBLFMsMjIsYVsxMV0pLEE9dShBLEMsSSxULGssNyxhWzEyXSksVD11KFQsQSxDLEksTywxMixhWzEzXSksST11KEksVCxBLEMsRSwxNyxhWzE0XSksQT1sKEEsQz11KEMsSSxULEEseCwyMixhWzE1XSksSSxULGMsNSxhWzE2XSksVD1sKFQsQSxDLEksbSw5LGFbMTddKSxJPWwoSSxULEEsQyxTLDE0LGFbMThdKSxDPWwoQyxJLFQsQSxzLDIwLGFbMTldKSxBPWwoQSxDLEksVCxnLDUsYVsyMF0pLFQ9bChULEEsQyxJLHcsOSxhWzIxXSksST1sKEksVCxBLEMseCwxNCxhWzIyXSksQz1sKEMsSSxULEEsXywyMCxhWzIzXSksQT1sKEEsQyxJLFQsYiw1LGFbMjRdKSxUPWwoVCxBLEMsSSxFLDksYVsyNV0pLEk9bChJLFQsQSxDLHAsMTQsYVsyNl0pLEM9bChDLEksVCxBLHYsMjAsYVsyN10pLEE9bChBLEMsSSxULE8sNSxhWzI4XSksVD1sKFQsQSxDLEksZiw5LGFbMjldKSxJPWwoSSxULEEsQyx5LDE0LGFbMzBdKSxBPWgoQSxDPWwoQyxJLFQsQSxrLDIwLGFbMzFdKSxJLFQsZyw0LGFbMzJdKSxUPWgoVCxBLEMsSSx2LDExLGFbMzNdKSxJPWgoSSxULEEsQyxTLDE2LGFbMzRdKSxDPWgoQyxJLFQsQSxFLDIzLGFbMzVdKSxBPWgoQSxDLEksVCxjLDQsYVszNl0pLFQ9aChULEEsQyxJLF8sMTEsYVszN10pLEk9aChJLFQsQSxDLHksMTYsYVszOF0pLEM9aChDLEksVCxBLHcsMjMsYVszOV0pLEE9aChBLEMsSSxULE8sNCxhWzQwXSksVD1oKFQsQSxDLEkscywxMSxhWzQxXSksST1oKEksVCxBLEMscCwxNixhWzQyXSksQz1oKEMsSSxULEEsbSwyMyxhWzQzXSksQT1oKEEsQyxJLFQsYiw0LGFbNDRdKSxUPWgoVCxBLEMsSSxrLDExLGFbNDVdKSxJPWgoSSxULEEsQyx4LDE2LGFbNDZdKSxBPWQoQSxDPWgoQyxJLFQsQSxmLDIzLGFbNDddKSxJLFQscyw2LGFbNDhdKSxUPWQoVCxBLEMsSSx5LDEwLGFbNDldKSxJPWQoSSxULEEsQyxFLDE1LGFbNTBdKSxDPWQoQyxJLFQsQSxnLDIxLGFbNTFdKSxBPWQoQSxDLEksVCxrLDYsYVs1Ml0pLFQ9ZChULEEsQyxJLHAsMTAsYVs1M10pLEk9ZChJLFQsQSxDLHcsMTUsYVs1NF0pLEM9ZChDLEksVCxBLGMsMjEsYVs1NV0pLEE9ZChBLEMsSSxULHYsNixhWzU2XSksVD1kKFQsQSxDLEkseCwxMCxhWzU3XSksST1kKEksVCxBLEMsbSwxNSxhWzU4XSksQz1kKEMsSSxULEEsTywyMSxhWzU5XSksQT1kKEEsQyxJLFQsXyw2LGFbNjBdKSxUPWQoVCxBLEMsSSxTLDEwLGFbNjFdKSxJPWQoSSxULEEsQyxmLDE1LGFbNjJdKSxDPWQoQyxJLFQsQSxiLDIxLGFbNjNdKSxvWzBdPW9bMF0rQXwwLG9bMV09b1sxXStDfDAsb1syXT1vWzJdK0l8MCxvWzNdPW9bM10rVHwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEscj10LndvcmRzLG49OCp0aGlzLl9uRGF0YUJ5dGVzLGk9OCp0LnNpZ0J5dGVzO3JbaT4+PjVdfD0xMjg8PDI0LWklMzI7dmFyIG89ZS5mbG9vcihuLzQyOTQ5NjcyOTYpLHM9bjtyWzE1KyhpKzY0Pj4+OTw8NCldPTE2NzExOTM1JihvPDw4fG8+Pj4yNCl8NDI3ODI1NTM2MCYobzw8MjR8bz4+PjgpLHJbMTQrKGkrNjQ+Pj45PDw0KV09MTY3MTE5MzUmKHM8PDh8cz4+PjI0KXw0Mjc4MjU1MzYwJihzPDwyNHxzPj4+OCksdC5zaWdCeXRlcz00KihyLmxlbmd0aCsxKSx0aGlzLl9wcm9jZXNzKCk7Zm9yKHZhciBhPXRoaXMuX2hhc2gsYz1hLndvcmRzLHU9MDt1PDQ7dSsrKXt2YXIgbD1jW3VdO2NbdV09MTY3MTE5MzUmKGw8PDh8bD4+PjI0KXw0Mjc4MjU1MzYwJihsPDwyNHxsPj4+OCl9cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9by5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fX0pO2Z1bmN0aW9uIHUodCxlLHIsbixpLG8scyl7dmFyIGE9dCsoZSZyfH5lJm4pK2krcztyZXR1cm4oYTw8b3xhPj4+MzItbykrZX1mdW5jdGlvbiBsKHQsZSxyLG4saSxvLHMpe3ZhciBhPXQrKGUmbnxyJn5uKStpK3M7cmV0dXJuKGE8PG98YT4+PjMyLW8pK2V9ZnVuY3Rpb24gaCh0LGUscixuLGksbyxzKXt2YXIgYT10KyhlXnJebikraStzO3JldHVybihhPDxvfGE+Pj4zMi1vKStlfWZ1bmN0aW9uIGQodCxlLHIsbixpLG8scyl7dmFyIGE9dCsocl4oZXx+bikpK2krcztyZXR1cm4oYTw8b3xhPj4+MzItbykrZX1yLk1ENT1vLl9jcmVhdGVIZWxwZXIoYyksci5IbWFjTUQ1PW8uX2NyZWF0ZUhtYWNIZWxwZXIoYyl9KE1hdGgpLHQuTUQ1fSh3ZygpKX0oeGcpKSx4Zy5leHBvcnRzfXZhciBDZyxJZz17ZXhwb3J0czp7fX0sVGc9e2V4cG9ydHM6e319O2Z1bmN0aW9uIEJnKCl7cmV0dXJuIENnfHwoQ2c9MSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHI9KGU9dCkubGliLG49ci5Xb3JkQXJyYXksaT1yLkhhc2hlcixvPWUuYWxnbyxzPVtdLGE9by5TSEExPWkuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IG4uaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX2hhc2gud29yZHMsbj1yWzBdLGk9clsxXSxvPXJbMl0sYT1yWzNdLGM9cls0XSx1PTA7dTw4MDt1Kyspe2lmKHU8MTYpc1t1XT0wfHRbZSt1XTtlbHNle3ZhciBsPXNbdS0zXV5zW3UtOF1ec1t1LTE0XV5zW3UtMTZdO3NbdV09bDw8MXxsPj4+MzF9dmFyIGg9KG48PDV8bj4+PjI3KStjK3NbdV07aCs9dTwyMD8xNTE4NTAwMjQ5KyhpJm98fmkmYSk6dTw0MD8xODU5Nzc1MzkzKyhpXm9eYSk6dTw2MD8oaSZvfGkmYXxvJmEpLTE4OTQwMDc1ODg6KGleb15hKS04OTk0OTc1MTQsYz1hLGE9byxvPWk8PDMwfGk+Pj4yLGk9bixuPWh9clswXT1yWzBdK258MCxyWzFdPXJbMV0raXwwLHJbMl09clsyXStvfDAsclszXT1yWzNdK2F8MCxyWzRdPXJbNF0rY3wwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10LndvcmRzLHI9OCp0aGlzLl9uRGF0YUJ5dGVzLG49OCp0LnNpZ0J5dGVzO3JldHVybiBlW24+Pj41XXw9MTI4PDwyNC1uJTMyLGVbMTQrKG4rNjQ+Pj45PDw0KV09TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLGVbMTUrKG4rNjQ+Pj45PDw0KV09cix0LnNpZ0J5dGVzPTQqZS5sZW5ndGgsdGhpcy5fcHJvY2VzcygpLHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9aS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fX0pLGUuU0hBMT1pLl9jcmVhdGVIZWxwZXIoYSksZS5IbWFjU0hBMT1pLl9jcmVhdGVIbWFjSGVscGVyKGEpLHQuU0hBMTt2YXIgZSxyLG4saSxvLHMsYX0od2coKSl9KFRnKSksVGcuZXhwb3J0c312YXIgTGcsUmcsTmc9e2V4cG9ydHM6e319O2Z1bmN0aW9uIHpnKCl7cmV0dXJuIFJnfHwoUmc9MSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHI9KGU9dCkubGliLG49ci5CYXNlLGk9ci5Xb3JkQXJyYXksbz1lLmFsZ28scz1vLk1ENSxhPW8uRXZwS0RGPW4uZXh0ZW5kKHtjZmc6bi5leHRlbmQoe2tleVNpemU6NCxoYXNoZXI6cyxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKHQpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZCh0KX0sY29tcHV0ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuPXRoaXMuY2ZnLG89bi5oYXNoZXIuY3JlYXRlKCkscz1pLmNyZWF0ZSgpLGE9cy53b3JkcyxjPW4ua2V5U2l6ZSx1PW4uaXRlcmF0aW9uczthLmxlbmd0aDxjOyl7ciYmby51cGRhdGUocikscj1vLnVwZGF0ZSh0KS5maW5hbGl6ZShlKSxvLnJlc2V0KCk7Zm9yKHZhciBsPTE7bDx1O2wrKylyPW8uZmluYWxpemUociksby5yZXNldCgpO3MuY29uY2F0KHIpfXJldHVybiBzLnNpZ0J5dGVzPTQqYyxzfX0pLGUuRXZwS0RGPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gYS5jcmVhdGUocikuY29tcHV0ZSh0LGUpfSx0LkV2cEtERjt2YXIgZSxyLG4saSxvLHMsYX0od2coKSxCZygpLExnfHwoTGc9MSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUscixuO3I9KGU9dCkubGliLkJhc2Usbj1lLmVuYy5VdGY4LGUuYWxnby5ITUFDPXIuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKHQsZSl7dD10aGlzLl9oYXNoZXI9bmV3IHQuaW5pdCwic3RyaW5nIj09dHlwZW9mIGUmJihlPW4ucGFyc2UoZSkpO3ZhciByPXQuYmxvY2tTaXplLGk9NCpyO2Uuc2lnQnl0ZXM+aSYmKGU9dC5maW5hbGl6ZShlKSksZS5jbGFtcCgpO2Zvcih2YXIgbz10aGlzLl9vS2V5PWUuY2xvbmUoKSxzPXRoaXMuX2lLZXk9ZS5jbG9uZSgpLGE9by53b3JkcyxjPXMud29yZHMsdT0wO3U8cjt1KyspYVt1XV49MTU0OTU1NjgyOCxjW3VdXj05MDk1MjI0ODY7by5zaWdCeXRlcz1zLnNpZ0J5dGVzPWksdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2hhc2hlcjt0LnJlc2V0KCksdC51cGRhdGUodGhpcy5faUtleSl9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faGFzaGVyLnVwZGF0ZSh0KSx0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9oYXNoZXIscj1lLmZpbmFsaXplKHQpO3JldHVybiBlLnJlc2V0KCksZS5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KHIpKX19KX0od2coKSl9KE5nKSkpfShJZykpLElnLmV4cG9ydHN9dmFyIERnLFBnPXtleHBvcnRzOnt9fTtmdW5jdGlvbiBNZygpe3JldHVybiBEZ3x8KERnPTEsZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QubGliLkNpcGhlcnx8ZnVuY3Rpb24oZSl7dmFyIHI9dCxuPXIubGliLGk9bi5CYXNlLG89bi5Xb3JkQXJyYXkscz1uLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0sYT1yLmVuYzthLlV0Zjg7dmFyIGM9YS5CYXNlNjQsdT1yLmFsZ28uRXZwS0RGLGw9bi5DaXBoZXI9cy5leHRlbmQoe2NmZzppLmV4dGVuZCgpLGNyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSx0LGUpfSxjcmVhdGVEZWNyeXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsdCxlKX0saW5pdDpmdW5jdGlvbih0LGUscil7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHIpLHRoaXMuX3hmb3JtTW9kZT10LHRoaXMuX2tleT1lLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtzLnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcHBlbmQodCksdGhpcy5fcHJvY2VzcygpfSxmaW5hbGl6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5fYXBwZW5kKHQpLHRoaXMuX2RvRmluYWxpemUoKX0sa2V5U2l6ZTo0LGl2U2l6ZTo0LF9FTkNfWEZPUk1fTU9ERToxLF9ERUNfWEZPUk1fTU9ERToyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD92Om19cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdChuKS5lbmNyeXB0KGUscixuLGkpfSxkZWNyeXB0OmZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdChuKS5kZWNyeXB0KGUscixuLGkpfX19fSgpfSk7bi5TdHJlYW1DaXBoZXI9bC5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBoPXIubW9kZT17fSxkPW4uQmxvY2tDaXBoZXJNb2RlPWkuZXh0ZW5kKHtjcmVhdGVFbmNyeXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5FbmNyeXB0b3IuY3JlYXRlKHQsZSl9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLkRlY3J5cHRvci5jcmVhdGUodCxlKX0saW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2NpcGhlcj10LHRoaXMuX2l2PWV9fSksZj1oLkNCQz1mdW5jdGlvbigpe3ZhciB0PWQuZXh0ZW5kKCk7ZnVuY3Rpb24gcih0LHIsbil7dmFyIGksbz10aGlzLl9pdjtvPyhpPW8sdGhpcy5faXY9ZSk6aT10aGlzLl9wcmV2QmxvY2s7Zm9yKHZhciBzPTA7czxuO3MrKyl0W3Irc11ePWlbc119cmV0dXJuIHQuRW5jcnlwdG9yPXQuZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jaXBoZXIsaT1uLmJsb2NrU2l6ZTtyLmNhbGwodGhpcyx0LGUsaSksbi5lbmNyeXB0QmxvY2sodCxlKSx0aGlzLl9wcmV2QmxvY2s9dC5zbGljZShlLGUraSl9fSksdC5EZWNyeXB0b3I9dC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2NpcGhlcixpPW4uYmxvY2tTaXplLG89dC5zbGljZShlLGUraSk7bi5kZWNyeXB0QmxvY2sodCxlKSxyLmNhbGwodGhpcyx0LGUsaSksdGhpcy5fcHJldkJsb2NrPW99fSksdH0oKSxwPShyLnBhZD17fSkuUGtjczc9e3BhZDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj00KmUsbj1yLXQuc2lnQnl0ZXMlcixpPW48PDI0fG48PDE2fG48PDh8bixzPVtdLGE9MDthPG47YSs9NClzLnB1c2goaSk7dmFyIGM9by5jcmVhdGUocyxuKTt0LmNvbmNhdChjKX0sdW5wYWQ6ZnVuY3Rpb24odCl7dmFyIGU9MjU1JnQud29yZHNbdC5zaWdCeXRlcy0xPj4+Ml07dC5zaWdCeXRlcy09ZX19O24uQmxvY2tDaXBoZXI9bC5leHRlbmQoe2NmZzpsLmNmZy5leHRlbmQoe21vZGU6ZixwYWRkaW5nOnB9KSxyZXNldDpmdW5jdGlvbigpe3ZhciB0O2wucmVzZXQuY2FsbCh0aGlzKTt2YXIgZT10aGlzLmNmZyxyPWUuaXYsbj1lLm1vZGU7dGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERT90PW4uY3JlYXRlRW5jcnlwdG9yOih0PW4uY3JlYXRlRGVjcnlwdG9yLHRoaXMuX21pbkJ1ZmZlclNpemU9MSksdGhpcy5fbW9kZSYmdGhpcy5fbW9kZS5fX2NyZWF0b3I9PXQ/dGhpcy5fbW9kZS5pbml0KHRoaXMsciYmci53b3Jkcyk6KHRoaXMuX21vZGU9dC5jYWxsKG4sdGhpcyxyJiZyLndvcmRzKSx0aGlzLl9tb2RlLl9fY3JlYXRvcj10KX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dGhpcy5fbW9kZS5wcm9jZXNzQmxvY2sodCxlKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuY2ZnLnBhZGRpbmc7cmV0dXJuIHRoaXMuX3hmb3JtTW9kZT09dGhpcy5fRU5DX1hGT1JNX01PREU/KGUucGFkKHRoaXMuX2RhdGEsdGhpcy5ibG9ja1NpemUpLHQ9dGhpcy5fcHJvY2VzcyghMCkpOih0PXRoaXMuX3Byb2Nlc3MoITApLGUudW5wYWQodCkpLHR9LGJsb2NrU2l6ZTo0fSk7dmFyIF89bi5DaXBoZXJQYXJhbXM9aS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odCl7dGhpcy5taXhJbih0KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuKHR8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksZz0oci5mb3JtYXQ9e30pLk9wZW5TU0w9e3N0cmluZ2lmeTpmdW5jdGlvbih0KXt2YXIgZT10LmNpcGhlcnRleHQscj10LnNhbHQ7cmV0dXJuKHI/by5jcmVhdGUoWzEzOTg4OTM2ODQsMTcwMTA3NjgzMV0pLmNvbmNhdChyKS5jb25jYXQoZSk6ZSkudG9TdHJpbmcoYyl9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlLHI9Yy5wYXJzZSh0KSxuPXIud29yZHM7cmV0dXJuIDEzOTg4OTM2ODQ9PW5bMF0mJjE3MDEwNzY4MzE9PW5bMV0mJihlPW8uY3JlYXRlKG4uc2xpY2UoMiw0KSksbi5zcGxpY2UoMCw0KSxyLnNpZ0J5dGVzLT0xNiksXy5jcmVhdGUoe2NpcGhlcnRleHQ6cixzYWx0OmV9KX19LG09bi5TZXJpYWxpemFibGVDaXBoZXI9aS5leHRlbmQoe2NmZzppLmV4dGVuZCh7Zm9ybWF0Omd9KSxlbmNyeXB0OmZ1bmN0aW9uKHQsZSxyLG4pe249dGhpcy5jZmcuZXh0ZW5kKG4pO3ZhciBpPXQuY3JlYXRlRW5jcnlwdG9yKHIsbiksbz1pLmZpbmFsaXplKGUpLHM9aS5jZmc7cmV0dXJuIF8uY3JlYXRlKHtjaXBoZXJ0ZXh0Om8sa2V5OnIsaXY6cy5pdixhbGdvcml0aG06dCxtb2RlOnMubW9kZSxwYWRkaW5nOnMucGFkZGluZyxibG9ja1NpemU6dC5ibG9ja1NpemUsZm9ybWF0dGVyOm4uZm9ybWF0fSl9LGRlY3J5cHQ6ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIG49dGhpcy5jZmcuZXh0ZW5kKG4pLGU9dGhpcy5fcGFyc2UoZSxuLmZvcm1hdCksdC5jcmVhdGVEZWNyeXB0b3IocixuKS5maW5hbGl6ZShlLmNpcGhlcnRleHQpfSxfcGFyc2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZS5wYXJzZSh0LHRoaXMpOnR9fSkseT0oci5rZGY9e30pLk9wZW5TU0w9e2V4ZWN1dGU6ZnVuY3Rpb24odCxlLHIsbixpKXtpZihufHwobj1vLnJhbmRvbSg4KSksaSlzPXUuY3JlYXRlKHtrZXlTaXplOmUrcixoYXNoZXI6aX0pLmNvbXB1dGUodCxuKTtlbHNlIHZhciBzPXUuY3JlYXRlKHtrZXlTaXplOmUrcn0pLmNvbXB1dGUodCxuKTt2YXIgYT1vLmNyZWF0ZShzLndvcmRzLnNsaWNlKGUpLDQqcik7cmV0dXJuIHMuc2lnQnl0ZXM9NCplLF8uY3JlYXRlKHtrZXk6cyxpdjphLHNhbHQ6bn0pfX0sdj1uLlBhc3N3b3JkQmFzZWRDaXBoZXI9bS5leHRlbmQoe2NmZzptLmNmZy5leHRlbmQoe2tkZjp5fSksZW5jcnlwdDpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0obj10aGlzLmNmZy5leHRlbmQobikpLmtkZi5leGVjdXRlKHIsdC5rZXlTaXplLHQuaXZTaXplLG4uc2FsdCxuLmhhc2hlcik7bi5pdj1pLml2O3ZhciBvPW0uZW5jcnlwdC5jYWxsKHRoaXMsdCxlLGkua2V5LG4pO3JldHVybiBvLm1peEluKGkpLG99LGRlY3J5cHQ6ZnVuY3Rpb24odCxlLHIsbil7bj10aGlzLmNmZy5leHRlbmQobiksZT10aGlzLl9wYXJzZShlLG4uZm9ybWF0KTt2YXIgaT1uLmtkZi5leGVjdXRlKHIsdC5rZXlTaXplLHQuaXZTaXplLGUuc2FsdCxuLmhhc2hlcik7cmV0dXJuIG4uaXY9aS5pdixtLmRlY3J5cHQuY2FsbCh0aGlzLHQsZSxpLmtleSxuKX19KX0oKX0od2coKSx6ZygpKX0oUGcpKSxQZy5leHBvcnRzfSFmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dCxyPWUubGliLkJsb2NrQ2lwaGVyLG49ZS5hbGdvLGk9W10sbz1bXSxzPVtdLGE9W10sYz1bXSx1PVtdLGw9W10saD1bXSxkPVtdLGY9W107IWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPDI1NjtlKyspdFtlXT1lPDEyOD9lPDwxOmU8PDFeMjgzO3ZhciByPTAsbj0wO2ZvcihlPTA7ZTwyNTY7ZSsrKXt2YXIgcD1uXm48PDFebjw8Ml5uPDwzXm48PDQ7cD1wPj4+OF4yNTUmcF45OSxpW3JdPXAsb1twXT1yO3ZhciBfPXRbcl0sZz10W19dLG09dFtnXSx5PTI1Nyp0W3BdXjE2ODQzMDA4KnA7c1tyXT15PDwyNHx5Pj4+OCxhW3JdPXk8PDE2fHk+Pj4xNixjW3JdPXk8PDh8eT4+PjI0LHVbcl09eSx5PTE2ODQzMDA5Km1eNjU1MzcqZ14yNTcqX14xNjg0MzAwOCpyLGxbcF09eTw8MjR8eT4+PjgsaFtwXT15PDwxNnx5Pj4+MTYsZFtwXT15PDw4fHk+Pj4yNCxmW3BdPXkscj8ocj1fXnRbdFt0W21eX11dXSxuXj10W3Rbbl1dKTpyPW49MX19KCk7dmFyIHA9WzAsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTRdLF89bi5BRVM9ci5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX25Sb3VuZHN8fHRoaXMuX2tleVByaW9yUmVzZXQhPT10aGlzLl9rZXkpe2Zvcih2YXIgdD10aGlzLl9rZXlQcmlvclJlc2V0PXRoaXMuX2tleSxlPXQud29yZHMscj10LnNpZ0J5dGVzLzQsbj00KigodGhpcy5fblJvdW5kcz1yKzYpKzEpLG89dGhpcy5fa2V5U2NoZWR1bGU9W10scz0wO3M8bjtzKyspczxyP29bc109ZVtzXToodT1vW3MtMV0scyVyP3I+NiYmcyVyPT00JiYodT1pW3U+Pj4yNF08PDI0fGlbdT4+PjE2JjI1NV08PDE2fGlbdT4+PjgmMjU1XTw8OHxpWzI1NSZ1XSk6KHU9aVsodT11PDw4fHU+Pj4yNCk+Pj4yNF08PDI0fGlbdT4+PjE2JjI1NV08PDE2fGlbdT4+PjgmMjU1XTw8OHxpWzI1NSZ1XSx1Xj1wW3MvcnwwXTw8MjQpLG9bc109b1tzLXJdXnUpO2Zvcih2YXIgYT10aGlzLl9pbnZLZXlTY2hlZHVsZT1bXSxjPTA7YzxuO2MrKyl7aWYocz1uLWMsYyU0KXZhciB1PW9bc107ZWxzZSB1PW9bcy00XTthW2NdPWM8NHx8czw9ND91OmxbaVt1Pj4+MjRdXV5oW2lbdT4+PjE2JjI1NV1dXmRbaVt1Pj4+OCYyNTVdXV5mW2lbMjU1JnVdXX19fSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24odCxlKXt0aGlzLl9kb0NyeXB0QmxvY2sodCxlLHRoaXMuX2tleVNjaGVkdWxlLHMsYSxjLHUsaSl9LGRlY3J5cHRCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRbZSsxXTt0W2UrMV09dFtlKzNdLHRbZSszXT1yLHRoaXMuX2RvQ3J5cHRCbG9jayh0LGUsdGhpcy5faW52S2V5U2NoZWR1bGUsbCxoLGQsZixvKSxyPXRbZSsxXSx0W2UrMV09dFtlKzNdLHRbZSszXT1yfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKHQsZSxyLG4saSxvLHMsYSl7Zm9yKHZhciBjPXRoaXMuX25Sb3VuZHMsdT10W2VdXnJbMF0sbD10W2UrMV1eclsxXSxoPXRbZSsyXV5yWzJdLGQ9dFtlKzNdXnJbM10sZj00LHA9MTtwPGM7cCsrKXt2YXIgXz1uW3U+Pj4yNF1eaVtsPj4+MTYmMjU1XV5vW2g+Pj44JjI1NV1ec1syNTUmZF1ecltmKytdLGc9bltsPj4+MjRdXmlbaD4+PjE2JjI1NV1eb1tkPj4+OCYyNTVdXnNbMjU1JnVdXnJbZisrXSxtPW5baD4+PjI0XV5pW2Q+Pj4xNiYyNTVdXm9bdT4+PjgmMjU1XV5zWzI1NSZsXV5yW2YrK10seT1uW2Q+Pj4yNF1eaVt1Pj4+MTYmMjU1XV5vW2w+Pj44JjI1NV1ec1syNTUmaF1ecltmKytdO3U9XyxsPWcsaD1tLGQ9eX1fPShhW3U+Pj4yNF08PDI0fGFbbD4+PjE2JjI1NV08PDE2fGFbaD4+PjgmMjU1XTw8OHxhWzI1NSZkXSlecltmKytdLGc9KGFbbD4+PjI0XTw8MjR8YVtoPj4+MTYmMjU1XTw8MTZ8YVtkPj4+OCYyNTVdPDw4fGFbMjU1JnVdKV5yW2YrK10sbT0oYVtoPj4+MjRdPDwyNHxhW2Q+Pj4xNiYyNTVdPDwxNnxhW3U+Pj44JjI1NV08PDh8YVsyNTUmbF0pXnJbZisrXSx5PShhW2Q+Pj4yNF08PDI0fGFbdT4+PjE2JjI1NV08PDE2fGFbbD4+PjgmMjU1XTw8OHxhWzI1NSZoXSlecltmKytdLHRbZV09Xyx0W2UrMV09Zyx0W2UrMl09bSx0W2UrM109eX0sa2V5U2l6ZTo4fSk7ZS5BRVM9ci5fY3JlYXRlSGVscGVyKF8pfSgpLHQuQUVTfSh3ZygpLE9nKCksQWcoKSx6ZygpLE1nKCkpfSh7ZXhwb3J0czp7fX0pOyFmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5jLkhleH0od2coKSl9KHtleHBvcnRzOnt9fSk7IWZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tb2RlLkNUUj0oZT10LmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCkscj1lLkVuY3J5cHRvcj1lLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fY2lwaGVyLG49ci5ibG9ja1NpemUsaT10aGlzLl9pdixvPXRoaXMuX2NvdW50ZXI7aSYmKG89dGhpcy5fY291bnRlcj1pLnNsaWNlKDApLHRoaXMuX2l2PXZvaWQgMCk7dmFyIHM9by5zbGljZSgwKTtyLmVuY3J5cHRCbG9jayhzLDApLG9bbi0xXT1vW24tMV0rMXwwO2Zvcih2YXIgYT0wO2E8bjthKyspdFtlK2FdXj1zW2FdfX0pLGUuRGVjcnlwdG9yPXIsZSksdC5tb2RlLkNUUjt2YXIgZSxyfSh3ZygpLE1nKCkpfSh7ZXhwb3J0czp7fX0pOyFmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFkLk5vUGFkZGluZz17cGFkOmZ1bmN0aW9uKCl7fSx1bnBhZDpmdW5jdGlvbigpe319LHQucGFkLk5vUGFkZGluZ30od2coKSxNZygpKX0oe2V4cG9ydHM6e319KTt2YXIgRmc9e30sVWc9e2V4cG9ydHM6e319LGpnPVVnLmV4cG9ydHM9e3Y6W3tuYW1lOiJ2ZXJzaW9uIixyZWc6L14oXGQqKSQvfV0sbzpbe25hbWU6Im9yaWdpbiIscmVnOi9eKFxTKikgKFxkKikgKFxkKikgKFxTKikgSVAoXGQpIChcUyopLyxuYW1lczpbInVzZXJuYW1lIiwic2Vzc2lvbklkIiwic2Vzc2lvblZlcnNpb24iLCJuZXRUeXBlIiwiaXBWZXIiLCJhZGRyZXNzIl0sZm9ybWF0OiIlcyAlcyAlZCAlcyBJUCVkICVzIn1dLHM6W3tuYW1lOiJuYW1lIn1dLGk6W3tuYW1lOiJkZXNjcmlwdGlvbiJ9XSx1Olt7bmFtZToidXJpIn1dLGU6W3tuYW1lOiJlbWFpbCJ9XSxwOlt7bmFtZToicGhvbmUifV0sejpbe25hbWU6InRpbWV6b25lcyJ9XSxyOlt7bmFtZToicmVwZWF0cyJ9XSx0Olt7bmFtZToidGltaW5nIixyZWc6L14oXGQqKSAoXGQqKS8sbmFtZXM6WyJzdGFydCIsInN0b3AiXSxmb3JtYXQ6IiVkICVkIn1dLGM6W3tuYW1lOiJjb25uZWN0aW9uIixyZWc6L15JTiBJUChcZCkgKFxTKikvLG5hbWVzOlsidmVyc2lvbiIsImlwIl0sZm9ybWF0OiJJTiBJUCVkICVzIn1dLGI6W3twdXNoOiJiYW5kd2lkdGgiLHJlZzovXihUSUFTfEFTfENUfFJSfFJTKTooXGQqKS8sbmFtZXM6WyJ0eXBlIiwibGltaXQiXSxmb3JtYXQ6IiVzOiVzIn1dLG06W3tyZWc6L14oXHcqKSAoXGQqKSAoW1x3L10qKSg/OiAoLiopKT8vLG5hbWVzOlsidHlwZSIsInBvcnQiLCJwcm90b2NvbCIsInBheWxvYWRzIl0sZm9ybWF0OiIlcyAlZCAlcyAlcyJ9XSxhOlt7cHVzaDoicnRwIixyZWc6L15ydHBtYXA6KFxkKikgKFtcd1wtLl0qKSg/OlxzKlwvKFxkKikoPzpccypcLyhcUyopKT8pPy8sbmFtZXM6WyJwYXlsb2FkIiwiY29kZWMiLCJyYXRlIiwiZW5jb2RpbmciXSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5jb2Rpbmc/InJ0cG1hcDolZCAlcy8lcy8lcyI6dC5yYXRlPyJydHBtYXA6JWQgJXMvJXMiOiJydHBtYXA6JWQgJXMifX0se3B1c2g6ImZtdHAiLHJlZzovXmZtdHA6KFxkKikgKFtcU3wgXSopLyxuYW1lczpbInBheWxvYWQiLCJjb25maWciXSxmb3JtYXQ6ImZtdHA6JWQgJXMifSx7bmFtZToiY29udHJvbCIscmVnOi9eY29udHJvbDooLiopLyxmb3JtYXQ6ImNvbnRyb2w6JXMifSx7bmFtZToicnRjcCIscmVnOi9ecnRjcDooXGQqKSg/OiAoXFMqKSBJUChcZCkgKFxTKikpPy8sbmFtZXM6WyJwb3J0IiwibmV0VHlwZSIsImlwVmVyIiwiYWRkcmVzcyJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5hZGRyZXNzPyJydGNwOiVkICVzIElQJWQgJXMiOiJydGNwOiVkIn19LHtwdXNoOiJydGNwRmJUcnJJbnQiLHJlZzovXnJ0Y3AtZmI6KFwqfFxkKikgdHJyLWludCAoXGQqKS8sbmFtZXM6WyJwYXlsb2FkIiwidmFsdWUiXSxmb3JtYXQ6InJ0Y3AtZmI6JXMgdHJyLWludCAlZCJ9LHtwdXNoOiJydGNwRmIiLHJlZzovXnJ0Y3AtZmI6KFwqfFxkKikgKFtcdy1fXSopKD86IChbXHctX10qKSk/LyxuYW1lczpbInBheWxvYWQiLCJ0eXBlIiwic3VidHlwZSJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5zdWJ0eXBlPyJydGNwLWZiOiVzICVzICVzIjoicnRjcC1mYjolcyAlcyJ9fSx7cHVzaDoiZXh0IixyZWc6L15leHRtYXA6KFxkKykoPzpcLyhcdyspKT8oPzogKHVybjppZXRmOnBhcmFtczpydHAtaGRyZXh0OmVuY3J5cHQpKT8gKFxTKikoPzogKFxTKikpPy8sbmFtZXM6WyJ2YWx1ZSIsImRpcmVjdGlvbiIsImVuY3J5cHQtdXJpIiwidXJpIiwiY29uZmlnIl0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiJleHRtYXA6JWQiKyh0LmRpcmVjdGlvbj8iLyVzIjoiJXYiKSsodFsiZW5jcnlwdC11cmkiXT8iICVzIjoiJXYiKSsiICVzIisodC5jb25maWc/IiAlcyI6IiIpfX0se25hbWU6ImV4dG1hcEFsbG93TWl4ZWQiLHJlZzovXihleHRtYXAtYWxsb3ctbWl4ZWQpL30se3B1c2g6ImNyeXB0byIscmVnOi9eY3J5cHRvOihcZCopIChbXHdfXSopIChcUyopKD86IChcUyopKT8vLG5hbWVzOlsiaWQiLCJzdWl0ZSIsImNvbmZpZyIsInNlc3Npb25Db25maWciXSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQuc2Vzc2lvbkNvbmZpZz8iY3J5cHRvOiVkICVzICVzICVzIjoiY3J5cHRvOiVkICVzICVzIn19LHtuYW1lOiJzZXR1cCIscmVnOi9ec2V0dXA6KFx3KikvLGZvcm1hdDoic2V0dXA6JXMifSx7bmFtZToiY29ubmVjdGlvblR5cGUiLHJlZzovXmNvbm5lY3Rpb246KG5ld3xleGlzdGluZykvLGZvcm1hdDoiY29ubmVjdGlvbjolcyJ9LHtuYW1lOiJtaWQiLHJlZzovXm1pZDooW15cc10qKS8sZm9ybWF0OiJtaWQ6JXMifSx7bmFtZToibXNpZCIscmVnOi9ebXNpZDooLiopLyxmb3JtYXQ6Im1zaWQ6JXMifSx7bmFtZToicHRpbWUiLHJlZzovXnB0aW1lOihcZCooPzpcLlxkKikqKS8sZm9ybWF0OiJwdGltZTolZCJ9LHtuYW1lOiJtYXhwdGltZSIscmVnOi9ebWF4cHRpbWU6KFxkKig/OlwuXGQqKSopLyxmb3JtYXQ6Im1heHB0aW1lOiVkIn0se25hbWU6ImRpcmVjdGlvbiIscmVnOi9eKHNlbmRyZWN2fHJlY3Zvbmx5fHNlbmRvbmx5fGluYWN0aXZlKS99LHtuYW1lOiJpY2VsaXRlIixyZWc6L14oaWNlLWxpdGUpL30se25hbWU6ImljZVVmcmFnIixyZWc6L15pY2UtdWZyYWc6KFxTKikvLGZvcm1hdDoiaWNlLXVmcmFnOiVzIn0se25hbWU6ImljZVB3ZCIscmVnOi9eaWNlLXB3ZDooXFMqKS8sZm9ybWF0OiJpY2UtcHdkOiVzIn0se25hbWU6ImZpbmdlcnByaW50IixyZWc6L15maW5nZXJwcmludDooXFMqKSAoXFMqKS8sbmFtZXM6WyJ0eXBlIiwiaGFzaCJdLGZvcm1hdDoiZmluZ2VycHJpbnQ6JXMgJXMifSx7cHVzaDoiY2FuZGlkYXRlcyIscmVnOi9eY2FuZGlkYXRlOihcUyopIChcZCopIChcUyopIChcZCopIChcUyopIChcZCopIHR5cCAoXFMqKSg/OiByYWRkciAoXFMqKSBycG9ydCAoXGQqKSk/KD86IHRjcHR5cGUgKFxTKikpPyg/OiBnZW5lcmF0aW9uIChcZCopKT8oPzogbmV0d29yay1pZCAoXGQqKSk/KD86IG5ldHdvcmstY29zdCAoXGQqKSk/LyxuYW1lczpbImZvdW5kYXRpb24iLCJjb21wb25lbnQiLCJ0cmFuc3BvcnQiLCJwcmlvcml0eSIsImlwIiwicG9ydCIsInR5cGUiLCJyYWRkciIsInJwb3J0IiwidGNwdHlwZSIsImdlbmVyYXRpb24iLCJuZXR3b3JrLWlkIiwibmV0d29yay1jb3N0Il0sZm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPSJjYW5kaWRhdGU6JXMgJWQgJXMgJWQgJXMgJWQgdHlwICVzIjtyZXR1cm4gZSs9bnVsbCE9dC5yYWRkcj8iIHJhZGRyICVzIHJwb3J0ICVkIjoiJXYldiIsZSs9bnVsbCE9dC50Y3B0eXBlPyIgdGNwdHlwZSAlcyI6IiV2IixudWxsIT10LmdlbmVyYXRpb24mJihlKz0iIGdlbmVyYXRpb24gJWQiKSxlKz1udWxsIT10WyJuZXR3b3JrLWlkIl0/IiBuZXR3b3JrLWlkICVkIjoiJXYiLGUrPW51bGwhPXRbIm5ldHdvcmstY29zdCJdPyIgbmV0d29yay1jb3N0ICVkIjoiJXYifX0se25hbWU6ImVuZE9mQ2FuZGlkYXRlcyIscmVnOi9eKGVuZC1vZi1jYW5kaWRhdGVzKS99LHtuYW1lOiJyZW1vdGVDYW5kaWRhdGVzIixyZWc6L15yZW1vdGUtY2FuZGlkYXRlczooLiopLyxmb3JtYXQ6InJlbW90ZS1jYW5kaWRhdGVzOiVzIn0se25hbWU6ImljZU9wdGlvbnMiLHJlZzovXmljZS1vcHRpb25zOihcUyopLyxmb3JtYXQ6ImljZS1vcHRpb25zOiVzIn0se3B1c2g6InNzcmNzIixyZWc6L15zc3JjOihcZCopIChbXHdfLV0qKSg/OjooLiopKT8vLG5hbWVzOlsiaWQiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSJdLGZvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT0ic3NyYzolZCI7cmV0dXJuIG51bGwhPXQuYXR0cmlidXRlJiYoZSs9IiAlcyIsbnVsbCE9dC52YWx1ZSYmKGUrPSI6JXMiKSksZX19LHtwdXNoOiJzc3JjR3JvdXBzIixyZWc6L15zc3JjLWdyb3VwOihbXHgyMVx4MjNceDI0XHgyNVx4MjZceDI3XHgyQVx4MkJceDJEXHgyRVx3XSopICguKikvLG5hbWVzOlsic2VtYW50aWNzIiwic3NyY3MiXSxmb3JtYXQ6InNzcmMtZ3JvdXA6JXMgJXMifSx7bmFtZToibXNpZFNlbWFudGljIixyZWc6L15tc2lkLXNlbWFudGljOlxzPyhcdyopIChcUyopLyxuYW1lczpbInNlbWFudGljIiwidG9rZW4iXSxmb3JtYXQ6Im1zaWQtc2VtYW50aWM6ICVzICVzIn0se3B1c2g6Imdyb3VwcyIscmVnOi9eZ3JvdXA6KFx3KikgKC4qKS8sbmFtZXM6WyJ0eXBlIiwibWlkcyJdLGZvcm1hdDoiZ3JvdXA6JXMgJXMifSx7bmFtZToicnRjcE11eCIscmVnOi9eKHJ0Y3AtbXV4KS99LHtuYW1lOiJydGNwUnNpemUiLHJlZzovXihydGNwLXJzaXplKS99LHtuYW1lOiJzY3RwbWFwIixyZWc6L15zY3RwbWFwOihbXHdfL10qKSAoXFMqKSg/OiAoXFMqKSk/LyxuYW1lczpbInNjdHBtYXBOdW1iZXIiLCJhcHAiLCJtYXhNZXNzYWdlU2l6ZSJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5tYXhNZXNzYWdlU2l6ZT8ic2N0cG1hcDolcyAlcyAlcyI6InNjdHBtYXA6JXMgJXMifX0se25hbWU6InhHb29nbGVGbGFnIixyZWc6L154LWdvb2dsZS1mbGFnOihbXlxzXSopLyxmb3JtYXQ6IngtZ29vZ2xlLWZsYWc6JXMifSx7cHVzaDoicmlkcyIscmVnOi9ecmlkOihbXGRcd10rKSAoXHcrKSg/OiAoW1xTfCBdKikpPy8sbmFtZXM6WyJpZCIsImRpcmVjdGlvbiIsInBhcmFtcyJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJhbXM/InJpZDolcyAlcyAlcyI6InJpZDolcyAlcyJ9fSx7cHVzaDoiaW1hZ2VhdHRycyIscmVnOm5ldyBSZWdFeHAoIl5pbWFnZWF0dHI6KFxcZCt8XFwqKVtcXHNcXHRdKyhzZW5kfHJlY3YpW1xcc1xcdF0rKFxcKnxcXFtcXFMrXFxdKD86W1xcc1xcdF0rXFxbXFxTK1xcXSkqKSg/OltcXHNcXHRdKyhyZWN2fHNlbmQpW1xcc1xcdF0rKFxcKnxcXFtcXFMrXFxdKD86W1xcc1xcdF0rXFxbXFxTK1xcXSkqKSk/IiksbmFtZXM6WyJwdCIsImRpcjEiLCJhdHRyczEiLCJkaXIyIiwiYXR0cnMyIl0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiJpbWFnZWF0dHI6JXMgJXMgJXMiKyh0LmRpcjI/IiAlcyAlcyI6IiIpfX0se25hbWU6InNpbXVsY2FzdCIscmVnOm5ldyBSZWdFeHAoIl5zaW11bGNhc3Q6KHNlbmR8cmVjdikgKFthLXpBLVowLTlcXC1ffjssXSspKD86XFxzPyhzZW5kfHJlY3YpIChbYS16QS1aMC05XFwtX347LF0rKSk/JCIpLG5hbWVzOlsiZGlyMSIsImxpc3QxIiwiZGlyMiIsImxpc3QyIl0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiJzaW11bGNhc3Q6JXMgJXMiKyh0LmRpcjI/IiAlcyAlcyI6IiIpfX0se25hbWU6InNpbXVsY2FzdF8wMyIscmVnOi9ec2ltdWxjYXN0Oltcc1x0XSsoW1xTK1xzXHRdKykkLyxuYW1lczpbInZhbHVlIl0sZm9ybWF0OiJzaW11bGNhc3Q6ICVzIn0se25hbWU6ImZyYW1lcmF0ZSIscmVnOi9eZnJhbWVyYXRlOihcZCsoPzokfFwuXGQrKSkvLGZvcm1hdDoiZnJhbWVyYXRlOiVzIn0se25hbWU6InNvdXJjZUZpbHRlciIscmVnOi9ec291cmNlLWZpbHRlcjogKihleGNsfGluY2wpIChcUyopIChJUDR8SVA2fFwqKSAoXFMqKSAoLiopLyxuYW1lczpbImZpbHRlck1vZGUiLCJuZXRUeXBlIiwiYWRkcmVzc1R5cGVzIiwiZGVzdEFkZHJlc3MiLCJzcmNMaXN0Il0sZm9ybWF0OiJzb3VyY2UtZmlsdGVyOiAlcyAlcyAlcyAlcyAlcyJ9LHtuYW1lOiJidW5kbGVPbmx5IixyZWc6L14oYnVuZGxlLW9ubHkpL30se25hbWU6ImxhYmVsIixyZWc6L15sYWJlbDooLispLyxmb3JtYXQ6ImxhYmVsOiVzIn0se25hbWU6InNjdHBQb3J0IixyZWc6L15zY3RwLXBvcnQ6KFxkKykkLyxmb3JtYXQ6InNjdHAtcG9ydDolcyJ9LHtuYW1lOiJtYXhNZXNzYWdlU2l6ZSIscmVnOi9ebWF4LW1lc3NhZ2Utc2l6ZTooXGQrKSQvLGZvcm1hdDoibWF4LW1lc3NhZ2Utc2l6ZTolcyJ9LHtwdXNoOiJ0c1JlZkNsb2NrcyIscmVnOi9edHMtcmVmY2xrOihbXlxzPV0qKSg/Oj0oXFMqKSk/LyxuYW1lczpbImNsa3NyYyIsImNsa3NyY0V4dCJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4idHMtcmVmY2xrOiVzIisobnVsbCE9dC5jbGtzcmNFeHQ/Ij0lcyI6IiIpfX0se25hbWU6Im1lZGlhQ2xrIixyZWc6L15tZWRpYWNsazooPzppZD0oXFMqKSk/ICooW15ccz1dKikoPzo9KFxTKikpPyg/OiAqcmF0ZT0oXGQrKVwvKFxkKykpPy8sbmFtZXM6WyJpZCIsIm1lZGlhQ2xvY2tOYW1lIiwibWVkaWFDbG9ja1ZhbHVlIiwicmF0ZU51bWVyYXRvciIsInJhdGVEZW5vbWluYXRvciJdLGZvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT0ibWVkaWFjbGs6IjtyZXR1cm4gZSs9bnVsbCE9dC5pZD8iaWQ9JXMgJXMiOiIldiVzIixlKz1udWxsIT10Lm1lZGlhQ2xvY2tWYWx1ZT8iPSVzIjoiIixlKz1udWxsIT10LnJhdGVOdW1lcmF0b3I/IiByYXRlPSVzIjoiIixlKz1udWxsIT10LnJhdGVEZW5vbWluYXRvcj8iLyVzIjoiIn19LHtuYW1lOiJrZXl3b3JkcyIscmVnOi9ea2V5d2RzOiguKykkLyxmb3JtYXQ6ImtleXdkczolcyJ9LHtuYW1lOiJjb250ZW50IixyZWc6L15jb250ZW50OiguKykvLGZvcm1hdDoiY29udGVudDolcyJ9LHtuYW1lOiJiZmNwRmxvb3JDdHJsIixyZWc6L15mbG9vcmN0cmw6KGMtb25seXxzLW9ubHl8Yy1zKS8sZm9ybWF0OiJmbG9vcmN0cmw6JXMifSx7bmFtZToiYmZjcENvbmZJZCIscmVnOi9eY29uZmlkOihcZCspLyxmb3JtYXQ6ImNvbmZpZDolcyJ9LHtuYW1lOiJiZmNwVXNlcklkIixyZWc6L151c2VyaWQ6KFxkKykvLGZvcm1hdDoidXNlcmlkOiVzIn0se25hbWU6ImJmY3BGbG9vcklkIixyZWc6L15mbG9vcmlkOiguKykgKD86bS1zdHJlYW18bXN0cm0pOiguKykvLG5hbWVzOlsiaWQiLCJtU3RyZWFtIl0sZm9ybWF0OiJmbG9vcmlkOiVzIG1zdHJtOiVzIn0se3B1c2g6ImludmFsaWQiLG5hbWVzOlsidmFsdWUiXX1dfTtPYmplY3Qua2V5cyhqZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7amdbdF0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZWd8fCh0LnJlZz0vKC4qKS8pLHQuZm9ybWF0fHwodC5mb3JtYXQ9IiVzIil9KSl9KSk7dmFyIEhnPVVnLmV4cG9ydHM7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcoTnVtYmVyKHQpKT09PXQ/TnVtYmVyKHQpOnR9LHI9ZnVuY3Rpb24odCxyLG4pe3ZhciBpPXQubmFtZSYmdC5uYW1lczt0LnB1c2gmJiFyW3QucHVzaF0/clt0LnB1c2hdPVtdOmkmJiFyW3QubmFtZV0mJihyW3QubmFtZV09e30pO3ZhciBvPXQucHVzaD97fTppP3JbdC5uYW1lXTpyOyFmdW5jdGlvbih0LHIsbixpKXtpZihpJiYhbilyW2ldPWUodFsxXSk7ZWxzZSBmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rPTEpbnVsbCE9dFtvKzFdJiYocltuW29dXT1lKHRbbysxXSkpfShuLm1hdGNoKHQucmVnKSxvLHQubmFtZXMsdC5uYW1lKSx0LnB1c2gmJnJbdC5wdXNoXS5wdXNoKG8pfSxuPUhnLGk9UmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQoL14oW2Etel0pPSguKikvKTt0LnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlPXt9LG89W10scz1lO3JldHVybiB0LnNwbGl0KC8oXHJcbnxccnxcbikvKS5maWx0ZXIoaSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dFswXSxpPXQuc2xpY2UoMik7Im0iPT09ZSYmKG8ucHVzaCh7cnRwOltdLGZtdHA6W119KSxzPW9bby5sZW5ndGgtMV0pO2Zvcih2YXIgYT0wO2E8KG5bZV18fFtdKS5sZW5ndGg7YSs9MSl7dmFyIGM9bltlXVthXTtpZihjLnJlZy50ZXN0KGkpKXJldHVybiByKGMscyxpKX19KSksZS5tZWRpYT1vLGV9O3ZhciBvPWZ1bmN0aW9uKHQscil7dmFyIG49ci5zcGxpdCgvPSguKykvLDIpO3JldHVybiAyPT09bi5sZW5ndGg/dFtuWzBdXT1lKG5bMV0pOjE9PT1uLmxlbmd0aCYmci5sZW5ndGg+MSYmKHRbblswXV09dm9pZCAwKSx0fTt0LnBhcnNlUGFyYW1zPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KC87XHM/LykucmVkdWNlKG8se30pfSx0LnBhcnNlRm10cENvbmZpZz10LnBhcnNlUGFyYW1zLHQucGFyc2VQYXlsb2Fkcz1mdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygpLnNwbGl0KCIgIikubWFwKE51bWJlcil9LHQucGFyc2VSZW1vdGVDYW5kaWRhdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXSxuPXQuc3BsaXQoIiAiKS5tYXAoZSksaT0wO2k8bi5sZW5ndGg7aSs9MylyLnB1c2goe2NvbXBvbmVudDpuW2ldLGlwOm5baSsxXSxwb3J0Om5baSsyXX0pO3JldHVybiByfSx0LnBhcnNlSW1hZ2VBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIgIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMSx0Lmxlbmd0aC0xKS5zcGxpdCgiLCIpLnJlZHVjZShvLHt9KX0pKX0sdC5wYXJzZVNpbXVsY2FzdFN0cmVhbUxpc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoIjsiKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKChmdW5jdGlvbih0KXt2YXIgcixuPSExO3JldHVybiJ+IiE9PXRbMF0/cj1lKHQpOihyPWUodC5zdWJzdHJpbmcoMSx0Lmxlbmd0aCkpLG49ITApLHtzY2lkOnIscGF1c2VkOm59fSkpfSkpfX0oRmcpO3ZhciBKZztuZXcgVGV4dERlY29kZXIsbmV3IFRleHRFbmNvZGVyLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcygiX3J0Y19kZWJ1Z18iKXx8bnVsbCE9PShKZz13aW5kb3cubG9jYWxTdG9yYWdlKSYmdm9pZCAwIT09SmcmJkpnLmdldEl0ZW0oIl9ydGNfZGVidWdfIikpO2NvbnN0IEtnPXtnZXROQUxVbml0cyh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTtjb25zdHtwb3NpdGlvbjpyfT10O3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9LZy5nZXRBbm5leGJOYWxzKHQsZSk6S2cuZ2V0QXZjY05hbHModCxlKX0sZ2V0QW5uZXhiTmFscyh0LGUpe2NvbnN0IHI9W107bGV0IG49S2cuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCksaT1uLnBvcyxvPWk7Zm9yKDtpPHQubGVuZ3RoLTQ7KXtjb25zdCBzPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGksaStuLmhlYWRlckxlbmd0aCkpO24ucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKG4uaGVhZGVyTGVuZ3RoKSxuPUtnLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLG89bi5wb3M7Y29uc3QgYT17aGVhZGVyOnMsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShpK3MuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07ZT9LZy5hbmFseXNlSDI2NU5hbChhKTpLZy5hbmFseXNlTmFsKGEpLChhLnR5cGU8PTl8fGUmJmEudHlwZTw9NDApJiYwIT09YS50eXBlJiZyLnB1c2goYSksdC5za2lwKG8tdC5wb3NpdGlvbiksaT1vfXJldHVybiByfSxnZXRBdmNjTmFscyh0LGUpe2NvbnN0IHI9W107Zm9yKDt0LnBvc2l0aW9uPHQubGVuZ3RoLTQ7KXtjb25zdCBuPXQuZ2V0SW50MzIodC5wb3NpdGlvbik7aWYoISh0Lmxlbmd0aC10LnBvc2l0aW9uPj1uKSlicmVhazt7Y29uc3QgaT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZSh0LnBvc2l0aW9uLHQucG9zaXRpb24rNCkpO3Quc2tpcCg0KTtjb25zdCBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbituKSk7dC5za2lwKG4pO2NvbnN0IHM9e2hlYWRlcjppLGJvZHk6byx0eXBlOi0xfTtlP0tnLmFuYWx5c2VIMjY1TmFsKHMpOktnLmFuYWx5c2VOYWwocykscy50eXBlPD05JiYwIT09cy50eXBlJiZyLnB1c2gocyl9fXJldHVybiByfSxhbmFseXNlTmFsKHQpe2NvbnN0IGU9MzEmdC5ib2R5WzBdO3N3aXRjaCh0LnR5cGU9ZSxlKXtjYXNlIDE6dC5uZHI9ITA7YnJlYWs7Y2FzZSA1OnQuaWRyPSEwO2JyZWFrO2Nhc2UgNjp0LnNlaT0hMDticmVhaztjYXNlIDc6dC5zcHM9ITA7YnJlYWs7Y2FzZSA4OnQucHBzPSEwfX0sYW5hbHlzZUgyNjVOYWwodCl7Y29uc3QgZT0oMTI2JnQuYm9keVswXSk+PjE7c3dpdGNoKHQudHlwZT1lLGUpe2Nhc2UgMzk6Y2FzZSA0MDp0LnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpe2xldCBlPXQucG9zaXRpb24scj0wO2NvbnN0IG49dC5sZW5ndGg7Zm9yKDszIT09ciYmNCE9PXImJmU8bi00OykwPT09dC5nZXRJbnQxNihlKT8xPT09dC5nZXRJbnQxNihlKzIpP3I9NDoxPT09dC5nZXRJbnQ4KGUrMik/cj0zOmUrKzplKys7cmV0dXJuIGU9PT1uLTQmJigwPT09dC5nZXRJbnQxNihlKT8xPT09dC5nZXRJbnQxNihlKzIpP3I9NDplPW46KGUrKywwPT09dC5nZXRJbnQxNihlKSYmMT09PXQuZ2V0SW50OChlKT9yPTM6ZT1uKSkse3BvczplLGhlYWRlckxlbmd0aDpyfX0sZ2V0Q29kZWNOYW1lRnJvbUZyYW1lKHQsZSl7Y29uc3R7bWltZVR5cGU6cixwYXlsb2FkVHlwZTpufT10LmdldE1ldGFkYXRhKCk7cmV0dXJuIHI/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygiaDI2NSIpP2RnLkgyNjU6dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJoMjY0Iik/ZGcuSDI2NDp0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoInZwOCIpP2RnLlZQODp2b2lkIDB9KHIpOm4mJmU/ZVtuXTp2b2lkIDB9LGlzSDI2NVZpZGVvRnJhbWUodCl7dmFyIGU7cmV0dXJuKChudWxsPT09KGU9dC5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PWV8fG51bGw9PT0oZT1lLmNhbGwodCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2NsYXNzIFdne2NvbnN0cnVjdG9yKHQpe2xsKHRoaXMsIl9wb3NpdGlvbiIsMCksbGwodGhpcywiX2RhdGF2aWV3Iix2b2lkIDApLHRoaXMuX2RhdGF2aWV3PW5ldyBEYXRhVmlldyh0KX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGh9Z2V0IGJ1ZmZlcigpe3JldHVybiB0aGlzLl9kYXRhdmlldy5idWZmZXJ9c2V0IHBvc2l0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uPXR9Z2V0IHBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9ufWJhY2sodCl7dGhpcy5wb3NpdGlvbi09dH1nZXRVaW50OCh0KXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0VWludDgodCl9Z2V0SW50OCh0KXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50OCh0KX1nZXRJbnQxNih0KXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MTYodCl9Z2V0VWludDE2KHQpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50MTYodCl9Z2V0VWludDMyKHQpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50MzIodCl9Z2V0SW50MzIodCl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldEludDMyKHQpfXNraXAodCl7Y29uc3QgZT1NYXRoLmZsb29yKHQvNCkscj10JTQ7Zm9yKGxldCBuPTA7bjxlO24rKylXZy5yZWFkQnl0ZSh0aGlzLDQpO3I+MCYmV2cucmVhZEJ5dGUodGhpcyxyKX1zdGF0aWMgcmVhZEJ5dGUodCxlLHIpe2xldCBuO3N3aXRjaChlKXtjYXNlIDE6bj1yP3QuZ2V0SW50OCh0LnBvc2l0aW9uKTp0LmdldFVpbnQ4KHQucG9zaXRpb24pO2JyZWFrO2Nhc2UgMjpuPXI/dC5nZXRJbnQxNih0LnBvc2l0aW9uKTp0LmdldFVpbnQxNih0LnBvc2l0aW9uKTticmVhaztjYXNlIDM6aWYocil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCeXRlIDMiKTtuPXQuZ2V0VWludDgodC5wb3NpdGlvbik8PDE2LG58PXQuZ2V0VWludDgodC5wb3NpdGlvbisxKTw8OCxufD10LmdldFVpbnQ4KHQucG9zaXRpb24rMik7YnJlYWs7Y2FzZSA0Om49cj90LmdldEludDMyKHQucG9zaXRpb24pOnQuZ2V0VWludDMyKHQucG9zaXRpb24pO2JyZWFrO2Nhc2UgODppZihyKXRocm93IG5ldyBFcnJvcigibm90IHN1cHBvcnRlZCBmb3IgcmVhZEJvZHkgOCIpO249dC5nZXRVaW50MzIodC5wb3NpdGlvbik8PDMyLG58PXQuZ2V0VWludDMyKHQucG9zaXRpb24rNCk7YnJlYWs7ZGVmYXVsdDpuPSIifXJldHVybiB0LnBvc2l0aW9uKz1lLG59cmVhZFVpbnQ4KCl7cmV0dXJuIFdnLnJlYWRCeXRlKHRoaXMsMSl9cmVhZFVpbnQxNigpe3JldHVybiBXZy5yZWFkQnl0ZSh0aGlzLDIpfXJlYWRVaW50MjQoKXtyZXR1cm4gV2cucmVhZEJ5dGUodGhpcywzKX1yZWFkVWludDMyKCl7cmV0dXJuIFdnLnJlYWRCeXRlKHRoaXMsNCl9cmVhZFVpbnQ2NCgpe3JldHVybiBXZy5yZWFkQnl0ZSh0aGlzLDgpfXJlYWRJbnQ4KCl7cmV0dXJuIFdnLnJlYWRCeXRlKHRoaXMsMSwhMCl9cmVhZEludDE2KCl7cmV0dXJuIFdnLnJlYWRCeXRlKHRoaXMsMiwhMCl9cmVhZEludDMyKCl7cmV0dXJuIFdnLnJlYWRCeXRlKHRoaXMsNCwhMCl9d3JpdGVVaW50MzIodCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFt0Pj4+MjQmMjU1LHQ+Pj4xNiYyNTUsdD4+PjgmMjU1LDI1NSZ0XSl9fXZhciBaZz0odD0+KHRbdC5pbnRlcm5hbD0wXT0iaW50ZXJuYWwiLHRbdC5leHRlcm5hbD0xXT0iZXh0ZXJuYWwiLHRbdC5ieXBhc3M9Ml09ImJ5cGFzcyIsdCkpKFpnfHx7fSk7Y29uc3QgR2c9bmV3IFVpbnQ4QXJyYXkoWzEwOSwxNjcsNTMsMTkwLDEwMyw5MCw3MiwxLDE3MCw4OSw2MywxNjQsMTk0LDE5OSwxOSw4NV0pLFZnPW5ldyBVaW50OEFycmF5KFsxMDksMTY3LDUzLDE5MCwxMDMsOTAsNzIsMSwxNzAsODksNjMsMTY0LDE5NCwxOTksMTksODRdKSxYZz1uZXcgVWludDhBcnJheShbMzEsMjM5LDMsNTAsMjQyLDEyMCw3Niw4NSwxNjksNDIsMTYxLDkxLDc1LDE4NiwyMl0pO2Z1bmN0aW9uIFlnKHQpe2NvbnN0IGU9W107Zm9yKDt0Pj0yNTU7KXQtPTI1NSxlLnB1c2goMjU1KTtyZXR1cm4gZS5wdXNoKHQpLG5ldyBVaW50OEFycmF5KGUpfWZ1bmN0aW9uICRnKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLHI9MDtmb3IoOzI1NT09PXRbZV0mJmU8dC5ieXRlTGVuZ3RoOyllKysscis9MjU1O3JldHVybiBlPHQuYnl0ZUxlbmd0aCYmKHIrPXRbZSsrXSksW3IsZV19Y29uc3QgcWc9bmV3IFVpbnQ4QXJyYXkoWzgwLDFdKTtjbGFzcyBRZ3tzdGF0aWMgZ2VuZXJhdGVTRUkodCxlKXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDFdKSxpPWU/cWc6bmV3IFVpbnQ4QXJyYXkoWzZdKSxvPW5ldyBVaW50OEFycmF5KFs1XSkscz1RZy5fX3V1aWR8fChyP0dnOlZnKSxhPVlnKHQuYnl0ZUxlbmd0aCtzLmJ5dGVMZW5ndGgpLGM9KHQ9Pntjb25zdCBlPVtdO2xldCByPTA7Zm9yKGNvbnN0IG4gb2YgdClyPj0yJiZuPD0zJiYoZS5wdXNoKDMpLHI9MCksMD09PW4/cisrOnI9MCxlLnB1c2gobik7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUpfSkodCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KFsuLi5uLC4uLmksLi4ubywuLi5hLC4uLnMsLi4uYywxMjhdKX1zdGF0aWMgZGVjb2RlU0VJQm9keSh0LGUpe2NvbnN0IHI9KHQ9Pntjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl08PTMmJjA9PT10W3ItMV0mJjA9PT10W3ItMl18fGUucHVzaCh0W3JdKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9KSh0PXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSk7aWYoci5ieXRlTGVuZ3RoPDIpcmV0dXJuO2xldCBuPTA7Y29uc3QgaT1lPzI6MTtpZig1IT09cltpXSYmMTAwIT09cltpXSlyZXR1cm47bis9MStpO2NvbnN0W28sc109JGcocixuKTtuPXM7bGV0IGE9Mjtjb25zdCBjPW4rbztyLmJ5dGVMZW5ndGg+PVZnLmJ5dGVMZW5ndGgmJm8+PVZnLmJ5dGVMZW5ndGgmJihyLnNsaWNlKG4sbitWZy5ieXRlTGVuZ3RoKS50b1N0cmluZygpPT09VmcudG9TdHJpbmcoKXx8ci5zbGljZShuLG4rWGcuYnl0ZUxlbmd0aCkudG9TdHJpbmcoKT09PVhnLnRvU3RyaW5nKCkpPyhuKz1WZy5ieXRlTGVuZ3RoLGE9MSk6ci5ieXRlTGVuZ3RoPj1WZy5ieXRlTGVuZ3RoJiZvPj1WZy5ieXRlTGVuZ3RoJiZyLnNsaWNlKG4sbitHZy5ieXRlTGVuZ3RoKS50b1N0cmluZygpPT09R2cudG9TdHJpbmcoKSYmKG4rPUdnLmJ5dGVMZW5ndGgsYT0wKTtyZXR1cm57dHlwZTphLHBheWxvYWQ6ci5zbGljZShuLGMpfX1zdGF0aWMgcGFyc2VJbnRlcm5hbFNFSSh0KXtjb25zdCBlPW5ldyBNYXA7bGV0IHI9MDtpZigwPT09dC50eXBlKXtmb3IoO3QucGF5bG9hZC5ieXRlTGVuZ3RoLXI+PTI7KXtjb25zdFtuLGldPSRnKHQucGF5bG9hZCxyKTtyPWk7Y29uc3RbbyxzXT0kZyh0LnBheWxvYWQscik7aWYocj1zLGUuZ2V0KG4pfHwhKG88PXQucGF5bG9hZC5ieXRlTGVuZ3RoLXIpKWJyZWFrO2Uuc2V0KG4sdC5wYXlsb2FkLnNsaWNlKHIscitvKSkscis9b31yZXR1cm4gZX19c3RhdGljIG1ha2VJbnRlcm5hbFNlaSh0KXtjb25zdCBlPVtdO2Zvcihjb25zdFtpLG9db2YgdCl7Y29uc3QgdD1ZZyhpKSxyPVlnKG8uYnl0ZUxlbmd0aCk7ZS5wdXNoKHQscixvKX1jb25zdCByPWUucmVkdWNlKCgodCxlKT0+dCtlLmJ5dGVMZW5ndGgpLDApLG49bmV3IFVpbnQ4QXJyYXkocik7cmV0dXJuIGUucmVkdWNlKCgodCxlKT0+KG4uc2V0KGUsdCksdCtlLmJ5dGVMZW5ndGgpKSwwKSxufX1sbChRZywiX191dWlkIix2b2lkIDApO2NsYXNzIHRte2NvbnN0cnVjdG9yKHQpe2xsKHRoaXMsInNraXBGaWx0ZXIiLHZvaWQgMCksbGwodGhpcywicG9zdE1lc3NhZ2UiLHZvaWQgMCksbGwodGhpcywiY3VycmVudENvZGVjIix2b2lkIDApLGxsKHRoaXMsInBheWxvYWRNYXAiLHZvaWQgMCksdGhpcy5za2lwRmlsdGVyPXQuc2tpcEZpbHRlcix0aGlzLnBvc3RNZXNzYWdlPXQucG9zdE1lc3NhZ2UsdGhpcy5wYXlsb2FkTWFwPXQucGF5bG9hZE1hcH10cmFuc2Zvcm0odCxlKXt2YXIgcjtjb25zdCBuPW51bGwhPT0ocj1LZy5nZXRDb2RlY05hbWVGcm9tRnJhbWUodCx0aGlzLnBheWxvYWRNYXApKSYmdm9pZCAwIT09cj9yOnRoaXMuY3VycmVudENvZGVjO2lmKG4hPT1kZy5IMjY0JiZuIT09ZGcuSDI2NSlyZXR1cm4gdm9pZCBlLmVucXVldWUodCk7S2cuZ2V0TkFMVW5pdHMobmV3IFdnKHQuZGF0YSksbj09PWRnLkgyNjUpLmZvckVhY2goKHQ9PntpZih0LnNlaSl7Y29uc3QgZT1RZy5kZWNvZGVTRUlCb2R5KHQuYm9keSxuPT09ZGcuSDI2NSk7ZSYmKHRoaXMuc2tpcEZpbHRlcnx8ZS50eXBlPT09WmcuZXh0ZXJuYWwpJiZ0aGlzLnBvc3RNZXNzYWdlKGUpfX0pKSxlLmVucXVldWUodCl9c2V0Q29kZWModCl7dGhpcy5jdXJyZW50Q29kZWM9dH19InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYiRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGUiPT09c2VsZi5jb25zdHJ1Y3Rvci5uYW1lJiZzZWxmLmFkZEV2ZW50TGlzdGVuZXIoInJ0Y3RyYW5zZm9ybSIsKHQ9Pntjb25zdHt0cmFuc2Zvcm1lcjplfT10LHtzdHJlYW1JZDpyLHNraXBGaWx0ZXI6bixwYXlsb2FkTWFwOml9PWUub3B0aW9ucyxvPW5ldyB0bSh7cG9zdE1lc3NhZ2U6dD0+e3NlbGYucG9zdE1lc3NhZ2Uoe3N0cmVhbUlkOnIsbXNnOnR9LFt0LnBheWxvYWQuYnVmZmVyXSl9LHNraXBGaWx0ZXI6bixwYXlsb2FkTWFwOml9KSxzPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpvLnRyYW5zZm9ybS5iaW5kKG8pfSk7c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwodD0+e2xldHtkYXRhOmV9PXQ7Y29uc3R7dHlwZTpuLGNvbnRlbnQ6aX09ZTsic2V0Q29kZWMiPT09biYmcj09PWUuc3RyZWFtSWQmJm8uc2V0Q29kZWMoaSl9KSksZS5yZWFkYWJsZS5waXBlVGhyb3VnaChzKS5waXBlVG8odC50cmFuc2Zvcm1lci53cml0YWJsZSl9KSl9KCk7Cg==",fN="undefined"!=typeof window&&window.Blob&&new Blob([atob(ZN)],{type:"text/javascript;charset=utf-8"});function TN(){let e;try{if(e=fN&&(DW||window.webkitURL).createObjectURL(fN),!e)throw"";return new Worker(e)}catch(t){return new Worker("data:application/javascript;base64,"+ZN)}finally{!("undefined"!=typeof window&&navigator.userAgent.indexOf("Trident/")>0)&&e&&(DW||window.webkitlRL).revokeObjectURL(e)}}var IN=(e=>(e.RECONNECT="ice-reconnect",e.LEAVE="leave_room",e))(IN||{});const gN=kg.NORMAL_MODE;class RN{constructor(e,t,i){Hu(this,"engineDestroyed",!1),Hu(this,"avSync",!0),Hu(this,"callId",void 0),Hu(this,"streamRTT",{}),Hu(this,"useCloudProxy",!1),Hu(this,"videoProfile",void 0),Hu(this,"audioProfileManager",void 0),Hu(this,"extensionManager",void 0),Hu(this,"userPriority",new Map),Hu(this,"expectedIDC",void 0),Hu(this,"autoPlayPolicy",void 0),Hu(this,"joinRoomConfig",void 0),Hu(this,"signalingManager",void 0),Hu(this,"peerConnection",void 0),Hu(this,"pubSubLock",new nN("pubSubLock")),Hu(this,"pcKillSwitch",Ju({ctor_sdpsemantics_add:!0,ctor_encodedinsetablestream_add:!0,sld_rtcpfb_rrtr_add:!0,sld_ext_sdesmid_remove:!0,sld_fmtp_sps_add:!0,sld_fmtp_bitrate_add:!0,sld_fmtp_opus_add:!0,sld_iceoption_renomination:!0},WZ("PC_KILLSWITCH"))),Hu(this,"visibility",!0),Hu(this,"rtsLimiter",{e2e:new _N(gN),e2s:new _N(gN),boradcast:new _N(gN),conf:void 0,rtsMode:gN}),Hu(this,"serverConfig",void 0),Hu(this,"mediaParams",void 0),Hu(this,"subscribeFallbackOption",void 0),Hu(this,"joinRoomParams",void 0),Hu(this,"isPreConnection",!1),Hu(this,"_handler",void 0),Hu(this,"monitor",void 0),Hu(this,"enableFallbackHandler",!!WZ("ENABLE_FALLBACK_HANDLER")),Hu(this,"enableStandardHandler",!!WZ("ENABLE_STANDARD_HANDLER")),Hu(this,"_businessId",void 0),Hu(this,"_userStreamConfig",new Map),Hu(this,"_localAudioTrackDumpConfig",{[em.STREAM_INDEX_MAIN]:{callback:void 0,frameSize:void 0},[em.STREAM_INDEX_SCREEN]:{callback:void 0,frameSize:void 0}}),Hu(this,"_remoteAudioTrackDumpConfig",{[em.STREAM_INDEX_MAIN]:new Map,[em.STREAM_INDEX_SCREEN]:new Map}),Hu(this,"_targetCodec",void 0),Hu(this,"_targetScreenCodec",void 0),Hu(this,"earMonitorSettings",{[em.STREAM_INDEX_MAIN]:{position:Wm.NONE,volume:100},[em.STREAM_INDEX_SCREEN]:{position:Wm.NONE,volume:100}}),Hu(this,"jitterTargetConfig",{[em.STREAM_INDEX_MAIN]:new Map,[em.STREAM_INDEX_SCREEN]:new Map}),Hu(this,"jitterStepperConfig",{intervalMs:WZ("JITTER_STEPPER_INTERVAL_MS"),stepSizeMs:WZ("JITTER_STEPPER_STEP_SIZE_MS"),maxAVSyncDiff:WZ("JITTER_STEPPER_MAX_AV_SYNC_DIFF"),maxSetDiff:WZ("JITTER_STEPPER_MAX_SET_DIFF"),maxDiffExceedCount:WZ("JITTER_STEPPER_MAX_DIFF_EXCEED_COUNT")}),Hu(this,"localVideoTrack",void 0),Hu(this,"localAudioTrack",void 0),Hu(this,"publicAudioVolume",new Map),Hu(this,"_receiveSEIWorker",void 0),this.id=e,this.appId=t,this.monitor=mv(e),this.expectedIDC=null==i?void 0:i.expectedIDC,this.autoPlayPolicy=null==i?void 0:i.autoPlayPolicy,this.audioProfileManager=new sG(t),this.extensionManager=new SN(e),this.joinRoomConfig=new gS(e),this.signalingManager=new oN(this),this.videoProfile=new bN(this)}set businessId(e){var t;this._businessId=e,null===(t=this.monitor)||void 0===t||t.set({rtc_business_id:e})}get businessId(){return this._businessId}set handler(e){var t;e&&this.resetPubSubLock("ice-reconnect"),null===(t=this._handler)||void 0===t||t.destroy(),this._handler=e}get handler(){return this._handler}get role(){return this.visibility?aN.NORMAL_USER:aN.SILENT_USER}setTargetCodec(e){if(!e)return;const t=mT(e);t&&(this._targetCodec=t)}setTargetScreenCodec(e){if(!e)return;const t=mT(e);t&&(this._targetScreenCodec=t)}getTargetCodec(){return this._targetCodec}getTargetScreenCodec(){return this._targetScreenCodec}resetPubSubLock(e){this.pubSubLock.closeReason=e,this.pubSubLock=new nN("pubSubLock")}setUserStreamConf(e,t,i){const o=this._userStreamConfig.get(e)||{},s=o[t]||{};o[t]=Ju(Ju({},s),i),this._userStreamConfig.set(e,o)}getRemoteMirrorType(e,t){var i;return!(null===(i=this._userStreamConfig.get(e))||void 0===i||null===(i=i[t])||void 0===i||!i.mirrorType)}get rtsMode(){return this.rtsLimiter.rtsMode}setRTSMode(e){this.rtsLimiter.e2e.setLimitMode(e),this.rtsLimiter.boradcast.setLimitMode(e),this.rtsLimiter.e2s.setLimitMode(e),this.rtsLimiter.rtsMode=e}setRtsQpsConf(e){this.rtsLimiter.e2e.setQPS(null==e?void 0:e.rts_qps_interval,null==e?void 0:e.rts_e2e_qps_value),this.rtsLimiter.boradcast.setQPS(null==e?void 0:e.rts_qps_interval,null==e?void 0:e.rts_broadcast_qps_value),this.rtsLimiter.e2s.setQPS(null==e?void 0:e.rts_qps_interval,null==e?void 0:e.rts_e2s_qps_value),this.rtsLimiter.conf=e}get receiveSEIWorker(){return this._receiveSEIWorker||(this._receiveSEIWorker=new TN),this._receiveSEIWorker}updatePCKillSwitch(e){this.pcKillSwitch=Ju(Ju({},this.pcKillSwitch),e)}destroy(){this.engineDestroyed=!0,this.signalingManager.destroy(),this.userPriority.clear(),this.avSync=!0,this._localAudioTrackDumpConfig={[em.STREAM_INDEX_MAIN]:{callback:void 0,frameSize:void 0},[em.STREAM_INDEX_SCREEN]:{callback:void 0,frameSize:void 0}},this._remoteAudioTrackDumpConfig[em.STREAM_INDEX_MAIN].clear(),this._remoteAudioTrackDumpConfig[em.STREAM_INDEX_SCREEN].clear(),this.extensionManager.destroy(),this.earMonitorSettings={[em.STREAM_INDEX_MAIN]:{position:Wm.NONE,volume:100},[em.STREAM_INDEX_SCREEN]:{position:Wm.NONE,volume:100}},this.publicAudioVolume.clear()}}function XN(e,t,i){const o=i.value;return i.value=async function(){var e,t;const i=await this._ctx.pubSubLock.lock();"chrome"!==(null===(e=this._ctx.handler)||void 0===e?void 0:e.name)&&"standard"!==(null===(t=this._ctx.handler)||void 0===t?void 0:t.name)||i();try{const{closeReason:e}=this._ctx.pubSubLock;if(e)throw new LS(RS.UNEXPECTED_ERROR,e);for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];return await o.apply(this,r)}finally{var a,d;"chrome"!==(null===(a=this._ctx.handler)||void 0===a?void 0:a.name)&&"standard"!==(null===(d=this._ctx.handler)||void 0===d?void 0:d.name)&&i()}},i}function LN(e,t,i){const o=i.value;return i.value=async function(){var e;if(null!==(e=this._room)&&void 0!==e&&e.config.isRTSOnlyRoom())throw new LS(RS.NOT_ALLOWED_IN_RTS_ROOM,"Engine.".concat(t,"() is not allowed in RTS room"));for(var i=arguments.length,s=new Array(i),r=0;r<i;r++)s[r]=arguments[r];return await o.apply(this,s)},i}Hu(RN,"videoPayloadMap",void 0);class CN{constructor(e,t){Hu(this,"_removeHandler",void 0),Hu(this,"_remotePauseHandler",void 0),Hu(this,"_prePts",void 0),Hu(this,"_stallList",void 0),Hu(this,"_videoInWaiting",!1),Hu(this,"_videoInWaitingCallback",!1),Hu(this,"_videoInWaiting100ms",!1),Hu(this,"_isPaused",void 0),Hu(this,"_pauseStart",0),Hu(this,"_pauseDuration",0),Hu(this,"_requestVideoFrameCallbackTimer",void 0),Hu(this,"_logger",void 0),Hu(this,"_player",void 0),Hu(this,"_recentVideoInfo",void 0),Hu(this,"_stallTimeThreshold",void 0),Hu(this,"_openVideoStall100ms",XZ.VIDEO_STALL_100MS);const i=e?1500:Kv||wv?550:500;this._stallTimeThreshold={report:i,callback:Math.max(XZ.VIDEO_STALL_DATA,i)},this._logger=new xv("VideoStallObserver",1,t)}start(e){if(this._logger.print("start","invoke"),this._player=e,WS())e.domElement&&(this._requestVideoFrameCallbackTimer=e.domElement.requestVideoFrameCallback(this._onVideoRefresh.bind(this)),this._removeHandler=()=>{var t;this._requestVideoFrameCallbackTimer&&(null===(t=e.domElement)||void 0===t||t.cancelVideoFrameCallback(this._requestVideoFrameCallbackTimer))});else{const t=t=>this._onVideoTimeupdate(t,e);e.on("playback_event",t),this._removeHandler=()=>e.off("playback_event",t)}const t=e=>this._onVideoPause(e);e.on("playback_event",t),this._remotePauseHandler=()=>e.off("playback_event",t)}getRecentRenderInfo4Report(){const e={};return this._recentVideoInfo&&Object.keys(this._recentVideoInfo).forEach((t=>{var i;const o=t.replace(/[a-z]{1}[A-Z]{1}/g,(e=>"".concat(e[0],"_").concat(e[1].toLowerCase())));e["video_".concat(o)]=null===(i=this._recentVideoInfo)||void 0===i?void 0:i[t]})),e}stop(){var e,t;this._logger.print("stop","invoke"),delete this._player,null===(e=this._removeHandler)||void 0===e||e.call(this),delete this._removeHandler,null===(t=this._remotePauseHandler)||void 0===t||t.call(this),delete this._remotePauseHandler,delete this._stallList,delete this._prePts,delete this._recentVideoInfo,this._videoInWaiting=!1,this._videoInWaitingCallback=!1,this._videoInWaiting100ms=!1}destroy(){this.stop()}getStallInfo(e){let{interval:t,frameRateReceived:i,frameRateDecoded:o,bitrate:s}=e;const r={pts:0,report:{stallCount:0,stallDuration:0,list:[]},callback:{stallCount:0,stallDuration:0},pauseDuration:this._getPauseDuration()};if(this._stallList){(Kv||wv)&&(0===s||(o||1/0)<=1||(i||1/0)<=1)||0===this._stallList.length?(r.report.stallDuration=r.callback.stallDuration=2e3,r.report.stallCount=r.callback.stallCount=this._videoInWaiting?0:1,this._openVideoStall100ms&&(r.stall100ms={count:this._videoInWaiting100ms?0:1,duration:2e3}),this._videoInWaiting=!0,this._videoInWaitingCallback=!0,this._videoInWaiting100ms=!0):this._stallList.forEach(((e,i)=>{let o=e.timeUpdateInterval;0===i&&this._videoInWaiting&&(o=Math.round(e.timeUpdateInterval%t));const s=e.timeUpdateInterval>this._stallTimeThreshold.report;s&&(r.report.list.push(e.timeUpdateInterval),r.report.stallDuration+=o,this._videoInWaiting||r.report.stallCount++),this._videoInWaiting=s,e.timeUpdateInterval>this._stallTimeThreshold.callback?(r.callback.stallDuration+=o,this._videoInWaitingCallback||r.callback.stallCount++,this._videoInWaitingCallback=!0):this._videoInWaitingCallback=!1,this._openVideoStall100ms&&(r.stall100ms||(r.stall100ms={count:0,duration:0}),e.timeUpdateInterval>100?(r.stall100ms.duration+=o,this._videoInWaiting100ms||r.stall100ms.count++,this._videoInWaiting100ms=!0):this._videoInWaiting100ms=!1),r.pts=e.playTime})),this._stallList=[]}return r}_getPauseDuration(){let e=this._pauseDuration;if(this._pauseDuration=0,this._isPaused){const t=Hf(),i=t-(this._pauseStart||0);i>500&&(this._pauseStart=t,e+=i)}return e}_onVideoPause(e){if("pause"===e.eventName)this._isPaused=!0,this._pauseStart=Hf();else if("play"===e.eventName&&this._isPaused){this._isPaused=!1;const e=Hf()-this._pauseStart;e>500&&(this._pauseDuration+=e)}}_onVideoTimeupdate(e,t){if("timeupdate"===e.eventName){const e=t.domElement;if(!e||0===e.currentTime)return;if(void 0===this._prePts)return void(this._prePts=e.currentTime);if(this._stallList||(this._stallList=[]),e.currentTime>this._prePts){const t=e.currentTime-this._prePts;this._stallList.push({playTime:e.currentTime,timeUpdateInterval:Math.round(1e3*t)})}this._prePts=e.currentTime}}_onVideoRefresh(e,t){var i;if(this._stallList||(this._stallList=[]),this._prePts){const e=t.presentationTime-this._prePts;this._stallList.push({playTime:t.presentationTime,timeUpdateInterval:Math.round(e)})}this._recentVideoInfo=t,this._prePts=t.presentationTime,null===(i=this._player)||void 0===i||null===(i=i.domElement)||void 0===i||i.requestVideoFrameCallback(this._onVideoRefresh.bind(this))}}class WN{constructor(e){Hu(this,"_audioStallTimer",void 0),Hu(this,"_preSample",void 0),Hu(this,"_isStallInPreCallbackEnd",!1),Hu(this,"_isStallInPreReportEnd",!1),Hu(this,"_stallList",[]),this._stream=e}static setAudioStallConfig(e){WN.interval=((null==e?void 0:e.audio_stall_interval)||200)/2,WN.ratio=(null==e?void 0:e.audio_stall_ratio)||.6}start(e,t){this.stop(),XZ.AUDIO_STALL&&WN.interval>0&&"number"==typeof e&&"number"==typeof t&&(this._preSample={ts:Hf(),concealedSamples:e,totalSamplesReceived:t},this._startStallCountInterval())}stop(){this._stallList=[],this._audioStallTimer&&(clearTimeout(this._audioStallTimer),delete this._audioStallTimer)}destroy(){this.stop()}async getAudioStallInfo(){const e={stats_count:this._stallList.filter((e=>!!e.get_stats_cost)).length,stall_list:[...this._stallList]};try{await this._audioStallCount()}catch(s){}const t=GN(this._stallList,2,this._isStallInPreReportEnd);this._isStallInPreReportEnd=t.isStallInEnd;const i=XZ.AUDIO_STALL_DATA/WN.interval,o=GN(this._stallList,i,this._isStallInPreCallbackEnd);return this._isStallInPreCallbackEnd=o.isStallInEnd,this.stop(),this._startStallCountInterval(),{report:{stall_count:t.stall_count,stall_duration:t.stall_duration,list:t.list},callback:{stall_count:o.stall_count,stall_duration:o.stall_duration,list:o.list},extra:e}}_startStallCountInterval(){const e=async()=>{clearTimeout(this._audioStallTimer),delete this._audioStallTimer,await this._audioStallCount(),this._audioStallTimer||(this._audioStallTimer=setTimeout(e,WN.interval))};this._audioStallTimer=setTimeout(e,WN.interval)}async _audioStallCount(){if(!this._preSample||Hf()-this._preSample.ts<.5*WN.interval)return;const{hasAudio:e,subAudio:t,virtual:i,virtualOccupy:o,removeTrack:s,audioTrack:r}=this._stream;if(s||!r)return clearTimeout(this._audioStallTimer),void delete this._audioStallTimer;const n=e&&t;if(!n||i&&!o)this._preSample.ts=Hf(),this._stallList.push({reason:n?"virtual: ".concat(i,", virtualOccupy: ").concat(o):"hasAudio: ".concat(e,", subAudio: ").concat(t)});else{const e=Hf();let t,i,o=0;try{var a;const e=await(null===(a=this._stream.audioTransceiver)||void 0===a?void 0:a.receiver.getStats());null==e||e.forEach((e=>{"inbound-rtp"===e.type&&(t=e),o++}))}catch(d){i=d.message||JSON.stringify(d)}const s=Hf(),r=Hf(),n=r-this._preSample.ts;if(t){const{concealedSamples:i,totalSamplesReceived:o}=t,a=i-this._preSample.concealedSamples,d=o-this._preSample.totalSamplesReceived,c=a>=0&&d>=0&&a>=WN.ratio*d;this._stallList.push({concealed:a,received:d,diff:n,start:this._preSample.ts,end:r,get_stats_cost:s-e,get_stats_start:e,get_stats_end:s,is_stall:c}),this._preSample.concealedSamples=i,this._preSample.totalSamplesReceived=o,this._preSample.ts=r}else this._stallList.push({diff:n,start:this._preSample.ts,end:r,get_stats_cost:s-e,get_stats_start:e,get_stats_end:s,reason:o?i||"no inbound-rtp":"no report"})}}}Hu(WN,"interval",100),Hu(WN,"ratio",.6);const GN=(e,t,i)=>{var o;const s={stall_count:0,stall_duration:0,isStallInEnd:!1,list:[]};let r=0,n=0;for(let a=0;a<e.length;a++){const i=e[a];i.is_stall&&(r++,n+=i.diff||0);const o=a===e.length-1;if(!i.is_stall||o){let i=r>=t;const d=a+t-r-1;if(!i&&r>2){let o=0;e.slice(a+1,d+1).forEach((e=>{e.is_stall&&(o+=e.diff||0)})),i=n+o>WN.interval*t*WN.ratio,i&&(a=d,n+=o)}i&&(s.stall_count++,s.stall_duration+=n,s.list.push(n)),o&&(s.isStallInEnd=i),r=n=0}}return!0===(null===(o=e[0])||void 0===o?void 0:o.is_stall)&&i&&s.stall_count>0&&s.stall_count--,s},VN=new xv("InternalEventBus",1);var EN=(e=>(e.ON_IOS_INTERRUPTION_START="ON_IOS_INTERRUPTION_START",e.ON_IOS_INTERRUPTION_END="ON_IOS_INTERRUPTION_END",e.ON_IOS_LOCAL_TRACK_MUTE="ON_IOS_LOCAL_TRACK_MUTE",e.ON_IOS_LOCAL_TRACK_UNMUTE="ON_IOS_LOCAL_TRACK_UNMUTE",e))(EN||{});class PN extends Zg.EventEmitter{emit(e){VN.info(e);for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return super.emit(e,...i)}}const kN=new PN;var xN="data:application/javascript;base64,Y2xhc3MgRHVtcEF1ZGlvRGF0YSBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvciB7CiAgcHJvY2VzcyhpbnB1dHMpIHsKICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgIGRhdGE6IGlucHV0c1swXSwKICAgICAgY2hhbm5lbENvdW50OiBpbnB1dHNbMF0ubGVuZ3RoLAogICAgICBzYW1wbGVSYXRlLAogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCnJlZ2lzdGVyUHJvY2Vzc29yKCdkdW1wLWF1ZGlvLWRhdGEnLCBEdW1wQXVkaW9EYXRhKTsK";const NN=new xv("AudioContext",1);class MN{constructor(e){Hu(this,"_ctx",void 0),Hu(this,"_analyserNode",void 0),Hu(this,"_audioSource",void 0),Hu(this,"currentTrackId",void 0),this.currentTrackId=e.id;const t=wN.getAudioContextInstance();if(e instanceof MediaStreamTrack){const i=new MediaStream;i.addTrack(e),this._audioSource=t.createMediaStreamSource(i)}else this._audioSource=t.createMediaElementSource(e),this._audioSource.connect(t.destination);const i=t.createAnalyser();this._audioSource.connect(i),this._analyserNode=i,this._ctx=t}getAudioLevel(){var e;"suspended"===(null===(e=this._ctx)||void 0===e?void 0:e.state)&&this._ctx.resume();const t=new Uint8Array(2048);this._analyserNode.getByteTimeDomainData(t);let i=0;t.forEach((e=>i=Math.max(i,Math.abs(e-128))));const o=i/128*255;return o>2?o:0}async resume(){var e;await(null===(e=this._ctx)||void 0===e?void 0:e.resume())}destroy(){this._audioSource.disconnect(),this._analyserNode.disconnect()}}class YN extends Zg.EventEmitter{constructor(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:wN.getAudioContextInstance(),o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:wN.isWorkletReady;var s;(super(),Hu(this,"_ctx",void 0),Hu(this,"_worklet",void 0),Hu(this,"_source",void 0),Hu(this,"_buffers",[]),Hu(this,"_bufferLength",0),Hu(this,"_sampleRate",void 0),Hu(this,"_channelCount",void 0),Hu(this,"_frameSize",void 0),e instanceof MediaStreamTrack)?this._channelCount=null!==(s=e.getSettings().channelCount)&&void 0!==s?s:1:this._channelCount=e.channelCount;this._ctx=i,this._frameSize=t,null==o||o.then((()=>{this._worklet=new AudioWorkletNode(this._ctx,"dump-audio-data"),e instanceof MediaStreamTrack?this._source=this._ctx.createMediaStreamSource(new MediaStream([e])):this._source=e,this._source.connect(this._worklet),this._initWorkletEventListener(this._worklet)})).catch()}_initWorkletEventListener(e){e.port.onmessage=this._handleWorkletMessage.bind(this)}_handleWorkletMessage(e){const{data:t,sampleRate:i}=e.data;if(this._bufferLength>=this._frameSize||this._sampleRate!==i){if(this._sampleRate){const e=1===this._channelCount||1===t.length?1:2;this.emit("data",{channels:[...this._buffers],sampleRate:this._sampleRate,channelCount:e})}this._sampleRate=i,this._buffers=new Array(this._channelCount).fill(0).map((()=>new Float32Array(this._frameSize))),this._bufferLength=0}for(let o=0;o<this._channelCount;o++)this._buffers[o].set(t[o],this._bufferLength);this._bufferLength=this._bufferLength+t[0].length}setFrameSize(e){this._frameSize=e}destroy(){var e,t,i;this.removeAllListeners("data"),this._worklet&&(null===(e=this._source)||void 0===e||e.disconnect(this._worklet)),null===(t=this._worklet)||void 0===t||t.disconnect(),null===(i=this._worklet)||void 0===i||i.port.close(),this._buffers=[],delete this._source,delete this._worklet}}const wN=new class{constructor(){Hu(this,"isWorkletReady",void 0),Hu(this,"_audioContextInstance",void 0),Hu(this,"_previousState",""),Hu(this,"_currentState",""),Hu(this,"_contextStuckAt",0);let e=0;Nv()||setInterval((()=>{if(this._audioContextInstance){const t=this._audioContextInstance.currentTime;this._contextStuckAt?this._contextStuckAt!==t&&(this._contextStuckAt=0,NN.info("currentTime resume"),lv("currentTime resume","")):t&&e===t&&(this._contextStuckAt=t,NN.warn("currentTime stuck",this._contextStuckAt),this._audioContextInstance.suspend(),this._audioContextInstance.resume(),lv("AudioContext currentTime stuck",this._contextStuckAt)),e=t}}),3e3)}getAudioContextInstance(){if(!this._audioContextInstance){const t=window.AudioContext||window.webkitAudioContext;this._audioContextInstance=new t;try{this.isWorkletReady=this._audioContextInstance.audioWorklet.addModule(xN),this.isWorkletReady.catch((e=>{cv("initial AudioWorklet error in promise",-1,"".concat(e.name,"-").concat(e.message)),NN.error("isWorkletReady",e),this.isWorkletReady=null}))}catch(e){cv("initial AudioWorklet error in catch",-1,"".concat(e.name,"-").concat(e.message)),NN.error("isWorkletReady",e),this.isWorkletReady=null}this._audioContextInstance.onstatechange=()=>{var e,t,i;NN.warn("state change",null===(e=this._audioContextInstance)||void 0===e?void 0:e.state),this._previousState=this._currentState,this._currentState=(null===(t=this._audioContextInstance)||void 0===t?void 0:t.state)||"","interrupted"===(null===(i=this._audioContextInstance)||void 0===i?void 0:i.state)&&this._audioContextInstance.resume(),($v||jv)&&("running"===this._previousState&&"interrupted"===this._currentState&&kN.emit(EN.ON_IOS_INTERRUPTION_START),"interrupted"===this._previousState&&"running"===this._currentState&&kN.emit(EN.ON_IOS_INTERRUPTION_END))}}return this._audioContextInstance}},KN=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=document.createElement(e);return t.id&&(i.id=t.id),t.classList&&t.classList.forEach((e=>{i.classList.add(e)})),t.style&&Object.assign(i.style,t.style),t.attributes&&Object.entries(t.attributes).forEach((e=>{let[t,o]=e;"muted"===t?i.muted=!0:i.setAttribute(t,o)})),i};const HN=new class extends Ig{constructor(){var e;super(),Hu(this,"deviceMap",{audioinput:new Map,audiooutput:new Map,videoinput:new Map}),Hu(this,"checkDeviceChangeTimer",null),Hu(this,"isSupportedPermissionsQuery",!1),Hu(this,"isGrantedMicrophonePermission",!1),Hu(this,"isGrantedCameraPermission",!1),this.isSupportedPermissionsQuery=!Nv()&&!(null===(e=navigator)||void 0===e||null===(e=e.permissions)||void 0===e||!e.query),this._handleDeviceChange=this._handleDeviceChange.bind(this),!Nv()&&this.initListener().then((()=>{this.updateDeviceListInSilent()}))}async refreshDevices(){let e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"audio";if(!navigator.mediaDevices)return;if(wv)try{e="audio"===t?await navigator.mediaDevices.getUserMedia({audio:!0}):await navigator.mediaDevices.getUserMedia({video:!0})}catch(o){}const i=await navigator.mediaDevices.enumerateDevices();e&&e.getTracks().forEach((e=>e.stop())),i.forEach((e=>{var t;e.deviceId&&(null===(t=this.deviceMap[e.kind])||void 0===t||t.set(e.deviceId,e))}))}async initListener(){var e,t;if(void 0!==(null===(e=navigator.mediaDevices)||void 0===e?void 0:e.ondevicechange)&&"function"==typeof(null===(t=navigator.mediaDevices)||void 0===t?void 0:t.addEventListener)?navigator.mediaDevices.addEventListener("devicechange",(()=>{this._handleDeviceChange(),setTimeout((()=>{this._handleDeviceChange()}),300)})):this.checkDeviceChangeTimer=window.setInterval((()=>{this._handleDeviceChange()}),3e3),this.isSupportedPermissionsQuery){try{const e=await navigator.permissions.query({name:"microphone"});this.isGrantedMicrophonePermission="granted"===e.state,e.addEventListener("change",(()=>{this.isGrantedMicrophonePermission="granted"===e.state}))}catch(i){}try{const e=await navigator.permissions.query({name:"camera"});this.isGrantedCameraPermission="granted"===e.state,e.addEventListener("change",(()=>{this.isGrantedCameraPermission="granted"===e.state}))}catch(o){}}}async _handleDeviceChange(){if(!navigator.mediaDevices)return;let e;wv&&(e=await navigator.mediaDevices.getUserMedia({audio:!0}));let t=await navigator.mediaDevices.enumerateDevices();t=t.filter((e=>!!e.deviceId)),e&&e.getTracks().forEach((e=>e.stop()));const i=Array.from([...this.deviceMap.audioinput.values(),...this.deviceMap.videoinput.values(),...this.deviceMap.audiooutput.values()]);(qv||jv)&&!i.length&&t.length&&t.forEach((e=>{var t;null===(t=this.deviceMap[e.kind])||void 0===t||t.set(e.deviceId,e)})),i.forEach((e=>{t.find((t=>t.deviceId===e.deviceId&&t.kind===e.kind&&t.label===e.label))||(this.deviceMap[e.kind].delete(e.deviceId),e.kind.includes("video")?this.emit(Mm.onVideoDeviceStateChanged,{mediaDeviceInfo:e,deviceState:"inactive"}):e.kind.includes("audio")&&this.emit(Mm.onAudioDeviceStateChanged,{mediaDeviceInfo:e,deviceState:"inactive"}))})),t.forEach((e=>{const t=this.deviceMap[e.kind].get(e.deviceId);this.deviceMap[e.kind].set(e.deviceId,e),t||(e.kind.includes("video")?this.emit(Mm.onVideoDeviceStateChanged,{mediaDeviceInfo:e,deviceState:"active"}):e.kind.includes("audio")&&this.emit(Mm.onAudioDeviceStateChanged,{mediaDeviceInfo:e,deviceState:"active"}))}))}async getUserMedia(e){const t=await navigator.mediaDevices.getUserMedia(e);return null!=e&&e.audio&&(this.isGrantedMicrophonePermission=!0),null!=e&&e.video&&(this.isGrantedCameraPermission=!0),null!=e&&e.video?this.refreshDevices("video"):this.refreshDevices("audio"),t}async checkPermissionsByDevices(){const e={audio:!1,video:!1};if(!navigator.mediaDevices)return e;const t=await navigator.mediaDevices.enumerateDevices();return e.audio=t.filter((e=>"audioinput"===e.kind&&e.label&&e.deviceId)).length>0,e.video=t.filter((e=>"videoinput"===e.kind&&e.label&&e.deviceId)).length>0,e}async getPermissions(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{audio:i,video:o}=t;const{force:s}=t;i||o||(i=!0,o=!0);const r={audio:!1,video:!1,reason:void 0};if(!s)if(this.isSupportedPermissionsQuery){if(i&&o){if(this.isGrantedMicrophonePermission&&this.isGrantedCameraPermission)return r.audio=!0,r.video=!0,r}else if(i&&this.isGrantedMicrophonePermission||o&&this.isGrantedCameraPermission)return r.audio=this.isGrantedMicrophonePermission,r.video=this.isGrantedCameraPermission,r}else{const e=await this.checkPermissionsByDevices();if(i&&o){if(e.audio&&e.video)return e}else if(i&&e.audio||o&&e.video)return e}if(null!==(e=navigator.mediaDevices)&&void 0!==e&&e.getUserMedia)try{const e=await navigator.mediaDevices.getUserMedia({audio:i,video:o});e&&(e.getTracks().forEach((e=>e.stop())),i&&(r.audio=!0,this.isGrantedMicrophonePermission=!0),o&&(r.video=!0,this.isGrantedCameraPermission=!0))}catch(d){if(r.reason=d,this.isSupportedPermissionsQuery){var n,a;if(i)r.audio="granted"===(null===(n=await navigator.permissions.query({name:"microphone"}).catch((()=>{})))||void 0===n?void 0:n.state);if(o)r.video="granted"===(null===(a=await navigator.permissions.query({name:"camera"}).catch((()=>{})))||void 0===a?void 0:a.state)}}return i?await this.refreshDevices("audio"):await this.refreshDevices("video"),r}async updateDeviceListInSilent(){this.isGrantedCameraPermission&&this.isGrantedMicrophonePermission&&this.refreshDevices("audio")}async enumerateDevices(){return await this.getPermissions(),await this.refreshDevices(),Array.from([...this.deviceMap.audioinput.values(),...this.deviceMap.videoinput.values(),...this.deviceMap.audiooutput.values()])}async enumerateAudioCaptureDevices(){return await this.getPermissions({audio:!0}),await this.refreshDevices(),Array.from(this.deviceMap.audioinput.values())}async enumerateVideoCaptureDevices(){return await this.getPermissions({video:!0}),await this.refreshDevices("video"),Array.from(this.deviceMap.videoinput.values())}async enumerateAudioPlaybackDevices(){return await this.getPermissions({audio:!0}),await this.refreshDevices("audio"),Array.from(this.deviceMap.audiooutput.values())}async getAudioPlaybackDeviceById(e){return(await this.enumerateAudioPlaybackDevices()).find((t=>t.deviceId===e))}};rT&&(window.__rtc_dd__=HN);const FN=new xv("VideoSnapshot",1),JN=async(e,t)=>{const i=document.createElement("canvas"),o=i.getContext("2d");if(!o)throw new Error("canvas.getContext error");const s=(e,t,s)=>(t=t||e.width,s=s||e.height,i.width=t,i.height=s,o.setTransform(1,0,0,1,0,0),o.drawImage(e,0,0,t,s),o.getImageData(0,0,t,s)),r=Date.now(),n=(e=>{const t=null==e?void 0:e.domElement;if(t&&!t.paused&&4===t.readyState)return t})(t);if(n){if(FN.info("takeSnapshot","VideoPlayer already set."),null!=t&&t.isAlpha){FN.info("takeSnapshot","manually process alpha video");const e=n.videoWidth,s=n.videoHeight,a=t.videoHeight;i.width=e,i.height=a,o.drawImage(n,0,s/2,e,s/2,0,0,e,a);const d=o.getImageData(0,0,e,a);return FN.info("takeSnapshot","success (alpha manual), cost ".concat(Date.now()-r,"ms")),d}const e=(null==t?void 0:t.videoWidth)||n.videoWidth,a=(null==t?void 0:t.videoHeight)||n.videoHeight,d=await s(n,e,a);return FN.info("takeSnapshot","success, cost ".concat(Date.now()-r,"ms")),d}if(window.ImageCapture){const t=new window.ImageCapture(e);if("live"===t.track.readyState&&t.track.enabled&&!t.track.muted){FN.info("takeSnapshot","use ImageCapture");const e=await s(await t.grabFrame());return FN.info("takeSnapshot","success, cost ".concat(Date.now()-r,"ms")),e}}return FN.info("takeSnapshot","use temp video"),new Promise(((t,i)=>{const o=new MediaStream([e]),n=document.createElement("video");n.setAttribute("playsinline",""),n.muted=!0,document.body.appendChild(n),n.onplaying=()=>{const i=s(n,n.videoWidth,n.videoHeight);FN.info("takeSnapshot","success, cost ".concat(Date.now()-r,"ms")),t(i),o.removeTrack(e),n.srcObject=null,n.load()},n.onerror=i,n.srcObject=o,n.play()}))},ON=Symbol("default");var UN=(e=>(e.START_STALL_OBSERVE="start_stall_observe",e.STOP_STALL_OBSERVE="stop_stall_observe",e))(UN||{});class DN extends Kg{constructor(e,t,i){super(e,t,Ju(Ju({},i),{},{mediaType:Mg.VIDEO})),Hu(this,"resolution",void 0),Hu(this,"videoPlayers",new Map),this.resolution={width:0,height:0}}intersection(){const e={};return this.videoPlayers.forEach(((t,i)=>{e[i.toString()]=t.isIntersecting})),e}async updateVideoCaptureConfig(e){this.logger.info("updateVideoEncoderConfig","update localVideoTrack: ",e);const t=Ju({},e);delete t.contentHint,wv&&this.trackInfo.streamIndex===Yg.MAIN&&(t.frameRate={ideal:30,max:30}),await this.originTrack.applyConstraints(t);const i=this.originTrack.getSettings();(i.width&&i.width!==this.resolution.width||i.height&&i.height!==this.resolution.height)&&(this.resolution={width:i.width,height:i.height},this.emit("resolution-change",this.resolution))}setContentHint(e){"contentHint"in this.originTrack&&["text","motion","detail"].includes(e)&&(this.originTrack.contentHint=e)}setTrack(e,t){this._originTrack=e,this.trackInfo=Ju(Ju({},this.trackInfo),t),this.isTrackReady=this.generatePreProcessingTrack()}setPlayer(e,t,i,o){var s;const r=null!==(s=e.playerId)&&void 0!==s?s:ON;let n=this.videoPlayers.get(r);return e.player!==n&&(n=e.player,this.videoPlayers.set(r,n),o(n,this.isPublic,this.streamIndex)),this.mirror(!!t),this.dummy||i===Sm.PLAY_MANUALLY||this.play(r),n.domElement}setUserId(e){this.trackInfo.streamUserId=e,this.videoPlayers.forEach((t=>{t.userId=e}))}snapshot(){let e;for(const t of this.videoPlayers.values())if(t.played){e=t;break}return JN(this.preprocessingTrack,e)}setRenderMode(e,t){var i;return null===(i=this.videoPlayers.get(e))||void 0===i?void 0:i.setRenderMode(t)}mirror(e){this.videoPlayers.forEach((t=>{t.mirror(e)}))}removePlayerTrack(){this.videoPlayers.forEach(((e,t)=>{var i;null===(i=this.videoPlayers.get(t))||void 0===i||i.removeTrack()}))}play(e){const t=this.videoPlayers.get(e);return null!=t&&t.played?t.manuallyPlay():null==t?void 0:t.playVideo(this)}playAll(){this.videoPlayers.forEach(((e,t)=>{this.play(t)}))}manuallyPlay(e){var t;return null===(t=this.videoPlayers.get(e))||void 0===t?void 0:t.manuallyPlay()}pause(e){var t;null===(t=this.videoPlayers.get(e))||void 0===t||t.manuallyPause()}stop(e){var t;return null===(t=this.videoPlayers.get(e))||void 0===t?void 0:t.stop()}stopAll(){return this.videoPlayers.forEach(((e,t)=>{this.stop(t)}))}removePlayer(e){this.videoPlayers.delete(e)}destroy(){this.videoPlayers.forEach(((e,t)=>{this.stop(t),e.removeAllListeners(),this.videoPlayers.delete(t)})),super.destroy()}}class AN extends Hg{constructor(e,t,i,o){super(e,t,Ju(Ju({},o),{},{mediaType:Mg.VIDEO})),Hu(this,"videoPlayers",new Map),Hu(this,"_stream",void 0),Hu(this,"_observingPlayer",void 0),this._stream=i}get observingPlayerId(){var e;return null===(e=this._observingPlayer)||void 0===e?void 0:e.playerId}getSizeByPlayer(){let e=0,t=0;return this.videoPlayers.forEach((i=>{i.videoWidth&&i.videoHeight&&(e=i.videoWidth,t=i.videoHeight)})),{width:e,height:t}}intersection(){const e={};return this.videoPlayers.forEach(((t,i)=>{e[i.toString()]=t.isIntersecting})),e}setPlayer(e,t,i,o){var s,r;const n=null!==(s=t.playerId)&&void 0!==s?s:ON;let a=this.videoPlayers.get(n);if(t.player!==a){var d;if(a=t.player,!$f(this.streamIndex))a.mirror(this._ctx.getRemoteMirrorType(null!==(d=this.trackInfo.streamUserId)&&void 0!==d?d:"",this.streamIndex));this.videoPlayers.set(n,a),this._handlePlayerStallEvent(a),o(a,this.isPublic,this.streamIndex)}return this.dummy||this.play(n),null===(r=a)||void 0===r?void 0:r.domElement}mirror(e){this.videoPlayers.forEach((t=>{t.mirror(e)}))}dangerousGetPlayer(e){return this.videoPlayers.get(e)}snapshot(){let e;for(const t of this.videoPlayers.values())if(t.played){e=t;break}return JN(this.preprocessingTrack,e)}stop(e){var t;null===(t=this.videoPlayers.get(e))||void 0===t||t.stop()}stopAll(){this.videoPlayers.forEach(((e,t)=>{this.stop(t)}))}play(e){if(this._ctx.autoPlayPolicy===Sm.PLAY_MANUALLY)return;const t=this.videoPlayers.get(e);return null==t?void 0:t.playVideo(this)}manuallyPlay(e){const t=this.videoPlayers.get(e);return null!=t&&t.played?t.manuallyPlay():null==t?void 0:t.playVideo(this)}pause(e){var t;return null===(t=this.videoPlayers.get(e))||void 0===t?void 0:t.manuallyPause()}_handlePlayerStallEvent(e){e.on("start_stall_observe",(()=>{!this._observingPlayer&&e&&(this._observingPlayer=e,this._stream.startVideoStallObserve(this._observingPlayer))})),e.on("stop_stall_observe",(()=>{this._observingPlayer===e&&(this._stream.stopVideoStallObserve(),this._observingPlayer=void 0,this.videoPlayers.forEach((e=>{!this._observingPlayer&&e.played&&(this._observingPlayer=e,this._stream.startVideoStallObserve(e))})))}))}removePlayer(e){this.videoPlayers.delete(e)}setAlphaInfo(e){this.videoPlayers.forEach((t=>{t.setAlphaInfo(e)}))}destroy(){this.videoPlayers.forEach(((e,t)=>{this.stop(t),e.removeAllListeners(),this.videoPlayers.delete(t)})),super.destroy()}}const zN=["cap","ch","em","ex","ic","lh","rcap","rch","rem","rex","ric","rlh","vh","vw","vmax","vmin","vb","vi","cqw","cqh","cqi","cqb","cqmin","cqmax","px","cm","mm","Q","in","pc","pt"],jN=["deg","grad","rad","turn"];function QN(e){var t,i;if(!e.match(/[0-9]$/))return null;if((null!==(t=null===(i=e.match(/\./g))||void 0===i?void 0:i.length)&&void 0!==t?t:0)>1)return null;const o=parseFloat(e);return Number.isNaN(o)?null:o}function BN(e){if(!e.endsWith("%"))return null;const t=QN(e.slice(0,-1));if(null===t)return null;return t/100}function qN(e){let t=BN(e);return null!==t?t:(t=QN(e),null!==t&&t>=0&&t<=1?t:null)}function $N(e){let t=BN(e);return null===t&&(t=QN(e)),t}function eM(e){var t,i,o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v;if(!e)return!0;if(Nv())return!1;const S=getComputedStyle(e),{display:Z,visibility:f,contentVisibility:T,opacity:I,filter:g}=S;if(Z&&"none"===Z)return!1;if(f&&("hidden"===f||"collapse"===f))return!1;if(T&&"hidden"===T)return!1;if(!I)return!1;const R=qN(I);if(null!==R&&R<1)return!1;const X=qN(null!==(t=null===(i=g.match(/opacity\((\S+)\)/))||void 0===i?void 0:i[1])&&void 0!==t?t:"");if(null!==X&&1!==X)return!1;const L=function(e){for(const t of zN){if(!e.endsWith(t))continue;const i=QN(e.slice(0,-1*t.length));if(i)return{value:i,unit:t}}return null}(null!==(o=null===(s=g.match(/blur\((\S+)\)/))||void 0===s?void 0:s[1])&&void 0!==o?o:"");if(null!==L&&0!==L.value)return!1;const C=$N(null!==(r=null===(n=g.match(/brightness\((\S+)\)/))||void 0===n?void 0:n[1])&&void 0!==r?r:"");if(null!==C&&(C>1||C<1))return!1;const W=$N(null!==(a=null===(d=g.match(/contrast\((\S+)\)/))||void 0===d?void 0:d[1])&&void 0!==a?a:"");if(null!==W&&(W>1||W<1))return!1;const G=qN(null!==(c=null===(l=g.match(/grayscale\((\S+)\)/))||void 0===l?void 0:l[1])&&void 0!==c?c:"");if(null!==G&&G>0)return!1;const V=function(e){for(const t of jN){if(!e.endsWith(t))continue;const i=QN(e.slice(0,-1*t.length));if(i)return{value:i,unit:t}}return null}(null!==(u=null===(m=g.match(/hue-rotate\((\S+)\)/))||void 0===m?void 0:m[1])&&void 0!==u?u:"");if(null!==V&&(V.value>0||V.value<-0))return!1;const E=$N(null!==(h=null===(p=g.match(/invert\((\S+)\)/))||void 0===p?void 0:p[1])&&void 0!==h?h:"");if(null!==E&&E>0)return!1;const P=$N(null!==(b=null===(_=g.match(/saturate\((\S+)\)/))||void 0===_?void 0:_[1])&&void 0!==b?b:"");if(null!==P&&(P<1||P>1))return!1;const k=$N(null!==(y=null===(v=g.match(/sepia\((\S+)\)/))||void 0===v?void 0:v[1])&&void 0!==y?y:"");return!(null!==k&&k>0)&&eM(e.parentElement)}function tM(e){const t=[];return function(e){let t=e;for(;t;){if(document.documentElement===t)return!0;t=t.parentElement}return!1}(e)?(eM(e)||t.push(Vm.PLAYER_INVISIBLE_BY_STYLE),function(e){const{left:t,right:i,top:o,bottom:s}=e.getBoundingClientRect();return function(e){let{lt:t,rb:i}=e;const o=i.x-t.x,s=i.y-t.y;if(0===o||0===s)return[];const r=.05*o/2,n=.05*s/2,a=(o-2*r)/4,d=(s-2*n)/4,c=[];for(let l=r+t.x;l<=i.x;l+=a)for(let e=n+t.y;e<=i.y;e+=d)c.push({x:l,y:e});return c}({lt:{x:t,y:o},rb:{x:i,y:s}}).reduce(((t,i)=>{const o=document.elementFromPoint(i.x,i.y);return o&&o!==e&&(t+=1),t}),0)<6}(e)||t.push(Vm.PLAYER_INVISIBLE_BY_COVERED),function(e){const{left:t,right:i,top:o,bottom:s}=e.getBoundingClientRect(),{clientWidth:r,clientHeight:n}=document.body,a=i-t-10,d=s-o-10;return!(i-r>=a||0-t>=a||s-n>=d||0-o>=d)}(e)||t.push(Vm.PLAYER_INVISIBLE_BY_POSITION),function(e){const{left:t,right:i,top:o,bottom:s}=e.getBoundingClientRect(),{clientWidth:r,clientHeight:n}=document.body,a=i-t,d=s-o,c=r>n?n:r;return!(a<50||d<50||a/c<.1||d/c<.1)}(e)||t.push(Vm.PLAYER_INVISIBLE_BY_SIZE),t.length>0?t:[Vm.PLAYER_VISIBLE]):[Vm.PLAYER_INVISIBLE_BY_UNMOUNT]}class iM{constructor(){Hu(this,"canvas",void 0),Hu(this,"gl",null),Hu(this,"program",null),Hu(this,"videoTexture",null),Hu(this,"animationFrameId",null),Hu(this,"isRendering",!1),Hu(this,"positionBuffer",null),Hu(this,"texCoordBuffer",null),Hu(this,"positionLocation",-1),Hu(this,"texCoordLocation",-1),Hu(this,"textureLocation",null),Hu(this,"render",(e=>{if(this.isRendering&&this.gl&&this.program){if(e.videoWidth>0&&e.videoHeight>0){const t=e.videoHeight/2;this.canvas.width===e.videoWidth&&this.canvas.height===t||(this.canvas.width=e.videoWidth,this.canvas.height=t,this.gl.viewport(0,0,this.canvas.width,this.canvas.height))}this.gl.clearColor(0,0,0,0),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.enable(this.gl.BLEND),this.gl.blendFunc(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA),this.gl.useProgram(this.program),this.gl.bindTexture(this.gl.TEXTURE_2D,this.videoTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.positionLocation),this.gl.vertexAttribPointer(this.positionLocation,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texCoordBuffer),this.gl.enableVertexAttribArray(this.texCoordLocation),this.gl.vertexAttribPointer(this.texCoordLocation,2,this.gl.FLOAT,!1,0,0),this.gl.uniform1i(this.textureLocation,0),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4),this.animationFrameId=requestAnimationFrame((()=>this.render(e)))}})),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.objectFit="contain",this.initWebGL()}initWebGL(){try{if(this.gl=this.canvas.getContext("webgl")||this.canvas.getContext("experimental-webgl"),!this.gl)return console.error("WebGL not supported"),!1;const e="\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        varying vec2 v_texCoord;\n\n        void main() {\n          gl_Position = vec4(a_position, 0.0, 1.0);\n          v_texCoord = a_texCoord;\n        }\n      ",t="\n        precision mediump float;\n        varying vec2 v_texCoord;\n        uniform sampler2D u_texture;\n\n        void main() {\n          // 上半部分是 alpha 通道 (0.0 - 0.5)\n          // 下半部分是 RGB 通道 (0.5 - 1.0)\n\n          // 获取 RGB 值（从下半部分）\n          vec2 rgbCoord = vec2(v_texCoord.x, v_texCoord.y * 0.5 + 0.5);\n          vec4 rgbColor = texture2D(u_texture, rgbCoord);\n\n          // 获取 Alpha 值（从上半部分）\n          vec2 alphaCoord = vec2(v_texCoord.x, v_texCoord.y * 0.5);\n          vec4 alphaColor = texture2D(u_texture, alphaCoord);\n\n          // 使用 alpha 通道的灰度值作为透明度\n          float alpha = (alphaColor.r + alphaColor.g + alphaColor.b) / 3.0;\n\n          gl_FragColor = vec4(rgbColor.rgb, alpha);\n        }\n      ",i=this.createShader(this.gl.VERTEX_SHADER,e),o=this.createShader(this.gl.FRAGMENT_SHADER,t);return i&&o?(this.program=this.createProgram(i,o),this.program?(this.positionLocation=this.gl.getAttribLocation(this.program,"a_position"),this.texCoordLocation=this.gl.getAttribLocation(this.program,"a_texCoord"),this.textureLocation=this.gl.getUniformLocation(this.program,"u_texture"),this.setupBuffers(),this.videoTexture=this.gl.createTexture(),!0):(console.error("Failed to create program"),!1)):(console.error("Failed to create shaders"),!1)}catch(oK){return console.error("Failed to initialize WebGL:",oK),!1}}createShader(e,t){if(!this.gl)return null;const i=this.gl.createShader(e);return i?(this.gl.shaderSource(i,t),this.gl.compileShader(i),this.gl.getShaderParameter(i,this.gl.COMPILE_STATUS)?i:(console.error("Shader compile error:",this.gl.getShaderInfoLog(i)),this.gl.deleteShader(i),null)):null}createProgram(e,t){if(!this.gl)return null;const i=this.gl.createProgram();return i?(this.gl.attachShader(i,e),this.gl.attachShader(i,t),this.gl.linkProgram(i),this.gl.getProgramParameter(i,this.gl.LINK_STATUS)?i:(console.error("Program link error:",this.gl.getProgramInfoLog(i)),this.gl.deleteProgram(i),null)):null}setupBuffers(){if(!this.gl)return;this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer);const e=new Float32Array([-1,-1,1,-1,-1,1,1,1]);this.gl.bufferData(this.gl.ARRAY_BUFFER,e,this.gl.STATIC_DRAW),this.texCoordBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texCoordBuffer);const t=new Float32Array([0,1,1,1,0,0,1,0]);this.gl.bufferData(this.gl.ARRAY_BUFFER,t,this.gl.STATIC_DRAW)}startRender(e){this.isRendering||(this.isRendering=!0,this.render(e))}stopRender(){this.isRendering=!1,null!==this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}getCanvas(){return this.canvas}setObjectFit(e){this.canvas.style.objectFit=e}setMirror(e){this.canvas.style.transform=e?"rotateY(180deg)":""}destroy(){this.stopRender(),this.gl&&(this.videoTexture&&(this.gl.deleteTexture(this.videoTexture),this.videoTexture=null),this.positionBuffer&&(this.gl.deleteBuffer(this.positionBuffer),this.positionBuffer=null),this.texCoordBuffer&&(this.gl.deleteBuffer(this.texCoordBuffer),this.texCoordBuffer=null),this.program&&(this.gl.deleteProgram(this.program),this.program=null),this.gl=null),this.canvas.parentElement&&this.canvas.parentElement.removeChild(this.canvas)}}const oM=["play","playing","pause","ended","error","seeking","seeked","waiting","canplay","canplaythrough","durationchange","volumechange","loadedmetadata","loadeddata","loadstart","timeupdate"],sM={playsinline:"","webkit-playsinline":""},rM={playsinline:"","webkit-playsinline":"","x5-playsinline":"","x5-video-player-type":"h5","x-webkit-airplay":"allow",preload:"",muted:""};class nM extends Zg.EventEmitter{constructor(e,t,i){var o;super(),Hu(this,"_containerDom",void 0),Hu(this,"_videoDom",void 0),Hu(this,"_alphaRenderer",void 0),Hu(this,"_canvasDom",void 0),Hu(this,"userId",void 0),Hu(this,"renderMode",void 0),Hu(this,"mirrorType",nm.MIRROR_TYPE_NONE),Hu(this,"isScreen",void 0),Hu(this,"isLocal",void 0),Hu(this,"isAlpha",void 0),Hu(this,"alphaInfo",void 0),Hu(this,"played",!1),Hu(this,"_needLoad",!1),Hu(this,"_emitPlayFailed",!1),Hu(this,"_videoContainer",void 0),Hu(this,"_safari15VideoTimer",void 0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_onLocalTrackMute",void 0),Hu(this,"_onInterruptionEnd",void 0),Hu(this,"_needResume",!1),Hu(this,"_rotate",0),Hu(this,"_rotateDom",void 0),Hu(this,"_resizeObserver",void 0),Hu(this,"_hasManuallyPaused",!1),Hu(this,"isIntersecting",void 0),Hu(this,"intersectionObserver",void 0),Hu(this,"hasStartPlaying",!1),Hu(this,"emitVideoEvent",(e=>{var t,i;const o={type:"video",rawEvent:e,readyState:(null===(t=this._videoDom)||void 0===t?void 0:t.readyState)||0,userId:this.userId,eventName:e.type,currentTime:(null===(i=this._videoDom)||void 0===i?void 0:i.currentTime)||0,isScreen:this.isScreen};switch(this.emit("playback_event",o),e.type){case"canplay":this.refreshRenderSize("the video started playing."),this._internalPlay();break;case"loadeddata":this._internalPlay();break;case"playing":this.logger.info("VideoPlayerPlaying","[userId-".concat(this.userId,"] video element playing"));break;case"pause":this.logger.info("VideoPlayerPause","[userId-".concat(this.userId,"] video element pause")),this._needResume?(this.logger.info("VideoPlayerPause","[userId-".concat(this.userId,"] video element resume")),this._internalPlay(),this._needResume=!1):this._hasManuallyPaused||(this.logger.info("VideoPlayerPause","[userId-".concat(this.userId,"] video element resume")),this._internalPlay())}})),Hu(this,"_internalPlay",(()=>{var e,t;if(vv(this.engineId,"video _internalPlay",{paused:null===(e=this._videoDom)||void 0===e?void 0:e.paused,hasManuallyPaused:this._hasManuallyPaused}),this._hasManuallyPaused||null===(t=this._videoDom)||void 0===t||!t.paused)return;const i=this._videoDom.play();null!=i&&i.then&&i.then((()=>{var e;this.isLocal&&Fv&&!this._needLoad&&(null===(e=this._videoDom)||void 0===e||e.load(),this._needLoad=!0)})).catch((e=>{var t,i,o,s;this._emitPlayFailed||("AbortError"!==e.name?(this._emitPlayFailed=!0,null===(t=this._monitor)||void 0===t||t.report("rtc_error",{message:"video autoplay failed, userId: ".concat(this.userId,", ").concat(e.name),error_code:rG.AUTOPLAY_FAILED}),this.emit("playback_event",{type:"video",rawEvent:e,readyState:(null===(i=this._videoDom)||void 0===i?void 0:i.readyState)||0,userId:this.userId,eventName:"autoplay-error",currentTime:(null===(o=this._videoDom)||void 0===o?void 0:o.currentTime)||0,isScreen:this.isScreen})):null===(s=this._monitor)||void 0===s||s.report("rtc_error",{message:"video autoplay failed, userId: ".concat(this.userId,", ").concat(e.name),error_code:rG.AUTOPLAY_FAILED}))}))})),this.engineId=e,this.playerId=t;const s=i.renderDom;this._monitor=mv(e),this.logger=new xv("Player",0,e);const{userId:r}=i,n=i.isScreen?$u.RENDER_MODE_FIT:$u.RENDER_MODE_HIDDEN;this.renderMode=void 0!==i.renderMode?i.renderMode:n,this._rotate=Number(i.rotation||0);const a="string"==typeof s?document.getElementById(s):s;if(!a)throw new LS(RS.CANT_FIND_DOM,"can't find dom");this._videoContainer=document.createElement("div"),this._videoContainer.style.width="100%",this._videoContainer.style.height="100%",this._videoContainer.style.position="relative",this._videoContainer.style.overflow="hidden",this._containerDom=a,this.userId=r,this.isLocal=!!i.isLocal,this.isScreen=!!i.isScreen,this.isAlpha=!(null===(o=i.alphaInfo)||void 0===o||!o.enableAlpha),this.alphaInfo=i.alphaInfo,this._initVideo(),!this.isLocal||15!==(null==uS?void 0:uS[0])&&15!==dS||(this._safari15VideoTimer=setTimeout((()=>{try{this._videoContainer.style.display="block",setTimeout((()=>{this._videoContainer.style.display="flex"}),500)}catch(oK){}}),1e3))}_initVideo(){this._videoDom||(this._videoDom=KN("video",{style:{width:"100%",height:"100%"},attributes:rM}),this._videoDom.id="".concat(this.userId,"_").concat(Kf()),this.setRenderMode(this.renderMode),this.mirror(this.mirrorType===nm.MIRROR_TYPE_RENDER)),this.isAlpha&&this._initAlphaRenderer(),this._containerDom.appendChild(this._videoContainer),[90,270].indexOf(this._rotate)>-1?(this._rotateDom=this._createRotationDiv(),this.isAlpha&&this._canvasDom?(this._videoDom.style.display="none",this._rotateDom.appendChild(this._videoDom),this._rotateDom.appendChild(this._canvasDom)):this._rotateDom.appendChild(this._videoDom),this._videoContainer.appendChild(this._rotateDom)):(180===this._rotate&&(this._videoContainer.style.transform="rotate(180deg)"),this.isAlpha&&this._canvasDom?(this._videoDom.style.display="none",this._videoContainer.appendChild(this._videoDom),this._videoContainer.appendChild(this._canvasDom)):this._videoContainer.appendChild(this._videoDom)),this._initInterSectionObserver(),this._initListeners(),this._onLocalTrackMute=()=>{this._needResume=!0},this._onInterruptionEnd=()=>{this.logger.warn("resume player after iOS interruption"),this._internalPlay()},kN.on(EN.ON_IOS_LOCAL_TRACK_MUTE,this._onLocalTrackMute),kN.on(EN.ON_IOS_LOCAL_TRACK_UNMUTE,this._onInterruptionEnd),kN.on(EN.ON_IOS_INTERRUPTION_END,this._onInterruptionEnd)}_initAlphaRenderer(){this._alphaRenderer||(this._alphaRenderer=new iM,this._canvasDom=this._alphaRenderer.getCanvas(),this._alphaRenderer.setObjectFit(this._getObjectFitFromRenderMode(this.renderMode)),this._alphaRenderer.setMirror(this.mirrorType===nm.MIRROR_TYPE_RENDER))}_getObjectFitFromRenderMode(e){return e===$u.RENDER_MODE_FIT?"contain":e===$u.RENDER_MODE_FILL?"fill":"cover"}_initInterSectionObserver(){!this.intersectionObserver&&"undefined"!=typeof IntersectionObserver&&this._videoDom&&(this.intersectionObserver=new IntersectionObserver((e=>{e[0]&&(this.isIntersecting=e[0].isIntersecting)}),{}),this.intersectionObserver.observe(this._videoDom))}_closeIntersectionObserver(){this.intersectionObserver&&this._videoDom&&(this.intersectionObserver.disconnect(),this.intersectionObserver.unobserve(this._videoDom),delete this.intersectionObserver)}_createRotationDiv(){const e=document.createElement("div");return e.style.transform="rotate(".concat(this._rotate,"deg)"),180!==this._rotate&&(e.style.position="absolute",this.refreshRenderSize("init"),window.ResizeObserver&&(this._resizeObserver=new ResizeObserver((()=>{this.refreshRenderSize("the container size has changed.")})),this._resizeObserver.observe(this._containerDom))),e}refreshRenderSize(e){if(this._rotateDom){var t,i;this.logger.print("refreshRenderSize","Because ".concat(e));const o=Number(window.getComputedStyle(this._containerDom).width.replace("px","")),s=Number(window.getComputedStyle(this._containerDom).height.replace("px","")),r=null===(t=this._videoDom)||void 0===t?void 0:t.videoWidth,n=null===(i=this._videoDom)||void 0===i?void 0:i.videoHeight;if(o&&s&&n&&r){let e,t;if(this.renderMode===$u.RENDER_MODE_FILL)e=s,t=o;else{const i=this.renderMode===$u.RENDER_MODE_HIDDEN?Math.max(o/n,s/r):Math.min(o/n,s/r);e=r*i,t=n*i}this._rotateDom.style.width="".concat(e,"px"),this._rotateDom.style.height="".concat(t,"px"),this._rotateDom.style.left="".concat((o-e)/2,"px"),this._rotateDom.style.top="".concat((s-t)/2,"px")}}}_initListeners(){this._videoDom&&oM.forEach((e=>{var t;null===(t=this._videoDom)||void 0===t||t.addEventListener(e,this.emitVideoEvent)}))}_removeListeners(){this._videoDom&&oM.forEach((e=>{var t;null===(t=this._videoDom)||void 0===t||t.removeEventListener(e,this.emitVideoEvent)}))}getPlayerVisibility(){return tM(this._videoDom)}setRenderMode(e){this.renderMode=e,this._videoDom&&(this._videoDom.style.objectFit=this._getObjectFitFromRenderMode(e)),this._alphaRenderer&&this._alphaRenderer.setObjectFit(this._getObjectFitFromRenderMode(e))}async playVideo(e){var t,i;let o=this._videoDom;if(this.logger.info("playVideo","play video track: ".concat(this.userId)),o&&o.srcObject instanceof MediaStream&&o.srcObject.getTrackById(null===(t=e.preprocessingTrack)||void 0===t?void 0:t.id)){try{vv(this.engineId,"playVideo","play video repeatedly",0,this.userId)}catch(oK){}return}o||(this._initVideo(),o=this._videoDom),this.logger.info("playVideo","play video by dom: ".concat(null===(i=o)||void 0===i?void 0:i.id));const s=new MediaStream;s.addTrack(e.preprocessingTrack),o.srcObject=s,o&&!this._containerDom.contains(this._videoContainer)&&this._containerDom.appendChild(this._videoContainer),o&&!this._videoContainer.contains(o)&&this._videoContainer.appendChild(o),setTimeout((()=>this._internalPlay())),this.isAlpha&&this._alphaRenderer&&o&&this._alphaRenderer.startRender(o),XZ.VIDEO_STALL&&this.emit(UN.START_STALL_OBSERVE),this.played=!0,this.hasStartPlaying=!1}updateSrcObject(e){const t=e.preprocessingTrack;if(!t||!this._videoDom)return;const i=new MediaStream;i.addTrack(t),this._videoDom.srcObject=i}removeTrack(){var e;const t=null===(e=this._videoDom)||void 0===e?void 0:e.srcObject;if(t){const e=t.getVideoTracks();null!=e&&e.length&&e.forEach((e=>{t.removeTrack(e)}))}}manuallyPlay(){if(this.logger.info("Invoke VideoPlayer.manuallyPlay",this.userId,this.isScreen),this._emitPlayFailed=!1,this._hasManuallyPaused=!1,!this._videoDom)throw new LS(RS.INVALID_PARAMS,"Player not found");return 0!==this._videoDom.readyState||Bv?this._videoDom.play():Promise.resolve()}manuallyPause(){if(this.logger.print("Invoke VideoPlayer.manuallyPause",this.userId,this.isScreen),this.played){if(this._hasManuallyPaused=!0,!this._videoDom)throw new LS(RS.INVALID_PARAMS,"Player not found");return this._videoDom.pause()}}mirror(e){this.logger.info("mirror","".concat(this.userId," set mirror: ").concat(e)),this.mirrorType=e?nm.MIRROR_TYPE_RENDER:nm.MIRROR_TYPE_NONE,this._videoDom&&(this._videoDom.style.transform=e?"rotateY(180deg)":"",this._alphaRenderer&&this._alphaRenderer.setMirror(e))}stop(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const{_containerDom:t}=this;var i,o,s;(this.logger.info("stop","stop video track: ".concat(this.userId," ").concat(this.playerId.toString())),this._alphaRenderer&&this._alphaRenderer.stopRender(),this._videoDom)&&(e||(this._videoDom.srcObject=null),null!=t&&t.contains(this._videoContainer)&&t.removeChild(this._videoContainer),null===(i=this._videoContainer)||void 0===i||i.childNodes.forEach((e=>{e!==this._videoDom&&e!==this._rotateDom&&e!==this._canvasDom||this._videoContainer.removeChild(e)})),null!==(o=this._rotateDom)&&void 0!==o&&o.contains(this._videoDom)&&this._rotateDom.removeChild(this._videoDom),this._canvasDom&&null!==(s=this._rotateDom)&&void 0!==s&&s.contains(this._canvasDom)&&this._rotateDom.removeChild(this._canvasDom));this._hasManuallyPaused=!1,this.played=!1,this.hasStartPlaying=!1,XZ.VIDEO_STALL&&this.emit(UN.STOP_STALL_OBSERVE),this._closeIntersectionObserver()}destroy(){var e;let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.logger.info("destroy","video player: ".concat(this.userId)),this.stop(t),this._alphaRenderer&&(this._alphaRenderer.destroy(),this._alphaRenderer=void 0,this._canvasDom=void 0),null===(e=this._resizeObserver)||void 0===e||e.disconnect(),super.removeAllListeners(),this._removeListeners(),kN.off(EN.ON_IOS_LOCAL_TRACK_MUTE,this._onLocalTrackMute),kN.off(EN.ON_IOS_LOCAL_TRACK_UNMUTE,this._onInterruptionEnd),kN.off(EN.ON_IOS_INTERRUPTION_END,this._onInterruptionEnd),this._videoDom&&delete this._videoDom,this._safari15VideoTimer&&(window.clearInterval(this._safari15VideoTimer),this._safari15VideoTimer=void 0)}get domElement(){return this._videoDom}get videoWidth(){var e;return this._videoDom?this.isAlpha&&null!==(e=this.alphaInfo)&&void 0!==e&&e.alphaWidth?this.alphaInfo.alphaWidth:this._videoDom.videoWidth:0}get videoHeight(){return this._videoDom?this.isAlpha?null!==(e=this.alphaInfo)&&void 0!==e&&e.alphaHeight?this.alphaInfo.alphaHeight:this._videoDom.videoHeight/2:this._videoDom.videoHeight:0;var e}setAlphaInfo(e){var t;(this.logger.info("setAlphaInfo","set alpha info for user: ".concat(this.userId),e),this.isAlpha=!!e.enableAlpha,this.alphaInfo=e,this.isAlpha)?(this._alphaRenderer||this._initAlphaRenderer(),this._canvasDom&&this._alphaRenderer?(this._videoDom&&(this._videoDom.style.display="none"),this._rotateDom?this._rotateDom.contains(this._canvasDom)||this._rotateDom.appendChild(this._canvasDom):this._videoContainer.contains(this._canvasDom)||this._videoContainer.appendChild(this._canvasDom),null!==(t=this._videoDom)&&void 0!==t&&t.srcObject&&this._alphaRenderer.startRender(this._videoDom)):this.logger.info("setAlphaInfo","alpha renderer already exists or canvas not created")):this.logger.warn("setAlphaInfo","alphaInfo.enableAlpha is false, skip alpha renderer creation")}}class aM extends Zg.EventEmitter{constructor(e,t){let{divId:i,muted:o,isScreen:s}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{divId:void 0,muted:!1,isScreen:!1};if(super(),Hu(this,"_containerDom",void 0),Hu(this,"_audioDom",void 0),Hu(this,"_fakeAudioDom",void 0),Hu(this,"userId",void 0),Hu(this,"muted",!1),Hu(this,"_emitPlayFailed",!1),Hu(this,"played",!1),Hu(this,"isScreen",void 0),Hu(this,"_wechatTimer",void 0),Hu(this,"_edgeTimer",void 0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_pasued",!0),Hu(this,"hasStartPlaying",!1),Hu(this,"emitAudioEvent",(e=>{var t,i;const o={type:"audio",rawEvent:e,readyState:(null===(t=this._audioDom)||void 0===t?void 0:t.readyState)||0,userId:this.userId,eventName:e.type,currentTime:(null===(i=this._audioDom)||void 0===i?void 0:i.currentTime)||0};var s;("playing"===e.type&&this.logger.info("AudioPlayerPlaying","[userId-".concat(this.userId,"] audio element playing")),"pause"===e.type)&&(this.logger.info("AudioPlayerPause","[userId-".concat(this.userId,"] audio element pause")),!this._pasued&&null!==(s=this._audioDom)&&void 0!==s&&null!==(s=s.srcObject)&&void 0!==s&&s.active&&this._internalPlay());eS&&Bv&&("canplay"===e.type?(clearTimeout(this._wechatTimer),this._wechatTimer=setTimeout((()=>{this._autoPlayError("wechat")}),500)):"playing"===e.type&&clearTimeout(this._wechatTimer)),qv&&Dv&&"error"===e.type&&(clearTimeout(this._edgeTimer),this._edgeTimer=setTimeout((()=>{var e;0===(null===(e=this._audioDom)||void 0===e?void 0:e.currentTime)&&this._autoPlayError("edge")}),500)),this.emit("playback_event",o)})),Hu(this,"_internalPlay",(()=>{var e,t;if(vv(this.engineId,"audio _internalPlay",{paused:null===(e=this._audioDom)||void 0===e?void 0:e.paused,userId:this.userId,screen:this.isScreen}),null!==(t=this._audioDom)&&void 0!==t&&t.paused)try{var i;let e=this._audioDom.play();const t=wN.getAudioContextInstance();if("suspended"===t.state){const e=t.resume(),i=setTimeout((()=>{var e;"suspended"===t.state&&(this._autoPlayError("AudioContext cannot resume"),null===(e=this._monitor)||void 0===e||e.report("rtc_error",{message:"audio autoplay failed, userId: ".concat(this.userId,": Cannot resume the AudioContext - timeout"),error_code:rG.AUTOPLAY_FAILED}));clearTimeout(i)}));e.catch((e=>{var t;this._autoPlayError("AudioContext cannot resume"),null===(t=this._monitor)||void 0===t||t.report("rtc_error",{message:"audio autoplay failed, userId: ".concat(this.userId,": Cannot resume the AudioContext - rejected by: [").concat(null==e?void 0:e.name,"]").concat(null==e?void 0:e.message),error_code:rG.AUTOPLAY_FAILED})})).finally((()=>{clearTimeout(i)}))}null!==(i=e)&&void 0!==i&&i.then&&(eS&&qv&&1!==this._audioDom.volume&&(e=e.then((()=>new Promise((e=>{setTimeout((async()=>{var t;null===(t=this._audioDom)||void 0===t||t.pause(),this._audioDom.volume=1,await this._audioDom.play(),e()}),500)}))))),e.then((()=>{vv(this.engineId,"_internalPlay successfully",{userId:this.userId,screen:this.isScreen}),this._pasued=!1})).catch((e=>{var t;this._autoPlayError(e),null===(t=this._monitor)||void 0===t||t.report("rtc_error",{message:"audio autoplay failed, userId: ".concat(this.userId,": ").concat(e.message," ").concat(e.name),error_code:rG.AUTOPLAY_FAILED})})))}catch(s){var o;this._autoPlayError(s),null===(o=this._monitor)||void 0===o||o.report("rtc_error",{message:"audio autoplay failed, userId: ".concat(this.userId,": ").concat(s.message," ").concat(s.name),error_code:rG.AUTOPLAY_FAILED})}})),this.engineId=e,i){const e=document.getElementById(i);if(!e)throw new LS(RS.CANT_FIND_DOM,"can't find dom");this._containerDom=e}else this._containerDom=document.body;this.userId=t,this.muted=o,this.isScreen=s,this._monitor=mv(e),this.logger=new xv("Player",0,e),this._initAudio()}_initAudio(){this._audioDom||(this._audioDom=KN("audio",{style:{display:"none"},attributes:sM}),this._audioDom.volume=this.muted?0:1,this._audioDom.muted=this.muted,this._audioDom.id="".concat(this.userId,"_").concat(Kf()),this._containerDom.appendChild(this._audioDom)),this._initListeners()}_initListeners(){this._audioDom&&oM.forEach((e=>{var t;null===(t=this._audioDom)||void 0===t||t.addEventListener(e,this.emitAudioEvent)}))}_removeListeners(){this._audioDom&&(oM.forEach((e=>{var t;null===(t=this._audioDom)||void 0===t||t.removeEventListener(e,this.emitAudioEvent)})),this._audioDom.removeEventListener("canplay",this._internalPlay),this._audioDom.removeEventListener("loadeddata",this._internalPlay))}async playAudio(e){var t,i,o;this.logger.info("playAudio","play audio track: ".concat(this.userId));let s=this._audioDom;if(s&&s.srcObject instanceof MediaStream&&s.srcObject.getTrackById(null===(t=e.preprocessingTrack)||void 0===t?void 0:t.id))return;s||(this._initAudio(),s=this._audioDom);const r=new MediaStream;e instanceof lM?(this._fakeAudioDom=new Audio,this._fakeAudioDom.muted=!0,this._fakeAudioDom.srcObject=new MediaStream([e.originTrack]),r.addTrack(e.preprocessingTrack)):r.addTrack(e.preprocessingTrack),e.withWebAudio&&eS&&qv&&(this._audioDom.volume=0),s.srcObject=r,null===(i=s)||void 0===i||i.addEventListener("canplay",this._internalPlay),null===(o=s)||void 0===o||o.addEventListener("loadeddata",this._internalPlay),setTimeout((()=>this._internalPlay())),this.played=!0,this.hasStartPlaying=!1}_autoPlayError(e){var t,i;this._emitPlayFailed||(this._emitPlayFailed=!0,this.emit("playback_event",{type:"audio",rawEvent:e,readyState:(null===(t=this._audioDom)||void 0===t?void 0:t.readyState)||0,userId:this.userId,eventName:"autoplay-error",currentTime:(null===(i=this._audioDom)||void 0===i?void 0:i.currentTime)||0}))}pause(){if(!this._audioDom)throw new LS(RS.INVALID_PARAMS,"Player not found");this._pasued=!0,this._audioDom.pause(),this.hasStartPlaying=!1}manuallyPause(){return this.pause()}manuallyPlay(){var e;if(this.logger.info("Invoke AudioPlayer.manuallyPlay"),this._emitPlayFailed=!1,!this._audioDom)throw new LS(RS.INVALID_PARAMS,"Player not found");if(!this.played)return Promise.resolve();this._audioDom.volume=1,this._audioDom.muted=!1,null===(e=this._fakeAudioDom)||void 0===e||e.play();const t=[],i=this._audioDom.play();null!=i&&i.then&&t.push(i);const o=wN.getAudioContextInstance();if("suspended"===o.state){const e=o.resume();null!=e&&e.then&&t.push(e)}const s=t.length>0?Promise.all(t):Promise.resolve(i);return s.then((()=>{this._pasued=!1})),s}async setPlaybackDevice(e){this.logger.info("setPlaybackDevice","setPlaybackDevice: ".concat(e));(await HN.enumerateAudioPlaybackDevices()).map((e=>e.deviceId)).includes(e)&&this._audioDom&&this._audioDom.setSinkId&&await this._audioDom.setSinkId(e)}stop(){const{_containerDom:e}=this;this.logger.info("stopAudio","stop audio track: ".concat(this.userId)),this._audioDom&&(this._audioDom.srcObject=null,null!=e&&e.contains(this._audioDom)&&e.removeChild(this._audioDom)),this._fakeAudioDom&&(this._fakeAudioDom.srcObject=null,this._fakeAudioDom=void 0),this.played=!1,this.hasStartPlaying=!1}get domElement(){return this._audioDom}destroy(){this.logger.info("destroy","audio player: ".concat(this.userId)),this.stop(),super.removeAllListeners(),this._removeListeners(),this._audioDom&&(this._audioDom.srcObject=null,delete this._audioDom),this._edgeTimer&&clearTimeout(this._edgeTimer)}}class dM{constructor(){Hu(this,"_ac",void 0),Hu(this,"_sourceNode",void 0),Hu(this,"_gainNode",void 0),Hu(this,"_destNode",void 0),this._ac=wN.getAudioContextInstance(),this._gainNode=this._ac.createGain(),this._destNode=this._ac.createMediaStreamDestination(),this._gainNode.connect(this._destNode)}setVolume(e){this._gainNode.gain.value=e/100}getVolume(){return Math.round(100*this._gainNode.gain.value)}updateInputTrack(e){this._sourceNode&&(this._sourceNode.mediaStream.getTracks().forEach((e=>{e.stop()})),delete this._sourceNode);const t=new MediaStream;t.addTrack(e),this._sourceNode=this._ac.createMediaStreamSource(t),this._sourceNode.connect(this._gainNode)}getOutputTrack(){return this._destNode.stream.getTracks()[0]}destroy(){var e,t;null===(e=this._sourceNode)||void 0===e||e.mediaStream.getTracks().forEach((e=>{e.stop()})),13!==dS&&this._destNode.stream.getTracks().forEach((e=>{e.stop()})),null===(t=this._sourceNode)||void 0===t||t.disconnect(),this._gainNode.disconnect(),delete this._sourceNode}}class cM extends Kg{constructor(e,t,i){super(e,t,Ju(Ju({},i),{},{mediaType:Mg.AUDIO})),Hu(this,"audioCaptureConfig",void 0),Hu(this,"_ap",void 0),Hu(this,"mixedAudioTrack",void 0),Hu(this,"mixType",km.PLAYOUT_AND_PUBLISH),Hu(this,"_audioFetchMap",new Map),Hu(this,"_audioDataFetcher",void 0),Hu(this,"_localPlaybackTrack",void 0),Hu(this,"notSupportedWebAudio",!1)}get withWebAudio(){return!!this._ap}getAudioLevel(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:dm.MICROPHONE;const i=t===dm.AUDIOMIXING&&this.mixType!==km.PLAYOUT&&null!==(e=this.mixedAudioTrack)&&void 0!==e?e:this.preprocessingTrack;let o=this._audioFetchMap.get(t);var s;o&&o.currentTrackId===i.id||(null===(s=o)||void 0===s||s.destroy(),o=new MN(i),this._audioFetchMap.set(t,o));return o.getAudioLevel()}async updateAudioCaptureConfig(){this.audioCaptureConfig&&(this.logger.print("updateAudioCaptureConfig","update localAudioTrack: ",this.audioCaptureConfig),await this.originTrack.applyConstraints(this.audioCaptureConfig))}setVolume(e){const t=!WZ("SKIP_WEB_AUDIO_IN_TRACK")&&(lZ()||WZ("ENFORCE_WEB_AUDIO_SUPPORTED"));t||(this.notSupportedWebAudio=!0);const i=!this.withWebAudio&&100!==e;try{t&&i&&(this.logger.print("Create AudioProcess"),this._ap=new dM,this._ap.updateInputTrack(this.originTrack),this.mediaTrack=this._ap.getOutputTrack())}catch(s){this.logger.warn("WebAudio may not supported, quired return"),this.notSupportedWebAudio=!0}var o;this.notSupportedWebAudio||(null===(o=this._ap)||void 0===o||o.setVolume(e));t&&i&&this.emit("needReplaceTrack",this)}getVolume(){return this._ap?this._ap.getVolume():100}setUserId(e){this.trackInfo.streamUserId=e}setDataFetcher(e,t){this.logger.info("setDataFetcher","frameSize %s",e),null!==wN.isWorkletReady?this._audioDataFetcher?this._audioDataFetcher.setFrameSize(e):(this._audioDataFetcher=new YN(this.preprocessingTrack,e),this._audioDataFetcher.on("data",t)):this.logger.info("setDataFetcher","audioContextManager.isWorkletReady is null")}stopDataFetcher(){var e,t;null===(e=this._audioDataFetcher)||void 0===e||e.removeAllListeners("data"),null===(t=this._audioDataFetcher)||void 0===t||t.destroy(),this._audioDataFetcher=void 0}play(e){var t,i;this._localPlaybackTrack&&this.stop();const o=e===Wm.AFTER_CAPTURE?this.originTrack:e===Wm.AFTER_PROCESS?this.preprocessingTrack:void 0;if(!o)return void this.logger.error("play()","no target track for %s",e);this._localPlaybackTrack=new lM(this._ctx,o.clone(),Ju({},this.trackInfo));const s=this._ctx.earMonitorSettings[null!==(t=this.streamIndex)&&void 0!==t?t:em.STREAM_INDEX_MAIN].volume;this.setPlaybackVolume(s);const r=new aM(this._ctx.id,null!==(i=this.trackInfo.streamUserId)&&void 0!==i?i:"",{isScreen:this.streamIndex===em.STREAM_INDEX_SCREEN,muted:!1});return r.on("playback_event",(e=>{var t;"autoplay-error"===e.eventName&&this.emit("autoplay-error",{kind:"audio",streamIndex:null!==(t=this.streamIndex)&&void 0!==t?t:em.STREAM_INDEX_MAIN,mediaType:Mg.AUDIO})})),this._localPlaybackTrack.setPlayer(r),this._localPlaybackTrack.play()}stop(){var e;null===(e=this._localPlaybackTrack)||void 0===e||e.destroy(),this._localPlaybackTrack=void 0}setPlaybackVolume(e){var t;return null===(t=this._localPlaybackTrack)||void 0===t?void 0:t.setVolume(e)}destroy(){var e,t;this._audioFetchMap.forEach((e=>e.destroy())),this._audioFetchMap.clear(),null===(e=this._ap)||void 0===e||e.destroy(),null===(t=this._audioDataFetcher)||void 0===t||t.destroy(),this._audioDataFetcher=void 0,this.stop(),super.destroy()}}class lM extends Hg{constructor(e,t,i){super(e,t,Ju(Ju({},i),{},{mediaType:Mg.AUDIO})),Hu(this,"_ap",void 0),Hu(this,"_audioPlayer",void 0),Hu(this,"_audioLevelFetcher",void 0),Hu(this,"_audioDataFetcher",void 0),Hu(this,"notSupportedWebAudio",!1),Hu(this,"_sourceNode",void 0)}get withWebAudio(){return!!this._ap}getAudioLevel(){return this._audioLevelFetcher||(this._audioLevelFetcher=new MN(this.originTrack)),this._audioLevelFetcher.getAudioLevel()}setVolume(e){const t=!WZ("SKIP_WEB_AUDIO_IN_TRACK")&&(lZ()||WZ("ENFORCE_WEB_AUDIO_SUPPORTED"));t||(this.notSupportedWebAudio=!0);const i=!this.withWebAudio&&100!==e;try{t&&i&&(this.logger.print("Create AudioProcess"),this._ap=new dM,this._ap.updateInputTrack(this.originTrack),this.mediaTrack=this._ap.getOutputTrack())}catch(n){this.logger.warn("WebAudio may not supported, quite return"),this.notSupportedWebAudio=!0}if(this.notSupportedWebAudio){var o;const t=null===(o=this._audioPlayer)||void 0===o?void 0:o.domElement;t&&(t.volume=Math.min(e/100,1))}else{var s;null===(s=this._ap)||void 0===s||s.setVolume(e)}var r;t&&i&&(this.emit("needReplaceTrack",this),null===(r=this._audioPlayer)||void 0===r||r.playAudio(this))}getVolume(){var e,t;return this.notSupportedWebAudio?100*(null!==(e=null===(t=this._audioPlayer)||void 0===t||null===(t=t.domElement)||void 0===t?void 0:t.volume)&&void 0!==e?e:1):this._ap?this._ap.getVolume():100}setPlaybackDevice(e){var t;return null===(t=this._audioPlayer)||void 0===t?void 0:t.setPlaybackDevice(e)}setPlayer(e){this._audioPlayer=e,this._wechatAutoplayWorkaround(e)}havePlayer(){return!!this._audioPlayer}bindPlayerEvent(e){var t;this._audioPlayer&&e(this._audioPlayer,this.isPublic,null!==(t=this.streamIndex)&&void 0!==t?t:em.STREAM_INDEX_MAIN)}pause(){var e;return null===(e=this._audioPlayer)||void 0===e?void 0:e.pause()}play(){var e;return null===(e=this._audioPlayer)||void 0===e?void 0:e.playAudio(this)}manuallyPlay(){var e,t,i;return null!==(e=this._audioPlayer)&&void 0!==e&&e.played?null===(t=this._audioPlayer)||void 0===t?void 0:t.manuallyPlay():null===(i=this._audioPlayer)||void 0===i?void 0:i.playAudio(this)}manuallyPause(){var e;return null===(e=this._audioPlayer)||void 0===e?void 0:e.manuallyPause()}stop(){var e;return null===(e=this._audioPlayer)||void 0===e?void 0:e.stop()}setDataFetcher(e,t){this.logger.info("setDataFetcher","frameSize %s",e),null!==wN.isWorkletReady?this._audioDataFetcher?this._audioDataFetcher.setFrameSize(e):(this._audioDataFetcher=new YN(this.originTrack,e),this._audioDataFetcher.on("data",t)):this.logger.warn("setDataFetcher","audioContextManager.isWorkletReady is null")}stopDataFetcher(){var e;this.logger.info("stopDataFetcher"),null===(e=this._audioDataFetcher)||void 0===e||e.destroy(),this._audioDataFetcher=void 0}destroy(){var e,t,i;null===(e=this._audioLevelFetcher)||void 0===e||e.destroy(),null===(t=this._audioDataFetcher)||void 0===t||t.destroy(),this._audioDataFetcher=void 0,this._ap&&this._ap.destroy(),null===(i=this._audioPlayer)||void 0===i||i.destroy(),this._audioPlayer=void 0,super.destroy()}_wechatAutoplayWorkaround(e){Bv&&e.on("playback_event",(e=>{const t=wN.getAudioContextInstance();"autoplay-error"===e.eventName?t&&"running"===t.state&&(this._sourceNode||(this._sourceNode=t.createMediaStreamSource(new MediaStream([this.originTrack]))),this._sourceNode.connect(t.destination),vv(this._ctx.id,"wechatAutoplayWorkaround.connect",{userId:this.trackInfo.streamUserId,streamIndex:this.streamIndex,contextState:t.state,trackInfo:this.trackInfo})):"playing"===e.eventName&&this._sourceNode&&(this._sourceNode.disconnect(),this._sourceNode=void 0,vv(this._ctx.id,"wechatAutoplayWorkaround.disconnect",{userId:this.trackInfo.streamUserId,streamIndex:this.streamIndex,contextState:t.state,trackInfo:this.trackInfo}))}))}}const uM=new xv("VERTC",0);let mM,hM=null;function pM(){if(hM)return hM;try{hM=window.require("electron");const{ipcRenderer:e}=hM;return mM={getSources:t=>e.invoke("DESKTOP_CAPTURER_GET_SOURCES",t)},hM}catch(e){return null}}async function bM(e,t,i){let o;return t||(t={width:1920,height:1080,frameRate:15}),o=i?{audio:{mandatory:{chromeMediaSource:"desktop"}},video:{mandatory:{chromeMediaSource:"desktop",maxHeight:t.height,maxWidth:t.width,maxFrameRate:t.frameRate}}}:{audio:!1,video:{mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:e,maxHeight:t.height,maxWidth:t.width,maxFrameRate:t.frameRate}}},uM.info("getUserMediaConfig",JSON.stringify(o)),await navigator.mediaDevices.getUserMedia(o)}async function _M(e){let t=["window","screen"];"window"===e&&(t=["window"]),"screen"===e&&(t=["screen"]);if(!pM())throw new LS(RS.ERR_ELECTRON_IS_NULL,"Unable to get Electron object");let i=null;try{i=mM.getSources({types:t})}catch(o){i=null}i&&i.then||(i=new Promise(((e,i)=>{mM.getSources({types:t},((t,o)=>{t?i(t):e(o)}))})));try{return await i}catch(s){throw new LS(RS.ERR_ELECTRON_IS_NULL,s.toString())}}async function yM(e,t){const i=await _M(),o=await function(e){return new Promise(((t,i)=>{const o=document.createElement("div");o.innerText="share screen",o.setAttribute("style","text-align: center; height: 25px; line-height: 25px; border-radius: 4px 4px 0 0; background: #D4D2D4; border-bottom:  solid 1px #B9B8B9;");const s=document.createElement("div");s.setAttribute("style","width: 100%; height: 500px; padding: 15px 25px ; box-sizing: border-box;");const r=document.createElement("div");r.innerText="Web Screensharing wants to share the contents of your screen. Choose what you'd like to share.",r.setAttribute("style","height: 12%;");const n=document.createElement("div");n.setAttribute("style","width: 100%; height: 80%; background: #FFF; border:  solid 1px #CBCBCB; display: flex; flex-wrap: wrap; justify-content: space-around; overflow-y: scroll; padding: 0 15px; box-sizing: border-box;");const a=document.createElement("div");a.setAttribute("style","text-align: right; padding: 16px 0;");const d=document.createElement("button");d.innerHTML="cancel",d.setAttribute("style","width: 85px;"),d.onclick=()=>{document.body.removeChild(c);const e=new Error("NotAllowedError");e.name="NotAllowedError",i(e)},a.appendChild(d),s.appendChild(r),s.appendChild(n),s.appendChild(a);const c=document.createElement("div");c.setAttribute("style","position: fixed; z-index: 99999999; top: 50%; left: 50%; width: 620px; height: 525px; background: #ECECEC; border-radius: 4px; -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%);"),c.appendChild(o),c.appendChild(s),document.body.appendChild(c),e.map((e=>{if(e.id){const i=document.createElement("div");i.setAttribute("style","width: 30%; height: 160px; padding: 20px 0; text-align: center;box-sizing: content-box;"),i.innerHTML="<div style='height: 120px; display: table-cell; vertical-align: middle;'> \n          <img style='width: 100%; background: #333333; box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.2);' src=\n          ".concat(e.thumbnail.toDataURL(),"\n           />\n          </div>\n          <span style='\theight: 40px; line-height: 40px; display: inline-block; width: 70%; word-break: keep-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;'>\n          ").concat(e.name,"\n          </span>"),i.onclick=()=>{document.body.removeChild(c),t(e.id)},n.appendChild(i)}}))}))}(i);return await bM(o,e,t)}async function vM(e,t){var i;let o;const s=(null===(i=(t=t||e.videoProfile.getCaptureConfig()).deviceId)||void 0===i?void 0:i.exact)||"default",r=ap(),n=new xv("TrackFactory",0,e.id);try{var a,d,c;n.info("createCameraVideoTrack","constraints:",t),null===(a=e.monitor)||void 0===a||a.report("rtc_video_capture_event",{event_type:"start",media_device_id:s,capture_session_id:r});const i=Hf();wv&&(t.frameRate={ideal:30,max:30}),o=await HN.getUserMedia({video:t}),null===(d=e.monitor)||void 0===d||d.report("rtc_video_capture_event",{event_type:"start_capture_result",media_device_id:s,media_device_name:(null===(c=o.getVideoTracks()[0])||void 0===c?void 0:c.label)||"",reason:"success",elapse:Hf()-i,capture_session_id:r})}catch(oK){var l;throw null===(l=e.monitor)||void 0===l||l.report("rtc_video_capture_event",{event_type:"running_failed",media_device_id:s,error_code:oK.code,reason:oK.name+oK.message,capture_session_id:r}),new LS(RS.GET_VIDEO_TRACK_FAILED,"throw error from getUserMedia. [".concat(oK.name||"unknown name","]: ").concat(oK.message||"unknown message","."),oK)}const u=o.getVideoTracks()[0],m=new DN(e,u,{streamIndex:Yg.MAIN,sourceType:Ng.INTERNAL,captureSessionId:r});return await m.isTrackReady,m}async function SM(e,t){var i;let o;new xv("TrackFactory",0,e.id).info("createMicrophoneAudioTrack","constraints:",t);const s=(null===(i=t.deviceId)||void 0===i?void 0:i.exact)||"default",r=ap();try{var n,a,d;null===(n=e.monitor)||void 0===n||n.report("rtc_audio_device_event",{device_type:"audio_record",event_type:"start_begin",media_device_id:s,event_session_id:r});const i=Hf();e.extensionManager.getPluginByName(yN.PRE_PROCESSING,"RTCAIAnsExtension")&&(t.autoGainControl=!0,t.noiseSuppression=!1),o=await HN.getUserMedia({audio:t}),null===(a=e.monitor)||void 0===a||a.report("rtc_audio_device_event",{device_type:"audio_record",event_type:"start_result",media_device_id:s,media_device_name:(null===(d=o.getAudioTracks()[0])||void 0===d?void 0:d.label)||"",reason:"success",elapse:Hf()-i,event_session_id:r})}catch(oK){var c;throw null===(c=e.monitor)||void 0===c||c.report("rtc_audio_device_event",{device_type:"audio_record",event_type:"start_end",media_device_id:s,error_code:oK.code,reason:oK.name+oK.message,event_session_id:r}),new LS(RS.GET_AUDIO_TRACK_FAILED,"throw error from getUserMedia. [".concat(oK.name||"unknown name","]: ").concat(oK.message||"unknown message","."),oK)}const l=o.getAudioTracks()[0],u=new cM(e,l,{streamIndex:Yg.MAIN,sourceType:Ng.INTERNAL,captureSessionId:r});return await u.isTrackReady,u}async function ZM(e,t){const i=new xv("TrackFactory",0,e.id);let o,s=e.videoProfile.getScreenEncodeConfig();i.info("createScreenTracks","screenConfig: %o, constraints: %o",t,s);const r=ap(),{enableAudio:n=!1,displaySurface:a,systemAudio:d,surfaceSwitching:c,selfBrowserSurface:l,sourceId:u}=t,m={};a&&["monitor","browser","window"].includes(a)&&(s?s.displaySurface=a:s={displaySurface:a}),d&&["include","exclude"].includes(d)&&(m.systemAudio=d),c&&["include","exclude"].includes(c)&&(m.surfaceSwitching=c),l&&["include","exclude"].includes(l)&&(m.selfBrowserSurface=l);try{var h,p,b,_;null===(h=e.monitor)||void 0===h||h.report("rtc_video_capture_event",{event_type:"start",media_device_id:"screen",capture_session_id:r});const t=Hf();o=pM()?u?await bM(u,s,n):await yM(s,n):await navigator.mediaDevices.getDisplayMedia(Ju({video:!(!s||vZ)||s,audio:!!n&&{channelCount:2,noiseSuppression:!1,echoCancellation:!0,autoGainControl:!1}},m)),null===(p=e.monitor)||void 0===p||p.report("rtc_video_capture_event",{event_type:"start_capture_result",media_device_id:"screen",media_device_name:"".concat((null===(b=o.getVideoTracks()[0])||void 0===b?void 0:b.label)||"",", ").concat((null===(_=o.getAudioTracks()[0])||void 0===_?void 0:_.label)||""),reason:"success",elapse:Hf()-t,capture_session_id:r})}catch(oK){var y;throw null===(y=e.monitor)||void 0===y||y.report("rtc_video_capture_event",{event_type:"running_failed",media_device_id:"screen",error_code:oK.code,reason:oK.name+oK.message,capture_session_id:r}),new LS(RS.GET_SCREEN_TRACK_FAILED,"throw error from getDisplayMedia",oK)}const v=o.getVideoTracks()[0],S=new DN(e,v,{streamIndex:Yg.SCREEN,sourceType:Ng.INTERNAL,captureSessionId:r}),Z=o.getAudioTracks()[0];if(o.getAudioTracks().length){const t=new cM(e,Z,{streamIndex:Yg.SCREEN,sourceType:Ng.INTERNAL,captureSessionId:r});return await Promise.all([S.isTrackReady,t.isTrackReady]),[S,t]}return await S.isTrackReady,[S,void 0]}function fM(e,t,i){return new lM(e,t,Ju({},i))}const TM="IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWZ1bmN0aW9uIHIodCl7aWYodC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXQuZGVmYXVsdDtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSl7dmFyIHI9ZnVuY3Rpb24gdCgpe2lmKHRoaXMgaW5zdGFuY2VvZiB0KXt2YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGFyZ3VtZW50cyksbmV3KEZ1bmN0aW9uLmJpbmQuYXBwbHkoZSxyKSl9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZX1lbHNlIHI9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsZSxuLmdldD9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W2VdfX0pfSkpLHJ9dmFyIG49e2V4cG9ydHM6e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09PU1hdGgmJnR9LG89aSgib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxpKCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxpKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGkoIm9iamVjdCI9PXR5cGVvZiB0JiZ0KXx8aSgib2JqZWN0Ij09dHlwZW9mIHQmJnQpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKGUpe3JldHVybiEwfX0sYT0hcygoZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbigpe30uYmluZCgpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0Lmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKX0pKSxjPWEsdT1GdW5jdGlvbi5wcm90b3R5cGUsbD11LmFwcGx5LGg9dS5jYWxsLGY9Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmFwcGx5fHwoYz9oLmJpbmQobCk6ZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseShsLGFyZ3VtZW50cyl9KSxkPWEscD1GdW5jdGlvbi5wcm90b3R5cGUsXz1wLmNhbGwsZz1kJiZwLmJpbmQuYmluZChfLF8pLG09ZD9nOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBfLmFwcGx5KHQsYXJndW1lbnRzKX19LHk9bSx2PXkoe30udG9TdHJpbmcpLGI9eSgiIi5zbGljZSksdz1mdW5jdGlvbih0KXtyZXR1cm4gYih2KHQpLDgsLTEpfSxTPXcsaz1tLE89ZnVuY3Rpb24odCl7aWYoIkZ1bmN0aW9uIj09PVModCkpcmV0dXJuIGsodCl9LEU9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsLHg9dm9pZCAwPT09RSYmdm9pZCAwIT09RT9mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdHx8dD09PUV9OmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fSxBPXt9LEM9IXMoKGZ1bmN0aW9uKCl7cmV0dXJuIDchPT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSksVD1hLEk9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsTD1UP0kuYmluZChJKTpmdW5jdGlvbigpe3JldHVybiBJLmFwcGx5KEksYXJndW1lbnRzKX0sQj17fSxSPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLE49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcix6PU4mJiFSLmNhbGwoezE6Mn0sMSk7Qi5mPXo/ZnVuY3Rpb24odCl7dmFyIGU9Tih0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpSO3ZhciBELFAsTT1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX0sRj1zLGo9dyxVPU9iamVjdCxIPW0oIiIuc3BsaXQpLEo9RigoZnVuY3Rpb24oKXtyZXR1cm4hVSgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVybiJTdHJpbmciPT09aih0KT9IKHQsIiIpOlUodCl9OlUsSz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0sVz1LLFo9VHlwZUVycm9yLEc9ZnVuY3Rpb24odCl7aWYoVyh0KSl0aHJvdyBuZXcgWigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH0sVj1KLFg9RyxZPWZ1bmN0aW9uKHQpe3JldHVybiBWKFgodCkpfSwkPXgscT1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6JCh0KX0sUT17fSx0dD1RLGV0PW8scnQ9eCxudD1mdW5jdGlvbih0KXtyZXR1cm4gcnQodCk/dDp2b2lkIDB9LGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9udCh0dFt0XSl8fG50KGV0W3RdKTp0dFt0XSYmdHRbdF1bZV18fGV0W3RdJiZldFt0XVtlXX0sb3Q9bSh7fS5pc1Byb3RvdHlwZU9mKSxzdD1vLm5hdmlnYXRvcixhdD1zdCYmc3QudXNlckFnZW50LGN0PW8sdXQ9YXQ/U3RyaW5nKGF0KToiIixsdD1jdC5wcm9jZXNzLGh0PWN0LkRlbm8sZnQ9bHQmJmx0LnZlcnNpb25zfHxodCYmaHQudmVyc2lvbixkdD1mdCYmZnQudjg7ZHQmJihQPShEPWR0LnNwbGl0KCIuIikpWzBdPjAmJkRbMF08ND8xOisoRFswXStEWzFdKSksIVAmJnV0JiYoIShEPXV0Lm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8RFsxXT49NzQpJiYoRD11dC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKFA9K0RbMV0pO3ZhciBwdD1QLF90PXB0LGd0PXMsbXQ9by5TdHJpbmcseXQ9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhZ3QoKGZ1bmN0aW9uKCl7dmFyIHQ9U3ltYm9sKCJzeW1ib2wgZGV0ZWN0aW9uIik7cmV0dXJuIW10KHQpfHwhKE9iamVjdCh0KWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZfdCYmX3Q8NDF9KSksdnQ9eXQmJiFTeW1ib2wuc2hhbSYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IsYnQ9aXQsd3Q9eCxTdD1vdCxrdD1PYmplY3QsT3Q9dnQ/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXt2YXIgZT1idCgiU3ltYm9sIik7cmV0dXJuIHd0KGUpJiZTdChlLnByb3RvdHlwZSxrdCh0KSl9LEV0PVN0cmluZyx4dD1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIEV0KHQpfWNhdGNoKGUpe3JldHVybiJPYmplY3QifX0sQXQ9eCxDdD14dCxUdD1UeXBlRXJyb3IsSXQ9ZnVuY3Rpb24odCl7aWYoQXQodCkpcmV0dXJuIHQ7dGhyb3cgbmV3IFR0KEN0KHQpKyIgaXMgbm90IGEgZnVuY3Rpb24iKX0sTHQ9SXQsQnQ9SyxSdD1MLE50PXgsenQ9cSxEdD1UeXBlRXJyb3IsUHQ9e2V4cG9ydHM6e319LE10PW8sRnQ9T2JqZWN0LmRlZmluZVByb3BlcnR5LGp0PW8sVXQ9ZnVuY3Rpb24odCxlKXt0cnl7RnQoTXQsdCx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KX1jYXRjaChyKXtNdFt0XT1lfXJldHVybiBlfSxIdD0iX19jb3JlLWpzX3NoYXJlZF9fIixKdD1QdC5leHBvcnRzPWp0W0h0XXx8VXQoSHQse30pOyhKdC52ZXJzaW9uc3x8KEp0LnZlcnNpb25zPVtdKSkucHVzaCh7dmVyc2lvbjoiMy4zOS4wIixtb2RlOiJwdXJlIixjb3B5cmlnaHQ6IsKpIDIwMTQtMjAyNCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSIsbGljZW5zZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zOS4wL0xJQ0VOU0UiLHNvdXJjZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMifSk7dmFyIEt0PVB0LmV4cG9ydHMsV3Q9S3QsWnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gV3RbdF18fChXdFt0XT1lfHx7fSl9LEd0PUcsVnQ9T2JqZWN0LFh0PWZ1bmN0aW9uKHQpe3JldHVybiBWdChHdCh0KSl9LFl0PVh0LCR0PW0oe30uaGFzT3duUHJvcGVydHkpLHF0PU9iamVjdC5oYXNPd258fGZ1bmN0aW9uKHQsZSl7cmV0dXJuICR0KFl0KHQpLGUpfSxRdD1tLHRlPTAsZWU9TWF0aC5yYW5kb20oKSxyZT1RdCgxLi50b1N0cmluZyksbmU9ZnVuY3Rpb24odCl7cmV0dXJuIlN5bWJvbCgiKyh2b2lkIDA9PT10PyIiOnQpKyIpXyIrcmUoKyt0ZStlZSwzNil9LGllPVp0LG9lPXF0LHNlPW5lLGFlPXl0LGNlPXZ0LHVlPW8uU3ltYm9sLGxlPWllKCJ3a3MiKSxoZT1jZT91ZS5mb3J8fHVlOnVlJiZ1ZS53aXRob3V0U2V0dGVyfHxzZSxmZT1mdW5jdGlvbih0KXtyZXR1cm4gb2UobGUsdCl8fChsZVt0XT1hZSYmb2UodWUsdCk/dWVbdF06aGUoIlN5bWJvbC4iK3QpKSxsZVt0XX0sZGU9TCxwZT1xLF9lPU90LGdlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFtlXTtyZXR1cm4gQnQocik/dm9pZCAwOkx0KHIpfSxtZT1mdW5jdGlvbih0LGUpe3ZhciByLG47aWYoInN0cmluZyI9PT1lJiZOdChyPXQudG9TdHJpbmcpJiYhenQobj1SdChyLHQpKSlyZXR1cm4gbjtpZihOdChyPXQudmFsdWVPZikmJiF6dChuPVJ0KHIsdCkpKXJldHVybiBuO2lmKCJzdHJpbmciIT09ZSYmTnQocj10LnRvU3RyaW5nKSYmIXp0KG49UnQocix0KSkpcmV0dXJuIG47dGhyb3cgbmV3IER0KCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX0seWU9VHlwZUVycm9yLHZlPWZlKCJ0b1ByaW1pdGl2ZSIpLGJlPWZ1bmN0aW9uKHQsZSl7aWYoIXBlKHQpfHxfZSh0KSlyZXR1cm4gdDt2YXIgcixuPWdlKHQsdmUpO2lmKG4pe2lmKHZvaWQgMD09PWUmJihlPSJkZWZhdWx0Iikscj1kZShuLHQsZSksIXBlKHIpfHxfZShyKSlyZXR1cm4gcjt0aHJvdyBuZXcgeWUoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT1lJiYoZT0ibnVtYmVyIiksbWUodCxlKX0sd2U9T3QsU2U9ZnVuY3Rpb24odCl7dmFyIGU9YmUodCwic3RyaW5nIik7cmV0dXJuIHdlKGUpP2U6ZSsiIn0sa2U9cSxPZT1vLmRvY3VtZW50LEVlPWtlKE9lKSYma2UoT2UuY3JlYXRlRWxlbWVudCkseGU9ZnVuY3Rpb24odCl7cmV0dXJuIEVlP09lLmNyZWF0ZUVsZW1lbnQodCk6e319LEFlPXhlLENlPSFDJiYhcygoZnVuY3Rpb24oKXtyZXR1cm4gNyE9PU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBZSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpLFRlPUMsSWU9TCxMZT1CLEJlPU0sUmU9WSxOZT1TZSx6ZT1xdCxEZT1DZSxQZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO0EuZj1UZT9QZTpmdW5jdGlvbih0LGUpe2lmKHQ9UmUodCksZT1OZShlKSxEZSl0cnl7cmV0dXJuIFBlKHQsZSl9Y2F0Y2gocil7fWlmKHplKHQsZSkpcmV0dXJuIEJlKCFJZShMZS5mLHQsZSksdFtlXSl9O3ZhciBNZT1zLEZlPXgsamU9LyN8XC5wcm90b3R5cGVcLi8sVWU9ZnVuY3Rpb24odCxlKXt2YXIgcj1KZVtIZSh0KV07cmV0dXJuIHI9PT1XZXx8ciE9PUtlJiYoRmUoZSk/TWUoZSk6ISFlKX0sSGU9VWUubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCkucmVwbGFjZShqZSwiLiIpLnRvTG93ZXJDYXNlKCl9LEplPVVlLmRhdGE9e30sS2U9VWUuTkFUSVZFPSJOIixXZT1VZS5QT0xZRklMTD0iUCIsWmU9VWUsR2U9SXQsVmU9YSxYZT1PKE8uYmluZCksWWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gR2UodCksdm9pZCAwPT09ZT90OlZlP1hlKHQsZSk6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fSwkZT17fSxxZT1DJiZzKChmdW5jdGlvbigpe3JldHVybiA0MiE9PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSgoZnVuY3Rpb24oKXt9KSwicHJvdG90eXBlIix7dmFsdWU6NDIsd3JpdGFibGU6ITF9KS5wcm90b3R5cGV9KSksUWU9cSx0cj1TdHJpbmcsZXI9VHlwZUVycm9yLHJyPWZ1bmN0aW9uKHQpe2lmKFFlKHQpKXJldHVybiB0O3Rocm93IG5ldyBlcih0cih0KSsiIGlzIG5vdCBhbiBvYmplY3QiKX0sbnI9Qyxpcj1DZSxvcj1xZSxzcj1ycixhcj1TZSxjcj1UeXBlRXJyb3IsdXI9T2JqZWN0LmRlZmluZVByb3BlcnR5LGxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaHI9ImVudW1lcmFibGUiLGZyPSJjb25maWd1cmFibGUiLGRyPSJ3cml0YWJsZSI7JGUuZj1ucj9vcj9mdW5jdGlvbih0LGUscil7aWYoc3IodCksZT1hcihlKSxzcihyKSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmInByb3RvdHlwZSI9PT1lJiYidmFsdWUiaW4gciYmZHIgaW4gciYmIXJbZHJdKXt2YXIgbj1scih0LGUpO24mJm5bZHJdJiYodFtlXT1yLnZhbHVlLHI9e2NvbmZpZ3VyYWJsZTpmciBpbiByP3JbZnJdOm5bZnJdLGVudW1lcmFibGU6aHIgaW4gcj9yW2hyXTpuW2hyXSx3cml0YWJsZTohMX0pfXJldHVybiB1cih0LGUscil9OnVyOmZ1bmN0aW9uKHQsZSxyKXtpZihzcih0KSxlPWFyKGUpLHNyKHIpLGlyKXRyeXtyZXR1cm4gdXIodCxlLHIpfWNhdGNoKG4pe31pZigiZ2V0ImluIHJ8fCJzZXQiaW4gcil0aHJvdyBuZXcgY3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHImJih0W2VdPXIudmFsdWUpLHR9O3ZhciBwcj0kZSxfcj1NLGdyPUM/ZnVuY3Rpb24odCxlLHIpe3JldHVybiBwci5mKHQsZSxfcigxLHIpKX06ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0W2VdPXIsdH0sbXI9byx5cj1mLHZyPU8sYnI9eCx3cj1BLmYsU3I9WmUsa3I9USxPcj1ZZSxFcj1ncix4cj1xdCxBcj1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihyLG4saSl7aWYodGhpcyBpbnN0YW5jZW9mIGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQocik7Y2FzZSAyOnJldHVybiBuZXcgdChyLG4pfXJldHVybiBuZXcgdChyLG4saSl9cmV0dXJuIHlyKHQsdGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gZS5wcm90b3R5cGU9dC5wcm90b3R5cGUsZX0sQ3I9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYyx1LGwsaD10LnRhcmdldCxmPXQuZ2xvYmFsLGQ9dC5zdGF0LHA9dC5wcm90byxfPWY/bXI6ZD9tcltoXTptcltoXSYmbXJbaF0ucHJvdG90eXBlLGc9Zj9rcjprcltoXXx8RXIoa3IsaCx7fSlbaF0sbT1nLnByb3RvdHlwZTtmb3IobyBpbiBlKW49IShyPVNyKGY/bzpoKyhkPyIuIjoiIyIpK28sdC5mb3JjZWQpKSYmXyYmeHIoXyxvKSxhPWdbb10sbiYmKGM9dC5kb250Q2FsbEdldFNldD8obD13cihfLG8pKSYmbC52YWx1ZTpfW29dKSxzPW4mJmM/YzplW29dLChyfHxwfHx0eXBlb2YgYSE9dHlwZW9mIHMpJiYodT10LmJpbmQmJm4/T3Iocyxtcik6dC53cmFwJiZuP0FyKHMpOnAmJmJyKHMpP3ZyKHMpOnMsKHQuc2hhbXx8cyYmcy5zaGFtfHxhJiZhLnNoYW0pJiZFcih1LCJzaGFtIiwhMCksRXIoZyxvLHUpLHAmJih4cihrcixpPWgrIlByb3RvdHlwZSIpfHxFcihrcixpLHt9KSxFcihrcltpXSxvLHMpLHQucmVhbCYmbSYmKHJ8fCFtW29dKSYmRXIobSxvLHMpKSl9LFRyPUNyLElyPUMsTHI9JGUuZjtUcih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSE9PUxyLHNoYW06IUlyfSx7ZGVmaW5lUHJvcGVydHk6THJ9KTt2YXIgQnI9US5PYmplY3QsUnI9bi5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQnIuZGVmaW5lUHJvcGVydHkodCxlLHIpfTtCci5kZWZpbmVQcm9wZXJ0eS5zaGFtJiYoUnIuc2hhbT0hMCk7dmFyIE5yPWUobi5leHBvcnRzKSx6cj13LERyPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJBcnJheSI9PT16cih0KX0sUHI9TWF0aC5jZWlsLE1yPU1hdGguZmxvb3IsRnI9TWF0aC50cnVuY3x8ZnVuY3Rpb24odCl7dmFyIGU9K3Q7cmV0dXJuKGU+MD9NcjpQcikoZSl9LGpyPWZ1bmN0aW9uKHQpe3ZhciBlPSt0O3JldHVybiBlIT1lfHwwPT09ZT8wOkZyKGUpfSxVcj1qcixIcj1NYXRoLm1pbixKcj1mdW5jdGlvbih0KXt2YXIgZT1Vcih0KTtyZXR1cm4gZT4wP0hyKGUsOTAwNzE5OTI1NDc0MDk5MSk6MH0sS3I9ZnVuY3Rpb24odCl7cmV0dXJuIEpyKHQubGVuZ3RoKX0sV3I9VHlwZUVycm9yLFpyPWZ1bmN0aW9uKHQpe2lmKHQ+OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBXcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7cmV0dXJuIHR9LEdyPUMsVnI9JGUsWHI9TSxZcj1mdW5jdGlvbih0LGUscil7R3I/VnIuZih0LGUsWHIoMCxyKSk6dFtlXT1yfSwkcj17fTskcltmZSgidG9TdHJpbmdUYWciKV09InoiO3ZhciBxcj0iW29iamVjdCB6XSI9PT1TdHJpbmcoJHIpLFFyPXFyLHRuPXgsZW49dyxybj1mZSgidG9TdHJpbmdUYWciKSxubj1PYmplY3Qsb249IkFyZ3VtZW50cyI9PT1lbihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLHNuPVFyP2VuOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihyPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHIpe319KGU9bm4odCkscm4pKT9yOm9uP2VuKGUpOiJPYmplY3QiPT09KG49ZW4oZSkpJiZ0bihlLmNhbGxlZSk/IkFyZ3VtZW50cyI6bn0sYW49eCxjbj1LdCx1bj1tKEZ1bmN0aW9uLnRvU3RyaW5nKTthbihjbi5pbnNwZWN0U291cmNlKXx8KGNuLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHVuKHQpfSk7dmFyIGxuPWNuLmluc3BlY3RTb3VyY2UsaG49bSxmbj1zLGRuPXgscG49c24sX249bG4sZ249ZnVuY3Rpb24oKXt9LG1uPWl0KCJSZWZsZWN0IiwiY29uc3RydWN0IikseW49L15ccyooPzpjbGFzc3xmdW5jdGlvbilcYi8sdm49aG4oeW4uZXhlYyksYm49IXluLnRlc3QoZ24pLHduPWZ1bmN0aW9uKHQpe2lmKCFkbih0KSlyZXR1cm4hMTt0cnl7cmV0dXJuIG1uKGduLFtdLHQpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sU249ZnVuY3Rpb24odCl7aWYoIWRuKHQpKXJldHVybiExO3N3aXRjaChwbih0KSl7Y2FzZSJBc3luY0Z1bmN0aW9uIjpjYXNlIkdlbmVyYXRvckZ1bmN0aW9uIjpjYXNlIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iOnJldHVybiExfXRyeXtyZXR1cm4gYm58fCEhdm4oeW4sX24odCkpfWNhdGNoKGUpe3JldHVybiEwfX07U24uc2hhbT0hMDt2YXIga249IW1ufHxmbigoZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gd24od24uY2FsbCl8fCF3bihPYmplY3QpfHwhd24oKGZ1bmN0aW9uKCl7dD0hMH0pKXx8dH0pKT9Tbjp3bixPbj1EcixFbj1rbix4bj1xLEFuPWZlKCJzcGVjaWVzIiksQ249QXJyYXksVG49ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIE9uKHQpJiYoZT10LmNvbnN0cnVjdG9yLChFbihlKSYmKGU9PT1Dbnx8T24oZS5wcm90b3R5cGUpKXx8eG4oZSkmJm51bGw9PT0oZT1lW0FuXSkpJiYoZT12b2lkIDApKSx2b2lkIDA9PT1lP0NuOmV9LEluPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyhUbih0KSkoMD09PWU/MDplKX0sTG49cyxCbj1wdCxSbj1mZSgic3BlY2llcyIpLE5uPWZ1bmN0aW9uKHQpe3JldHVybiBCbj49NTF8fCFMbigoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4oZS5jb25zdHJ1Y3Rvcj17fSlbUm5dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSkpfSx6bj1DcixEbj1zLFBuPURyLE1uPXEsRm49WHQsam49S3IsVW49WnIsSG49WXIsSm49SW4sS249Tm4sV249cHQsWm49ZmUoImlzQ29uY2F0U3ByZWFkYWJsZSIpLEduPVduPj01MXx8IURuKChmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0W1puXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pKSxWbj1mdW5jdGlvbih0KXtpZighTW4odCkpcmV0dXJuITE7dmFyIGU9dFtabl07cmV0dXJuIHZvaWQgMCE9PWU/ISFlOlBuKHQpfTt6bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsYXJpdHk6MSxmb3JjZWQ6IUdufHwhS24oImNvbmNhdCIpfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8scz1Gbih0aGlzKSxhPUpuKHMsMCksYz0wO2ZvcihlPS0xLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKWlmKFZuKG89LTE9PT1lP3M6YXJndW1lbnRzW2VdKSlmb3IoaT1qbihvKSxVbihjK2kpLHI9MDtyPGk7cisrLGMrKylyIGluIG8mJkhuKGEsYyxvW3JdKTtlbHNlIFVuKGMrMSksSG4oYSxjKyssbyk7cmV0dXJuIGEubGVuZ3RoPWMsYX19KTt2YXIgWG49c24sWW49U3RyaW5nLCRuPWZ1bmN0aW9uKHQpe2lmKCJTeW1ib2wiPT09WG4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmciKTtyZXR1cm4gWW4odCl9LHFuPXt9LFFuPWpyLHRpPU1hdGgubWF4LGVpPU1hdGgubWluLHJpPVksbmk9ZnVuY3Rpb24odCxlKXt2YXIgcj1Rbih0KTtyZXR1cm4gcjwwP3RpKHIrZSwwKTplaShyLGUpfSxpaT1LcixvaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3ZhciBpPXJpKGUpLG89aWkoaSk7aWYoMD09PW8pcmV0dXJuIXQmJi0xO3ZhciBzLGE9bmkobixvKTtpZih0JiZyIT1yKXtmb3IoO28+YTspaWYoKHM9aVthKytdKSE9cylyZXR1cm4hMH1lbHNlIGZvcig7bz5hO2ErKylpZigodHx8YSBpbiBpKSYmaVthXT09PXIpcmV0dXJuIHR8fGF8fDA7cmV0dXJuIXQmJi0xfX0sc2k9e2luY2x1ZGVzOm9pKCEwKSxpbmRleE9mOm9pKCExKX0sYWk9e30sY2k9cXQsdWk9WSxsaT1zaS5pbmRleE9mLGhpPWFpLGZpPW0oW10ucHVzaCksZGk9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXVpKHQpLGk9MCxvPVtdO2ZvcihyIGluIG4pIWNpKGhpLHIpJiZjaShuLHIpJiZmaShvLHIpO2Zvcig7ZS5sZW5ndGg+aTspY2kobixyPWVbaSsrXSkmJih+bGkobyxyKXx8ZmkobyxyKSk7cmV0dXJuIG99LHBpPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl0sX2k9ZGksZ2k9cGksbWk9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiBfaSh0LGdpKX0seWk9Qyx2aT1xZSxiaT0kZSx3aT1ycixTaT1ZLGtpPW1pO3FuLmY9eWkmJiF2aT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe3dpKHQpO2Zvcih2YXIgcixuPVNpKGUpLGk9a2koZSksbz1pLmxlbmd0aCxzPTA7bz5zOyliaS5mKHQscj1pW3MrK10sbltyXSk7cmV0dXJuIHR9O3ZhciBPaSxFaT1pdCgiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiKSx4aT1uZSxBaT1adCgia2V5cyIpLENpPWZ1bmN0aW9uKHQpe3JldHVybiBBaVt0XXx8KEFpW3RdPXhpKHQpKX0sVGk9cnIsSWk9cW4sTGk9cGksQmk9YWksUmk9RWksTmk9eGUsemk9InByb3RvdHlwZSIsRGk9InNjcmlwdCIsUGk9Q2koIklFX1BST1RPIiksTWk9ZnVuY3Rpb24oKXt9LEZpPWZ1bmN0aW9uKHQpe3JldHVybiI8IitEaSsiPiIrdCsiPC8iK0RpKyI+In0samk9ZnVuY3Rpb24odCl7dC53cml0ZShGaSgiIikpLHQuY2xvc2UoKTt2YXIgZT10LnBhcmVudFdpbmRvdy5PYmplY3Q7cmV0dXJuIHQ9bnVsbCxlfSxVaT1mdW5jdGlvbigpe3RyeXtPaT1uZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaChpKXt9dmFyIHQsZSxyO1VpPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQuZG9tYWluJiZPaT9qaShPaSk6KGU9TmkoImlmcmFtZSIpLHI9ImphdmEiK0RpKyI6IixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFJpLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZyhyKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKEZpKCJkb2N1bWVudC5GPU9iamVjdCIpKSx0LmNsb3NlKCksdC5GKTpqaShPaSk7Zm9yKHZhciBuPUxpLmxlbmd0aDtuLS07KWRlbGV0ZSBVaVt6aV1bTGlbbl1dO3JldHVybiBVaSgpfTtCaVtQaV09ITA7dmFyIEhpPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIG51bGwhPT10PyhNaVt6aV09VGkodCkscj1uZXcgTWksTWlbemldPW51bGwscltQaV09dCk6cj1VaSgpLHZvaWQgMD09PWU/cjpJaS5mKHIsZSl9LEppPXt9LEtpPWRpLFdpPXBpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7SmkuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIEtpKHQsV2kpfTt2YXIgWmk9e30sR2k9bShbXS5zbGljZSksVmk9dyxYaT1ZLFlpPUppLmYsJGk9R2kscWk9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTtaaS5mPWZ1bmN0aW9uKHQpe3JldHVybiBxaSYmIldpbmRvdyI9PT1WaSh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIFlpKHQpfWNhdGNoKGUpe3JldHVybiAkaShxaSl9fSh0KTpZaShYaSh0KSl9O3ZhciBRaT17fTtRaS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIHRvPWdyLGVvPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBuJiZuLmVudW1lcmFibGU/dFtlXT1yOnRvKHQsZSxyKSx0fSxybz0kZSxubz17fSxpbz1mZTtuby5mPWlvO3ZhciBvbyxzbyxhbyxjbz1RLHVvPXF0LGxvPW5vLGhvPSRlLmYsZm89ZnVuY3Rpb24odCl7dmFyIGU9Y28uU3ltYm9sfHwoY28uU3ltYm9sPXt9KTt1byhlLHQpfHxobyhlLHQse3ZhbHVlOmxvLmYodCl9KX0scG89TCxfbz1pdCxnbz1mZSxtbz1lbyx5bz1mdW5jdGlvbigpe3ZhciB0PV9vKCJTeW1ib2wiKSxlPXQmJnQucHJvdG90eXBlLHI9ZSYmZS52YWx1ZU9mLG49Z28oInRvUHJpbWl0aXZlIik7ZSYmIWVbbl0mJm1vKGUsbiwoZnVuY3Rpb24odCl7cmV0dXJuIHBvKHIsdGhpcyl9KSx7YXJpdHk6MX0pfSx2bz1zbixibz1xcj97fS50b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrdm8odGhpcykrIl0ifSx3bz1xcixTbz0kZS5mLGtvPWdyLE9vPXF0LEVvPWJvLHhvPWZlKCJ0b1N0cmluZ1RhZyIpLEFvPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXI/dDp0JiZ0LnByb3RvdHlwZTtpJiYoT28oaSx4byl8fFNvKGkseG8se2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTplfSksbiYmIXdvJiZrbyhpLCJ0b1N0cmluZyIsRW8pKX0sQ289eCxUbz1vLldlYWtNYXAsSW89Q28oVG8pJiYvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKFRvKSksTG89byxCbz1xLFJvPWdyLE5vPXF0LHpvPUt0LERvPUNpLFBvPWFpLE1vPSJPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCIsRm89TG8uVHlwZUVycm9yLGpvPUxvLldlYWtNYXA7aWYoSW98fHpvLnN0YXRlKXt2YXIgVW89em8uc3RhdGV8fCh6by5zdGF0ZT1uZXcgam8pO1VvLmdldD1Vby5nZXQsVW8uaGFzPVVvLmhhcyxVby5zZXQ9VW8uc2V0LG9vPWZ1bmN0aW9uKHQsZSl7aWYoVW8uaGFzKHQpKXRocm93IG5ldyBGbyhNbyk7cmV0dXJuIGUuZmFjYWRlPXQsVW8uc2V0KHQsZSksZX0sc289ZnVuY3Rpb24odCl7cmV0dXJuIFVvLmdldCh0KXx8e319LGFvPWZ1bmN0aW9uKHQpe3JldHVybiBVby5oYXModCl9fWVsc2V7dmFyIEhvPURvKCJzdGF0ZSIpO1BvW0hvXT0hMCxvbz1mdW5jdGlvbih0LGUpe2lmKE5vKHQsSG8pKXRocm93IG5ldyBGbyhNbyk7cmV0dXJuIGUuZmFjYWRlPXQsUm8odCxIbyxlKSxlfSxzbz1mdW5jdGlvbih0KXtyZXR1cm4gTm8odCxIbyk/dFtIb106e319LGFvPWZ1bmN0aW9uKHQpe3JldHVybiBObyh0LEhvKX19dmFyIEpvPXtzZXQ6b28sZ2V0OnNvLGhhczphbyxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBhbyh0KT9zbyh0KTpvbyh0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcjtpZighQm8oZSl8fChyPXNvKGUpKS50eXBlIT09dCl0aHJvdyBuZXcgRm8oIkluY29tcGF0aWJsZSByZWNlaXZlciwgIit0KyIgcmVxdWlyZWQiKTtyZXR1cm4gcn19fSxLbz1ZZSxXbz1KLFpvPVh0LEdvPUtyLFZvPUluLFhvPW0oW10ucHVzaCksWW89ZnVuY3Rpb24odCl7dmFyIGU9MT09PXQscj0yPT09dCxuPTM9PT10LGk9ND09PXQsbz02PT09dCxzPTc9PT10LGE9NT09PXR8fG87cmV0dXJuIGZ1bmN0aW9uKGMsdSxsLGgpe2Zvcih2YXIgZixkLHA9Wm8oYyksXz1XbyhwKSxnPUdvKF8pLG09S28odSxsKSx5PTAsdj1ofHxWbyxiPWU/dihjLGcpOnJ8fHM/dihjLDApOnZvaWQgMDtnPnk7eSsrKWlmKChhfHx5IGluIF8pJiYoZD1tKGY9X1t5XSx5LHApLHQpKWlmKGUpYlt5XT1kO2Vsc2UgaWYoZClzd2l0Y2godCl7Y2FzZSAzOnJldHVybiEwO2Nhc2UgNTpyZXR1cm4gZjtjYXNlIDY6cmV0dXJuIHk7Y2FzZSAyOlhvKGIsZil9ZWxzZSBzd2l0Y2godCl7Y2FzZSA0OnJldHVybiExO2Nhc2UgNzpYbyhiLGYpfXJldHVybiBvPy0xOm58fGk/aTpifX0sJG89e2ZvckVhY2g6WW8oMCksbWFwOllvKDEpLGZpbHRlcjpZbygyKSxzb21lOllvKDMpLGV2ZXJ5OllvKDQpLGZpbmQ6WW8oNSksZmluZEluZGV4OllvKDYpLGZpbHRlclJlamVjdDpZbyg3KX0scW89Q3IsUW89byx0cz1MLGVzPW0scnM9Qyxucz15dCxpcz1zLG9zPXF0LHNzPW90LGFzPXJyLGNzPVksdXM9U2UsbHM9JG4saHM9TSxmcz1IaSxkcz1taSxwcz1KaSxfcz1aaSxncz1RaSxtcz1BLHlzPSRlLHZzPXFuLGJzPUIsd3M9ZW8sU3M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByby5mKHQsZSxyKX0sa3M9WnQsT3M9YWksRXM9bmUseHM9ZmUsQXM9bm8sQ3M9Zm8sVHM9eW8sSXM9QW8sTHM9Sm8sQnM9JG8uZm9yRWFjaCxScz1DaSgiaGlkZGVuIiksTnM9IlN5bWJvbCIsenM9InByb3RvdHlwZSIsRHM9THMuc2V0LFBzPUxzLmdldHRlckZvcihOcyksTXM9T2JqZWN0W3pzXSxGcz1Rby5TeW1ib2wsanM9RnMmJkZzW3pzXSxVcz1Rby5SYW5nZUVycm9yLEhzPVFvLlR5cGVFcnJvcixKcz1Rby5RT2JqZWN0LEtzPW1zLmYsV3M9eXMuZixacz1fcy5mLEdzPWJzLmYsVnM9ZXMoW10ucHVzaCksWHM9a3MoInN5bWJvbHMiKSxZcz1rcygib3Atc3ltYm9scyIpLCRzPWtzKCJ3a3MiKSxxcz0hSnN8fCFKc1t6c118fCFKc1t6c10uZmluZENoaWxkLFFzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1LcyhNcyxlKTtuJiZkZWxldGUgTXNbZV0sV3ModCxlLHIpLG4mJnQhPT1NcyYmV3MoTXMsZSxuKX0sdGE9cnMmJmlzKChmdW5jdGlvbigpe3JldHVybiA3IT09ZnMoV3Moe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gV3ModGhpcywiYSIse3ZhbHVlOjd9KS5hfX0pKS5hfSkpP1FzOldzLGVhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9WHNbdF09ZnMoanMpO3JldHVybiBEcyhyLHt0eXBlOk5zLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxyc3x8KHIuZGVzY3JpcHRpb249ZSkscn0scmE9ZnVuY3Rpb24odCxlLHIpe3Q9PT1NcyYmcmEoWXMsZSxyKSxhcyh0KTt2YXIgbj11cyhlKTtyZXR1cm4gYXMociksb3MoWHMsbik/KHIuZW51bWVyYWJsZT8ob3ModCxScykmJnRbUnNdW25dJiYodFtSc11bbl09ITEpLHI9ZnMocix7ZW51bWVyYWJsZTpocygwLCExKX0pKToob3ModCxScyl8fFdzKHQsUnMsaHMoMSxmcyhudWxsKSkpLHRbUnNdW25dPSEwKSx0YSh0LG4scikpOldzKHQsbixyKX0sbmE9ZnVuY3Rpb24odCxlKXthcyh0KTt2YXIgcj1jcyhlKSxuPWRzKHIpLmNvbmNhdChhYShyKSk7cmV0dXJuIEJzKG4sKGZ1bmN0aW9uKGUpe3JzJiYhdHMoaWEscixlKXx8cmEodCxlLHJbZV0pfSkpLHR9LGlhPWZ1bmN0aW9uKHQpe3ZhciBlPXVzKHQpLHI9dHMoR3MsdGhpcyxlKTtyZXR1cm4hKHRoaXM9PT1NcyYmb3MoWHMsZSkmJiFvcyhZcyxlKSkmJighKHJ8fCFvcyh0aGlzLGUpfHwhb3MoWHMsZSl8fG9zKHRoaXMsUnMpJiZ0aGlzW1JzXVtlXSl8fHIpfSxvYT1mdW5jdGlvbih0LGUpe3ZhciByPWNzKHQpLG49dXMoZSk7aWYociE9PU1zfHwhb3MoWHMsbil8fG9zKFlzLG4pKXt2YXIgaT1LcyhyLG4pO3JldHVybiFpfHwhb3MoWHMsbil8fG9zKHIsUnMpJiZyW1JzXVtuXXx8KGkuZW51bWVyYWJsZT0hMCksaX19LHNhPWZ1bmN0aW9uKHQpe3ZhciBlPVpzKGNzKHQpKSxyPVtdO3JldHVybiBCcyhlLChmdW5jdGlvbih0KXtvcyhYcyx0KXx8b3MoT3MsdCl8fFZzKHIsdCl9KSkscn0sYWE9ZnVuY3Rpb24odCl7dmFyIGU9dD09PU1zLHI9WnMoZT9Zczpjcyh0KSksbj1bXTtyZXR1cm4gQnMociwoZnVuY3Rpb24odCl7IW9zKFhzLHQpfHxlJiYhb3MoTXMsdCl8fFZzKG4sWHNbdF0pfSkpLG59O25zfHwoRnM9ZnVuY3Rpb24oKXtpZihzcyhqcyx0aGlzKSl0aHJvdyBuZXcgSHMoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9scyhhcmd1bWVudHNbMF0pOnZvaWQgMCxlPUVzKHQpLHI9ZnVuY3Rpb24odCl7dmFyIG49dm9pZCAwPT09dGhpcz9Rbzp0aGlzO249PT1NcyYmdHMocixZcyx0KSxvcyhuLFJzKSYmb3MobltSc10sZSkmJihuW1JzXVtlXT0hMSk7dmFyIGk9aHMoMSx0KTt0cnl7dGEobixlLGkpfWNhdGNoKG8pe2lmKCEobyBpbnN0YW5jZW9mIFVzKSl0aHJvdyBvO1FzKG4sZSxpKX19O3JldHVybiBycyYmcXMmJnRhKE1zLGUse2NvbmZpZ3VyYWJsZTohMCxzZXQ6cn0pLGVhKGUsdCl9LHdzKGpzPUZzW3pzXSwidG9TdHJpbmciLChmdW5jdGlvbigpe3JldHVybiBQcyh0aGlzKS50YWd9KSksd3MoRnMsIndpdGhvdXRTZXR0ZXIiLChmdW5jdGlvbih0KXtyZXR1cm4gZWEoRXModCksdCl9KSksYnMuZj1pYSx5cy5mPXJhLHZzLmY9bmEsbXMuZj1vYSxwcy5mPV9zLmY9c2EsZ3MuZj1hYSxBcy5mPWZ1bmN0aW9uKHQpe3JldHVybiBlYSh4cyh0KSx0KX0scnMmJlNzKGpzLCJkZXNjcmlwdGlvbiIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHModGhpcykuZGVzY3JpcHRpb259fSkpLHFvKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsd3JhcDohMCxmb3JjZWQ6IW5zLHNoYW06IW5zfSx7U3ltYm9sOkZzfSksQnMoZHMoJHMpLChmdW5jdGlvbih0KXtDcyh0KX0pKSxxbyh7dGFyZ2V0Ok5zLHN0YXQ6ITAsZm9yY2VkOiFuc30se3VzZVNldHRlcjpmdW5jdGlvbigpe3FzPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtxcz0hMX19KSxxbyh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFucyxzaGFtOiFyc30se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP2ZzKHQpOm5hKGZzKHQpLGUpfSxkZWZpbmVQcm9wZXJ0eTpyYSxkZWZpbmVQcm9wZXJ0aWVzOm5hLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpvYX0pLHFvKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IW5zfSx7Z2V0T3duUHJvcGVydHlOYW1lczpzYX0pLFRzKCksSXMoRnMsTnMpLE9zW1JzXT0hMDt2YXIgY2E9eXQmJiEhU3ltYm9sLmZvciYmISFTeW1ib2wua2V5Rm9yLHVhPUNyLGxhPWl0LGhhPXF0LGZhPSRuLGRhPVp0LHBhPWNhLF9hPWRhKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksZ2E9ZGEoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKTt1YSh7dGFyZ2V0OiJTeW1ib2wiLHN0YXQ6ITAsZm9yY2VkOiFwYX0se2ZvcjpmdW5jdGlvbih0KXt2YXIgZT1mYSh0KTtpZihoYShfYSxlKSlyZXR1cm4gX2FbZV07dmFyIHI9bGEoIlN5bWJvbCIpKGUpO3JldHVybiBfYVtlXT1yLGdhW3JdPWUscn19KTt2YXIgbWE9Q3IseWE9cXQsdmE9T3QsYmE9eHQsd2E9Y2EsU2E9WnQoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKTttYSh7dGFyZ2V0OiJTeW1ib2wiLHN0YXQ6ITAsZm9yY2VkOiF3YX0se2tleUZvcjpmdW5jdGlvbih0KXtpZighdmEodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihiYSh0KSsiIGlzIG5vdCBhIHN5bWJvbCIpO2lmKHlhKFNhLHQpKXJldHVybiBTYVt0XX19KTt2YXIga2E9RHIsT2E9eCxFYT13LHhhPSRuLEFhPW0oW10ucHVzaCksQ2E9Q3IsVGE9aXQsSWE9ZixMYT1MLEJhPW0sUmE9cyxOYT14LHphPU90LERhPUdpLFBhPWZ1bmN0aW9uKHQpe2lmKE9hKHQpKXJldHVybiB0O2lmKGthKHQpKXtmb3IodmFyIGU9dC5sZW5ndGgscj1bXSxuPTA7bjxlO24rKyl7dmFyIGk9dFtuXTsic3RyaW5nIj09dHlwZW9mIGk/QWEocixpKToibnVtYmVyIiE9dHlwZW9mIGkmJiJOdW1iZXIiIT09RWEoaSkmJiJTdHJpbmciIT09RWEoaSl8fEFhKHIseGEoaSkpfXZhciBvPXIubGVuZ3RoLHM9ITA7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYocylyZXR1cm4gcz0hMSxlO2lmKGthKHRoaXMpKXJldHVybiBlO2Zvcih2YXIgbj0wO248bztuKyspaWYocltuXT09PXQpcmV0dXJuIGV9fX0sTWE9eXQsRmE9U3RyaW5nLGphPVRhKCJKU09OIiwic3RyaW5naWZ5IiksVWE9QmEoLy4vLmV4ZWMpLEhhPUJhKCIiLmNoYXJBdCksSmE9QmEoIiIuY2hhckNvZGVBdCksS2E9QmEoIiIucmVwbGFjZSksV2E9QmEoMS4udG9TdHJpbmcpLFphPS9bXHVEODAwLVx1REZGRl0vZyxHYT0vXltcdUQ4MDAtXHVEQkZGXSQvLFZhPS9eW1x1REMwMC1cdURGRkZdJC8sWGE9IU1hfHxSYSgoZnVuY3Rpb24oKXt2YXIgdD1UYSgiU3ltYm9sIikoInN0cmluZ2lmeSBkZXRlY3Rpb24iKTtyZXR1cm4iW251bGxdIiE9PWphKFt0XSl8fCJ7fSIhPT1qYSh7YTp0fSl8fCJ7fSIhPT1qYShPYmplY3QodCkpfSkpLFlhPVJhKChmdW5jdGlvbigpe3JldHVybiciXFx1ZGYwNlxcdWQ4MzQiJyE9PWphKCJcdWRmMDZcdWQ4MzQiKXx8JyJcXHVkZWFkIichPT1qYSgiXHVkZWFkIil9KSksJGE9ZnVuY3Rpb24odCxlKXt2YXIgcj1EYShhcmd1bWVudHMpLG49UGEoZSk7aWYoTmEobil8fHZvaWQgMCE9PXQmJiF6YSh0KSlyZXR1cm4gclsxXT1mdW5jdGlvbih0LGUpe2lmKE5hKG4pJiYoZT1MYShuLHRoaXMsRmEodCksZSkpLCF6YShlKSlyZXR1cm4gZX0sSWEoamEsbnVsbCxyKX0scWE9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPUhhKHIsZS0xKSxpPUhhKHIsZSsxKTtyZXR1cm4gVWEoR2EsdCkmJiFVYShWYSxpKXx8VWEoVmEsdCkmJiFVYShHYSxuKT8iXFx1IitXYShKYSh0LDApLDE2KTp0fTtqYSYmQ2Eoe3RhcmdldDoiSlNPTiIsc3RhdDohMCxhcml0eTozLGZvcmNlZDpYYXx8WWF9LHtzdHJpbmdpZnk6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPURhKGFyZ3VtZW50cyksaT1JYShYYT8kYTpqYSxudWxsLG4pO3JldHVybiBZYSYmInN0cmluZyI9PXR5cGVvZiBpP0thKGksWmEscWEpOml9fSk7dmFyIFFhPVFpLHRjPVh0O0NyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXl0fHxzKChmdW5jdGlvbigpe1FhLmYoMSl9KSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7dmFyIGU9UWEuZjtyZXR1cm4gZT9lKHRjKHQpKTpbXX19KSxmbygiYXN5bmNJdGVyYXRvciIpLGZvKCJoYXNJbnN0YW5jZSIpLGZvKCJpc0NvbmNhdFNwcmVhZGFibGUiKSxmbygiaXRlcmF0b3IiKSxmbygibWF0Y2giKSxmbygibWF0Y2hBbGwiKSxmbygicmVwbGFjZSIpLGZvKCJzZWFyY2giKSxmbygic3BlY2llcyIpLGZvKCJzcGxpdCIpO3ZhciBlYz15bztmbygidG9QcmltaXRpdmUiKSxlYygpO3ZhciByYz1pdCxuYz1BbztmbygidG9TdHJpbmdUYWciKSxuYyhyYygiU3ltYm9sIiksIlN5bWJvbCIpLGZvKCJ1bnNjb3BhYmxlcyIpLEFvKG8uSlNPTiwiSlNPTiIsITApO3ZhciBpYyxvYyxzYyxhYz1RLlN5bWJvbCxjYz17fSx1Yz1DLGxjPXF0LGhjPUZ1bmN0aW9uLnByb3RvdHlwZSxmYz11YyYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixkYz1sYyhoYywibmFtZSIpLHBjPXtFWElTVFM6ZGMsUFJPUEVSOmRjJiYic29tZXRoaW5nIj09PWZ1bmN0aW9uKCl7fS5uYW1lLENPTkZJR1VSQUJMRTpkYyYmKCF1Y3x8dWMmJmZjKGhjLCJuYW1lIikuY29uZmlndXJhYmxlKX0sX2M9IXMoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuY29uc3RydWN0b3I9bnVsbCxPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IHQpIT09dC5wcm90b3R5cGV9KSksZ2M9cXQsbWM9eCx5Yz1YdCx2Yz1fYyxiYz1DaSgiSUVfUFJPVE8iKSx3Yz1PYmplY3QsU2M9d2MucHJvdG90eXBlLGtjPXZjP3djLmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3ZhciBlPXljKHQpO2lmKGdjKGUsYmMpKXJldHVybiBlW2JjXTt2YXIgcj1lLmNvbnN0cnVjdG9yO3JldHVybiBtYyhyKSYmZSBpbnN0YW5jZW9mIHI/ci5wcm90b3R5cGU6ZSBpbnN0YW5jZW9mIHdjP1NjOm51bGx9LE9jPXMsRWM9eCx4Yz1xLEFjPUhpLENjPWtjLFRjPWVvLEljPWZlKCJpdGVyYXRvciIpLExjPSExO1tdLmtleXMmJigibmV4dCJpbihzYz1bXS5rZXlzKCkpPyhvYz1DYyhDYyhzYykpKSE9PU9iamVjdC5wcm90b3R5cGUmJihpYz1vYyk6TGM9ITApO3ZhciBCYz0heGMoaWMpfHxPYygoZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gaWNbSWNdLmNhbGwodCkhPT10fSkpO0VjKChpYz1CYz97fTpBYyhpYykpW0ljXSl8fFRjKGljLEljLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpO3ZhciBSYz17SXRlcmF0b3JQcm90b3R5cGU6aWMsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpMY30sTmM9UmMuSXRlcmF0b3JQcm90b3R5cGUsemM9SGksRGM9TSxQYz1BbyxNYz1jYyxGYz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxqYz1DcixVYz1MLEhjPXBjLEpjPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPXpjKE5jLHtuZXh0OkRjKCshbixyKX0pLFBjKHQsaSwhMSwhMCksTWNbaV09RmMsdH0sS2M9a2MsV2M9QW8sWmM9ZW8sR2M9Y2MsVmM9UmMsWGM9SGMuUFJPUEVSLFljPVZjLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMsJGM9ZmUoIml0ZXJhdG9yIikscWM9ImtleXMiLFFjPSJ2YWx1ZXMiLHR1PSJlbnRyaWVzIixldT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxydT1mdW5jdGlvbih0LGUscixuLGksbyxzKXtKYyhyLGUsbik7dmFyIGEsYyx1LGw9ZnVuY3Rpb24odCl7aWYodD09PWkmJl8pcmV0dXJuIF87aWYoIVljJiZ0JiZ0IGluIGQpcmV0dXJuIGRbdF07c3dpdGNoKHQpe2Nhc2UgcWM6Y2FzZSBRYzpjYXNlIHR1OnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyl9fSxoPWUrIiBJdGVyYXRvciIsZj0hMSxkPXQucHJvdG90eXBlLHA9ZFskY118fGRbIkBAaXRlcmF0b3IiXXx8aSYmZFtpXSxfPSFZYyYmcHx8bChpKSxnPSJBcnJheSI9PT1lJiZkLmVudHJpZXN8fHA7aWYoZyYmKGE9S2MoZy5jYWxsKG5ldyB0KSkpIT09T2JqZWN0LnByb3RvdHlwZSYmYS5uZXh0JiYoV2MoYSxoLCEwLCEwKSxHY1toXT1ldSksWGMmJmk9PT1RYyYmcCYmcC5uYW1lIT09UWMmJihmPSEwLF89ZnVuY3Rpb24oKXtyZXR1cm4gVWMocCx0aGlzKX0pLGkpaWYoYz17dmFsdWVzOmwoUWMpLGtleXM6bz9fOmwocWMpLGVudHJpZXM6bCh0dSl9LHMpZm9yKHUgaW4gYykoWWN8fGZ8fCEodSBpbiBkKSkmJlpjKGQsdSxjW3VdKTtlbHNlIGpjKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6WWN8fGZ9LGMpO3JldHVybiBzJiZkWyRjXSE9PV8mJlpjKGQsJGMsXyx7bmFtZTppfSksR2NbZV09XyxjfSxudT1mdW5jdGlvbih0LGUpe3JldHVybnt2YWx1ZTp0LGRvbmU6ZX19LGl1PVksb3U9Y2Msc3U9Sm87JGUuZjt2YXIgYXU9cnUsY3U9bnUsdXU9IkFycmF5IEl0ZXJhdG9yIixsdT1zdS5zZXQsaHU9c3UuZ2V0dGVyRm9yKHV1KTthdShBcnJheSwiQXJyYXkiLChmdW5jdGlvbih0LGUpe2x1KHRoaXMse3R5cGU6dXUsdGFyZ2V0Oml1KHQpLGluZGV4OjAsa2luZDplfSl9KSwoZnVuY3Rpb24oKXt2YXIgdD1odSh0aGlzKSxlPXQudGFyZ2V0LHI9dC5pbmRleCsrO2lmKCFlfHxyPj1lLmxlbmd0aClyZXR1cm4gdC50YXJnZXQ9bnVsbCxjdSh2b2lkIDAsITApO3N3aXRjaCh0LmtpbmQpe2Nhc2Uia2V5cyI6cmV0dXJuIGN1KHIsITEpO2Nhc2UidmFsdWVzIjpyZXR1cm4gY3UoZVtyXSwhMSl9cmV0dXJuIGN1KFtyLGVbcl1dLCExKX0pLCJ2YWx1ZXMiKSxvdS5Bcmd1bWVudHM9b3UuQXJyYXk7dmFyIGZ1PXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfSxkdT1vLHB1PUFvLF91PWNjO2Zvcih2YXIgZ3UgaW4gZnUpcHUoZHVbZ3VdLGd1KSxfdVtndV09X3UuQXJyYXk7dmFyIG11PWFjLHl1PWZlLHZ1PSRlLmYsYnU9eXUoIm1ldGFkYXRhIiksd3U9RnVuY3Rpb24ucHJvdG90eXBlO3ZvaWQgMD09PXd1W2J1XSYmdnUod3UsYnUse3ZhbHVlOm51bGx9KSxmbygiYXN5bmNEaXNwb3NlIiksZm8oImRpc3Bvc2UiKSxmbygibWV0YWRhdGEiKTt2YXIgU3U9bXUsa3U9bSxPdT1pdCgiU3ltYm9sIiksRXU9T3Uua2V5Rm9yLHh1PWt1KE91LnByb3RvdHlwZS52YWx1ZU9mKSxBdT1PdS5pc1JlZ2lzdGVyZWRTeW1ib2x8fGZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdm9pZCAwIT09RXUoeHUodCkpfWNhdGNoKGUpe3JldHVybiExfX07Q3Ioe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwfSx7aXNSZWdpc3RlcmVkU3ltYm9sOkF1fSk7Zm9yKHZhciBDdT1adCxUdT1pdCxJdT1tLEx1PU90LEJ1PWZlLFJ1PVR1KCJTeW1ib2wiKSxOdT1SdS5pc1dlbGxLbm93blN5bWJvbCx6dT1UdSgiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIpLER1PUl1KFJ1LnByb3RvdHlwZS52YWx1ZU9mKSxQdT1DdSgid2tzIiksTXU9MCxGdT16dShSdSksanU9RnUubGVuZ3RoO011PGp1O011KyspdHJ5e3ZhciBVdT1GdVtNdV07THUoUnVbVXVdKSYmQnUoVXUpfWNhdGNoKFFnKXt9dmFyIEh1PWZ1bmN0aW9uKHQpe2lmKE51JiZOdSh0KSlyZXR1cm4hMDt0cnl7Zm9yKHZhciBlPUR1KHQpLHI9MCxuPXp1KFB1KSxpPW4ubGVuZ3RoO3I8aTtyKyspaWYoUHVbbltyXV09PWUpcmV0dXJuITB9Y2F0Y2goUWcpe31yZXR1cm4hMX07Q3Ioe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwLGZvcmNlZDohMH0se2lzV2VsbEtub3duU3ltYm9sOkh1fSksZm8oImN1c3RvbU1hdGNoZXIiKSxmbygib2JzZXJ2YWJsZSIpLENyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxuYW1lOiJpc1JlZ2lzdGVyZWRTeW1ib2wifSx7aXNSZWdpc3RlcmVkOkF1fSksQ3Ioe3RhcmdldDoiU3ltYm9sIixzdGF0OiEwLG5hbWU6ImlzV2VsbEtub3duU3ltYm9sIixmb3JjZWQ6ITB9LHtpc1dlbGxLbm93bjpIdX0pLGZvKCJtYXRjaGVyIiksZm8oIm1ldGFkYXRhS2V5IiksZm8oInBhdHRlcm5NYXRjaCIpLGZvKCJyZXBsYWNlQWxsIik7dmFyIEp1PWUoU3UpLEt1PW0sV3U9anIsWnU9JG4sR3U9RyxWdT1LdSgiIi5jaGFyQXQpLFh1PUt1KCIiLmNoYXJDb2RlQXQpLFl1PUt1KCIiLnNsaWNlKSwkdT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgbixpLG89WnUoR3UoZSkpLHM9V3UociksYT1vLmxlbmd0aDtyZXR1cm4gczwwfHxzPj1hP3Q/IiI6dm9pZCAwOihuPVh1KG8scykpPDU1Mjk2fHxuPjU2MzE5fHxzKzE9PT1hfHwoaT1YdShvLHMrMSkpPDU2MzIwfHxpPjU3MzQzP3Q/VnUobyxzKTpuOnQ/WXUobyxzLHMrMik6aS01NjMyMCsobi01NTI5Njw8MTApKzY1NTM2fX0scXU9e2NvZGVBdDokdSghMSksY2hhckF0OiR1KCEwKX0uY2hhckF0LFF1PSRuLHRsPUpvLGVsPXJ1LHJsPW51LG5sPSJTdHJpbmcgSXRlcmF0b3IiLGlsPXRsLnNldCxvbD10bC5nZXR0ZXJGb3IobmwpO2VsKFN0cmluZywiU3RyaW5nIiwoZnVuY3Rpb24odCl7aWwodGhpcyx7dHlwZTpubCxzdHJpbmc6UXUodCksaW5kZXg6MH0pfSksKGZ1bmN0aW9uKCl7dmFyIHQsZT1vbCh0aGlzKSxyPWUuc3RyaW5nLG49ZS5pbmRleDtyZXR1cm4gbj49ci5sZW5ndGg/cmwodm9pZCAwLCEwKToodD1xdShyLG4pLGUuaW5kZXgrPXQubGVuZ3RoLHJsKHQsITEpKX0pKTt2YXIgc2w9ZShuby5mKCJpdGVyYXRvciIpKTtmdW5jdGlvbiBhbCh0KXtyZXR1cm4oYWw9ImZ1bmN0aW9uIj09dHlwZW9mIEp1JiYic3ltYm9sIj09dHlwZW9mIHNsP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBKdSYmdC5jb25zdHJ1Y3Rvcj09PUp1JiZ0IT09SnUucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9dmFyIGNsPWUobm8uZigidG9QcmltaXRpdmUiKSk7ZnVuY3Rpb24gdWwodCl7dmFyIGU9ZnVuY3Rpb24odCxlKXtpZigib2JqZWN0IiE9YWwodCl8fCF0KXJldHVybiB0O3ZhciByPXRbY2xdO2lmKHZvaWQgMCE9PXIpe3ZhciBuPXIuY2FsbCh0LGV8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPWFsKG4pKXJldHVybiBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09ZT9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PWFsKGUpP2U6ZSsiIn1mdW5jdGlvbiBsbCh0LGUscil7cmV0dXJuKGU9dWwoZSkpaW4gdD9Ocih0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH12YXIgaGwsZmw9KHQ9Pih0LkgyNjQ9IkgyNjQiLHQuVlA4PSJWUDgiLHQuSDI2NT0iSDI2NSIsdCkpKGZsfHx7fSksZGw9byxwbD1RLF9sPWZ1bmN0aW9uKHQsZSl7dmFyIHI9cGxbdCsiUHJvdG90eXBlIl0sbj1yJiZyW2VdO2lmKG4pcmV0dXJuIG47dmFyIGk9ZGxbdF0sbz1pJiZpLnByb3RvdHlwZTtyZXR1cm4gbyYmb1tlXX0sZ2w9cSxtbD13LHlsPWZlKCJtYXRjaCIpLHZsPXJyLGJsPUwsd2w9cXQsU2w9b3Qsa2w9ZnVuY3Rpb24oKXt2YXIgdD12bCh0aGlzKSxlPSIiO3JldHVybiB0Lmhhc0luZGljZXMmJihlKz0iZCIpLHQuZ2xvYmFsJiYoZSs9ImciKSx0Lmlnbm9yZUNhc2UmJihlKz0iaSIpLHQubXVsdGlsaW5lJiYoZSs9Im0iKSx0LmRvdEFsbCYmKGUrPSJzIiksdC51bmljb2RlJiYoZSs9InUiKSx0LnVuaWNvZGVTZXRzJiYoZSs9InYiKSx0LnN0aWNreSYmKGUrPSJ5IiksZX0sT2w9UmVnRXhwLnByb3RvdHlwZSxFbD1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24geGwoKXtpZighaGwmJiEoaGw9InVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8mJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHwidW5kZWZpbmVkIiE9dHlwZW9mIG1zQ3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0bykpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gaGwoRWwpfXZhciBBbD0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7Zm9yKHZhciBDbD1bXSxUbD0wO1RsPDI1NjsrK1RsKUNsLnB1c2goKFRsKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gSWwodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAscj0oQ2xbdFtlKzBdXStDbFt0W2UrMV1dK0NsW3RbZSsyXV0rQ2xbdFtlKzNdXSsiLSIrQ2xbdFtlKzRdXStDbFt0W2UrNV1dKyItIitDbFt0W2UrNl1dK0NsW3RbZSs3XV0rIi0iK0NsW3RbZSs4XV0rQ2xbdFtlKzldXSsiLSIrQ2xbdFtlKzEwXV0rQ2xbdFtlKzExXV0rQ2xbdFtlKzEyXV0rQ2xbdFtlKzEzXV0rQ2xbdFtlKzE0XV0rQ2xbdFtlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmQWwudGVzdCh0KX0ocikpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gcn1mdW5jdGlvbiBMbCh0LGUscil7dmFyIG49KHQ9dHx8e30pLnJhbmRvbXx8KHQucm5nfHx4bCkoKTtpZihuWzZdPTE1Jm5bNl18NjQsbls4XT02MyZuWzhdfDEyOCxlKXtyPXJ8fDA7Zm9yKHZhciBpPTA7aTwxNjsrK2kpZVtyK2ldPW5baV07cmV0dXJuIGV9cmV0dXJuIElsKG4pfWNvbnN0IEJsPSgpPT4idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdztmdW5jdGlvbiBSbCh0KXtyZXR1cm4gbnVsbD09dD8idW5kZWZpbmVkIHwgbnVsbCI6InN0cmluZyI9PXR5cGVvZiB0P3Q6SlNPTi5zdHJpbmdpZnkoe2NvbnRlbnRIaW50OnQuY29udGVudEhpbnQsZW5hYmxlZDp0LmVuYWJsZWQsaWQ6dC5pZCxraW5kOnQua2luZCxsYWJlbDp0LmxhYmVsLG11dGVkOnQubXV0ZWQscmVhZHlTdGF0ZTp0LnJlYWR5U3RhdGV9KX1mdW5jdGlvbiBObCh0KXtyZXR1cm4gbnVsbD09dD8idW5kZWZpbmVkIHwgbnVsbCI6InN0cmluZyI9PXR5cGVvZiB0P3Q6SlNPTi5zdHJpbmdpZnkoe3RyYWNrOlJsKHQudHJhY2spfSl9ZnVuY3Rpb24gemwodCl7cmV0dXJuIG51bGw9PXQ/InVuZGVmaW5lZCB8IG51bGwiOiJzdHJpbmciPT10eXBlb2YgdD90OkpTT04uc3RyaW5naWZ5KHt0cmFjazpSbCh0LnRyYWNrKX0pfWNvbnN0IERsPSJAYnl0ZWQvdmUtcnRjIixQbD0iQGJ5dGVkL3ZlLXJ0Yy1jYWNoZS1zaXplIjt2YXIgTWw9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7bGwodGhpcywic3RvcmVLZXkiLHZvaWQgMCksbGwodGhpcywibG9nTGV2ZWwiLHZvaWQgMCksbGwodGhpcywiTG9nZmlsZVNpemUiLHZvaWQgMCksbGwodGhpcywiZGIiLHZvaWQgMCksbGwodGhpcywibG9nSWQiLHZvaWQgMCksbGwodGhpcywiY2FjaGVMb2ciLHZvaWQgMCksbGwodGhpcywiY2FjaGVkU2l6ZSIsdm9pZCAwKSxsbCh0aGlzLCJwcmVDYWNoZVRpbWUiLHZvaWQgMCksbGwodGhpcywidGltZXIiLHZvaWQgMCksbGwodGhpcywiX2dldFNpemUiLCh0PT5uZXcgQmxvYih0KS5zaXplLzEwNDg1NzYpKSx0aGlzLnN0b3JlS2V5PSIiLHRoaXMubG9nSWQ9MSx0aGlzLmNhY2hlTG9nPSIiLHRoaXMubG9nTGV2ZWw9Im5vbmUiLHRoaXMuTG9nZmlsZVNpemU9MTAwLHRoaXMuX2NyZWF0ZVN0b3JlKCl9X2NyZWF0ZVN0b3JlKCl7aWYoQmwoKXx8IXdpbmRvdy5pbmRleGVkREIpcmV0dXJuO2NvbnN0IHQ9aW5kZXhlZERCLm9wZW4oIkBieXRlZC92ZS1ydGMiKTt0Lm9udXBncmFkZW5lZWRlZD0oKT0+e3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKERsKTt0cnl7bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUGwpfWNhdGNoKFFnKXt9fSx0Lm9uZXJyb3I9dD0+e30sdC5vbnN1Y2Nlc3M9KCk9Pnt0aGlzLmRiPXQucmVzdWx0LHRoaXMuX2dldENhY2hlZFNpemUoKX19X2dldENhY2hlZFNpemUoKXt0cnl7Y29uc3QgdD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShQbCk7dD90aGlzLmNhY2hlZFNpemU9TnVtYmVyKHQpOnRoaXMudmFsdWVzKCkudGhlbigodD0+e3RoaXMuY2FjaGVkU2l6ZT10aGlzLl9nZXRTaXplKHQpLHRoaXMuX3NldENhY2hlZFNpemUoKX0pKX1jYXRjaChRZyl7fX1fc2V0Q2FjaGVkU2l6ZSgpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShQbCwiIi5jb25jYXQodGhpcy5jYWNoZWRTaXplKSl9Y2F0Y2goUWcpe319X2dldFN0b3JlKHQpe2lmKHRoaXMuZGIpcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oRGwsdCkub2JqZWN0U3RvcmUoRGwpfXNldCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLHIpPT57aWYoIm5vbmUiPT09dGhpcy5sb2dMZXZlbClyZXR1cm4gZSgpO2lmKHQmJnRoaXMucHJlQ2FjaGVUaW1lJiZ0aGlzLnByZUNhY2hlVGltZS1EYXRlLm5vdygpPDFlMylyZXR1cm4gdGhpcy5jYWNoZUxvZys9IlxuXG4iLmNvbmNhdCh0aGlzLmxvZ0lkLCI6ICIpLmNvbmNhdCh0KSx0aGlzLmxvZ0lkKyssdGhpcy50aW1lcnx8KHRoaXMudGltZXI9c2V0VGltZW91dCgoKCk9Pnt0aGlzLnNldCgiIil9KSwxZTMtKHRoaXMucHJlQ2FjaGVUaW1lLURhdGUubm93KCkpKSksZSgpO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGw7Y29uc3Qgbj10aGlzLl9nZXRTdG9yZSgicmVhZHdyaXRlIik7aWYoIW4pcmV0dXJuIHIoImdldCBzdG9yZSBmYWlsIik7dGhpcy5jYWNoZWRTaXplJiZ0aGlzLmNhY2hlZFNpemU+dGhpcy5Mb2dmaWxlU2l6ZSYmdGhpcy5rZXlFYXJsaWVzdCgpLnRoZW4oKHQ9Pnt0aGlzLmdldCh0KS50aGVuKChlPT57dGhpcy5kZWwodCkudGhlbigoKCk9Pnt0aGlzLmNhY2hlZFNpemU9dGhpcy5jYWNoZWRTaXplLXRoaXMuX2dldFNpemUoWyIiLmNvbmNhdChlKV0pLHRoaXMuX3NldENhY2hlZFNpemUoKX0pKX0pKX0pKTtjb25zdCBpPW4uZ2V0KHRoaXMuc3RvcmVLZXkpO2kub25zdWNjZXNzPSgpPT57dHJ5e2NvbnN0IHI9IiIuY29uY2F0KGkucmVzdWx0fHwiIikuY29uY2F0KHRoaXMuY2FjaGVMb2cpLG89dD8iIi5jb25jYXQocj8iXG5cbiI6IiIpLmNvbmNhdCh0aGlzLmxvZ0lkLCI6ICIpLmNvbmNhdCh0KToiIjtuLnB1dCgiIi5jb25jYXQocikuY29uY2F0KG8pLHRoaXMuc3RvcmVLZXkpLHQmJnRoaXMubG9nSWQrKyx0aGlzLmNhY2hlTG9nPSIiLHRoaXMuY2FjaGVkU2l6ZT0odGhpcy5jYWNoZWRTaXplfHwwKSt0aGlzLl9nZXRTaXplKFsiIi5jb25jYXQodGhpcy5jYWNoZUxvZykuY29uY2F0KG8pXSksdGhpcy5fc2V0Q2FjaGVkU2l6ZSgpLHRoaXMucHJlQ2FjaGVUaW1lPURhdGUubm93KCksZSgpfWNhdGNoKG8pe2lmKCF0KXJldHVybiByKG8pO3RoaXMuY2FjaGVMb2crPSJcblxuIi5jb25jYXQodGhpcy5sb2dJZCwiOiAiKS5jb25jYXQodCksdGhpcy5sb2dJZCsrLHIobyl9fSxpLm9uZXJyb3I9ZT0+e2lmKCF0KXJldHVybiByKGUpO3RoaXMuY2FjaGVMb2crPSJcblxuIi5jb25jYXQodGhpcy5sb2dJZCwiOiAiKS5jb25jYXQodCksdGhpcy5sb2dJZCsrLHIoZSl9fSkpfWdldCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLHIpPT57Y29uc3Qgbj10aGlzLl9nZXRTdG9yZSgicmVhZG9ubHkiKTtpZighbilyZXR1cm4gcigpO2NvbnN0IGk9bi5nZXQodCk7aS5vbnN1Y2Nlc3M9KCk9PntlKGkucmVzdWx0KX0saS5vbmVycm9yPXQ9PntyKHQpfX0pKX1kZWwoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5zdG9yZUtleTtyZXR1cm4gbmV3IFByb21pc2UoKChlLHIpPT57Y29uc3Qgbj10aGlzLl9nZXRTdG9yZSgicmVhZHdyaXRlIik7aWYoIW4pcmV0dXJuIHIoKTtjb25zdCBpPW4uZGVsZXRlKHQpO2kub25zdWNjZXNzPSgpPT5lKGkucmVzdWx0KSxpLm9uZXJyb3I9dD0+cih0KX0pKX1rZXlFYXJsaWVzdCgpe3JldHVybiB0aGlzLmtleXMoKS50aGVuKCh0PT57bGV0IGUscj1EYXRlLm5vdygpO3JldHVybiB0LmZvckVhY2goKHQ9PntpZighdHx8IXQubGVuZ3RoKXJldHVybjtjb25zdCBuPXQuc3BsaXQoIi0iKVswXTtOdW1iZXIobik8ciYmKHI9TnVtYmVyKG4pLGU9dCl9KSksZX0pKX1rZXlzKCl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5fZ2V0U3RvcmUoInJlYWRvbmx5Iik7aWYoIXIpcmV0dXJuIGUoKTtpZihyLmdldEFsbEtleXMpe2NvbnN0IG49ci5nZXRBbGxLZXlzKCk7cmV0dXJuIG4ub25zdWNjZXNzPSgpPT57dChuLnJlc3VsdCl9LHZvaWQobi5vbmVycm9yPSgpPT57ZSgpfSl9Y29uc3Qgbj1bXTtyLm9wZW5DdXJzb3IoKS5vbnN1Y2Nlc3M9ZnVuY3Rpb24oKXt0aGlzLnJlc3VsdCYmKG4ucHVzaCh0aGlzLnJlc3VsdC5rZXkpLHRoaXMucmVzdWx0LmNvbnRpbnVlKCkpfSxyLnRyYW5zYWN0aW9uLm9uY29tcGxldGU9KCk9PnQobil9KSl9dmFsdWVzKCl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5fZ2V0U3RvcmUoInJlYWRvbmx5Iik7aWYoIXIpcmV0dXJuIGUoKTtpZihyLmdldEFsbCl7Y29uc3Qgbj1yLmdldEFsbCgpO3JldHVybiBuLm9uc3VjY2Vzcz0oKT0+e3Qobi5yZXN1bHQpfSx2b2lkKG4ub25lcnJvcj0oKT0+e2UoKX0pfWNvbnN0IG49W107ci5vcGVuQ3Vyc29yKCkub25zdWNjZXNzPWZ1bmN0aW9uKCl7dGhpcy5yZXN1bHQmJihuLnB1c2godGhpcy5yZXN1bHQudmFsdWUpLHRoaXMucmVzdWx0LmNvbnRpbnVlKCkpfSxyLnRyYW5zYWN0aW9uLm9uY29tcGxldGU9KCk9PnQobil9KSl9ZG93bmxvYWQodCl7dD10fHx0aGlzLnN0b3JlS2V5LHRoaXMuZ2V0KHQpLnRoZW4oKGU9Pntjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyLmRvd25sb2FkPSIiLmNvbmNhdCh0LCIudHh0Iiksci5ocmVmPSJkYXRhOnRleHQvcGFpbnQ7dXRmLTgsIi5jb25jYXQoZXx8IiIpLHIuY2xpY2soKX0pKX19O2NsYXNzIEZse2NvbnN0cnVjdG9yKCl7bGwodGhpcywiX2FsbCIse30pfW9uKHQsZSl7Y29uc3Qgcj10aGlzLl9hbGxbdF07cj9yLnB1c2goZSk6dGhpcy5fYWxsW3RdPVtlXX1vbmNlKHQsZSl7dmFyIHI9dGhpcztjb25zdCBuPWZ1bmN0aW9uKCl7ZSguLi5hcmd1bWVudHMpLHIub2ZmKHQsbil9O3RoaXMub24odCxuKX1vZmYodCxlKXtjb25zdCByPXRoaXMuX2FsbFt0XTtudWxsPT1yfHxyLnNwbGljZShyLmluZGV4T2YoZSk+Pj4wLDEpfWVtaXQodCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO2NvbnN0IGk9dGhpcy5fYWxsW3RdO251bGw9PWl8fGkuc2xpY2UoKS5mb3JFYWNoKCh0PT50KC4uLnIpKSl9c2FmZUVtaXQodCl7dHJ5e2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KGU+MT9lLTE6MCksbj0xO248ZTtuKyspcltuLTFdPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5lbWl0KHQsLi4ucil9Y2F0Y2goUWcpe2NvbnNvbGUuZXJyb3IoUWcpfX1kZXN0cm95KCl7dGhpcy5fYWxsPXt9fX1jb25zdCBqbD1bIlVQTE9BRF9DT05TT0xFX0xFTkdUSF9DVVQiLCJVUExPQURfUkVQT1JUX0xJTUlUIl07Y29uc3QgVWw9bmV3IGNsYXNzIGV4dGVuZHMgRmx7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLGxsKHRoaXMsImNvbmZpZyIse1VQTE9BRF9DT05TT0xFX09OOiExLFVQTE9BRF9DT05TT0xFX0xFTkdUSF9DVVQ6MjAwLFVQTE9BRF9SRVBPUlRfTElNSVQ6NDVlNCxFTkFCTEVfUkVQT1JUX0lEQl9CVUZGRVI6ITF9KX1zZXRQYXJhbWV0ZXIodCxlKXtpZihmdW5jdGlvbih0KXtyZXR1cm4gamwuaW5jbHVkZXModCl9KHQpKXRyeXtjb25zdCByPU51bWJlcihlKTtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuO3RoaXMuY29uZmlnW3RdPXJ9Y2F0Y2gocil7cmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJDYW5ub3QgY29udmVydCBjb3JlIGxpYiBwYXJhbWV0ZXIgIi5jb25jYXQodCwiOiIpLmNvbmNhdChlLCIgaW50byBudW1iZXIiKSl9ZWxzZSB0aGlzLmNvbmZpZ1t0XT1lO3RoaXMuZW1pdCh0LHRoaXMuY29uZmlnW3RdKX1nZXRQYXJhbWV0ZXIodCl7cmV0dXJuIHRoaXMuY29uZmlnW3RdfWdldEtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5jb25maWcpfX07dmFyIEhsPVh0LEpsPW1pO0NyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6cygoZnVuY3Rpb24oKXtKbCgxKX0pKX0se2tleXM6ZnVuY3Rpb24odCl7cmV0dXJuIEpsKEhsKHQpKX19KTt2YXIgS2w9ZShRLk9iamVjdC5rZXlzKSxXbD1lKFEuT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyksWmw9JG8uZmlsdGVyO0NyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IU5uKCJmaWx0ZXIiKX0se2ZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gWmwodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTt2YXIgR2w9X2woIkFycmF5IiwiZmlsdGVyIiksVmw9b3QsWGw9R2wsWWw9QXJyYXkucHJvdG90eXBlLCRsPWUoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZmlsdGVyO3JldHVybiB0PT09WWx8fFZsKFlsLHQpJiZlPT09WWwuZmlsdGVyP1hsOmV9KSkscWw9e2V4cG9ydHM6e319LFFsPUNyLHRoPXMsZWg9WSxyaD1BLmYsbmg9QztRbCh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFuaHx8dGgoKGZ1bmN0aW9uKCl7cmgoMSl9KSksc2hhbTohbmh9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmgoZWgodCksZSl9fSk7dmFyIGloPVEuT2JqZWN0LG9oPXFsLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaWguZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSl9O2loLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYob2guc2hhbT0hMCk7dmFyIHNoPWUocWwuZXhwb3J0cyksYWg9QyxjaD1Ecix1aD1UeXBlRXJyb3IsbGg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixoaD1haCYmIWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcylyZXR1cm4hMDt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCJsZW5ndGgiLHt3cml0YWJsZTohMX0pLmxlbmd0aD0xfWNhdGNoKFFnKXtyZXR1cm4gUWcgaW5zdGFuY2VvZiBUeXBlRXJyb3J9fSgpLGZoPVh0LGRoPUtyLHBoPWhoP2Z1bmN0aW9uKHQsZSl7aWYoY2godCkmJiFsaCh0LCJsZW5ndGgiKS53cml0YWJsZSl0aHJvdyBuZXcgdWgoIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgiKTtyZXR1cm4gdC5sZW5ndGg9ZX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZW5ndGg9ZX0sX2g9WnI7Q3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGFyaXR5OjEsZm9yY2VkOnMoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyOTQ5NjcyOTchPT1bXS5wdXNoLmNhbGwoe2xlbmd0aDo0Mjk0OTY3Mjk2fSwxKX0pKXx8IWZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS5wdXNoKCl9Y2F0Y2goUWcpe3JldHVybiBRZyBpbnN0YW5jZW9mIFR5cGVFcnJvcn19KCl9LHtwdXNoOmZ1bmN0aW9uKHQpe3ZhciBlPWZoKHRoaXMpLHI9ZGgoZSksbj1hcmd1bWVudHMubGVuZ3RoO19oKHIrbik7Zm9yKHZhciBpPTA7aTxuO2krKyllW3JdPWFyZ3VtZW50c1tpXSxyKys7cmV0dXJuIHBoKGUscikscn19KTt2YXIgZ2g9X2woIkFycmF5IiwicHVzaCIpLG1oPW90LHloPWdoLHZoPUFycmF5LnByb3RvdHlwZSxiaD1lKChmdW5jdGlvbih0KXt2YXIgZT10LnB1c2g7cmV0dXJuIHQ9PT12aHx8bWgodmgsdCkmJmU9PT12aC5wdXNoP3loOmV9KSksd2g9cyxTaD0kby5mb3JFYWNoLGtoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9W11bdF07cmV0dXJuISFyJiZ3aCgoZnVuY3Rpb24oKXtyLmNhbGwobnVsbCxlfHxmdW5jdGlvbigpe3JldHVybiAxfSwxKX0pKX0oImZvckVhY2giKT9bXS5mb3JFYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBTaCh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfTtDcih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOltdLmZvckVhY2ghPT1raH0se2ZvckVhY2g6a2h9KTt2YXIgT2g9X2woIkFycmF5IiwiZm9yRWFjaCIpLEVoPXNuLHhoPXF0LEFoPW90LENoPU9oLFRoPUFycmF5LnByb3RvdHlwZSxJaD17RE9NVG9rZW5MaXN0OiEwLE5vZGVMaXN0OiEwfSxMaD1lKChmdW5jdGlvbih0KXt2YXIgZT10LmZvckVhY2g7cmV0dXJuIHQ9PT1UaHx8QWgoVGgsdCkmJmU9PT1UaC5mb3JFYWNofHx4aChJaCxFaCh0KSk/Q2g6ZX0pKSxCaD1pdCxSaD1KaSxOaD1RaSx6aD1ycixEaD1tKFtdLmNvbmNhdCksUGg9QmgoIlJlZmxlY3QiLCJvd25LZXlzIil8fGZ1bmN0aW9uKHQpe3ZhciBlPVJoLmYoemgodCkpLHI9TmguZjtyZXR1cm4gcj9EaChlLHIodCkpOmV9LE1oPVksRmg9QSxqaD1ZcjtDcih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohQ30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbj1NaCh0KSxpPUZoLmYsbz1QaChuKSxzPXt9LGE9MDtvLmxlbmd0aD5hOyl2b2lkIDAhPT0ocj1pKG4sZT1vW2ErK10pKSYmamgocyxlLHIpO3JldHVybiBzfX0pO3ZhciBVaD1lKFEuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpLEhoPXtleHBvcnRzOnt9fSxKaD1DcixLaD1DLFdoPXFuLmY7Smgoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuZGVmaW5lUHJvcGVydGllcyE9PVdoLHNoYW06IUtofSx7ZGVmaW5lUHJvcGVydGllczpXaH0pO3ZhciBaaD1RLk9iamVjdCxHaD1IaC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFpoLmRlZmluZVByb3BlcnRpZXModCxlKX07WmguZGVmaW5lUHJvcGVydGllcy5zaGFtJiYoR2guc2hhbT0hMCk7dmFyIFZoPWUoSGguZXhwb3J0cyk7ZnVuY3Rpb24gWGgodCxlKXt2YXIgcj1LbCh0KTtpZihXbCl7dmFyIG49V2wodCk7ZSYmKG49JGwobikuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm4gc2godCxlKS5lbnVtZXJhYmxlfSkpKSxiaChyKS5hcHBseShyLG4pfXJldHVybiByfWZ1bmN0aW9uIFloKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByLG4saT1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9MaChyPVhoKE9iamVjdChpKSwhMCkpLmNhbGwociwoZnVuY3Rpb24oZSl7bGwodCxlLGlbZV0pfSkpOlVoP1ZoKHQsVWgoaSkpOkxoKG49WGgoT2JqZWN0KGkpKSkuY2FsbChuLChmdW5jdGlvbihlKXtOcih0LGUsc2goaSxlKSl9KSl9cmV0dXJuIHR9dmFyICRoPURyLHFoPUtyLFFoPVpyLHRmPVllLGVmPWZ1bmN0aW9uKHQsZSxyLG4saSxvLHMsYSl7Zm9yKHZhciBjLHUsbD1pLGg9MCxmPSEhcyYmdGYocyxhKTtoPG47KWggaW4gciYmKGM9Zj9mKHJbaF0saCxlKTpyW2hdLG8+MCYmJGgoYyk/KHU9cWgoYyksbD1lZih0LGUsYyx1LGwsby0xKS0xKTooUWgobCsxKSx0W2xdPWMpLGwrKyksaCsrO3JldHVybiBsfSxyZj1lZixuZj1YdCxvZj1LcixzZj1qcixhZj1JbjtDcih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtmbGF0OmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLGU9bmYodGhpcykscj1vZihlKSxuPWFmKGUsMCk7cmV0dXJuIG4ubGVuZ3RoPXJmKG4sZSxlLHIsMCx2b2lkIDA9PT10PzE6c2YodCkpLG59fSk7dmFyIGNmPV9sKCJBcnJheSIsImZsYXQiKSx1Zj1vdCxsZj1jZixoZj1BcnJheS5wcm90b3R5cGUsZmY9ZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5mbGF0O3JldHVybiB0PT09aGZ8fHVmKGhmLHQpJiZlPT09aGYuZmxhdD9sZjplfSkpLGRmPXt9OyFmdW5jdGlvbih0KXt2YXIgZT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDE2QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgSW50MzJBcnJheTtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfXQuYXNzaWduPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7ZS5sZW5ndGg7KXt2YXIgbj1lLnNoaWZ0KCk7aWYobil7aWYoIm9iamVjdCIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IobisibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBpIGluIG4pcihuLGkpJiYodFtpXT1uW2ldKX19cmV0dXJuIHR9LHQuc2hyaW5rQnVmPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGVuZ3RoPT09ZT90OnQuc3ViYXJyYXk/dC5zdWJhcnJheSgwLGUpOih0Lmxlbmd0aD1lLHQpfTt2YXIgbj17YXJyYXlTZXQ6ZnVuY3Rpb24odCxlLHIsbixpKXtpZihlLnN1YmFycmF5JiZ0LnN1YmFycmF5KXQuc2V0KGUuc3ViYXJyYXkocixyK24pLGkpO2Vsc2UgZm9yKHZhciBvPTA7bzxuO28rKyl0W2krb109ZVtyK29dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8scztmb3Iobj0wLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbis9dFtlXS5sZW5ndGg7Zm9yKHM9bmV3IFVpbnQ4QXJyYXkobiksaT0wLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbz10W2VdLHMuc2V0KG8saSksaSs9by5sZW5ndGg7cmV0dXJuIHN9fSxpPXthcnJheVNldDpmdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz0wO288bjtvKyspdFtpK29dPWVbcitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbih0KXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sdCl9fTt0LnNldFR5cGVkPWZ1bmN0aW9uKGUpe2U/KHQuQnVmOD1VaW50OEFycmF5LHQuQnVmMTY9VWludDE2QXJyYXksdC5CdWYzMj1JbnQzMkFycmF5LHQuYXNzaWduKHQsbikpOih0LkJ1Zjg9QXJyYXksdC5CdWYxNj1BcnJheSx0LkJ1ZjMyPUFycmF5LHQuYXNzaWduKHQsaSkpfSx0LnNldFR5cGVkKGUpfShkZik7dmFyIHBmPXt9LF9mPXt9LGdmPXt9LG1mPWRmO2Z1bmN0aW9uIHlmKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDstLWU+PTA7KXRbZV09MH12YXIgdmY9MjU2LGJmPTI4Nix3Zj0zMCxTZj0xNSxrZj1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXSxPZj1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sRWY9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddLHhmPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxBZj1uZXcgQXJyYXkoNTc2KTt5ZihBZik7dmFyIENmPW5ldyBBcnJheSg2MCk7eWYoQ2YpO3ZhciBUZj1uZXcgQXJyYXkoNTEyKTt5ZihUZik7dmFyIElmPW5ldyBBcnJheSgyNTYpO3lmKElmKTt2YXIgTGY9bmV3IEFycmF5KDI5KTt5ZihMZik7dmFyIEJmLFJmLE5mLHpmPW5ldyBBcnJheSh3Zik7ZnVuY3Rpb24gRGYodCxlLHIsbixpKXt0aGlzLnN0YXRpY190cmVlPXQsdGhpcy5leHRyYV9iaXRzPWUsdGhpcy5leHRyYV9iYXNlPXIsdGhpcy5lbGVtcz1uLHRoaXMubWF4X2xlbmd0aD1pLHRoaXMuaGFzX3N0cmVlPXQmJnQubGVuZ3RofWZ1bmN0aW9uIFBmKHQsZSl7dGhpcy5keW5fdHJlZT10LHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz1lfWZ1bmN0aW9uIE1mKHQpe3JldHVybiB0PDI1Nj9UZlt0XTpUZlsyNTYrKHQ+Pj43KV19ZnVuY3Rpb24gRmYodCxlKXt0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmZSx0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT1lPj4+OCYyNTV9ZnVuY3Rpb24gamYodCxlLHIpe3QuYmlfdmFsaWQ+MTYtcj8odC5iaV9idWZ8PWU8PHQuYmlfdmFsaWQmNjU1MzUsRmYodCx0LmJpX2J1ZiksdC5iaV9idWY9ZT4+MTYtdC5iaV92YWxpZCx0LmJpX3ZhbGlkKz1yLTE2KToodC5iaV9idWZ8PWU8PHQuYmlfdmFsaWQmNjU1MzUsdC5iaV92YWxpZCs9cil9ZnVuY3Rpb24gVWYodCxlLHIpe2pmKHQsclsyKmVdLHJbMiplKzFdKX1mdW5jdGlvbiBIZih0LGUpe3ZhciByPTA7ZG97cnw9MSZ0LHQ+Pj49MSxyPDw9MX13aGlsZSgtLWU+MCk7cmV0dXJuIHI+Pj4xfWZ1bmN0aW9uIEpmKHQsZSxyKXt2YXIgbixpLG89bmV3IEFycmF5KDE2KSxzPTA7Zm9yKG49MTtuPD1TZjtuKyspb1tuXT1zPXMrcltuLTFdPDwxO2ZvcihpPTA7aTw9ZTtpKyspe3ZhciBhPXRbMippKzFdOzAhPT1hJiYodFsyKmldPUhmKG9bYV0rKyxhKSl9fWZ1bmN0aW9uIEtmKHQpe3ZhciBlO2ZvcihlPTA7ZTxiZjtlKyspdC5keW5fbHRyZWVbMiplXT0wO2ZvcihlPTA7ZTx3ZjtlKyspdC5keW5fZHRyZWVbMiplXT0wO2ZvcihlPTA7ZTwxOTtlKyspdC5ibF90cmVlWzIqZV09MDt0LmR5bl9sdHJlZVs1MTJdPTEsdC5vcHRfbGVuPXQuc3RhdGljX2xlbj0wLHQubGFzdF9saXQ9dC5tYXRjaGVzPTB9ZnVuY3Rpb24gV2YodCl7dC5iaV92YWxpZD44P0ZmKHQsdC5iaV9idWYpOnQuYmlfdmFsaWQ+MCYmKHQucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPXQuYmlfYnVmKSx0LmJpX2J1Zj0wLHQuYmlfdmFsaWQ9MH1mdW5jdGlvbiBaZih0LGUscixuKXt2YXIgaT0yKmUsbz0yKnI7cmV0dXJuIHRbaV08dFtvXXx8dFtpXT09PXRbb10mJm5bZV08PW5bcl19ZnVuY3Rpb24gR2YodCxlLHIpe2Zvcih2YXIgbj10LmhlYXBbcl0saT1yPDwxO2k8PXQuaGVhcF9sZW4mJihpPHQuaGVhcF9sZW4mJlpmKGUsdC5oZWFwW2krMV0sdC5oZWFwW2ldLHQuZGVwdGgpJiZpKyssIVpmKGUsbix0LmhlYXBbaV0sdC5kZXB0aCkpOyl0LmhlYXBbcl09dC5oZWFwW2ldLHI9aSxpPDw9MTt0LmhlYXBbcl09bn1mdW5jdGlvbiBWZih0LGUscil7dmFyIG4saSxvLHMsYT0wO2lmKDAhPT10Lmxhc3RfbGl0KWRve249dC5wZW5kaW5nX2J1Zlt0LmRfYnVmKzIqYV08PDh8dC5wZW5kaW5nX2J1Zlt0LmRfYnVmKzIqYSsxXSxpPXQucGVuZGluZ19idWZbdC5sX2J1ZithXSxhKyssMD09PW4/VWYodCxpLGUpOihVZih0LChvPUlmW2ldKSt2ZisxLGUpLDAhPT0ocz1rZltvXSkmJmpmKHQsaS09TGZbb10scyksVWYodCxvPU1mKC0tbiksciksMCE9PShzPU9mW29dKSYmamYodCxuLT16ZltvXSxzKSl9d2hpbGUoYTx0Lmxhc3RfbGl0KTtVZih0LDI1NixlKX1mdW5jdGlvbiBYZih0LGUpe3ZhciByLG4saSxvPWUuZHluX3RyZWUscz1lLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxhPWUuc3RhdF9kZXNjLmhhc19zdHJlZSxjPWUuc3RhdF9kZXNjLmVsZW1zLHU9LTE7Zm9yKHQuaGVhcF9sZW49MCx0LmhlYXBfbWF4PTU3MyxyPTA7cjxjO3IrKykwIT09b1syKnJdPyh0LmhlYXBbKyt0LmhlYXBfbGVuXT11PXIsdC5kZXB0aFtyXT0wKTpvWzIqcisxXT0wO2Zvcig7dC5oZWFwX2xlbjwyOylvWzIqKGk9dC5oZWFwWysrdC5oZWFwX2xlbl09dTwyPysrdTowKV09MSx0LmRlcHRoW2ldPTAsdC5vcHRfbGVuLS0sYSYmKHQuc3RhdGljX2xlbi09c1syKmkrMV0pO2ZvcihlLm1heF9jb2RlPXUscj10LmhlYXBfbGVuPj4xO3I+PTE7ci0tKUdmKHQsbyxyKTtpPWM7ZG97cj10LmhlYXBbMV0sdC5oZWFwWzFdPXQuaGVhcFt0LmhlYXBfbGVuLS1dLEdmKHQsbywxKSxuPXQuaGVhcFsxXSx0LmhlYXBbLS10LmhlYXBfbWF4XT1yLHQuaGVhcFstLXQuaGVhcF9tYXhdPW4sb1syKmldPW9bMipyXStvWzIqbl0sdC5kZXB0aFtpXT0odC5kZXB0aFtyXT49dC5kZXB0aFtuXT90LmRlcHRoW3JdOnQuZGVwdGhbbl0pKzEsb1syKnIrMV09b1syKm4rMV09aSx0LmhlYXBbMV09aSsrLEdmKHQsbywxKX13aGlsZSh0LmhlYXBfbGVuPj0yKTt0LmhlYXBbLS10LmhlYXBfbWF4XT10LmhlYXBbMV0sZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYz1lLmR5bl90cmVlLHU9ZS5tYXhfY29kZSxsPWUuc3RhdF9kZXNjLnN0YXRpY190cmVlLGg9ZS5zdGF0X2Rlc2MuaGFzX3N0cmVlLGY9ZS5zdGF0X2Rlc2MuZXh0cmFfYml0cyxkPWUuc3RhdF9kZXNjLmV4dHJhX2Jhc2UscD1lLnN0YXRfZGVzYy5tYXhfbGVuZ3RoLF89MDtmb3Iobz0wO288PVNmO28rKyl0LmJsX2NvdW50W29dPTA7Zm9yKGNbMip0LmhlYXBbdC5oZWFwX21heF0rMV09MCxyPXQuaGVhcF9tYXgrMTtyPDU3MztyKyspKG89Y1syKmNbMioobj10LmhlYXBbcl0pKzFdKzFdKzEpPnAmJihvPXAsXysrKSxjWzIqbisxXT1vLG4+dXx8KHQuYmxfY291bnRbb10rKyxzPTAsbj49ZCYmKHM9ZltuLWRdKSxhPWNbMipuXSx0Lm9wdF9sZW4rPWEqKG8rcyksaCYmKHQuc3RhdGljX2xlbis9YSoobFsyKm4rMV0rcykpKTtpZigwIT09Xyl7ZG97Zm9yKG89cC0xOzA9PT10LmJsX2NvdW50W29dOylvLS07dC5ibF9jb3VudFtvXS0tLHQuYmxfY291bnRbbysxXSs9Mix0LmJsX2NvdW50W3BdLS0sXy09Mn13aGlsZShfPjApO2ZvcihvPXA7MCE9PW87by0tKWZvcihuPXQuYmxfY291bnRbb107MCE9PW47KShpPXQuaGVhcFstLXJdKT51fHwoY1syKmkrMV0hPT1vJiYodC5vcHRfbGVuKz0oby1jWzIqaSsxXSkqY1syKmldLGNbMippKzFdPW8pLG4tLSl9fSh0LGUpLEpmKG8sdSx0LmJsX2NvdW50KX1mdW5jdGlvbiBZZih0LGUscil7dmFyIG4saSxvPS0xLHM9ZVsxXSxhPTAsYz03LHU9NDtmb3IoMD09PXMmJihjPTEzOCx1PTMpLGVbMioocisxKSsxXT02NTUzNSxuPTA7bjw9cjtuKyspaT1zLHM9ZVsyKihuKzEpKzFdLCsrYTxjJiZpPT09c3x8KGE8dT90LmJsX3RyZWVbMippXSs9YTowIT09aT8oaSE9PW8mJnQuYmxfdHJlZVsyKmldKyssdC5ibF90cmVlWzMyXSsrKTphPD0xMD90LmJsX3RyZWVbMzRdKys6dC5ibF90cmVlWzM2XSsrLGE9MCxvPWksMD09PXM/KGM9MTM4LHU9Myk6aT09PXM/KGM9Nix1PTMpOihjPTcsdT00KSl9ZnVuY3Rpb24gJGYodCxlLHIpe3ZhciBuLGksbz0tMSxzPWVbMV0sYT0wLGM9Nyx1PTQ7Zm9yKDA9PT1zJiYoYz0xMzgsdT0zKSxuPTA7bjw9cjtuKyspaWYoaT1zLHM9ZVsyKihuKzEpKzFdLCEoKythPGMmJmk9PT1zKSl7aWYoYTx1KWRve1VmKHQsaSx0LmJsX3RyZWUpfXdoaWxlKDAhPS0tYSk7ZWxzZSAwIT09aT8oaSE9PW8mJihVZih0LGksdC5ibF90cmVlKSxhLS0pLFVmKHQsMTYsdC5ibF90cmVlKSxqZih0LGEtMywyKSk6YTw9MTA/KFVmKHQsMTcsdC5ibF90cmVlKSxqZih0LGEtMywzKSk6KFVmKHQsMTgsdC5ibF90cmVlKSxqZih0LGEtMTEsNykpO2E9MCxvPWksMD09PXM/KGM9MTM4LHU9Myk6aT09PXM/KGM9Nix1PTMpOihjPTcsdT00KX19eWYoemYpO3ZhciBxZj0hMTtmdW5jdGlvbiBRZih0LGUscixuKXtqZih0LDArKG4/MTowKSwzKSxmdW5jdGlvbih0LGUscixuKXtXZih0KSxuJiYoRmYodCxyKSxGZih0LH5yKSksbWYuYXJyYXlTZXQodC5wZW5kaW5nX2J1Zix0LndpbmRvdyxlLHIsdC5wZW5kaW5nKSx0LnBlbmRpbmcrPXJ9KHQsZSxyLCEwKX1nZi5fdHJfaW5pdD1mdW5jdGlvbih0KXtxZnx8KCFmdW5jdGlvbigpe3ZhciB0LGUscixuLGksbz1uZXcgQXJyYXkoMTYpO2ZvcihyPTAsbj0wO248Mjg7bisrKWZvcihMZltuXT1yLHQ9MDt0PDE8PGtmW25dO3QrKylJZltyKytdPW47Zm9yKElmW3ItMV09bixpPTAsbj0wO248MTY7bisrKWZvcih6ZltuXT1pLHQ9MDt0PDE8PE9mW25dO3QrKylUZltpKytdPW47Zm9yKGk+Pj03O248d2Y7bisrKWZvcih6ZltuXT1pPDw3LHQ9MDt0PDE8PE9mW25dLTc7dCsrKVRmWzI1NitpKytdPW47Zm9yKGU9MDtlPD1TZjtlKyspb1tlXT0wO2Zvcih0PTA7dDw9MTQzOylBZlsyKnQrMV09OCx0Kyssb1s4XSsrO2Zvcig7dDw9MjU1OylBZlsyKnQrMV09OSx0Kyssb1s5XSsrO2Zvcig7dDw9Mjc5OylBZlsyKnQrMV09Nyx0Kyssb1s3XSsrO2Zvcig7dDw9Mjg3OylBZlsyKnQrMV09OCx0Kyssb1s4XSsrO2ZvcihKZihBZiwyODcsbyksdD0wO3Q8d2Y7dCsrKUNmWzIqdCsxXT01LENmWzIqdF09SGYodCw1KTtCZj1uZXcgRGYoQWYsa2YsMjU3LGJmLFNmKSxSZj1uZXcgRGYoQ2YsT2YsMCx3ZixTZiksTmY9bmV3IERmKG5ldyBBcnJheSgwKSxFZiwwLDE5LDcpfSgpLHFmPSEwKSx0LmxfZGVzYz1uZXcgUGYodC5keW5fbHRyZWUsQmYpLHQuZF9kZXNjPW5ldyBQZih0LmR5bl9kdHJlZSxSZiksdC5ibF9kZXNjPW5ldyBQZih0LmJsX3RyZWUsTmYpLHQuYmlfYnVmPTAsdC5iaV92YWxpZD0wLEtmKHQpfSxnZi5fdHJfc3RvcmVkX2Jsb2NrPVFmLGdmLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbih0LGUscixuKXt2YXIgaSxvLHM9MDt0LmxldmVsPjA/KDI9PT10LnN0cm0uZGF0YV90eXBlJiYodC5zdHJtLmRhdGFfdHlwZT1mdW5jdGlvbih0KXt2YXIgZSxyPTQwOTM2MjQ0NDc7Zm9yKGU9MDtlPD0zMTtlKysscj4+Pj0xKWlmKDEmciYmMCE9PXQuZHluX2x0cmVlWzIqZV0pcmV0dXJuIDA7aWYoMCE9PXQuZHluX2x0cmVlWzE4XXx8MCE9PXQuZHluX2x0cmVlWzIwXXx8MCE9PXQuZHluX2x0cmVlWzI2XSlyZXR1cm4gMTtmb3IoZT0zMjtlPHZmO2UrKylpZigwIT09dC5keW5fbHRyZWVbMiplXSlyZXR1cm4gMTtyZXR1cm4gMH0odCkpLFhmKHQsdC5sX2Rlc2MpLFhmKHQsdC5kX2Rlc2MpLHM9ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKFlmKHQsdC5keW5fbHRyZWUsdC5sX2Rlc2MubWF4X2NvZGUpLFlmKHQsdC5keW5fZHRyZWUsdC5kX2Rlc2MubWF4X2NvZGUpLFhmKHQsdC5ibF9kZXNjKSxlPTE4O2U+PTMmJjA9PT10LmJsX3RyZWVbMip4ZltlXSsxXTtlLS0pO3JldHVybiB0Lm9wdF9sZW4rPTMqKGUrMSkrNSs1KzQsZX0odCksaT10Lm9wdF9sZW4rMys3Pj4+Mywobz10LnN0YXRpY19sZW4rMys3Pj4+Myk8PWkmJihpPW8pKTppPW89cis1LHIrNDw9aSYmLTEhPT1lP1FmKHQsZSxyLG4pOjQ9PT10LnN0cmF0ZWd5fHxvPT09aT8oamYodCwyKyhuPzE6MCksMyksVmYodCxBZixDZikpOihqZih0LDQrKG4/MTowKSwzKSxmdW5jdGlvbih0LGUscixuKXt2YXIgaTtmb3IoamYodCxlLTI1Nyw1KSxqZih0LHItMSw1KSxqZih0LG4tNCw0KSxpPTA7aTxuO2krKylqZih0LHQuYmxfdHJlZVsyKnhmW2ldKzFdLDMpOyRmKHQsdC5keW5fbHRyZWUsZS0xKSwkZih0LHQuZHluX2R0cmVlLHItMSl9KHQsdC5sX2Rlc2MubWF4X2NvZGUrMSx0LmRfZGVzYy5tYXhfY29kZSsxLHMrMSksVmYodCx0LmR5bl9sdHJlZSx0LmR5bl9kdHJlZSkpLEtmKHQpLG4mJldmKHQpfSxnZi5fdHJfdGFsbHk9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0LnBlbmRpbmdfYnVmW3QuZF9idWYrMip0Lmxhc3RfbGl0XT1lPj4+OCYyNTUsdC5wZW5kaW5nX2J1Zlt0LmRfYnVmKzIqdC5sYXN0X2xpdCsxXT0yNTUmZSx0LnBlbmRpbmdfYnVmW3QubF9idWYrdC5sYXN0X2xpdF09MjU1JnIsdC5sYXN0X2xpdCsrLDA9PT1lP3QuZHluX2x0cmVlWzIqcl0rKzoodC5tYXRjaGVzKyssZS0tLHQuZHluX2x0cmVlWzIqKElmW3JdK3ZmKzEpXSsrLHQuZHluX2R0cmVlWzIqTWYoZSldKyspLHQubGFzdF9saXQ9PT10LmxpdF9idWZzaXplLTF9LGdmLl90cl9hbGlnbj1mdW5jdGlvbih0KXtqZih0LDIsMyksVWYodCwyNTYsQWYpLGZ1bmN0aW9uKHQpezE2PT09dC5iaV92YWxpZD8oRmYodCx0LmJpX2J1ZiksdC5iaV9idWY9MCx0LmJpX3ZhbGlkPTApOnQuYmlfdmFsaWQ+PTgmJih0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmdC5iaV9idWYsdC5iaV9idWY+Pj04LHQuYmlfdmFsaWQtPTgpfSh0KX07dmFyIHRkPWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT02NTUzNSZ0LG89dD4+PjE2JjY1NTM1LHM9MDswIT09cjspe3ItPXM9cj4yZTM/MmUzOnI7ZG97bz1vKyhpPWkrZVtuKytdfDApfDB9d2hpbGUoLS1zKTtpJT02NTUyMSxvJT02NTUyMX1yZXR1cm4gaXxvPDwxNn07dmFyIGVkPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9W10scj0wO3I8MjU2O3IrKyl7dD1yO2Zvcih2YXIgbj0wO248ODtuKyspdD0xJnQ/Mzk4ODI5MjM4NF50Pj4+MTp0Pj4+MTtlW3JdPXR9cmV0dXJuIGV9KCk7dmFyIHJkLG5kPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWVkLG89bityO3RePS0xO2Zvcih2YXIgcz1uO3M8bztzKyspdD10Pj4+OF5pWzI1NSYodF5lW3NdKV07cmV0dXJufnR9LGlkPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sb2Q9ZGYsc2Q9Z2YsYWQ9dGQsY2Q9bmQsdWQ9aWQsbGQ9LTIsaGQ9MjU4LGZkPTI2MixkZD0xMDMscGQ9MTEzLF9kPTY2NjtmdW5jdGlvbiBnZCh0LGUpe3JldHVybiB0Lm1zZz11ZFtlXSxlfWZ1bmN0aW9uIG1kKHQpe3JldHVybih0PDwxKS0odD40Pzk6MCl9ZnVuY3Rpb24geWQodCl7Zm9yKHZhciBlPXQubGVuZ3RoOy0tZT49MDspdFtlXT0wfWZ1bmN0aW9uIHZkKHQpe3ZhciBlPXQuc3RhdGUscj1lLnBlbmRpbmc7cj50LmF2YWlsX291dCYmKHI9dC5hdmFpbF9vdXQpLDAhPT1yJiYob2QuYXJyYXlTZXQodC5vdXRwdXQsZS5wZW5kaW5nX2J1ZixlLnBlbmRpbmdfb3V0LHIsdC5uZXh0X291dCksdC5uZXh0X291dCs9cixlLnBlbmRpbmdfb3V0Kz1yLHQudG90YWxfb3V0Kz1yLHQuYXZhaWxfb3V0LT1yLGUucGVuZGluZy09ciwwPT09ZS5wZW5kaW5nJiYoZS5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gYmQodCxlKXtzZC5fdHJfZmx1c2hfYmxvY2sodCx0LmJsb2NrX3N0YXJ0Pj0wP3QuYmxvY2tfc3RhcnQ6LTEsdC5zdHJzdGFydC10LmJsb2NrX3N0YXJ0LGUpLHQuYmxvY2tfc3RhcnQ9dC5zdHJzdGFydCx2ZCh0LnN0cm0pfWZ1bmN0aW9uIHdkKHQsZSl7dC5wZW5kaW5nX2J1Zlt0LnBlbmRpbmcrK109ZX1mdW5jdGlvbiBTZCh0LGUpe3QucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPWU+Pj44JjI1NSx0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmZX1mdW5jdGlvbiBrZCh0LGUpe3ZhciByLG4saT10Lm1heF9jaGFpbl9sZW5ndGgsbz10LnN0cnN0YXJ0LHM9dC5wcmV2X2xlbmd0aCxhPXQubmljZV9tYXRjaCxjPXQuc3Ryc3RhcnQ+dC53X3NpemUtZmQ/dC5zdHJzdGFydC0odC53X3NpemUtZmQpOjAsdT10LndpbmRvdyxsPXQud19tYXNrLGg9dC5wcmV2LGY9dC5zdHJzdGFydCtoZCxkPXVbbytzLTFdLHA9dVtvK3NdO3QucHJldl9sZW5ndGg+PXQuZ29vZF9tYXRjaCYmKGk+Pj0yKSxhPnQubG9va2FoZWFkJiYoYT10Lmxvb2thaGVhZCk7ZG97aWYodVsocj1lKStzXT09PXAmJnVbcitzLTFdPT09ZCYmdVtyXT09PXVbb10mJnVbKytyXT09PXVbbysxXSl7bys9MixyKys7ZG97fXdoaWxlKHVbKytvXT09PXVbKytyXSYmdVsrK29dPT09dVsrK3JdJiZ1Wysrb109PT11Wysrcl0mJnVbKytvXT09PXVbKytyXSYmdVsrK29dPT09dVsrK3JdJiZ1Wysrb109PT11Wysrcl0mJnVbKytvXT09PXVbKytyXSYmdVsrK29dPT09dVsrK3JdJiZvPGYpO2lmKG49aGQtKGYtbyksbz1mLWhkLG4+cyl7aWYodC5tYXRjaF9zdGFydD1lLHM9bixuPj1hKWJyZWFrO2Q9dVtvK3MtMV0scD11W28rc119fX13aGlsZSgoZT1oW2UmbF0pPmMmJjAhPS0taSk7cmV0dXJuIHM8PXQubG9va2FoZWFkP3M6dC5sb29rYWhlYWR9ZnVuY3Rpb24gT2QodCl7dmFyIGUscixuLGksbyxzLGEsYyx1LGwsaD10Lndfc2l6ZTtkb3tpZihpPXQud2luZG93X3NpemUtdC5sb29rYWhlYWQtdC5zdHJzdGFydCx0LnN0cnN0YXJ0Pj1oKyhoLWZkKSl7b2QuYXJyYXlTZXQodC53aW5kb3csdC53aW5kb3csaCxoLDApLHQubWF0Y2hfc3RhcnQtPWgsdC5zdHJzdGFydC09aCx0LmJsb2NrX3N0YXJ0LT1oLGU9cj10Lmhhc2hfc2l6ZTtkb3tuPXQuaGVhZFstLWVdLHQuaGVhZFtlXT1uPj1oP24taDowfXdoaWxlKC0tcik7ZT1yPWg7ZG97bj10LnByZXZbLS1lXSx0LnByZXZbZV09bj49aD9uLWg6MH13aGlsZSgtLXIpO2krPWh9aWYoMD09PXQuc3RybS5hdmFpbF9pbilicmVhaztpZihzPXQuc3RybSxhPXQud2luZG93LGM9dC5zdHJzdGFydCt0Lmxvb2thaGVhZCx1PWksbD12b2lkIDAsKGw9cy5hdmFpbF9pbik+dSYmKGw9dSkscj0wPT09bD8wOihzLmF2YWlsX2luLT1sLG9kLmFycmF5U2V0KGEscy5pbnB1dCxzLm5leHRfaW4sbCxjKSwxPT09cy5zdGF0ZS53cmFwP3MuYWRsZXI9YWQocy5hZGxlcixhLGwsYyk6Mj09PXMuc3RhdGUud3JhcCYmKHMuYWRsZXI9Y2Qocy5hZGxlcixhLGwsYykpLHMubmV4dF9pbis9bCxzLnRvdGFsX2luKz1sLGwpLHQubG9va2FoZWFkKz1yLHQubG9va2FoZWFkK3QuaW5zZXJ0Pj0zKWZvcihvPXQuc3Ryc3RhcnQtdC5pbnNlcnQsdC5pbnNfaD10LndpbmRvd1tvXSx0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbbysxXSkmdC5oYXNoX21hc2s7dC5pbnNlcnQmJih0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbbyszLTFdKSZ0Lmhhc2hfbWFzayx0LnByZXZbbyZ0LndfbWFza109dC5oZWFkW3QuaW5zX2hdLHQuaGVhZFt0Lmluc19oXT1vLG8rKyx0Lmluc2VydC0tLCEodC5sb29rYWhlYWQrdC5pbnNlcnQ8MykpOyk7fXdoaWxlKHQubG9va2FoZWFkPGZkJiYwIT09dC5zdHJtLmF2YWlsX2luKX1mdW5jdGlvbiBFZCh0LGUpe2Zvcih2YXIgcixuOzspe2lmKHQubG9va2FoZWFkPGZkKXtpZihPZCh0KSx0Lmxvb2thaGVhZDxmZCYmMD09PWUpcmV0dXJuIDE7aWYoMD09PXQubG9va2FoZWFkKWJyZWFrfWlmKHI9MCx0Lmxvb2thaGVhZD49MyYmKHQuaW5zX2g9KHQuaW5zX2g8PHQuaGFzaF9zaGlmdF50LndpbmRvd1t0LnN0cnN0YXJ0KzMtMV0pJnQuaGFzaF9tYXNrLHI9dC5wcmV2W3Quc3Ryc3RhcnQmdC53X21hc2tdPXQuaGVhZFt0Lmluc19oXSx0LmhlYWRbdC5pbnNfaF09dC5zdHJzdGFydCksMCE9PXImJnQuc3Ryc3RhcnQtcjw9dC53X3NpemUtZmQmJih0Lm1hdGNoX2xlbmd0aD1rZCh0LHIpKSx0Lm1hdGNoX2xlbmd0aD49MylpZihuPXNkLl90cl90YWxseSh0LHQuc3Ryc3RhcnQtdC5tYXRjaF9zdGFydCx0Lm1hdGNoX2xlbmd0aC0zKSx0Lmxvb2thaGVhZC09dC5tYXRjaF9sZW5ndGgsdC5tYXRjaF9sZW5ndGg8PXQubWF4X2xhenlfbWF0Y2gmJnQubG9va2FoZWFkPj0zKXt0Lm1hdGNoX2xlbmd0aC0tO2Rve3Quc3Ryc3RhcnQrKyx0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbdC5zdHJzdGFydCszLTFdKSZ0Lmhhc2hfbWFzayxyPXQucHJldlt0LnN0cnN0YXJ0JnQud19tYXNrXT10LmhlYWRbdC5pbnNfaF0sdC5oZWFkW3QuaW5zX2hdPXQuc3Ryc3RhcnR9d2hpbGUoMCE9LS10Lm1hdGNoX2xlbmd0aCk7dC5zdHJzdGFydCsrfWVsc2UgdC5zdHJzdGFydCs9dC5tYXRjaF9sZW5ndGgsdC5tYXRjaF9sZW5ndGg9MCx0Lmluc19oPXQud2luZG93W3Quc3Ryc3RhcnRdLHQuaW5zX2g9KHQuaW5zX2g8PHQuaGFzaF9zaGlmdF50LndpbmRvd1t0LnN0cnN0YXJ0KzFdKSZ0Lmhhc2hfbWFzaztlbHNlIG49c2QuX3RyX3RhbGx5KHQsMCx0LndpbmRvd1t0LnN0cnN0YXJ0XSksdC5sb29rYWhlYWQtLSx0LnN0cnN0YXJ0Kys7aWYobiYmKGJkKHQsITEpLDA9PT10LnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gdC5pbnNlcnQ9dC5zdHJzdGFydDwyP3Quc3Ryc3RhcnQ6Miw0PT09ZT8oYmQodCwhMCksMD09PXQuc3RybS5hdmFpbF9vdXQ/Mzo0KTp0Lmxhc3RfbGl0JiYoYmQodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpPzE6Mn1mdW5jdGlvbiB4ZCh0LGUpe2Zvcih2YXIgcixuLGk7Oyl7aWYodC5sb29rYWhlYWQ8ZmQpe2lmKE9kKHQpLHQubG9va2FoZWFkPGZkJiYwPT09ZSlyZXR1cm4gMTtpZigwPT09dC5sb29rYWhlYWQpYnJlYWt9aWYocj0wLHQubG9va2FoZWFkPj0zJiYodC5pbnNfaD0odC5pbnNfaDw8dC5oYXNoX3NoaWZ0XnQud2luZG93W3Quc3Ryc3RhcnQrMy0xXSkmdC5oYXNoX21hc2sscj10LnByZXZbdC5zdHJzdGFydCZ0LndfbWFza109dC5oZWFkW3QuaW5zX2hdLHQuaGVhZFt0Lmluc19oXT10LnN0cnN0YXJ0KSx0LnByZXZfbGVuZ3RoPXQubWF0Y2hfbGVuZ3RoLHQucHJldl9tYXRjaD10Lm1hdGNoX3N0YXJ0LHQubWF0Y2hfbGVuZ3RoPTIsMCE9PXImJnQucHJldl9sZW5ndGg8dC5tYXhfbGF6eV9tYXRjaCYmdC5zdHJzdGFydC1yPD10Lndfc2l6ZS1mZCYmKHQubWF0Y2hfbGVuZ3RoPWtkKHQsciksdC5tYXRjaF9sZW5ndGg8PTUmJigxPT09dC5zdHJhdGVneXx8Mz09PXQubWF0Y2hfbGVuZ3RoJiZ0LnN0cnN0YXJ0LXQubWF0Y2hfc3RhcnQ+NDA5NikmJih0Lm1hdGNoX2xlbmd0aD0yKSksdC5wcmV2X2xlbmd0aD49MyYmdC5tYXRjaF9sZW5ndGg8PXQucHJldl9sZW5ndGgpe2k9dC5zdHJzdGFydCt0Lmxvb2thaGVhZC0zLG49c2QuX3RyX3RhbGx5KHQsdC5zdHJzdGFydC0xLXQucHJldl9tYXRjaCx0LnByZXZfbGVuZ3RoLTMpLHQubG9va2FoZWFkLT10LnByZXZfbGVuZ3RoLTEsdC5wcmV2X2xlbmd0aC09Mjtkb3srK3Quc3Ryc3RhcnQ8PWkmJih0Lmluc19oPSh0Lmluc19oPDx0Lmhhc2hfc2hpZnRedC53aW5kb3dbdC5zdHJzdGFydCszLTFdKSZ0Lmhhc2hfbWFzayxyPXQucHJldlt0LnN0cnN0YXJ0JnQud19tYXNrXT10LmhlYWRbdC5pbnNfaF0sdC5oZWFkW3QuaW5zX2hdPXQuc3Ryc3RhcnQpfXdoaWxlKDAhPS0tdC5wcmV2X2xlbmd0aCk7aWYodC5tYXRjaF9hdmFpbGFibGU9MCx0Lm1hdGNoX2xlbmd0aD0yLHQuc3Ryc3RhcnQrKyxuJiYoYmQodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfWVsc2UgaWYodC5tYXRjaF9hdmFpbGFibGUpe2lmKChuPXNkLl90cl90YWxseSh0LDAsdC53aW5kb3dbdC5zdHJzdGFydC0xXSkpJiZiZCh0LCExKSx0LnN0cnN0YXJ0KyssdC5sb29rYWhlYWQtLSwwPT09dC5zdHJtLmF2YWlsX291dClyZXR1cm4gMX1lbHNlIHQubWF0Y2hfYXZhaWxhYmxlPTEsdC5zdHJzdGFydCsrLHQubG9va2FoZWFkLS19cmV0dXJuIHQubWF0Y2hfYXZhaWxhYmxlJiYobj1zZC5fdHJfdGFsbHkodCwwLHQud2luZG93W3Quc3Ryc3RhcnQtMV0pLHQubWF0Y2hfYXZhaWxhYmxlPTApLHQuaW5zZXJ0PXQuc3Ryc3RhcnQ8Mj90LnN0cnN0YXJ0OjIsND09PWU/KGJkKHQsITApLDA9PT10LnN0cm0uYXZhaWxfb3V0PzM6NCk6dC5sYXN0X2xpdCYmKGJkKHQsITEpLDA9PT10LnN0cm0uYXZhaWxfb3V0KT8xOjJ9ZnVuY3Rpb24gQWQodCxlLHIsbixpKXt0aGlzLmdvb2RfbGVuZ3RoPXQsdGhpcy5tYXhfbGF6eT1lLHRoaXMubmljZV9sZW5ndGg9cix0aGlzLm1heF9jaGFpbj1uLHRoaXMuZnVuYz1pfWZ1bmN0aW9uIENkKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9OCx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgb2QuQnVmMTYoMTE0NiksdGhpcy5keW5fZHRyZWU9bmV3IG9kLkJ1ZjE2KDEyMiksdGhpcy5ibF90cmVlPW5ldyBvZC5CdWYxNig3OCkseWQodGhpcy5keW5fbHRyZWUpLHlkKHRoaXMuZHluX2R0cmVlKSx5ZCh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBvZC5CdWYxNigxNiksdGhpcy5oZWFwPW5ldyBvZC5CdWYxNig1NzMpLHlkKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBvZC5CdWYxNig1NzMpLHlkKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIFRkKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPyh0LnRvdGFsX2luPXQudG90YWxfb3V0PTAsdC5kYXRhX3R5cGU9MiwoZT10LnN0YXRlKS5wZW5kaW5nPTAsZS5wZW5kaW5nX291dD0wLGUud3JhcDwwJiYoZS53cmFwPS1lLndyYXApLGUuc3RhdHVzPWUud3JhcD80MjpwZCx0LmFkbGVyPTI9PT1lLndyYXA/MDoxLGUubGFzdF9mbHVzaD0wLHNkLl90cl9pbml0KGUpLDApOmdkKHQsbGQpfWZ1bmN0aW9uIElkKHQpe3ZhciBlLHI9VGQodCk7cmV0dXJuIDA9PT1yJiYoKGU9dC5zdGF0ZSkud2luZG93X3NpemU9MiplLndfc2l6ZSx5ZChlLmhlYWQpLGUubWF4X2xhenlfbWF0Y2g9cmRbZS5sZXZlbF0ubWF4X2xhenksZS5nb29kX21hdGNoPXJkW2UubGV2ZWxdLmdvb2RfbGVuZ3RoLGUubmljZV9tYXRjaD1yZFtlLmxldmVsXS5uaWNlX2xlbmd0aCxlLm1heF9jaGFpbl9sZW5ndGg9cmRbZS5sZXZlbF0ubWF4X2NoYWluLGUuc3Ryc3RhcnQ9MCxlLmJsb2NrX3N0YXJ0PTAsZS5sb29rYWhlYWQ9MCxlLmluc2VydD0wLGUubWF0Y2hfbGVuZ3RoPWUucHJldl9sZW5ndGg9MixlLm1hdGNoX2F2YWlsYWJsZT0wLGUuaW5zX2g9MCkscn1mdW5jdGlvbiBMZCh0LGUscixuLGksbyl7aWYoIXQpcmV0dXJuIGxkO3ZhciBzPTE7aWYoLTE9PT1lJiYoZT02KSxuPDA/KHM9MCxuPS1uKTpuPjE1JiYocz0yLG4tPTE2KSxpPDF8fGk+OXx8OCE9PXJ8fG48OHx8bj4xNXx8ZTwwfHxlPjl8fG88MHx8bz40KXJldHVybiBnZCh0LGxkKTs4PT09biYmKG49OSk7dmFyIGE9bmV3IENkO3JldHVybiB0LnN0YXRlPWEsYS5zdHJtPXQsYS53cmFwPXMsYS5nemhlYWQ9bnVsbCxhLndfYml0cz1uLGEud19zaXplPTE8PGEud19iaXRzLGEud19tYXNrPWEud19zaXplLTEsYS5oYXNoX2JpdHM9aSs3LGEuaGFzaF9zaXplPTE8PGEuaGFzaF9iaXRzLGEuaGFzaF9tYXNrPWEuaGFzaF9zaXplLTEsYS5oYXNoX3NoaWZ0PX5+KChhLmhhc2hfYml0cyszLTEpLzMpLGEud2luZG93PW5ldyBvZC5CdWY4KDIqYS53X3NpemUpLGEuaGVhZD1uZXcgb2QuQnVmMTYoYS5oYXNoX3NpemUpLGEucHJldj1uZXcgb2QuQnVmMTYoYS53X3NpemUpLGEubGl0X2J1ZnNpemU9MTw8aSs2LGEucGVuZGluZ19idWZfc2l6ZT00KmEubGl0X2J1ZnNpemUsYS5wZW5kaW5nX2J1Zj1uZXcgb2QuQnVmOChhLnBlbmRpbmdfYnVmX3NpemUpLGEuZF9idWY9MSphLmxpdF9idWZzaXplLGEubF9idWY9MyphLmxpdF9idWZzaXplLGEubGV2ZWw9ZSxhLnN0cmF0ZWd5PW8sYS5tZXRob2Q9cixJZCh0KX1yZD1bbmV3IEFkKDAsMCwwLDAsKGZ1bmN0aW9uKHQsZSl7dmFyIHI9NjU1MzU7Zm9yKHI+dC5wZW5kaW5nX2J1Zl9zaXplLTUmJihyPXQucGVuZGluZ19idWZfc2l6ZS01KTs7KXtpZih0Lmxvb2thaGVhZDw9MSl7aWYoT2QodCksMD09PXQubG9va2FoZWFkJiYwPT09ZSlyZXR1cm4gMTtpZigwPT09dC5sb29rYWhlYWQpYnJlYWt9dC5zdHJzdGFydCs9dC5sb29rYWhlYWQsdC5sb29rYWhlYWQ9MDt2YXIgbj10LmJsb2NrX3N0YXJ0K3I7aWYoKDA9PT10LnN0cnN0YXJ0fHx0LnN0cnN0YXJ0Pj1uKSYmKHQubG9va2FoZWFkPXQuc3Ryc3RhcnQtbix0LnN0cnN0YXJ0PW4sYmQodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxO2lmKHQuc3Ryc3RhcnQtdC5ibG9ja19zdGFydD49dC53X3NpemUtZmQmJihiZCh0LCExKSwwPT09dC5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDF9cmV0dXJuIHQuaW5zZXJ0PTAsND09PWU/KGJkKHQsITApLDA9PT10LnN0cm0uYXZhaWxfb3V0PzM6NCk6KHQuc3Ryc3RhcnQ+dC5ibG9ja19zdGFydCYmKGJkKHQsITEpLHQuc3RybS5hdmFpbF9vdXQpLDEpfSkpLG5ldyBBZCg0LDQsOCw0LEVkKSxuZXcgQWQoNCw1LDE2LDgsRWQpLG5ldyBBZCg0LDYsMzIsMzIsRWQpLG5ldyBBZCg0LDQsMTYsMTYseGQpLG5ldyBBZCg4LDE2LDMyLDMyLHhkKSxuZXcgQWQoOCwxNiwxMjgsMTI4LHhkKSxuZXcgQWQoOCwzMiwxMjgsMjU2LHhkKSxuZXcgQWQoMzIsMTI4LDI1OCwxMDI0LHhkKSxuZXcgQWQoMzIsMjU4LDI1OCw0MDk2LHhkKV0sX2YuZGVmbGF0ZUluaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTGQodCxlLDgsMTUsOCwwKX0sX2YuZGVmbGF0ZUluaXQyPUxkLF9mLmRlZmxhdGVSZXNldD1JZCxfZi5kZWZsYXRlUmVzZXRLZWVwPVRkLF9mLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5zdGF0ZT8yIT09dC5zdGF0ZS53cmFwP2xkOih0LnN0YXRlLmd6aGVhZD1lLDApOmxkfSxfZi5kZWZsYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLG87aWYoIXR8fCF0LnN0YXRlfHxlPjV8fGU8MClyZXR1cm4gdD9nZCh0LGxkKTpsZDtpZihuPXQuc3RhdGUsIXQub3V0cHV0fHwhdC5pbnB1dCYmMCE9PXQuYXZhaWxfaW58fG4uc3RhdHVzPT09X2QmJjQhPT1lKXJldHVybiBnZCh0LDA9PT10LmF2YWlsX291dD8tNTpsZCk7aWYobi5zdHJtPXQscj1uLmxhc3RfZmx1c2gsbi5sYXN0X2ZsdXNoPWUsNDI9PT1uLnN0YXR1cylpZigyPT09bi53cmFwKXQuYWRsZXI9MCx3ZChuLDMxKSx3ZChuLDEzOSksd2Qobiw4KSxuLmd6aGVhZD8od2Qobiwobi5nemhlYWQudGV4dD8xOjApKyhuLmd6aGVhZC5oY3JjPzI6MCkrKG4uZ3poZWFkLmV4dHJhPzQ6MCkrKG4uZ3poZWFkLm5hbWU/ODowKSsobi5nemhlYWQuY29tbWVudD8xNjowKSksd2QobiwyNTUmbi5nemhlYWQudGltZSksd2QobixuLmd6aGVhZC50aW1lPj44JjI1NSksd2QobixuLmd6aGVhZC50aW1lPj4xNiYyNTUpLHdkKG4sbi5nemhlYWQudGltZT4+MjQmMjU1KSx3ZChuLDk9PT1uLmxldmVsPzI6bi5zdHJhdGVneT49Mnx8bi5sZXZlbDwyPzQ6MCksd2QobiwyNTUmbi5nemhlYWQub3MpLG4uZ3poZWFkLmV4dHJhJiZuLmd6aGVhZC5leHRyYS5sZW5ndGgmJih3ZChuLDI1NSZuLmd6aGVhZC5leHRyYS5sZW5ndGgpLHdkKG4sbi5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLG4uZ3poZWFkLmhjcmMmJih0LmFkbGVyPWNkKHQuYWRsZXIsbi5wZW5kaW5nX2J1ZixuLnBlbmRpbmcsMCkpLG4uZ3ppbmRleD0wLG4uc3RhdHVzPTY5KTood2QobiwwKSx3ZChuLDApLHdkKG4sMCksd2QobiwwKSx3ZChuLDApLHdkKG4sOT09PW4ubGV2ZWw/MjpuLnN0cmF0ZWd5Pj0yfHxuLmxldmVsPDI/NDowKSx3ZChuLDMpLG4uc3RhdHVzPXBkKTtlbHNle3ZhciBzPTgrKG4ud19iaXRzLTg8PDQpPDw4O3N8PShuLnN0cmF0ZWd5Pj0yfHxuLmxldmVsPDI/MDpuLmxldmVsPDY/MTo2PT09bi5sZXZlbD8yOjMpPDw2LDAhPT1uLnN0cnN0YXJ0JiYoc3w9MzIpLHMrPTMxLXMlMzEsbi5zdGF0dXM9cGQsU2QobixzKSwwIT09bi5zdHJzdGFydCYmKFNkKG4sdC5hZGxlcj4+PjE2KSxTZChuLDY1NTM1JnQuYWRsZXIpKSx0LmFkbGVyPTF9aWYoNjk9PT1uLnN0YXR1cylpZihuLmd6aGVhZC5leHRyYSl7Zm9yKGk9bi5wZW5kaW5nO24uZ3ppbmRleDwoNjU1MzUmbi5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKG4ucGVuZGluZyE9PW4ucGVuZGluZ19idWZfc2l6ZXx8KG4uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYodC5hZGxlcj1jZCh0LmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLHZkKHQpLGk9bi5wZW5kaW5nLG4ucGVuZGluZyE9PW4ucGVuZGluZ19idWZfc2l6ZSkpOyl3ZChuLDI1NSZuLmd6aGVhZC5leHRyYVtuLmd6aW5kZXhdKSxuLmd6aW5kZXgrKztuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKHQuYWRsZXI9Y2QodC5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSxuLmd6aW5kZXg9PT1uLmd6aGVhZC5leHRyYS5sZW5ndGgmJihuLmd6aW5kZXg9MCxuLnN0YXR1cz03Myl9ZWxzZSBuLnN0YXR1cz03MztpZig3Mz09PW4uc3RhdHVzKWlmKG4uZ3poZWFkLm5hbWUpe2k9bi5wZW5kaW5nO2Rve2lmKG4ucGVuZGluZz09PW4ucGVuZGluZ19idWZfc2l6ZSYmKG4uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYodC5hZGxlcj1jZCh0LmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLHZkKHQpLGk9bi5wZW5kaW5nLG4ucGVuZGluZz09PW4ucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31vPW4uZ3ppbmRleDxuLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmbi5nemhlYWQubmFtZS5jaGFyQ29kZUF0KG4uZ3ppbmRleCsrKTowLHdkKG4sbyl9d2hpbGUoMCE9PW8pO24uZ3poZWFkLmhjcmMmJm4ucGVuZGluZz5pJiYodC5hZGxlcj1jZCh0LmFkbGVyLG4ucGVuZGluZ19idWYsbi5wZW5kaW5nLWksaSkpLDA9PT1vJiYobi5nemluZGV4PTAsbi5zdGF0dXM9OTEpfWVsc2Ugbi5zdGF0dXM9OTE7aWYoOTE9PT1uLnN0YXR1cylpZihuLmd6aGVhZC5jb21tZW50KXtpPW4ucGVuZGluZztkb3tpZihuLnBlbmRpbmc9PT1uLnBlbmRpbmdfYnVmX3NpemUmJihuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKHQuYWRsZXI9Y2QodC5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSx2ZCh0KSxpPW4ucGVuZGluZyxuLnBlbmRpbmc9PT1uLnBlbmRpbmdfYnVmX3NpemUpKXtvPTE7YnJlYWt9bz1uLmd6aW5kZXg8bi5nemhlYWQuY29tbWVudC5sZW5ndGg/MjU1Jm4uZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChuLmd6aW5kZXgrKyk6MCx3ZChuLG8pfXdoaWxlKDAhPT1vKTtuLmd6aGVhZC5oY3JjJiZuLnBlbmRpbmc+aSYmKHQuYWRsZXI9Y2QodC5hZGxlcixuLnBlbmRpbmdfYnVmLG4ucGVuZGluZy1pLGkpKSwwPT09byYmKG4uc3RhdHVzPWRkKX1lbHNlIG4uc3RhdHVzPWRkO2lmKG4uc3RhdHVzPT09ZGQmJihuLmd6aGVhZC5oY3JjPyhuLnBlbmRpbmcrMj5uLnBlbmRpbmdfYnVmX3NpemUmJnZkKHQpLG4ucGVuZGluZysyPD1uLnBlbmRpbmdfYnVmX3NpemUmJih3ZChuLDI1NSZ0LmFkbGVyKSx3ZChuLHQuYWRsZXI+PjgmMjU1KSx0LmFkbGVyPTAsbi5zdGF0dXM9cGQpKTpuLnN0YXR1cz1wZCksMCE9PW4ucGVuZGluZyl7aWYodmQodCksMD09PXQuYXZhaWxfb3V0KXJldHVybiBuLmxhc3RfZmx1c2g9LTEsMH1lbHNlIGlmKDA9PT10LmF2YWlsX2luJiZtZChlKTw9bWQocikmJjQhPT1lKXJldHVybiBnZCh0LC01KTtpZihuLnN0YXR1cz09PV9kJiYwIT09dC5hdmFpbF9pbilyZXR1cm4gZ2QodCwtNSk7aWYoMCE9PXQuYXZhaWxfaW58fDAhPT1uLmxvb2thaGVhZHx8MCE9PWUmJm4uc3RhdHVzIT09X2Qpe3ZhciBhPTI9PT1uLnN0cmF0ZWd5P2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciByOzspe2lmKDA9PT10Lmxvb2thaGVhZCYmKE9kKHQpLDA9PT10Lmxvb2thaGVhZCkpe2lmKDA9PT1lKXJldHVybiAxO2JyZWFrfWlmKHQubWF0Y2hfbGVuZ3RoPTAscj1zZC5fdHJfdGFsbHkodCwwLHQud2luZG93W3Quc3Ryc3RhcnRdKSx0Lmxvb2thaGVhZC0tLHQuc3Ryc3RhcnQrKyxyJiYoYmQodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiB0Lmluc2VydD0wLDQ9PT1lPyhiZCh0LCEwKSwwPT09dC5zdHJtLmF2YWlsX291dD8zOjQpOnQubGFzdF9saXQmJihiZCh0LCExKSwwPT09dC5zdHJtLmF2YWlsX291dCk/MToyfShuLGUpOjM9PT1uLnN0cmF0ZWd5P2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvLHM9dC53aW5kb3c7Oyl7aWYodC5sb29rYWhlYWQ8PWhkKXtpZihPZCh0KSx0Lmxvb2thaGVhZDw9aGQmJjA9PT1lKXJldHVybiAxO2lmKDA9PT10Lmxvb2thaGVhZClicmVha31pZih0Lm1hdGNoX2xlbmd0aD0wLHQubG9va2FoZWFkPj0zJiZ0LnN0cnN0YXJ0PjAmJihuPXNbaT10LnN0cnN0YXJ0LTFdKT09PXNbKytpXSYmbj09PXNbKytpXSYmbj09PXNbKytpXSl7bz10LnN0cnN0YXJ0K2hkO2Rve313aGlsZShuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZuPT09c1srK2ldJiZpPG8pO3QubWF0Y2hfbGVuZ3RoPWhkLShvLWkpLHQubWF0Y2hfbGVuZ3RoPnQubG9va2FoZWFkJiYodC5tYXRjaF9sZW5ndGg9dC5sb29rYWhlYWQpfWlmKHQubWF0Y2hfbGVuZ3RoPj0zPyhyPXNkLl90cl90YWxseSh0LDEsdC5tYXRjaF9sZW5ndGgtMyksdC5sb29rYWhlYWQtPXQubWF0Y2hfbGVuZ3RoLHQuc3Ryc3RhcnQrPXQubWF0Y2hfbGVuZ3RoLHQubWF0Y2hfbGVuZ3RoPTApOihyPXNkLl90cl90YWxseSh0LDAsdC53aW5kb3dbdC5zdHJzdGFydF0pLHQubG9va2FoZWFkLS0sdC5zdHJzdGFydCsrKSxyJiYoYmQodCwhMSksMD09PXQuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiB0Lmluc2VydD0wLDQ9PT1lPyhiZCh0LCEwKSwwPT09dC5zdHJtLmF2YWlsX291dD8zOjQpOnQubGFzdF9saXQmJihiZCh0LCExKSwwPT09dC5zdHJtLmF2YWlsX291dCk/MToyfShuLGUpOnJkW24ubGV2ZWxdLmZ1bmMobixlKTtpZigzIT09YSYmNCE9PWF8fChuLnN0YXR1cz1fZCksMT09PWF8fDM9PT1hKXJldHVybiAwPT09dC5hdmFpbF9vdXQmJihuLmxhc3RfZmx1c2g9LTEpLDA7aWYoMj09PWEmJigxPT09ZT9zZC5fdHJfYWxpZ24obik6NSE9PWUmJihzZC5fdHJfc3RvcmVkX2Jsb2NrKG4sMCwwLCExKSwzPT09ZSYmKHlkKG4uaGVhZCksMD09PW4ubG9va2FoZWFkJiYobi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSkpLHZkKHQpLDA9PT10LmF2YWlsX291dCkpcmV0dXJuIG4ubGFzdF9mbHVzaD0tMSwwfXJldHVybiA0IT09ZT8wOm4ud3JhcDw9MD8xOigyPT09bi53cmFwPyh3ZChuLDI1NSZ0LmFkbGVyKSx3ZChuLHQuYWRsZXI+PjgmMjU1KSx3ZChuLHQuYWRsZXI+PjE2JjI1NSksd2Qobix0LmFkbGVyPj4yNCYyNTUpLHdkKG4sMjU1JnQudG90YWxfaW4pLHdkKG4sdC50b3RhbF9pbj4+OCYyNTUpLHdkKG4sdC50b3RhbF9pbj4+MTYmMjU1KSx3ZChuLHQudG90YWxfaW4+PjI0JjI1NSkpOihTZChuLHQuYWRsZXI+Pj4xNiksU2Qobiw2NTUzNSZ0LmFkbGVyKSksdmQodCksbi53cmFwPjAmJihuLndyYXA9LW4ud3JhcCksMCE9PW4ucGVuZGluZz8wOjEpfSxfZi5kZWZsYXRlRW5kPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPzQyIT09KGU9dC5zdGF0ZS5zdGF0dXMpJiY2OSE9PWUmJjczIT09ZSYmOTEhPT1lJiZlIT09ZGQmJmUhPT1wZCYmZSE9PV9kP2dkKHQsbGQpOih0LnN0YXRlPW51bGwsZT09PXBkP2dkKHQsLTMpOjApOmxkfSxfZi5kZWZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxvLHMsYSxjLHUsbD1lLmxlbmd0aDtpZighdHx8IXQuc3RhdGUpcmV0dXJuIGxkO2lmKDI9PT0obz0ocj10LnN0YXRlKS53cmFwKXx8MT09PW8mJjQyIT09ci5zdGF0dXN8fHIubG9va2FoZWFkKXJldHVybiBsZDtmb3IoMT09PW8mJih0LmFkbGVyPWFkKHQuYWRsZXIsZSxsLDApKSxyLndyYXA9MCxsPj1yLndfc2l6ZSYmKDA9PT1vJiYoeWQoci5oZWFkKSxyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApLHU9bmV3IG9kLkJ1Zjgoci53X3NpemUpLG9kLmFycmF5U2V0KHUsZSxsLXIud19zaXplLHIud19zaXplLDApLGU9dSxsPXIud19zaXplKSxzPXQuYXZhaWxfaW4sYT10Lm5leHRfaW4sYz10LmlucHV0LHQuYXZhaWxfaW49bCx0Lm5leHRfaW49MCx0LmlucHV0PWUsT2Qocik7ci5sb29rYWhlYWQ+PTM7KXtuPXIuc3Ryc3RhcnQsaT1yLmxvb2thaGVhZC0yO2Rve3IuaW5zX2g9KHIuaW5zX2g8PHIuaGFzaF9zaGlmdF5yLndpbmRvd1tuKzMtMV0pJnIuaGFzaF9tYXNrLHIucHJldltuJnIud19tYXNrXT1yLmhlYWRbci5pbnNfaF0sci5oZWFkW3IuaW5zX2hdPW4sbisrfXdoaWxlKC0taSk7ci5zdHJzdGFydD1uLHIubG9va2FoZWFkPTIsT2Qocil9cmV0dXJuIHIuc3Ryc3RhcnQrPXIubG9va2FoZWFkLHIuYmxvY2tfc3RhcnQ9ci5zdHJzdGFydCxyLmluc2VydD1yLmxvb2thaGVhZCxyLmxvb2thaGVhZD0wLHIubWF0Y2hfbGVuZ3RoPXIucHJldl9sZW5ndGg9MixyLm1hdGNoX2F2YWlsYWJsZT0wLHQubmV4dF9pbj1hLHQuaW5wdXQ9Yyx0LmF2YWlsX2luPXMsci53cmFwPW8sMH0sX2YuZGVmbGF0ZUluZm89InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiO3ZhciBCZD17fSxSZD1kZixOZD0hMCx6ZD0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2godG0pe05kPSExfXRyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKHRtKXt6ZD0hMX1mb3IodmFyIERkPW5ldyBSZC5CdWY4KDI1NiksUGQ9MDtQZDwyNTY7UGQrKylEZFtQZF09UGQ+PTI1Mj82OlBkPj0yNDg/NTpQZD49MjQwPzQ6UGQ+PTIyND8zOlBkPj0xOTI/MjoxO2Z1bmN0aW9uIE1kKHQsZSl7aWYoZTw2NTUzNCYmKHQuc3ViYXJyYXkmJnpkfHwhdC5zdWJhcnJheSYmTmQpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsUmQuc2hyaW5rQnVmKHQsZSkpO2Zvcih2YXIgcj0iIixuPTA7bjxlO24rKylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbbl0pO3JldHVybiByfURkWzI1NF09RGRbMjU0XT0xLEJkLnN0cmluZzJidWY9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxzPXQubGVuZ3RoLGE9MDtmb3IoaT0wO2k8cztpKyspNTUyOTY9PSg2NDUxMiYocj10LmNoYXJDb2RlQXQoaSkpKSYmaSsxPHMmJjU2MzIwPT0oNjQ1MTImKG49dC5jaGFyQ29kZUF0KGkrMSkpKSYmKHI9NjU1MzYrKHItNTUyOTY8PDEwKSsobi01NjMyMCksaSsrKSxhKz1yPDEyOD8xOnI8MjA0OD8yOnI8NjU1MzY/Mzo0O2ZvcihlPW5ldyBSZC5CdWY4KGEpLG89MCxpPTA7bzxhO2krKyk1NTI5Nj09KDY0NTEyJihyPXQuY2hhckNvZGVBdChpKSkpJiZpKzE8cyYmNTYzMjA9PSg2NDUxMiYobj10LmNoYXJDb2RlQXQoaSsxKSkpJiYocj02NTUzNisoci01NTI5Njw8MTApKyhuLTU2MzIwKSxpKyspLHI8MTI4P2VbbysrXT1yOnI8MjA0OD8oZVtvKytdPTE5MnxyPj4+NixlW28rK109MTI4fDYzJnIpOnI8NjU1MzY/KGVbbysrXT0yMjR8cj4+PjEyLGVbbysrXT0xMjh8cj4+PjYmNjMsZVtvKytdPTEyOHw2MyZyKTooZVtvKytdPTI0MHxyPj4+MTgsZVtvKytdPTEyOHxyPj4+MTImNjMsZVtvKytdPTEyOHxyPj4+NiY2MyxlW28rK109MTI4fDYzJnIpO3JldHVybiBlfSxCZC5idWYyYmluc3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBNZCh0LHQubGVuZ3RoKX0sQmQuYmluc3RyaW5nMmJ1Zj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IFJkLkJ1ZjgodC5sZW5ndGgpLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspZVtyXT10LmNoYXJDb2RlQXQocik7cmV0dXJuIGV9LEJkLmJ1ZjJzdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzPWV8fHQubGVuZ3RoLGE9bmV3IEFycmF5KDIqcyk7Zm9yKG49MCxyPTA7cjxzOylpZigoaT10W3IrK10pPDEyOClhW24rK109aTtlbHNlIGlmKChvPURkW2ldKT40KWFbbisrXT02NTUzMyxyKz1vLTE7ZWxzZXtmb3IoaSY9Mj09PW8/MzE6Mz09PW8/MTU6NztvPjEmJnI8czspaT1pPDw2fDYzJnRbcisrXSxvLS07bz4xP2FbbisrXT02NTUzMzppPDY1NTM2P2FbbisrXT1pOihpLT02NTUzNixhW24rK109NTUyOTZ8aT4+MTAmMTAyMyxhW24rK109NTYzMjB8MTAyMyZpKX1yZXR1cm4gTWQoYSxuKX0sQmQudXRmOGJvcmRlcj1mdW5jdGlvbih0LGUpe3ZhciByO2ZvcigoZT1lfHx0Lmxlbmd0aCk+dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxyPWUtMTtyPj0wJiYxMjg9PSgxOTImdFtyXSk7KXItLTtyZXR1cm4gcjwwfHwwPT09cj9lOnIrRGRbdFtyXV0+ZT9yOmV9O3ZhciBGZD1mdW5jdGlvbigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9LGpkPV9mLFVkPWRmLEhkPUJkLEpkPWlkLEtkPUZkLFdkPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gWmQodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgWmQpKXJldHVybiBuZXcgWmQodCk7dGhpcy5vcHRpb25zPVVkLmFzc2lnbih7bGV2ZWw6LTEsbWV0aG9kOjgsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTowLHRvOiIifSx0fHx7fSk7dmFyIGU9dGhpcy5vcHRpb25zO2UucmF3JiZlLndpbmRvd0JpdHM+MD9lLndpbmRvd0JpdHM9LWUud2luZG93Qml0czplLmd6aXAmJmUud2luZG93Qml0cz4wJiZlLndpbmRvd0JpdHM8MTYmJihlLndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBLZCx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIHI9amQuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSxlLmxldmVsLGUubWV0aG9kLGUud2luZG93Qml0cyxlLm1lbUxldmVsLGUuc3RyYXRlZ3kpO2lmKDAhPT1yKXRocm93IG5ldyBFcnJvcihKZFtyXSk7aWYoZS5oZWFkZXImJmpkLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLGUuaGVhZGVyKSxlLmRpY3Rpb25hcnkpe3ZhciBuO2lmKG49InN0cmluZyI9PXR5cGVvZiBlLmRpY3Rpb25hcnk/SGQuc3RyaW5nMmJ1ZihlLmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1XZC5jYWxsKGUuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkoZS5kaWN0aW9uYXJ5KTplLmRpY3Rpb25hcnksMCE9PShyPWpkLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxuKSkpdGhyb3cgbmV3IEVycm9yKEpkW3JdKTt0aGlzLl9kaWN0X3NldD0hMH19ZnVuY3Rpb24gR2QodCxlKXt2YXIgcj1uZXcgWmQoZSk7aWYoci5wdXNoKHQsITApLHIuZXJyKXRocm93IHIubXNnfHxKZFtyLmVycl07cmV0dXJuIHIucmVzdWx0fVpkLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPXRoaXMuc3RybSxvPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtuPWU9PT1+fmU/ZTohMD09PWU/NDowLCJzdHJpbmciPT10eXBlb2YgdD9pLmlucHV0PUhkLnN0cmluZzJidWYodCk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PVdkLmNhbGwodCk/aS5pbnB1dD1uZXcgVWludDhBcnJheSh0KTppLmlucHV0PXQsaS5uZXh0X2luPTAsaS5hdmFpbF9pbj1pLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09aS5hdmFpbF9vdXQmJihpLm91dHB1dD1uZXcgVWQuQnVmOChvKSxpLm5leHRfb3V0PTAsaS5hdmFpbF9vdXQ9byksMSE9PShyPWpkLmRlZmxhdGUoaSxuKSkmJjAhPT1yKXJldHVybiB0aGlzLm9uRW5kKHIpLHRoaXMuZW5kZWQ9ITAsITE7MCE9PWkuYXZhaWxfb3V0JiYoMCE9PWkuYXZhaWxfaW58fDQhPT1uJiYyIT09bil8fCgic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLm9uRGF0YShIZC5idWYyYmluc3RyaW5nKFVkLnNocmlua0J1ZihpLm91dHB1dCxpLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKFVkLnNocmlua0J1ZihpLm91dHB1dCxpLm5leHRfb3V0KSkpfXdoaWxlKChpLmF2YWlsX2luPjB8fDA9PT1pLmF2YWlsX291dCkmJjEhPT1yKTtyZXR1cm4gND09PW4/KHI9amQuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQociksdGhpcy5lbmRlZD0hMCwwPT09cik6MiE9PW58fCh0aGlzLm9uRW5kKDApLGkuYXZhaWxfb3V0PTAsITApfSxaZC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHQpe3RoaXMuY2h1bmtzLnB1c2godCl9LFpkLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXswPT09dCYmKCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PVVkLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj10LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LHBmLkRlZmxhdGU9WmQscGYuZGVmbGF0ZT1HZCxwZi5kZWZsYXRlUmF3PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8e30pLnJhdz0hMCxHZCh0LGUpfSxwZi5nemlwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8e30pLmd6aXA9ITAsR2QodCxlKX07dmFyIFZkPXt9LFhkPW90LFlkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZmxhZ3M7cmV0dXJuIHZvaWQgMCE9PWV8fCJmbGFncyJpbiBPbHx8d2wodCwiZmxhZ3MiKXx8IVNsKE9sLHQpP2U6Ymwoa2wsdCl9LCRkPVJlZ0V4cC5wcm90b3R5cGUscWQ9ZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0kZHx8WGQoJGQsdCk/WWQodCk6dC5mbGFnc30pKSxRZD17fSx0cD1kZixlcD0xNSxycD1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLG5wPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0saXA9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLG9wPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sc3A9ZGYsYXA9dGQsY3A9bmQsdXA9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYyx1LGwsaCxmLGQscCxfLGcsbSx5LHYsYix3LFMsayxPLEUseDtyPXQuc3RhdGUsbj10Lm5leHRfaW4sRT10LmlucHV0LGk9bisodC5hdmFpbF9pbi01KSxvPXQubmV4dF9vdXQseD10Lm91dHB1dCxzPW8tKGUtdC5hdmFpbF9vdXQpLGE9bysodC5hdmFpbF9vdXQtMjU3KSxjPXIuZG1heCx1PXIud3NpemUsbD1yLndoYXZlLGg9ci53bmV4dCxmPXIud2luZG93LGQ9ci5ob2xkLHA9ci5iaXRzLF89ci5sZW5jb2RlLGc9ci5kaXN0Y29kZSxtPSgxPDxyLmxlbmJpdHMpLTEseT0oMTw8ci5kaXN0Yml0cyktMTt0OmRve3A8MTUmJihkKz1FW24rK108PHAscCs9OCxkKz1FW24rK108PHAscCs9OCksdj1fW2QmbV07ZTpmb3IoOzspe2lmKGQ+Pj49Yj12Pj4+MjQscC09YiwwPT09KGI9dj4+PjE2JjI1NSkpeFtvKytdPTY1NTM1JnY7ZWxzZXtpZighKDE2JmIpKXtpZig2NCZiKXtpZigzMiZiKXtyLm1vZGU9MTI7YnJlYWsgdH10Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9MzA7YnJlYWsgdH12PV9bKDY1NTM1JnYpKyhkJigxPDxiKS0xKV07Y29udGludWUgZX1mb3Iodz02NTUzNSZ2LChiJj0xNSkmJihwPGImJihkKz1FW24rK108PHAscCs9OCksdys9ZCYoMTw8YiktMSxkPj4+PWIscC09YikscDwxNSYmKGQrPUVbbisrXTw8cCxwKz04LGQrPUVbbisrXTw8cCxwKz04KSx2PWdbZCZ5XTs7KXtpZihkPj4+PWI9dj4+PjI0LHAtPWIsMTYmKGI9dj4+PjE2JjI1NSkpe2lmKFM9NjU1MzUmdixwPChiJj0xNSkmJihkKz1FW24rK108PHAsKHArPTgpPGImJihkKz1FW24rK108PHAscCs9OCkpLChTKz1kJigxPDxiKS0xKT5jKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT0zMDticmVhayB0fWlmKGQ+Pj49YixwLT1iLFM+KGI9by1zKSl7aWYoKGI9Uy1iKT5sJiZyLnNhbmUpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPTMwO2JyZWFrIHR9aWYoaz0wLE89ZiwwPT09aCl7aWYoays9dS1iLGI8dyl7dy09Yjtkb3t4W28rK109ZltrKytdfXdoaWxlKC0tYik7az1vLVMsTz14fX1lbHNlIGlmKGg8Yil7aWYoays9dStoLWIsKGItPWgpPHcpe3ctPWI7ZG97eFtvKytdPWZbaysrXX13aGlsZSgtLWIpO2lmKGs9MCxoPHcpe3ctPWI9aDtkb3t4W28rK109ZltrKytdfXdoaWxlKC0tYik7az1vLVMsTz14fX19ZWxzZSBpZihrKz1oLWIsYjx3KXt3LT1iO2Rve3hbbysrXT1mW2srK119d2hpbGUoLS1iKTtrPW8tUyxPPXh9Zm9yKDt3PjI7KXhbbysrXT1PW2srK10seFtvKytdPU9baysrXSx4W28rK109T1trKytdLHctPTM7dyYmKHhbbysrXT1PW2srK10sdz4xJiYoeFtvKytdPU9baysrXSkpfWVsc2V7az1vLVM7ZG97eFtvKytdPXhbaysrXSx4W28rK109eFtrKytdLHhbbysrXT14W2srK10sdy09M313aGlsZSh3PjIpO3cmJih4W28rK109eFtrKytdLHc+MSYmKHhbbysrXT14W2srK10pKX1icmVha31pZig2NCZiKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixyLm1vZGU9MzA7YnJlYWsgdH12PWdbKDY1NTM1JnYpKyhkJigxPDxiKS0xKV19fWJyZWFrfX13aGlsZShuPGkmJm88YSk7bi09dz1wPj4zLGQmPSgxPDwocC09dzw8MykpLTEsdC5uZXh0X2luPW4sdC5uZXh0X291dD1vLHQuYXZhaWxfaW49bjxpP2ktbis1OjUtKG4taSksdC5hdmFpbF9vdXQ9bzxhP2EtbysyNTc6MjU3LShvLWEpLHIuaG9sZD1kLHIuYml0cz1wfSxscD1mdW5jdGlvbih0LGUscixuLGksbyxzLGEpe3ZhciBjLHUsbCxoLGYsZCxwLF8sZyxtPWEuYml0cyx5PTAsdj0wLGI9MCx3PTAsUz0wLGs9MCxPPTAsRT0wLHg9MCxBPTAsQz1udWxsLFQ9MCxJPW5ldyB0cC5CdWYxNigxNiksTD1uZXcgdHAuQnVmMTYoMTYpLEI9bnVsbCxSPTA7Zm9yKHk9MDt5PD1lcDt5KyspSVt5XT0wO2Zvcih2PTA7djxuO3YrKylJW2Vbcit2XV0rKztmb3IoUz1tLHc9ZXA7dz49MSYmMD09PUlbd107dy0tKTtpZihTPncmJihTPXcpLDA9PT13KXJldHVybiBpW28rK109MjA5NzE1MjAsaVtvKytdPTIwOTcxNTIwLGEuYml0cz0xLDA7Zm9yKGI9MTtiPHcmJjA9PT1JW2JdO2IrKyk7Zm9yKFM8YiYmKFM9YiksRT0xLHk9MTt5PD1lcDt5KyspaWYoRTw8PTEsKEUtPUlbeV0pPDApcmV0dXJuLTE7aWYoRT4wJiYoMD09PXR8fDEhPT13KSlyZXR1cm4tMTtmb3IoTFsxXT0wLHk9MTt5PGVwO3krKylMW3krMV09TFt5XStJW3ldO2Zvcih2PTA7djxuO3YrKykwIT09ZVtyK3ZdJiYoc1tMW2Vbcit2XV0rK109dik7aWYoMD09PXQ/KEM9Qj1zLGQ9MTkpOjE9PT10PyhDPXJwLFQtPTI1NyxCPW5wLFItPTI1NyxkPTI1Nik6KEM9aXAsQj1vcCxkPS0xKSxBPTAsdj0wLHk9YixmPW8saz1TLE89MCxsPS0xLGg9KHg9MTw8UyktMSwxPT09dCYmeD44NTJ8fDI9PT10JiZ4PjU5MilyZXR1cm4gMTtmb3IoOzspe3A9eS1PLHNbdl08ZD8oXz0wLGc9c1t2XSk6c1t2XT5kPyhfPUJbUitzW3ZdXSxnPUNbVCtzW3ZdXSk6KF89OTYsZz0wKSxjPTE8PHktTyxiPXU9MTw8aztkb3tpW2YrKEE+Pk8pKyh1LT1jKV09cDw8MjR8Xzw8MTZ8Z313aGlsZSgwIT09dSk7Zm9yKGM9MTw8eS0xO0EmYzspYz4+PTE7aWYoMCE9PWM/KEEmPWMtMSxBKz1jKTpBPTAsdisrLDA9PS0tSVt5XSl7aWYoeT09PXcpYnJlYWs7eT1lW3Irc1t2XV19aWYoeT5TJiYoQSZoKSE9PWwpe2ZvcigwPT09TyYmKE89UyksZis9YixFPTE8PChrPXktTyk7aytPPHcmJiEoKEUtPUlbaytPXSk8PTApOylrKyssRTw8PTE7aWYoeCs9MTw8aywxPT09dCYmeD44NTJ8fDI9PT10JiZ4PjU5MilyZXR1cm4gMTtpW2w9QSZoXT1TPDwyNHxrPDwxNnxmLW99fXJldHVybiAwIT09QSYmKGlbZitBXT15LU88PDI0fDY0PDwxNiksYS5iaXRzPVMsMH0saHA9LTIsZnA9MTIsZHA9MzA7ZnVuY3Rpb24gcHAodCl7cmV0dXJuKHQ+Pj4yNCYyNTUpKyh0Pj4+OCY2NTI4MCkrKCg2NTI4MCZ0KTw8OCkrKCgyNTUmdCk8PDI0KX1mdW5jdGlvbiBfcCgpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgc3AuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IHNwLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIGdwKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPyhlPXQuc3RhdGUsdC50b3RhbF9pbj10LnRvdGFsX291dD1lLnRvdGFsPTAsdC5tc2c9IiIsZS53cmFwJiYodC5hZGxlcj0xJmUud3JhcCksZS5tb2RlPTEsZS5sYXN0PTAsZS5oYXZlZGljdD0wLGUuZG1heD0zMjc2OCxlLmhlYWQ9bnVsbCxlLmhvbGQ9MCxlLmJpdHM9MCxlLmxlbmNvZGU9ZS5sZW5keW49bmV3IHNwLkJ1ZjMyKDg1MiksZS5kaXN0Y29kZT1lLmRpc3RkeW49bmV3IHNwLkJ1ZjMyKDU5MiksZS5zYW5lPTEsZS5iYWNrPS0xLDApOmhwfWZ1bmN0aW9uIG1wKHQpe3ZhciBlO3JldHVybiB0JiZ0LnN0YXRlPygoZT10LnN0YXRlKS53c2l6ZT0wLGUud2hhdmU9MCxlLnduZXh0PTAsZ3AodCkpOmhwfWZ1bmN0aW9uIHlwKHQsZSl7dmFyIHIsbjtyZXR1cm4gdCYmdC5zdGF0ZT8obj10LnN0YXRlLGU8MD8ocj0wLGU9LWUpOihyPTErKGU+PjQpLGU8NDgmJihlJj0xNSkpLGUmJihlPDh8fGU+MTUpP2hwOihudWxsIT09bi53aW5kb3cmJm4ud2JpdHMhPT1lJiYobi53aW5kb3c9bnVsbCksbi53cmFwPXIsbi53Yml0cz1lLG1wKHQpKSk6aHB9ZnVuY3Rpb24gdnAodCxlKXt2YXIgcixuO3JldHVybiB0PyhuPW5ldyBfcCx0LnN0YXRlPW4sbi53aW5kb3c9bnVsbCwwIT09KHI9eXAodCxlKSkmJih0LnN0YXRlPW51bGwpLHIpOmhwfXZhciBicCx3cCxTcD0hMDtmdW5jdGlvbiBrcCh0KXtpZihTcCl7dmFyIGU7Zm9yKGJwPW5ldyBzcC5CdWYzMig1MTIpLHdwPW5ldyBzcC5CdWYzMigzMiksZT0wO2U8MTQ0Oyl0LmxlbnNbZSsrXT04O2Zvcig7ZTwyNTY7KXQubGVuc1tlKytdPTk7Zm9yKDtlPDI4MDspdC5sZW5zW2UrK109Nztmb3IoO2U8Mjg4Oyl0LmxlbnNbZSsrXT04O2ZvcihscCgxLHQubGVucywwLDI4OCxicCwwLHQud29yayx7Yml0czo5fSksZT0wO2U8MzI7KXQubGVuc1tlKytdPTU7bHAoMix0LmxlbnMsMCwzMix3cCwwLHQud29yayx7Yml0czo1fSksU3A9ITF9dC5sZW5jb2RlPWJwLHQubGVuYml0cz05LHQuZGlzdGNvZGU9d3AsdC5kaXN0Yml0cz01fWZ1bmN0aW9uIE9wKHQsZSxyLG4pe3ZhciBpLG89dC5zdGF0ZTtyZXR1cm4gbnVsbD09PW8ud2luZG93JiYoby53c2l6ZT0xPDxvLndiaXRzLG8ud25leHQ9MCxvLndoYXZlPTAsby53aW5kb3c9bmV3IHNwLkJ1Zjgoby53c2l6ZSkpLG4+PW8ud3NpemU/KHNwLmFycmF5U2V0KG8ud2luZG93LGUsci1vLndzaXplLG8ud3NpemUsMCksby53bmV4dD0wLG8ud2hhdmU9by53c2l6ZSk6KChpPW8ud3NpemUtby53bmV4dCk+biYmKGk9biksc3AuYXJyYXlTZXQoby53aW5kb3csZSxyLW4saSxvLnduZXh0KSwobi09aSk/KHNwLmFycmF5U2V0KG8ud2luZG93LGUsci1uLG4sMCksby53bmV4dD1uLG8ud2hhdmU9by53c2l6ZSk6KG8ud25leHQrPWksby53bmV4dD09PW8ud3NpemUmJihvLnduZXh0PTApLG8ud2hhdmU8by53c2l6ZSYmKG8ud2hhdmUrPWkpKSksMH1RZC5pbmZsYXRlUmVzZXQ9bXAsUWQuaW5mbGF0ZVJlc2V0Mj15cCxRZC5pbmZsYXRlUmVzZXRLZWVwPWdwLFFkLmluZmxhdGVJbml0PWZ1bmN0aW9uKHQpe3JldHVybiB2cCh0LDE1KX0sUWQuaW5mbGF0ZUluaXQyPXZwLFFkLmluZmxhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGEsYyx1LGwsaCxmLGQscCxfLGcsbSx5LHYsYix3LFMsayxPLEUseD0wLEE9bmV3IHNwLkJ1ZjgoNCksQz1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIXR8fCF0LnN0YXRlfHwhdC5vdXRwdXR8fCF0LmlucHV0JiYwIT09dC5hdmFpbF9pbilyZXR1cm4gaHA7KHI9dC5zdGF0ZSkubW9kZT09PWZwJiYoci5tb2RlPTEzKSxzPXQubmV4dF9vdXQsaT10Lm91dHB1dCxjPXQuYXZhaWxfb3V0LG89dC5uZXh0X2luLG49dC5pbnB1dCxhPXQuYXZhaWxfaW4sdT1yLmhvbGQsbD1yLmJpdHMsaD1hLGY9YyxrPTA7dDpmb3IoOzspc3dpdGNoKHIubW9kZSl7Y2FzZSAxOmlmKDA9PT1yLndyYXApe3IubW9kZT0xMzticmVha31mb3IoO2w8MTY7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZigyJnIud3JhcCYmMzU2MTU9PT11KXtyLmNoZWNrPTAsQVswXT0yNTUmdSxBWzFdPXU+Pj44JjI1NSxyLmNoZWNrPWNwKHIuY2hlY2ssQSwyLDApLHU9MCxsPTAsci5tb2RlPTI7YnJlYWt9aWYoci5mbGFncz0wLHIuaGVhZCYmKHIuaGVhZC5kb25lPSExKSwhKDEmci53cmFwKXx8KCgoMjU1JnUpPDw4KSsodT4+OCkpJTMxKXt0Lm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsci5tb2RlPWRwO2JyZWFrfWlmKDghPSgxNSZ1KSl7dC5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixyLm1vZGU9ZHA7YnJlYWt9aWYobC09NCxTPTgrKDE1Jih1Pj4+PTQpKSwwPT09ci53Yml0cylyLndiaXRzPVM7ZWxzZSBpZihTPnIud2JpdHMpe3QubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixyLm1vZGU9ZHA7YnJlYWt9ci5kbWF4PTE8PFMsdC5hZGxlcj1yLmNoZWNrPTEsci5tb2RlPTUxMiZ1PzEwOmZwLHU9MCxsPTA7YnJlYWs7Y2FzZSAyOmZvcig7bDwxNjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWlmKHIuZmxhZ3M9dSw4IT0oMjU1JnFkKHIpKSl7dC5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixyLm1vZGU9ZHA7YnJlYWt9aWYoNTczNDQmcWQocikpe3QubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLHIubW9kZT1kcDticmVha31yLmhlYWQmJihyLmhlYWQudGV4dD11Pj44JjEpLDUxMiZxZChyKSYmKEFbMF09MjU1JnUsQVsxXT11Pj4+OCYyNTUsci5jaGVjaz1jcChyLmNoZWNrLEEsMiwwKSksdT0wLGw9MCxyLm1vZGU9MztjYXNlIDM6Zm9yKDtsPDMyOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5oZWFkJiYoci5oZWFkLnRpbWU9dSksNTEyJnFkKHIpJiYoQVswXT0yNTUmdSxBWzFdPXU+Pj44JjI1NSxBWzJdPXU+Pj4xNiYyNTUsQVszXT11Pj4+MjQmMjU1LHIuY2hlY2s9Y3Aoci5jaGVjayxBLDQsMCkpLHU9MCxsPTAsci5tb2RlPTQ7Y2FzZSA0OmZvcig7bDwxNjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fXIuaGVhZCYmKHIuaGVhZC54ZmxhZ3M9MjU1JnUsci5oZWFkLm9zPXU+PjgpLDUxMiZxZChyKSYmKEFbMF09MjU1JnUsQVsxXT11Pj4+OCYyNTUsci5jaGVjaz1jcChyLmNoZWNrLEEsMiwwKSksdT0wLGw9MCxyLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCZxZChyKSl7Zm9yKDtsPDE2Oyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5sZW5ndGg9dSxyLmhlYWQmJihyLmhlYWQuZXh0cmFfbGVuPXUpLDUxMiZxZChyKSYmKEFbMF09MjU1JnUsQVsxXT11Pj4+OCYyNTUsci5jaGVjaz1jcChyLmNoZWNrLEEsMiwwKSksdT0wLGw9MH1lbHNlIHIuaGVhZCYmKHIuaGVhZC5leHRyYT1udWxsKTtyLm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZxZChyKSYmKChkPXIubGVuZ3RoKT5hJiYoZD1hKSxkJiYoci5oZWFkJiYoUz1yLmhlYWQuZXh0cmFfbGVuLXIubGVuZ3RoLHIuaGVhZC5leHRyYXx8KHIuaGVhZC5leHRyYT1uZXcgQXJyYXkoci5oZWFkLmV4dHJhX2xlbikpLHNwLmFycmF5U2V0KHIuaGVhZC5leHRyYSxuLG8sZCxTKSksNTEyJnFkKHIpJiYoci5jaGVjaz1jcChyLmNoZWNrLG4sZCxvKSksYS09ZCxvKz1kLHIubGVuZ3RoLT1kKSxyLmxlbmd0aCkpYnJlYWsgdDtyLmxlbmd0aD0wLHIubW9kZT03O2Nhc2UgNzppZigyMDQ4JnFkKHIpKXtpZigwPT09YSlicmVhayB0O2Q9MDtkb3tTPW5bbytkKytdLHIuaGVhZCYmUyYmci5sZW5ndGg8NjU1MzYmJihyLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShTKSl9d2hpbGUoUyYmZDxhKTtpZig1MTImcWQocikmJihyLmNoZWNrPWNwKHIuY2hlY2ssbixkLG8pKSxhLT1kLG8rPWQsUylicmVhayB0fWVsc2Ugci5oZWFkJiYoci5oZWFkLm5hbWU9bnVsbCk7ci5sZW5ndGg9MCxyLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZxZChyKSl7aWYoMD09PWEpYnJlYWsgdDtkPTA7ZG97Uz1uW28rZCsrXSxyLmhlYWQmJlMmJnIubGVuZ3RoPDY1NTM2JiYoci5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoUykpfXdoaWxlKFMmJmQ8YSk7aWYoNTEyJnFkKHIpJiYoci5jaGVjaz1jcChyLmNoZWNrLG4sZCxvKSksYS09ZCxvKz1kLFMpYnJlYWsgdH1lbHNlIHIuaGVhZCYmKHIuaGVhZC5jb21tZW50PW51bGwpO3IubW9kZT05O2Nhc2UgOTppZig1MTImcWQocikpe2Zvcig7bDwxNjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWlmKHUhPT0oNjU1MzUmci5jaGVjaykpe3QubXNnPSJoZWFkZXIgY3JjIG1pc21hdGNoIixyLm1vZGU9ZHA7YnJlYWt9dT0wLGw9MH1yLmhlYWQmJihyLmhlYWQuaGNyYz1xZChyKT4+OSYxLHIuaGVhZC5kb25lPSEwKSx0LmFkbGVyPXIuY2hlY2s9MCxyLm1vZGU9ZnA7YnJlYWs7Y2FzZSAxMDpmb3IoO2w8MzI7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH10LmFkbGVyPXIuY2hlY2s9cHAodSksdT0wLGw9MCxyLm1vZGU9MTE7Y2FzZSAxMTppZigwPT09ci5oYXZlZGljdClyZXR1cm4gdC5uZXh0X291dD1zLHQuYXZhaWxfb3V0PWMsdC5uZXh0X2luPW8sdC5hdmFpbF9pbj1hLHIuaG9sZD11LHIuYml0cz1sLDI7dC5hZGxlcj1yLmNoZWNrPTEsci5tb2RlPWZwO2Nhc2UgZnA6aWYoNT09PWV8fDY9PT1lKWJyZWFrIHQ7Y2FzZSAxMzppZihyLmxhc3Qpe3U+Pj49NyZsLGwtPTcmbCxyLm1vZGU9Mjc7YnJlYWt9Zm9yKDtsPDM7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1zd2l0Y2goci5sYXN0PTEmdSxsLT0xLDMmKHU+Pj49MSkpe2Nhc2UgMDpyLm1vZGU9MTQ7YnJlYWs7Y2FzZSAxOmlmKGtwKHIpLHIubW9kZT0yMCw2PT09ZSl7dT4+Pj0yLGwtPTI7YnJlYWsgdH1icmVhaztjYXNlIDI6ci5tb2RlPTE3O2JyZWFrO2Nhc2UgMzp0Lm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixyLm1vZGU9ZHB9dT4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSAxNDpmb3IodT4+Pj03JmwsbC09NyZsO2w8MzI7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZigoNjU1MzUmdSkhPSh1Pj4+MTZeNjU1MzUpKXt0Lm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsci5tb2RlPWRwO2JyZWFrfWlmKHIubGVuZ3RoPTY1NTM1JnUsdT0wLGw9MCxyLm1vZGU9MTUsNj09PWUpYnJlYWsgdDtjYXNlIDE1OnIubW9kZT0xNjtjYXNlIDE2OmlmKGQ9ci5sZW5ndGgpe2lmKGQ+YSYmKGQ9YSksZD5jJiYoZD1jKSwwPT09ZClicmVhayB0O3NwLmFycmF5U2V0KGksbixvLGQscyksYS09ZCxvKz1kLGMtPWQscys9ZCxyLmxlbmd0aC09ZDticmVha31yLm1vZGU9ZnA7YnJlYWs7Y2FzZSAxNzpmb3IoO2w8MTQ7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZihyLm5sZW49MjU3KygzMSZ1KSx1Pj4+PTUsbC09NSxyLm5kaXN0PTErKDMxJnUpLHU+Pj49NSxsLT01LHIubmNvZGU9NCsoMTUmdSksdT4+Pj00LGwtPTQsci5ubGVuPjI4Nnx8ci5uZGlzdD4zMCl7dC5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixyLm1vZGU9ZHA7YnJlYWt9ci5oYXZlPTAsci5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtyLmhhdmU8ci5uY29kZTspe2Zvcig7bDwzOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5sZW5zW0Nbci5oYXZlKytdXT03JnUsdT4+Pj0zLGwtPTN9Zm9yKDtyLmhhdmU8MTk7KXIubGVuc1tDW3IuaGF2ZSsrXV09MDtpZihyLmxlbmNvZGU9ci5sZW5keW4sci5sZW5iaXRzPTcsTz17Yml0czpyLmxlbmJpdHN9LGs9bHAoMCxyLmxlbnMsMCwxOSxyLmxlbmNvZGUsMCxyLndvcmssTyksci5sZW5iaXRzPU8uYml0cyxrKXt0Lm1zZz0iaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IixyLm1vZGU9ZHA7YnJlYWt9ci5oYXZlPTAsci5tb2RlPTE5O2Nhc2UgMTk6Zm9yKDtyLmhhdmU8ci5ubGVuK3IubmRpc3Q7KXtmb3IoO209KHg9ci5sZW5jb2RlW3UmKDE8PHIubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmeCwhKChnPXg+Pj4yNCk8PWwpOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9aWYoeTwxNil1Pj4+PWcsbC09ZyxyLmxlbnNbci5oYXZlKytdPXk7ZWxzZXtpZigxNj09PXkpe2ZvcihFPWcrMjtsPEU7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1pZih1Pj4+PWcsbC09ZywwPT09ci5oYXZlKXt0Lm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsci5tb2RlPWRwO2JyZWFrfVM9ci5sZW5zW3IuaGF2ZS0xXSxkPTMrKDMmdSksdT4+Pj0yLGwtPTJ9ZWxzZSBpZigxNz09PXkpe2ZvcihFPWcrMztsPEU7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH1sLT1nLFM9MCxkPTMrKDcmKHU+Pj49ZykpLHU+Pj49MyxsLT0zfWVsc2V7Zm9yKEU9Zys3O2w8RTspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWwtPWcsUz0wLGQ9MTErKDEyNyYodT4+Pj1nKSksdT4+Pj03LGwtPTd9aWYoci5oYXZlK2Q+ci5ubGVuK3IubmRpc3Qpe3QubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixyLm1vZGU9ZHA7YnJlYWt9Zm9yKDtkLS07KXIubGVuc1tyLmhhdmUrK109U319aWYoci5tb2RlPT09ZHApYnJlYWs7aWYoMD09PXIubGVuc1syNTZdKXt0Lm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixyLm1vZGU9ZHA7YnJlYWt9aWYoci5sZW5iaXRzPTksTz17Yml0czpyLmxlbmJpdHN9LGs9bHAoMSxyLmxlbnMsMCxyLm5sZW4sci5sZW5jb2RlLDAsci53b3JrLE8pLHIubGVuYml0cz1PLmJpdHMsayl7dC5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsci5tb2RlPWRwO2JyZWFrfWlmKHIuZGlzdGJpdHM9NixyLmRpc3Rjb2RlPXIuZGlzdGR5bixPPXtiaXRzOnIuZGlzdGJpdHN9LGs9bHAoMixyLmxlbnMsci5ubGVuLHIubmRpc3Qsci5kaXN0Y29kZSwwLHIud29yayxPKSxyLmRpc3RiaXRzPU8uYml0cyxrKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixyLm1vZGU9ZHA7YnJlYWt9aWYoci5tb2RlPTIwLDY9PT1lKWJyZWFrIHQ7Y2FzZSAyMDpyLm1vZGU9MjE7Y2FzZSAyMTppZihhPj02JiZjPj0yNTgpe3QubmV4dF9vdXQ9cyx0LmF2YWlsX291dD1jLHQubmV4dF9pbj1vLHQuYXZhaWxfaW49YSxyLmhvbGQ9dSxyLmJpdHM9bCx1cCh0LGYpLHM9dC5uZXh0X291dCxpPXQub3V0cHV0LGM9dC5hdmFpbF9vdXQsbz10Lm5leHRfaW4sbj10LmlucHV0LGE9dC5hdmFpbF9pbix1PXIuaG9sZCxsPXIuYml0cyxyLm1vZGU9PT1mcCYmKHIuYmFjaz0tMSk7YnJlYWt9Zm9yKHIuYmFjaz0wO209KHg9ci5sZW5jb2RlW3UmKDE8PHIubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmeCwhKChnPXg+Pj4yNCk8PWwpOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9aWYobSYmISgyNDAmbSkpe2Zvcih2PWcsYj1tLHc9eTttPSh4PXIubGVuY29kZVt3KygodSYoMTw8ditiKS0xKT4+dildKT4+PjE2JjI1NSx5PTY1NTM1JngsISh2KyhnPXg+Pj4yNCk8PWwpOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9dT4+Pj12LGwtPXYsci5iYWNrKz12fWlmKHU+Pj49ZyxsLT1nLHIuYmFjays9ZyxyLmxlbmd0aD15LDA9PT1tKXtyLm1vZGU9MjY7YnJlYWt9aWYoMzImbSl7ci5iYWNrPS0xLHIubW9kZT1mcDticmVha31pZig2NCZtKXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9ZHA7YnJlYWt9ci5leHRyYT0xNSZtLHIubW9kZT0yMjtjYXNlIDIyOmlmKHIuZXh0cmEpe2ZvcihFPXIuZXh0cmE7bDxFOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9ci5sZW5ndGgrPXUmKDE8PHIuZXh0cmEpLTEsdT4+Pj1yLmV4dHJhLGwtPXIuZXh0cmEsci5iYWNrKz1yLmV4dHJhfXIud2FzPXIubGVuZ3RoLHIubW9kZT0yMztjYXNlIDIzOmZvcig7bT0oeD1yLmRpc3Rjb2RlW3UmKDE8PHIuZGlzdGJpdHMpLTFdKT4+PjE2JjI1NSx5PTY1NTM1JngsISgoZz14Pj4+MjQpPD1sKTspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fWlmKCEoMjQwJm0pKXtmb3Iodj1nLGI9bSx3PXk7bT0oeD1yLmRpc3Rjb2RlW3crKCh1JigxPDx2K2IpLTEpPj52KV0pPj4+MTYmMjU1LHk9NjU1MzUmeCwhKHYrKGc9eD4+PjI0KTw9bCk7KXtpZigwPT09YSlicmVhayB0O2EtLSx1Kz1uW28rK108PGwsbCs9OH11Pj4+PXYsbC09dixyLmJhY2srPXZ9aWYodT4+Pj1nLGwtPWcsci5iYWNrKz1nLDY0Jm0pe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHIubW9kZT1kcDticmVha31yLm9mZnNldD15LHIuZXh0cmE9MTUmbSxyLm1vZGU9MjQ7Y2FzZSAyNDppZihyLmV4dHJhKXtmb3IoRT1yLmV4dHJhO2w8RTspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHUrPW5bbysrXTw8bCxsKz04fXIub2Zmc2V0Kz11JigxPDxyLmV4dHJhKS0xLHU+Pj49ci5leHRyYSxsLT1yLmV4dHJhLHIuYmFjays9ci5leHRyYX1pZihyLm9mZnNldD5yLmRtYXgpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPWRwO2JyZWFrfXIubW9kZT0yNTtjYXNlIDI1OmlmKDA9PT1jKWJyZWFrIHQ7aWYoZD1mLWMsci5vZmZzZXQ+ZCl7aWYoKGQ9ci5vZmZzZXQtZCk+ci53aGF2ZSYmci5zYW5lKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHIubW9kZT1kcDticmVha31kPnIud25leHQ/KGQtPXIud25leHQscD1yLndzaXplLWQpOnA9ci53bmV4dC1kLGQ+ci5sZW5ndGgmJihkPXIubGVuZ3RoKSxfPXIud2luZG93fWVsc2UgXz1pLHA9cy1yLm9mZnNldCxkPXIubGVuZ3RoO2Q+YyYmKGQ9YyksYy09ZCxyLmxlbmd0aC09ZDtkb3tpW3MrK109X1twKytdfXdoaWxlKC0tZCk7MD09PXIubGVuZ3RoJiYoci5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT1jKWJyZWFrIHQ7aVtzKytdPXIubGVuZ3RoLGMtLSxyLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihyLndyYXApe2Zvcig7bDwzMjspe2lmKDA9PT1hKWJyZWFrIHQ7YS0tLHV8PW5bbysrXTw8bCxsKz04fWlmKGYtPWMsdC50b3RhbF9vdXQrPWYsci50b3RhbCs9ZixmJiYodC5hZGxlcj1yLmNoZWNrPXFkKHIpP2NwKHIuY2hlY2ssaSxmLHMtZik6YXAoci5jaGVjayxpLGYscy1mKSksZj1jLChxZChyKT91OnBwKHUpKSE9PXIuY2hlY2spe3QubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsci5tb2RlPWRwO2JyZWFrfXU9MCxsPTB9ci5tb2RlPTI4O2Nhc2UgMjg6aWYoci53cmFwJiZxZChyKSl7Zm9yKDtsPDMyOyl7aWYoMD09PWEpYnJlYWsgdDthLS0sdSs9bltvKytdPDxsLGwrPTh9aWYodSE9PSg0Mjk0OTY3Mjk1JnIudG90YWwpKXt0Lm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsci5tb2RlPWRwO2JyZWFrfXU9MCxsPTB9ci5tb2RlPTI5O2Nhc2UgMjk6az0xO2JyZWFrIHQ7Y2FzZSBkcDprPS0zO2JyZWFrIHQ7Y2FzZSAzMTpyZXR1cm4tNDtkZWZhdWx0OnJldHVybiBocH1yZXR1cm4gdC5uZXh0X291dD1zLHQuYXZhaWxfb3V0PWMsdC5uZXh0X2luPW8sdC5hdmFpbF9pbj1hLHIuaG9sZD11LHIuYml0cz1sLChyLndzaXplfHxmIT09dC5hdmFpbF9vdXQmJnIubW9kZTxkcCYmKHIubW9kZTwyN3x8NCE9PWUpKSYmT3AodCx0Lm91dHB1dCx0Lm5leHRfb3V0LGYtdC5hdmFpbF9vdXQpLGgtPXQuYXZhaWxfaW4sZi09dC5hdmFpbF9vdXQsdC50b3RhbF9pbis9aCx0LnRvdGFsX291dCs9ZixyLnRvdGFsKz1mLHIud3JhcCYmZiYmKHQuYWRsZXI9ci5jaGVjaz1xZChyKT9jcChyLmNoZWNrLGksZix0Lm5leHRfb3V0LWYpOmFwKHIuY2hlY2ssaSxmLHQubmV4dF9vdXQtZikpLHQuZGF0YV90eXBlPXIuYml0cysoci5sYXN0PzY0OjApKyhyLm1vZGU9PT1mcD8xMjg6MCkrKDIwPT09ci5tb2RlfHwxNT09PXIubW9kZT8yNTY6MCksKDA9PT1oJiYwPT09Znx8ND09PWUpJiYwPT09ayYmKGs9LTUpLGt9LFFkLmluZmxhdGVFbmQ9ZnVuY3Rpb24odCl7aWYoIXR8fCF0LnN0YXRlKXJldHVybiBocDt2YXIgZT10LnN0YXRlO3JldHVybiBlLndpbmRvdyYmKGUud2luZG93PW51bGwpLHQuc3RhdGU9bnVsbCwwfSxRZC5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHQmJnQuc3RhdGUmJjImKHI9dC5zdGF0ZSkud3JhcD8oci5oZWFkPWUsZS5kb25lPSExLDApOmhwfSxRZC5pbmZsYXRlU2V0RGljdGlvbmFyeT1mdW5jdGlvbih0LGUpe3ZhciByLG49ZS5sZW5ndGg7cmV0dXJuIHQmJnQuc3RhdGU/MCE9PShyPXQuc3RhdGUpLndyYXAmJjExIT09ci5tb2RlP2hwOjExPT09ci5tb2RlJiZhcCgxLGUsbiwwKSE9PXIuY2hlY2s/LTM6T3AodCxlLG4sbik/KHIubW9kZT0zMSwtNCk6KHIuaGF2ZWRpY3Q9MSwwKTpocH0sUWQuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiO3ZhciBFcD17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fTt2YXIgeHA9UWQsQXA9ZGYsQ3A9QmQsVHA9RXAsSXA9aWQsTHA9RmQsQnA9ZnVuY3Rpb24oKXt0aGlzLnRleHQ9MCx0aGlzLnRpbWU9MCx0aGlzLnhmbGFncz0wLHRoaXMub3M9MCx0aGlzLmV4dHJhPW51bGwsdGhpcy5leHRyYV9sZW49MCx0aGlzLm5hbWU9IiIsdGhpcy5jb21tZW50PSIiLHRoaXMuaGNyYz0wLHRoaXMuZG9uZT0hMX0sUnA9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBOcCh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBOcCkpcmV0dXJuIG5ldyBOcCh0KTt0aGlzLm9wdGlvbnM9QXAuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSx0fHx7fSk7dmFyIGU9dGhpcy5vcHRpb25zO2UucmF3JiZlLndpbmRvd0JpdHM+PTAmJmUud2luZG93Qml0czwxNiYmKGUud2luZG93Qml0cz0tZS53aW5kb3dCaXRzLDA9PT1lLndpbmRvd0JpdHMmJihlLndpbmRvd0JpdHM9LTE1KSksIShlLndpbmRvd0JpdHM+PTAmJmUud2luZG93Qml0czwxNil8fHQmJnQud2luZG93Qml0c3x8KGUud2luZG93Qml0cys9MzIpLGUud2luZG93Qml0cz4xNSYmZS53aW5kb3dCaXRzPDQ4JiYoMTUmZS53aW5kb3dCaXRzfHwoZS53aW5kb3dCaXRzfD0xNSkpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IExwLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgcj14cC5pbmZsYXRlSW5pdDIodGhpcy5zdHJtLGUud2luZG93Qml0cyk7aWYociE9PVRwLlpfT0spdGhyb3cgbmV3IEVycm9yKElwW3JdKTtpZih0aGlzLmhlYWRlcj1uZXcgQnAseHAuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpLGUuZGljdGlvbmFyeSYmKCJzdHJpbmciPT10eXBlb2YgZS5kaWN0aW9uYXJ5P2UuZGljdGlvbmFyeT1DcC5zdHJpbmcyYnVmKGUuZGljdGlvbmFyeSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PVJwLmNhbGwoZS5kaWN0aW9uYXJ5KSYmKGUuZGljdGlvbmFyeT1uZXcgVWludDhBcnJheShlLmRpY3Rpb25hcnkpKSxlLnJhdyYmKHI9eHAuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLGUuZGljdGlvbmFyeSkpIT09VHAuWl9PSykpdGhyb3cgbmV3IEVycm9yKElwW3JdKX1mdW5jdGlvbiB6cCh0LGUpe3ZhciByPW5ldyBOcChlKTtpZihyLnB1c2godCwhMCksci5lcnIpdGhyb3cgci5tc2d8fElwW3IuZXJyXTtyZXR1cm4gci5yZXN1bHR9TnAucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxzLGE9dGhpcy5zdHJtLGM9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSx1PXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LGw9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtuPWU9PT1+fmU/ZTohMD09PWU/VHAuWl9GSU5JU0g6VHAuWl9OT19GTFVTSCwic3RyaW5nIj09dHlwZW9mIHQ/YS5pbnB1dD1DcC5iaW5zdHJpbmcyYnVmKHQpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1ScC5jYWxsKHQpP2EuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkodCk6YS5pbnB1dD10LGEubmV4dF9pbj0wLGEuYXZhaWxfaW49YS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWEuYXZhaWxfb3V0JiYoYS5vdXRwdXQ9bmV3IEFwLkJ1ZjgoYyksYS5uZXh0X291dD0wLGEuYXZhaWxfb3V0PWMpLChyPXhwLmluZmxhdGUoYSxUcC5aX05PX0ZMVVNIKSk9PT1UcC5aX05FRURfRElDVCYmdSYmKHI9eHAuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHUpKSxyPT09VHAuWl9CVUZfRVJST1ImJiEwPT09bCYmKHI9VHAuWl9PSyxsPSExKSxyIT09VHAuWl9TVFJFQU1fRU5EJiZyIT09VHAuWl9PSylyZXR1cm4gdGhpcy5vbkVuZChyKSx0aGlzLmVuZGVkPSEwLCExO2EubmV4dF9vdXQmJigwIT09YS5hdmFpbF9vdXQmJnIhPT1UcC5aX1NUUkVBTV9FTkQmJigwIT09YS5hdmFpbF9pbnx8biE9PVRwLlpfRklOSVNIJiZuIT09VHAuWl9TWU5DX0ZMVVNIKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvPyhpPUNwLnV0Zjhib3JkZXIoYS5vdXRwdXQsYS5uZXh0X291dCksbz1hLm5leHRfb3V0LWkscz1DcC5idWYyc3RyaW5nKGEub3V0cHV0LGkpLGEubmV4dF9vdXQ9byxhLmF2YWlsX291dD1jLW8sbyYmQXAuYXJyYXlTZXQoYS5vdXRwdXQsYS5vdXRwdXQsaSxvLDApLHRoaXMub25EYXRhKHMpKTp0aGlzLm9uRGF0YShBcC5zaHJpbmtCdWYoYS5vdXRwdXQsYS5uZXh0X291dCkpKSksMD09PWEuYXZhaWxfaW4mJjA9PT1hLmF2YWlsX291dCYmKGw9ITApfXdoaWxlKChhLmF2YWlsX2luPjB8fDA9PT1hLmF2YWlsX291dCkmJnIhPT1UcC5aX1NUUkVBTV9FTkQpO3JldHVybiByPT09VHAuWl9TVFJFQU1fRU5EJiYobj1UcC5aX0ZJTklTSCksbj09PVRwLlpfRklOSVNIPyhyPXhwLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKHIpLHRoaXMuZW5kZWQ9ITAscj09PVRwLlpfT0spOm4hPT1UcC5aX1NZTkNfRkxVU0h8fCh0aGlzLm9uRW5kKFRwLlpfT0spLGEuYXZhaWxfb3V0PTAsITApfSxOcC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHQpe3RoaXMuY2h1bmtzLnB1c2godCl9LE5wLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXt0PT09VHAuWl9PSyYmKCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PUFwLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj10LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LFZkLkluZmxhdGU9TnAsVmQuaW5mbGF0ZT16cCxWZC5pbmZsYXRlUmF3PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8e30pLnJhdz0hMCx6cCh0LGUpfSxWZC51bmd6aXA9enA7dmFyIERwPXt9OygwLGRmLmFzc2lnbikoRHAscGYsVmQsRXApO3ZhciBQcD1lKERwKTtsZXQgTXA9MTtjb25zdCBGcD0iX19ydGNfdW1kX25hbWVfXyIsanA9KCk9PndpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQjtjbGFzcyBVcHtjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJzdG9yZU5hbWUiLHZvaWQgMCksbGwodGhpcywicGVuZGluZ0xpc3QiLFtdKSx0aGlzLnN0b3JlTmFtZT10LCFCbCgpJiZqcCgpJiZ0aGlzLl9jaGVja0FuZENyZWF0ZVN0b3JlKHQpfWFzeW5jIF9jaGVja0FuZENyZWF0ZVN0b3JlKHQsZSl7Y29uc3Qgcj1hd2FpdCBVcC5fcHJvbWlzZUxvY2subG9jaygpO2lmKGpwKCkuZGF0YWJhc2VzKXtsZXQgdDthd2FpdCBuZXcgUHJvbWlzZSgoZT0+e2NvbnN0IHI9KCk9PmpwKCkuZGF0YWJhc2VzKCkuZmluYWxseShlKTt0PXNldEludGVydmFsKHIsMTAwKSxyKCl9KSkuZmluYWxseSgoKCk9PmNsZWFySW50ZXJ2YWwodCkpKX1yZXR1cm4gbmV3IFByb21pc2UoKG49PntVcC5kYiYmKFVwLmRiLmNsb3NlKCksZGVsZXRlIFVwLmRiKTtjb25zdCBpPWU/anAoKS5vcGVuKEZwLGUpOmpwKCkub3BlbihGcCk7aS5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntpLnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0KX0saS5vbmVycm9yPSgpPT57Y29uc29sZS5lcnJvcigiSW5kZXhlZERCSW50ZXJmYWNlIGVycm9yIixpLmVycm9yKX0saS5vbnN1Y2Nlc3M9KCk9Pntjb25zdCBlPWkucmVzdWx0O1VwLmRiPWU7dHJ5e1VwLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkb25seSIpLHRoaXMucGVuZGluZ0xpc3QuZm9yRWFjaCgoYXN5bmMgdD0+e2xldHt0eE1vZGU6ZSxwZW5kUmVzb2x2ZTpyLHBlbmRSZWplY3Q6bn09dDt0cnl7cihhd2FpdCB0aGlzLl9nZXRTdG9yZShlKSl9Y2F0Y2goaSl7bigpfX0pKSxuKCl9Y2F0Y2gobyl7bih0aGlzLl9jaGVja0FuZENyZWF0ZVN0b3JlKHQsZS52ZXJzaW9uKzEpKX1maW5hbGx5e3IoKX19fSkpfWFzeW5jIF9nZXRTdG9yZSh0KXtjb25zdCBlPWF3YWl0IFVwLl9wcm9taXNlTG9jay5sb2NrKCk7cmV0dXJuIG5ldyBQcm9taXNlKCgocixuKT0+e2lmKCFVcC5kYilyZXR1cm4gdGhpcy5wZW5kaW5nTGlzdC5wdXNoKHt0eE1vZGU6dCxwZW5kUmVzb2x2ZTpyLHBlbmRSZWplY3Q6bn0pLHZvaWQgZSgpO3RyeXtyKFVwLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLHQpLm9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKSl9Y2F0Y2goaSl7cmV0dXJuIHZvaWQgdGhpcy5wZW5kaW5nTGlzdC5wdXNoKHt0eE1vZGU6dCxwZW5kUmVzb2x2ZTpyLHBlbmRSZWplY3Q6bn0pfWZpbmFsbHl7ZSgpfX0pKX1hc3luYyBwdXQyU3RyaW5nKHQsZSl7bGV0IHI7dHJ5e3I9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cj10fXJldHVybiBhd2FpdCB0aGlzLnB1dChyLGUpfWFzeW5jIGdldDRTdHJpbmcodCl7Y29uc3QgZT1hd2FpdCB0aGlzLmdldCh0KTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKGUpfWNhdGNoKG4pe3I9ZX1yZXR1cm4gcn1hc3luYyBwdXQodCxlKXtjb25zdCByPWF3YWl0IHRoaXMuX2dldFN0b3JlKCJyZWFkd3JpdGUiKTtyZXR1cm4gbmV3IFByb21pc2UoKChuLGkpPT57Y29uc3Qgbz1yLnB1dCh0LGUpO28ub25zdWNjZXNzPSgpPT57bigpfSxvLm9uZXJyb3I9dD0+e2kodCl9fSkpfWFzeW5jIGdldCh0KXtjb25zdCBlPWF3YWl0IHRoaXMuX2dldFN0b3JlKCJyZWFkb25seSIpO3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbik9Pntjb25zdCBpPWUuZ2V0KHQpO2kub25zdWNjZXNzPSgpPT57cihpLnJlc3VsdCl9LGkub25lcnJvcj10PT57bih0KX19KSl9YXN5bmMgZGVsKHQpe2NvbnN0IGU9YXdhaXQgdGhpcy5fZ2V0U3RvcmUoInJlYWR3cml0ZSIpO3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbik9Pntjb25zdCBpPWUuZGVsZXRlKHQpO2kub25zdWNjZXNzPSgpPT57cigpfSxpLm9uZXJyb3I9dD0+e24odCl9fSkpfX1sbChVcCwiZGIiLHZvaWQgMCksbGwoVXAsInN0YXRlIiwiaW5pdCIpLGxsKFVwLCJfcHJvbWlzZUxvY2siLG5ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJsb2NraW5nUHJvbWlzZSIsUHJvbWlzZS5yZXNvbHZlKCkpLGxsKHRoaXMsImxvY2tzIiwwKSxsbCh0aGlzLCJuYW1lIiwiIiksbGwodGhpcywibG9ja0lkIix2b2lkIDApLHRoaXMubG9ja0lkPU1wKyssdCYmKHRoaXMubmFtZT10KX1nZXQgaXNMb2NrZWQoKXtyZXR1cm4gdGhpcy5sb2Nrcz4wfWxvY2soKXtsZXQgdDt0aGlzLmxvY2tzKz0xO2NvbnN0IGU9bmV3IFByb21pc2UoKGU9Pnt0PSgpPT57dGhpcy5sb2Nrcy09MSxlKCl9fSkpLHI9dGhpcy5sb2NraW5nUHJvbWlzZS50aGVuKCgoKT0+dCkpO3JldHVybiB0aGlzLmxvY2tpbmdQcm9taXNlPXRoaXMubG9ja2luZ1Byb21pc2UudGhlbigoKCk9PmUpKSxyfX0oImlEQiIpKTt2YXIgSHA9c2kuaW5jbHVkZXM7Q3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzKChmdW5jdGlvbigpe3JldHVybiFBcnJheSgxKS5pbmNsdWRlcygpfSkpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIEhwKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7dmFyIEpwPV9sKCJBcnJheSIsImluY2x1ZGVzIiksS3A9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGdsKHQpJiYodm9pZCAwIT09KGU9dFt5bF0pPyEhZToiUmVnRXhwIj09PW1sKHQpKX0sV3A9VHlwZUVycm9yLFpwPWZlKCJtYXRjaCIpLEdwPUNyLFZwPWZ1bmN0aW9uKHQpe2lmKEtwKHQpKXRocm93IG5ldyBXcCgiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIHR9LFhwPUcsWXA9JG4sJHA9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXsiLy4vIlt0XShlKX1jYXRjaChyKXt0cnl7cmV0dXJuIGVbWnBdPSExLCIvLi8iW3RdKGUpfWNhdGNoKG4pe319cmV0dXJuITF9LHFwPW0oIiIuaW5kZXhPZik7R3Aoe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6ISRwKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF+cXAoWXAoWHAodGhpcykpLFlwKFZwKHQpKSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7dmFyIFFwPV9sKCJTdHJpbmciLCJpbmNsdWRlcyIpLHRfPW90LGVfPUpwLHJfPVFwLG5fPUFycmF5LnByb3RvdHlwZSxpXz1TdHJpbmcucHJvdG90eXBlLG9fPWUoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5jbHVkZXM7cmV0dXJuIHQ9PT1uX3x8dF8obl8sdCkmJmU9PT1uXy5pbmNsdWRlcz9lXzoic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT1pX3x8dF8oaV8sdCkmJmU9PT1pXy5pbmNsdWRlcz9yXzplfSkpO2Z1bmN0aW9uIHNfKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgcixuLGk9ZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybnt9O3ZhciByPXt9O2Zvcih2YXIgbiBpbiB0KWlmKHt9Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSl7aWYob18oZSkuY2FsbChlLG4pKWNvbnRpbnVlO3Jbbl09dFtuXX1yZXR1cm4gcn0odCxlKTtpZihXbCl7dmFyIG89V2wodCk7Zm9yKG49MDtuPG8ubGVuZ3RoO24rKylyPW9bbl0sb18oZSkuY2FsbChlLHIpfHx7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQscikmJihpW3JdPXRbcl0pfXJldHVybiBpfWNvbnN0IGFfPVsibWVzc2FnZSJdO3ZhciBjXyx1XyxsXz1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtsbCh0aGlzLCJuYW1lIiwiTG9uZ1N0cmluZ1JlcG9ydG9yIiksbGwodGhpcywiaW5CdWZmZXIiLFtdKSxsbCh0aGlzLCJvdXRCdWZmZXIiLFtdKX1wdXNoKHQpe3QubWVzc2FnZSYmdGhpcy5pbkJ1ZmZlci5wdXNoKFloKFloKHt9LHQpLHt9LHttZXNzYWdlOntpZDpMbCgpLnNsaWNlKDAsMyksaW5kZXg6MCxlbmQ6ITAsbXNnOnQubWVzc2FnZX19KSl9c3BsaWNlKHQpe2NvbnN0IGU9W107bGV0IHI9MDtmb3IoO3RoaXMub3V0QnVmZmVyLmxlbmd0aDspe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkodGhpcy5vdXRCdWZmZXJbMF0pLmxlbmd0aDtpZighKG48dCkpYnJlYWs7dC09bixyKz1uLGUucHVzaCh0aGlzLm91dEJ1ZmZlci5zaGlmdCgpKX1mb3IoO3RoaXMuaW5CdWZmZXJbMF0mJnQ+MDspe2NvbnN0IG49dGhpcy5pbkJ1ZmZlclswXSx7bWVzc2FnZTppfT1uLG89WWgoWWgoe30sc18obixhXykpLHt9LHttZXNzYWdlOlloKFloKHt9LGkpLHt9LHttc2c6IiJ9KX0pLHM9SlNPTi5zdHJpbmdpZnkobykubGVuZ3RoLGE9dC1zLGM9WWgoe30sbyk7aWYoYT5pLm1zZy5sZW5ndGgpYy5tZXNzYWdlLm1zZz1pLm1zZyx0aGlzLmluQnVmZmVyLnNoaWZ0KCk7ZWxzZXtpZighKGE+PTEwKSlicmVhazt7Y29uc3QgdD1pLm1zZy5zbGljZSgwLGEpO2MubWVzc2FnZS5tc2c9dCxjLm1lc3NhZ2UuZW5kPSExLHRoaXMuaW5CdWZmZXJbMF0ubWVzc2FnZS5tc2c9aS5tc2cuc2xpY2UoYSksdGhpcy5pbkJ1ZmZlclswXS5tZXNzYWdlLmluZGV4Kyt9fWNvbnN0IHU9SlNPTi5zdHJpbmdpZnkoYy5tZXNzYWdlKSxsPXUubGVuZ3RoO3QtPWwrcyxyKz1sK3MsZS5wdXNoKFloKFloKHt9LGMpLHt9LHttZXNzYWdlOnV9KSl9cmV0dXJue3BheWxvYWQ6ZSxwYXlsb2FkU2l6ZTpyfX11bnNoaWZ0KHQpe3RoaXMub3V0QnVmZmVyPXQuY29uY2F0KHRoaXMub3V0QnVmZmVyKX1nZXQoKXtyZXR1cm5bLi4udGhpcy5vdXRCdWZmZXIsLi4udGhpcy5pbkJ1ZmZlci5tYXAoKHQ9PlloKFloKHt9LHQpLHt9LHttZXNzYWdlOkpTT04uc3RyaW5naWZ5KHQubWVzc2FnZSl9KSkpXX1zZXQodCl7dC5mb3JFYWNoKCh0PT57IWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LnJlcG9ydF9pZH0odCk/KHQubWVzc2FnZXx8KHQubWVzc2FnZT0iIiksdGhpcy5pbkJ1ZmZlci5wdXNoKFloKFloKHt9LHQpLHt9LHttZXNzYWdlOkpTT04ucGFyc2UodC5tZXNzYWdlKX0pKSk6dGhpcy5vdXRCdWZmZXIucHVzaCh0KX0pKSx0aGlzLm91dEJ1ZmZlcj1bXS5jb25jYXQodGhpcy5vdXRCdWZmZXIpLHRoaXMuaW5CdWZmZXI9W10uY29uY2F0KHRoaXMuaW5CdWZmZXIpfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMuaW5CdWZmZXIubGVuZ3RoJiYwPT09dGhpcy5vdXRCdWZmZXIubGVuZ3RofX07Y29uc3QgaF89NWU1LGZfPXtwcm9kdWN0X2xpbmU6InJ0YyIscmVwb3J0X3ZlcnNpb246IjUiLG9zOiJ3ZWIiLHVzZXJfYWdlbnQ6QmwoKT8iIjpudWxsPT09KGNfPW5hdmlnYXRvcil8fHZvaWQgMD09PWNfP3ZvaWQgMDpjXy51c2VyQWdlbnQscGxhdGZvcm06IndlYiIscHJvZHVjdDoid2VicnRjIixhcHBfc3RhdGU6ImFjdGl2ZSJ9LGRfPSJMb2dSZXBvcnRvciIscF89InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKCJfcnRjX2RlYnVnXyIpfHwobnVsbD09PSh1Xz13aW5kb3cubG9jYWxTdG9yYWdlKXx8dm9pZCAwPT09dV8/dm9pZCAwOnVfLmdldEl0ZW0oIl9ydGNfZGVidWdfIikpKTtjbGFzcyBfX3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJfYnVmZmVyIix2b2lkIDApLHRoaXMuX2J1ZmZlcj1uZXcgVXAodCl9YXN5bmMgc2V0KHQsZSl7YXdhaXQgdGhpcy5fYnVmZmVyLnB1dDJTdHJpbmcodCxlKX1hc3luYyBnZXQodCl7dmFyIGU7bGV0IHI9W107dHJ5e3I9YXdhaXQgdGhpcy5fYnVmZmVyLmdldDRTdHJpbmcodCl9Y2F0Y2gobil7fXJldHVybiBudWxsIT09KGU9cikmJnZvaWQgMCE9PWU/ZTpbXX19dmFyIGdfPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe2xsKHRoaXMsInJlcG9ydENvbW1vbiIsZl8pLGxsKHRoaXMsInJlcG9ydElkcyIsbmV3IE1hcCksbGwodGhpcywiZGF0YUJ1ZmZlciIsW10pLGxsKHRoaXMsInJlcG9ydG9yTGlzdCIsW10pLGxsKHRoaXMsImRiQnVmZmVyIix2b2lkIDApLGxsKHRoaXMsInBvc3RpbmciLCExKSxsbCh0aGlzLCJzdWNTZW5kVGltZXIiLHZvaWQgMCksbGwodGhpcywicHJlU3VjVGltZSIsMCksbGwodGhpcywiZXJyU2VuZFRpbWVyIix2b2lkIDApLGxsKHRoaXMsImVyclNlbmREZWxheSIsMTAwKSxsbCh0aGlzLCJfbG9nU2VydmVyVXJsIix2b2lkIDApLGxsKHRoaXMsIl9yZXRyeUNvdW50IiwwKSxsbCh0aGlzLCJfcmVwb3J0TGltaXQiLGhfKSxsbCh0aGlzLCJfZGlzYWJsZVRpbWVvdXQiLCExKSxCbCgpfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsKCgpPT57Y2xlYXJUaW1lb3V0KHRoaXMuZXJyU2VuZFRpbWVyKSxjbGVhclRpbWVvdXQodGhpcy5zdWNTZW5kVGltZXIpLHRoaXMuc2VuZCh2b2lkIDAsITApfSkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLCgoKT0+eyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT90aGlzLnNldENvbW1vblN0YXRzKHthcHBfc3RhdGU6ImFjdGl2ZSJ9KToiaGlkZGVuIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmdGhpcy5zZXRDb21tb25TdGF0cyh7YXBwX3N0YXRlOiJiYWNrZ3JvdW5kIn0pfSkpLHBfJiYod2luZG93Ll9fcnRjX2RlYnVnX3JlcG9ydG9yX189dGhpcykpLFVsLm9uKCJVUExPQURfUkVQT1JUX0xJTUlUIiwodD0+e3RoaXMuc2V0UmVwb3J0TGltaXQodCl9KSksVWwub24oIkVOQUJMRV9SRVBPUlRfSURCX0JVRkZFUiIsKHQ9Pnt0JiZ0aGlzLmVuYWJsZUluZGV4ZWREQkJ1ZmZlcigpfSkpLHNldFRpbWVvdXQoKCgpPT57dGhpcy5yZXBvcnRvckxpc3QucHVzaChFXyksdGhpcy5yZXBvcnRvckxpc3QucHVzaChsXyl9KSl9c2V0VXJsKHQpe3RoaXMuX2xvZ1NlcnZlclVybD10fXNldENvbW1vblN0YXRzKHQpe3RoaXMucmVwb3J0Q29tbW9uPU9iamVjdC5hc3NpZ24odGhpcy5yZXBvcnRDb21tb24sdCl9Z2V0Q29tbW9uU3RhdHMoKXtyZXR1cm4gdGhpcy5yZXBvcnRDb21tb259c2V0UmVwb3J0TGltaXQodCl7dGhpcy5fcmVwb3J0TGltaXQ9TWF0aC5tYXgodCw1ZTQpLHRoaXMuX3JlcG9ydExpbWl0PU1hdGgubWluKHQsNWU1KX1nZXRSZXBvcnRJZCh0KXt2YXIgZTt0PW51bGwhPT0oZT10KSYmdm9pZCAwIT09ZT9lOiJfX2dsb2JhbF9fIix0aGlzLnJlcG9ydElkcy5oYXModCl8fHRoaXMucmVwb3J0SWRzLnNldCh0LDApO2xldCByPXRoaXMucmVwb3J0SWRzLmdldCh0KTtyZXR1cm4gdm9pZCAwPT09ciYmKHZfKCJubyByZXBvcnRJZCBpbiByZXBvcnRJZCBtYXAgd2l0aCBlbmdpbmUtc2Vzc2lvbi1pZCAiLmNvbmNhdCh0KSwwLHt9KSxyPTApLHRoaXMucmVwb3J0SWRzLnNldCh0LHIrMSkscn1wdXNoKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0pdGhpcy5zZW5kKHQpO2Vsc2V7dmFyIGU7Y29uc3Qgcj1udWxsIT09KGU9dC5lbmdpbmVfc2Vzc2lvbl9pZCkmJnZvaWQgMCE9PWU/ZToiX19nbG9iYWxfXyI7dGhpcy5yZXBvcnRJZHMuaGFzKHIpfHx0aGlzLnJlcG9ydElkcy5zZXQociwwKSx0aGlzLmRhdGFCdWZmZXIucHVzaCh0KSwhdGhpcy5wb3N0aW5nJiYhdGhpcy5lcnJTZW5kVGltZXImJkRhdGUubm93KCktdGhpcy5wcmVTdWNUaW1lPjJlMyYmKGNsZWFyVGltZW91dCh0aGlzLnN1Y1NlbmRUaW1lciksdGhpcy5zZW5kKCkpfX1lbmFibGVJbmRleGVkREJCdWZmZXIoKXt0aGlzLmRiQnVmZmVyfHwodGhpcy5kYkJ1ZmZlcj1uZXcgX18oIlJlcG9ydG9yREJCdWZmZXIiKSx0aGlzLmRiQnVmZmVyLmdldChkXykudGhlbigodD0+e3QuZm9yRWFjaCgodD0+e3RoaXMucHVzaCh0KX0pKX0pKSx0aGlzLnJlcG9ydG9yTGlzdC5mb3JFYWNoKCh0PT57dmFyIGU7bnVsbD09PShlPXRoaXMuZGJCdWZmZXIpfHx2b2lkIDA9PT1lfHxlLmdldCh0Lm5hbWUpLnRoZW4oKGU9Pnt0LnNldChlKX0pKX0pKSl9YmFja3VwKCl7dHJ5e3ZhciB0O251bGw9PT0odD10aGlzLmRiQnVmZmVyKXx8dm9pZCAwPT09dHx8dC5zZXQoWy4uLnRoaXMuZGF0YUJ1ZmZlcl0sZF8pLHRoaXMucmVwb3J0b3JMaXN0LmZvckVhY2goKHQ9Pnt2YXIgZTtudWxsPT09KGU9dGhpcy5kYkJ1ZmZlcil8fHZvaWQgMD09PWV8fGUuc2V0KFsuLi50LmdldCgpXSx0Lm5hbWUpfSkpfWNhdGNoKGUpe3ZfKCJFcnJvciB3aGVuIHNhdmUgbG9nIGludG8gSURCIiwtMSxlKX19dW5zaGlmdCh0KXt0aGlzLmRhdGFCdWZmZXI9dFswXS5jb25jYXQodGhpcy5kYXRhQnVmZmVyKSx0aGlzLnJlcG9ydG9yTGlzdC5mb3JFYWNoKCgoZSxyKT0+e3ZhciBuO2UudW5zaGlmdChudWxsIT09KG49dFtyKzFdKSYmdm9pZCAwIT09bj9uOltdKX0pKX1fc3BsaWNlKCl7bGV0IHQ9ZnVuY3Rpb24odCxlKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKHIrPUpTT04uc3RyaW5naWZ5KHRbbl0pLmxlbmd0aCxyPmUpcmV0dXJuIG47cmV0dXJuIHQubGVuZ3RofSh0aGlzLmRhdGFCdWZmZXIsdGhpcy5fcmVwb3J0TGltaXQpOzA9PT10JiZ0aGlzLmRhdGFCdWZmZXIubGVuZ3RoPjAmJih0aGlzLl9yZXBvcnRMaW1pdD1KU09OLnN0cmluZ2lmeSh0aGlzLmRhdGFCdWZmZXJbMF0pLmxlbmd0aCsxMCx0PTEsdl8oInVwZGF0ZSByZXBvcnQgbGltaXQgdG8gIi5jb25jYXQodGhpcy5fcmVwb3J0TGltaXQpLDAsbnVsbCkpO2NvbnN0IGU9dGhpcy5kYXRhQnVmZmVyLnNwbGljZSgwLHQpLHI9SlNPTi5zdHJpbmdpZnkoZSkubGVuZ3RoLG49W2VdO2xldCBpPXRoaXMuX3JlcG9ydExpbWl0LXI7cmV0dXJuIHRoaXMucmVwb3J0b3JMaXN0LmZvckVhY2goKHQ9Pntjb25zdHtwYXlsb2FkOmUscGF5bG9hZFNpemU6cn09dC5zcGxpY2UoaSk7ZS5mb3JFYWNoKCh0PT57dmFyIGUscixuO3ZvaWQgMD09PXQucmVwb3J0X2lkJiYodC5yZXBvcnRfaWQ9dGhpcy5nZXRSZXBvcnRJZCh0LmVuZ2luZV9zZXNzaW9uX2lkKSwhQmwoKSYmd2luZG93Ll9fb25SVENSZXBvcnQmJihudWxsPT09KGU9KHI9d2luZG93KS5fX29uUlRDUmVwb3J0KXx8dm9pZCAwPT09ZXx8ZS5jYWxsKHIsbnVsbCE9PShuPXQuZW5naW5lX3Nlc3Npb25faWQpJiZ2b2lkIDAhPT1uP246Imdsb2JhbCIsdCx0aGlzLmdldENvbW1vblN0YXRzKCkpKSl9KSksbi5wdXNoKGUpLGktPXJ9KSksbn1hc3luYyBzZW5kKHQsZSl7dGhpcy5iYWNrdXAoKTtjb25zdCByPXRoaXMucmVwb3J0b3JMaXN0LnJlZHVjZSgoKHQsZSk9PnQmJmUuaXNFbXB0eSgpKSwhMCk7aWYoIXQmJiF0aGlzLmRhdGFCdWZmZXIubGVuZ3RoJiZyfHwhdGhpcy5fbG9nU2VydmVyVXJsKXJldHVybjt0fHwodGhpcy5wb3N0aW5nPSEwKTtsZXQgbj1bXTt0fHwobj10aGlzLl9zcGxpY2UoKSk7Y29uc3QgaT1wXyxvPXtkYXRhOnR8fGZmKG4pLmNhbGwobiksaGVhZGVyOlloKFloKHt9LHRoaXMucmVwb3J0Q29tbW9uKSx7fSx7aHR0cF9yZXRyeV9jb3VudDp0aGlzLl9yZXRyeUNvdW50fSksZnJvbToid2ViIixvczoid2ViIix2ZXJzaW9uOiIxIn0scz17bWV0aG9kOiJQT1NUIixib2R5Omk/SlNPTi5zdHJpbmdpZnkobyk6UHAuZ3ppcChKU09OLnN0cmluZ2lmeShvKSl9O2lmKCF0aGlzLl9kaXNhYmxlVGltZW91dCl0cnl7Y29uc3QgdD1uZXcgQWJvcnRDb250cm9sbGVyO3Muc2lnbmFsPXQuc2lnbmFsLHNldFRpbWVvdXQoKCgpPT57dC5hYm9ydCgpfSksMWU0KX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkFib3J0Q29udHJvbGxlciBpcyBub3Qgc3VwcG9ydGVkIiksdGhpcy5fZGlzYWJsZVRpbWVvdXQ9ITB9aXx8KHMuaGVhZGVycz17IkNvbnRlbnQtRW5jb2RpbmciOiJnemlwIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04In0pO2xldCBhLGMsdT1udWxsO3RyeXthPWF3YWl0IGZldGNoKHRoaXMuX2xvZ1NlcnZlclVybCxzKSwyMDAhPT1hLnN0YXR1cyYmMzA0IT09YS5zdGF0dXN8fCh1PUpTT04ucGFyc2UoYXdhaXQgYS50ZXh0KCkpKX1jYXRjaChoKXtjPWh9dHx8KHRoaXMucG9zdGluZz0hMSksdSYmMD09PXUuU3RhdHVzQ29kZT90fHxlfHx0aGlzLnN1Y1NlbmQoKTooc2V0VGltZW91dCgoKCk9Pnt2YXIgdCxlLHI7dl8oInJlcG9ydG9yIHBvc3QgZXJyb3IsIHJlc0pTT046Ii5jb25jYXQobnVsbD09PSh0PXUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnRvU3RyaW5nKCksIiBlcnI6IikuY29uY2F0KGMpLG51bGwhPT0oZT1udWxsPT09KHI9YSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzKSYmdm9pZCAwIT09ZT9lOi0xLGMpfSksMCksdD90aGlzLnNlbmQodCk6KHRoaXMudW5zaGlmdChuKSxlP3RoaXMuc2VuZCgpOnRoaXMuZXJyU2VuZCgpKSl9X2dldERhdGFCdWZmZXJUb3RhbFNpemUoKXtyZXR1cm4gdGhpcy5kYXRhQnVmZmVyLnJlZHVjZSgoKHQsZSk9PnQrSlNPTi5zdHJpbmdpZnkoZSkubGVuZ3RoKSwwKX1zdWNTZW5kKCl7dGhpcy5lcnJTZW5kRGVsYXk9MTAwLHRoaXMuX3JldHJ5Q291bnQ9MCx0aGlzLnByZVN1Y1RpbWU9RGF0ZS5ub3coKTtjb25zdCB0PXRoaXMuX2dldERhdGFCdWZmZXJUb3RhbFNpemUoKT4xZTY/MWUzOjJlMzt0aGlzLnN1Y1NlbmRUaW1lcj1zZXRUaW1lb3V0KCgoKT0+dGhpcy5zZW5kKCkpLHQpfWVyclNlbmQoKXt0aGlzLmVyclNlbmRUaW1lcj1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuc2VuZCgpLGRlbGV0ZSB0aGlzLmVyclNlbmRUaW1lcn0pLHRoaXMuZXJyU2VuZERlbGF5KSx0aGlzLmVyclNlbmREZWxheSo9Mix0aGlzLl9yZXRyeUNvdW50Kyt9fTtjbGFzcyBtX3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJfcHJlVGltZSIsRGF0ZS5ub3coKSksbGwodGhpcywiX29uZTJvbmVOdW0iLDApLGxsKHRoaXMsIl9vbmUybWFueU51bSIsMCksbGwodGhpcywiX29uZTJvbmVNc2dDYWNoZSIsbmV3IE1hcCksbGwodGhpcywiX29uZTJtYW55TXNnQ2FjaGUiLG5ldyBNYXApLGxsKHRoaXMsInJvb21JZCIsIiIpLGxsKHRoaXMsInVzZXJJZCIsIiIpLGxsKHRoaXMsInJ0c1Nlc3Npb25JZCIsIiIpLGxsKHRoaXMsImxvZ2dlciIsdm9pZCAwKSxsbCh0aGlzLCJzZXJ2ZXJVcmwiLCJzZXJ2ZXIiKSx0aGlzLmlkPXQsdGhpcy5sb2dnZXI9bmV3IERfKCJNZXNzYWdlUmVwb3J0b3IiLDEpfW5lZWRSZXBvcnQodCl7cmV0dXJuISFtXy5jb25maWcmJihEYXRlLm5vdygpLXRoaXMuX3ByZVRpbWU+PTM2ZTUmJih0aGlzLl9wcmVUaW1lPURhdGUubm93KCksdGhpcy5fb25lMm9uZU51bT0wLHRoaXMuX29uZTJtYW55TnVtPTApLCJvbmUyb25lIj09PXQmJnRoaXMuX29uZTJvbmVOdW08bV8uY29uZmlnLm1heF9vbmUyb25lX2ZwdF9wZXJfaG91ciYmTWF0aC5yYW5kb20oKTw9bV8uY29uZmlnLm9uZTJvbmVfZnB0X3JhdGlvLzEwMHx8Im9uZTJtYW55Ij09PXQmJnRoaXMuX29uZTJtYW55TnVtPG1fLmNvbmZpZy5tYXhfb25lMm1hbnlfZnB0X3Blcl9ob3VyJiZNYXRoLnJhbmRvbSgpPD1tXy5jb25maWcub25lMm1hbnlfZnB0X3JhdGlvLzEwMCl9Y2FjaGVQMlBNc2codCl7dmFyIGU7dGhpcy5fb25lMm9uZU1zZ0NhY2hlLnNldCh0Lm1zZ19pZCxZaCh7Y29uZmlnX3ZlcnNpb246KG51bGw9PT0oZT1tXy5jb25maWcpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnZlcnNpb24pfHwiIn0sdCkpfXVwZGF0ZVAyUE1zZyh0LGUpe2NvbnN0IHI9dGhpcy5fb25lMm9uZU1zZ0NhY2hlLmdldCh0KTtyJiZ0aGlzLl9vbmUyb25lTXNnQ2FjaGUuc2V0KHQsWWgoWWgoe30sciksZSkpfWNhY2hlQ3VzdG9tTXNnKHQpe3ZhciBlO3RoaXMuX29uZTJtYW55TXNnQ2FjaGUuc2V0KHQubXNnX2lkLFloKHtjb25maWdfdmVyc2lvbjoobnVsbD09PShlPW1fLmNvbmZpZyl8fHZvaWQgMD09PWU/dm9pZCAwOmUudmVyc2lvbil8fCIifSx0KSl9dXBkYXRlT25lMk1hbnlNc2codCxlKXtjb25zdCByPXRoaXMuX29uZTJtYW55TXNnQ2FjaGUuZ2V0KHQpO3ImJnRoaXMuX29uZTJtYW55TXNnQ2FjaGUuc2V0KHQsWWgoWWgoe30sciksZSkpfXJlcG9ydFAyUE1zZyh0KXtjb25zdCBlPXRoaXMuX29uZTJvbmVNc2dDYWNoZS5nZXQodCk7dmFyIHI7ZSYmKHRoaXMubG9nZ2VyLmluZm8oInJlcG9ydFAyUE1zZyIsZS50eXBlLEpTT04uc3RyaW5naWZ5KGUpKSxudWxsPT09KHI9d18odGhpcy5pZCkpfHx2b2lkIDA9PT1yfHxyLnJlcG9ydCgicnRzX21lc3NhZ2UiLGUpKX1yZXBvcnRPbmUyTWFueU1zZyh0KXtjb25zdCBlPXRoaXMuX29uZTJtYW55TXNnQ2FjaGUuZ2V0KHQpO3ZhciByO2UmJih0aGlzLmxvZ2dlci5pbmZvKCJyZXBvcnRPbmUyTWFueU1zZyIsZS50eXBlLEpTT04uc3RyaW5naWZ5KGUpKSxudWxsPT09KHI9d18odGhpcy5pZCkpfHx2b2lkIDA9PT1yfHxyLnJlcG9ydCgicnRzX21lc3NhZ2UiLGUpKX1yZXBvcnRNc2dSZWN2KHQpe3ZhciBlLHI7dC5jb25maWdfdmVyc2lvbj0obnVsbD09PShlPW1fLmNvbmZpZyl8fHZvaWQgMD09PWU/dm9pZCAwOmUudmVyc2lvbil8fCIiLHRoaXMubG9nZ2VyLmluZm8oInJlcG9ydE1zZ1JlY3YiLHQudHlwZSxKU09OLnN0cmluZ2lmeSh0KSksbnVsbD09PShyPXdfKHRoaXMuaWQpKXx8dm9pZCAwPT09cnx8ci5yZXBvcnQoInJ0c19tZXNzYWdlIix0KX1kZXN0cm95KCl7dGhpcy5fb25lMm1hbnlOdW09MCx0aGlzLl9vbmUyb25lTnVtPTAsdGhpcy5fb25lMm1hbnlNc2dDYWNoZS5jbGVhcigpLHRoaXMuX29uZTJvbmVNc2dDYWNoZS5jbGVhcigpLHRoaXMuX3ByZVRpbWU9RGF0ZS5ub3coKSx0aGlzLnJvb21JZD0iIix0aGlzLnVzZXJJZD0iIix0aGlzLnJ0c1Nlc3Npb25JZD0iIn19bGwobV8sImNvbmZpZyIsdm9pZCAwKTtjb25zdCB5Xz1uZXcgY2xhc3N7Y29uc3RydWN0b3IodCl7bGwodGhpcywibW9kaWZ5SWRzIix7cHJlX2Nvbm5lY3Rpb246ITF9KSx0aGlzLmlkPXR9cmVwb3J0KHQsZSxyKXtjb25zdCBuPVloKFloKFloKHtldmVudF9rZXk6dCxydGNfdGltZXN0YW1wOkRhdGUubm93KCl9LHRoaXMubW9kaWZ5SWRzKSxlKSx7fSx7cmVwb3J0X2lkOmdfLmdldFJlcG9ydElkKHRoaXMubW9kaWZ5SWRzLmVuZ2luZV9zZXNzaW9uX2lkKX0pO3ZhciBpLG87KCJvYmplY3QiPT10eXBlb2YgciYmT2JqZWN0LmtleXMocikubGVuZ3RoPjAmJihuLmNvbW1vbl9leHRyYV9pbmZvPUpTT04uc3RyaW5naWZ5KHIpKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKCh0PT57dm9pZCAwIT09blt0XSYmIiIhPT1uW3RdfHxkZWxldGUgblt0XX0pKSwhQmwoKSYmd2luZG93Ll9fb25SVENSZXBvcnQpJiYobnVsbD09PShpPShvPXdpbmRvdykuX19vblJUQ1JlcG9ydCl8fHZvaWQgMD09PWl8fGkuY2FsbChvLHRoaXMubW9kaWZ5SWRzLmVuZ2luZV9zZXNzaW9uX2lkLG4sZ18uZ2V0Q29tbW9uU3RhdHMoKSkpOyJVVCIhPT17fS5WSVRFX1RFU1QmJmdfLnB1c2gobil9cmVwb3J0TG9nKHQpe2NvbnN0IGU9WWgoWWgoe2V2ZW50X2tleToicnRjX2ludm9rZV9zdGF0dXMiLHNka19hcGlfbmFtZToiY29uc29sZV9sb2ciLHJ0Y190aW1lc3RhbXA6RGF0ZS5ub3coKX0sdGhpcy5tb2RpZnlJZHMpLHt9LHttZXNzYWdlOnR9KTtFXy5wdXNoKGUpfXJlcG9ydExvbmdTdHJpbmcodCxlKXtjb25zdCByPVloKFloKHtldmVudF9rZXk6InJ0Y19pbnZva2Vfc3RhdHVzIixzZGtfYXBpX25hbWU6InNka19sb25nX3N0cmluZ18iLmNvbmNhdCh0KSxydGNfdGltZXN0YW1wOkRhdGUubm93KCl9LHRoaXMubW9kaWZ5SWRzKSx7fSx7bWVzc2FnZTplfSk7bF8ucHVzaChyKX1zZXQodCl7dGhpcy5tb2RpZnlJZHM9T2JqZWN0LmFzc2lnbih0aGlzLm1vZGlmeUlkcyx0KX1kZXN0cm95KCl7fX0oImdsb2JhbCIpLHZfPSh0LGUscik9Pnt5Xy5yZXBvcnQoInJ0Y19lcnJvciIse21lc3NhZ2U6dCxlcnJvcl9jb2RlOmV9LHIpfTtjb25zdCBiXz1uZXcgTWFwLHdfPXQ9PmJfLmdldCh0KSxTXz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcygiX3J0Y191cGxvYWRfY29uc29sZV8iKTtmdW5jdGlvbiBrXyh0LGUpe3JldHVybiB0Lm1hcCgodD0+e2xldCByPSIiO3RyeXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYodm9pZCAwPT09dClyZXR1cm4idW5kZWZpbmVkIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYodCBpbnN0YW5jZW9mIE1lZGlhU3RyZWFtVHJhY2spcmV0dXJuIFJsKHQpO2lmKHQgaW5zdGFuY2VvZiBNZWRpYVN0cmVhbSlyZXR1cm4gbnVsbD09KGk9dCk/InVuZGVmaW5lZCB8IG51bGwiOiJzdHJpbmciPT10eXBlb2YgaT9pOkpTT04uc3RyaW5naWZ5KHtpZDppLmlkLGFjdGl2ZTppLmFjdGl2ZX0pO2lmKHQgaW5zdGFuY2VvZiBSVENSdHBTZW5kZXIpcmV0dXJuIE5sKHQpO2lmKHQgaW5zdGFuY2VvZiBSVENSdHBSZWNlaXZlcilyZXR1cm4gemwodCk7aWYodCBpbnN0YW5jZW9mIFJUQ1J0cFRyYW5zY2VpdmVyKXJldHVybiBudWxsPT0obj10KT8idW5kZWZpbmVkIHwgbnVsbCI6InN0cmluZyI9PXR5cGVvZiBuP246SlNPTi5zdHJpbmdpZnkoe2N1cnJlbnREaXJlY3Rpb246bi5jdXJyZW50RGlyZWN0aW9uLGRpcmVjdGlvbjpuLmRpcmVjdGlvbixtaWQ6bi5taWQsc3RvcHBlZDpuLnN0b3BwZWQscmVjZWl2ZXI6emwobi5yZWNlaXZlciksc2VuZGVyOk5sKG4uc2VuZGVyKX0pO3I9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobyl7cj10LnRvU3RyaW5nKCl9dmFyIG4saTtyZXR1cm4gciYmci5sZW5ndGg+PWUmJihyPXIuc2xpY2UoMCxlKSkscn0pKS5qb2luKCIsICIpfXZhciBPXyxFXz1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtsbCh0aGlzLCJuYW1lIiwiQ29uc29sZVJlcG9ydG9yIiksbGwodGhpcywiX3V1aWQiLCIiLmNvbmNhdChNYXRoLmZsb29yKDg5OSpNYXRoLnJhbmRvbSgpKSsxMDApKSxsbCh0aGlzLCJfY29uc29sZVJlcG9ydElkIiwwKSxsbCh0aGlzLCJfZW5naW5lUmVwb3J0SWRNYXAiLG5ldyBNYXApLGxsKHRoaXMsIl9lbmFibGVkIiwiTlVMTCIpLGxsKHRoaXMsIl9jb25zb2xlQ3V0TGVuZ3RoIixVbC5nZXRQYXJhbWV0ZXIoIlVQTE9BRF9DT05TT0xFX0xFTkdUSF9DVVQiKSksbGwodGhpcywiYnVmZmVyIixbXSksU18mJnNldFRpbWVvdXQoKCgpPT57dGhpcy5zd2l0Y2hPbigpfSksMCksVWwub24oIlVQTE9BRF9DT05TT0xFX09OIiwodD0+e3Q/dGhpcy5zd2l0Y2hPbigpOnRoaXMudHVybk9mZigpfSkpLFVsLm9uKCJVUExPQURfQ09OU09MRV9MRU5HVEhfQ1VUIiwodD0+e3RoaXMuX2NvbnNvbGVDdXRMZW5ndGg9dH0pKX1nZXQgZW5hYmxlZCgpe3JldHVybiJPRkYiIT09dGhpcy5fZW5hYmxlZH1zd2l0Y2hPbigpeyJOVUxMIj09PXRoaXMuX2VuYWJsZWQmJihjb25zb2xlLmxvZygiW0xvZ2dlclJlcG9ydG9yLmNvbnN0cnVjdG9yXSBjb25zb2xlIHVwbG9hZCBzd2l0Y2ggT04iKSx0aGlzLl9lbmFibGVkPSJPTiIpfXR1cm5PZmYoKXsiTlVMTCI9PT10aGlzLl9lbmFibGVkJiYoY29uc29sZS5sb2coIltMb2dnZXJSZXBvcnRvci5jb25zdHJ1Y3Rvcl0gY29uc29sZSB1cGxvYWQgc3dpdGNoIE9GRiIpLHRoaXMuX2VuYWJsZWQ9Ik9GRiIsdGhpcy5idWZmZXI9W10pfWdldEVuZ2luZUNvbnNvbGVJZCh0KXt2YXIgZTtjb25zdCByPW51bGwhPT0oZT10aGlzLl9lbmdpbmVSZXBvcnRJZE1hcC5nZXQodCkpJiZ2b2lkIDAhPT1lP2U6MDtyZXR1cm4gdGhpcy5fZW5naW5lUmVwb3J0SWRNYXAuc2V0KHQscisxKSxyfXJlcG9ydCh0LGUscixuLGksbyxzLGEsYyl7aWYoIk9GRiI9PT10aGlzLl9lbmFibGVkKXJldHVybjtjb25zdCB1PXdfKGUpLGw9dGhpcy5fY29uc29sZVJlcG9ydElkKyssaD10aGlzLmdldEVuZ2luZUNvbnNvbGVJZChlKSxmPWtfKGMsdGhpcy5fY29uc29sZUN1dExlbmd0aCksZD1bLi4uY10scD0iIi5jb25jYXQoYSkucmVwbGFjZSgvJW98JXMvZ2ksKCgpPT5rXyhbZC5zaGlmdCgpXSx0aGlzLl9jb25zb2xlQ3V0TGVuZ3RoKSkpLF89IlsiLmNvbmNhdCh0aGlzLl91dWlkLCItIikuY29uY2F0KGwsIl1bIikuY29uY2F0KGUsIi0iKS5jb25jYXQoaCwiXS0iKS5jb25jYXQociwiLSIpLmNvbmNhdCh0LCJbIikuY29uY2F0KG4sIl0iKS5jb25jYXQoaSwiWyIpLmNvbmNhdChvLCIuIikuY29uY2F0KHMsIl0gIikuY29uY2F0KHAsIiAiKS5jb25jYXQoZik7dmFyIGc7dT91LnJlcG9ydExvZyhfKTooZz1fLHlfLnJlcG9ydExvZyhnKSl9cHVzaCh0KXsiT0ZGIiE9PXRoaXMuX2VuYWJsZWQmJnRoaXMuYnVmZmVyLnB1c2godCl9c3BsaWNlKHQpe2lmKCJPTiIhPT10aGlzLl9lbmFibGVkKXJldHVybntwYXlsb2FkOltdLHBheWxvYWRTaXplOjB9O2NvbnN0e2luZGV4OmUsc2l6ZTpyfT1mdW5jdGlvbih0LGUpe2xldCByPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9SlNPTi5zdHJpbmdpZnkodFtuXSkubGVuZ3RoO2lmKHIrPWkscj5lKXJldHVybntpbmRleDpuLHNpemU6ci1pfX1yZXR1cm57aW5kZXg6dC5sZW5ndGgsc2l6ZTpyfX0odGhpcy5idWZmZXIsdCk7cmV0dXJue3BheWxvYWQ6dGhpcy5idWZmZXIuc3BsaWNlKDAsZSkscGF5bG9hZFNpemU6cn19dW5zaGlmdCh0KXt0aGlzLmJ1ZmZlcj10LmNvbmNhdCh0aGlzLmJ1ZmZlcil9Z2V0KCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCh0KXt0aGlzLmJ1ZmZlcj10LmNvbmNhdCh0aGlzLmJ1ZmZlcil9aXNFbXB0eSgpe3JldHVybiJPRkYiPT09dGhpcy5fZW5hYmxlZHx8MD09PXRoaXMuYnVmZmVyLmxlbmd0aH19O2NvbnN0IHhfPSJbVkVSVENdIixBXz0iIzAwNTBiMyIsQ189e0RFQlVHOiJyZ2JhKDAsIDAsIDAsIDApIiwiIElORk8iOiJyZ2JhKDkzLCAxNzMsIDIyNiwgMCkiLCIgV0FSTiI6InJnYmEoMjU1LCAxMTksIDAsIDAuMykiLEVSUk9SOiJyZ2JhKDI1NSwgMCwgMCwgMC4zKSIsIiBTVUNDIjoicmdiYSgwLCAxMTksIDAsIDAuMykifSxUXz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoIl9ydGNfZGVidWdfIil8fChudWxsPT09KE9fPXdpbmRvdy5sb2NhbFN0b3JhZ2UpfHx2b2lkIDA9PT1PXz92b2lkIDA6T18uZ2V0SXRlbSgiX3J0Y19kZWJ1Z18iKSkpO2NvbnN0IElfPSgpPT57Y29uc3QgdD1uZXcgRGF0ZTtyZXR1cm4iIi5jb25jYXQodC50b1RpbWVTdHJpbmcoKS5zcGxpdCgiICIpWzBdLCI6IikuY29uY2F0KHQuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCIwIikpfTt2YXIgTF8sQl8sUl8sTl8sel8sRF89Y2xhc3N7Y29uc3RydWN0b3IodCxlKXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06Imdsb2JhbCI7bGwodGhpcywiaW5kZW50Iix2b2lkIDApLGxsKHRoaXMsIm1vZHVsZSIsdm9pZCAwKSxsbCh0aGlzLCJfZW5naW5lSWQiLHZvaWQgMCksdGhpcy5tb2R1bGU9dCx0aGlzLmluZGVudD1lLHRoaXMuX2VuZ2luZUlkPXJ9X3ByaW50KHQsZSl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkocj4yP3ItMjowKSxpPTI7aTxyO2krKyluW2ktMl09YXJndW1lbnRzW2ldO2NvbnN0IG89bi5zaGlmdCgpO3RyeXtjb25zdCB0PVsuLi5uXSxyPSIiLmNvbmNhdChvKS5yZXBsYWNlKC8lby9naSwoKCk9Pntjb25zdCBlPXQuc2hpZnQoKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9KSk7TWwuc2V0KCIiLmNvbmNhdCh4XywiWyIpLmNvbmNhdCh0aGlzLm1vZHVsZSwiLiIpLmNvbmNhdChlLCJdICIpLmNvbmNhdChyLCIgIikuY29uY2F0KHQubWFwKCh0PT5KU09OLnN0cmluZ2lmeSh0KSkpLmpvaW4oIiwgIikpKX1jYXRjaChRZyl7fWxldCBzPSIiO2ZvcihsZXQgYz0wO2M8dGhpcy5pbmRlbnQ7YysrKXMrPSIgICAgIjtjb25zdCBhPUlfKCk7RV8ucmVwb3J0KHhfLHRoaXMuX2VuZ2luZUlkLGEsdCxzLHRoaXMubW9kdWxlLGUsbyxuKSxUXyYmY29uc29sZS5sb2coIiVjIi5jb25jYXQoYSwiLSIpLmNvbmNhdCh4XywiJWNbIikuY29uY2F0KHQsIl0lYyIpLmNvbmNhdChzLCJbIikuY29uY2F0KHRoaXMubW9kdWxlLCIuIikuY29uY2F0KGUsIl0gIikuY29uY2F0KG8pLCJjb2xvcjoiLmNvbmNhdChBXywiOyIpLCJiYWNrZ3JvdW5kLWNvbG9yOiIuY29uY2F0KENfW3RdLCI7IiksImNvbG9yOiIuY29uY2F0KEFfLCI7IiksLi4ubil9cHJpbnQodCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO3RoaXMuX3ByaW50KCIgSU5GTyIsdCwuLi5yKX1kZWJ1Zyh0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShlPjE/ZS0xOjApLG49MTtuPGU7bisrKXJbbi0xXT1hcmd1bWVudHNbbl07dGhpcy5fcHJpbnQoIkRFQlVHIix0LC4uLnIpfWluZm8odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO3RoaXMuX3ByaW50KCIgSU5GTyIsdCwuLi5yKX13YXJuKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KGU+MT9lLTE6MCksbj0xO248ZTtuKyspcltuLTFdPWFyZ3VtZW50c1tuXTt0aGlzLl9wcmludCgiIFdBUk4iLHQsLi4ucil9ZXJyb3IodCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkoZT4xP2UtMTowKSxuPTE7bjxlO24rKylyW24tMV09YXJndW1lbnRzW25dO3RoaXMuX3ByaW50KCJFUlJPUiIsdCwuLi5yKX1zdWNjZXNzKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KGU+MT9lLTE6MCksbj0xO248ZTtuKyspcltuLTFdPWFyZ3VtZW50c1tuXTt0aGlzLl9wcmludCgiIFNVQ0MiLHQsLi4ucil9fTtjb25zdCBQXz0oKT0+InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3csTV89UF8oKT8iIjp3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtmdW5jdGlvbiBGXygpe2xldCB0PSJub25lIjtyZXR1cm4gUF8oKXx8KG51bGwhPT1NXy5tYXRjaCgiRmlyZWZveCIpP3Q9Im1vemlsbGEiOm51bGwhPT1NXy5tYXRjaCgiQ2hyb21lIik/KHQ9ImNocm9tZS1zdGFibGUiLG51bGwhPT1NXy5tYXRjaCgiRWxlY3Ryb24iKSYmKHQ9ImVsZWN0cm9uIikpOihudWxsIT09TV8ubWF0Y2goIlNhZmFyaSIpfHxudWxsIT09TV8ubWF0Y2goIkFwcGxlV2ViS2l0IikpJiYodD0ic2FmYXJpIikpLHR9Rl8oKTtjb25zdCBqXz0ic2FmYXJpIj09PUZfKCksVV89ImNocm9tZS1zdGFibGUiPT09Rl8oKSxIXz0hUF8oKSYmL0VkZ1wvL2kudGVzdChNXyksSl89IVBfKCkmJi9FZGdBL2kudGVzdChNXyksS189IVBfKCkmJi9FZGdpT1MvaS50ZXN0KE1fKSxXXz1IX3x8Sl98fEtfOyFQXygpJiZNXy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJtb2JpbGUiKTtjb25zdCBaXz0hUF8oKSYmISEvKGlQaG9uZXxpUGFkfGlQb2QpL2kuZXhlYyhNXyksR189IVBfKCkmJi9BbmRyb2lkL2kudGVzdChNXyk7bGV0IFZfPSIwIjtjb25zdCBYXz0hUF8oKSYmKG51bGw9PT0oTF89TV8ubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKXx8dm9pZCAwPT09TF8/dm9pZCAwOkxfWzFdKTt2YXIgWV87al8mJlhfJiYoVl89bnVsbD09PShZXz1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC92ZXJzaW9uXC8oXGQrXC5cZCspL2kpKXx8dm9pZCAwPT09WV8/dm9pZCAwOllfWzFdKTshUF8oKSYmKG51bGw9PT0oQl89TV8ubWF0Y2goL0ZpcmVmb3hcLyhcZCspL2kpKXx8dm9pZCAwPT09Ql98fEJfWzFdKTtjb25zdCAkXz1WXyxxXz1udWxsIT09KFJfPSFQXygpJiYobnVsbD09PShOXz1NXy5tYXRjaCgvIChbXGRfXSspIGxpa2UgTWFjIE9TIFgvaSkpfHx2b2lkIDA9PT1OX3x8bnVsbD09PShOXz1OX1sxXSl8fHZvaWQgMD09PU5fP3ZvaWQgMDpOXy5zcGxpdCgiXyIpLm1hcCgodD0+cGFyc2VJbnQodCkpKSkpJiZ2b2lkIDAhPT1SXz9SXzpbXTshUF8oKSYmKG51bGw9PT0oel89TV8ubWF0Y2goL0Nocm9tZVwvKFxkKykvaSkpfHx2b2lkIDA9PT16X3x8el9bMV0pO2NvbnN0IFFfPSJfX3J0Y19wcm9kdWN0UGxhdGZvcm1fXyIsdGc9IlJUQ19ERVZJQ0VfSUQiLGVnPSJSVENfQUNDRVNTX05PREUiLHJnPSJSVENfQUNDRVNTX1VSTFMiLG5nPSJFTkdJTkVfV0VCX0NPTkZJRyIsaWc9IlNFUlZFUl9DT05GSUciO2NsYXNzIG9ne2dldCh0KXtjb25zdCBlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpO2lmKCFlKXJldHVybiBudWxsO3RyeXtjb25zdCByPUpTT04ucGFyc2UoZSk7cmV0dXJuIHIudHRsPjAmJkRhdGUubm93KCktci5zYXZlVGltZT5yLnR0bD8odGhpcy5kZWxldGUodCksbnVsbCk6ci5tZXNzYWdlfWNhdGNoKHIpe3JldHVybiBudWxsfX1zZXQodCxlKXtjb25zdCByPXt0dGw6YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOi0xLHNhdmVUaW1lOkRhdGUubm93KCksbWVzc2FnZTplfTt0cnl7cmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHQsSlNPTi5zdHJpbmdpZnkocikpLCEwfWNhdGNoKG4pe3JldHVybiExfX1nZXRUdGwodCl7Y29uc3QgZT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0KTtpZighZSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSkudHRsfWNhdGNoKHIpe3JldHVybiBudWxsfX1kZWxldGUodCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19fXZhciBzZz1uZXcgY2xhc3MgZXh0ZW5kcyBvZ3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksbGwodGhpcywiX2FjY2Vzc1ZlcnNpb24iLCJ2MiIpfWdldERldmljZUlkKCl7aWYoUF8oKSlyZXR1cm4iIjtsZXQgdD10aGlzLmdldCh0Zyk7cmV0dXJuIHQmJiEvXlswLTlhLWZdezh9KC1bMC05YS1mXXs0fSl7M30tWzAtOWEtZl17MTJ9JC8udGVzdCh0KXx8KHQ9ZnVuY3Rpb24odCl7bGV0IGU9IiI7Zm9yKGxldCByPTA7cjx0O3IrKyllKz1NYXRoLmZsb29yKDEwKk1hdGgucmFuZG9tKCkpO3JldHVybiBlfSgxNikpLHRoaXMuc2V0RGV2aWNlSWQodCksdH1zZXREZXZpY2VJZCh0KXt2YXIgZTtyZXR1cm4gZT17ZGV2aWNlX2lkOnR9LGdfLnNldENvbW1vblN0YXRzKGUpLHRoaXMuc2V0KHRnLHQpLHR9Z2V0QWNjZXNzTm9kZSh0KXtyZXR1cm4gdGhpcy5nZXQoIiIuY29uY2F0KGVnLCJfIikuY29uY2F0KHQsIi0iKS5jb25jYXQoUV8sIi0iKS5jb25jYXQodGhpcy5fYWNjZXNzVmVyc2lvbikpfXNldEFjY2Vzc05vZGUodCxlLHIpe3JldHVybiB0aGlzLnNldCgiIi5jb25jYXQoZWcsIl8iKS5jb25jYXQodCwiLSIpLmNvbmNhdChRXywiLSIpLmNvbmNhdCh0aGlzLl9hY2Nlc3NWZXJzaW9uKSxlLDFlMypyKX1kZWxldGVBY2Nlc3NOb2RlKHQsZSl7bGV0IHI9dGhpcy5nZXRBY2Nlc3NOb2RlKHQpO2NvbnN0IG49dGhpcy5nZXRUdGwoIiIuY29uY2F0KGVnLCJfIikuY29uY2F0KHQsIi0iKS5jb25jYXQoUV8pKTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aD4wJiYocj1yLmZpbHRlcigodD0+dC5tZWRpYUlEIT09ZS5tZWRpYUlEJiZ0Lm1zZ0tleSE9PWUubXNnS2V5KSksci5sZW5ndGg+MD90aGlzLnNldEFjY2Vzc05vZGUodCxyLG58fDApOnRoaXMuY2xlYXJBY2Nlc3NOb2RlKHQpKX1jbGVhckFjY2Vzc05vZGUodCl7aWYodCl0aGlzLmRlbGV0ZSgiIi5jb25jYXQoZWcsIl8iKS5jb25jYXQodCwiLSIpLmNvbmNhdChRXykpO2Vsc2UgZm9yKGNvbnN0IGUgaW4gbG9jYWxTdG9yYWdlKWUuc3RhcnRzV2l0aChlZykmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEFjY2Vzc1VybHMoKXtyZXR1cm4gdGhpcy5nZXQoIiIuY29uY2F0KHJnLCItIikuY29uY2F0KFFfKSl9c2V0QWNjZXNzVXJscyh0KXtjb25zdCBlPXQubWFwKCh0PT57bGV0e2hvc3Q6ZSxwYXRoOnJ9PXQ7cmV0dXJuImh0dHBzOi8vIi5jb25jYXQoZSkuY29uY2F0KHIpfSkpO3JldHVybiB0aGlzLnNldCgiIi5jb25jYXQocmcsIi0iKS5jb25jYXQoUV8pLGUpfWNsZWFyQWNjZXNzVXJscygpe3RoaXMuZGVsZXRlKCIiLmNvbmNhdChyZywiLSIpLmNvbmNhdChRXykpfWdldEVuZ2luZVdlYkNvbmZpZyh0LGUpe3ZhciByO2NvbnN0IG49IiIuY29uY2F0KHQsIl8iKS5jb25jYXQoZSwiXyIpLmNvbmNhdCh0aGlzLmdldERldmljZUlkKCkpLGk9dGhpcy5nZXQobmcpLG89KG51bGw9PWl8fG51bGw9PT0ocj1pLmZpbmQoKHQ9PnQua2V5PT09bikpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5jb25maWcpfHx7fTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxmdW5jdGlvbih0KXtpZigiREVWSUNFX0lEIj09PXQpcmV0dXJuIHNnLmdldERldmljZUlkKCk7cmV0dXJuIF9nW3RdfSgiRU5HSU5FX1dFQl9DT05GSUciKSxvKX1zZXRFbmdpbmVXZWJDb25maWcodCxlLHIpe2lmKCFyKXJldHVybjtjb25zdCBuPSIiLmNvbmNhdCh0LCJfIikuY29uY2F0KGUsIl8iKS5jb25jYXQodGhpcy5nZXREZXZpY2VJZCgpKTtsZXQgaT10aGlzLmdldChuZyl8fFtdO3JldHVybiBpPWkuZmlsdGVyKCh0PT50LmtleSE9PW4pKSxpLnB1c2goe2tleTpuLGNvbmZpZzpyfSksdGhpcy5zZXQobmcsaS5zbGljZSgtNSkpfWdldFNlcnZlckNvbmZpZyh0KXt2YXIgZTtjb25zdCByPSIiLmNvbmNhdCh0KSxuPXRoaXMuZ2V0KGlnKTtyZXR1cm4obnVsbD09bnx8bnVsbD09PShlPW4uZmluZCgodD0+dC5rZXk9PT1yKSkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNvbmZpZyl8fHt9fXNldFNlcnZlckNvbmZpZyh0LGUpe2lmKCFlKXJldHVybjtjb25zdCByPSIiLmNvbmNhdCh0KTtsZXQgbj10aGlzLmdldChpZyl8fFtdO3JldHVybiBuPW4uZmlsdGVyKCh0PT50LmtleSE9PXIpKSxuLnB1c2goe2tleTpyLGNvbmZpZzplfSksdGhpcy5zZXQoaWcsbi5zbGljZSgtNSkpfX07Y29uc3QgYWc9bmV3IERfKCJKb2luUm9vbUNvbmZpZyIsMCk7Y2xhc3MgY2d7Y29uc3RydWN0b3IodCl7bGwodGhpcywiX3VzZVRjcEFmdGVySm9pblRpbWVvdXQiLGNnLkRFRkFVTFRfQ09ORi51c2VUY3BBZnRlckpvaW5UaW1lb3V0KSxsbCh0aGlzLCJfam9pbldpdGhUY3BPbmx5IixjZy5ERUZBVUxUX0NPTkYuam9pbldpdGhUY3BPbmx5KSxsbCh0aGlzLCJfam9pbldpdGhUY3BPbmx5RGVsYXkiLGNnLkRFRkFVTFRfQ09ORi5qb2luV2l0aFRjcE9ubHlEZWxheSksbGwodGhpcywiX2JsYWNrQnJvd3NlclJlZ2V4TGlzdCIsW10pLHRoaXMuX2VuZ2luZUlkPXQsbG9jYXRpb24uc2VhcmNoLmluZGV4T2YoIl9fcnRjX3RjcF9vbmx5X18iKT4tMSYmKHRoaXMuX2pvaW5XaXRoVGNwT25seT0hMCx0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheT0wKSx0aGlzLl9yZXBvcnQoKX1zdGF0aWMgc2V0RGVmYXVsQ29uZih0KXtsZXR7dXNlVGNwQWZ0ZXJKb2luVGltZW91dDplLGpvaW5XaXRoVGNwT25seTpyLGpvaW5XaXRoVGNwT25seURlbGF5Om59PXQ7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZSYmKGNnLkRFRkFVTFRfQ09ORi51c2VUY3BBZnRlckpvaW5UaW1lb3V0PWUpLCJib29sZWFuIj09dHlwZW9mIHImJihjZy5ERUZBVUxUX0NPTkYuam9pbldpdGhUY3BPbmx5PXIpLCJudW1iZXIiPT10eXBlb2YgbiYmKGNnLkRFRkFVTFRfQ09ORi5qb2luV2l0aFRjcE9ubHlEZWxheT1NYXRoLm1heCgwLG4pKSxjZy5ERUZBVUxUX0NPTkZ9Z2V0IHVzZVRjcEFmdGVySm9pblRpbWVvdXQoKXtyZXR1cm4gdGhpcy5fdXNlVGNwQWZ0ZXJKb2luVGltZW91dH1nZXQgdXNlVGNwSm9pbigpe3JldHVybiB0aGlzLl9qb2luV2l0aFRjcE9ubHl9Z2V0IHVzZVRjcEpvaW5EZWxheSgpe3JldHVybiB0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheX1pc0JsYWNrQnJvd2VyKCl7cmV0dXJuIHRoaXMuX2JsYWNrQnJvd3NlclJlZ2V4TGlzdC5maW5kKCh0PT5uZXcgUmVnRXhwKHQpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpKX1zZXRTZXJ2ZXJDb25maWcodCl7dmFyIGUscixuO2xldCBpPSExOyJib29sZWFuIj09dHlwZW9mKG51bGw9PXR8fG51bGw9PT0oZT10LnVzZV90Y3BfYWZ0ZXJfam9pbl90aW1lb3V0KXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5lbmFibGUpJiYodGhpcy5fdXNlVGNwQWZ0ZXJKb2luVGltZW91dD10LnVzZV90Y3BfYWZ0ZXJfam9pbl90aW1lb3V0LmVuYWJsZSxpPSEwKSwiYm9vbGVhbiI9PXR5cGVvZihudWxsPT10fHxudWxsPT09KHI9dC5qb2luX3dpdGhfdGNwX29ubHkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmVuYWJsZSkmJih0aGlzLl9qb2luV2l0aFRjcE9ubHk9dC5qb2luX3dpdGhfdGNwX29ubHkuZW5hYmxlLGk9ITApLCJudW1iZXIiPT10eXBlb2YobnVsbD09dHx8bnVsbD09PShuPXQuam9pbl93aXRoX3RjcF9vbmx5KXx8dm9pZCAwPT09bj92b2lkIDA6bi5kZWxheV9tcykmJih0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheT10LmpvaW5fd2l0aF90Y3Bfb25seS5kZWxheV9tcyxpPSEwKSx0JiZBcnJheS5pc0FycmF5KHQuYmxhY2tfYnJvd3Nlcl9yZWdleF9saXN0KSYmKHRoaXMuX2JsYWNrQnJvd3NlclJlZ2V4TGlzdD10LmJsYWNrX2Jyb3dzZXJfcmVnZXhfbGlzdCxpPSEwKSxpJiZ0aGlzLl9yZXBvcnQoKX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh7dXNlX3RjcF9hZnRlcl9qb2luX3RpbWVvdXQ6dGhpcy5fdXNlVGNwQWZ0ZXJKb2luVGltZW91dCxqb2luX3dpdGhfdGNwX29ubHk6dGhpcy5fam9pbldpdGhUY3BPbmx5LGpvaW5fd2l0aF90Y3Bfb25seV9kZWxheTp0aGlzLl9qb2luV2l0aFRjcE9ubHlEZWxheSxibGFja19icm93c2VyX3JlZ2V4X2xpc3Q6dGhpcy5fYmxhY2tCcm93c2VyUmVnZXhMaXN0fSl9X3JlcG9ydCgpe2FnLnByaW50KCJfcmVwb3J0Iix0aGlzLnRvU3RyaW5nKCkpLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbjtsZXQgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XToiIixzPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwO251bGw9PT0obj13Xyh0KSl8fHZvaWQgMD09PW58fG4ucmVwb3J0KCJydGNfaW52b2tlX3N0YXR1cyIse3Nka19hcGlfbmFtZTplLG1lc3NhZ2U6cixlcnJvcl9jb2RlOmksc3RyZWFtX2lkOm8sZWxhcHNlOjB9LHMpfSh0aGlzLl9lbmdpbmVJZCwid2ViX2pvaW5fcm9vbV9jb25maWciLHRoaXMudG9TdHJpbmcoKSl9fWxsKGNnLCJERUZBVUxUX0NPTkYiLHt1c2VUY3BBZnRlckpvaW5UaW1lb3V0OiEwLGpvaW5XaXRoVGNwT25seTohMSxqb2luV2l0aFRjcE9ubHlEZWxheTo1ZTN9KTt2YXIgdWc9KHQ9Pih0W3QuTk9ORT0wXT0iTk9ORSIsdCkpKHVnfHx7fSksbGc9bztDcih7Z2xvYmFsOiEwLGZvcmNlZDpsZy5nbG9iYWxUaGlzIT09bGd9LHtnbG9iYWxUaGlzOmxnfSk7dmFyIGhnLGZnPWUobyk7R18mJlVffHxaXyYmcV9bMF0sal8mJigobnVsbD09JF8/dm9pZCAwOiRfLmluY2x1ZGVzKCIxNi4xIikpfHwobnVsbD09JF8/dm9pZCAwOiRfLmluY2x1ZGVzKCIxNi4yIikpfHxudWxsPT0kX3x8JF8uaW5jbHVkZXMoIjE2LjMiKSk7Y29uc3QgZGc9Il9fcnRjX2FjY2Vzc0RvbWFpbnNfXyIuc3BsaXQoIiwiKTtjb25zdCBwZz0iX19ydGNfY29uZmlnRG9tYWluc19fIi5zcGxpdCgiLCIpLF9nPXtWRVJTSU9OOiJfX1BMQUNFSE9MREVSX1ZFUlNJT05fXyIsSUNFX0NPTkZJR19SRVFVRVNUX1VSTFNfSU5URVJOQUw6ZGcubWFwKChmdW5jdGlvbigpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiIjtyZXR1cm4gdD8oL15odHRwcz86XC9cLy4rLy50ZXN0KHQpfHwodD0iaHR0cHM6Ly8iLmNvbmNhdCh0KSksIiIuY29uY2F0KHQsIi9kaXNwYXRjaC92MS9BY2Nlc3NJbmZvP0FjdGlvbj1HZXRBY2Nlc3NJbmZvIikpOiIifSkpLElDRV9DT05GSUdfUkVRVUVTVF9VUkxTOltdLEVYUEVDVEVEX0FERFI6IiIsTE9HX1NFUlZFUl9VUkw6Il9fcnRjX2RvbWVzdGljTG9nU2VydmVyVXJsX18iLENPTkZJR19SRVFVRVNUX0RPTUFJTlM6cGcsREVWSUNFX0lEOiIiLE9WRVJTRUE6ITEsUExBVEZPUk06IiIsUFJPRFVDVDoiIixGT1JDRV9FTkFCTEVEX1JFUE9SVF9DQUxMQkFDS1M6W10sU0tJUF9XRUJfQVVESU9fSU5fVFJBQ0s6ITEsRU5GT1JDRV9XRUJfQVVESU9fU1VQUE9SVEVEOiExLEFVRElPX1NUQUxMOiEwLFZJREVPX1NUQUxMOiEwLFZJREVPX1NUQUxMXzEwME1TOiExLFNUQVRTX1NDQUxMQkFDS19TVVBQT1JUOiEwLEpPSU5fUk9PTV9DT05GSUc6Y2cuREVGQVVMVF9DT05GLFNJR05BTF9DT01QUkVTU0lPTjohMCxTSUdOQUxfQ1JPUF9KT0lOUk9PTTohMCxWSURFT19TVEFMTF9EQVRBOjUwMCxBVURJT19TVEFMTF9EQVRBOjIwMCxJT1NfU0FGQVJJX09SSUVOVEFUSU9OOiExLEJMQUNLX0ZSQU1FX0xJRkVUSU1FOjZlNCxGQUxMQkFDS19FTkNPREVfQ09ERUM6IiIsU0VJX1RJTUVfT1VUOjJlMyxTRUlfQ09VTlRfRlBTOjEsUFJFX0lDRTohMSxTVEFUU19MT09QX0lOVEVSVkFMOjFlMyxISURERU5fU1RBVFM6ITEsVVBMT0FEX1JFTU9URV9TVEFUUzp1Zy5OT05FLFNES19DT0RFQ19ORUdPVElBVElPTjohMCxBVURJT19DT0RFQzoiT1BVUyIsRElTQUJMRV9FTkNPREVEX1RSQU5TRk9STTohMSxTS0lQX1NFSV9GSUxURVI6ITEsQVJFQV9DT0RFOiIiLERJU0FCTEVfQ09NUFVURV9QUkVTU1VSRTohMSxTRU5EX01FU1NBR0VfU1lOQzohMSxIMjY0X0hXX0VOQ09ERVI6ITEsR1BVX1VSTDoiIixUVVJOX09OX0pPSU5fUk9PTV9GQUlMVVJFX0NBTExCQUNLOiExLEVOQUJMRV9GQUxMQkFDS19IQU5ETEVSOiExLEVOQUJMRV9TVEFOREFSRF9IQU5ETEVSOihVX3x8V18pJiYhWl8sUENfS0lMTFNXSVRDSDp7fSxFTkFCTEVfUExBWV9BRlRFUl9DTElDSzohMSxBVVRPUExBWV9XT1JLQVJPVU5EOiEwLEVOR0lORV9XRUJfQ09ORklHOnt9LERJU0FCTEVfSU9TX01VVEVfV09SS0FST1VORDohMSxKSVRURVJfU1RFUFBFUl9JTlRFUlZBTF9NUzoxZTMsSklUVEVSX1NURVBQRVJfU1RFUF9TSVpFX01TOjIwMCxKSVRURVJfU1RFUFBFUl9NQVhfQVZfU1lOQ19ESUZGOjQwMCxKSVRURVJfU1RFUFBFUl9NQVhfU0VUX0RJRkY6NTAwLEpJVFRFUl9TVEVQUEVSX01BWF9ESUZGX0VYQ0VFRF9DT1VOVDo4LFNVQlNDUklCRV9DVVNUT01fRVhUUkFfUEFSQU1TOnt9fTsidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8bnVsbD09PShoZz13aW5kb3cpfHx2b2lkIDA9PT1oZ3x8bnVsbD09PShoZz1oZy5SVENQZWVyQ29ubmVjdGlvbil8fHZvaWQgMD09PWhnfHxoZy5wcm90b3R5cGUuc2V0UmVtb3RlRGVzY3JpcHRpb247dmFyIGdnLG1nLHlnPXtleHBvcnRzOnt9fSx2Zz1uZXcgUHJveHkoe30se2dldCh0LGUpe3Rocm93IG5ldyBFcnJvcihgTW9kdWxlICIiIGhhcyBiZWVuIGV4dGVybmFsaXplZCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5LiBDYW5ub3QgYWNjZXNzICIuJHtlfSIgaW4gY2xpZW50IGNvZGUuICBTZWUgaHR0cDovL3ZpdGVqcy5kZXYvZ3VpZGUvdHJvdWJsZXNob290aW5nLmh0bWwjbW9kdWxlLWV4dGVybmFsaXplZC1mb3ItYnJvd3Nlci1jb21wYXRpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuYCl9fSksYmc9cihPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OnZnfSkpO2Z1bmN0aW9uIHdnKCl7cmV0dXJuIGdnfHwoZ2c9MSx5Zy5leHBvcnRzPShlPWV8fGZ1bmN0aW9uKGUscil7dmFyIG47aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jcnlwdG8mJihuPXdpbmRvdy5jcnlwdG8pLCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jcnlwdG8mJihuPXNlbGYuY3J5cHRvKSx2b2lkIDAhPT1mZyYmZmcuY3J5cHRvJiYobj1mZy5jcnlwdG8pLCFuJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm1zQ3J5cHRvJiYobj13aW5kb3cubXNDcnlwdG8pLCFuJiZ2b2lkIDAhPT10JiZ0LmNyeXB0byYmKG49dC5jcnlwdG8pLCFuKXRyeXtuPWJnfWNhdGNoKGcpe312YXIgaT1mdW5jdGlvbigpe2lmKG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmdldFJhbmRvbVZhbHVlcyl0cnl7cmV0dXJuIG4uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF19Y2F0Y2goZyl7fWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLnJhbmRvbUJ5dGVzKXRyeXtyZXR1cm4gbi5yYW5kb21CeXRlcyg0KS5yZWFkSW50MzJMRSgpfWNhdGNoKGcpe319dGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgY3J5cHRvIG1vZHVsZSBjb3VsZCBub3QgYmUgdXNlZCB0byBnZXQgc2VjdXJlIHJhbmRvbSBudW1iZXIuIil9LG89T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXt2YXIgcjtyZXR1cm4gdC5wcm90b3R5cGU9ZSxyPW5ldyB0LHQucHJvdG90eXBlPW51bGwscn19KCkscz17fSxhPXMubGliPXt9LGM9YS5CYXNlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzKTtyZXR1cm4gdCYmZS5taXhJbih0KSxlLmhhc093blByb3BlcnR5KCJpbml0IikmJnRoaXMuaW5pdCE9PWUuaW5pdHx8KGUuaW5pdD1mdW5jdGlvbigpe2UuJHN1cGVyLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksZS5pbml0LnByb3RvdHlwZT1lLGUuJHN1cGVyPXRoaXMsZX0sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5leHRlbmQoKTtyZXR1cm4gdC5pbml0LmFwcGx5KHQsYXJndW1lbnRzKSx0fSxpbml0OmZ1bmN0aW9uKCl7fSxtaXhJbjpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodGhpc1tlXT10W2VdKTt0Lmhhc093blByb3BlcnR5KCJ0b1N0cmluZyIpJiYodGhpcy50b1N0cmluZz10LnRvU3RyaW5nKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyl9fSx1PWEuV29yZEFycmF5PWMuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKHQsZSl7dD10aGlzLndvcmRzPXR8fFtdLHRoaXMuc2lnQnl0ZXM9ZSE9cj9lOjQqdC5sZW5ndGh9LHRvU3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybih0fHxoKS5zdHJpbmdpZnkodGhpcyl9LGNvbmNhdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLndvcmRzLHI9dC53b3JkcyxuPXRoaXMuc2lnQnl0ZXMsaT10LnNpZ0J5dGVzO2lmKHRoaXMuY2xhbXAoKSxuJTQpZm9yKHZhciBvPTA7bzxpO28rKyl7dmFyIHM9cltvPj4+Ml0+Pj4yNC1vJTQqOCYyNTU7ZVtuK28+Pj4yXXw9czw8MjQtKG4rbyklNCo4fWVsc2UgZm9yKHZhciBhPTA7YTxpO2ErPTQpZVtuK2E+Pj4yXT1yW2E+Pj4yXTtyZXR1cm4gdGhpcy5zaWdCeXRlcys9aSx0aGlzfSxjbGFtcDpmdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHMscj10aGlzLnNpZ0J5dGVzO3Rbcj4+PjJdJj00Mjk0OTY3Mjk1PDwzMi1yJTQqOCx0Lmxlbmd0aD1lLmNlaWwoci80KX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1jLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIHQud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKSx0fSxyYW5kb206ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQ7cis9NCllLnB1c2goaSgpKTtyZXR1cm4gbmV3IHUuaW5pdChlLHQpfX0pLGw9cy5lbmM9e30saD1sLkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LndvcmRzLHI9dC5zaWdCeXRlcyxuPVtdLGk9MDtpPHI7aSsrKXt2YXIgbz1lW2k+Pj4yXT4+PjI0LWklNCo4JjI1NTtuLnB1c2goKG8+Pj40KS50b1N0cmluZygxNikpLG4ucHVzaCgoMTUmbykudG9TdHJpbmcoMTYpKX1yZXR1cm4gbi5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9W10sbj0wO248ZTtuKz0yKXJbbj4+PjNdfD1wYXJzZUludCh0LnN1YnN0cihuLDIpLDE2KTw8MjQtbiU4KjQ7cmV0dXJuIG5ldyB1LmluaXQocixlLzIpfX0sZj1sLkxhdGluMT17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LndvcmRzLHI9dC5zaWdCeXRlcyxuPVtdLGk9MDtpPHI7aSsrKXt2YXIgbz1lW2k+Pj4yXT4+PjI0LWklNCo4JjI1NTtuLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShvKSl9cmV0dXJuIG4uam9pbigiIil9LHBhcnNlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPVtdLG49MDtuPGU7bisrKXJbbj4+PjJdfD0oMjU1JnQuY2hhckNvZGVBdChuKSk8PDI0LW4lNCo4O3JldHVybiBuZXcgdS5pbml0KHIsZSl9fSxkPWwuVXRmOD17c3RyaW5naWZ5OmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShmLnN0cmluZ2lmeSh0KSkpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIFVURi04IGRhdGEiKX19LHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBmLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0KSkpfX0scD1hLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG09Yy5leHRlbmQoe3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fZGF0YT1uZXcgdS5pbml0LHRoaXMuX25EYXRhQnl0ZXM9MH0sX2FwcGVuZDpmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PWQucGFyc2UodCkpLHRoaXMuX2RhdGEuY29uY2F0KHQpLHRoaXMuX25EYXRhQnl0ZXMrPXQuc2lnQnl0ZXN9LF9wcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciByLG49dGhpcy5fZGF0YSxpPW4ud29yZHMsbz1uLnNpZ0J5dGVzLHM9dGhpcy5ibG9ja1NpemUsYT1vLyg0KnMpLGM9KGE9dD9lLmNlaWwoYSk6ZS5tYXgoKDB8YSktdGhpcy5fbWluQnVmZmVyU2l6ZSwwKSkqcyxsPWUubWluKDQqYyxvKTtpZihjKXtmb3IodmFyIGg9MDtoPGM7aCs9cyl0aGlzLl9kb1Byb2Nlc3NCbG9jayhpLGgpO3I9aS5zcGxpY2UoMCxjKSxuLnNpZ0J5dGVzLT1sfXJldHVybiBuZXcgdS5pbml0KHIsbCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9Yy5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKSx0fSxfbWluQnVmZmVyU2l6ZTowfSk7YS5IYXNoZXI9cC5leHRlbmQoe2NmZzpjLmV4dGVuZCgpLGluaXQ6ZnVuY3Rpb24odCl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHQpLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtwLnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSx1cGRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FwcGVuZCh0KSx0aGlzLl9wcm9jZXNzKCksdGhpc30sZmluYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2FwcGVuZCh0KSx0aGlzLl9kb0ZpbmFsaXplKCl9LGJsb2NrU2l6ZToxNixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiBuZXcgdC5pbml0KHIpLmZpbmFsaXplKGUpfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7cmV0dXJuIG5ldyBfLkhNQUMuaW5pdCh0LHIpLmZpbmFsaXplKGUpfX19KTt2YXIgXz1zLmFsZ289e307cmV0dXJuIHN9KE1hdGgpLGUpKSx5Zy5leHBvcnRzO3ZhciBlfW1nPXdnKCksZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIpe3ZhciB0PW1nLmxpYi5Xb3JkQXJyYXksZT10LmluaXQscj10LmluaXQ9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYodD1uZXcgVWludDhBcnJheSh0KSksKHQgaW5zdGFuY2VvZiBJbnQ4QXJyYXl8fCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXkmJnQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8dCBpbnN0YW5jZW9mIEludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MTZBcnJheXx8dCBpbnN0YW5jZW9mIEludDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkmJih0PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpKSx0IGluc3RhbmNlb2YgVWludDhBcnJheSl7Zm9yKHZhciByPXQuYnl0ZUxlbmd0aCxuPVtdLGk9MDtpPHI7aSsrKW5baT4+PjJdfD10W2ldPDwyNC1pJTQqODtlLmNhbGwodGhpcyxuLHIpfWVsc2UgZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3IucHJvdG90eXBlPXR9fSgpLG1nLmxpYi5Xb3JkQXJyYXk7dmFyIFNnLGtnPXtleHBvcnRzOnt9fTtmdW5jdGlvbiBPZygpe3JldHVybiBTZ3x8KFNnPTEsZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQscj1lLmxpYi5Xb3JkQXJyYXk7ZnVuY3Rpb24gbih0LGUsbil7Zm9yKHZhciBpPVtdLG89MCxzPTA7czxlO3MrKylpZihzJTQpe3ZhciBhPW5bdC5jaGFyQ29kZUF0KHMtMSldPDxzJTQqMnxuW3QuY2hhckNvZGVBdChzKV0+Pj42LXMlNCoyO2lbbz4+PjJdfD1hPDwyNC1vJTQqOCxvKyt9cmV0dXJuIHIuY3JlYXRlKGksbyl9ZS5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC53b3JkcyxyPXQuc2lnQnl0ZXMsbj10aGlzLl9tYXA7dC5jbGFtcCgpO2Zvcih2YXIgaT1bXSxvPTA7bzxyO28rPTMpZm9yKHZhciBzPShlW28+Pj4yXT4+PjI0LW8lNCo4JjI1NSk8PDE2fChlW28rMT4+PjJdPj4+MjQtKG8rMSklNCo4JjI1NSk8PDh8ZVtvKzI+Pj4yXT4+PjI0LShvKzIpJTQqOCYyNTUsYT0wO2E8NCYmbysuNzUqYTxyO2ErKylpLnB1c2gobi5jaGFyQXQocz4+PjYqKDMtYSkmNjMpKTt2YXIgYz1uLmNoYXJBdCg2NCk7aWYoYylmb3IoO2kubGVuZ3RoJTQ7KWkucHVzaChjKTtyZXR1cm4gaS5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj10aGlzLl9tYXAsaT10aGlzLl9yZXZlcnNlTWFwO2lmKCFpKXtpPXRoaXMuX3JldmVyc2VNYXA9W107Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspaVtyLmNoYXJDb2RlQXQobyldPW99dmFyIHM9ci5jaGFyQXQoNjQpO2lmKHMpe3ZhciBhPXQuaW5kZXhPZihzKTstMSE9PWEmJihlPWEpfXJldHVybiBuKHQsZSxpKX0sX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0ifX0oKSx0LmVuYy5CYXNlNjR9KHdnKCkpfShrZykpLGtnLmV4cG9ydHN9dmFyIEVnLHhnPXtleHBvcnRzOnt9fTtmdW5jdGlvbiBBZygpe3JldHVybiBFZ3x8KEVnPTEsZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10LG49ci5saWIsaT1uLldvcmRBcnJheSxvPW4uSGFzaGVyLHM9ci5hbGdvLGE9W107IWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDw2NDt0KyspYVt0XT00Mjk0OTY3Mjk2KmUuYWJzKGUuc2luKHQrMSkpfDB9KCk7dmFyIGM9cy5NRDU9by5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgaS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTA7cjwxNjtyKyspe3ZhciBuPWUrcixpPXRbbl07dFtuXT0xNjcxMTkzNSYoaTw8OHxpPj4+MjQpfDQyNzgyNTUzNjAmKGk8PDI0fGk+Pj44KX12YXIgbz10aGlzLl9oYXNoLndvcmRzLHM9dFtlKzBdLGM9dFtlKzFdLGQ9dFtlKzJdLHA9dFtlKzNdLF89dFtlKzRdLGc9dFtlKzVdLG09dFtlKzZdLHk9dFtlKzddLHY9dFtlKzhdLGI9dFtlKzldLHc9dFtlKzEwXSxTPXRbZSsxMV0saz10W2UrMTJdLE89dFtlKzEzXSxFPXRbZSsxNF0seD10W2UrMTVdLEE9b1swXSxDPW9bMV0sVD1vWzJdLEk9b1szXTtBPXUoQSxDLFQsSSxzLDcsYVswXSksST11KEksQSxDLFQsYywxMixhWzFdKSxUPXUoVCxJLEEsQyxkLDE3LGFbMl0pLEM9dShDLFQsSSxBLHAsMjIsYVszXSksQT11KEEsQyxULEksXyw3LGFbNF0pLEk9dShJLEEsQyxULGcsMTIsYVs1XSksVD11KFQsSSxBLEMsbSwxNyxhWzZdKSxDPXUoQyxULEksQSx5LDIyLGFbN10pLEE9dShBLEMsVCxJLHYsNyxhWzhdKSxJPXUoSSxBLEMsVCxiLDEyLGFbOV0pLFQ9dShULEksQSxDLHcsMTcsYVsxMF0pLEM9dShDLFQsSSxBLFMsMjIsYVsxMV0pLEE9dShBLEMsVCxJLGssNyxhWzEyXSksST11KEksQSxDLFQsTywxMixhWzEzXSksVD11KFQsSSxBLEMsRSwxNyxhWzE0XSksQT1sKEEsQz11KEMsVCxJLEEseCwyMixhWzE1XSksVCxJLGMsNSxhWzE2XSksST1sKEksQSxDLFQsbSw5LGFbMTddKSxUPWwoVCxJLEEsQyxTLDE0LGFbMThdKSxDPWwoQyxULEksQSxzLDIwLGFbMTldKSxBPWwoQSxDLFQsSSxnLDUsYVsyMF0pLEk9bChJLEEsQyxULHcsOSxhWzIxXSksVD1sKFQsSSxBLEMseCwxNCxhWzIyXSksQz1sKEMsVCxJLEEsXywyMCxhWzIzXSksQT1sKEEsQyxULEksYiw1LGFbMjRdKSxJPWwoSSxBLEMsVCxFLDksYVsyNV0pLFQ9bChULEksQSxDLHAsMTQsYVsyNl0pLEM9bChDLFQsSSxBLHYsMjAsYVsyN10pLEE9bChBLEMsVCxJLE8sNSxhWzI4XSksST1sKEksQSxDLFQsZCw5LGFbMjldKSxUPWwoVCxJLEEsQyx5LDE0LGFbMzBdKSxBPWgoQSxDPWwoQyxULEksQSxrLDIwLGFbMzFdKSxULEksZyw0LGFbMzJdKSxJPWgoSSxBLEMsVCx2LDExLGFbMzNdKSxUPWgoVCxJLEEsQyxTLDE2LGFbMzRdKSxDPWgoQyxULEksQSxFLDIzLGFbMzVdKSxBPWgoQSxDLFQsSSxjLDQsYVszNl0pLEk9aChJLEEsQyxULF8sMTEsYVszN10pLFQ9aChULEksQSxDLHksMTYsYVszOF0pLEM9aChDLFQsSSxBLHcsMjMsYVszOV0pLEE9aChBLEMsVCxJLE8sNCxhWzQwXSksST1oKEksQSxDLFQscywxMSxhWzQxXSksVD1oKFQsSSxBLEMscCwxNixhWzQyXSksQz1oKEMsVCxJLEEsbSwyMyxhWzQzXSksQT1oKEEsQyxULEksYiw0LGFbNDRdKSxJPWgoSSxBLEMsVCxrLDExLGFbNDVdKSxUPWgoVCxJLEEsQyx4LDE2LGFbNDZdKSxBPWYoQSxDPWgoQyxULEksQSxkLDIzLGFbNDddKSxULEkscyw2LGFbNDhdKSxJPWYoSSxBLEMsVCx5LDEwLGFbNDldKSxUPWYoVCxJLEEsQyxFLDE1LGFbNTBdKSxDPWYoQyxULEksQSxnLDIxLGFbNTFdKSxBPWYoQSxDLFQsSSxrLDYsYVs1Ml0pLEk9ZihJLEEsQyxULHAsMTAsYVs1M10pLFQ9ZihULEksQSxDLHcsMTUsYVs1NF0pLEM9ZihDLFQsSSxBLGMsMjEsYVs1NV0pLEE9ZihBLEMsVCxJLHYsNixhWzU2XSksST1mKEksQSxDLFQseCwxMCxhWzU3XSksVD1mKFQsSSxBLEMsbSwxNSxhWzU4XSksQz1mKEMsVCxJLEEsTywyMSxhWzU5XSksQT1mKEEsQyxULEksXyw2LGFbNjBdKSxJPWYoSSxBLEMsVCxTLDEwLGFbNjFdKSxUPWYoVCxJLEEsQyxkLDE1LGFbNjJdKSxDPWYoQyxULEksQSxiLDIxLGFbNjNdKSxvWzBdPW9bMF0rQXwwLG9bMV09b1sxXStDfDAsb1syXT1vWzJdK1R8MCxvWzNdPW9bM10rSXwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEscj10LndvcmRzLG49OCp0aGlzLl9uRGF0YUJ5dGVzLGk9OCp0LnNpZ0J5dGVzO3JbaT4+PjVdfD0xMjg8PDI0LWklMzI7dmFyIG89ZS5mbG9vcihuLzQyOTQ5NjcyOTYpLHM9bjtyWzE1KyhpKzY0Pj4+OTw8NCldPTE2NzExOTM1JihvPDw4fG8+Pj4yNCl8NDI3ODI1NTM2MCYobzw8MjR8bz4+PjgpLHJbMTQrKGkrNjQ+Pj45PDw0KV09MTY3MTE5MzUmKHM8PDh8cz4+PjI0KXw0Mjc4MjU1MzYwJihzPDwyNHxzPj4+OCksdC5zaWdCeXRlcz00KihyLmxlbmd0aCsxKSx0aGlzLl9wcm9jZXNzKCk7Zm9yKHZhciBhPXRoaXMuX2hhc2gsYz1hLndvcmRzLHU9MDt1PDQ7dSsrKXt2YXIgbD1jW3VdO2NbdV09MTY3MTE5MzUmKGw8PDh8bD4+PjI0KXw0Mjc4MjU1MzYwJihsPDwyNHxsPj4+OCl9cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9by5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fX0pO2Z1bmN0aW9uIHUodCxlLHIsbixpLG8scyl7dmFyIGE9dCsoZSZyfH5lJm4pK2krcztyZXR1cm4oYTw8b3xhPj4+MzItbykrZX1mdW5jdGlvbiBsKHQsZSxyLG4saSxvLHMpe3ZhciBhPXQrKGUmbnxyJn5uKStpK3M7cmV0dXJuKGE8PG98YT4+PjMyLW8pK2V9ZnVuY3Rpb24gaCh0LGUscixuLGksbyxzKXt2YXIgYT10KyhlXnJebikraStzO3JldHVybihhPDxvfGE+Pj4zMi1vKStlfWZ1bmN0aW9uIGYodCxlLHIsbixpLG8scyl7dmFyIGE9dCsocl4oZXx+bikpK2krcztyZXR1cm4oYTw8b3xhPj4+MzItbykrZX1yLk1ENT1vLl9jcmVhdGVIZWxwZXIoYyksci5IbWFjTUQ1PW8uX2NyZWF0ZUhtYWNIZWxwZXIoYyl9KE1hdGgpLHQuTUQ1fSh3ZygpKX0oeGcpKSx4Zy5leHBvcnRzfXZhciBDZyxUZz17ZXhwb3J0czp7fX0sSWc9e2V4cG9ydHM6e319O2Z1bmN0aW9uIExnKCl7cmV0dXJuIENnfHwoQ2c9MSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHI9KGU9dCkubGliLG49ci5Xb3JkQXJyYXksaT1yLkhhc2hlcixvPWUuYWxnbyxzPVtdLGE9by5TSEExPWkuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IG4uaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX2hhc2gud29yZHMsbj1yWzBdLGk9clsxXSxvPXJbMl0sYT1yWzNdLGM9cls0XSx1PTA7dTw4MDt1Kyspe2lmKHU8MTYpc1t1XT0wfHRbZSt1XTtlbHNle3ZhciBsPXNbdS0zXV5zW3UtOF1ec1t1LTE0XV5zW3UtMTZdO3NbdV09bDw8MXxsPj4+MzF9dmFyIGg9KG48PDV8bj4+PjI3KStjK3NbdV07aCs9dTwyMD8xNTE4NTAwMjQ5KyhpJm98fmkmYSk6dTw0MD8xODU5Nzc1MzkzKyhpXm9eYSk6dTw2MD8oaSZvfGkmYXxvJmEpLTE4OTQwMDc1ODg6KGleb15hKS04OTk0OTc1MTQsYz1hLGE9byxvPWk8PDMwfGk+Pj4yLGk9bixuPWh9clswXT1yWzBdK258MCxyWzFdPXJbMV0raXwwLHJbMl09clsyXStvfDAsclszXT1yWzNdK2F8MCxyWzRdPXJbNF0rY3wwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGEsZT10LndvcmRzLHI9OCp0aGlzLl9uRGF0YUJ5dGVzLG49OCp0LnNpZ0J5dGVzO3JldHVybiBlW24+Pj41XXw9MTI4PDwyNC1uJTMyLGVbMTQrKG4rNjQ+Pj45PDw0KV09TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLGVbMTUrKG4rNjQ+Pj45PDw0KV09cix0LnNpZ0J5dGVzPTQqZS5sZW5ndGgsdGhpcy5fcHJvY2VzcygpLHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9aS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB0Ll9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSx0fX0pLGUuU0hBMT1pLl9jcmVhdGVIZWxwZXIoYSksZS5IbWFjU0hBMT1pLl9jcmVhdGVIbWFjSGVscGVyKGEpLHQuU0hBMTt2YXIgZSxyLG4saSxvLHMsYX0od2coKSl9KElnKSksSWcuZXhwb3J0c312YXIgQmcsUmcsTmc9e2V4cG9ydHM6e319O2Z1bmN0aW9uIHpnKCl7cmV0dXJuIFJnfHwoUmc9MSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHI9KGU9dCkubGliLG49ci5CYXNlLGk9ci5Xb3JkQXJyYXksbz1lLmFsZ28scz1vLk1ENSxhPW8uRXZwS0RGPW4uZXh0ZW5kKHtjZmc6bi5leHRlbmQoe2tleVNpemU6NCxoYXNoZXI6cyxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKHQpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZCh0KX0sY29tcHV0ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuPXRoaXMuY2ZnLG89bi5oYXNoZXIuY3JlYXRlKCkscz1pLmNyZWF0ZSgpLGE9cy53b3JkcyxjPW4ua2V5U2l6ZSx1PW4uaXRlcmF0aW9uczthLmxlbmd0aDxjOyl7ciYmby51cGRhdGUocikscj1vLnVwZGF0ZSh0KS5maW5hbGl6ZShlKSxvLnJlc2V0KCk7Zm9yKHZhciBsPTE7bDx1O2wrKylyPW8uZmluYWxpemUociksby5yZXNldCgpO3MuY29uY2F0KHIpfXJldHVybiBzLnNpZ0J5dGVzPTQqYyxzfX0pLGUuRXZwS0RGPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gYS5jcmVhdGUocikuY29tcHV0ZSh0LGUpfSx0LkV2cEtERjt2YXIgZSxyLG4saSxvLHMsYX0od2coKSxMZygpLEJnfHwoQmc9MSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUscixuO3I9KGU9dCkubGliLkJhc2Usbj1lLmVuYy5VdGY4LGUuYWxnby5ITUFDPXIuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKHQsZSl7dD10aGlzLl9oYXNoZXI9bmV3IHQuaW5pdCwic3RyaW5nIj09dHlwZW9mIGUmJihlPW4ucGFyc2UoZSkpO3ZhciByPXQuYmxvY2tTaXplLGk9NCpyO2Uuc2lnQnl0ZXM+aSYmKGU9dC5maW5hbGl6ZShlKSksZS5jbGFtcCgpO2Zvcih2YXIgbz10aGlzLl9vS2V5PWUuY2xvbmUoKSxzPXRoaXMuX2lLZXk9ZS5jbG9uZSgpLGE9by53b3JkcyxjPXMud29yZHMsdT0wO3U8cjt1KyspYVt1XV49MTU0OTU1NjgyOCxjW3VdXj05MDk1MjI0ODY7by5zaWdCeXRlcz1zLnNpZ0J5dGVzPWksdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2hhc2hlcjt0LnJlc2V0KCksdC51cGRhdGUodGhpcy5faUtleSl9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faGFzaGVyLnVwZGF0ZSh0KSx0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9oYXNoZXIscj1lLmZpbmFsaXplKHQpO3JldHVybiBlLnJlc2V0KCksZS5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KHIpKX19KX0od2coKSl9KE5nKSkpfShUZykpLFRnLmV4cG9ydHN9dmFyIERnLFBnPXtleHBvcnRzOnt9fTtmdW5jdGlvbiBNZygpe3JldHVybiBEZ3x8KERnPTEsZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QubGliLkNpcGhlcnx8ZnVuY3Rpb24oZSl7dmFyIHI9dCxuPXIubGliLGk9bi5CYXNlLG89bi5Xb3JkQXJyYXkscz1uLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0sYT1yLmVuYzthLlV0Zjg7dmFyIGM9YS5CYXNlNjQsdT1yLmFsZ28uRXZwS0RGLGw9bi5DaXBoZXI9cy5leHRlbmQoe2NmZzppLmV4dGVuZCgpLGNyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSx0LGUpfSxjcmVhdGVEZWNyeXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsdCxlKX0saW5pdDpmdW5jdGlvbih0LGUscil7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHIpLHRoaXMuX3hmb3JtTW9kZT10LHRoaXMuX2tleT1lLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtzLnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcHBlbmQodCksdGhpcy5fcHJvY2VzcygpfSxmaW5hbGl6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5fYXBwZW5kKHQpLHRoaXMuX2RvRmluYWxpemUoKX0sa2V5U2l6ZTo0LGl2U2l6ZTo0LF9FTkNfWEZPUk1fTU9ERToxLF9ERUNfWEZPUk1fTU9ERToyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD92Om19cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdChuKS5lbmNyeXB0KGUscixuLGkpfSxkZWNyeXB0OmZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdChuKS5kZWNyeXB0KGUscixuLGkpfX19fSgpfSk7bi5TdHJlYW1DaXBoZXI9bC5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBoPXIubW9kZT17fSxmPW4uQmxvY2tDaXBoZXJNb2RlPWkuZXh0ZW5kKHtjcmVhdGVFbmNyeXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5FbmNyeXB0b3IuY3JlYXRlKHQsZSl9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLkRlY3J5cHRvci5jcmVhdGUodCxlKX0saW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2NpcGhlcj10LHRoaXMuX2l2PWV9fSksZD1oLkNCQz1mdW5jdGlvbigpe3ZhciB0PWYuZXh0ZW5kKCk7ZnVuY3Rpb24gcih0LHIsbil7dmFyIGksbz10aGlzLl9pdjtvPyhpPW8sdGhpcy5faXY9ZSk6aT10aGlzLl9wcmV2QmxvY2s7Zm9yKHZhciBzPTA7czxuO3MrKyl0W3Irc11ePWlbc119cmV0dXJuIHQuRW5jcnlwdG9yPXQuZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jaXBoZXIsaT1uLmJsb2NrU2l6ZTtyLmNhbGwodGhpcyx0LGUsaSksbi5lbmNyeXB0QmxvY2sodCxlKSx0aGlzLl9wcmV2QmxvY2s9dC5zbGljZShlLGUraSl9fSksdC5EZWNyeXB0b3I9dC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2NpcGhlcixpPW4uYmxvY2tTaXplLG89dC5zbGljZShlLGUraSk7bi5kZWNyeXB0QmxvY2sodCxlKSxyLmNhbGwodGhpcyx0LGUsaSksdGhpcy5fcHJldkJsb2NrPW99fSksdH0oKSxwPShyLnBhZD17fSkuUGtjczc9e3BhZDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj00KmUsbj1yLXQuc2lnQnl0ZXMlcixpPW48PDI0fG48PDE2fG48PDh8bixzPVtdLGE9MDthPG47YSs9NClzLnB1c2goaSk7dmFyIGM9by5jcmVhdGUocyxuKTt0LmNvbmNhdChjKX0sdW5wYWQ6ZnVuY3Rpb24odCl7dmFyIGU9MjU1JnQud29yZHNbdC5zaWdCeXRlcy0xPj4+Ml07dC5zaWdCeXRlcy09ZX19O24uQmxvY2tDaXBoZXI9bC5leHRlbmQoe2NmZzpsLmNmZy5leHRlbmQoe21vZGU6ZCxwYWRkaW5nOnB9KSxyZXNldDpmdW5jdGlvbigpe3ZhciB0O2wucmVzZXQuY2FsbCh0aGlzKTt2YXIgZT10aGlzLmNmZyxyPWUuaXYsbj1lLm1vZGU7dGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERT90PW4uY3JlYXRlRW5jcnlwdG9yOih0PW4uY3JlYXRlRGVjcnlwdG9yLHRoaXMuX21pbkJ1ZmZlclNpemU9MSksdGhpcy5fbW9kZSYmdGhpcy5fbW9kZS5fX2NyZWF0b3I9PXQ/dGhpcy5fbW9kZS5pbml0KHRoaXMsciYmci53b3Jkcyk6KHRoaXMuX21vZGU9dC5jYWxsKG4sdGhpcyxyJiZyLndvcmRzKSx0aGlzLl9tb2RlLl9fY3JlYXRvcj10KX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dGhpcy5fbW9kZS5wcm9jZXNzQmxvY2sodCxlKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuY2ZnLnBhZGRpbmc7cmV0dXJuIHRoaXMuX3hmb3JtTW9kZT09dGhpcy5fRU5DX1hGT1JNX01PREU/KGUucGFkKHRoaXMuX2RhdGEsdGhpcy5ibG9ja1NpemUpLHQ9dGhpcy5fcHJvY2VzcyghMCkpOih0PXRoaXMuX3Byb2Nlc3MoITApLGUudW5wYWQodCkpLHR9LGJsb2NrU2l6ZTo0fSk7dmFyIF89bi5DaXBoZXJQYXJhbXM9aS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odCl7dGhpcy5taXhJbih0KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuKHR8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksZz0oci5mb3JtYXQ9e30pLk9wZW5TU0w9e3N0cmluZ2lmeTpmdW5jdGlvbih0KXt2YXIgZT10LmNpcGhlcnRleHQscj10LnNhbHQ7cmV0dXJuKHI/by5jcmVhdGUoWzEzOTg4OTM2ODQsMTcwMTA3NjgzMV0pLmNvbmNhdChyKS5jb25jYXQoZSk6ZSkudG9TdHJpbmcoYyl9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlLHI9Yy5wYXJzZSh0KSxuPXIud29yZHM7cmV0dXJuIDEzOTg4OTM2ODQ9PW5bMF0mJjE3MDEwNzY4MzE9PW5bMV0mJihlPW8uY3JlYXRlKG4uc2xpY2UoMiw0KSksbi5zcGxpY2UoMCw0KSxyLnNpZ0J5dGVzLT0xNiksXy5jcmVhdGUoe2NpcGhlcnRleHQ6cixzYWx0OmV9KX19LG09bi5TZXJpYWxpemFibGVDaXBoZXI9aS5leHRlbmQoe2NmZzppLmV4dGVuZCh7Zm9ybWF0Omd9KSxlbmNyeXB0OmZ1bmN0aW9uKHQsZSxyLG4pe249dGhpcy5jZmcuZXh0ZW5kKG4pO3ZhciBpPXQuY3JlYXRlRW5jcnlwdG9yKHIsbiksbz1pLmZpbmFsaXplKGUpLHM9aS5jZmc7cmV0dXJuIF8uY3JlYXRlKHtjaXBoZXJ0ZXh0Om8sa2V5OnIsaXY6cy5pdixhbGdvcml0aG06dCxtb2RlOnMubW9kZSxwYWRkaW5nOnMucGFkZGluZyxibG9ja1NpemU6dC5ibG9ja1NpemUsZm9ybWF0dGVyOm4uZm9ybWF0fSl9LGRlY3J5cHQ6ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIG49dGhpcy5jZmcuZXh0ZW5kKG4pLGU9dGhpcy5fcGFyc2UoZSxuLmZvcm1hdCksdC5jcmVhdGVEZWNyeXB0b3IocixuKS5maW5hbGl6ZShlLmNpcGhlcnRleHQpfSxfcGFyc2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZS5wYXJzZSh0LHRoaXMpOnR9fSkseT0oci5rZGY9e30pLk9wZW5TU0w9e2V4ZWN1dGU6ZnVuY3Rpb24odCxlLHIsbixpKXtpZihufHwobj1vLnJhbmRvbSg4KSksaSlzPXUuY3JlYXRlKHtrZXlTaXplOmUrcixoYXNoZXI6aX0pLmNvbXB1dGUodCxuKTtlbHNlIHZhciBzPXUuY3JlYXRlKHtrZXlTaXplOmUrcn0pLmNvbXB1dGUodCxuKTt2YXIgYT1vLmNyZWF0ZShzLndvcmRzLnNsaWNlKGUpLDQqcik7cmV0dXJuIHMuc2lnQnl0ZXM9NCplLF8uY3JlYXRlKHtrZXk6cyxpdjphLHNhbHQ6bn0pfX0sdj1uLlBhc3N3b3JkQmFzZWRDaXBoZXI9bS5leHRlbmQoe2NmZzptLmNmZy5leHRlbmQoe2tkZjp5fSksZW5jcnlwdDpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0obj10aGlzLmNmZy5leHRlbmQobikpLmtkZi5leGVjdXRlKHIsdC5rZXlTaXplLHQuaXZTaXplLG4uc2FsdCxuLmhhc2hlcik7bi5pdj1pLml2O3ZhciBvPW0uZW5jcnlwdC5jYWxsKHRoaXMsdCxlLGkua2V5LG4pO3JldHVybiBvLm1peEluKGkpLG99LGRlY3J5cHQ6ZnVuY3Rpb24odCxlLHIsbil7bj10aGlzLmNmZy5leHRlbmQobiksZT10aGlzLl9wYXJzZShlLG4uZm9ybWF0KTt2YXIgaT1uLmtkZi5leGVjdXRlKHIsdC5rZXlTaXplLHQuaXZTaXplLGUuc2FsdCxuLmhhc2hlcik7cmV0dXJuIG4uaXY9aS5pdixtLmRlY3J5cHQuY2FsbCh0aGlzLHQsZSxpLmtleSxuKX19KX0oKX0od2coKSx6ZygpKX0oUGcpKSxQZy5leHBvcnRzfSFmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dCxyPWUubGliLkJsb2NrQ2lwaGVyLG49ZS5hbGdvLGk9W10sbz1bXSxzPVtdLGE9W10sYz1bXSx1PVtdLGw9W10saD1bXSxmPVtdLGQ9W107IWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPDI1NjtlKyspdFtlXT1lPDEyOD9lPDwxOmU8PDFeMjgzO3ZhciByPTAsbj0wO2ZvcihlPTA7ZTwyNTY7ZSsrKXt2YXIgcD1uXm48PDFebjw8Ml5uPDwzXm48PDQ7cD1wPj4+OF4yNTUmcF45OSxpW3JdPXAsb1twXT1yO3ZhciBfPXRbcl0sZz10W19dLG09dFtnXSx5PTI1Nyp0W3BdXjE2ODQzMDA4KnA7c1tyXT15PDwyNHx5Pj4+OCxhW3JdPXk8PDE2fHk+Pj4xNixjW3JdPXk8PDh8eT4+PjI0LHVbcl09eSx5PTE2ODQzMDA5Km1eNjU1MzcqZ14yNTcqX14xNjg0MzAwOCpyLGxbcF09eTw8MjR8eT4+PjgsaFtwXT15PDwxNnx5Pj4+MTYsZltwXT15PDw4fHk+Pj4yNCxkW3BdPXkscj8ocj1fXnRbdFt0W21eX11dXSxuXj10W3Rbbl1dKTpyPW49MX19KCk7dmFyIHA9WzAsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTRdLF89bi5BRVM9ci5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX25Sb3VuZHN8fHRoaXMuX2tleVByaW9yUmVzZXQhPT10aGlzLl9rZXkpe2Zvcih2YXIgdD10aGlzLl9rZXlQcmlvclJlc2V0PXRoaXMuX2tleSxlPXQud29yZHMscj10LnNpZ0J5dGVzLzQsbj00KigodGhpcy5fblJvdW5kcz1yKzYpKzEpLG89dGhpcy5fa2V5U2NoZWR1bGU9W10scz0wO3M8bjtzKyspczxyP29bc109ZVtzXToodT1vW3MtMV0scyVyP3I+NiYmcyVyPT00JiYodT1pW3U+Pj4yNF08PDI0fGlbdT4+PjE2JjI1NV08PDE2fGlbdT4+PjgmMjU1XTw8OHxpWzI1NSZ1XSk6KHU9aVsodT11PDw4fHU+Pj4yNCk+Pj4yNF08PDI0fGlbdT4+PjE2JjI1NV08PDE2fGlbdT4+PjgmMjU1XTw8OHxpWzI1NSZ1XSx1Xj1wW3MvcnwwXTw8MjQpLG9bc109b1tzLXJdXnUpO2Zvcih2YXIgYT10aGlzLl9pbnZLZXlTY2hlZHVsZT1bXSxjPTA7YzxuO2MrKyl7aWYocz1uLWMsYyU0KXZhciB1PW9bc107ZWxzZSB1PW9bcy00XTthW2NdPWM8NHx8czw9ND91OmxbaVt1Pj4+MjRdXV5oW2lbdT4+PjE2JjI1NV1dXmZbaVt1Pj4+OCYyNTVdXV5kW2lbMjU1JnVdXX19fSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24odCxlKXt0aGlzLl9kb0NyeXB0QmxvY2sodCxlLHRoaXMuX2tleVNjaGVkdWxlLHMsYSxjLHUsaSl9LGRlY3J5cHRCbG9jazpmdW5jdGlvbih0LGUpe3ZhciByPXRbZSsxXTt0W2UrMV09dFtlKzNdLHRbZSszXT1yLHRoaXMuX2RvQ3J5cHRCbG9jayh0LGUsdGhpcy5faW52S2V5U2NoZWR1bGUsbCxoLGYsZCxvKSxyPXRbZSsxXSx0W2UrMV09dFtlKzNdLHRbZSszXT1yfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKHQsZSxyLG4saSxvLHMsYSl7Zm9yKHZhciBjPXRoaXMuX25Sb3VuZHMsdT10W2VdXnJbMF0sbD10W2UrMV1eclsxXSxoPXRbZSsyXV5yWzJdLGY9dFtlKzNdXnJbM10sZD00LHA9MTtwPGM7cCsrKXt2YXIgXz1uW3U+Pj4yNF1eaVtsPj4+MTYmMjU1XV5vW2g+Pj44JjI1NV1ec1syNTUmZl1ecltkKytdLGc9bltsPj4+MjRdXmlbaD4+PjE2JjI1NV1eb1tmPj4+OCYyNTVdXnNbMjU1JnVdXnJbZCsrXSxtPW5baD4+PjI0XV5pW2Y+Pj4xNiYyNTVdXm9bdT4+PjgmMjU1XV5zWzI1NSZsXV5yW2QrK10seT1uW2Y+Pj4yNF1eaVt1Pj4+MTYmMjU1XV5vW2w+Pj44JjI1NV1ec1syNTUmaF1ecltkKytdO3U9XyxsPWcsaD1tLGY9eX1fPShhW3U+Pj4yNF08PDI0fGFbbD4+PjE2JjI1NV08PDE2fGFbaD4+PjgmMjU1XTw8OHxhWzI1NSZmXSlecltkKytdLGc9KGFbbD4+PjI0XTw8MjR8YVtoPj4+MTYmMjU1XTw8MTZ8YVtmPj4+OCYyNTVdPDw4fGFbMjU1JnVdKV5yW2QrK10sbT0oYVtoPj4+MjRdPDwyNHxhW2Y+Pj4xNiYyNTVdPDwxNnxhW3U+Pj44JjI1NV08PDh8YVsyNTUmbF0pXnJbZCsrXSx5PShhW2Y+Pj4yNF08PDI0fGFbdT4+PjE2JjI1NV08PDE2fGFbbD4+PjgmMjU1XTw8OHxhWzI1NSZoXSlecltkKytdLHRbZV09Xyx0W2UrMV09Zyx0W2UrMl09bSx0W2UrM109eX0sa2V5U2l6ZTo4fSk7ZS5BRVM9ci5fY3JlYXRlSGVscGVyKF8pfSgpLHQuQUVTfSh3ZygpLE9nKCksQWcoKSx6ZygpLE1nKCkpfSh7ZXhwb3J0czp7fX0pOyFmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5jLkhleH0od2coKSl9KHtleHBvcnRzOnt9fSk7IWZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tb2RlLkNUUj0oZT10LmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCkscj1lLkVuY3J5cHRvcj1lLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fY2lwaGVyLG49ci5ibG9ja1NpemUsaT10aGlzLl9pdixvPXRoaXMuX2NvdW50ZXI7aSYmKG89dGhpcy5fY291bnRlcj1pLnNsaWNlKDApLHRoaXMuX2l2PXZvaWQgMCk7dmFyIHM9by5zbGljZSgwKTtyLmVuY3J5cHRCbG9jayhzLDApLG9bbi0xXT1vW24tMV0rMXwwO2Zvcih2YXIgYT0wO2E8bjthKyspdFtlK2FdXj1zW2FdfX0pLGUuRGVjcnlwdG9yPXIsZSksdC5tb2RlLkNUUjt2YXIgZSxyfSh3ZygpLE1nKCkpfSh7ZXhwb3J0czp7fX0pOyFmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQucGFkLk5vUGFkZGluZz17cGFkOmZ1bmN0aW9uKCl7fSx1bnBhZDpmdW5jdGlvbigpe319LHQucGFkLk5vUGFkZGluZ30od2coKSxNZygpKX0oe2V4cG9ydHM6e319KTt2YXIgRmc9e30samc9e2V4cG9ydHM6e319LFVnPWpnLmV4cG9ydHM9e3Y6W3tuYW1lOiJ2ZXJzaW9uIixyZWc6L14oXGQqKSQvfV0sbzpbe25hbWU6Im9yaWdpbiIscmVnOi9eKFxTKikgKFxkKikgKFxkKikgKFxTKikgSVAoXGQpIChcUyopLyxuYW1lczpbInVzZXJuYW1lIiwic2Vzc2lvbklkIiwic2Vzc2lvblZlcnNpb24iLCJuZXRUeXBlIiwiaXBWZXIiLCJhZGRyZXNzIl0sZm9ybWF0OiIlcyAlcyAlZCAlcyBJUCVkICVzIn1dLHM6W3tuYW1lOiJuYW1lIn1dLGk6W3tuYW1lOiJkZXNjcmlwdGlvbiJ9XSx1Olt7bmFtZToidXJpIn1dLGU6W3tuYW1lOiJlbWFpbCJ9XSxwOlt7bmFtZToicGhvbmUifV0sejpbe25hbWU6InRpbWV6b25lcyJ9XSxyOlt7bmFtZToicmVwZWF0cyJ9XSx0Olt7bmFtZToidGltaW5nIixyZWc6L14oXGQqKSAoXGQqKS8sbmFtZXM6WyJzdGFydCIsInN0b3AiXSxmb3JtYXQ6IiVkICVkIn1dLGM6W3tuYW1lOiJjb25uZWN0aW9uIixyZWc6L15JTiBJUChcZCkgKFxTKikvLG5hbWVzOlsidmVyc2lvbiIsImlwIl0sZm9ybWF0OiJJTiBJUCVkICVzIn1dLGI6W3twdXNoOiJiYW5kd2lkdGgiLHJlZzovXihUSUFTfEFTfENUfFJSfFJTKTooXGQqKS8sbmFtZXM6WyJ0eXBlIiwibGltaXQiXSxmb3JtYXQ6IiVzOiVzIn1dLG06W3tyZWc6L14oXHcqKSAoXGQqKSAoW1x3L10qKSg/OiAoLiopKT8vLG5hbWVzOlsidHlwZSIsInBvcnQiLCJwcm90b2NvbCIsInBheWxvYWRzIl0sZm9ybWF0OiIlcyAlZCAlcyAlcyJ9XSxhOlt7cHVzaDoicnRwIixyZWc6L15ydHBtYXA6KFxkKikgKFtcd1wtLl0qKSg/OlxzKlwvKFxkKikoPzpccypcLyhcUyopKT8pPy8sbmFtZXM6WyJwYXlsb2FkIiwiY29kZWMiLCJyYXRlIiwiZW5jb2RpbmciXSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5jb2Rpbmc/InJ0cG1hcDolZCAlcy8lcy8lcyI6dC5yYXRlPyJydHBtYXA6JWQgJXMvJXMiOiJydHBtYXA6JWQgJXMifX0se3B1c2g6ImZtdHAiLHJlZzovXmZtdHA6KFxkKikgKFtcU3wgXSopLyxuYW1lczpbInBheWxvYWQiLCJjb25maWciXSxmb3JtYXQ6ImZtdHA6JWQgJXMifSx7bmFtZToiY29udHJvbCIscmVnOi9eY29udHJvbDooLiopLyxmb3JtYXQ6ImNvbnRyb2w6JXMifSx7bmFtZToicnRjcCIscmVnOi9ecnRjcDooXGQqKSg/OiAoXFMqKSBJUChcZCkgKFxTKikpPy8sbmFtZXM6WyJwb3J0IiwibmV0VHlwZSIsImlwVmVyIiwiYWRkcmVzcyJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5hZGRyZXNzPyJydGNwOiVkICVzIElQJWQgJXMiOiJydGNwOiVkIn19LHtwdXNoOiJydGNwRmJUcnJJbnQiLHJlZzovXnJ0Y3AtZmI6KFwqfFxkKikgdHJyLWludCAoXGQqKS8sbmFtZXM6WyJwYXlsb2FkIiwidmFsdWUiXSxmb3JtYXQ6InJ0Y3AtZmI6JXMgdHJyLWludCAlZCJ9LHtwdXNoOiJydGNwRmIiLHJlZzovXnJ0Y3AtZmI6KFwqfFxkKikgKFtcdy1fXSopKD86IChbXHctX10qKSk/LyxuYW1lczpbInBheWxvYWQiLCJ0eXBlIiwic3VidHlwZSJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5zdWJ0eXBlPyJydGNwLWZiOiVzICVzICVzIjoicnRjcC1mYjolcyAlcyJ9fSx7cHVzaDoiZXh0IixyZWc6L15leHRtYXA6KFxkKykoPzpcLyhcdyspKT8oPzogKHVybjppZXRmOnBhcmFtczpydHAtaGRyZXh0OmVuY3J5cHQpKT8gKFxTKikoPzogKFxTKikpPy8sbmFtZXM6WyJ2YWx1ZSIsImRpcmVjdGlvbiIsImVuY3J5cHQtdXJpIiwidXJpIiwiY29uZmlnIl0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiJleHRtYXA6JWQiKyh0LmRpcmVjdGlvbj8iLyVzIjoiJXYiKSsodFsiZW5jcnlwdC11cmkiXT8iICVzIjoiJXYiKSsiICVzIisodC5jb25maWc/IiAlcyI6IiIpfX0se25hbWU6ImV4dG1hcEFsbG93TWl4ZWQiLHJlZzovXihleHRtYXAtYWxsb3ctbWl4ZWQpL30se3B1c2g6ImNyeXB0byIscmVnOi9eY3J5cHRvOihcZCopIChbXHdfXSopIChcUyopKD86IChcUyopKT8vLG5hbWVzOlsiaWQiLCJzdWl0ZSIsImNvbmZpZyIsInNlc3Npb25Db25maWciXSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQuc2Vzc2lvbkNvbmZpZz8iY3J5cHRvOiVkICVzICVzICVzIjoiY3J5cHRvOiVkICVzICVzIn19LHtuYW1lOiJzZXR1cCIscmVnOi9ec2V0dXA6KFx3KikvLGZvcm1hdDoic2V0dXA6JXMifSx7bmFtZToiY29ubmVjdGlvblR5cGUiLHJlZzovXmNvbm5lY3Rpb246KG5ld3xleGlzdGluZykvLGZvcm1hdDoiY29ubmVjdGlvbjolcyJ9LHtuYW1lOiJtaWQiLHJlZzovXm1pZDooW15cc10qKS8sZm9ybWF0OiJtaWQ6JXMifSx7bmFtZToibXNpZCIscmVnOi9ebXNpZDooLiopLyxmb3JtYXQ6Im1zaWQ6JXMifSx7bmFtZToicHRpbWUiLHJlZzovXnB0aW1lOihcZCooPzpcLlxkKikqKS8sZm9ybWF0OiJwdGltZTolZCJ9LHtuYW1lOiJtYXhwdGltZSIscmVnOi9ebWF4cHRpbWU6KFxkKig/OlwuXGQqKSopLyxmb3JtYXQ6Im1heHB0aW1lOiVkIn0se25hbWU6ImRpcmVjdGlvbiIscmVnOi9eKHNlbmRyZWN2fHJlY3Zvbmx5fHNlbmRvbmx5fGluYWN0aXZlKS99LHtuYW1lOiJpY2VsaXRlIixyZWc6L14oaWNlLWxpdGUpL30se25hbWU6ImljZVVmcmFnIixyZWc6L15pY2UtdWZyYWc6KFxTKikvLGZvcm1hdDoiaWNlLXVmcmFnOiVzIn0se25hbWU6ImljZVB3ZCIscmVnOi9eaWNlLXB3ZDooXFMqKS8sZm9ybWF0OiJpY2UtcHdkOiVzIn0se25hbWU6ImZpbmdlcnByaW50IixyZWc6L15maW5nZXJwcmludDooXFMqKSAoXFMqKS8sbmFtZXM6WyJ0eXBlIiwiaGFzaCJdLGZvcm1hdDoiZmluZ2VycHJpbnQ6JXMgJXMifSx7cHVzaDoiY2FuZGlkYXRlcyIscmVnOi9eY2FuZGlkYXRlOihcUyopIChcZCopIChcUyopIChcZCopIChcUyopIChcZCopIHR5cCAoXFMqKSg/OiByYWRkciAoXFMqKSBycG9ydCAoXGQqKSk/KD86IHRjcHR5cGUgKFxTKikpPyg/OiBnZW5lcmF0aW9uIChcZCopKT8oPzogbmV0d29yay1pZCAoXGQqKSk/KD86IG5ldHdvcmstY29zdCAoXGQqKSk/LyxuYW1lczpbImZvdW5kYXRpb24iLCJjb21wb25lbnQiLCJ0cmFuc3BvcnQiLCJwcmlvcml0eSIsImlwIiwicG9ydCIsInR5cGUiLCJyYWRkciIsInJwb3J0IiwidGNwdHlwZSIsImdlbmVyYXRpb24iLCJuZXR3b3JrLWlkIiwibmV0d29yay1jb3N0Il0sZm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPSJjYW5kaWRhdGU6JXMgJWQgJXMgJWQgJXMgJWQgdHlwICVzIjtyZXR1cm4gZSs9bnVsbCE9dC5yYWRkcj8iIHJhZGRyICVzIHJwb3J0ICVkIjoiJXYldiIsZSs9bnVsbCE9dC50Y3B0eXBlPyIgdGNwdHlwZSAlcyI6IiV2IixudWxsIT10LmdlbmVyYXRpb24mJihlKz0iIGdlbmVyYXRpb24gJWQiKSxlKz1udWxsIT10WyJuZXR3b3JrLWlkIl0/IiBuZXR3b3JrLWlkICVkIjoiJXYiLGUrPW51bGwhPXRbIm5ldHdvcmstY29zdCJdPyIgbmV0d29yay1jb3N0ICVkIjoiJXYifX0se25hbWU6ImVuZE9mQ2FuZGlkYXRlcyIscmVnOi9eKGVuZC1vZi1jYW5kaWRhdGVzKS99LHtuYW1lOiJyZW1vdGVDYW5kaWRhdGVzIixyZWc6L15yZW1vdGUtY2FuZGlkYXRlczooLiopLyxmb3JtYXQ6InJlbW90ZS1jYW5kaWRhdGVzOiVzIn0se25hbWU6ImljZU9wdGlvbnMiLHJlZzovXmljZS1vcHRpb25zOihcUyopLyxmb3JtYXQ6ImljZS1vcHRpb25zOiVzIn0se3B1c2g6InNzcmNzIixyZWc6L15zc3JjOihcZCopIChbXHdfLV0qKSg/OjooLiopKT8vLG5hbWVzOlsiaWQiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSJdLGZvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT0ic3NyYzolZCI7cmV0dXJuIG51bGwhPXQuYXR0cmlidXRlJiYoZSs9IiAlcyIsbnVsbCE9dC52YWx1ZSYmKGUrPSI6JXMiKSksZX19LHtwdXNoOiJzc3JjR3JvdXBzIixyZWc6L15zc3JjLWdyb3VwOihbXHgyMVx4MjNceDI0XHgyNVx4MjZceDI3XHgyQVx4MkJceDJEXHgyRVx3XSopICguKikvLG5hbWVzOlsic2VtYW50aWNzIiwic3NyY3MiXSxmb3JtYXQ6InNzcmMtZ3JvdXA6JXMgJXMifSx7bmFtZToibXNpZFNlbWFudGljIixyZWc6L15tc2lkLXNlbWFudGljOlxzPyhcdyopIChcUyopLyxuYW1lczpbInNlbWFudGljIiwidG9rZW4iXSxmb3JtYXQ6Im1zaWQtc2VtYW50aWM6ICVzICVzIn0se3B1c2g6Imdyb3VwcyIscmVnOi9eZ3JvdXA6KFx3KikgKC4qKS8sbmFtZXM6WyJ0eXBlIiwibWlkcyJdLGZvcm1hdDoiZ3JvdXA6JXMgJXMifSx7bmFtZToicnRjcE11eCIscmVnOi9eKHJ0Y3AtbXV4KS99LHtuYW1lOiJydGNwUnNpemUiLHJlZzovXihydGNwLXJzaXplKS99LHtuYW1lOiJzY3RwbWFwIixyZWc6L15zY3RwbWFwOihbXHdfL10qKSAoXFMqKSg/OiAoXFMqKSk/LyxuYW1lczpbInNjdHBtYXBOdW1iZXIiLCJhcHAiLCJtYXhNZXNzYWdlU2l6ZSJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC5tYXhNZXNzYWdlU2l6ZT8ic2N0cG1hcDolcyAlcyAlcyI6InNjdHBtYXA6JXMgJXMifX0se25hbWU6InhHb29nbGVGbGFnIixyZWc6L154LWdvb2dsZS1mbGFnOihbXlxzXSopLyxmb3JtYXQ6IngtZ29vZ2xlLWZsYWc6JXMifSx7cHVzaDoicmlkcyIscmVnOi9ecmlkOihbXGRcd10rKSAoXHcrKSg/OiAoW1xTfCBdKikpPy8sbmFtZXM6WyJpZCIsImRpcmVjdGlvbiIsInBhcmFtcyJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJhbXM/InJpZDolcyAlcyAlcyI6InJpZDolcyAlcyJ9fSx7cHVzaDoiaW1hZ2VhdHRycyIscmVnOm5ldyBSZWdFeHAoIl5pbWFnZWF0dHI6KFxcZCt8XFwqKVtcXHNcXHRdKyhzZW5kfHJlY3YpW1xcc1xcdF0rKFxcKnxcXFtcXFMrXFxdKD86W1xcc1xcdF0rXFxbXFxTK1xcXSkqKSg/OltcXHNcXHRdKyhyZWN2fHNlbmQpW1xcc1xcdF0rKFxcKnxcXFtcXFMrXFxdKD86W1xcc1xcdF0rXFxbXFxTK1xcXSkqKSk/IiksbmFtZXM6WyJwdCIsImRpcjEiLCJhdHRyczEiLCJkaXIyIiwiYXR0cnMyIl0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiJpbWFnZWF0dHI6JXMgJXMgJXMiKyh0LmRpcjI/IiAlcyAlcyI6IiIpfX0se25hbWU6InNpbXVsY2FzdCIscmVnOm5ldyBSZWdFeHAoIl5zaW11bGNhc3Q6KHNlbmR8cmVjdikgKFthLXpBLVowLTlcXC1ffjssXSspKD86XFxzPyhzZW5kfHJlY3YpIChbYS16QS1aMC05XFwtX347LF0rKSk/JCIpLG5hbWVzOlsiZGlyMSIsImxpc3QxIiwiZGlyMiIsImxpc3QyIl0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiJzaW11bGNhc3Q6JXMgJXMiKyh0LmRpcjI/IiAlcyAlcyI6IiIpfX0se25hbWU6InNpbXVsY2FzdF8wMyIscmVnOi9ec2ltdWxjYXN0Oltcc1x0XSsoW1xTK1xzXHRdKykkLyxuYW1lczpbInZhbHVlIl0sZm9ybWF0OiJzaW11bGNhc3Q6ICVzIn0se25hbWU6ImZyYW1lcmF0ZSIscmVnOi9eZnJhbWVyYXRlOihcZCsoPzokfFwuXGQrKSkvLGZvcm1hdDoiZnJhbWVyYXRlOiVzIn0se25hbWU6InNvdXJjZUZpbHRlciIscmVnOi9ec291cmNlLWZpbHRlcjogKihleGNsfGluY2wpIChcUyopIChJUDR8SVA2fFwqKSAoXFMqKSAoLiopLyxuYW1lczpbImZpbHRlck1vZGUiLCJuZXRUeXBlIiwiYWRkcmVzc1R5cGVzIiwiZGVzdEFkZHJlc3MiLCJzcmNMaXN0Il0sZm9ybWF0OiJzb3VyY2UtZmlsdGVyOiAlcyAlcyAlcyAlcyAlcyJ9LHtuYW1lOiJidW5kbGVPbmx5IixyZWc6L14oYnVuZGxlLW9ubHkpL30se25hbWU6ImxhYmVsIixyZWc6L15sYWJlbDooLispLyxmb3JtYXQ6ImxhYmVsOiVzIn0se25hbWU6InNjdHBQb3J0IixyZWc6L15zY3RwLXBvcnQ6KFxkKykkLyxmb3JtYXQ6InNjdHAtcG9ydDolcyJ9LHtuYW1lOiJtYXhNZXNzYWdlU2l6ZSIscmVnOi9ebWF4LW1lc3NhZ2Utc2l6ZTooXGQrKSQvLGZvcm1hdDoibWF4LW1lc3NhZ2Utc2l6ZTolcyJ9LHtwdXNoOiJ0c1JlZkNsb2NrcyIscmVnOi9edHMtcmVmY2xrOihbXlxzPV0qKSg/Oj0oXFMqKSk/LyxuYW1lczpbImNsa3NyYyIsImNsa3NyY0V4dCJdLGZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4idHMtcmVmY2xrOiVzIisobnVsbCE9dC5jbGtzcmNFeHQ/Ij0lcyI6IiIpfX0se25hbWU6Im1lZGlhQ2xrIixyZWc6L15tZWRpYWNsazooPzppZD0oXFMqKSk/ICooW15ccz1dKikoPzo9KFxTKikpPyg/OiAqcmF0ZT0oXGQrKVwvKFxkKykpPy8sbmFtZXM6WyJpZCIsIm1lZGlhQ2xvY2tOYW1lIiwibWVkaWFDbG9ja1ZhbHVlIiwicmF0ZU51bWVyYXRvciIsInJhdGVEZW5vbWluYXRvciJdLGZvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT0ibWVkaWFjbGs6IjtyZXR1cm4gZSs9bnVsbCE9dC5pZD8iaWQ9JXMgJXMiOiIldiVzIixlKz1udWxsIT10Lm1lZGlhQ2xvY2tWYWx1ZT8iPSVzIjoiIixlKz1udWxsIT10LnJhdGVOdW1lcmF0b3I/IiByYXRlPSVzIjoiIixlKz1udWxsIT10LnJhdGVEZW5vbWluYXRvcj8iLyVzIjoiIn19LHtuYW1lOiJrZXl3b3JkcyIscmVnOi9ea2V5d2RzOiguKykkLyxmb3JtYXQ6ImtleXdkczolcyJ9LHtuYW1lOiJjb250ZW50IixyZWc6L15jb250ZW50OiguKykvLGZvcm1hdDoiY29udGVudDolcyJ9LHtuYW1lOiJiZmNwRmxvb3JDdHJsIixyZWc6L15mbG9vcmN0cmw6KGMtb25seXxzLW9ubHl8Yy1zKS8sZm9ybWF0OiJmbG9vcmN0cmw6JXMifSx7bmFtZToiYmZjcENvbmZJZCIscmVnOi9eY29uZmlkOihcZCspLyxmb3JtYXQ6ImNvbmZpZDolcyJ9LHtuYW1lOiJiZmNwVXNlcklkIixyZWc6L151c2VyaWQ6KFxkKykvLGZvcm1hdDoidXNlcmlkOiVzIn0se25hbWU6ImJmY3BGbG9vcklkIixyZWc6L15mbG9vcmlkOiguKykgKD86bS1zdHJlYW18bXN0cm0pOiguKykvLG5hbWVzOlsiaWQiLCJtU3RyZWFtIl0sZm9ybWF0OiJmbG9vcmlkOiVzIG1zdHJtOiVzIn0se3B1c2g6ImludmFsaWQiLG5hbWVzOlsidmFsdWUiXX1dfTtPYmplY3Qua2V5cyhVZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7VWdbdF0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZWd8fCh0LnJlZz0vKC4qKS8pLHQuZm9ybWF0fHwodC5mb3JtYXQ9IiVzIil9KSl9KSk7dmFyIEhnPWpnLmV4cG9ydHM7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcoTnVtYmVyKHQpKT09PXQ/TnVtYmVyKHQpOnR9LHI9ZnVuY3Rpb24odCxyLG4pe3ZhciBpPXQubmFtZSYmdC5uYW1lczt0LnB1c2gmJiFyW3QucHVzaF0/clt0LnB1c2hdPVtdOmkmJiFyW3QubmFtZV0mJihyW3QubmFtZV09e30pO3ZhciBvPXQucHVzaD97fTppP3JbdC5uYW1lXTpyOyFmdW5jdGlvbih0LHIsbixpKXtpZihpJiYhbilyW2ldPWUodFsxXSk7ZWxzZSBmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rPTEpbnVsbCE9dFtvKzFdJiYocltuW29dXT1lKHRbbysxXSkpfShuLm1hdGNoKHQucmVnKSxvLHQubmFtZXMsdC5uYW1lKSx0LnB1c2gmJnJbdC5wdXNoXS5wdXNoKG8pfSxuPUhnLGk9UmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQoL14oW2Etel0pPSguKikvKTt0LnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlPXt9LG89W10scz1lO3JldHVybiB0LnNwbGl0KC8oXHJcbnxccnxcbikvKS5maWx0ZXIoaSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dFswXSxpPXQuc2xpY2UoMik7Im0iPT09ZSYmKG8ucHVzaCh7cnRwOltdLGZtdHA6W119KSxzPW9bby5sZW5ndGgtMV0pO2Zvcih2YXIgYT0wO2E8KG5bZV18fFtdKS5sZW5ndGg7YSs9MSl7dmFyIGM9bltlXVthXTtpZihjLnJlZy50ZXN0KGkpKXJldHVybiByKGMscyxpKX19KSksZS5tZWRpYT1vLGV9O3ZhciBvPWZ1bmN0aW9uKHQscil7dmFyIG49ci5zcGxpdCgvPSguKykvLDIpO3JldHVybiAyPT09bi5sZW5ndGg/dFtuWzBdXT1lKG5bMV0pOjE9PT1uLmxlbmd0aCYmci5sZW5ndGg+MSYmKHRbblswXV09dm9pZCAwKSx0fTt0LnBhcnNlUGFyYW1zPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KC87XHM/LykucmVkdWNlKG8se30pfSx0LnBhcnNlRm10cENvbmZpZz10LnBhcnNlUGFyYW1zLHQucGFyc2VQYXlsb2Fkcz1mdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygpLnNwbGl0KCIgIikubWFwKE51bWJlcil9LHQucGFyc2VSZW1vdGVDYW5kaWRhdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXSxuPXQuc3BsaXQoIiAiKS5tYXAoZSksaT0wO2k8bi5sZW5ndGg7aSs9MylyLnB1c2goe2NvbXBvbmVudDpuW2ldLGlwOm5baSsxXSxwb3J0Om5baSsyXX0pO3JldHVybiByfSx0LnBhcnNlSW1hZ2VBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIgIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMSx0Lmxlbmd0aC0xKS5zcGxpdCgiLCIpLnJlZHVjZShvLHt9KX0pKX0sdC5wYXJzZVNpbXVsY2FzdFN0cmVhbUxpc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoIjsiKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKChmdW5jdGlvbih0KXt2YXIgcixuPSExO3JldHVybiJ+IiE9PXRbMF0/cj1lKHQpOihyPWUodC5zdWJzdHJpbmcoMSx0Lmxlbmd0aCkpLG49ITApLHtzY2lkOnIscGF1c2VkOm59fSkpfSkpfX0oRmcpO3ZhciBKZztuZXcgVGV4dERlY29kZXIsbmV3IFRleHRFbmNvZGVyLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcygiX3J0Y19kZWJ1Z18iKXx8bnVsbCE9PShKZz13aW5kb3cubG9jYWxTdG9yYWdlKSYmdm9pZCAwIT09SmcmJkpnLmdldEl0ZW0oIl9ydGNfZGVidWdfIikpO2NvbnN0IEtnPXtnZXROQUxVbml0cyh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTtjb25zdHtwb3NpdGlvbjpyfT10O3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9LZy5nZXRBbm5leGJOYWxzKHQsZSk6S2cuZ2V0QXZjY05hbHModCxlKX0sZ2V0QW5uZXhiTmFscyh0LGUpe2NvbnN0IHI9W107bGV0IG49S2cuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCksaT1uLnBvcyxvPWk7Zm9yKDtpPHQubGVuZ3RoLTQ7KXtjb25zdCBzPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGksaStuLmhlYWRlckxlbmd0aCkpO24ucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKG4uaGVhZGVyTGVuZ3RoKSxuPUtnLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLG89bi5wb3M7Y29uc3QgYT17aGVhZGVyOnMsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShpK3MuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07ZT9LZy5hbmFseXNlSDI2NU5hbChhKTpLZy5hbmFseXNlTmFsKGEpLChhLnR5cGU8PTl8fGUmJmEudHlwZTw9NDApJiYwIT09YS50eXBlJiZyLnB1c2goYSksdC5za2lwKG8tdC5wb3NpdGlvbiksaT1vfXJldHVybiByfSxnZXRBdmNjTmFscyh0LGUpe2NvbnN0IHI9W107Zm9yKDt0LnBvc2l0aW9uPHQubGVuZ3RoLTQ7KXtjb25zdCBuPXQuZ2V0SW50MzIodC5wb3NpdGlvbik7aWYoISh0Lmxlbmd0aC10LnBvc2l0aW9uPj1uKSlicmVhazt7Y29uc3QgaT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZSh0LnBvc2l0aW9uLHQucG9zaXRpb24rNCkpO3Quc2tpcCg0KTtjb25zdCBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbituKSk7dC5za2lwKG4pO2NvbnN0IHM9e2hlYWRlcjppLGJvZHk6byx0eXBlOi0xfTtlP0tnLmFuYWx5c2VIMjY1TmFsKHMpOktnLmFuYWx5c2VOYWwocykscy50eXBlPD05JiYwIT09cy50eXBlJiZyLnB1c2gocyl9fXJldHVybiByfSxhbmFseXNlTmFsKHQpe2NvbnN0IGU9MzEmdC5ib2R5WzBdO3N3aXRjaCh0LnR5cGU9ZSxlKXtjYXNlIDE6dC5uZHI9ITA7YnJlYWs7Y2FzZSA1OnQuaWRyPSEwO2JyZWFrO2Nhc2UgNjp0LnNlaT0hMDticmVhaztjYXNlIDc6dC5zcHM9ITA7YnJlYWs7Y2FzZSA4OnQucHBzPSEwfX0sYW5hbHlzZUgyNjVOYWwodCl7Y29uc3QgZT0oMTI2JnQuYm9keVswXSk+PjE7c3dpdGNoKHQudHlwZT1lLGUpe2Nhc2UgMzk6Y2FzZSA0MDp0LnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpe2xldCBlPXQucG9zaXRpb24scj0wO2NvbnN0IG49dC5sZW5ndGg7Zm9yKDszIT09ciYmNCE9PXImJmU8bi00OykwPT09dC5nZXRJbnQxNihlKT8xPT09dC5nZXRJbnQxNihlKzIpP3I9NDoxPT09dC5nZXRJbnQ4KGUrMik/cj0zOmUrKzplKys7cmV0dXJuIGU9PT1uLTQmJigwPT09dC5nZXRJbnQxNihlKT8xPT09dC5nZXRJbnQxNihlKzIpP3I9NDplPW46KGUrKywwPT09dC5nZXRJbnQxNihlKSYmMT09PXQuZ2V0SW50OChlKT9yPTM6ZT1uKSkse3BvczplLGhlYWRlckxlbmd0aDpyfX0sZ2V0Q29kZWNOYW1lRnJvbUZyYW1lKHQsZSl7Y29uc3R7bWltZVR5cGU6cixwYXlsb2FkVHlwZTpufT10LmdldE1ldGFkYXRhKCk7cmV0dXJuIHI/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygiaDI2NSIpP2ZsLkgyNjU6dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJoMjY0Iik/ZmwuSDI2NDp0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoInZwOCIpP2ZsLlZQODp2b2lkIDB9KHIpOm4mJmU/ZVtuXTp2b2lkIDB9LGlzSDI2NVZpZGVvRnJhbWUodCl7dmFyIGU7cmV0dXJuKChudWxsPT09KGU9dC5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PWV8fG51bGw9PT0oZT1lLmNhbGwodCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19LFdnPW5ldyBVaW50OEFycmF5KFsxMDksMTY3LDUzLDE5MCwxMDMsOTAsNzIsMSwxNzAsODksNjMsMTY0LDE5NCwxOTksMTksODVdKSxaZz1uZXcgVWludDhBcnJheShbMTA5LDE2Nyw1MywxOTAsMTAzLDkwLDcyLDEsMTcwLDg5LDYzLDE2NCwxOTQsMTk5LDE5LDg0XSksR2c9bmV3IFVpbnQ4QXJyYXkoWzMxLDIzOSwzLDUwLDI0MiwxMjAsNzYsODUsMTY5LDQyLDE2MSw5MSw3NSwxODYsMjJdKTtmdW5jdGlvbiBWZyh0KXtjb25zdCBlPVtdO2Zvcig7dD49MjU1Oyl0LT0yNTUsZS5wdXNoKDI1NSk7cmV0dXJuIGUucHVzaCh0KSxuZXcgVWludDhBcnJheShlKX1mdW5jdGlvbiBYZyh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MCxyPTA7Zm9yKDsyNTU9PT10W2VdJiZlPHQuYnl0ZUxlbmd0aDspZSsrLHIrPTI1NTtyZXR1cm4gZTx0LmJ5dGVMZW5ndGgmJihyKz10W2UrK10pLFtyLGVdfWNvbnN0IFlnPW5ldyBVaW50OEFycmF5KFs4MCwxXSk7Y2xhc3MgJGd7c3RhdGljIGdlbmVyYXRlU0VJKHQsZSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtjb25zdCBuPW5ldyBVaW50OEFycmF5KFswLDAsMCwxXSksaT1lP1lnOm5ldyBVaW50OEFycmF5KFs2XSksbz1uZXcgVWludDhBcnJheShbNV0pLHM9JGcuX191dWlkfHwocj9XZzpaZyksYT1WZyh0LmJ5dGVMZW5ndGgrcy5ieXRlTGVuZ3RoKSxjPSh0PT57Y29uc3QgZT1bXTtsZXQgcj0wO2Zvcihjb25zdCBuIG9mIHQpcj49MiYmbjw9MyYmKGUucHVzaCgzKSxyPTApLDA9PT1uP3IrKzpyPTAsZS5wdXNoKG4pO3JldHVybiBuZXcgVWludDhBcnJheShlKX0pKHQpO3JldHVybiBuZXcgVWludDhBcnJheShbLi4ubiwuLi5pLC4uLm8sLi4uYSwuLi5zLC4uLmMsMTI4XSl9c3RhdGljIGRlY29kZVNFSUJvZHkodCxlKXtjb25zdCByPSh0PT57Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdPD0zJiYwPT09dFtyLTFdJiYwPT09dFtyLTJdfHxlLnB1c2godFtyXSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUpfSkodD10LnNsaWNlKDAsdC5sZW5ndGgtMSkpO2lmKHIuYnl0ZUxlbmd0aDwyKXJldHVybjtsZXQgbj0wO2NvbnN0IGk9ZT8yOjE7aWYoNSE9PXJbaV0mJjEwMCE9PXJbaV0pcmV0dXJuO24rPTEraTtjb25zdFtvLHNdPVhnKHIsbik7bj1zO2xldCBhPTI7Y29uc3QgYz1uK287ci5ieXRlTGVuZ3RoPj1aZy5ieXRlTGVuZ3RoJiZvPj1aZy5ieXRlTGVuZ3RoJiYoci5zbGljZShuLG4rWmcuYnl0ZUxlbmd0aCkudG9TdHJpbmcoKT09PVpnLnRvU3RyaW5nKCl8fHIuc2xpY2UobixuK0dnLmJ5dGVMZW5ndGgpLnRvU3RyaW5nKCk9PT1HZy50b1N0cmluZygpKT8obis9WmcuYnl0ZUxlbmd0aCxhPTEpOnIuYnl0ZUxlbmd0aD49WmcuYnl0ZUxlbmd0aCYmbz49WmcuYnl0ZUxlbmd0aCYmci5zbGljZShuLG4rV2cuYnl0ZUxlbmd0aCkudG9TdHJpbmcoKT09PVdnLnRvU3RyaW5nKCkmJihuKz1XZy5ieXRlTGVuZ3RoLGE9MCk7cmV0dXJue3R5cGU6YSxwYXlsb2FkOnIuc2xpY2UobixjKX19c3RhdGljIHBhcnNlSW50ZXJuYWxTRUkodCl7Y29uc3QgZT1uZXcgTWFwO2xldCByPTA7aWYoMD09PXQudHlwZSl7Zm9yKDt0LnBheWxvYWQuYnl0ZUxlbmd0aC1yPj0yOyl7Y29uc3RbbixpXT1YZyh0LnBheWxvYWQscik7cj1pO2NvbnN0W28sc109WGcodC5wYXlsb2FkLHIpO2lmKHI9cyxlLmdldChuKXx8IShvPD10LnBheWxvYWQuYnl0ZUxlbmd0aC1yKSlicmVhaztlLnNldChuLHQucGF5bG9hZC5zbGljZShyLHIrbykpLHIrPW99cmV0dXJuIGV9fXN0YXRpYyBtYWtlSW50ZXJuYWxTZWkodCl7Y29uc3QgZT1bXTtmb3IoY29uc3RbaSxvXW9mIHQpe2NvbnN0IHQ9VmcoaSkscj1WZyhvLmJ5dGVMZW5ndGgpO2UucHVzaCh0LHIsbyl9Y29uc3Qgcj1lLnJlZHVjZSgoKHQsZSk9PnQrZS5ieXRlTGVuZ3RoKSwwKSxuPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBlLnJlZHVjZSgoKHQsZSk9PihuLnNldChlLHQpLHQrZS5ieXRlTGVuZ3RoKSksMCksbn19bGwoJGcsIl9fdXVpZCIsdm9pZCAwKTtjbGFzcyBxZ3tjb25zdHJ1Y3Rvcih0KXtsbCh0aGlzLCJzZWlMaXN0IixbXSksbGwodGhpcywibWF4U0VJQ291bnQiLDEpLGxsKHRoaXMsInBheWxvYWRNYXAiLHZvaWQgMCksbGwodGhpcywiY3VycmVudENvZGVjIix2b2lkIDApLHRoaXMubWF4U0VJQ291bnQ9dC5tYXhTRUlDb3VudCx0aGlzLnBheWxvYWRNYXA9dC5wYXlsb2FkTWFwfXNlbmRTRUlUcmFuc2Zvcm0odCxlKXt2YXIgcjtjb25zdHttYXhTRUlDb3VudDpuLHNlaUxpc3Q6aX09dGhpcztpZihudWxsIT09KHI9S2cuZ2V0Q29kZWNOYW1lRnJvbUZyYW1lKHQsdGhpcy5wYXlsb2FkTWFwKSkmJnZvaWQgMCE9PXJ8fHRoaXMuY3VycmVudENvZGVjLCF0aGlzLnNlaUxpc3QubGVuZ3RoKXJldHVybiB2b2lkIGUuZW5xdWV1ZSh0KTtjb25zdCBvPVtdO2xldCBzPTA7Zm9yKGNvbnN0IGwgb2YgaSl7dmFyIGE7aWYoby5sZW5ndGg+PW4pYnJlYWs7Y29uc3QgZT1udWxsIT09KGE9S2cuZ2V0Q29kZWNOYW1lRnJvbUZyYW1lKHQsdGhpcy5wYXlsb2FkTWFwKSkmJnZvaWQgMCE9PWE/YTp0aGlzLmN1cnJlbnRDb2RlYztpZihlIT09ZmwuSDI2NCYmZSE9PWZsLkgyNjUpY29udGludWU7Y29uc3Qgcj0kZy5nZW5lcmF0ZVNFSShsLmNvbnRlbnQsZT09PWZsLkgyNjUpO3MrPXIuYnl0ZUxlbmd0aCxsLnJlcGVhdENvdW50LS0sby5wdXNoKHIpfXRoaXMuc2VpTGlzdD1pLmZpbHRlcigodD0+dC5yZXBlYXRDb3VudD4wKSk7Y29uc3QgYz1uZXcgVWludDhBcnJheShzK3QuZGF0YS5ieXRlTGVuZ3RoKTtjLnNldChuZXcgVWludDhBcnJheSh0LmRhdGEpKTtsZXQgdT10LmRhdGEuYnl0ZUxlbmd0aDtvLmZvckVhY2goKHQ9PntjLnNldCh0LHUpLHUrPXQuYnl0ZUxlbmd0aH0pKSx0LmRhdGE9Yy5idWZmZXIsZS5lbnF1ZXVlKHQpfXB1c2hTRUkodCl7dGhpcy5zZWlMaXN0LnB1c2godCl9cmV2b2tlU0VJKHQpe2NvbnN0IGU9dGhpcy5zZWlMaXN0LmZpbmRJbmRleCgoZT0+ZS51dWlkPT09dCkpO3JldHVybi0xIT09ZSYmKHRoaXMuc2VpTGlzdC5zcGxpY2UoZSwxKSwhMCl9c2V0Q29kZWModCl7dGhpcy5jdXJyZW50Q29kZWM9dH19InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYiRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGUiPT09c2VsZi5jb25zdHJ1Y3Rvci5uYW1lJiZzZWxmLmFkZEV2ZW50TGlzdGVuZXIoInJ0Y3RyYW5zZm9ybSIsKHQ9Pntjb25zdHt0cmFuc2Zvcm1lcjplfT10LHttYXhTRUlDb3VudDpyLHBheWxvYWRNYXA6bn09ZS5vcHRpb25zLGk9bmV3IHFnKHttYXhTRUlDb3VudDpyLHBheWxvYWRNYXA6bn0pLG89bmV3IFRyYW5zZm9ybVN0cmVhbSh7dHJhbnNmb3JtOmkuc2VuZFNFSVRyYW5zZm9ybS5iaW5kKGkpfSk7c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwodD0+e2xldHtkYXRhOmV9PXQ7Y29uc3R7dHlwZTpyLGNvbnRlbnQ6bn09ZTtpZigicHVzaCI9PT1yKWkucHVzaFNFSShuKTtlbHNle2lmKCJyZXZva2UiPT09cil7Y29uc3QgdD1pLnJldm9rZVNFSShuKTtyZXR1cm4gc2VsZi5wb3N0TWVzc2FnZSh7dHlwZToicmV2b2tlLWFjayIsY29udGVudDp7dXVpZDpuLGlzTm90U2VuZDp0fX0pfSJzZXRDb2RlYyI9PT1yJiZpLnNldENvZGVjKG4pfX0pKSxlLnJlYWRhYmxlLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhlLndyaXRhYmxlKX0pKX0oKTsK",IM="undefined"!=typeof window&&window.Blob&&new Blob([atob(TM)],{type:"text/javascript;charset=utf-8"});function gM(){let e;try{if(e=IM&&(DW||window.webkitURL).createObjectURL(IM),!e)throw"";return new Worker(e)}catch(t){return new Worker("data:application/javascript;base64,"+TM)}finally{!("undefined"!=typeof window&&navigator.userAgent.indexOf("Trident/")>0)&&e&&(DW||window.webkitlRL).revokeObjectURL(e)}}const RM={getNALUnits(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e.length-e.position<4)return[];const{position:i}=e;return 1===e.getInt32(i)||0===e.getInt16(i)&&1===e.getInt8(i+2)?RM.getAnnexbNals(e,t):RM.getAvccNals(e,t)},getAnnexbNals(e,t){const i=[];let o=RM.getHeaderPositionAnnexB(e),s=o.pos,r=s;for(;s<e.length-4;){const n=new Uint8Array(e.buffer.slice(s,s+o.headerLength));o.pos===e.position&&e.skip(o.headerLength),o=RM.getHeaderPositionAnnexB(e),r=o.pos;const a={header:n,body:new Uint8Array(e.buffer.slice(s+n.byteLength,r)),type:-1};t?RM.analyseH265Nal(a):RM.analyseNal(a),(a.type<=9||t&&a.type<=40)&&0!==a.type&&i.push(a),e.skip(r-e.position),s=r}return i},getAvccNals(e,t){const i=[];for(;e.position<e.length-4;){const o=e.getInt32(e.position);if(!(e.length-e.position>=o))break;{const s=new Uint8Array(e.buffer.slice(e.position,e.position+4));e.skip(4);const r=new Uint8Array(e.buffer.slice(e.position,e.position+o));e.skip(o);const n={header:s,body:r,type:-1};t?RM.analyseH265Nal(n):RM.analyseNal(n),n.type<=9&&0!==n.type&&i.push(n)}}return i},analyseNal(e){const t=31&e.body[0];switch(e.type=t,t){case 1:e.ndr=!0;break;case 5:e.idr=!0;break;case 6:e.sei=!0;break;case 7:e.sps=!0;break;case 8:e.pps=!0}},analyseH265Nal(e){const t=(126&e.body[0])>>1;switch(e.type=t,t){case 39:case 40:e.sei=!0}},getHeaderPositionAnnexB(e){let t=e.position,i=0;const o=e.length;for(;3!==i&&4!==i&&t<o-4;)0===e.getInt16(t)?1===e.getInt16(t+2)?i=4:1===e.getInt8(t+2)?i=3:t++:t++;return t===o-4&&(0===e.getInt16(t)?1===e.getInt16(t+2)?i=4:t=o:(t++,0===e.getInt16(t)&&1===e.getInt8(t)?i=3:t=o)),{pos:t,headerLength:i}},getCodecNameFromFrame(e,t){const{mimeType:i,payloadType:o}=e.getMetadata();return i?pT(i):o&&t?t[o]:void 0},isH265VideoFrame(e){var t;return((null===(t=e.getMetadata)||void 0===t||null===(t=t.call(e))||void 0===t?void 0:t.mimeType)||"").toLowerCase().includes("h265")}};class XM{constructor(e){Hu(this,"_position",0),Hu(this,"_dataview",void 0),this._dataview=new DataView(e)}get length(){return this.buffer.byteLength}get buffer(){return this._dataview.buffer}set position(e){this._position=e}get position(){return this._position}back(e){this.position-=e}getUint8(e){return this._dataview.getUint8(e)}getInt8(e){return this._dataview.getInt8(e)}getInt16(e){return this._dataview.getInt16(e)}getUint16(e){return this._dataview.getUint16(e)}getUint32(e){return this._dataview.getUint32(e)}getInt32(e){return this._dataview.getInt32(e)}skip(e){const t=Math.floor(e/4),i=e%4;for(let o=0;o<t;o++)XM.readByte(this,4);i>0&&XM.readByte(this,i)}static readByte(e,t,i){let o;switch(t){case 1:o=i?e.getInt8(e.position):e.getUint8(e.position);break;case 2:o=i?e.getInt16(e.position):e.getUint16(e.position);break;case 3:if(i)throw new Error("not supported for readByte 3");o=e.getUint8(e.position)<<16,o|=e.getUint8(e.position+1)<<8,o|=e.getUint8(e.position+2);break;case 4:o=i?e.getInt32(e.position):e.getUint32(e.position);break;case 8:if(i)throw new Error("not supported for readBody 8");o=e.getUint32(e.position)<<32,o|=e.getUint32(e.position+4);break;default:o=""}return e.position+=t,o}readUint8(){return XM.readByte(this,1)}readUint16(){return XM.readByte(this,2)}readUint24(){return XM.readByte(this,3)}readUint32(){return XM.readByte(this,4)}readUint64(){return XM.readByte(this,8)}readInt8(){return XM.readByte(this,1,!0)}readInt16(){return XM.readByte(this,2,!0)}readInt32(){return XM.readByte(this,4,!0)}writeUint32(e){return new Uint8Array([e>>>24&255,e>>>16&255,e>>>8&255,255&e])}}class LM{constructor(e){Hu(this,"skipFilter",void 0),Hu(this,"postMessage",void 0),Hu(this,"currentCodec",void 0),Hu(this,"payloadMap",void 0),this.skipFilter=e.skipFilter,this.postMessage=e.postMessage,this.payloadMap=e.payloadMap}transform(e,t){var i;const o=null!==(i=RM.getCodecNameFromFrame(e,this.payloadMap))&&void 0!==i?i:this.currentCodec;if(o!==zS.H264&&o!==zS.H265)return void t.enqueue(e);RM.getNALUnits(new XM(e.data),o===zS.H265).forEach((e=>{if(e.sei){const t=jg.decodeSEIBody(e.body,o===zS.H265);t&&(this.skipFilter||t.type===Fg.external)&&this.postMessage(t)}})),t.enqueue(e)}setCodec(e){this.currentCodec=e}}"undefined"!=typeof self&&"DedicatedWorkerGlobalScope"===self.constructor.name&&self.addEventListener("rtctransform",(e=>{const{transformer:t}=e,{streamId:i,skipFilter:o,payloadMap:s}=t.options,r=new LM({postMessage:e=>{self.postMessage({streamId:i,msg:e},[e.payload.buffer])},skipFilter:o,payloadMap:s}),n=new TransformStream({transform:r.transform.bind(r)});self.addEventListener("message",(e=>{let{data:t}=e;const{type:o,content:s}=t;"setCodec"===o&&i===t.streamId&&r.setCodec(s)})),t.readable.pipeThrough(n).pipeTo(e.transformer.writable)}));class CM{constructor(e){Hu(this,"seiList",[]),Hu(this,"maxSEICount",1),Hu(this,"payloadMap",void 0),Hu(this,"currentCodec",void 0),this.maxSEICount=e.maxSEICount,this.payloadMap=e.payloadMap}sendSEITransform(e,t){var i;const{maxSEICount:o,seiList:s}=this;if(null!==(i=RM.getCodecNameFromFrame(e,this.payloadMap))&&void 0!==i||this.currentCodec,!this.seiList.length)return void t.enqueue(e);const r=[];let n=0;for(const l of s){var a;if(r.length>=o)break;const t=null!==(a=RM.getCodecNameFromFrame(e,this.payloadMap))&&void 0!==a?a:this.currentCodec;if(t!==zS.H264&&t!==zS.H265)continue;const i=jg.generateSEI(l.content,t===zS.H265);n+=i.byteLength,l.repeatCount--,r.push(i)}this.seiList=s.filter((e=>e.repeatCount>0));const d=new Uint8Array(n+e.data.byteLength);d.set(new Uint8Array(e.data));let c=e.data.byteLength;r.forEach((e=>{d.set(e,c),c+=e.byteLength})),e.data=d.buffer,t.enqueue(e)}pushSEI(e){this.seiList.push(e)}revokeSEI(e){const t=this.seiList.findIndex((t=>t.uuid===e));return-1!==t&&(this.seiList.splice(t,1),!0)}setCodec(e){this.currentCodec=e}}"undefined"!=typeof self&&"DedicatedWorkerGlobalScope"===self.constructor.name&&self.addEventListener("rtctransform",(e=>{const{transformer:t}=e,{maxSEICount:i,payloadMap:o}=t.options,s=new CM({maxSEICount:i,payloadMap:o}),r=new TransformStream({transform:s.sendSEITransform.bind(s)});self.addEventListener("message",(e=>{let{data:t}=e;const{type:i,content:o}=t;if("push"===i)s.pushSEI(o);else{if("revoke"===i){const e=s.revokeSEI(o);return self.postMessage({type:"revoke-ack",content:{uuid:o,isNotSend:e}})}"setCodec"===i&&s.setCodec(o)}})),t.readable.pipeThrough(r).pipeTo(t.writable)}));class WM{constructor(e,t,i){var o;Hu(this,"_target",void 0),Hu(this,"_timer",null),Hu(this,"_receivers",void 0),Hu(this,"_previousStats",void 0),Hu(this,"_diffExceededCount",0),Hu(this,"_logger",void 0),this._ctx=e,this._config=t,this._hooks=i,this._target=null!==(o=t.initialSizeMs)&&void 0!==o?o:null,this._logger=new xv("JitterStepper",3,this._ctx.id)}updateTarget(e,t){return this._logger.info("updateTarget","target=".concat(e,", progressive=").concat(t)),this._target=e,null===e&&this._receivers?(GM(this._receivers.audio,null),this._hooks.stabled(null),this._pause(),void this._logger.warn("updateTarget","set as null, stop jitter stepper")):!t&&this._receivers?(GM(this._receivers.audio,e),void this._logger.warn("updateTarget","no progressive mode, set and stop")):void this._maybeStart()}setReceivers(e){this._logger.info("setReceivers","receivers=".concat(e)),this._receivers=e,null!==this._target&&e&&(this._logger.warn("setReceivers","set initial jitter ".concat(this._target," to receivers")),GM(e.audio,this._target)),this._maybeStart()}destroy(){this._logger.warn("destroy",""),this._pause(),this._target=null,this._receivers=void 0,this._previousStats=void 0}_maybeStart(){this._logger.info("_maybeStart",""),this._timer?this._logger.warn("_maybeStart","timer existed"):this._receivers?this._setInterval(this._intervalHandler.bind(this),this._config.intervalMs):this._logger.warn("_maybeStart","no receivers")}_setInterval(e,t){const i=()=>{e(),null!==this._timer&&(this._timer=setTimeout(i,t))};this._timer=setTimeout(i,0)}_pause(){null!==this._timer&&(clearTimeout(this._timer),this._timer=null),this._previousStats=void 0}async _intervalHandler(){const e=this._target;if(null===e)return this._logger.warn("_intervalHandler","target is null, pause"),void this._pause();if(!this._receivers)return this._logger.warn("_intervalHandler","no receivers, pause"),void this._pause();const t=function(e){const t=ZZ();return t?null===e[t]?0:e[t]:Number.NaN}(this._receivers.audio);if(null===t)return this._logger.error("_intervalHandler","get jitter buffer targete failed, pause"),void this._pause();if(t===e)return this._logger.success("_intervalHandler","current meet the target"),this._pause(),void this._hooks.stabled(e);const[i,o]=await Promise.all([VM(this._receivers.audio),VM(this._receivers.video)]);if(!i||!o)return void this._logger.warn("_intervalHandler","no current stats, try again");if(!this._previousStats)return this._previousStats={audio:i,video:o},void this._logger.warn("_intervalHandler","no previous stats, try again");const{jitterBufferDelay:s,syncDiff:r}=function(e,t){var i,o;const s={video:1e3*(t.video.jitterBufferDelay-e.video.jitterBufferDelay)/(t.video.jitterBufferEmittedCount-e.video.jitterBufferEmittedCount),audio:1e3*(t.audio.jitterBufferDelay-e.audio.jitterBufferDelay)/(t.audio.jitterBufferEmittedCount-e.audio.jitterBufferEmittedCount)};Number.isNaN(s.audio)&&(s.audio=null);Number.isNaN(s.video)&&(s.video=null);const r={video:null!==(i=t.video.estimatedPlayoutTimestamp)&&void 0!==i?i:null,audio:null!==(o=t.audio.estimatedPlayoutTimestamp)&&void 0!==o?o:null},n=r.video&&r.audio?Math.abs(r.video-r.audio):s.video&&s.audio?Math.abs(s.video-s.audio):null;return{jitterBufferDelay:s,estimatedPlayoutTimestamp:r,syncDiff:n}}(this._previousStats,{video:o,audio:i});if(this._logger.info("_intervalHandler","jitterBufferDelay: audio=".concat(s.audio,", video:").concat(s.video,", syncDiff=").concat(r)),this._previousStats={audio:i,video:o},null===r)return void this._logger.warn("_intervalHandler","cannot get syncDiff, wait for next try");const n=r>this._config.maxAVSyncDiff;if(this._diffExceededCount=n&&s.audio&&s.video&&s.video>s.audio?this._diffExceededCount+1:0,this._diffExceededCount>this._config.maxDiffExceedCount&&s.video&&s.audio)return this._logger.error("_intervalHandler","video jitter larger than audio, trigger workaround. diffExceedCount=".concat(this._diffExceededCount,", video=").concat(s.video,", audio=").concat(s.audio)),GM(this._receivers.audio,Math.min(Math.round(s.video),e)),void(this._diffExceededCount=0);if(n)return void this._logger.warn("_intervalHandler","audio video is off sync, syncDiff=".concat(r));const a=function(e,t){return{video:null!==e.video&&null!==t.video?Math.abs(t.video-e.video):null,audio:null!==e.audio&&null!==t.audio?Math.abs(t.audio-e.audio):null}}(s,{audio:t,video:t});if(null!==a.video&&a.video>this._config.maxSetDiff||null!==a.audio&&a.audio>this._config.maxSetDiff)return void this._logger.warn("_intervalHandler","receiver is off sync with setting, setDiff=".concat(a));const d=e>t?1:-1,c=Math.abs(e-t)>this._config.stepSizeMs?t+d*this._config.stepSizeMs:e;GM(this._receivers.audio,c)}}function GM(e,t){const i=ZZ();if(!i)return null;try{e[i]=t}catch(o){return null}}async function VM(e){const t=await e.getStats();let i,o,s,r;if(null==t||t.forEach((e=>{"inbound-rtp"===e.type&&(i=e.timestamp,void 0!==e.jitterBufferDelay&&void 0!==e.jitterBufferEmittedCount&&(o=Number(e.jitterBufferDelay),s=Number(e.jitterBufferEmittedCount),"number"==typeof o&&"number"==typeof s||(o=void 0,s=void 0)),r=e.estimatedPlayoutTimestamp)})),void 0===i&&(i=Date.now()),console.warn("getJitterBufferStats",o,s),void 0!==o&&void 0!==s)return{jitterBufferDelay:o,jitterBufferEmittedCount:s,estimatedPlayoutTimestamp:r,timestamp:i}}class EM extends Ig{constructor(e){super(),Hu(this,"uuid",ap()),Hu(this,"isScreen",!1),Hu(this,"audioMid",void 0),Hu(this,"videoMid",void 0),Hu(this,"audioMLine",void 0),Hu(this,"videoMLine",void 0),Hu(this,"videoTransceiver",void 0),Hu(this,"audioTransceiver",void 0),Hu(this,"vendorHandler",void 0),Hu(this,"vendorCode",0),Hu(this,"engineId",void 0),Hu(this,"logger",void 0),Hu(this,"__seiHelper",jg),Hu(this,"logName","StreamBase"),Hu(this,"isPublicStream",!1),this._ctx=e,this.engineId=e.id,this.logger=new xv(this.constructor.name,2,e.id)}stopReport(e){this.statsReport.stopReport(e)}destroy(){var e,t;delete this.audioMid,delete this.videoMid,this.statsReport.destroy(),null===(e=this.observer)||void 0===e||e.reset(),delete this.videoTransceiver,delete this.audioTransceiver,null===(t=this.vendorHandler)||void 0===t||t.destroy(),this.vendorCode=0,delete this.vendorHandler}}var PM=(e=>(e[e.INIT=0]="INIT",e[e.SUB_ING=1]="SUB_ING",e[e.SUB_ED=2]="SUB_ED",e))(PM||{});class kM extends EM{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:vN.STREAM_INDEX_MAIN;super(e),Hu(this,"id",void 0),Hu(this,"stream",void 0),Hu(this,"streamId",void 0),Hu(this,"videoTrack",void 0),Hu(this,"audioTrack",void 0),Hu(this,"subVideoDescriptions",[]),Hu(this,"observer",void 0),Hu(this,"statsReport",void 0),Hu(this,"pubAudio",!1),Hu(this,"pubVideo",!1),Hu(this,"blackFrameRenderInterval",void 0),Hu(this,"blackFrameLifetimeInterval",void 0),Hu(this,"pubAttributes",void 0),Hu(this,"pcSessionId",void 0),Hu(this,"maxSeiCount",1),Hu(this,"preReports",{audio:{},video:{}}),Hu(this,"remoteSdp",void 0),Hu(this,"_currentVideoCodec",void 0),Hu(this,"_changeCodecs",[]),Hu(this,"_videoCaps",[]),Hu(this,"_sendSEIHandler",void 0),Hu(this,"_trackMatchingTimer",void 0),Hu(this,"logName","LocalStream"),this.stream=new MediaStream,this.id=ap(),this.pubAttributes={localaudio:!1,localvideo:!1,videostream:!1,audiostream:!1,extvideo:!1,extaudio:!1,videoDescriptions:[],videoType:xg.NORMAL},this.isScreen=t===vN.STREAM_INDEX_SCREEN,this.statsReport=new iG(e,this),this.statsReport.on("stats-exception",(e=>this.emit("stats-exception",e)));const i=WZ("SEI_COUNT_FPS");"number"==typeof i&&i<=10&&(this.maxSeiCount=i),this._trackMatchingTimer=setInterval(this._checkTrackMatching.bind(this),5e3)}get enableSimulcast(){return!this.isScreen&&this._ctx.videoProfile.getSimulcastMode()}get videoEncodeConfig(){return this.isScreen?[this._ctx.videoProfile.getScreenEncodeConfig()]:this._ctx.videoProfile.getVideoEncodeConfig()}get audioHasCapture(){return this.pubAttributes.localaudio}get audioHasPublish(){return this.pubAttributes.audiostream}get videoHasCapture(){return this.pubAttributes.localvideo}get videoHasPublish(){return this.pubAttributes.videostream}get isEmptyStream(){return!this.audioTrack&&!this.videoTrack}get initStreamId(){return this.stream.id}get currentVideoCodec(){return this._currentVideoCodec}set currentVideoCodec(e){var t;(this._currentVideoCodec=e,void 0!==e)&&(null===(t=this._sendSEIHandler)||void 0===t||t.setCodec(e))}async getSelectedCodec(){var e;const t=this._changeCodecs.length>0?this._changeCodecs:this._videoCaps.length>0?this._videoCaps:await QS(),i=this._ctx.videoProfile.getPreferCodec(this.isScreen),o=this.isScreen?this._ctx.getTargetScreenCodec():this._ctx.getTargetCodec();if(this.logger.info("getSelectedCodec","availableCodecs=".concat(t,", preferCodec=").concat(i,", targetCodec=").concat(o)),i&&i!==rm.AUTO){if(i===rm.H264&&t.includes(zS.H264))return zS.H264;if(i===rm.VP8&&t.includes(zS.VP8))return zS.VP8;if(i===rm.H265&&t.includes(zS.H265))return zS.H265}if(null!==(e=this._ctx.serverConfig)&&void 0!==e&&e.videoCodec&&t.includes(this._ctx.serverConfig.videoCodec))return this._ctx.serverConfig.videoCodec;if(i===rm.AUTO&&t.length>0)return t[0];if(o&&t.includes(o))return o;if(t.includes(zS.H265))return zS.H265;if(t.includes(zS.H264))return zS.H264;if(t.includes(zS.VP8))return zS.VP8;throw new Error("no available codec")}startReport(e,t){this.statsReport.setLocalStreamStatsEvtInterval(e,t)}getLocalStreamStats(){return this.statsReport.getLocalStats()}initVideoEncodedTransform(){if(WZ("DISABLE_ENCODED_TRANSFORM"))return void this.logger.warn("initVideoEncodedTransform","DISABLE_ENCODED_TRANSFORM");if(!this.videoTransceiver||!this.videoTransceiver.sender)return void this.logger.warn("initVideoEncodedTransform","no sender found when trying to bind encodedTransform");const{sender:e}=this.videoTransceiver;if(this._ctx.pcKillSwitch.ctor_encodedinsetablestream_add&&cZ()){const{readable:t,writable:i}=e.createEncodedStreams();if(window.__createDecodeError__)t.pipeThrough(new TransformStream({transform:(e,t)=>{const i=e.data,o=new DataView(i,16);o.setInt16(4,10),o.setInt16(11,20),t.enqueue(e)}})).pipeTo(i);else{const e=new CM({maxSEICount:this.maxSeiCount,payloadMap:RN.videoPayloadMap}),o=new TransformStream({transform:e.sendSEITransform.bind(e)});t.pipeThrough(o).pipeTo(i),this._sendSEIHandler=e}}else if(dZ()){const e=new gM;this.videoTransceiver.sender.transform=new RTCRtpScriptTransform(e,{maxSEICount:this.maxSeiCount,payloadMap:RN.videoPayloadMap}),this._sendSEIHandler={pushSEI:t=>{e.postMessage({type:"push",content:t},[t.content.buffer])},revokeSEI:async t=>(e.postMessage({type:"revoke",content:t}),new Promise((i=>{e.addEventListener("message",(e=>{let{data:o}=e;const{type:s,content:r}=o,{uuid:n,isNotSend:a}=r;"revoke-ack"===s&&n===t&&i(a)}))}))),setCodec:t=>{e.postMessage({type:"setCodec",content:t})}}}var t;void 0!==this.currentVideoCodec&&(null===(t=this._sendSEIHandler)||void 0===t||t.setCodec(this.currentVideoCodec))}initAudioEncodedTransform(){if(WZ("DISABLE_ENCODED_TRANSFORM"))return void this.logger.warn("initAudioEncodedTransform","DISABLE_ENCODED_TRANSFORM");if(!this.audioTransceiver||!this.audioTransceiver.sender)return void this.logger.warn("initAudioEncodedTransform","no sender found when trying to bind encodedTransform");if(!this._ctx.pcKillSwitch.ctor_encodedinsetablestream_add)return void this.logger.warn("initAudioEncodedTransform","legacy EncodedTransform is not supported");if(!cZ())return void this.logger.warn("initAudioEncodedTransform","legacy EncodedTransform is not supported");const{sender:e}=this.audioTransceiver,{readable:t,writable:i}=e.createEncodedStreams();t.pipeThrough(new TransformStream({transform:(e,t)=>{t.enqueue(e)}})).pipeTo(i)}clean(){vv(this.engineId,"localstream_clean","".concat((new Error).stack),0,this.streamId||""),super.destroy(),this.subVideoDescriptions=[],clearTimeout(this.blackFrameLifetimeInterval),clearInterval(this.blackFrameRenderInterval)}switchTrackEnableState(e,t){var i;let o;"audio"===e?o=this.audioTrack:"video"===e&&(o=this.videoTrack);const s=null===(i=o)||void 0===i?void 0:i.mediaTrack;return!(!s||(null==s?void 0:s.enabled)===t)&&(s.enabled=t,!0)}resetStream(){this.stream=new MediaStream}genBlackFrame(e){var t,i;this.logger.info("genBlackFrame()");const o=e===zS.H265?200:16,s=null!==(t=this.videoEncodeConfig[0])&&void 0!==t&&t.frameRate?iT(null===(i=this.videoEncodeConfig[0])||void 0===i?void 0:i.frameRate):15,r=Math.ceil(1e3/s),n=document.createElement("canvas"),a=n.getContext("2d");n.width=o,n.height=o;const d=e=>{e.fillRect(0,0,o,o)};a&&(a.fillStyle="#000",d(a),this.blackFrameRenderInterval=window.setInterval((()=>{d(a)}),r),this.refreshBlackFrameLifetime());return n.captureStream(s).getVideoTracks()[0]}stopBlackFrame(){this.logger.info("stopBlackFrame()"),clearTimeout(this.blackFrameLifetimeInterval),clearInterval(this.blackFrameRenderInterval),delete this.blackFrameRenderInterval}refreshBlackFrameLifetime(){this.logger.info("refreshBlackFrameLifetime()"),this.blackFrameRenderInterval&&(clearTimeout(this.blackFrameLifetimeInterval),this.blackFrameLifetimeInterval=setTimeout((()=>{clearInterval(this.blackFrameRenderInterval),delete this.blackFrameRenderInterval,this.emit("black-frame-ended")}),XZ.BLACK_FRAME_LIFETIME))}setChangeCodecs(e){this._changeCodecs=e}setVideoCaps(e){if(!e)return;const t=hT(e);this._videoCaps=t}sendSEIMessage(e){var t;this.logger.info("sendSEIMessage"),null===(t=this._sendSEIHandler)||void 0===t||t.pushSEI(e)}async revokeSEIMessage(e){var t;return this.logger.info("revokeSEIMessage"),this._sendSEIHandler?null===(t=this._sendSEIHandler)||void 0===t?void 0:t.revokeSEI(e):(this.logger.warn("revokeSEIMessage","no sei handler found"),!1)}destroy(){clearInterval(this._trackMatchingTimer),super.removeAllListeners(),super.destroy()}_checkTrackMatching(){var e,t,i,o;const s=null===(e=this.audioTrack)||void 0===e?void 0:e.preprocessingTrack.id,r=null===(t=this.videoTrack)||void 0===t?void 0:t.preprocessingTrack.id,n=null===(i=this.audioTransceiver)||void 0===i||null===(i=i.sender.track)||void 0===i?void 0:i.id,a=null===(o=this.videoTransceiver)||void 0===o||null===(o=o.sender.track)||void 0===o?void 0:o.id;var d,c;this.pubAudio&&s!==n&&(this.logger.error("_checkTrackMatching","audio track id: ".concat(s," not matching transceiver track id ").concat(n,", streamId: ").concat(this.streamId)),null===(d=this._ctx.monitor)||void 0===d||d.report("rtc_error",{message:"audio track id: ".concat(s," not matching transceiver track id ").concat(n),error_code:-1,stream_id:this.streamId}));this.pubVideo&&r!==a&&(this.logger.error("_checkTrackMatching","video track id: ".concat(r," not matching transceiver track id ").concat(a,", streamId: ").concat(this.streamId)),null===(c=this._ctx.monitor)||void 0===c||c.report("rtc_error",{message:"video track id: ".concat(r," not matching transceiver track id ").concat(a),error_code:-1,stream_id:this.streamId}))}}class xM extends EM{constructor(e,t,i,o,s,r){super(e),Hu(this,"streamId",void 0),Hu(this,"userId",void 0),Hu(this,"isPublic",void 0),Hu(this,"hasVideo",void 0),Hu(this,"hasAudio",void 0),Hu(this,"_attributes",void 0),Hu(this,"streamState",void 0),Hu(this,"removeTrack",!1),Hu(this,"observer",void 0),Hu(this,"statsReport",void 0),Hu(this,"subVideo",void 0),Hu(this,"subAudio",void 0),Hu(this,"subMediaType",void 0),Hu(this,"subLayer",void 0),Hu(this,"_sequenceId",void 0),Hu(this,"stream",void 0),Hu(this,"videoTrack",void 0),Hu(this,"audioTrack",void 0),Hu(this,"recordedVideoFrames",void 0),Hu(this,"stillExist",void 0),Hu(this,"originalMediaType",void 0),Hu(this,"priority",void 0),Hu(this,"remoteSessionId",""),Hu(this,"originalStreamIndex",0),Hu(this,"virtual",void 0),Hu(this,"pcSessionId",void 0),Hu(this,"_virtualOccupy",void 0),Hu(this,"jitterBufferStepper",void 0),Hu(this,"_videoStallObserver",void 0),Hu(this,"_audioStallObserver",void 0),Hu(this,"preReports",{audio:{},video:{}}),Hu(this,"_installInfo",void 0),Hu(this,"_receiveSEIHandler",void 0),Hu(this,"_seiWorkerHandler",void 0),this.virtual=!1,this._virtualOccupy=!1,this.userId=t,this.isScreen=o,this.isPublic=s,this.streamId=i,this.logName="RemoteStream-".concat(i),this.hasAudio=r.audiostream&&r.localaudio,this.hasVideo=r.videostream&&r.localvideo,this._attributes=r,this.vendorCode=(null==r?void 0:r.vendorCode)||0,this.subVideo=!1,this.subAudio=!1,this._sequenceId=0,this.subMediaType=US.NONE,this.subLayer={spatialLayer:0,spatialSubLayer:-1},this.streamState=0,this.statsReport=new oG(e,this),this.statsReport.on("stats-exception",(e=>this.emit("stats-exception",e))),this.enableVendorMode&&(this.pcSessionId=ap());const n=this._ctx.jitterTargetConfig[this.isScreen?vN.STREAM_INDEX_SCREEN:vN.STREAM_INDEX_MAIN].get(this.userId);this.jitterBufferStepper=new WM(this._ctx,Ju(Ju({},this._ctx.jitterStepperConfig),{},{initialSizeMs:null===n?void 0:n}),{stabled:this._emitJitterStabled.bind(this)})}get vendor(){return this._attributes.vendorCode}get audioHasCapture(){return this._attributes.localaudio}get audioHasPublish(){return this._attributes.audiostream}get videoHasCapture(){return this._attributes.localvideo}get videoHasPublish(){return this._attributes.videostream}get sequenceId(){return this._sequenceId||-1}set sequenceId(e){"number"==typeof e&&(this._sequenceId=e)}get enableVendorMode(){return"number"==typeof this.attributes.vendorCode&&0!==this.attributes.vendorCode}get hasSubscribed(){return 2===this.streamState}get attributes(){var e;return null!==(e=this._attributes.alphaInfo)&&void 0!==e&&e.enableAlpha?Ju(Ju({},this._attributes),{},{videoDescriptions:this._attributes.videoDescriptions.map((e=>{var t,i,o,s;return Ju(Ju({},e),{},{height:null!==(t=null===(i=this._attributes.alphaInfo)||void 0===i?void 0:i.alphaHeight)&&void 0!==t?t:e.height/2,width:null!==(o=null===(s=this._attributes.alphaInfo)||void 0===s?void 0:s.alphaWidth)&&void 0!==o?o:e.width})}))}):this._attributes}set attributes(e){this.hasVideo=e.localvideo&&e.videostream,this.hasAudio=e.localaudio&&e.audiostream,this._attributes=e,this.vendorCode=e.vendorCode||0,e.alphaInfo&&this.videoTrack&&this.videoTrack.setAlphaInfo(e.alphaInfo)}get virtualOccupy(){return this._virtualOccupy}set virtualOccupy(e){var t;if(this._virtualOccupy&&!e)null===(t=this.observer)||void 0===t||t.setPushTrack(!1);else if(!this._virtualOccupy&&e){var i;null===(i=this.observer)||void 0===i||i.setPushTrack(!0)}this._virtualOccupy=e}startReport(e,t){this.statsReport.setRemoteStreamStatsEvtInterval(e,t)}getRemoteStreamStats(){return this.statsReport.getRemoteStreamStats()}initVideoEncodedTransform(){if(WZ("DISABLE_ENCODED_TRANSFORM"))this.logger.warn("initVideoEncodedTransform","DISABLE_ENCODED_TRANSFORM");else if(this.videoTransceiver&&this.videoTransceiver.receiver){if(this._ctx.pcKillSwitch.ctor_encodedinsetablestream_add&&cZ()){var e;null===(e=this._ctx.monitor)||void 0===e||e.report("rtc_invoke_status",{sdk_api_name:"initVideoEncodedTransform",message:"using legacy EncodedTransform",error_code:0,stream_id:this.streamId,elapse:0});const{receiver:t}=this.videoTransceiver,{readable:i,writable:o}=t.createEncodedStreams(),s=new LM({postMessage:e=>{this.safeEmit("onSEIMessage",e.payload)},skipFilter:!!WZ("SKIP_SEI_FILTER"),payloadMap:RN.videoPayloadMap}),r=new TransformStream({transform:s.transform.bind(s)});i.pipeThrough(r).pipeTo(o),this._receiveSEIHandler=s}else if(dZ()){var t;null===(t=this._ctx.monitor)||void 0===t||t.report("rtc_invoke_status",{sdk_api_name:"initVideoEncodedTransform",message:"using standard EncodedTransform",error_code:0,stream_id:this.streamId,elapse:0});const e=this._ctx.receiveSEIWorker;this.videoTransceiver.receiver.transform=new RTCRtpScriptTransform(e,{streamId:this.streamId,skipFilter:!!WZ("SKIP_SEI_FILTER"),payloadMap:RN.videoPayloadMap}),this._receiveSEIHandler={setCodec:t=>{e.postMessage({type:"setCodec",streamId:this.streamId,content:t})}},this._seiWorkerHandler=e=>{e.data.streamId===this.streamId&&this.safeEmit("onSEIMessage",e.data.msg.payload)},e.addEventListener("message",this._seiWorkerHandler)}}else this.logger.warn("no receiver found when trying to bind encodedTransform")}initAudioEncodedTransform(){if(WZ("DISABLE_ENCODED_TRANSFORM"))return void this.logger.warn("initVideoEncodedTransform","DISABLE_ENCODED_TRANSFORM");if(!this.audioTransceiver||!this.audioTransceiver.receiver)return void this.logger.warn("no receiver found when trying to bind encodedTransform");if(!this._ctx.pcKillSwitch.ctor_encodedinsetablestream_add)return void this.logger.warn("legacy EncodedTransform is not supported");if(!cZ())return void this.logger.warn("legacy EncodedTransform is not supported");const{receiver:e}=this.audioTransceiver,{readable:t,writable:i}=e.createEncodedStreams();t.pipeThrough(new TransformStream({transform:(e,t)=>{e.data.byteLength<=1e3?t.enqueue(e):this.logger.print("too large audio frame",e.data.byteLength)}})).pipeTo(i)}ontrack(e){var t;try{vv(this.engineId,"Stream.ontrack",JSON.stringify({uid:this.userId,streamId:this.streamId,streams:e.streams.reduce(((e,t)=>e+lp(t)),""),transceiver:hp(e.transceiver),track:cp(e.track)}),0,this.streamId||"")}catch(oK){}if(this.enableVendorMode||null!==(t=e.streams)&&void 0!==t&&null!==(t=t[0])&&void 0!==t&&null!==(t=t.id)&&void 0!==t&&t.includes(this.streamId)){var i;const{track:t}=e;"video"===(null==t?void 0:t.kind)?this._setVideoTrack(t):"audio"===(null===(i=e.track)||void 0===i?void 0:i.kind)&&this._setAudioTrack(t),this._setStream(e.streams[0])}this.safeEmit("ontrack",e)}startVideoStallObserve(e){this.logger.info("startVideoStallObserve","invoke",e.playerId),this._videoStallObserver||(this._videoStallObserver=new CN(this.isScreen,this.engineId)),this._videoStallObserver.start(e)}stopVideoStallObserve(){var e;this.logger.info("stopVideoStallObserve","invoke"),null===(e=this._videoStallObserver)||void 0===e||e.stop()}updateVideoStallInfo(e,t,i){let o;var s;i?(o=null===(s=this._videoStallObserver)||void 0===s?void 0:s.getStallInfo({interval:e.stats_interval||0,bitrate:e.bitrate,frameRateDecoded:e.frame_rate_decoded,frameRateReceived:e.frame_rate_received}),this._installInfo=o):o=this._installInfo;if(o){const s=Math.min(o.report.stallDuration,e.stats_interval||0);if(e.play_time=o.pts,e.stall_count=o.report.stallCount,e.is_screen?e.stuck_length=s:e.stall_duration=s,e.pause_duration=Math.min(s,o.pauseDuration),t.stallCount=o.callback.stallCount,t.stallDuration=o.callback.stallDuration,o.stall100ms){const i=Math.min(o.stall100ms.duration,e.stats_interval||0);e.stall_duration_100ms=i,e.stall_count_100ms=o.stall100ms.count,t.stallDuration100MS=i,t.stallCount100MS=o.stall100ms.count}var r;if(0!==o.report.stallCount||0!==o.report.stallDuration)this.logger.print("video_stall_report",this.userId,null===(r=this.videoTrack)||void 0===r?void 0:r.observingPlayerId,JSON.stringify(o.report),i)}}getVideoRenderInfo(){var e;return(null===(e=this._videoStallObserver)||void 0===e?void 0:e.getRecentRenderInfo4Report())||{}}stopAudioStallObserve(){var e;this.logger.info("stopAudioStallObserve","invoke"),null===(e=this._audioStallObserver)||void 0===e||e.stop()}async updateAudioStallInfo(e,t,i){if(this._audioStallObserver){const i=await this._audioStallObserver.getAudioStallInfo();return e.concealedSamples===e.interval_concealed_samples&&e.totalSamplesReceived===e.interval_samples_received?(e.stall_count=0,e.stall_duration=0,t.stallCount=0,t.stallDuration=0):(e.stall_count=i.report.stall_count,e.stall_duration=i.report.stall_duration,t.stallCount=i.callback.stall_count,t.stallDuration=i.callback.stall_duration),0===i.report.stall_count&&0===i.report.stall_duration||this.logger.print("audio_stall_report",this.userId,JSON.stringify(Ju(Ju({},i.report),{},{callbackList:i.callback.list}))),i.extra}this._audioStallObserver=new WN(this),this._audioStallObserver.start(i.concealedSamples,i.totalSamplesReceived),this.logger.print("startAduioObserver","start")}updateJitterTarget(e,t){this.jitterBufferStepper.updateTarget(e,t)}_emitJitterStabled(e){this.emit("onJitterStabled",e)}resetStream(){var e,t;null===(e=this.audioTransceiver)||void 0===e||e.stop(),null===(t=this.videoTransceiver)||void 0===t||t.stop(),this.audioTransceiver=void 0,this.videoTransceiver=void 0,this.jitterBufferStepper.setReceivers(void 0)}clean(){var e,t;this.logger.info("clean","exec stream.clean ".concat(this.streamId," ").concat(this.userId)),vv(this.engineId,"remotestream_clean","".concat((new Error).stack),0,this.streamId),super.destroy(),this.jitterBufferStepper.setReceivers(void 0),this.subAudio=!1,this.subVideo=!1,this.sequenceId=0,null===(e=this.videoTrack)||void 0===e||e.destroy(),this.videoTrack=void 0,null===(t=this.audioTrack)||void 0===t||t.destroy(),this.audioTrack=void 0,this.stream=void 0,this.recordedVideoFrames=void 0,delete this.priority,this._seiWorkerHandler&&this._ctx.receiveSEIWorker.removeEventListener("message",this._seiWorkerHandler)}destroy(){var e,t;this.clean(),null===(e=this._audioStallObserver)||void 0===e||e.destroy(),delete this._audioStallObserver,null===(t=this._videoStallObserver)||void 0===t||t.destroy(),delete this._videoStallObserver,this.attributes={audiostream:!1,localaudio:!1,localvideo:!1,videostream:!1,extvideo:!1,extaudio:!1,videoDescriptions:[]},this.jitterBufferStepper.destroy(),super.removeAllListeners()}resetHasSubscribed(){this.streamState=0}_setStream(e){this.stream=e,e.onaddtrack=e=>{"video"===e.track.kind?this._setVideoTrack(e.track):"audio"===e.track.kind&&this._setAudioTrack(e.track)}}_setAudioTrack(e){var t;if((null===(t=this.audioTrack)||void 0===t||null===(t=t.preprocessingTrack)||void 0===t?void 0:t.id)!==e.id){this.audioTrack=fM(this._ctx,e,{streamIndex:this.isPublic?Yg.PUBLIC:this.virtual?Yg.VIRTUAL:this.isScreen?Yg.SCREEN:Yg.MAIN,streamUserId:this.userId});const t=this._ctx._remoteAudioTrackDumpConfig[this.isScreen?vN.STREAM_INDEX_SCREEN:vN.STREAM_INDEX_MAIN].get(this.userId);var i;if(null!=t&&t.callback&&null!=t&&t.frameSize)null===(i=this.audioTrack)||void 0===i||i.setDataFetcher(t.frameSize,(e=>{var i;this.audioHasCapture&&this.audioHasPublish&&(null===(i=t.callback)||void 0===i||i.call(t,e))}));this.emit("ontrack",this.audioTrack)}}_setVideoTrack(e){var t;(null===(t=this.videoTrack)||void 0===t||null===(t=t.preprocessingTrack)||void 0===t?void 0:t.id)!==e.id&&(this.videoTrack=function(e,t,i,o){return new AN(e,t,i,Ju({},o))}(this._ctx,e,this,{streamIndex:this.isPublic?Yg.PUBLIC:this.virtual?Yg.VIRTUAL:this.isScreen?Yg.SCREEN:Yg.MAIN,streamUserId:this.userId}),this.emit("ontrack",this.videoTrack))}}var NM=(e=>(e.RESUBSCRIBE="resubscribe",e.STREAM_FAILED="stream_failed",e.SUBSCRIBE_PUSH_TRACK="subscribe_push_track",e.REMOVE_PUSH_TRACK="remove_push_track",e.VIDEO_FIRST_FRAME="video_first_frame",e.ON_USER_PUBLISH_STATE_CHANGE="on_user_publish_state_change",e.ON_USER_START_AUDIO_CAPTURE="on_user_start_audio_capture",e.ON_USER_STOP_AUDIO_CAPTURE="on_user_stop_audio_capture",e.ON_USER_START_VIDEO_CAPTURE="on_user_start_video_capture",e.ON_USER_STOP_VIDEO_CAPTURE="on_user_stop_video_capture",e.ON_SEI_MESSAGED_RECEIVED="on_sei_messaged_received",e.ON_PUBLISH_RESULT="on_publish_result",e.ON_SUBSCRIBE_RESULT="ON_SUBSCRIBE_RESULT",e.ON_UPDATE_TOKEN_SUCCESS="on_update_token_success",e.ON_REMOTE_STREAM_STATS="ON_REMOTE_STREAM_STATS",e.ON_LOCAL_STREAM_STATS="ON_LOCAL_STREAM_STATS",e.ON_USER_LEAVE="on_user_leave",e.ON_ROOM_ERROR="on_room_error",e.ON_NETWORK_QUALITY="on_network_quality",e.ON_SIMULCAST_SUBSCRIBE_FALLBACK="on_simulcast_subscribe_fallback",e.ON_REMOTE_VIDEO_SIZE_CHANGED="on_remote_video_size_changed",e.ON_SUBTITLE_STATE_CHANGED="ON_SUBTITLE_STATE_CHANGED",e.ON_SUBTITLE_MESSAGE_RECEIVED="ON_SUBTITLE_MESSAGE_RECEIVED",e.ON_VIDEO_STREAM_BANNED="ON_VIDEO_STREAM_BANNED",e.ON_AUDIO_STREAM_BANNED="ON_AUDIO_STREAM_BANNED",e.ON_FORWARD_STREAM_ERROR="ON_FORWARD_STREAM_ERROR",e.ON_REJOIN_WITH_TCP="ON_REJOIN_WITH_TCP",e.PUB_RETRY="PUB_RETRY",e.SUB_RETRY="SUB_RETRY",e.VIDEO_TYPE_CHANGE="VIDEO_TYPE_CHANGE",e.JOIN_SUCCESS="JOIN_SUCCESS",e.UPDATE_PUBLISH="UPDATE_PUBLISH",e.ON_LOCAL_STATS_EXCEPTION="ON_LOCAL_STATS_EXCEPTION",e.ON_REMOTE_STATS_EXCEPTION="ON_REMOTE_STATS_EXCEPTION",e.ON_JITTER_STABLED="ON_JITTER_STABLED",e))(NM||{}),MM=(e=>(e[e.START=1]="START",e[e.START_SUCCESS=2]="START_SUCCESS",e[e.START_FAILED=3]="START_FAILED",e[e.UPDATE=4]="UPDATE",e[e.UPDATE_SUCCESS=5]="UPDATE_SUCCESS",e[e.UPDATE_FAILED=6]="UPDATE_FAILED",e[e.STOP=7]="STOP",e[e.STOP_SUCCESS=8]="STOP_SUCCESS",e[e.STOP_FAILED=9]="STOP_FAILED",e))(MM||{}),YM=(e=>(e[e.PUB=0]="PUB",e[e.UNPUB=1]="UNPUB",e))(YM||{});const wM=async(e,t,i,o)=>{try{var s,r,n,a;let m="",h=-1;const p="video"===t?null==i||null===(s=i.videoTrack)||void 0===s?void 0:s.originTrack:null==i||null===(r=i.audioTrack)||void 0===r?void 0:r.originTrack,b="video"===t?null==i||null===(n=i.videoTransceiver)||void 0===n?void 0:n.receiver:null==i||null===(a=i.audioTransceiver)||void 0===a?void 0:a.receiver;try{var d,c;const i=await(null===(d=e.peerConnection)||void 0===d?void 0:d.getStatsWithLowFrequency(p,!0,b)),o=(i||[]).find((e=>"inbound-rtp"===e.type)),s=await(null==b?void 0:b.getStats()),r=[];let n;var l;if(null==s||s.forEach((e=>r.push(e.type))),0===(null==i?void 0:i.length)&&0!==r.length)n=await(null===(l=e.peerConnection)||void 0===l?void 0:l.getStatsWithLowFrequency(void 0,void 0,b));m=JSON.stringify({type:t,reports:i.map((e=>e.type)),reports2:r,pc:(null===(c=e.peerConnection)||void 0===c?void 0:c.getOriginRTCPeerConnection())||null,track:(null==p?void 0:p.id)||null,bytes:null==o?void 0:o.bytesReceived,framesReceived:null==o?void 0:o.framesReceived,packetsReceived:null==o?void 0:o.packetsReceived,allReports:n})}catch(u){h=-999,m=u.mseeage||JSON.stringify(u)}null==o||o.report("rtc_invoke_status",{sdk_api_name:"first_frame_recv_timeout",error_code:h,message:m,stream_id:(null==i?void 0:i.streamId)||"",stream_user_id:null==i?void 0:i.userId,elapse:0})}catch(u){}},KM=async(e,t,i,o)=>{try{var s,r,n,a;let m="",h=-1;const p="video"===t?null==i||null===(s=i.videoTrack)||void 0===s?void 0:s.preprocessingTrack:null==i||null===(r=i.audioTrack)||void 0===r?void 0:r.preprocessingTrack,b="video"===t?null==i||null===(n=i.videoTransceiver)||void 0===n?void 0:n.sender:null==i||null===(a=i.audioTransceiver)||void 0===a?void 0:a.sender;try{var d,c;const i=await(null===(d=e.peerConnection)||void 0===d?void 0:d.getStatsWithLowFrequency(p,!0,b)),o=(i||[]).find((e=>"outbound-rtp"===e.type)),s=await(null==b?void 0:b.getStats()),r=[];let n;var l;if(null==s||s.forEach((e=>r.push(e.type))),0===i.length&&0!==r.length)n=await(null===(l=e.peerConnection)||void 0===l?void 0:l.getStatsWithLowFrequency(void 0,void 0,b));m=JSON.stringify({type:t,reports:i.map((e=>e.type)),reports2:r,pc:(null===(c=e.peerConnection)||void 0===c?void 0:c.getOriginRTCPeerConnection())||null,track:(null==p?void 0:p.id)||null,bytes:null==o?void 0:o.bytesSent,framesSent:null==o?void 0:o.framesSent,packetsSent:null==o?void 0:o.packetsSent,allReports:n})}catch(u){h=-999,m=u.mseeage||JSON.stringify(u)}null==o||o.report("rtc_invoke_status",{sdk_api_name:"first_frame_send_timeout",error_code:h,message:m,stream_id:(null==i?void 0:i.streamId)||"",stream_user_id:null==i?void 0:i.userId,elapse:0})}catch(u){}};class HM extends Zg.EventEmitter{constructor(e,t){super(),Hu(this,"_audioEventSessionId",Df()),Hu(this,"_videoEventSessionId",Df()),Hu(this,"_stream",void 0),Hu(this,"_firstAudioFrameTimer",void 0),Hu(this,"_firstVideoFrameTimer",void 0),Hu(this,"_transportDelayInterval",void 0),Hu(this,"_transportDelay",void 0),Hu(this,"_firstVideoFrameInterval",void 0),Hu(this,"_firstAudioFrameInterval",void 0),Hu(this,"_isScreen",!1),Hu(this,"_audioFirstFrameState",0),Hu(this,"_videoFirstFrameState",0),Hu(this,"_timeout",1e4),Hu(this,"_currentAudioRecv",{startTime:0,eventSessionId:0,type:"login"}),Hu(this,"_currentVideoRecv",{startTime:0,eventSessionId:0,type:"login"}),Hu(this,"_login",!1),Hu(this,"_unMuteAudio",!1),Hu(this,"_enableAudio",!1),Hu(this,"_unMuteVideo",!1),Hu(this,"_enableVideo",!1),Hu(this,"_remoteUnmuteAudio",!1),Hu(this,"_remoteUnmuteVideo",!1),Hu(this,"_audioExternal",!1),Hu(this,"_pushAudio",!1),Hu(this,"_videoExternal",!1),Hu(this,"_pushVideo",!1),Hu(this,"_autoSubscribeVideo",!1),Hu(this,"_autoSubscribeAudio",!1),Hu(this,"_autoSubscribe",!1),Hu(this,"_publishVideo",!1),Hu(this,"_publishAudio",!1),Hu(this,"_subscribeAudio",!1),Hu(this,"_subscribeVideo",!1),Hu(this,"_subscribe",!1),Hu(this,"_pushTrack",!1),Hu(this,"_multiChatMode",!1),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),this._ctx=e,this._stream=t,this.getTransportDelay(),this._monitor=mv(t.engineId),this.logger=new xv("RecvFrameObserver",0,t.engineId)}async beginRecvFrame(e,t){await this.getTransportDelay();let i=this._transportDelay,o=!0;if(["login","unmute","subscribe","push_track"].indexOf(t)>=0&&(i=0,o=!1),"audio"===e){var s,r,n,a,d,c,l,u,m;o||this._audioEventSessionId++,this._currentAudioRecv={startTime:Date.now(),eventSessionId:this._audioEventSessionId,type:t};const h={media_type:e,event_type:"begin_recv",type:t,is_screen:!(null===(s=this._stream)||void 0===s||!s.isScreen),start:null===(r=this._currentAudioRecv)||void 0===r?void 0:r.startTime,event_session_id:this._audioEventSessionId,stream_user_id:null===(n=this._stream)||void 0===n?void 0:n.userId,transport_delay:i,vendor_mode:(null===(a=this._stream)||void 0===a?void 0:a.vendorCode)||0,pc_session_id:(null===(d=this._stream)||void 0===d?void 0:d.pcSessionId)||(null===(c=this._ctx.peerConnection)||void 0===c?void 0:c.getConnectionId()),remote_rtc_session_id:null===(l=this._stream)||void 0===l?void 0:l.remoteSessionId,is_public_stream:null===(u=this._stream)||void 0===u?void 0:u.isPublicStream};this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),this._firstAudioFrameTimer=setTimeout((()=>{wM(this._ctx,"audio",this._stream,this._monitor),this.stopRecvFrame("audio","timeout"),this._firstAudioFrameInterval&&window.clearInterval(this._firstAudioFrameInterval)}),this._timeout),this.logger.info("rtcFirstFrameRecv",JSON.stringify(h)),null===(m=this._monitor)||void 0===m||m.report("rtc_first_frame",h),this._watchForFirstAudioFrameRecv(),this._audioFirstFrameState=1,this._login=!0,this._unMuteAudio=!0,this._enableAudio=!0,this._remoteUnmuteAudio=!0}else if("video"===e){var h,p,b,_,y,v,S,Z,f;o||this._videoEventSessionId++,this._currentVideoRecv={startTime:Date.now(),eventSessionId:this._videoEventSessionId,type:t};const s={media_type:e,event_type:"begin_recv",type:t,is_screen:!(null===(h=this._stream)||void 0===h||!h.isScreen),start:null===(p=this._currentVideoRecv)||void 0===p?void 0:p.startTime,event_session_id:this._videoEventSessionId,stream_user_id:null===(b=this._stream)||void 0===b?void 0:b.userId,transport_delay:i,vendor_mode:(null===(_=this._stream)||void 0===_?void 0:_.vendorCode)||0,pc_session_id:(null===(y=this._stream)||void 0===y?void 0:y.pcSessionId)||(null===(v=this._ctx.peerConnection)||void 0===v?void 0:v.getConnectionId()),remote_rtc_session_id:null===(S=this._stream)||void 0===S?void 0:S.remoteSessionId,is_public_stream:null===(Z=this._stream)||void 0===Z?void 0:Z.isPublicStream};this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),this._firstVideoFrameTimer=setTimeout((()=>{wM(this._ctx,"video",this._stream,this._monitor),this.stopRecvFrame("video","timeout"),this._firstVideoFrameInterval&&window.clearInterval(this._firstVideoFrameInterval)}),this._timeout),this._watchForFirstVideoFrameRecv(),this.logger.info("rtcFirstFrameRecv",JSON.stringify(s)),null===(f=this._monitor)||void 0===f||f.report("rtc_first_frame",s),this._videoFirstFrameState=1,this._login=!0,this._unMuteVideo=!0,this._enableVideo=!0,this._remoteUnmuteVideo=!0}}stopRecvFrame(e,t){if("audio"===e){var i,o,s,r,n,a,d,c,l,u;if(1!==this._audioFirstFrameState)return;const m={event_type:"recv_end",media_type:e,is_screen:!(null===(i=this._stream)||void 0===i||!i.isScreen),start:null===(o=this._currentAudioRecv)||void 0===o?void 0:o.startTime,reason:t,result:!1,stream_user_id:null===(s=this._stream)||void 0===s?void 0:s.userId,event_session_id:this._audioEventSessionId,type:null===(r=this._currentAudioRecv)||void 0===r?void 0:r.type,vendor_mode:(null===(n=this._stream)||void 0===n?void 0:n.vendorCode)||0,pc_session_id:(null===(a=this._stream)||void 0===a?void 0:a.pcSessionId)||(null===(d=this._ctx.peerConnection)||void 0===d?void 0:d.getConnectionId()),remote_rtc_session_id:null===(c=this._stream)||void 0===c?void 0:c.remoteSessionId,is_public_stream:null===(l=this._stream)||void 0===l?void 0:l.isPublicStream};this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),delete this._currentAudioRecv,this.logger.info("rtcFirstFrameRecv",JSON.stringify(m)),null===(u=this._monitor)||void 0===u||u.report("rtc_first_frame",m),this._audioFirstFrameState=2}else if("video"===e){var m,h,p,b,_,y,v,S,Z,f,T,I,g,R,X,L,C,W,G,V;if(1!==this._videoFirstFrameState)return;const i={event_type:"recv_end",media_type:e,is_screen:!(null===(m=this._stream)||void 0===m||!m.isScreen),start:null===(h=this._currentVideoRecv)||void 0===h?void 0:h.startTime,reason:t,result:!1,stream_user_id:null===(p=this._stream)||void 0===p?void 0:p.userId,event_session_id:this._videoEventSessionId,type:null===(b=this._currentVideoRecv)||void 0===b?void 0:b.type,vendor_mode:(null===(_=this._stream)||void 0===_?void 0:_.vendorCode)||0,pc_session_id:(null===(y=this._stream)||void 0===y?void 0:y.pcSessionId)||(null===(v=this._ctx.peerConnection)||void 0===v?void 0:v.getConnectionId()),remote_rtc_session_id:null===(S=this._stream)||void 0===S?void 0:S.remoteSessionId,codec:null===(Z=this._stream)||void 0===Z||null===(Z=Z.getRemoteStreamStats())||void 0===Z||null===(Z=Z.videoStats)||void 0===Z?void 0:Z.codecType,stats_frame_size_width:null===(f=this._stream)||void 0===f||null===(f=f.getRemoteStreamStats())||void 0===f||null===(f=f.videoStats)||void 0===f?void 0:f.frame_size_width,stats_frame_size_height:null===(T=this._stream)||void 0===T||null===(T=T.getRemoteStreamStats())||void 0===T||null===(T=T.videoStats)||void 0===T?void 0:T.frame_size_height,stats_frame_rate_decode:null===(I=this._stream)||void 0===I||null===(I=I.getRemoteStreamStats())||void 0===I||null===(I=I.videoStats)||void 0===I?void 0:I.decoderOutputFrameRate,stats_frame_rate_receive:null===(g=this._stream)||void 0===g||null===(g=g.getRemoteStreamStats())||void 0===g||null===(g=g.videoStats)||void 0===g?void 0:g.receivedFrameRate,stats_frame_decoder_name:null===(R=this._stream)||void 0===R||null===(R=R.getRemoteStreamStats())||void 0===R||null===(R=R.videoStats)||void 0===R?void 0:R.decoderName,stats_gpu_url:XZ.GPU_URL||(null===(X=lT())||void 0===X?void 0:X.renderer),track_frame_size_width:null===(L=this._stream)||void 0===L||null===(L=L.videoTrack)||void 0===L||null===(L=L.originTrack.getSettings())||void 0===L?void 0:L.width,track_frame_size_height:null===(C=this._stream)||void 0===C||null===(C=C.videoTrack)||void 0===C||null===(C=C.originTrack.getSettings())||void 0===C?void 0:C.height,track_frame_rate:null===(W=this._stream)||void 0===W||null===(W=W.videoTrack)||void 0===W||null===(W=W.originTrack.getSettings())||void 0===W?void 0:W.frameRate,is_public_stream:null===(G=this._stream)||void 0===G?void 0:G.isPublicStream};this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),delete this._currentVideoRecv,this.logger.info("rtcFirstFrameRecv",JSON.stringify(i)),null===(V=this._monitor)||void 0===V||V.report("rtc_first_frame",i),this._videoFirstFrameState=2,setTimeout((()=>{var i,o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z,f;const T={event_type:"recv_end",media_type:e,is_screen:!(null===(i=this._stream)||void 0===i||!i.isScreen),start:null===(o=this._currentVideoRecv)||void 0===o?void 0:o.startTime,reason:t,result:!1,stream_user_id:null===(s=this._stream)||void 0===s?void 0:s.userId,event_session_id:this._videoEventSessionId,type:null===(r=this._currentVideoRecv)||void 0===r?void 0:r.type,vendor_mode:(null===(n=this._stream)||void 0===n?void 0:n.vendorCode)||0,pc_session_id:(null===(a=this._stream)||void 0===a?void 0:a.pcSessionId)||(null===(d=this._ctx.peerConnection)||void 0===d?void 0:d.getConnectionId()),remote_rtc_session_id:null===(c=this._stream)||void 0===c?void 0:c.remoteSessionId,codec:null===(l=this._stream)||void 0===l||null===(l=l.getRemoteStreamStats())||void 0===l||null===(l=l.videoStats)||void 0===l?void 0:l.codecType,stats_frame_size_width:null===(u=this._stream)||void 0===u||null===(u=u.getRemoteStreamStats())||void 0===u||null===(u=u.videoStats)||void 0===u?void 0:u.frame_size_width,stats_frame_size_height:null===(m=this._stream)||void 0===m||null===(m=m.getRemoteStreamStats())||void 0===m||null===(m=m.videoStats)||void 0===m?void 0:m.frame_size_height,stats_frame_rate_decode:null===(h=this._stream)||void 0===h||null===(h=h.getRemoteStreamStats())||void 0===h||null===(h=h.videoStats)||void 0===h?void 0:h.decoderOutputFrameRate,stats_frame_rate_receive:null===(p=this._stream)||void 0===p||null===(p=p.getRemoteStreamStats())||void 0===p||null===(p=p.videoStats)||void 0===p?void 0:p.receivedFrameRate,stats_frame_decoder_name:null===(b=this._stream)||void 0===b||null===(b=b.getRemoteStreamStats())||void 0===b||null===(b=b.videoStats)||void 0===b?void 0:b.decoderName,stats_gpu_url:XZ.GPU_URL||(null===(_=lT())||void 0===_?void 0:_.renderer),track_frame_size_width:null===(y=this._stream)||void 0===y||null===(y=y.videoTrack)||void 0===y||null===(y=y.originTrack.getSettings())||void 0===y?void 0:y.width,track_frame_size_height:null===(v=this._stream)||void 0===v||null===(v=v.videoTrack)||void 0===v||null===(v=v.originTrack.getSettings())||void 0===v?void 0:v.height,track_frame_rate:null===(S=this._stream)||void 0===S||null===(S=S.videoTrack)||void 0===S||null===(S=S.originTrack.getSettings())||void 0===S?void 0:S.frameRate,is_public_stream:null===(Z=this._stream)||void 0===Z?void 0:Z.isPublicStream};this.logger.info("rtc_first_frame_statistics",JSON.stringify(T)),null===(f=this._monitor)||void 0===f||f.report("rtc_first_frame_statistics",T)}),8e3)}}async recvFrameFinish(e){await this.getTransportDelay();let t=this._transportDelay;if("audio"===e){var i,o,s,r,n,a,d,c;if(1!==this._audioFirstFrameState)return;if(!this._currentAudioRecv)return;const{type:l,startTime:u}=this._currentAudioRecv;["login","unmute","subscribe","push_track"].indexOf(l)>=0&&(t=0);const m={event_type:"recv_end",media_type:e,start:u,result:!0,is_screen:!(null===(i=this._stream)||void 0===i||!i.isScreen),stream_user_id:null===(o=this._stream)||void 0===o?void 0:o.userId,event_session_id:this._audioEventSessionId,type:l,transport_delay:t,vendor_mode:(null===(s=this._stream)||void 0===s?void 0:s.vendorCode)||0,pc_session_id:(null===(r=this._stream)||void 0===r?void 0:r.pcSessionId)||(null===(n=this._ctx.peerConnection)||void 0===n?void 0:n.getConnectionId()),remote_rtc_session_id:null===(a=this._stream)||void 0===a?void 0:a.remoteSessionId,is_public_stream:null===(d=this._stream)||void 0===d?void 0:d.isPublicStream};delete this._currentAudioRecv,this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),this.logger.info("rtcFirstFrameRecv",JSON.stringify(m)),null===(c=this._monitor)||void 0===c||c.report("rtc_first_frame",m),this.emit("recvAudioFirstFrame"),this._audioFirstFrameState=3}else if("video"===e){var l,u,m,h,p,b,_,y,v,S,Z,f,T,I,g,R,X,L;if(1!==this._videoFirstFrameState)return;if(!this._currentVideoRecv)return;const{type:i,startTime:o}=this._currentVideoRecv;["login","unmute","subscribe","push_track"].indexOf(i)>=0&&(t=0);const s={event_type:"recv_end",media_type:e,is_screen:!(null===(l=this._stream)||void 0===l||!l.isScreen),start:o,result:!0,stream_user_id:null===(u=this._stream)||void 0===u?void 0:u.userId,event_session_id:this._videoEventSessionId,type:i,transport_delay:t,vendor_mode:(null===(m=this._stream)||void 0===m?void 0:m.vendorCode)||0,pc_session_id:(null===(h=this._stream)||void 0===h?void 0:h.pcSessionId)||(null===(p=this._ctx.peerConnection)||void 0===p?void 0:p.getConnectionId()),remote_rtc_session_id:null===(b=this._stream)||void 0===b?void 0:b.remoteSessionId,codec:null===(_=this._stream)||void 0===_||null===(_=_.getRemoteStreamStats())||void 0===_||null===(_=_.videoStats)||void 0===_?void 0:_.codecType,stats_frame_size_width:null===(y=this._stream)||void 0===y||null===(y=y.getRemoteStreamStats())||void 0===y||null===(y=y.videoStats)||void 0===y?void 0:y.frameSizeWidth,stats_frame_size_height:null===(v=this._stream)||void 0===v||null===(v=v.getRemoteStreamStats())||void 0===v||null===(v=v.videoStats)||void 0===v?void 0:v.frameSizeHeight,stats_frame_rate_decode:null===(S=this._stream)||void 0===S||null===(S=S.getRemoteStreamStats())||void 0===S||null===(S=S.videoStats)||void 0===S?void 0:S.decoderOutputFrameRate,stats_frame_rate_receive:null===(Z=this._stream)||void 0===Z||null===(Z=Z.getRemoteStreamStats())||void 0===Z||null===(Z=Z.videoStats)||void 0===Z?void 0:Z.receivedFrameRate,stats_frame_decoder_name:null===(f=this._stream)||void 0===f||null===(f=f.getRemoteStreamStats())||void 0===f||null===(f=f.videoStats)||void 0===f?void 0:f.decoderName,stats_gpu_url:XZ.GPU_URL||(null===(T=lT())||void 0===T?void 0:T.renderer),track_frame_size_width:null===(I=this._stream)||void 0===I||null===(I=I.videoTrack)||void 0===I||null===(I=I.originTrack.getSettings())||void 0===I?void 0:I.width,track_frame_size_height:null===(g=this._stream)||void 0===g||null===(g=g.videoTrack)||void 0===g||null===(g=g.originTrack.getSettings())||void 0===g?void 0:g.height,track_frame_rate:null===(R=this._stream)||void 0===R||null===(R=R.videoTrack)||void 0===R||null===(R=R.originTrack.getSettings())||void 0===R?void 0:R.frameRate,is_public_stream:null===(X=this._stream)||void 0===X?void 0:X.isPublicStream};delete this._currentVideoRecv,this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),this.logger.info("rtcFirstFrameRecv",JSON.stringify(s)),null===(L=this._monitor)||void 0===L||L.report("rtc_first_frame",s),this.emit("recvVideoFirstFrame"),this._videoFirstFrameState=3,setTimeout((()=>{var s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z,f;const T={event_type:"recv_end",media_type:e,is_screen:!(null===(s=this._stream)||void 0===s||!s.isScreen),start:o,result:!0,stream_user_id:null===(r=this._stream)||void 0===r?void 0:r.userId,event_session_id:this._videoEventSessionId,type:i,transport_delay:t,vendor_mode:(null===(n=this._stream)||void 0===n?void 0:n.vendorCode)||0,pc_session_id:(null===(a=this._stream)||void 0===a?void 0:a.pcSessionId)||(null===(d=this._ctx.peerConnection)||void 0===d?void 0:d.getConnectionId()),remote_rtc_session_id:null===(c=this._stream)||void 0===c?void 0:c.remoteSessionId,codec:null===(l=this._stream)||void 0===l||null===(l=l.getRemoteStreamStats())||void 0===l||null===(l=l.videoStats)||void 0===l?void 0:l.codecType,stats_frame_size_width:null===(u=this._stream)||void 0===u||null===(u=u.getRemoteStreamStats())||void 0===u||null===(u=u.videoStats)||void 0===u?void 0:u.frameSizeWidth,stats_frame_size_height:null===(m=this._stream)||void 0===m||null===(m=m.getRemoteStreamStats())||void 0===m||null===(m=m.videoStats)||void 0===m?void 0:m.frameSizeHeight,stats_frame_rate_decode:null===(h=this._stream)||void 0===h||null===(h=h.getRemoteStreamStats())||void 0===h||null===(h=h.videoStats)||void 0===h?void 0:h.decoderOutputFrameRate,stats_frame_rate_receive:null===(p=this._stream)||void 0===p||null===(p=p.getRemoteStreamStats())||void 0===p||null===(p=p.videoStats)||void 0===p?void 0:p.receivedFrameRate,stats_frame_decoder_name:null===(b=this._stream)||void 0===b||null===(b=b.getRemoteStreamStats())||void 0===b||null===(b=b.videoStats)||void 0===b?void 0:b.decoderName,stats_gpu_url:XZ.GPU_URL||(null===(_=lT())||void 0===_?void 0:_.renderer),track_frame_size_width:null===(y=this._stream)||void 0===y||null===(y=y.videoTrack)||void 0===y||null===(y=y.originTrack.getSettings())||void 0===y?void 0:y.width,track_frame_size_height:null===(v=this._stream)||void 0===v||null===(v=v.videoTrack)||void 0===v||null===(v=v.originTrack.getSettings())||void 0===v?void 0:v.height,track_frame_rate:null===(S=this._stream)||void 0===S||null===(S=S.videoTrack)||void 0===S||null===(S=S.originTrack.getSettings())||void 0===S?void 0:S.frameRate,is_public_stream:null===(Z=this._stream)||void 0===Z?void 0:Z.isPublicStream};this.logger.info("rtc_first_frame_statistics",JSON.stringify(T)),null===(f=this._monitor)||void 0===f||f.report("rtc_first_frame_statistics",T)}),8e3)}}setLogin(e){var t,i,o,s;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{audio:!0,video:!0};this._login!==e&&(this._login=e,e&&null!==(t=this._stream)&&void 0!==t&&t.hasAudio&&r.audio&&this.beginRecvFrame("audio","login"),e&&null!==(i=this._stream)&&void 0!==i&&i.hasVideo&&r.video&&this.beginRecvFrame("video","login"),!e&&null!==(o=this._stream)&&void 0!==o&&o.hasAudio&&this.stopRecvFrame("audio","leave_room"),!e&&null!==(s=this._stream)&&void 0!==s&&s.hasVideo&&this.stopRecvFrame("video","leave_room"))}setUnmuteAudio(e){var t,i,o;if(this._unMuteAudio===e)return;this._unMuteAudio=e;const s=!(null===(t=this._stream)||void 0===t||!t.hasAudio);null!==(i=this._stream)&&void 0!==i&&i.audioHasCapture&&null!==(o=this._stream)&&void 0!==o&&o.audioHasPublish&&(this._unMuteAudio&&s?this.beginRecvFrame("audio","unmute"):s&&this.stopRecvFrame("audio","mute"))}setRemoteUnmuteAudio(e){this._remoteUnmuteAudio!==e&&(this._remoteUnmuteAudio=e,this._remoteUnmuteAudio?this.beginRecvFrame("audio","remote_unmute"):this.stopRecvFrame("audio","remote_mute"))}setEnableAudio(e){this._enableAudio!==e&&(this._enableAudio=e,this._enableAudio?this.beginRecvFrame("audio","enable"):this.stopRecvFrame("audio","disable"))}setUnmuteVideo(e){var t,i,o;if(this._unMuteVideo===e)return;this._unMuteVideo=e;const s=!(null===(t=this._stream)||void 0===t||!t.hasVideo);null!==(i=this._stream)&&void 0!==i&&i.videoHasCapture&&null!==(o=this._stream)&&void 0!==o&&o.videoHasPublish&&(this._unMuteVideo&&s?this.beginRecvFrame("video","unmute"):s&&this.stopRecvFrame("video","mute"))}setRemoteUnmuteVideo(e){this._remoteUnmuteVideo!==e&&(this._remoteUnmuteVideo=e,this._remoteUnmuteVideo?this.beginRecvFrame("video","remote_unmute"):this.stopRecvFrame("video","remote_mute"))}setEnableVideo(e){this._enableVideo!==e&&(this._enableVideo=e,this._enableVideo?this.beginRecvFrame("video","enable"):this.stopRecvFrame("video","disable"))}setExternalAudioSource(e){this._audioExternal=e}setPushAudio(e){var t;this._audioExternal&&this._pushAudio!==e&&(this._pushAudio=e),this._pushAudio&&this.beginRecvFrame("audio","push"),!e&&null!==(t=this._stream)&&void 0!==t&&t.hasAudio&&this.stopRecvFrame("audio","stop_push")}setExternalVideoSource(e){this._videoExternal=e}setPushVideo(e){var t;this._videoExternal&&this._pushVideo!==e&&(this._pushVideo=e),this._pushVideo&&this.beginRecvFrame("video","push"),!e&&null!==(t=this._stream)&&void 0!==t&&t.hasVideo&&this.stopRecvFrame("video","stop_push")}setPublishVideo(e){var t;this._publishVideo!==e&&(this._publishVideo=e),this._publishVideo&&this.beginRecvFrame("video","publish"),!e&&null!==(t=this._stream)&&void 0!==t&&t.hasVideo&&this.stopRecvFrame("video","unpublish")}setPublishAudio(e){var t;this._publishAudio!==e&&(this._publishAudio=e),this._publishAudio&&this.beginRecvFrame("audio","publish"),!e&&null!==(t=this._stream)&&void 0!==t&&t.hasAudio&&this.stopRecvFrame("audio","unpublish")}setAutoSubscribe(e){this._autoSubscribe=e}setAutoSubscribeVideo(e){this._autoSubscribeVideo=e}setAutoSubscribeAudio(e){this._autoSubscribeAudio=e}setSubscribeAudio(e){var t,i;this._autoSubscribeAudio||this._subscribeAudio===e||(this._subscribe=e,e&&null!==(i=this._stream)&&void 0!==i&&i.hasAudio&&this.beginRecvFrame("audio","subscribe"));!e&&null!==(t=this._stream)&&void 0!==t&&t.hasAudio&&this.stopRecvFrame("audio","unsubscribe")}setSubscribeVideo(e){var t,i;this._autoSubscribeVideo||this._subscribeVideo===e||(this._subscribeVideo=e,e&&null!==(i=this._stream)&&void 0!==i&&i.hasVideo&&this.beginRecvFrame("video","subscribe"));!e&&null!==(t=this._stream)&&void 0!==t&&t.hasVideo&&this.stopRecvFrame("video","unsubscribe")}setPushTrack(e){var t;this._pushTrack!==e&&(this._pushTrack=e,e&&!this._isScreen&&this.beginRecvFrame("audio","push_track"),!e&&null!==(t=this._stream)&&void 0!==t&&t.hasAudio&&this.stopRecvFrame("audio","remove_track"))}setMultiChatMode(e){this._multiChatMode=e}setTimeout(e){this._timeout=e}_watchForFirstVideoFrameRecv(){let e=-1,t=-1;this._firstVideoFrameInterval&&window.clearInterval(this._firstVideoFrameInterval),this._firstVideoFrameInterval=window.setInterval((async()=>{var i,o,s;const r=null!==(i=null===(o=this._stream)||void 0===o||null===(o=o.vendorHandler)||void 0===o?void 0:o.peer)&&void 0!==i?i:this._ctx.peerConnection;if(r&&null!==(s=this._stream)&&void 0!==s&&null!==(s=s.videoTrack)&&void 0!==s&&s.preprocessingTrack){var n,a;const i=null===(n=this._stream.videoTransceiver)||void 0===n?void 0:n.receiver,o=(await r.getStatsWithLowFrequency(null===(a=this._stream)||void 0===a||null===(a=a.videoTrack)||void 0===a?void 0:a.preprocessingTrack,!0,i)).find((e=>"inbound-rtp"===e.type));if(o&&(o.framesReceived>e||o.packetsReceived>t)){if(-1===e&&-1===t)return e=o.framesReceived,void(t=o.packetsReceived);this.recvFrameFinish("video"),window.clearInterval(this._firstVideoFrameInterval)}}}),200)}_watchForFirstAudioFrameRecv(){let e=-1,t=-1;this._firstAudioFrameInterval&&window.clearInterval(this._firstAudioFrameInterval),this._firstAudioFrameInterval=window.setInterval((async()=>{var i,o,s;const r=null!==(i=null===(o=this._stream)||void 0===o||null===(o=o.vendorHandler)||void 0===o?void 0:o.peer)&&void 0!==i?i:this._ctx.peerConnection;if(r&&null!==(s=this._stream)&&void 0!==s&&null!==(s=s.audioTrack)&&void 0!==s&&s.originTrack){var n;const i=(await r.getStatsWithLowFrequency(null===(n=this._stream)||void 0===n||null===(n=n.audioTrack)||void 0===n?void 0:n.originTrack)).find((e=>"inbound-rtp"===e.type));if(i&&(i.totalSamplesReceived>e||i.packetsReceived>t)){if(-1===e&&-1===t)return e=i.totalSamplesReceived,void(t=i.packetsReceived);this.recvFrameFinish("audio"),window.clearInterval(this._firstAudioFrameInterval)}}}),200)}async getTransportDelay(){await this.getTransportDelayIntl(),window.clearInterval(this._transportDelayInterval),this._transportDelayInterval=window.setInterval((async()=>{await this.getTransportDelayIntl()}),2e3)}async getTransportDelayIntl(){const e=this._ctx.peerConnection;if(e){var t;const i=null===(t=this._stream)||void 0===t||null===(t=t.videoTransceiver)||void 0===t?void 0:t.receiver,o=await e.getStatsWithLowFrequency(void 0,!0,i),s=o.find((e=>"transport"===e.type&&"connected"===e.dtlsState)),r=o.find((e=>"candidate-pair"===e.type&&"succeeded"===e.state&&e.id===(null==s?void 0:s.selectedCandidatePairId)));r&&(this._transportDelay=Math.round(1e3*r.currentRoundTripTime/2))}}setDisconnect(){this.stopRecvFrame("audio","connection_lost"),this.stopRecvFrame("video","connection_lost"),this.reset()}reset(){this._currentAudioRecv={startTime:0,eventSessionId:0,type:"login"},this._currentVideoRecv={startTime:0,eventSessionId:0,type:"login"},this._login=!1,this._unMuteAudio=!1,this._enableAudio=!1,this._unMuteVideo=!1,this._remoteUnmuteAudio=!1,this._remoteUnmuteVideo=!1,this._enableVideo=!1,this._audioExternal=!1,this._pushAudio=!1,this._videoExternal=!1,this._pushVideo=!1,this._autoSubscribeVideo=!1,this._autoSubscribeAudio=!1,this._autoSubscribe=!1,this._subscribeAudio=!1,this._subscribeVideo=!1,this._subscribe=!1,this._pushTrack=!1,this._multiChatMode=!1,this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),this._firstAudioFrameInterval&&window.clearInterval(this._firstAudioFrameInterval),this._firstVideoFrameInterval&&window.clearInterval(this._firstVideoFrameInterval),this._transportDelayInterval&&window.clearInterval(this._transportDelayInterval)}get audioFirstFrameReceived(){return 3===this._audioFirstFrameState}get FirstFrameReceived(){return 3===this._audioFirstFrameState}}class FM{constructor(e,t){Hu(this,"_audioEventSessionId",Df()),Hu(this,"_videoEventSessionId",Df()),Hu(this,"_pcSessionId",void 0),Hu(this,"_firstAudioFrameTimer",void 0),Hu(this,"_firstVideoFrameTimer",void 0),Hu(this,"_stream",void 0),Hu(this,"_firstVideoFrameInterval",void 0),Hu(this,"_firstAudioFrameInterval",void 0),Hu(this,"_currentAudioSend",{startTime:0,eventSessionId:0,type:"login"}),Hu(this,"_currentVideoSend",{startTime:0,eventSessionId:0,type:"login"}),Hu(this,"_login",!1),Hu(this,"_publisher",!1),Hu(this,"_unMuteAudio",!1),Hu(this,"_enableAudio",!1),Hu(this,"_unMuteVideo",!1),Hu(this,"_enableVideo",!1),Hu(this,"_audioExternal",!1),Hu(this,"_pushAudio",!1),Hu(this,"_videoExternal",!1),Hu(this,"_pushVideo",!1),Hu(this,"_autoPublish",!1),Hu(this,"_publish",!1),Hu(this,"_timeout",1e4),Hu(this,"_audioFirstFrameState",0),Hu(this,"_videoFirstFrameState",0),Hu(this,"_monitor",void 0),Hu(this,"logger",void 0),this._ctx=e,this._stream=t,this._monitor=mv(t.engineId),this.logger=new xv("SendFrameObserver",0,t.engineId)}beginSendFrame(e,t){if("audio"===e){var i,o,s,r,n,a,d;this._audioEventSessionId++,this._currentAudioSend={startTime:Date.now(),eventSessionId:this._audioEventSessionId,type:t};const c={event_type:"begin_send",media_type:e,is_screen:!(null===(i=this._stream)||void 0===i||!i.isScreen),type:t,start:this._currentAudioSend.startTime,event_session_id:this._audioEventSessionId,vendor_mode:(null===(o=this._stream)||void 0===o?void 0:o.vendorCode)||0,pc_session_id:(null===(s=this._stream)||void 0===s?void 0:s.pcSessionId)||(null===(r=this._ctx.peerConnection)||void 0===r?void 0:r.getConnectionId()),capture_session_id:null===(n=this._stream)||void 0===n||null===(n=n.audioTrack)||void 0===n?void 0:n.captureSessionId,is_public_stream:null===(a=this._stream)||void 0===a?void 0:a.isPublicStream};this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),this._firstAudioFrameTimer=setTimeout((()=>{KM(this._ctx,"audio",this._stream,this._monitor),this.stopSendFrame("audio","timeout"),this._firstAudioFrameInterval&&window.clearInterval(this._firstAudioFrameInterval)}),this._timeout),this.logger.info("rtcFirstFrameSend",JSON.stringify(c)),null===(d=this._monitor)||void 0===d||d.report("rtc_first_frame",c),this._watchForFirstAudioFrameSend(),this._audioFirstFrameState=1,this._login=!0,this._publisher=!0,this._publish=!0,this._unMuteAudio=!0,this._pushAudio||(this._enableAudio=!0)}else if("video"===e){var c,l,u,m,h,p,b;this._videoEventSessionId++,this._currentVideoSend={startTime:Date.now(),eventSessionId:this._videoEventSessionId,type:t};const i={event_type:"begin_send",media_type:e,is_screen:!(null===(c=this._stream)||void 0===c||!c.isScreen),type:t,start:this._currentVideoSend.startTime,event_session_id:this._videoEventSessionId,vendor_mode:(null===(l=this._stream)||void 0===l?void 0:l.vendorCode)||0,pc_session_id:(null===(u=this._stream)||void 0===u?void 0:u.pcSessionId)||(null===(m=this._ctx.peerConnection)||void 0===m?void 0:m.getConnectionId()),capture_session_id:null===(h=this._stream)||void 0===h||null===(h=h.videoTrack)||void 0===h?void 0:h.captureSessionId,is_public_stream:null===(p=this._stream)||void 0===p?void 0:p.isPublicStream};this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),this._firstVideoFrameTimer=setTimeout((()=>{KM(this._ctx,"video",this._stream,this._monitor),this.stopSendFrame("video","timeout"),this._firstVideoFrameInterval&&window.clearInterval(this._firstVideoFrameInterval)}),this._timeout),this._watchForFirstVideoFrameSend(),this.logger.info("rtcFirstFrameSend",JSON.stringify(i)),null===(b=this._monitor)||void 0===b||b.report("rtc_first_frame",i),this._videoFirstFrameState=1,this._login=!0,this._publisher=!0,this._publish=!0,this._unMuteVideo=!0,this._pushVideo||(this._enableVideo=!0)}}stopSendFrame(e,t){if("audio"===e){var i,o,s,r,n,a,d,c,l;if(1!==this._audioFirstFrameState)return;const u={event_type:"sent_end",media_type:e,is_screen:!(null===(i=this._stream)||void 0===i||!i.isScreen),start:null===(o=this._currentAudioSend)||void 0===o?void 0:o.startTime,reason:t,result:!1,event_session_id:this._audioEventSessionId,type:null===(s=this._currentAudioSend)||void 0===s?void 0:s.type,vendor_mode:(null===(r=this._stream)||void 0===r?void 0:r.vendorCode)||0,pc_session_id:(null===(n=this._stream)||void 0===n?void 0:n.pcSessionId)||(null===(a=this._ctx.peerConnection)||void 0===a?void 0:a.getConnectionId()),capture_session_id:null===(d=this._stream)||void 0===d||null===(d=d.audioTrack)||void 0===d?void 0:d.captureSessionId,is_public_stream:null===(c=this._stream)||void 0===c?void 0:c.isPublicStream};this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),delete this._currentAudioSend,this.logger.info("rtcFirstFrameSend",JSON.stringify(u)),null===(l=this._monitor)||void 0===l||l.report("rtc_first_frame",u),this._audioFirstFrameState=2}else if("video"===e){var u,m,h,p,b,_,y,v,S,Z,f,T,I,g,R,X,L,C,W,G;if(1!==this._videoFirstFrameState)return;const i={event_type:"sent_end",media_type:e,start:null===(u=this._currentVideoSend)||void 0===u?void 0:u.startTime,is_screen:!(null===(m=this._stream)||void 0===m||!m.isScreen),reason:t,result:!1,event_session_id:this._videoEventSessionId,type:null===(h=this._currentVideoSend)||void 0===h?void 0:h.type,vendor_mode:(null===(p=this._stream)||void 0===p?void 0:p.vendorCode)||0,pc_session_id:(null===(b=this._stream)||void 0===b?void 0:b.pcSessionId)||(null===(_=this._ctx.peerConnection)||void 0===_?void 0:_.getConnectionId()),capture_session_id:null===(y=this._stream)||void 0===y||null===(y=y.videoTrack)||void 0===y?void 0:y.captureSessionId,codec:null===(v=this._stream)||void 0===v?void 0:v.currentVideoCodec,track_frame_size_width:null===(S=this._stream)||void 0===S||null===(S=S.videoTrack)||void 0===S||null===(S=S.originTrack)||void 0===S?void 0:S.getSettings().width,track_frame_size_height:null===(Z=this._stream)||void 0===Z||null===(Z=Z.videoTrack)||void 0===Z||null===(Z=Z.originTrack)||void 0===Z?void 0:Z.getSettings().height,track_frame_rate:null===(f=this._stream)||void 0===f||null===(f=f.videoTrack)||void 0===f||null===(f=f.originTrack)||void 0===f?void 0:f.getSettings().frameRate,stats_frame_size_width:null===(T=this._stream)||void 0===T||null===(T=T.getLocalStreamStats())||void 0===T||null===(T=T.videoStats)||void 0===T?void 0:T.frame_size_width,stats_frame_size_height:null===(I=this._stream)||void 0===I||null===(I=I.getLocalStreamStats())||void 0===I||null===(I=I.videoStats)||void 0===I?void 0:I.frame_size_height,stats_frame_rate_input:null===(g=this._stream)||void 0===g||null===(g=g.getLocalStreamStats())||void 0===g||null===(g=g.videoStats)||void 0===g?void 0:g.inputFrameRate,stats_frame_rate_sent:null===(R=this._stream)||void 0===R||null===(R=R.getLocalStreamStats())||void 0===R||null===(R=R.videoStats)||void 0===R?void 0:R.sentFrameRate,stats_frame_rate_encode:null===(X=this._stream)||void 0===X||null===(X=X.getLocalStreamStats())||void 0===X||null===(X=X.videoStats)||void 0===X?void 0:X.encoderOutputFrameRate,stats_frame_encoder_name:null===(L=this._stream)||void 0===L||null===(L=L.getLocalStreamStats())||void 0===L||null===(L=L.videoStats)||void 0===L?void 0:L.encoderName,stats_is_hardware_encoder_enabled:XZ.H264_HW_ENCODER,stats_gpu_url:XZ.GPU_URL||(null===(C=lT())||void 0===C?void 0:C.renderer),is_public_stream:null===(W=this._stream)||void 0===W?void 0:W.isPublicStream};this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),delete this._currentVideoSend,this.logger.info("rtcFirstFrameSend",JSON.stringify(i)),null===(G=this._monitor)||void 0===G||G.report("rtc_first_frame",i),this._videoFirstFrameState=2,setTimeout((()=>{var i,o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z,f;const T={event_type:"sent_end",media_type:e,start:null===(i=this._currentVideoSend)||void 0===i?void 0:i.startTime,is_screen:!(null===(o=this._stream)||void 0===o||!o.isScreen),reason:t,result:!1,event_session_id:this._videoEventSessionId,type:null===(s=this._currentVideoSend)||void 0===s?void 0:s.type,vendor_mode:(null===(r=this._stream)||void 0===r?void 0:r.vendorCode)||0,pc_session_id:(null===(n=this._stream)||void 0===n?void 0:n.pcSessionId)||(null===(a=this._ctx.peerConnection)||void 0===a?void 0:a.getConnectionId()),capture_session_id:null===(d=this._stream)||void 0===d||null===(d=d.videoTrack)||void 0===d?void 0:d.captureSessionId,codec:null===(c=this._stream)||void 0===c?void 0:c.currentVideoCodec,track_frame_size_width:null===(l=this._stream)||void 0===l||null===(l=l.videoTrack)||void 0===l||null===(l=l.originTrack)||void 0===l?void 0:l.getSettings().width,track_frame_size_height:null===(u=this._stream)||void 0===u||null===(u=u.videoTrack)||void 0===u||null===(u=u.originTrack)||void 0===u?void 0:u.getSettings().height,track_frame_rate:null===(m=this._stream)||void 0===m||null===(m=m.videoTrack)||void 0===m||null===(m=m.originTrack)||void 0===m?void 0:m.getSettings().frameRate,stats_frame_size_width:null===(h=this._stream)||void 0===h||null===(h=h.getLocalStreamStats())||void 0===h||null===(h=h.videoStats)||void 0===h?void 0:h.frame_size_width,stats_frame_size_height:null===(p=this._stream)||void 0===p||null===(p=p.getLocalStreamStats())||void 0===p||null===(p=p.videoStats)||void 0===p?void 0:p.frame_size_height,stats_frame_rate_input:null===(b=this._stream)||void 0===b||null===(b=b.getLocalStreamStats())||void 0===b||null===(b=b.videoStats)||void 0===b?void 0:b.inputFrameRate,stats_frame_rate_sent:null===(_=this._stream)||void 0===_||null===(_=_.getLocalStreamStats())||void 0===_||null===(_=_.videoStats)||void 0===_?void 0:_.sentFrameRate,stats_frame_rate_encode:null===(y=this._stream)||void 0===y||null===(y=y.getLocalStreamStats())||void 0===y||null===(y=y.videoStats)||void 0===y?void 0:y.encoderOutputFrameRate,stats_frame_encoder_name:null===(v=this._stream)||void 0===v||null===(v=v.getLocalStreamStats())||void 0===v||null===(v=v.videoStats)||void 0===v?void 0:v.encoderName,stats_is_hardware_encoder_enabled:XZ.H264_HW_ENCODER,stats_gpu_url:XZ.GPU_URL||(null===(S=lT())||void 0===S?void 0:S.renderer),is_public_stream:null===(Z=this._stream)||void 0===Z?void 0:Z.isPublicStream};this.logger.info("rtc_first_frame_statistics",JSON.stringify(T)),null===(f=this._monitor)||void 0===f||f.report("rtc_first_frame_statistics",T)}),8e3)}}sendFrameFinish(e){if("audio"===e){var t,i,o,s,r,n,a;if(1!==this._audioFirstFrameState)return;if(!this._currentAudioSend)return;const{type:d,startTime:c}=this._currentAudioSend,l={event_type:"sent_end",media_type:e,is_screen:!(null===(t=this._stream)||void 0===t||!t.isScreen),start:c,result:!0,event_session_id:this._audioEventSessionId,type:d,vendor_mode:(null===(i=this._stream)||void 0===i?void 0:i.vendorCode)||0,pc_session_id:(null===(o=this._stream)||void 0===o?void 0:o.pcSessionId)||(null===(s=this._ctx.peerConnection)||void 0===s?void 0:s.getConnectionId()),capture_session_id:null===(r=this._stream)||void 0===r||null===(r=r.audioTrack)||void 0===r?void 0:r.captureSessionId,is_public_stream:null===(n=this._stream)||void 0===n?void 0:n.isPublicStream};delete this._currentAudioSend,this._firstAudioFrameTimer&&window.clearTimeout(this._firstAudioFrameTimer),this.logger.info("rtcFirstFrameSend",JSON.stringify(l)),null===(a=this._monitor)||void 0===a||a.report("rtc_first_frame",l),this._audioFirstFrameState=3}else if("video"===e){var d,c,l,u,m,h,p,b,_,y,v,S,Z,f,T,I,g,R;if(1!==this._videoFirstFrameState)return;if(!this._currentVideoSend)return;const{type:t,startTime:i}=this._currentVideoSend,o={event_type:"sent_end",media_type:e,is_screen:!(null===(d=this._stream)||void 0===d||!d.isScreen),start:i,result:!0,event_session_id:this._videoEventSessionId,type:t,vendor_mode:(null===(c=this._stream)||void 0===c?void 0:c.vendorCode)||0,pc_session_id:(null===(l=this._stream)||void 0===l?void 0:l.pcSessionId)||(null===(u=this._ctx.peerConnection)||void 0===u?void 0:u.getConnectionId()),capture_session_id:null===(m=this._stream)||void 0===m||null===(m=m.videoTrack)||void 0===m?void 0:m.captureSessionId,codec:null===(h=this._stream)||void 0===h?void 0:h.currentVideoCodec,track_frame_size_width:null===(p=this._stream)||void 0===p||null===(p=p.videoTrack)||void 0===p||null===(p=p.originTrack)||void 0===p?void 0:p.getSettings().width,track_frame_size_height:null===(b=this._stream)||void 0===b||null===(b=b.videoTrack)||void 0===b||null===(b=b.originTrack)||void 0===b?void 0:b.getSettings().height,track_frame_rate:null===(_=this._stream)||void 0===_||null===(_=_.videoTrack)||void 0===_||null===(_=_.originTrack)||void 0===_?void 0:_.getSettings().frameRate,stats_frame_size_width:null===(y=this._stream)||void 0===y||null===(y=y.getLocalStreamStats())||void 0===y||null===(y=y.videoStats)||void 0===y?void 0:y._captureResolutionWidth,stats_frame_size_height:null===(v=this._stream)||void 0===v||null===(v=v.getLocalStreamStats())||void 0===v||null===(v=v.videoStats)||void 0===v?void 0:v._captureResolutionHeight,stats_frame_rate_input:null===(S=this._stream)||void 0===S||null===(S=S.getLocalStreamStats())||void 0===S||null===(S=S.videoStats)||void 0===S?void 0:S.inputFrameRate,stats_frame_rate_sent:null===(Z=this._stream)||void 0===Z||null===(Z=Z.getLocalStreamStats())||void 0===Z||null===(Z=Z.videoStats)||void 0===Z?void 0:Z.sentFrameRate,stats_frame_rate_encode:null===(f=this._stream)||void 0===f||null===(f=f.getLocalStreamStats())||void 0===f||null===(f=f.videoStats)||void 0===f?void 0:f.encoderOutputFrameRate,stats_frame_encoder_name:null===(T=this._stream)||void 0===T||null===(T=T.getLocalStreamStats())||void 0===T||null===(T=T.videoStats)||void 0===T?void 0:T.encoderName,stats_is_hardware_encoder_enabled:XZ.H264_HW_ENCODER,stats_gpu_url:XZ.GPU_URL||(null===(I=lT())||void 0===I?void 0:I.renderer),is_public_stream:null===(g=this._stream)||void 0===g?void 0:g.isPublicStream};delete this._currentVideoSend,this._firstVideoFrameTimer&&window.clearTimeout(this._firstVideoFrameTimer),this.logger.info("rtcFirstFrameSend",JSON.stringify(o)),null===(R=this._monitor)||void 0===R||R.report("rtc_first_frame",o),this._videoFirstFrameState=3,setTimeout((()=>{var o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z;const f={event_type:"sent_end",media_type:e,is_screen:!(null===(o=this._stream)||void 0===o||!o.isScreen),start:i,result:!0,event_session_id:this._videoEventSessionId,type:t,vendor_mode:(null===(s=this._stream)||void 0===s?void 0:s.vendorCode)||0,pc_session_id:(null===(r=this._stream)||void 0===r?void 0:r.pcSessionId)||(null===(n=this._ctx.peerConnection)||void 0===n?void 0:n.getConnectionId()),capture_session_id:null===(a=this._stream)||void 0===a||null===(a=a.videoTrack)||void 0===a?void 0:a.captureSessionId,codec:null===(d=this._stream)||void 0===d?void 0:d.currentVideoCodec,track_frame_size_width:null===(c=this._stream)||void 0===c||null===(c=c.videoTrack)||void 0===c||null===(c=c.originTrack)||void 0===c?void 0:c.getSettings().width,track_frame_size_height:null===(l=this._stream)||void 0===l||null===(l=l.videoTrack)||void 0===l||null===(l=l.originTrack)||void 0===l?void 0:l.getSettings().height,track_frame_rate:null===(u=this._stream)||void 0===u||null===(u=u.videoTrack)||void 0===u||null===(u=u.originTrack)||void 0===u?void 0:u.getSettings().frameRate,stats_frame_size_width:null===(m=this._stream)||void 0===m||null===(m=m.getLocalStreamStats())||void 0===m||null===(m=m.videoStats)||void 0===m?void 0:m._captureResolutionWidth,stats_frame_size_height:null===(h=this._stream)||void 0===h||null===(h=h.getLocalStreamStats())||void 0===h||null===(h=h.videoStats)||void 0===h?void 0:h._captureResolutionHeight,stats_frame_rate_input:null===(p=this._stream)||void 0===p||null===(p=p.getLocalStreamStats())||void 0===p||null===(p=p.videoStats)||void 0===p?void 0:p.inputFrameRate,stats_frame_rate_sent:null===(b=this._stream)||void 0===b||null===(b=b.getLocalStreamStats())||void 0===b||null===(b=b.videoStats)||void 0===b?void 0:b.sentFrameRate,stats_frame_rate_encode:null===(_=this._stream)||void 0===_||null===(_=_.getLocalStreamStats())||void 0===_||null===(_=_.videoStats)||void 0===_?void 0:_.encoderOutputFrameRate,stats_frame_encoder_name:null===(y=this._stream)||void 0===y||null===(y=y.getLocalStreamStats())||void 0===y||null===(y=y.videoStats)||void 0===y?void 0:y.encoderName,stats_is_hardware_encoder_enabled:XZ.H264_HW_ENCODER,stats_gpu_url:XZ.GPU_URL||(null===(v=lT())||void 0===v?void 0:v.renderer),is_public_stream:null===(S=this._stream)||void 0===S?void 0:S.isPublicStream};this.logger.info("rtc_first_frame_statistics",JSON.stringify(f)),null===(Z=this._monitor)||void 0===Z||Z.report("rtc_first_frame_statistics",f)}),8e3)}}setLogin(e){if(this._login!==e){var t,i;if(this._login=e,e)null!==(t=this._stream)&&void 0!==t&&t.videoTrack&&this._stream.pubVideo&&this.beginSendFrame("video","login"),null!==(i=this._stream)&&void 0!==i&&i.audioTrack&&this._stream.pubAudio&&this.beginSendFrame("audio","login");!e&&this._audioSending&&this.stopSendFrame("audio","leave_room"),!e&&this._videoSending&&this.stopSendFrame("video","leave_room")}}setPublish(e){if(this._publish!==e){var t,i;if(this._publish=e,e)(null===(t=this._stream)||void 0===t?void 0:t.videoTrack)&&this._stream.pubVideo&&this.beginSendFrame("video","publish"),(null===(i=this._stream)||void 0===i?void 0:i.audioTrack)&&this._stream.pubAudio&&this.beginSendFrame("audio","publish");!e&&this._audioSending&&this.stopSendFrame("audio","unpublish"),!e&&this._videoSending&&this.stopSendFrame("video","unpublish")}}setUnmuteAudio(e){var t;this._unMuteAudio!==e&&(this._unMuteAudio=e,null!==(t=this._stream)&&void 0!==t&&t.audioHasCapture&&(e&&this.beginSendFrame("audio","unmute"),!e&&this._audioSending&&this.stopSendFrame("audio","mute")))}setEnableAudio(e){var t;this._enableAudio!==e&&null!==(t=this._stream)&&void 0!==t&&t.pubAudio&&(this._enableAudio=e,e&&this.beginSendFrame("audio","enable"),!e&&this._audioSending&&this.stopSendFrame("audio","disable"))}setUnmuteVideo(e){var t;this._unMuteVideo!==e&&(this._unMuteVideo=e,null!==(t=this._stream)&&void 0!==t&&t.videoHasCapture&&(e&&this.beginSendFrame("video","unmute"),!e&&this._videoSending&&this.stopSendFrame("video","mute")))}setEnableVideo(e){var t;this._enableVideo!==e&&null!==(t=this._stream)&&void 0!==t&&t.pubVideo&&(this._enableVideo=e,e&&this.beginSendFrame("video","enable"),!e&&this._videoSending&&this.stopSendFrame("video","disable"))}setPushAudio(e){this._pushAudio!==e&&(this._pushAudio=e,e&&this.beginSendFrame("audio","push"),!e&&this._audioSending&&this.stopSendFrame("audio","stop_push"))}setPushVideo(e){this._pushVideo!==e&&(this._pushVideo=e,e&&this.beginSendFrame("video","push"),!e&&this._videoSending&&this.stopSendFrame("video","stop_push"))}setAutoPublish(e){this._autoPublish=e}setPublisher(e){this._publisher!==e&&(this._publisher=e,!e&&this._audioSending&&this.stopSendFrame("audio","audience"),!e&&this._videoSending&&this.stopSendFrame("video","audience"))}setDisconnect(){this._audioSending&&this.stopSendFrame("audio","connection_lost"),this._videoSending&&this.stopSendFrame("video","connection_lost"),this.reset()}setTimeout(e){this._timeout=e}setPCSessionId(e){this._pcSessionId=e}async _getFirstVideoFrameStats(){var e,t,i,o;const s=null===(e=this._stream)||void 0===e||null===(e=e.videoTrack)||void 0===e?void 0:e.preprocessingTrack,r=null===(t=this._stream)||void 0===t||null===(t=t.videoTransceiver)||void 0===t?void 0:t.sender,n=null!==(i=null===(o=this._stream)||void 0===o||null===(o=o.vendorHandler)||void 0===o?void 0:o.peer)&&void 0!==i?i:this._ctx.peerConnection;if(n&&s){return(await n.getStatsWithLowFrequency(s,!0,r)).filter((e=>"outbound-rtp"===e.type))}}async _getFirstAudioFrameStats(){var e,t,i,o;const s=null===(e=this._stream)||void 0===e||null===(e=e.audioTrack)||void 0===e?void 0:e.preprocessingTrack,r=null===(t=this._stream)||void 0===t||null===(t=t.audioTransceiver)||void 0===t?void 0:t.sender,n=null!==(i=null===(o=this._stream)||void 0===o||null===(o=o.vendorHandler)||void 0===o?void 0:o.peer)&&void 0!==i?i:this._ctx.peerConnection;if(n&&s){return(await n.getStatsWithLowFrequency(s,!0,r)).find((e=>"outbound-rtp"===e.type))}}_watchForFirstVideoFrameSend(){let e=-1,t=-1;this._firstVideoFrameInterval&&window.clearInterval(this._firstVideoFrameInterval),this._firstVideoFrameInterval=window.setInterval((async()=>{const i=await this._getFirstVideoFrameStats();let o=0,s=0;if(null==i||i.map((e=>{o+=e.framesSent,s+=e.packetsSent})),i&&i.length>0&&(o>e||s>t)){if(-1===e&&-1===t)return e=o,void(t=s);this.sendFrameFinish("video"),window.clearInterval(this._firstVideoFrameInterval)}}),100)}_watchForFirstAudioFrameSend(){let e=-1;this._firstAudioFrameInterval&&window.clearInterval(this._firstAudioFrameInterval),this._firstAudioFrameInterval=window.setInterval((async()=>{const t=await this._getFirstAudioFrameStats();if(t&&t.packetsSent>e){if(-1===e)return void(e=t.packetsSent);this.sendFrameFinish("audio"),window.clearInterval(this._firstAudioFrameInterval)}}),100)}reset(){this._login=!1,this._publisher=!1,this._unMuteAudio=!1,this._enableAudio=!1,this._unMuteVideo=!1,this._enableVideo=!1,this._audioExternal=!1,this._pushAudio=!1,this._videoExternal=!1,this._pushVideo=!1,this._autoPublish=!1,this._publish=!1,this._audioFirstFrameState=0,this._videoFirstFrameState=0,this._currentAudioSend={startTime:0,eventSessionId:0,type:"login"},this._currentVideoSend={startTime:0,eventSessionId:0,type:"login"},window.clearTimeout(this._firstAudioFrameTimer),window.clearTimeout(this._firstVideoFrameTimer),window.clearInterval(this._firstAudioFrameInterval),window.clearInterval(this._firstVideoFrameInterval)}destroy(){this.reset(),delete this._stream}get _audioSending(){return 1===this._audioFirstFrameState}get _videoSending(){return 1===this._videoFirstFrameState}}const JM={audio:{delay:1200,stallRadio:.3},video:{delay:1200,stallRadio:.6},screen_audio:{delay:1600,stallRadio:.8},screen_video:{delay:1600,stallRadio:.8}};class OM{constructor(e){Hu(this,"_preUplinkStats",new Map),Hu(this,"_preDownlinkStats",new Map),Hu(this,"_timer",void 0),Hu(this,"_delayTimer",void 0),Hu(this,"reportor",void 0),this._ctx=e}updateUplinkStats(e,t){const{audioStats:i,videoStats:o,isScreen:s}=e;if(i.sendKBitrate>0&&i.rtt){const e=s?"screen_audio":"audio",{rtt:t,_fractionLost:o,_retransmittedRate:r}=i,n=this._getQosLevel(t,o||0,r||0),a=this._preUplinkStats.get(e)||[n];this._preUplinkStats.set(e,[...a,n].slice(-2))}if(o.sentKBitrate>0&&o.rtt){const i=s?"screen_video":"video";let{_fractionLost:r}=o;const{rtt:n,_sendBandWidth:a,_retransmittedRate:d}=o;0===a&&(r=Math.max(.65,r));const c=this._getQosLevel(n,r||0,d||0),l=this._getUplinkVideoQoE(e,t),u=this._getVideoUplinkNetworkQuality(c,l),m=this._preUplinkStats.get(i)||[u];this._preUplinkStats.set(i,[...m,u].slice(-2))}this._startNetworkQualityReport()}updateDownlinkStats(e,t){if(!t)return;const{audioActive:i,videoActive:o}=this._getStreamActiveState(t),{audioStats:s,videoStats:r,isScreen:n,userId:a}=e;let d,c,l=!0,u=!0;if(i)if(0===s.receivedKBitrate)l=!1;else{const{rtt:e,audioLossRate:t,stallDuration:i,statsInterval:o,e2eDelay:a}=s,c=i/o,l=n?"screen_audio":"audio",u=this._getQosLevel(e,t||0,r._retransmittedRate||0),m=this._getDownlinkQoE(l,c,a);d=this._getNetworkQuality(u,m)}if(o)if(0===r.receivedKBitrate||0===r.rtt)u=!1;else{const{rtt:e,videoLossRate:t,stallDuration:i,statsInterval:o,e2eDelay:s,_retransmittedRate:a}=r,d=i/o,l=n?"screen_video":"video",u=this._getQosLevel(e,t||0,a||0),m=this._getDownlinkQoE(l,d,s);c=this._getNetworkQuality(u,m)}const m="".concat(a).concat(n?"_screen":"");if(!l&&!u)return void this._preDownlinkStats.delete(m);const h=d&&c?Math.ceil((d+c)/2):d||c;if(h){const e=this._preDownlinkStats.get(m)||[h];this._preDownlinkStats.set(m,[...e,h].slice(-2)),this._startNetworkQualityReport()}}destroy(){this._timer&&(window.clearInterval(this._timer),delete this._timer),this._delayTimer&&(window.clearTimeout(this._delayTimer),delete this._delayTimer),this._preUplinkStats.clear(),this._preDownlinkStats.clear()}_startNetworkQualityReport(){this._delayTimer||this._timer||(this._preUplinkStats.size>0||this._preDownlinkStats.size>0)&&(this._delayTimer=setTimeout((()=>{delete this._delayTimer,this._reportNetworkQuality(),this._timer=window.setInterval((()=>{this._reportNetworkQuality()}),2e3)}),300))}_reportNetworkQuality(){var e;let t,i;if(["connected","connecting"].includes(null===(e=this._ctx.handler)||void 0===e?void 0:e.getConnectionState())){const e=this._getBetterQualityAndRemoveOldest("audio","up"),o=this._getBetterQualityAndRemoveOldest("video","up");t=e&&o?Math.ceil((e+o)/2):e||o||this._getBetterQualityAndRemoveOldest("screen_video","up")||this._getBetterQualityAndRemoveOldest("screen_audio","up")||bm.EXCELLENT;const s=Array.from(this._preDownlinkStats.keys()).map((e=>this._getBetterQualityAndRemoveOldest(e,"down"))).filter((e=>e));i=Math.ceil(s.reduce(((e,t)=>t+e),0)/s.length)||bm.UNKNOWN}else t=i=bm.DOWN;navigator.onLine||(t=bm.DOWN,i=bm.DOWN),"function"==typeof this.reportor&&this.reportor(t,i)}_getNetworkQuality(e,t){return 1===t?Math.max(e-2,1):2===t?e:Math.min(e+1,5)}_getVideoUplinkNetworkQuality(e,t){return 1===t||0===t?e:2===t?Math.min(e+1,5):Math.min(e+2,5)}_getQosLevel(e,t,i){let o;return o=(!e||e<=250)&&t<=.15?1:(!e||e<=500)&&t<=.3?2:(!e||e<=750)&&t<=.45?3:(!e||e<=1e3)&&t<=.6?4:5,i>.5?o=Math.max(o,4):i>.35?o=Math.max(o,3):i>.15&&(o=Math.max(o,2)),o}_getUplinkQoE(e,t){let i=0;switch(e){case"audio":case"video":i=t<.05?1:t<.1?2:3;break;case"screen_video":case"screen_audio":i=t<.04?1:t<.08?2:3}return i}_getUplinkVideoQoE(e,t){var i;const o=(null==e||null===(i=e.videoStats)||void 0===i?void 0:i.rid)||"0";if(!t)return 0;const s=t.pubAttributes.videoDescriptions[o],r=e.videoStats,n=r.encodedFrameWidth*r.encodedFrameHeight/(s.width*s.height),a=r.sentFrameRate/s.framerate;let d=0,c=0;return"number"!=typeof n||Number.isNaN(n)||(d=n>=.9?1:n<.9&&n>=.8?2:3),"number"!=typeof a||Number.isNaN(a)||(c=a>=.8?1:a<.8&&a>=.6?2:3),Math.max(0,d,c)}_getDownlinkQoE(e,t,i){const o=JM[e];return t>o.stallRadio||i>o.delay||t>o.stallRadio/2&&i>o.delay/2?3:(t>o.stallRadio/2||o.delay,2)}_getBetterQualityAndRemoveOldest(e,t){let i=bm.UNKNOWN;const o="up"===t?this._preUplinkStats:this._preDownlinkStats,s=o.get(e);if(s){const t=s.filter((e=>e));t.length>0&&(i=Math.min(...t)),s.shift(),0===s.length&&o.delete(e)}return i}_getStreamActiveState(e){let{subMediaType:t,_attributes:i,subVideo:o,subAudio:s}=e;return{audioActive:s&&Qf(t)&&i.localaudio&&i.audiostream,videoActive:o&&Bf(t)&&i.localvideo&&i.videostream}}}class UM{constructor(e){Hu(this,"_timer",void 0),Hu(this,"_remoteVideoSizeCache",{}),Hu(this,"_remoteScreenSizeCache",{}),Hu(this,"onchange",void 0),this._room=e,this._start()}destroy(){this._timer&&(window.clearInterval(this._timer),delete this._timer),this._remoteVideoSizeCache={},this._remoteScreenSizeCache={}}_start(){this._timer||(this._timer=window.setInterval((()=>{const e={},t={};this._room.remoteStreams.forEach(((i,o)=>{i.forEach((i=>{var s;const r=null===(s=i.videoTrack)||void 0===s?void 0:s.preprocessingTrack;if(r){const s=i.isScreen?this._remoteScreenSizeCache:this._remoteVideoSizeCache,{width:u=0,height:m=0}=s[o]||{};let h=0,p=0;if(wv){var n,a;({width:h,height:p}=null!==(n=null==i||null===(a=i.videoTrack)||void 0===a?void 0:a.getSizeByPlayer())&&void 0!==n?n:{width:0,height:0})}else{var d;const e=r.getSettings();h=e.width||0,p=e.height||0;const t=null===(d=i._attributes)||void 0===d?void 0:d.alphaInfo;var c,l;if(null!=t&&t.enableAlpha)h=null!==(c=t.alphaWidth)&&void 0!==c?c:h,p=null!==(l=t.alphaHeight)&&void 0!==l?l:p/2}m===p&&u===h||"function"==typeof this.onchange&&this.onchange(o,i.isScreen,h,p),delete s[o],(i.isScreen?t:e)[o]={width:h,height:p}}}))})),Object.keys(this._remoteVideoSizeCache).forEach((e=>{"function"==typeof this.onchange&&this.onchange(e,!1,0,0)})),Object.keys(this._remoteScreenSizeCache).forEach((e=>{"function"==typeof this.onchange&&this.onchange(e,!0,0,0)})),this._remoteVideoSizeCache=e,this._remoteScreenSizeCache=t}),1e3))}}const DM=Array.from((new TextEncoder).encode("subt")),AM={1:RS.SUBTITLE_ERR_POSTPROCESS,2:RS.SUBTITLE_ERR_CONNECTION_ERROR,3:RS.SUBTITLE_ERR_PROCESS_ERROR},zM=new xv("SubtitleTool",1);class jM{constructor(e,t){Hu(this,"_taskId",void 0),Hu(this,"_sourceLanguage","zh"),Hu(this,"_updating",!1),Hu(this,"onEvent",void 0),Hu(this,"onMessage",void 0),Hu(this,"_preConfig",void 0),Hu(this,"_timer",void 0),this._ctx=e,this._roomConf=t;const{extraInfo:i}=t.userInfo;if(i)try{const e=JSON.parse(i);e.source_language&&(this._sourceLanguage=e.source_language)}catch(o){}}async start(e){zM.info("start","Invoke config: %o",e),ES(e.mode,"mode",[Tm.ASR_ONLY,Tm.ASR_AND_TRANSLATION]);const t=Array.isArray(e.targetLanguage)?e.targetLanguage:[e.targetLanguage||""];if(e.mode===Tm.ASR_AND_TRANSLATION&&t.findIndex((e=>-1===BM.indexOf(e)))>-1)throw new LS(RS.INVALID_PARAMS,"Invalid targetLanguage.");if(this._taskId)throw new LS(RS.SUBTITLE_ALREADY_ON,"Already turned on subtitle");this._preConfig={targetLanguage:t,mode:e.mode},this._taskId=(Date.now().toString()+this._roomConf.roomId+this._roomConf.userId).substring(0,20),await this._sendSubtitleSignalingWithRetry(e,this._taskId)}async update(e){if(zM.info("update","Invoke config: %o",e),!this._taskId)throw new LS(RS.SUBTITLE_NOT_TURNED_ON,"Start subtitle first.");this._sourceLanguage=e.sourceLanguage,this._updating=!0;try{await this._ctx.signalingManager.sendSignaling("controlMessage",this._genChangeSubtitleLanguageSignaling(e,this._taskId))}catch(t){throw this._updating=!1,t}}stop(){zM.info("stop","Invoke"),this._taskId&&this._ctx.signalingManager.sendSignaling("controlMessage",{type:"subtitle",action:"stopped",appId:this._ctx.appId,roomId:this._roomConf.roomId,userId:this._roomConf.userId,taskId:this._taskId}).finally((()=>{var e;delete this._taskId,null===(e=this.onEvent)||void 0===e||e.call(this,{event:Im.STOPPED}),this._clearTimer()}))}async reconnect(){this._taskId&&this._preConfig&&(await this._ctx.signalingManager.sendSignaling("controlMessage",{type:"subtitle",action:"stopped",appId:this._ctx.appId,roomId:this._roomConf.roomId,userId:this._roomConf.userId,taskId:this._taskId}),delete this._taskId,this.start(this._preConfig))}getConfig(){return this._preConfig}destroy(){zM.info("destroy","Invoke"),this.stop(),delete this._preConfig,delete this._taskId}onResult(e){const{error:t,errorMessage:i,eventType:o}=e.body;if(0!==t){var s;const e=new LS(AM[t]||RS.SUBTITLE_ERR_UNKNOWN,i||"");null===(s=this.onEvent)||void 0===s||s.call(this,{event:Im.ERROR,errorCode:e.code,errorMessage:e.message}),this._clearTimer()}else if("SubtitleStarted"===o){var r;null===(r=this.onEvent)||void 0===r||r.call(this,{event:Im.STARTED}),this._clearTimer()}else if(this._updating&&"LanguageChanged"===o){var n;this._updating=!1,null===(n=this.onEvent)||void 0===n||n.call(this,{event:Im.UPDATED})}}onMessageRecv(e){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1]||this._taskId&&this._preConfig){const i=QM(e);if(!i||0===i.length)return!1;if(this._taskId&&this._preConfig){const{mode:e,targetLanguage:o}=this._preConfig,s=[];var t;if(i.forEach((t=>{if(e===Tm.ASR_ONLY)t.mode===e&&s.push(t);else{const e=o.includes(t.language);(e||t.mode===Tm.ASR_ONLY)&&s.push(t),t.mode===Tm.ASR_ONLY&&e&&s.push(Ju(Ju({},t),{},{mode:Tm.ASR_AND_TRANSLATION}))}})),s.length>0)null===(t=this.onMessage)||void 0===t||t.call(this,s)}return!0}return!1}async _sendSubtitleSignalingWithRetry(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;await this._ctx.signalingManager.sendSignaling("controlMessage",this._genSubtitleSignaling(e,t)),this._timer=self.setTimeout((()=>{var o;2===i?(null===(o=this.onEvent)||void 0===o||o.call(this,{event:Im.ERROR,errorCode:RS.TIME_OUT,errorMessage:"start subtitle timeout."}),delete this._timer,this.stop()):this._sendSubtitleSignalingWithRetry(e,t,i+1)}),jM.retryIntervel)}_genSubtitleSignaling(e,t){return{taskId:t,type:"subtitle",action:"started",roomId:this._roomConf.roomId,appId:this._ctx.appId,userId:this._roomConf.userId,subtitleMeta:{subtitleConfig:{mode:e.mode,usersConfig:[{userId:this._roomConf.userId,targetLanguages:Array.isArray(e.targetLanguage)?e.targetLanguage:[e.targetLanguage||""]}]},vendorConfig:{type:0}}}}_genChangeSubtitleLanguageSignaling(e,t){return{taskId:t,type:"subtitle",action:"subtitleUpdated",roomId:this._roomConf.roomId,appId:this._ctx.appId,userId:this._roomConf.userId,subtitleMeta:{protocol:1,languageConfig:{sourceLanguages:[{userId:this._roomConf.userId,languageCode:[e.sourceLanguage]}]}}}}_clearTimer(){this._timer&&(self.clearTimeout(this._timer),delete this._timer)}}Hu(jM,"retryIntervel",3e4);const QM=e=>{let{message:t}=e;if(t instanceof ArrayBuffer&&t.byteLength>8)try{const e=new DataView(t,0);let i=0;if(DM.every((t=>e.getUint8(i++)===t))){const o=e.getUint32(i);if(i+=4,o===e.byteLength-8){const e=Jf.ab2str(t.slice(8)),{data:i,type:o}=JSON.parse(e);if("subtitle"===o)return i}}}catch(i){}return!1},BM=["zh","zh-Hant","tn","vi","iu","it","id","hi","en","ho","he","es","el","uk","ur","tk","tr","ti","ty","tl","to","th","ta","te","sl","sk","ss","eo","sm","sg","st","sv","ja","tw","qu","pt","pa","no","nb","nr","my","bn","mn","mh","mk","ml","mr","ms","lu","ro","lt","lv","lo","kj","hr","kn","ki","cs","ca","nl","ko","ht","gu","ka","kl","km","lg","kg","fi","fj","fr","ru","ng","de","tt","da","ts","cv","fa","bs","pl","bi","nd","ba","bg","az","ar","af","sq","ab","os","ee","et","ay","lzh","am","ckb","cy","gl","ha","hy","ig","kmr","ln","nso","ny","om","sn","so","sr","sw","xh","yo","zu"];class qM{constructor(e,t){Hu(this,"roomId",void 0),Hu(this,"userInfo",void 0),Hu(this,"userId",void 0),Hu(this,"sessionId",ap()),Hu(this,"token",void 0),Hu(this,"rtcVid",void 0),Hu(this,"joinPromise",void 0),Hu(this,"startJoinTimestamp",void 0),Hu(this,"_liveControlMessage",void 0),Hu(this,"_userStreamMap",new Map),Hu(this,"_roomConfig",{isAutoPublish:!0,isAutoSubscribeAudio:!0,isAutoSubscribeVideo:!0,roomProfileType:ym.communication}),Hu(this,"_vendorConfig",{enableMultiVendor:!1,vendorCode:0}),Hu(this,"_roomAttr",{multiChatMode:!1,bigRoomMode:!1}),Hu(this,"_tokenPublishPrivilegeExpired",!1),Hu(this,"_tokenSubscribePrivilegeExpired",!1),Hu(this,"_streamQueueMap",new Map),Hu(this,"_monitor",void 0),this._ctx=t,this.roomId=e.roomId,this.userInfo=e.userInfo,this.userId=e.userInfo.userId,this.token=e.token,this._monitor=mv(t.id)}async checkJoinRoom(){await this.joinPromise}get vendorConfig(){return this._vendorConfig}setVendorConfig(e){this._vendorConfig=e}updateRoomAttributes(e){this._roomAttr=Ju(Ju({},this._roomAttr),e)}setLiveControlMessage(e){this._liveControlMessage=e}getLiveControlMessage(){return this._liveControlMessage}isMultiChatMode(){return this._roomAttr.multiChatMode}updateRoomConfig(e){return this._roomConfig=lG(this._roomConfig,e),this._roomConfig}get isAutoPublish(){return!this.isRTSOnlyRoom()&&this._roomConfig.isAutoPublish}get isAutoSubscribeAudio(){return!this.isRTSOnlyRoom()&&this._roomConfig.isAutoSubscribeAudio}get isAutoSubscribeVideo(){return!this.isRTSOnlyRoom()&&this._roomConfig.isAutoSubscribeVideo}get remoteVideoConfig(){return this._roomConfig.remoteVideoConfig}get roomProfileType(){return this._roomConfig.roomProfileType||ym.communication}isRTSOnlyRoom(){return this._roomConfig.roomMode===Gm.ROOM_MODE_RTS_ONLY}get rtsOnlySignalHeader(){return this.isRTSOnlyRoom()?{functionType:zG.C2RTM}:void 0}updateUserPubInfo(e){const t=this._userStreamMap.get(e.clientId)||{};e.screen?(t.screenAudio=e.attributes.audiostream,t.screenVideo=e.attributes.videostream):(t.audio=e.attributes.audiostream,t.video=e.attributes.videostream),this._userStreamMap.set(e.clientId,t)}getUserPubInfo(e){return Ju({audio:!1,video:!1,screenAudio:!1,screenVideo:!1},this._userStreamMap.get(e)||{})}resetUserPubInfo(){this._userStreamMap.clear()}get tokenPublishPrivilegeExpired(){return this._tokenPublishPrivilegeExpired}get tokenSubscribePrivilegeExpired(){return this._tokenSubscribePrivilegeExpired}setTokenPublishPrivilegeExpired(e){this._tokenPublishPrivilegeExpired=e}setTokenSubscribePrivilegeExpired(e){this._tokenSubscribePrivilegeExpired=e}getStayRoomDuration(){return this.startJoinTimestamp?Hf()-this.startJoinTimestamp:0}getStreamQueueLock(e){let t=this._streamQueueMap.get(e);return t||(t=new nN(e),this._streamQueueMap.set(e,t)),t}report(e,t,i){var o;null===(o=this._monitor)||void 0===o||o.report(e,Ju({room_id:this.roomId,user_id:this.userId,rtc_session_id:this.sessionId,rtc_vid:this.rtcVid},t),i)}}const $M=6e4,eY=(e,t,i)=>{i.info(e,"userId: %o, subAudio: %o, subVideo: %o, audioMid: %o, videoMid: %o, sequenceId: %o",t.userId,t.subAudio,t.subVideo,t.audioMid,t.videoMid,t.sequenceId)};function tY(e,t,i){const o=i.value;return i.value=async function(){if(!this._ctx.signalingManager.isConnected())throw new LS(RS.NOT_CONNECTED_YET,"error in ".concat(t,": try again after connect"));try{await(this._roomConf||this.config).checkJoinRoom()}catch(r){throw new LS(RS.JOIN_ROOM_FAILED,"error in ".concat(t,": try again after joined"))}for(var e=arguments.length,i=new Array(e),s=0;s<e;s++)i[s]=arguments[s];return o.apply(this,i)},i}function iY(e,t,i){const o=i.value;return i.value=async function(){const e=this._roomConf,i=this._logger;for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];const a=function(e){if(e instanceof kM)return e.id;return null==e?void 0:e.streamId}(r[0]);if(!a)return null==o?void 0:o.apply(this,r);i.info("streamQueue","lock stream %o, task %o",a.slice(-5),t);const d=await e.getStreamQueueLock(a).lock();try{return await(null==o?void 0:o.apply(this,r))}finally{i.info("streamQueue","unlock stream %o, task %o",a.slice(-5),t),d()}},i}var oY=Object.defineProperty,sY=Object.getOwnPropertyDescriptor,rY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?sY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&oY(t,i,r),r};class nY extends Ig{constructor(e,t){super(),Hu(this,"_forwardDstRooms",new Map),Hu(this,"forwardStreamState","stopped"),this._ctx=e,this._roomConf=t}async startForwardStream2Rooms(e){if("running"===this.forwardStreamState||"paused"===this.forwardStreamState)throw new LS(RS.UNEXPECTED_INVOKE_FORWARD_STREAM,"should not invoke startForwardStreamToRooms in state: ".concat(this.forwardStreamState));const t=await this._sendForwardStreamSignaling("start",this._roomConf.roomId,e);this._updateDstRooms(e,t);const i=this._transformForwardStreamResult(t);return this.forwardStreamState="running",i}async updateForwardStream2Rooms(e){if("stopped"===this.forwardStreamState)throw new LS(RS.UNEXPECTED_INVOKE_FORWARD_STREAM,"should not invoke updateForwardStreamToRooms in state: ".concat(this.forwardStreamState));let t=this._mockForwardStreamResult(e);"running"===this.forwardStreamState&&(t=await this._sendForwardStreamSignaling("update",this._roomConf.roomId,e)),this._updateDstRooms(e,t);return this._transformForwardStreamResult(t)}async stopForwardStream2Rooms(){if("stopped"===this.forwardStreamState)throw new LS(RS.UNEXPECTED_INVOKE_FORWARD_STREAM,"should not invoke stopForwardStreamToRooms in state: ".concat(this.forwardStreamState));let e=this._mockForwardStreamResult([]);if("running"===this.forwardStreamState&&(e=await this._sendForwardStreamSignaling("stop",this._roomConf.roomId)),this._updateDstRooms([],e),[...this._forwardDstRooms.keys()].length>0)throw new LS(RS.UNEXPECTED_ERROR,"stopforwardstream failed: ".concat(JSON.stringify(e)));const t=this._transformForwardStreamResult(e);return this.forwardStreamState="stopped",t}async pauseForwardStream2AllRooms(){if("paused"===this.forwardStreamState||"stopped"===this.forwardStreamState)throw new LS(RS.UNEXPECTED_INVOKE_FORWARD_STREAM,"should not invoke pauseForwardStreamToAllRooms in state: ".concat(this.forwardStreamState));const e=await this._sendForwardStreamSignaling("stop",this._roomConf.roomId),t=this._transformForwardStreamResult(e);return this.forwardStreamState="paused",t}async resumeForwardStream2AllRooms(){if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0])&&["running","stopped"].includes(this.forwardStreamState))throw new LS(RS.UNEXPECTED_INVOKE_FORWARD_STREAM,"should not invoke resumeForwardStreamToAllRooms in state: ".concat(this.forwardStreamState));const e=this._getDstRooms(),t=await this._sendForwardStreamSignaling("start",this._roomConf.roomId,e);this._updateDstRooms(e,t);const i=this._transformForwardStreamResult(t);return this.forwardStreamState="running",i}resumeFromReconnect(){"running"===this.forwardStreamState&&this.resumeForwardStream2AllRooms(!0).then((e=>{e.forEach((e=>{e.state===gm.FORWARD_STREAM_STATE_FAILURE&&this.safeEmit(NM.ON_FORWARD_STREAM_ERROR,e)}))}))}onForwardDstRoomUserKick(e){const t=[{dstRoomId:e.dstRoomId,code:200,forwardStreamType:"stop"}];this._updateDstRooms([],t),this.safeEmit(NM.ON_FORWARD_STREAM_ERROR,{roomId:e.dstRoomId,state:gm.FORWARD_STREAM_STATE_FAILURE,error:Rm.FORWARD_STREAM_ERROR_REMOTE_KICKED})}destoy(){super.removeAllListeners(),this._forwardDstRooms.clear(),this.forwardStreamState="stopped"}_mockForwardStreamResult(e){const t=[];return this._forwardDstRooms.forEach(((e,i)=>{t.push({dstRoomId:i,forwardStreamType:"stop",code:200})})),e.forEach((e=>{const i=t.findIndex((t=>t.dstRoomId===e.roomId));-1===i?t.push({dstRoomId:e.roomId,forwardStreamType:"start",code:e.roomId===this._roomConf.roomId?400:200}):t[i].forwardStreamType="update"})),t}_transformForwardStreamResult(e){e||(e=[]);const t=[];for(const{dstRoomId:i,code:o}of e){const e={roomId:i,state:gm.FORWARD_STREAM_STATE_SUCCESS,error:Rm.FORWARD_STREAM_ERROR_OK};200===o||(400===o?(e.state=gm.FORWARD_STREAM_STATE_FAILURE,e.error=Rm.FORWARD_STREAM_ERROR_REMOTE_KICKED):o>=700&&o<800?(e.state=gm.FORWARD_STREAM_STATE_FAILURE,e.error=Rm.FORWARD_STREAM_ERROR_INVALID_TOKEN):(e.state=gm.FORWARD_STREAM_STATE_FAILURE,e.error=Rm.FORWARD_STREAM_ERROR_RESPONSE)),t.push(e)}return t}_updateDstRooms(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];0===t.length&&this._forwardDstRooms.clear(),t.forEach((t=>{let{dstRoomId:i,code:o,forwardStreamType:s}=t;if(200===o)if("stop"===s)this._forwardDstRooms.delete(i);else{var r;const t=e.find((e=>e.roomId===i));if(!t&&!this._forwardDstRooms.has(i))throw new LS(RS.UNEXPECTED_ERROR,"unknow roomid ".concat(i," in signaling return"));let o=null!==(r=this._forwardDstRooms.get(i))&&void 0!==r?r:{token:void 0};o=Object.assign(o,t),this._forwardDstRooms.set(i,o)}else this._forwardDstRooms.has(i)&&this._forwardDstRooms.delete(i)}))}_getDstRooms(){const e=[];return this._forwardDstRooms.forEach(((t,i)=>{e.push({roomId:i,token:t.token})})),e}async _sendForwardStreamSignaling(e,t,i){const o="".concat(Df());if("stop"!==e){const e=i.map((e=>e.roomId));this._roomConf.report("rtc_forward_stream",{type:"begin",dst_rooms:"{ ".concat(e.map((e=>'"'.concat(e,'"'))).join(",")," }"),event_session_id:o})}const s={forwardStreamType:e,roomId:t};("start"===e||"update"===e)&&(s.dstRoomInfos=null==i?void 0:i.map((e=>({dstRoomId:e.roomId,dstToken:Jf.token2auth(this._ctx.appId,e.roomId,this._roomConf.userId,e.token)}))));const r=await this._ctx.signalingManager.sendSignaling("forwardStream",s),n=[];if(200!==(null==r?void 0:r.code))throw"stop"!==e&&(null==i||i.forEach((e=>{n.push({dst_room_id:e.roomId,result:"server error ".concat(null==r?void 0:r.code)})})),this._roomConf.report("rtc_forward_stream",{type:"end",dst_rooms:JSON.stringify(n),event_session_id:o})),new LS(RS.UNEXPECTED_ERROR,"server side internal error, error code: ".concat(r));var a,d;"stop"!==e&&(null===(a=r.forwardStreamResults)||void 0===a||a.forEach((e=>{n.push({dst_room_id:e.dstRoomId,result:"dst room lost"})})),null===(d=r.forwardStreamResults)||void 0===d||d.forEach((e=>{const t=n.find((t=>t.dst_room_id===e.dstRoomId));t&&(200===e.code?"update"===e.forwardStreamType?t.result="update":t.result="success":t.result="server error ".concat(e.code))})),this._roomConf.report("rtc_forward_stream",{type:"end",dst_rooms:JSON.stringify(n),event_session_id:o}));return r.forwardStreamResults}}rY([tY],nY.prototype,"startForwardStream2Rooms",1),rY([tY],nY.prototype,"updateForwardStream2Rooms",1),rY([tY],nY.prototype,"stopForwardStream2Rooms",1),rY([tY],nY.prototype,"pauseForwardStream2AllRooms",1),rY([tY],nY.prototype,"resumeForwardStream2AllRooms",1);const aY=cZ()||dZ();class dY extends xx{constructor(e,t){super(e,t),Hu(this,"_peerConnectionId",Kf()),Hu(this,"peerConnectionMode",1),Hu(this,"name","vendor"),Hu(this,"direction","up"),Hu(this,"stream",void 0),t.on("ice_state",(e=>{this._report("rtc_ice_state",{pc_session_id:this.peerConnectionId,direction:this.direction,error_code:0,ice_state:e.toUpperCase(),message:"",peer_connection_id:this.peerConnectionId,stream_id:"",stream_user_id:""})})),t.on("disconnect",(()=>{this.emit("disconnect")}))}async publish(e){this._context.videoProfile.closeSimulcast(),this.stream=e;const{videoDescriptions:t,subVideoDescriptions:i,audioTransceiverInit:o,videoTransceiverInit:s}=super.internalPublish(e);e.audioTransceiver=this._peerConnection.addTransceiver(o.track,o.init),e.videoTransceiver=this._peerConnection.addTransceiver(s.track,s.init),aY&&(e.initAudioEncodedTransform(),e.initVideoEncodedTransform()),this._report("rtc_begin_create_offer",{direction:"up",stream_id:"",stream_user_id:"",pc_session_id:this.peerConnectionId,vendor_mode:(null==e?void 0:e.vendorCode)||0});const r=await this.peer.createOfferSdp(),n=Hf(),a=Tf.parse(r);Array.isArray(a.media)&&(a.media=a.media.map((e=>{if("video"===e.type)(Kv||$v)&&Array.isArray(e.ext)&&(e.ext=e.ext.filter((e=>{var t;return!(null!=e&&null!==(t=e.uri)&&void 0!==t&&t.includes("video-orientation"))}))),Kv||this.addBitrateLimit(e,this._context.videoProfile.getVideoEncodeConfig()[0].maxKbps);else if("audio"===e.type){const i=null==e?void 0:e.rtp.find((e=>"opus"===e.codec));if(i&&e.fmtp){var t;const o=e.fmtp.find((e=>e.payload===i.payload));o&&null!==(t=this._context)&&void 0!==t&&t.audioProfileManager&&(o.config=this._context.audioProfileManager.getOpusConfigStr(o.config))}}return e})));const d={type:"offer",sdp:Tf.write(a)};try{await this._peerConnection.setLocalDescription(d),this._report("rtc_set_description",{error_code:0,message:d.sdp||"",is_local:"1",direction:"up",stream_id:"",stream_user_id:"",elapse:Hf()-n},{type:"offer"})}catch(c){throw this._report("rtc_set_description",{error_code:-1,message:c.message+d.sdp,is_local:"1",direction:"up",stream_id:"",stream_user_id:"",elapse:Hf()-n},{type:"offer"}),c}return{partialSdp:d.sdp||"",audioMid:"0",videoMid:"1",type:"offer",semantics:"unified-plan",videoDescriptions:t,subVideoDescriptions:i,audioTransceiverInit:o,videoTransceiverInit:s,peerConnectionMode:this.peerConnectionMode,peerConnectionId:this.peerConnectionId}}async subscribe(e){this.stream=e,this.direction="down",e.audioTransceiver=this._peerConnection.addTransceiver("audio",{direction:"recvonly"}),e.videoTransceiver=this._peerConnection.addTransceiver("video",{direction:"recvonly"}),aY&&(e.initAudioEncodedTransform(),e.initVideoEncodedTransform()),this._report("rtc_begin_create_offer",{direction:"down",stream_id:e.streamId,stream_user_id:e.userId,pc_session_id:this.peerConnectionId,vendor_mode:e.vendorCode||0});const t=await this.peer.createOfferSdp(),i=Hf(),o=Tf.parse(t);Array.isArray(o.media)&&(o.media=o.media.map((e=>{if("audio"===e.type){const t=null==e?void 0:e.rtp.find((e=>"opus"===e.codec));if(t&&null!=e&&e.fmtp){const i=null==e?void 0:e.fmtp.find((e=>e.payload===t.payload));i&&this._context&&(i.config+=";stereo=1;sprop-stereo=1")}}return e})));const s={type:"offer",sdp:Tf.write(o)};try{await this._peerConnection.setLocalDescription(s),this._report("rtc_set_description",{error_code:0,message:s.sdp||"",is_local:"1",direction:"down",stream_id:e.streamId,stream_user_id:e.userId,elapse:Hf()-i},{type:"offer"})}catch(r){throw this._report("rtc_set_description",{error_code:-1,message:r.message+s.sdp,is_local:"1",direction:"down",stream_id:e.streamId,stream_user_id:e.userId,elapse:Hf()-i},{type:"offer"}),r}return{partialSdp:s.sdp||"",audioMid:"0",videoMid:"1",type:"offer",semantics:"unified-plan",peerConnectionMode:this.peerConnectionMode,peerConnectionId:this.peerConnectionId}}async handleAck(e){if(e.action===Yx.publish||e.action===Yx.subscribe){const{signalingAck:n,videoMid:a,videoCodec:d}=e,{sdp:c}=n,l=Tf.parse(c);l.media=l.media.map((e=>(e.mid===a&&d&&XG(e,d),e)));const u={sdp:Tf.write(l),type:"answer"},m=Hf();try{var t,i;await this._peerConnection.setRemoteDescription(u),this._report("rtc_set_description",{error_code:0,message:u.sdp||"",is_local:"1",direction:"down",stream_id:(null===(t=e.stream)||void 0===t?void 0:t.streamId)||"",stream_user_id:null===(i=e.stream)||void 0===i?void 0:i.userId,elapse:Hf()-m},{type:"answer"})}catch(r){var o,s;throw this._report("rtc_set_description",{error_code:-1,message:r.message+u.sdp,is_local:"1",direction:"down",stream_id:(null===(o=e.stream)||void 0===o?void 0:o.streamId)||"",stream_user_id:null===(s=e.stream)||void 0===s?void 0:s.userId,elapse:Hf()-m},{type:"offer"}),r}"function"==typeof e.onSuccess&&e.onSuccess()}else e.action!==Yx.unpublish&&e.action!==Yx.unsubscribe||this.destroy();return""}destroy(){this.peer.destroy(),super.destroy()}async getDefaultSdp(){return{sdp:"",type:"offer",semantics:""}}connect(){throw new Error("Method not implemented.")}async rollback(){try{this._peerConnection.close()}catch(e){}}get peerConnectionId(){return this._peerConnectionId}set peerConnectionId(e){this._peerConnectionId=e}}var cY=Object.defineProperty,lY=Object.getOwnPropertyDescriptor,uY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?lY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&cY(t,i,r),r};class mY extends Ig{constructor(e,t){super(),Hu(this,"_logger",void 0),Hu(this,"_pubBackOff",new Map),this._ctx=e,this._roomConf=t,this._logger=new xv("RoomPublisher",2,e.id)}async hasPublished(e){return!!e.audioMid&&!!e.videoMid}async publish(e){return this._publish(e)}async _publish(e){var t,i,o,s,r,n,a,d,c,l;this._logger.info("publish()","localStream: %o",e);const{videoTrack:u}=e,{audioTrack:m}=e,h=Hf();let p,{handler:b}=this._ctx;this._roomConf.vendorConfig.enableMultiVendor?[b,p]=await this._getVendorPubSdpInfo(e):p=await this._ctx.handler.publish(e),this.emit("_test_pub_sdpInfo_",p);const{audioMid:_,videoMid:y}=p;e.pubAttributes={localaudio:!!m,localvideo:!!u,videostream:e.pubVideo,audiostream:e.pubAudio,extvideo:(null==u?void 0:u.sourceType)===Ng.EXTERNAL,extaudio:(null==m?void 0:m.sourceType)===Ng.EXTERNAL,videoDescriptions:p.videoDescriptions,videoType:xg.NORMAL};const v={attributes:Ju({},e.pubAttributes),audio:!0,video:!0,screen:e.isScreen,audioMid:_,videoMid:y,sdpInfo:{msid:e.stream.id,type:p.type,sdp:p.partialSdp,semantics:p.semantics},peerConnectionMode:null===(t=p)||void 0===t?void 0:t.peerConnectionMode,supportMultiVendor:!0},S=!this._roomConf.vendorConfig.enableMultiVendor&&e.enableSimulcast&&(null===(i=this._ctx.serverConfig)||void 0===i?void 0:i.simulcastOnDemand)&&(null===(o=p.subVideoDescriptions)||void 0===o?void 0:o.length);let Z;(S||null!==(s=this._ctx.serverConfig)&&void 0!==s&&s.e2eFeedback)&&(v.attributes.subVideoDescriptions=p.subVideoDescriptions),null!==(r=p)&&void 0!==r&&r.peerConnectionId&&(v.peerConnectionId=p.peerConnectionId);try{this.emit("_test_pub_body_",v),Z=await this._ctx.signalingManager.sendSignaling("publish",v)}catch(L){var f,T;if(this._logger.error("_publish",uT(L)),null===(f=this._ctx.monitor)||void 0===f||f.report("rtc_error",{message:"[publisher._publish] ".concat(uT(L)),error_code:-1}),L instanceof Error?this._roomConf.report("rtc_publish_stat",{result:"fail",is_screen:"0",start:h,message:"".concat(L.name,": ").concat(L.message)}):L instanceof LS&&this._roomConf.report("rtc_publish_stat",{result:"fail",is_screen:"0",start:h,message:"".concat(L.code,": ").concat(L.message)}),await(null===(T=b)||void 0===T?void 0:T.rollback({msid:e.stream.id,stream:e,audioMid:_,videoMid:y})),L.code>=500&&L.code<600){this.emit("_test_pub_5xx_");const t=this._getPubBackOff(e.id);if(t.retryDuration<6e4)return this._logger.info("pubRetry",e.id,t.retryDuration),await new Promise((e=>setTimeout(e,t.interval))),t.retryDuration+=t.interval,t.interval=t.interval>4e3?8e3:2*t.interval,e.resetStream(),this.emit(NM.PUB_RETRY,{screen:e.isScreen}),this._publish(e);this._logger.info("pubRetry","end"),this._pubBackOff.delete(e.id)}else if(403===L.code)throw new LS(RS.TOKEN_NO_PUBLISH_PERMISSION,L.message||"token no publish permission");throw L}var I,g;(this._roomConf.report("rtc_recv_answer",{error_code:0,answer_type:null===(n=Z)||void 0===n?void 0:n.relayMessage.type,sequence_id:(null===(a=Z)||void 0===a||null===(a=a.relayMessage)||void 0===a?void 0:a.sequenceId)||0,message:null===(d=Z)||void 0===d||null===(d=d.relayMessage)||void 0===d?void 0:d.sdp,direction:"up",stream_id:"",stream_user_id:"",pc_session_id:(null===(c=b)||void 0===c?void 0:c.peerConnectionId)||""}),e.isScreen)?e.setVideoCaps(null===(I=Z.relayMessage.content)||void 0===I?void 0:I.screenCaps):e.setVideoCaps(null===(g=Z.relayMessage.content)||void 0===g?void 0:g.videoCaps);Z.relayMessage.sdp=EG(Z.relayMessage.sdp),e.streamId=Z.streamId;const R=await e.getSelectedCodec();e.currentVideoCodec=R;const X=new Promise(((t,i)=>{var o,s,r,n,a;null===(o=b)||void 0===o||o.handleAck({action:Yx.publish,streamId:Z.streamId,audioMid:_,videoMid:y,audioTransceiverInit:null===(s=p)||void 0===s?void 0:s.audioTransceiverInit,videoTransceiverInit:null===(r=p)||void 0===r?void 0:r.videoTransceiverInit,signalingAck:{sdp:null===(n=Z)||void 0===n||null===(n=n.relayMessage)||void 0===n?void 0:n.sdp,sequenceId:null===(a=Z)||void 0===a||null===(a=a.relayMessage)||void 0===a?void 0:a.sequenceId},stream:e,videoCodec:R,onSuccess:()=>{this._logger.info("publish()","publish success"),t(0)},onFail:e=>{this._logger.info("publish()","publish fail"),i(e)}})}));!wv&&await X,this.emit("___afterHandleAckInPub"),(S&&this._ctx.videoProfile.getSimulcastMode()===Lm.VIDEO_ON_DEMAND||null!==(l=this._ctx.serverConfig)&&void 0!==l&&l.e2eFeedback)&&this.emit(Gg.RSCP,[{StreamIds:[e.stream.id],Metadata:{VideoIndex:0}}],!0),e.videoMid=y,e.audioMid=_,e.subVideoDescriptions=p.subVideoDescriptions,e.remoteSdp=Z.relayMessage.sdp,this._roomConf.report("rtc_publish_stat",{result:"success",is_screen:"0",start:h,message:"unknown"})}async updatePubTrack(e){this._logger.info("updatePubTrack()","localStream: %o",e);const{videoTrack:t,audioTrack:i,pubAudio:o,pubVideo:s}=e,r=e.vendorHandler||this._ctx.handler;let n=null==i?void 0:i.preprocessingTrack;const a=null==t?void 0:t.preprocessingTrack;var d,c;s&&a?(e.stopBlackFrame(),await(null===(d=e.videoTransceiver)||void 0===d?void 0:d.sender.replaceTrack(a)),this._updateVideoDescriptions(e)):await(null===(c=e.videoTransceiver)||void 0===c?void 0:c.sender.replaceTrack(null));if(o&&n){var l;const{mixType:t,mixedAudioTrack:o}=i;o&&t!==km.PLAYOUT&&n.enabled&&(n=o),await(null===(l=e.audioTransceiver)||void 0===l?void 0:l.sender.replaceTrack(n))}else{var u;await(null===(u=e.audioTransceiver)||void 0===u?void 0:u.sender.replaceTrack(null)),vv(this._ctx.id,"MediaClient.updatePubTrack(audio)","null")}await this._updatePublishCodec(e),this.emit("___onAfterReplaceTrack");try{vv(this._ctx.id,"MediaClient.updatePubTrack",JSON.stringify({audioStreamTrack:cp(n),videoStreamTrack:cp(a)}))}catch(oK){}const m={localaudio:!!i,localvideo:!!t,videostream:s,audiostream:o,extvideo:(null==t?void 0:t.sourceType)===Ng.EXTERNAL,extaudio:(null==i?void 0:i.sourceType)===Ng.EXTERNAL,videoType:t?xg.NORMAL:e.pubAttributes.videoType},h={};for(const[b,_]of Object.entries(m))_!==Reflect.get(e.pubAttributes,b)&&Reflect.set(h,b,_);if(!Object.keys(h).length)return;if(e.observer){const{observer:t}=e,{audiostream:i,videostream:o,localaudio:s,localvideo:r,extaudio:n,extvideo:a}=h;void 0!==r?void 0!==a?t.setPushVideo(a):t.setEnableVideo(r):void 0!==o&&t.setUnmuteVideo(o),void 0!==s?void 0!==n?t.setPushAudio(n):t.setEnableAudio(s):void 0!==i&&t.setUnmuteAudio(i)}e.pubAttributes=Ju(Ju({},e.pubAttributes),m),e.pubAttributes.videostream||e.stopBlackFrame();const p={roomId:this._roomConf.roomId,streamId:e.streamId,attributes:h};await this._ctx.signalingManager.sendSignaling("updateStreamAttributes",p),this.emit("___onAfterUpdateSignaling"),wv&&await(null==r?void 0:r.setCurrentDescription())}async _updatePublishCodec(e){this._logger.info("updatePublishCodec()","localStream: %o",e);const{audioMid:t,videoMid:i,remoteSdp:o,streamId:s,currentVideoCodec:r}=e,n=await e.getSelectedCodec();if(this._logger.info("updatePublishCodec()","selectedCodec: %o",n),n!==r){if(e.currentVideoCodec=n,t&&i&&s&&o){var a;if(this._ctx.handler instanceof Ox||this._ctx.handler instanceof Ux)await(null===(a=this._ctx.handler)||void 0===a?void 0:a._internalChangePubCodec());return new Promise(((r,a)=>{var d;null===(d=this._ctx.handler)||void 0===d||d.handleAck({action:Yx.publish,streamId:s,audioMid:t,videoMid:i,signalingAck:{sdp:o,sequenceId:-1},videoCodec:n,onSuccess:r,onFail:a,stream:e})}))}{const t=["audioMid","videoMid","streamId","remoteSdp"].filter((t=>!Reflect.get(e,t)));this._logger.warn("updatePublishCodec()","fast return, because params: %o",t)}}else this._logger.warn("updatePublishCodec()","selectedCodec is equal to currentVideoCodec")}async unpublish(e){this._logger.info("unpublish()","localStream: %o",e);const t={roomId:this._roomConf.roomId,initStreamId:e.initStreamId,streamId:e.streamId};this._ctx.signalingManager.sendSignaling("unpublish",t).catch((()=>{}));const i=e.vendorHandler||this._ctx.handler;e.stopBlackFrame(),await(null==i?void 0:i.handleAck({action:Yx.unpublish,audioMid:e.audioMid,videoMid:e.videoMid,stream:e,streamId:e.streamId}))}async updatePubBlackFrame(e){var t;const i=await e.getSelectedCodec(),o=e.genBlackFrame(i);o&&(null===(t=e.videoTransceiver)||void 0===t||null===(t=t.sender)||void 0===t||t.replaceTrack(o),e.pubAttributes.videoType=xg.BLACK,this._ctx.signalingManager.sendSignaling("updateStreamAttributes",{roomId:this._roomConf.roomId,streamId:e.streamId,attributes:{videoType:xg.BLACK}}),e.on("black-frame-ended",(()=>{var t;null===(t=e.videoTransceiver)||void 0===t||null===(t=t.sender)||void 0===t||t.replaceTrack(null),e.pubAttributes.videoType=xg.NORMAL,this._ctx.signalingManager.sendSignaling("updateStreamAttributes",{roomId:this._roomConf.roomId,streamId:e.streamId,attributes:{videoType:xg.NORMAL}})})))}async cleanStream(e){return this._logger.info("cleanStream()","localStream: %o",e),null==e?void 0:e.clean()}async destroyStream(e){return this._logger.info("destroyStream()","localStream: %o",e),null==e?void 0:e.destroy()}destroy(e){e.forEach((e=>{e&&(this.unpublish(e).catch((()=>{})),this.destroyStream(e).catch((()=>{})))})),this._pubBackOff.clear(),super.removeAllListeners()}async _updateVideoDescriptions(e){var t;const i=this._ctx.videoProfile.genVideoDescriptions(e),o=e.pubAttributes.videoDescriptions;if(o.length!==i.videoDescriptions.length)return;const s={};if(o.find(((e,t)=>{if(e.framerate!==i.videoDescriptions[t].framerate||e.maxkbps!==i.videoDescriptions[t].maxkbps||e.width!==i.videoDescriptions[t].width||e.height!==i.videoDescriptions[t].height)return s.videoDescriptions=i.videoDescriptions,!0})),null===(t=e.subVideoDescriptions)||void 0===t||t.find(((e,t)=>{if(e.framerate!==i.subVideoDescriptions[t].framerate||e.maxkbps!==i.subVideoDescriptions[t].maxkbps||e.width!==i.subVideoDescriptions[t].width||e.height!==i.subVideoDescriptions[t].height)return s.subVideoDescriptions=i.subVideoDescriptions,!0})),Object.keys(s).length>0){var r;this._ctx.signalingManager.sendSignaling("updateStreamAttributes",{roomId:this._roomConf.roomId,streamId:e.streamId,attributes:s});const t=null===(r=e.videoTransceiver)||void 0===r||null===(r=r.sender)||void 0===r?void 0:r.getParameters();var n;if(vv(this._ctx.id,"sender.getParameters",JSON.stringify(t),0,e.streamId),t&&Array.isArray(null==t?void 0:t.encodings))t.encodings=t.encodings.map(((e,o)=>((e.rid?e.rid:1===t.encodings.length?"0":void 0)===i.sendEncodings[o].rid&&(e.maxBitrate=i.sendEncodings[o].maxBitrate,e.maxFramerate=i.sendEncodings[o].maxFramerate,e.scaleResolutionDownBy=i.sendEncodings[o].scaleResolutionDownBy),e))),this._logger.info("sender.setParameters()",JSON.stringify(t.encodings)),vv(this._ctx.id,"sender.setParameters",JSON.stringify(t),0,e.streamId),null===(n=e.videoTransceiver)||void 0===n||n.sender.setParameters(t),vv(this._ctx.id,"Handler.updateScaleResolutionDownBy",JSON.stringify(t.encodings))}}async _getVendorPubSdpInfo(e){const t=new wG(this._ctx,"");e.vendorHandler=new dY(this._ctx,t),e.pcSessionId&&(e.vendorHandler.peerConnectionId=e.pcSessionId);const i=await e.vendorHandler.publish(e),o=e.vendorHandler;return o.on("ice_state",(e=>{this.emit(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,{state:{checking:om.CONNECTION_STATE_CONNECTING,connected:om.CONNECTION_STATE_CONNECTED,disconnected:om.CONNECTION_STATE_RECONNECTING}[e],userId:this._roomConf.userId})})),o.once("disconnect",(async()=>{var t;o.removeAllListeners(),"connected"===(null===(t=this._ctx.peerConnection)||void 0===t?void 0:t.getIceConnectionState())?(await this.unpublish(e),await this.publish(e),e.vendorHandler&&e.statsReport.setVar(e.vendorHandler)):this._logger.info("vendor ice failed",e.streamId)})),[o,i]}_getPubBackOff(e){return this._pubBackOff.has(e)||this._pubBackOff.set(e,{interval:1e3,retryDuration:0}),this._pubBackOff.get(e)}}uY([iY],mY.prototype,"hasPublished",1),uY([iY,XN,tY],mY.prototype,"publish",1),uY([iY,XN,tY],mY.prototype,"updatePubTrack",1),uY([iY,XN,tY],mY.prototype,"unpublish",1),uY([iY,tY],mY.prototype,"updatePubBlackFrame",1),uY([iY],mY.prototype,"cleanStream",1),uY([iY],mY.prototype,"destroyStream",1),uY([tY],mY.prototype,"_updateVideoDescriptions",1);var hY=Object.defineProperty,pY=Object.getOwnPropertyDescriptor,bY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?pY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&hY(t,i,r),r};class _Y extends Ig{constructor(e,t){super(),Hu(this,"_logger",void 0),Hu(this,"_subBackOff",new Map),Hu(this,"_subResolves",{}),Hu(this,"_ontrackCallbackMap",new Map),this._ctx=e,this._roomConf=t,this._logger=new xv("RoomSubscriber",2,e.id)}async hasSubscribed(e){return e.streamState===PM.SUB_ED}async subscribe(e,t,i){if(e.streamState!==PM.SUB_ED)return this._subscribe(e,t,i);this._logger.warn("subscribe()","remoteStream ".concat(e.streamId," has been subscribed, silently return"))}async _subscribe(e,t,i){var o,s,r,n,a,d,c,l,u,m,h,p,b,_;this._logger.info("subscribe()","mediaType: %o",t),eY("subscribe()",e,this._logger),e.streamState=PM.SUB_ING;let y=!1,v=!1;if(Qf(t)&&(v=!0),Bf(t)&&(y=!0),!y&&this._roomConf.isMultiChatMode())return void(e.streamState=PM.INIT);const S=Hf(),Z=e.subVideo,f=[];this._subResolves[e.streamId]||(this._subResolves[e.streamId]=[]),f.push(new Promise(((t,i)=>{this._subResolves[e.streamId].push(t);const o=setTimeout((()=>i(new LS(RS.TIME_OUT,"wait video timeout for userId: ".concat(e.userId)))),$M),s=i=>{"video"===i.mediaType&&(this._logger.info("remoteStream ".concat(e.userId," received video track")),e.off("ontrack",s),clearTimeout(o),t(0))};e.on("ontrack",s)}))),this._roomConf.isMultiChatMode()||f.push(new Promise(((t,i)=>{this._subResolves[e.streamId].push(t);const o=setTimeout((()=>i(new LS(RS.TIME_OUT,"wait audio timeout for userId: ".concat(e.userId)))),$M),s=i=>{"audio"===i.mediaType&&(this._logger.info("remoteStream ".concat(e.userId," received audio track")),e.off("ontrack",s),clearTimeout(o),t(0))};e.on("ontrack",s)})));const T=t=>{e.ontrack(t)};null===(o=this._ctx.handler)||void 0===o||o.on("ontrack",T),this._ontrackCallbackMap.set(e,T);let I,{handler:g}=this._ctx;null!==(s=this._ctx.serverConfig)&&void 0!==s&&s.forceUniHandler||!e.enableVendorMode?I=await this._ctx.handler.subscribe(e,{multiChatMode:this._roomConf.isMultiChatMode()}):[g,I]=await this._getVendorSubSdpInfo(e,T);const{audioMid:R,videoMid:X}=I;e.subVideo=y;const L={spatialLayer:(null==i?void 0:i.spatialLayer)||0,temporalLayer:0,spatialSubLayer:(null==i?void 0:i.spatialSubLayer)||-1},C={audio:!this._roomConf.isMultiChatMode(),video:!0,data:!0,screen:e.isScreen,browser:"chrome-stable",videoMid:X,audioMid:R,sdpInfo:{sdp:null===(r=I)||void 0===r?void 0:r.partialSdp,semantics:null===(n=I)||void 0===n?void 0:n.semantics,type:null===(a=I)||void 0===a?void 0:a.type},streamUserId:e.userId,streamId:e.streamId,config:{enableMediaType:{audio:!!this._roomConf.isMultiChatMode()||v,video:y},qualityLayer:L},extra:{enableSendRTT:!0},peerConnectionMode:null===(d=I)||void 0===d?void 0:d.peerConnectionMode,supportMultiVendor:!0};null!==(c=I)&&void 0!==c&&c.peerConnectionId&&(C.peerConnectionId=I.peerConnectionId);const W=WZ("SUBSCRIBE_CUSTOM_EXTRA_PARAMS");if(W)for(const[D,A]of Object.entries(W))C.extra[D]=A;const{subscribeFallbackOption:G,userPriority:V}=this._ctx;"number"==typeof G&&(C.config.fallbackOption=G),V.has(e.userId)&&(C.config.priority=V.get(e.userId)),null!==(l=I)&&void 0!==l&&l.allSsrc&&(C.extra.subscribeSSRC=I.allSsrc),this.emit("_test_before_ack_");const{signalingAck:E,audioTransceiverInit:P,videoTransceiverInit:k}=I;let x;E&&(e.videoMid=X,e.audioMid=R,await new Promise(((t,i)=>{var o;null===(o=g)||void 0===o||o.handleAck({action:Yx.subscribe,streamId:e.streamId,audioMid:R,videoMid:X,audioTransceiverInit:P,videoTransceiverInit:k,signalingAck:E,stream:e,onSuccess:()=>{this._logger.info("ssrc","success"),t(0)},onFail:e=>{this._logger.info("ssrc","fail",e),i(e)}})})));try{this.emit("_test_sub_body_",C);const e=this._ctx.signalingManager.sendSignaling("subscribe",C);this.emit("_test_during_signaling_",C),x=await e}catch(U){var N,M;if(null===(N=this._ctx.monitor)||void 0===N||N.report("rtc_error",{message:"[subscriber._subscribe] ".concat(uT(U)),error_code:-1}),e.streamState=PM.INIT,U instanceof Error&&this._roomConf.report("rtc_subscribe_stat",{result:"fail",start:S,message:U.message,stream_user_id:e.userId}),U.code>=500&&U.code<600){this.emit("_test_sub_5xx_");const o=this._getSubBackOff(e.streamId);var Y;if(o.retryDuration<6e4)return this._logger.info("subRetry",e.streamId,o.retryDuration),await new Promise((e=>setTimeout(e,o.interval))),o.retryDuration+=o.interval,o.interval=o.interval>4e3?8e3:2*o.interval,this.emit(NM.SUB_RETRY,{screen:e.isScreen,userId:e.userId}),await(null===(Y=g)||void 0===Y?void 0:Y.handleAck({action:Yx.unsubscribe,streamId:e.streamId,audioMid:R,videoMid:X,stream:e})),e.resetStream(),this._subscribe(e,t,i);this._logger.info("subRetry","end",e.streamId),this._subBackOff.delete(e.streamId)}e.subVideo=Z,await(null===(M=g)||void 0===M?void 0:M.rollback({msid:e.streamId,stream:e}));const o={roomId:this._roomConf.roomId,streamId:e.streamId,userId:e.userId};if(await this._ctx.signalingManager.sendSignaling("unsubscribe",o).catch((()=>{})),e.streamState=PM.INIT,403===U.code)throw new LS(RS.TOKEN_NO_SUBSCRIBE_PERMISSION,U.message||"token no subscribe permission");throw U}if(!x.relayMessage)throw this._roomConf.report("rtc_error",{error_code:-1009,message:"relayMessage is null"}),new LS(RS.UNEXPECTED_ERROR,"unable to subscribe");x.relayMessage.sdp=EG(x.relayMessage.sdp);const{audioMid:w,videoMid:K}=null!==(u=null===(m=x)||void 0===m?void 0:m.relayMessage)&&void 0!==u?u:{},H={[R]:w,[X]:K};this._logger.info("sub midmap",e.userId,H),e.videoMid=X,e.audioMid=R,e.subMediaType=t,e.streamState=PM.SUB_ED,e.subLayer=L,this._roomConf.report("rtc_recv_answer",{error_code:0,answer_type:null===(h=x)||void 0===h||null===(h=h.relayMessage)||void 0===h?void 0:h.type,sequence_id:(null===(p=x)||void 0===p||null===(p=p.relayMessage)||void 0===p?void 0:p.sequenceId)||0,message:null===(b=x)||void 0===b||null===(b=b.relayMessage)||void 0===b?void 0:b.sdp,direction:"down",stream_id:e.streamId,stream_user_id:e.userId,pc_session_id:(null===(_=g)||void 0===_?void 0:_.peerConnectionId)||""});try{var F;null!==(F=I)&&void 0!==F&&F.signalingAck||await new Promise(((t,i)=>{var o,s,r,n,a;null===(o=g)||void 0===o||o.handleAck({action:Yx.subscribe,streamId:e.streamId,audioMid:R,videoMid:X,audioTransceiverInit:null===(s=I)||void 0===s?void 0:s.audioTransceiverInit,videoTransceiverInit:null===(r=I)||void 0===r?void 0:r.videoTransceiverInit,signalingAck:{sdp:null===(n=x)||void 0===n||null===(n=n.relayMessage)||void 0===n?void 0:n.sdp,sequenceId:null===(a=x)||void 0===a||null===(a=a.relayMessage)||void 0===a?void 0:a.sequenceId},stream:e,onSuccess:()=>{this._logger.info("sub ack","success"),t(0)},onFail:e=>{this._logger.info("sub ack","fail",e),i(e)}})})),await Promise.all(f)}catch(U){var J,O;null===(J=this._ctx.monitor)||void 0===J||J.report("rtc_error",{message:"[subscriber._subscribe] ".concat(uT(U)),error_code:-1}),U instanceof Error&&this._roomConf.report("rtc_subscribe_stat",{result:"fail",start:S,message:U.message,stream_user_id:e.userId});const t={roomId:this._roomConf.roomId,streamId:e.streamId,userId:e.userId};throw await this._ctx.signalingManager.sendSignaling("unsubscribe",t).catch((()=>{})),await(null===(O=g)||void 0===O?void 0:O.handleAck({action:Yx.unsubscribe,streamId:e.streamId,audioMid:R,videoMid:X,stream:e})),e.streamState=PM.INIT,e.resetStream(),U}this._roomConf.isMultiChatMode()||(e.subAudio=v),this._roomConf.report("rtc_subscribe_stat",{result:"success",start:S,message:"unknown",stream_user_id:e.userId}),e.startReport((e=>this.emit("onRemoteStreamStats",e)),g)}async unsubscribe(e){return this._unsubscribe(e)}async _unsubscribe(e){var t,i;eY("unsubscribe()",e,this._logger);const o={roomId:this._roomConf.roomId,streamId:e.streamId,userId:e.userId},s=e.vendorHandler||this._ctx.handler;this._ctx.signalingManager.sendSignaling("unsubscribe",o).catch((()=>{})),e.streamState=PM.INIT,e.subVideo=!1,null===(t=e.observer)||void 0===t||t.setSubscribeVideo(!1),!this._roomConf.isMultiChatMode()&&(null===(i=e.observer)||void 0===i||i.setSubscribeAudio(!1));const r=await(null==s?void 0:s.handleAck({action:Yx.unsubscribe,streamId:e.streamId,audioMid:e.audioMid,videoMid:e.videoMid,stream:e}));this._subResolves[r]&&this._subResolves[r].forEach((e=>e(0))),this._logger.info("unsubscribe","clean unsub ".concat(e.userId)),e.clean(),e.subMediaType=US.NONE,this._removeOnTrackListener(e),e.statsReport.unsubscribe()}async unsubscribe4removeTrack(e,t,i){var o,s,r,n;if(eY("unsubscribe4removeTrack()",e,this._logger),this._logger.info("unsubscribe4removeTrack()","sequenceId: ",t.sequenceId,"trackType: ",i),t.sequenceId<e.sequenceId)return void this._logger.warn("unsubscribe4removeTrack()","sequenceId return");const a=i+1,d=!!(a&tm.AUDIO),c=!!(a&tm.VIDEO);await(null===(o=this._ctx.handler)||void 0===o?void 0:o.handleAck({action:Yx.removetrack,streamId:e.streamId,audioMid:e.audioMid,videoMid:e.videoMid,stream:e})),null===(s=e.observer)||void 0===s||s.setPushTrack(!1),null===(r=e.observer)||void 0===r||r.setUnmuteAudio(!d),e.subAudio=!d,null===(n=e.observer)||void 0===n||n.setUnmuteVideo(!c),e.subVideo=!c,e.subMediaType=e.subMediaType-(e.subMediaType&a),e.virtual&&(e.clean(),e.resetHasSubscribed(),e.statsReport.unsubscribe())}async handleStreamFailed(e){const t=e.subMediaType,i=e.subLayer;await this._unsubscribe(e),await this._subscribe(e,t,i)}async handleRemoveStream(e){eY("handleRemoveStream()",e,this._logger),e.subVideo=!1,e.streamState!==PM.INIT&&(await this._unsubscribe(e),await this._cleanStream(e),this._destroyStream(e))}_removeOnTrackListener(e){const t=this._ontrackCallbackMap.get(e);if(t){const i=e.vendorHandler||this._ctx.handler;null==i||i.off("ontrack",t),this._ontrackCallbackMap.delete(e)}}async _getVendorSubSdpInfo(e,t){const i=new wG(this._ctx,"");e.vendorHandler=new dY(this._ctx,i),e.pcSessionId&&(e.vendorHandler.peerConnectionId=e.pcSessionId);const o=e.vendorHandler;o.on("ontrack",t);const s=await e.vendorHandler.subscribe(e);return o.on("ice_state",(t=>{this.emit(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,{state:{checking:om.CONNECTION_STATE_CONNECTING,connected:om.CONNECTION_STATE_CONNECTED,disconnected:om.CONNECTION_STATE_RECONNECTING}[t],userId:e.userId})})),o.once("disconnect",(async()=>{var t;if(null==o||o.removeAllListeners(),"connected"!==(null===(t=this._ctx.peerConnection)||void 0===t?void 0:t.getIceConnectionState()))return void this._logger.info("vendor ice failed",e.streamId);const i=e.subMediaType;await this.unsubscribe(e),await this.subscribe(e,i),e.vendorHandler&&e.statsReport.setVar(e.vendorHandler),this.emit(NM.RESUBSCRIBE,{stream:e})})),[o,s]}async subscribe4pushTrack(e,t){var i,o,s;this._logger.info("subscribe4pushTrack()","streamInfo: %o",t),eY("subscribe4pushTrack()",e,this._logger),e.subAudio=!0;const r=await(null===(i=this._ctx.handler)||void 0===i?void 0:i.subscribe(e,{multiChatMode:this._roomConf.isMultiChatMode()}));if(!r)throw new LS(RS.ADD_TRANSCEIVER_FAILED,"add transceiver failed");const{audioMid:n}=r,{videoMid:a}=r,d=[];d.push(new Promise(((t,i)=>{const o=setTimeout((()=>i(new LS(RS.TIME_OUT,"wait audio timeout for userId: ".concat(e.userId)))),$M),s=i=>{"audio"===i.mediaType&&(this._logger.success("remoteStream ".concat(e.userId," received audio track")),e.off("ontrack",s),clearTimeout(o),t(0))};e.on("ontrack",s)})));const c=t=>{e.ontrack(t)};null===(o=this._ctx.handler)||void 0===o||o.on("ontrack",c),this._ontrackCallbackMap.set(e,c),await(null===(s=this._ctx.handler)||void 0===s?void 0:s.handleAck({action:Yx.pushtrack,streamId:e.streamId,audioMid:n,videoMid:a,stream:e,audioTransceiverInit:null==r?void 0:r.audioTransceiverInit,videoTransceiverInit:null==r?void 0:r.videoTransceiverInit,signalingAck:null==t?void 0:t.message})),await Promise.all(d),e.videoMid=a,e.audioMid=n,e.startReport((e=>this.emit("onRemoteStreamStats",e)),this._ctx.handler)}async updateUserAttributes(e){this._logger.info("updateUserAttributes()","attributes: %o",e),await this._ctx.signalingManager.sendSignaling("updateUserAttributes",{roomId:this._roomConf.roomId,sessionId:this._roomConf.sessionId,attributes:e})}async updateSubTrackLayer(e,t){if(this._logger.info("updateSubTrack()","subLayer: %o",t),e.subLayer.spatialLayer===t.spatialLayer&&e.subLayer.spatialSubLayer===t.spatialSubLayer)return void this._logger.warn("updateSubTrack()","subLayer no change");const i={roomId:this._roomConf.roomId,streamList:[e.streamId],streamId:e.streamId,streamUserId:e.userId,config:{qualityLayer:t}};return await this._ctx.signalingManager.sendSignaling("updateSubscribe",i),this.emit("___afterUpdateSubscribeSend"),e.subLayer=t,e}async updateSubPriority(e,t){if(this._logger.info("updateSubPriority()","priority: %o",t),e.priority===t)return this._logger.warn("updateSubPriority()","priority no change"),e;const i={roomId:this._roomConf.roomId,streamList:[e.streamId],streamId:e.streamId,streamUserId:e.userId,config:{priority:t}};return await this._ctx.signalingManager.sendSignaling("updateSubscribe",i),e.priority=t,e}async updateSubMediaType(e,t){var i;let o=!1,s=!1;Qf(t)&&(s=!0),Bf(t)&&(o=!0);const r={roomId:this._roomConf.roomId,streamList:[e.streamId],config:{enableMediaType:{video:o,audio:!!this._roomConf.isMultiChatMode()||s}}};var n;(await this._ctx.signalingManager.sendSignaling("updateSubscribe",r),this._roomConf.isMultiChatMode())||(null===(n=e.observer)||void 0===n||n.setUnmuteAudio(s),e.subAudio=s);return null===(i=e.observer)||void 0===i||i.setUnmuteVideo(o),e.subVideo=o,e.subMediaType=t,e}async cleanStream(e){return this._cleanStream(e)}async _cleanStream(e){this._logger.info("cleanStream()","stream: %o",e),null==e||e.clean()}destroyStream(e){return this._destroyStream(e)}_destroyStream(e){this._logger.info("destroyStream()","stream: %o",e),null==e||e.destroy()}destroy(e){var t;this._logger.info("destroy()","remoteStream: %o",e),e.forEach((e=>{this.unsubscribe(e).catch((()=>{})),this.destroyStream(e)})),this._subBackOff.clear(),this._ontrackCallbackMap.forEach(((e,t)=>{this._removeOnTrackListener(t),this._ontrackCallbackMap.delete(t)})),this._subResolves={},null===(t=this._ctx.handler)||void 0===t||t.removeAllListeners("ontrack"),super.removeAllListeners()}_getSubBackOff(e){return this._subBackOff.has(e)||this._subBackOff.set(e,{interval:1e3,retryDuration:0}),this._subBackOff.get(e)}}bY([iY],_Y.prototype,"hasSubscribed",1),bY([iY,XN,tY],_Y.prototype,"subscribe",1),bY([iY,XN,tY],_Y.prototype,"unsubscribe",1),bY([iY,XN,tY],_Y.prototype,"unsubscribe4removeTrack",1),bY([iY],_Y.prototype,"handleStreamFailed",1),bY([iY,tY],_Y.prototype,"handleRemoveStream",1),bY([iY,XN,tY],_Y.prototype,"subscribe4pushTrack",1),bY([iY,tY],_Y.prototype,"updateUserAttributes",1),bY([iY,tY],_Y.prototype,"updateSubTrackLayer",1),bY([iY,tY],_Y.prototype,"updateSubPriority",1),bY([iY],_Y.prototype,"updateSubMediaType",1),bY([iY],_Y.prototype,"cleanStream",1),bY([iY],_Y.prototype,"destroyStream",1);const yY={[ym.communication]:[0],[ym.chat]:[0],[ym.chatRoom]:[1,"IES_chatroom"],[ym.coHost]:[1,"IES_PK"],[ym.meeting]:[16],[ym.classRoom]:[0]};class vY extends Ig{constructor(e,t){super(),Hu(this,"_logger",void 0),Hu(this,"_authorization",void 0),Hu(this,"_joinRoom5xxTimer",void 0),Hu(this,"_joinTask",void 0),Hu(this,"_sdpInfo",void 0),this._ctx=e,this._roomConf=t,this._logger=new xv("RoomJoin",2,e.id),this._logger.info("constructor","invoke")}join(){let e,t,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._roomConf.report("rtc_join_room_phase",{message:"call_roomjoin_join_api"}),this._logger.info("join()"),this._roomConf.report("rtc_join_room_phase",{message:"create_join_promise"});const o=new Promise(((o,s)=>{this._roomConf.report("rtc_join_room_phase",{message:"set_joinRsolve_joinReject"}),e=o,t=s;try{this._callJoinRoom(i).catch((e=>{this._roomConf.report("rtc_join_room_phase",{message:"_callJoinRoom_promise_reject",error:JSON.stringify(e)});const t=Array.isArray(e)&&e.length>0?e[0]:e;this._joinRoomFailed(t.message)}))}catch(r){this._roomConf.report("rtc_join_room_phase",{message:"_callJoinRoom_throw_error",error:JSON.stringify(r)});const e=Array.isArray(r)&&r.length>0?r[0]:r;this._joinRoomFailed(e.message)}}));return this._joinTask&&i?this._joinTask.startTime=Hf():(this._roomConf.report("rtc_join_room_phase",{message:"reset_joinTask"}),this._joinTask={startTime:Hf(),success:e,fail:t},this._roomConf.joinPromise=o),this._reportJoinRoomStart(),this._roomConf.report("rtc_join_room_phase",{message:"return_joinPromise"}),o}async updateToken(e){if(this._logger.info("updateToken()","newToken: %o",e),!this._ctx.appId||!this._roomConf.userId||!this._roomConf.roomId)return;const t={roomId:this._roomConf.roomId,userId:this._roomConf.userId,appId:this._ctx.appId,token:"Bearer ".concat(e)};try{await this._ctx.signalingManager.sendSignaling("updateToken",t)}catch(i){throw new LS(RS.UPDATE_TOKEN_WITH_INVALID_TOKEN,"invoke updateToken with an invalid token")}}async leave(){this._logger.info("leave()"),this._stopJoinRoom5xxRetry(),this._joinRoomFailed("leave_room");const e={Authorization:this._authorization,roomId:this._roomConf.roomId,sessionId:this._roomConf.sessionId};if(await this._ready2join(),!this._ctx.signalingManager.isConnected())return Promise.reject(new LS(RS.NOT_CONNECTED_YET,"server not connected"));await this._ctx.signalingManager.sendSignaling("leaveRoom",e,this._roomConf.rtsOnlySignalHeader)}destroy(){this._logger.info("destroy()"),this._joinRoomFailed("leave_room"),this._authorization=void 0,this._stopJoinRoom5xxRetry(),this.removeAllListeners()}async _ready2join(){var e,t;(this._roomConf.report("rtc_join_room_phase",{message:"into_ready2join"}),await this._ctx.signalingManager.connect(),this._roomConf.report("rtc_join_room_phase",{message:"connect to signaling server"}),this._sdpInfo)||(this._sdpInfo=await(null===(t=this._ctx.handler)||void 0===t?void 0:t.getDefaultSdp()));if(this._roomConf.report("rtc_join_room_phase",{message:"get sdpInfo"}),!vY.supportedCodecs){const e=[];(await QS()).forEach((t=>{const i=function(e){const t=e.toLowerCase();return"h264"===t?jS.H264:"vp8"===t?jS.VP8:"bytevc1"===t||"h265"===t?jS.ByteVC1:null}(t);i&&e.push(i)})),vY.supportedCodecs=e}return RN.videoPayloadMap||(RN.videoPayloadMap=function(e){const t=Tf.parse(e);let i={};return t.media.forEach((e=>{"video"===e.type&&e.rtp.forEach((e=>{let{payload:t,codec:o}=e;const s=mT(o);null!==s&&(i[t]=s)}))})),i}(this._sdpInfo.sdp)),null!==(e=this._sdpInfo)&&void 0!==e&&e.sdp&&(this._sdpInfo.sdp=VG(this._sdpInfo.sdp)),this._roomConf.report("rtc_join_room_phase",{message:"get supportedCodecs"}),{sdpInfo:this._sdpInfo,supportedCodecs:vY.supportedCodecs}}async _callJoinRoom(e){try{var t,i,o,s,r,n,a,d,c,l;this._roomConf.report("rtc_join_room_phase",{message:"enter_callJoinRoom"}),this._logger.info("_callJoinRoom","invoke"),delete this._sdpInfo;const{appId:p,role:b,businessId:_,useCloudProxy:y,joinRoomParams:v,mediaParams:S}=this._ctx,{sdpInfo:Z,supportedCodecs:f}=await this._ready2join();this._roomConf.report("rtc_join_room_phase",{message:"finish_ready2join"});const T={Authorization:Jf.token2auth(p,this._roomConf.roomId,this._roomConf.userId,this._roomConf.token),sessionId:this._roomConf.sessionId,timestamp:Date.now(),controlMessage:this._roomConf.getLiveControlMessage(),userAttributes:{extra_info:this._roomConf.userInfo.extraInfo,role:b},sdpInfo:Z,params:{supportedCodecs:f,userAgent:window.navigator.userAgent,sdkVersion:XZ.VERSION,deviceId:TS.getDeviceId(),appId:p,roomId:this._roomConf.roomId,userId:this._roomConf.userId,businessId:_,enableCloudProxy:y,channelProfile:yY[this._roomConf.roomProfileType]?"".concat(yY[this._roomConf.roomProfileType][0]):"0",SDKCodecNegotiation:WZ("SDK_CODEC_NEGOTIATION"),sdkType:"rtc",joinRoomMode:this._roomConf.isRTSOnlyRoom()?2:1,deviceType:"web",rtsMode:this._ctx.rtsMode,mediaProcessingType:null!==(t=XZ.MEDIA_PROCESSING_TYPE)&&void 0!==t?t:0},options:{supportCheckTokenPrivilege:!0,supportTokenExpireCallBack:!0,enableSceneConfigV2:!0,enableUnBundleMode:!0,enableAudioMux:!0,enableBigRoomMode:!0,needNegotiateSDP:!0,supportMultiVendor:!0},accessParams:JSON.stringify({requireICEUfragV2:!0})};if("AREA_CODE_US_OPCO"===WZ("AREA_CODE")&&(T.params.mediaArea=JSON.stringify([{AreaList:["GEO:US_OPCO"],Attribute:"include"}])),this._roomConf.report("rtc_join_room_phase",{message:"get_request_body"}),v)for(const[e,t]of Object.entries(v))T.params[e]=t;S&&(T.mediaParams=S);WZ("SIGNAL_CROP_JOINROOM")&&null!==(i=T.sdpInfo)&&void 0!==i&&i.sdp&&(T.sdpInfo.sdp=(e=>{const t=Tf.parse(e);return t.media=t.media.map((e=>"audio"===e.type?WG(e,t):CG(e,["H264","VP8","ByteVC1"],t))),Tf.write(t)})(T.sdpInfo.sdp)),this._roomConf.report("rtc_join_room_phase",{message:"finish_request_body"}),Promise.resolve().then((()=>this.emit("onSendingJoinMessageHook"))),this._roomConf.report("rtc_join_room_phase",{message:"finish_onSendingJoinMessageHook"});const I=e?"reconnected":"joinRoom",g=await this._joinRoomWithRetry(I,T);this._roomConf.report("rtc_join_room_phase",{message:"got_joinRes"}),this._logger.success("join","send join message success");const{_abtest_vid:R}=g.config||{};let{engine_WEB:X}=g.config||{};var u,m,h;if(this._authorization=T.Authorization,TS.setEngineWebConfig(this._ctx.appId,this._roomConf.roomId,X),X=Object.assign({},WZ("ENGINE_WEB_CONFIG"),X),this._ctx.serverConfig={videoCodec:null===(o=X)||void 0===o?void 0:o.video_codec,audioRed:!(null===(s=X)||void 0===s||!s.pub_audio_red),muteReplaceUnsub:!(null===(r=g.config)||void 0===r||!r.mute_replace_unsub),simulcastOnDemand:!(!1===(null===(n=g.config)||void 0===n||null===(n=n.engine_VPM)||void 0===n||null===(n=n.ondemand)||void 0===n?void 0:n.enable)),forceUniHandler:1===(null===(a=g.config)||void 0===a||null===(a=a.vendor_param)||void 0===a?void 0:a.vendor_stream_sub_mode),e2eFeedback:null===(d=X)||void 0===d?void 0:d.e2e_feedback},WZ("SDK_CODEC_NEGOTIATION"))this._ctx.setTargetCodec(null===(u=g.config)||void 0===u?void 0:u.targetCodec),this._ctx.setTargetScreenCodec(null===(m=g.config)||void 0===m?void 0:m.targetScreenCodec);if("boolean"==typeof(null===(c=X)||void 0===c?void 0:c.av_sync)&&(this._ctx.avSync=X.av_sync),this._roomConf.rtcVid=R,g.vendorConfig&&this._roomConf.setVendorConfig(g.vendorConfig),WN.setAudioStallConfig(X),null!==(l=g.relayMessage)&&void 0!==l&&l.sdp)g.relayMessage.sdp=EG(g.relayMessage.sdp),null===(h=this._ctx.handler)||void 0===h||h.createAVMlineAnswerTpl(g.relayMessage.sdp);this.emit(NM.JOIN_SUCCESS,{joinRes:g,reconnect:e}),this._joinRoomSuccess(g)}catch(b){var p;null===(p=this._ctx.monitor)||void 0===p||p.report("rtc_error",{message:"[join._callJoinRoom] ".concat(uT(b)),error_code:-1}),this._roomConf.report("rtc_join_room_phase",{message:"_callJoinRoom_catch",error:JSON.stringify(b)});const e={461:RS.ROOM_FORBIDDEN,462:RS.USER_FORBIDDEN};(null==b?void 0:b.code)>=700&&(null==b?void 0:b.code)<800?this._joinRoomFailed("token_error",RS.INVALID_TOKEN):e[null==b?void 0:b.code]?this._joinRoomFailed((null==b?void 0:b.message)||e[null==b?void 0:b.code],e[null==b?void 0:b.code]):(null==b?void 0:b.code)===RS.TIME_OUT&&this._ctx.joinRoomConfig.useTcpAfterJoinTimeout?(this._logger.error("join",QG.JOIN_TIMEOUT),this.safeEmit(NM.ON_REJOIN_WITH_TCP),this._ctx.signalingManager.reconnect(QG.JOIN_TIMEOUT,!0)):b.code===RS.OPERATION_CANCEL&&this._ctx.signalingManager.isReconnecting()||this._joinRoomFailed((null==b?void 0:b.message)||"signaling_error")}}_joinRoomWithRetry(e,t,i){return new Promise(((o,s)=>{this._ctx.signalingManager.sendSignaling(e,t,this._roomConf.rtsOnlySignalHeader,1e4).then((e=>{this.emit("onJoinRoomAck",e),o(e)})).catch((r=>{if(i=i||new aG,r.code>=500&&r.code<600&&Hf()-i.initTs<6e4){const n=i.getRetryDelay();return this._logger.warn("_joinRoomWithRetry","joinRoom failed(code: ".concat(r.code,"), will retry after ").concat(n,"ms")),void(this._joinRoom5xxTimer=setTimeout((()=>{delete this._joinRoom5xxTimer,this._joinRoomWithRetry(e,t,i).then(o).catch(s)}),n))}s(r)}))}))}_stopJoinRoom5xxRetry(){this._joinRoom5xxTimer&&(clearTimeout(this._joinRoom5xxTimer),delete this._joinRoom5xxTimer)}_reportJoinRoomStart(){this._roomConf.report("rtc_join_room_phase",{message:"enter _reportJoinRoomStart"}),this._joinTask&&(this.emit("__joinRoomStartReport"),this._roomConf.report("join_room",{type:"begin",start:this._joinTask.startTime,result:!1,reason:""},{enable_cloud_proxy:this._ctx.useCloudProxy,expectedIDC:this._ctx.expectedIDC}))}_joinRoomSuccess(e){this._roomConf.report("rtc_join_room_phase",{message:"enter _joinRoomSuccess"}),this._joinTask&&(this._joinTask.success(e),this.emit("__joinRoomSuccessReport"),this._roomConf.report("join_room",{type:"end",start:this._joinTask.startTime,result:!0,reason:""},{enable_cloud_proxy:this._ctx.useCloudProxy,expectedIDC:this._ctx.expectedIDC}),this._roomConf.report("rtc_join_room",{error_code:0,deviceModel:"web",deviceManufacturer:"web",elapse:Hf()-this._joinTask.startTime}),delete this._joinTask,delete this._roomConf.joinPromise)}_joinRoomFailed(e,t){this._roomConf.report("rtc_join_room_phase",{message:"enter _joinRoomFailed"}),this._joinTask&&(this._joinTask.fail(new LS(t||RS.JOIN_ROOM_FAILED,e)),this.emit("__joinRoomFailedReport"),this._roomConf.report("join_room",{type:"end",start:this._joinTask.startTime,result:!1,reason:e},{enable_cloud_proxy:this._ctx.useCloudProxy,expectedIDC:this._ctx.expectedIDC}),delete this._joinTask,delete this._roomConf.joinPromise)}}Hu(vY,"supportedCodecs",void 0);var SY=Object.defineProperty,ZY=Object.getOwnPropertyDescriptor,fY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?ZY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&SY(t,i,r),r};class TY{constructor(e,t){Hu(this,"_logger",void 0),this._ctx=e,this._roomConf=t,this._logger=new xv("RoomMessage",2,e.id)}sendUserMessage(e,t){return this._ctx.signalingManager.sendP2PMessage({to:e,from:this._roomConf.userId,room:this._roomConf.roomId,app:this._ctx.appId,msg:t})}async sendRoomMessage(e,t){const i={clientId:this._roomConf.userId,binary:t,message:"",roomId:this._roomConf.roomId};return i.message=t?await Jf.ab2b64str(e):e,this._ctx.signalingManager.sendSignaling("customMessage",i,this._roomConf.rtsOnlySignalHeader)}async controlMessage(e){this._logger.info("controlMessage()","params: %o",e);const t=e;"transcode"===e.type&&(t.roomId=this._roomConf.roomId),await this._ctx.signalingManager.sendSignaling("controlMessage",t)}}fY([tY],TY.prototype,"sendUserMessage",1),fY([tY],TY.prototype,"sendRoomMessage",1),fY([tY],TY.prototype,"controlMessage",1);var IY=Object.defineProperty,gY=Object.getOwnPropertyDescriptor,RY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?gY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&IY(t,i,r),r};const XY={audiostream:!0,extaudio:!1,extvideo:!1,localaudio:!0,localvideo:!1,videoDescriptions:[],videostream:!1,publishTime:0};class LY extends Ig{constructor(e,t){super(),Hu(this,"_localStream",void 0),Hu(this,"_localScreenStream",void 0),Hu(this,"_remoteUsers",new Map),Hu(this,"_remoteStreams",new Map),Hu(this,"_remoteStreamStreamIdUserIdMap",{}),Hu(this,"_remoteUserMediaBanned",new Map),Hu(this,"_virtualStreams",[]),Hu(this,"_serverConfig",void 0),Hu(this,"_userDuplicateLoginTimerMap",new Map),Hu(this,"_networkQualityManager",void 0),Hu(this,"_videoSizeObserver",void 0),Hu(this,"_hasPublished",!1),Hu(this,"_subtitleTool",void 0),Hu(this,"_csrcUserIdMap",{}),Hu(this,"_publishOnDemandItem",void 0),Hu(this,"_onceTriggerBySignal",!1),Hu(this,"_pubTransceiverReady",!1),Hu(this,"_publishOnDemandBusy",!1),Hu(this,"logger",void 0),Hu(this,"_forwardStreamManager",void 0),Hu(this,"_publisher",void 0),Hu(this,"_subscriber",void 0),Hu(this,"_roomJoin",void 0),Hu(this,"_roomMessage",void 0),Hu(this,"_clearSignalListeners",void 0),this.config=e,this._ctx=t,this.logger=new xv("Room",1,t.id),this.logger.info("constructor","invoke"),this._publisher=new mY(t,e),this._addPublisherListeners(),this._subscriber=new _Y(t,e),this._addSubscriberListeners(),this._roomJoin=new vY(t,e),this._addJoinRoomHandler(),this._forwardStreamManager=new nY(t,e),this._addForwardStreamListeners(),this._roomMessage=new TY(t,e),this._networkQualityManager=new OM(t),this._networkQualityManager.reportor=this._reportNetworkQuality.bind(this),this._videoSizeObserver=new UM(this),this._videoSizeObserver.onchange=this._emitVideoSizeChange.bind(this),this._addSignalListeners()}get remoteUsers(){return this._remoteUsers}get remoteStreams(){return this._remoteStreams}get localStream(){return this._localStream}get localScreenStream(){return this._localScreenStream}get virtualStreams(){return this._virtualStreams}_addSignalListeners(){const e={[Wg.ON_ADD_STREAM]:this._onAddStream.bind(this),[Wg.ON_ADD_STREAM_LIST]:e=>{e&&Array.isArray(e.streamList)&&e.streamList.forEach((e=>this._onAddStream(e)))},[Wg.ON_REMOVE_STREAM]:this._onRemoveStream.bind(this),[Wg.ON_REMOVE_STREAM_LIST]:e=>{e&&Array.isArray(e.streamList)&&e.streamList.forEach((e=>this._onRemoveStream(e)))},[Wg.USER_CONNECTION]:this._onUserConnection.bind(this),[Wg.USER_CONNECTION_LIST]:e=>{e&&Array.isArray(e.userList)&&e.userList.forEach((e=>this._onUserConnection(e)))},[Wg.USER_DISCONNECTION]:this._onUserDisconnection.bind(this),[Wg.USER_DISCONNECTION_LIST]:e=>{e&&Array.isArray(e.userList)&&e.userList.forEach((e=>this._onUserDisconnection(e)))},[Wg.ON_UPDATE_ROOM_ATTRIBUTES]:this._onUpdateRoomAttributes.bind(this),[Wg.ON_UPDATE_USER_ATTRIBUTES]:this._onUpdateUserAttributes.bind(this),[Wg.ON_UPDATE_STREAM_ATTRIBUTES]:this._onUpdateStreamAttributes.bind(this),[Wg.ON_PUSH_TRACK]:this._onPushTrack.bind(this),[Wg.ON_REMOVE_TRACK]:this._onRemoveTrack.bind(this),[Wg.ON_CUSTOM_MESSAGE]:this._onCustomMessage.bind(this),[Wg.USER_MESSAGE_RECEIVED]:this._onUserMessageReceived.bind(this),[Wg.USER_BINARY_MESSAGE_RECEIVED]:this._onUserBinaryMessageReceived.bind(this),[Wg.POST_PROCESSING_MESSAGE]:this._onPostProcessingMessage.bind(this),[Wg.ON_USER_TOKEN_WILL_EXPIRE]:this._onUserTokenWillExpire.bind(this),[Wg.ON_TOKEN_PUBLISH_PRIVILEGE_WILL_EXPIRE]:this._onUserTokePublishPrivilegeWillExpire.bind(this),[Wg.ON_TOKEN_PUBLISH_PRIVILEGE_DID_EXPIRED]:this._onUserTokenPublishPrivilegeDidExpire.bind(this),[Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_WILL_EXPIRE]:this._onUserTokeSubscribePrivilegeWillExpire.bind(this),[Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_DID_EXPIRED]:this._onUserTokenSubscribePrivilegeDidExpire.bind(this),[Wg.STREAM_CONTROL_MESSAGE]:this._onStreamControlMessage.bind(this),[Wg.ENGINE_CONTROL_MESSAGE]:this._onEngineControlMessage.bind(this),[Wg.ON_STREAM_FAILED]:this._onStreamFailed.bind(this),[Gg.RTT]:this._onRTT.bind(this),[Gg.SSC]:this._onSSC.bind(this),[Vg.ON_CONNECTION_STATE_CHANGE]:this._onConnectionStateChange.bind(this),[Wg.ON_SPEAKER_CHANGE]:this._onMeetingSpeakerChange.bind(this),[Wg.ON_FORWARD_DST_ROOM_USER_KICK]:this._forwardStreamManager.onForwardDstRoomUserKick.bind(this._forwardStreamManager),[Gg.RSCP]:this._onRSCP.bind(this)};Object.keys(e).forEach((t=>{this._ctx.signalingManager.on(t,e[t])})),this._clearSignalListeners=()=>{Object.keys(e).forEach((t=>{this._ctx.signalingManager.off(t,e[t])}))}}_addPublisherListeners(){this._publisher.on(NM.PUB_RETRY,(e=>{this.emit(NM.PUB_RETRY,e)})),this._publisher.on(Gg.RSCP,this._onRSCP.bind(this)),this._publisher.on(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,(e=>this.emit(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,e)))}_addSubscriberListeners(){this._subscriber.on(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,(e=>this.emit(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,e))),this._subscriber.on("onRemoteStreamStats",(e=>{this._networkQualityManager.updateDownlinkStats(e,this._findRemoteStreamByScreen(e.userId,e.isScreen)),WZ("HIDDEN_STATS")||(e=qf(e)),this.emit(NM.ON_REMOTE_STREAM_STATS,e)})),this._subscriber.on(NM.RESUBSCRIBE,(e=>{this.emit(NM.RESUBSCRIBE,e)})),this._subscriber.on(NM.SUB_RETRY,(e=>{this.emit(NM.SUB_RETRY,e)}))}_addJoinRoomHandler(){this._roomJoin.on(NM.JOIN_SUCCESS,this._onJoinSucc.bind(this)),this._roomJoin.on(NM.ON_REJOIN_WITH_TCP,(()=>{this.emit(NM.ON_REJOIN_WITH_TCP)}))}_addForwardStreamListeners(){this._forwardStreamManager.on(NM.ON_FORWARD_STREAM_ERROR,(e=>{this.safeEmit(NM.ON_FORWARD_STREAM_ERROR,e)}))}_onLocalStreamStats(e){const t=e.isScreen?this._localScreenStream:this.localStream;this._networkQualityManager.updateUplinkStats(e,t),WZ("HIDDEN_STATS")||(e=qf(e)),this.emit(NM.ON_LOCAL_STREAM_STATS,e)}async join(){this.logger.info("join()"),this.config.startJoinTimestamp=Hf();try{var e;const t=await this._roomJoin.join();return this._ctx.callId=t.callId,null!==(e=t.roomAttributes)&&void 0!==e&&e.multiChatMode&&this._handleFFAudioTrack(),this._initSubtitleTool(),{users:t.clients,streams:t.streams}}catch(i){var t;if(null===(t=this._ctx.monitor)||void 0===t||t.report("rtc_error",{message:"[room.join] ".concat(uT(i)),error_code:-1}),i.code!==RS.OPERATION_CANCEL)throw i}}async hasScreenPublished(){return!!this._localScreenStream&&this._publisher.hasPublished(this._localScreenStream)}async hasPublished(){return!!this._localStream&&this._publisher.hasPublished(this._localStream)}async publishScreen(e,t,i,o){this.logger.info("publishScreen()"),this._localScreenStream||(this._localScreenStream=new kM(this._ctx,em.STREAM_INDEX_SCREEN),this._localScreenStream.on("stats-exception",(e=>{this.emit(NM.ON_LOCAL_STATS_EXCEPTION,Ju(Ju({},e),{},{isScreen:!0}))})),this.config.vendorConfig.enableMultiVendor&&(this._localScreenStream.pcSessionId=ap()),this._localScreenStream.isScreen=!0,this._localScreenStream.observer=new FM(this._ctx,this._localScreenStream));let s=!1,r=!1,n=!1,a=!1;!this._localScreenStream.videoTrack&&e?(e.sourceType===Ng.EXTERNAL&&(r=!0),s=!0):this._localScreenStream.videoTrack&&!e&&(s=!1),!this._localScreenStream.audioTrack&&t?(t.sourceType===Ng.EXTERNAL&&(a=!0),n=!0):this._localScreenStream.audioTrack&&!t&&(n=!1),this._localScreenStream.videoTrack=e,this._localScreenStream.audioTrack=t,i&&(Qf(i)&&(this._localScreenStream.pubAudio=o===YM.PUB),Bf(i)&&(this._localScreenStream.pubVideo=o===YM.PUB),this.logger.info("publishScreen mediaType","pubAudio: %o, pubVideo: %o",this._localScreenStream.pubAudio,this._localScreenStream.pubVideo));const d=await this._publisher.hasPublished(this._localScreenStream);if(!this._localScreenStream.pubAudio&&!this._localScreenStream.pubVideo)return d?this.unpublishScreen():void 0;if(d){var c,l,u,m;if(r)null===(c=this._localScreenStream.observer)||void 0===c||c.setPushVideo(s);else null===(l=this._localScreenStream.observer)||void 0===l||l.setEnableVideo(s);if(a)null===(u=this._localScreenStream.observer)||void 0===u||u.setPushAudio(n);else null===(m=this._localScreenStream.observer)||void 0===m||m.setEnableAudio(n);await this.updatePubScreenTrack()}else{var h;null===(h=this._localScreenStream.observer)||void 0===h||h.setPublish(!0),await this._publisher.publish(this._localScreenStream)}this._localScreenStream.pubAudio||this._localScreenStream.pubVideo?this._ctx.handler&&this._localScreenStream.startReport(this._onLocalStreamStats.bind(this),this._localScreenStream.vendorHandler||this._ctx.handler):this._localScreenStream.stopReport("unpublish screen")}async updatePubScreenTrack(){this.logger.info("updatePubScreenTrack","Invoke updatePubScreenTrack"),this._localScreenStream&&await this._publisher.updatePubTrack(this._localScreenStream)}async unpublishScreen(){var e,t;(this.logger.info("unpublish","Invoke unpublishScreen"),this._localScreenStream)&&(null===(e=this._localScreenStream.observer)||void 0===e||e.setPublish(!1),await this._publisher.unpublish(this._localScreenStream),null===(t=this._localScreenStream)||void 0===t||t.stopReport("unpublish screen"),await this._publisher.cleanStream(this._localScreenStream),this._localScreenStream=void 0)}async liveControlMessage(e){var t;this.logger.info("controlMessage","Invoke controlMessage"),null===(t=e.transcodeMeta)||void 0===t||t.layout.regions.forEach((e=>{e.roomID=this.config.roomId})),this.config.setLiveControlMessage("stopped"===e.action?void 0:e);try{await this._roomMessage.controlMessage(e)}catch(i){if("stopped"!==e.action)throw i}}async publicStreamControlMessage(e){"stopped"===e.action&&delete e.publicStreamMeta,await this._roomMessage.controlMessage(e)}getLocalStreamStats(){var e;return null===(e=this.localStream)||void 0===e?void 0:e.getLocalStreamStats()}async updateUserAttributes(){this.logger.info("updateUserAttributes","Invoke updateUserAttributes"),await this._subscriber.updateUserAttributes({role:this._ctx.role})}async publish(e,t,i,o){let s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.logger.info("publish","Invoke publish");let r=!1;this._localStream||(this._localStream=new kM(this._ctx),this._localStream.on("stats-exception",(e=>{this.emit(NM.ON_LOCAL_STATS_EXCEPTION,Ju(Ju({},e),{},{isScreen:!1}))})),this.config.vendorConfig.enableMultiVendor&&(this._localStream.pcSessionId=ap()),this._localStream.observer=new FM(this._ctx,this._localStream),r=!0,this._localStream.vendorCode=this.config.vendorConfig.vendorCode||0),this._localStream.videoTrack=e,this._localStream.audioTrack=t;const{pubAudio:n,pubVideo:a}=this._localStream;i&&(Qf(i)&&(this._localStream.pubAudio=o===YM.PUB),Bf(i)&&(this._localStream.pubVideo=o===YM.PUB),this.logger.info("publish mediaType","pubAudio: %o, pubVideo: %o",this._localStream.pubAudio,this._localStream.pubVideo));if(await this._publisher.hasPublished(this._localStream))try{this.emit("___onMediaServerClientPublish"),await this.updatePubTrack()}catch(y){throw this._localStream.pubAudio=n,this._localStream.pubVideo=a,y}else{if(!this._localStream.pubAudio&&!this._localStream.pubVideo)return;try{var d;if(s)null===(d=this._localStream.observer)||void 0===d||d.setLogin(!0);else if(r){var c,l;const e=!!this._localStream.videoTrack,t=!!this._localStream.audioTrack,i=(null===(c=this._localStream.videoTrack)||void 0===c?void 0:c.sourceType)===Ng.EXTERNAL,o=(null===(l=this._localStream.audioTrack)||void 0===l?void 0:l.sourceType)===Ng.EXTERNAL;if(this.config.isAutoPublish&&!this._hasPublished){var u,m,h,p;if(e)if(i)null===(u=this._localStream.observer)||void 0===u||u.setPushVideo(!0);else null===(m=this._localStream.observer)||void 0===m||m.setEnableVideo(!0);if(t)if(o)null===(h=this._localStream.observer)||void 0===h||h.setPushAudio(!0);else null===(p=this._localStream.observer)||void 0===p||p.setEnableAudio(!0)}else{var b;null===(b=this._localStream.observer)||void 0===b||b.setPublish(!0)}}this.emit("___onMediaServerClientPublish"),await this._publisher.publish(this._localStream),this._hasPublished=!0,this.emit(NM.ON_PUBLISH_RESULT,{isScreen:!1,state:Bu.PUBLISH_SUCC})}catch(y){var _;throw null===(_=this._ctx.monitor)||void 0===_||_.report("rtc_error",{message:"[room.publish] ".concat(uT(y)),error_code:-1}),this.emit(NM.ON_PUBLISH_RESULT,{isScreen:!1,state:Bu.PUBLISH_FAIL,errorCode:y.code}),delete this._localStream,y}}this._localStream.pubAudio||this._localStream.pubVideo?this._ctx.handler&&this._localStream.startReport(this._onLocalStreamStats.bind(this),this._localStream.vendorHandler||this._ctx.handler):this._localStream.stopReport("unpublish")}async updatePubTrack(){if(this.logger.info("updatePubTrack","Invoke updatePubTrack"),this._localStream)try{await this._publisher.updatePubTrack(this._localStream)}catch(t){var e;throw null===(e=this._ctx.monitor)||void 0===e||e.report("rtc_error",{message:"[room.updatePubTrack] ".concat(uT(t)),error_code:-1}),t}}async unpublish(){if(this.logger.info("unpublish","Invoke unpublish"),this._localStream)try{var e;await this._publisher.unpublish(this._localStream),null===(e=this._localStream)||void 0===e||e.stopReport("unpublish"),await this._publisher.cleanStream(this._localStream),this._localStream=void 0}catch(i){var t;throw null===(t=this._ctx.monitor)||void 0===t||t.report("rtc_error",{message:"[room.unpublish] ".concat(uT(i)),error_code:-1}),i}}async subscribe(e,t){this.logger.info("subscribe","remoteStream %o",e);if(await this._subscriber.hasSubscribed(e)){const i=e.subMediaType|t;return i!==e.subMediaType?await this._subscriber.updateSubMediaType(e,i):void 0}const i=this._ctx.videoProfile.getSubLayer(e,this.config.remoteVideoConfig);try{await this._subscriber.subscribe(e,t,i)}catch(s){var o;throw null===(o=this._ctx.monitor)||void 0===o||o.report("rtc_error",{message:"[room.subscribe] ".concat(uT(s)),error_code:-1}),s}}async updateSubVideoConfig(e){var t;const i=this._findRemoteStreamByScreen(e,!1);if(this.logger.info("updateSubVideoConfig","userId %s",e),!i)return;if(!(await this._subscriber.hasSubscribed(i))||(null===(t=i.attributes)||void 0===t||null===(t=t.videoDescriptions)||void 0===t?void 0:t.length)<=1)return;const o=this._ctx.videoProfile.getSubLayer(i);return o?(i.originalStreamIndex=o.spatialLayer,this._subscriber.updateSubTrackLayer(i,o)):void 0}async unsubscribe(e,t){this.logger.info("unsubscribe","Invoke unsubscribe");try{var i;if(!(await this._subscriber.hasSubscribed(e)))return;const o=e.subMediaType-(e.subMediaType&t);if((null===(i=this._ctx.serverConfig)||void 0===i||!i.muteReplaceUnsub)&&(o===US.NONE||this.config.isMultiChatMode()&&o===tm.AUDIO))return await this._subscriber.unsubscribe(e);await this._subscriber.updateSubMediaType(e,o)}catch(s){var o;throw null===(o=this._ctx.monitor)||void 0===o||o.report("rtc_error",{message:"[room.unsubscribe] ".concat(uT(s)),error_code:-1}),s}}async startSubtitle(e){if(!this._subtitleTool)throw new LS(RS.INVOKED_BEFORE_JOIN_ROOM,"join first");await this._subtitleTool.start(e)}async updateSubtitleConfig(e){if(!this._subtitleTool)throw new LS(RS.INVOKED_BEFORE_JOIN_ROOM,"join first");await this._subtitleTool.update(e)}async stopSubtitle(){var e;null===(e=this._subtitleTool)||void 0===e||e.stop()}async startForwardStream2Rooms(e){return this._forwardStreamManager.startForwardStream2Rooms(e)}async updateForwardStream2Rooms(e){return this._forwardStreamManager.updateForwardStream2Rooms(e)}async stopForwardStream2Rooms(){return this._forwardStreamManager.stopForwardStream2Rooms()}async pauseForwardStream2AllRooms(){return this._forwardStreamManager.pauseForwardStream2AllRooms()}async resumeForwardStream2AllRooms(){return this._forwardStreamManager.resumeForwardStream2AllRooms()}async updateMediaParams(e){return this._ctx.signalingManager.sendSignaling("updateMediaParams",{roomId:this.config.roomId,mediaParams:e})}async leave(){var e;let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.logger.info("leave","Invoke leave"),null===(e=this._subtitleTool)||void 0===e||e.destroy(),delete this._subtitleTool;try{for(const e of this._remoteStreams.values())Array.isArray(e)&&e.forEach((e=>{var t;null===(t=e.observer)||void 0===t||t.setLogin(!1)}));var i;if(this._localStream)null===(i=this._localStream.observer)||void 0===i||i.setLogin(!1);await this._roomJoin.leave().catch((()=>{})),this.destroy(),this.config.report("rtc_leave_room",{error_code:0,message:"",elapse:this.config.getStayRoomDuration()})}catch(s){var o;if(null===(o=this._ctx.monitor)||void 0===o||o.report("rtc_error",{message:"[room.leave] ".concat(uT(s)),error_code:-1}),s instanceof Error&&this.config.report("rtc_leave_room",{error_code:-1,message:s.message,elapse:this.config.getStayRoomDuration()}),t)throw s;this.destroy()}}updateRemoteUserPriority(e){var t;null===(t=this.remoteStreams.get(e))||void 0===t||t.forEach((t=>{const{userPriority:i}=this._ctx;t.hasSubscribed&&i.has(e)&&this._subscriber.updateSubPriority(t,i.get(e))}))}destroy(){var e,t,i;this.logger.info("destroy","Invoke destroy"),vv(this._ctx.id,"room_destroy","".concat((new Error).stack)),null===(e=this._subtitleTool)||void 0===e||e.destroy(),delete this._subtitleTool;const o=kp(t=Array.from(this._remoteStreams.values())).call(t);this._subscriber.destroy(o),this._subscriber.destroy(this._virtualStreams),this._publisher.destroy([this.localStream,this.localScreenStream]),this._roomJoin.destroy(),null===(i=this._clearSignalListeners)||void 0===i||i.call(this),this._remoteUsers=new Map,this._remoteStreams=new Map,this._localStream&&(this._localStream=void 0),this._localScreenStream&&(this._localScreenStream=void 0),this._userDuplicateLoginTimerMap.forEach((e=>{clearTimeout(e)})),this._userDuplicateLoginTimerMap.clear(),this._networkQualityManager.destroy(),this._videoSizeObserver.destroy(),this._csrcUserIdMap={},this._virtualStreams=[],this._remoteStreamStreamIdUserIdMap={},this._forwardStreamManager.destoy(),this._remoteUserMediaBanned.clear()}async updateToken(e){if(this.logger.info("updateToken","Invoke updateToken"),this.config.token=e,!this.config.isRTSOnlyRoom())try{await this._roomJoin.updateToken(e)}catch(t){throw this.safeEmit(NM.ON_ROOM_ERROR,{errorCode:RS.UPDATE_TOKEN_WITH_INVALID_TOKEN}),t}}sendUserMessage(e,t){return this._ctx.rtsLimiter.e2e.check(t),this._roomMessage.sendUserMessage(e,t)}sendRoomMessage(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this._ctx.rtsLimiter.boradcast.check(e),this._roomMessage.sendRoomMessage(e,t)}async maybeFillBackFrame2Stream(e){var t;e.refreshBlackFrameLifetime(),null!==(t=e.videoTransceiver)&&void 0!==t&&t.sender.track||this._publisher.updatePubBlackFrame(e)}_onJoinSucc(e){var t,i;let{joinRes:o,reconnect:s}=e;this.logger.info("_onJoinSucc()","invoke. ".concat(s?"[reconnect]":"")),this.emit(NM.JOIN_SUCCESS,s),this._serverConfig=o.config,this.config.updateRoomAttributes(o.roomAttributes);const r=[],n=[],a=[],d=[],c=[];this.config.isRTSOnlyRoom()&&Array.isArray(o.userInfos)&&(o.clientsDetail=o.userInfos.map((e=>({clientId:e.userId,clientJoinTime:e.userJoinTime})))),null===(t=o.clientsDetail)||void 0===t||t.forEach((e=>{if(this._checkClientBanned(e),e.clientId===o.clientId)return;const t=this._remoteUsers.get(e.clientId);t?t._stillExist=!0:r.push(e)}));for(const l of this._remoteUsers.values())l._stillExist||n.push({clientId:l.userId}),delete l._stillExist;null===(i=o.streams)||void 0===i||i.forEach((e=>{const t=this._findRemoteStreamByScreen(e.clientId,e.screen);this.config.updateUserPubInfo(e),t?(t.stillExist=!0,t.streamId=e.streamId,c.push(e)):d.push(e)}));for(const l of this._remoteStreams.values())Array.isArray(l)&&l.forEach((e=>{e.stillExist?delete e.stillExist:a.push({clientId:e.userId,streamId:e.streamId,message:Xg.clientDisconnected})}));n.forEach((e=>this._onUserDisconnection(e))),r.forEach((e=>this._onUserConnection(e))),a.forEach((e=>this._onRemoveStream(e))),d.forEach((e=>this._onAddStream(e,{fromSignal:!1}))),c.forEach((e=>this._onUpdateStreamAttributes(e))),this.config.resetUserPubInfo(),s&&this._handleSendOrRecvStreamAfterReconnect(),this.emit("__joinSuccess")}_handleSendOrRecvStreamAfterReconnect(){var e;this._localStream&&(this._publisher.cleanStream(this._localStream).then((()=>{var e;this._localStream&&(this._localStream.vendorCode=this.config.vendorConfig.vendorCode||0,null===(e=this._localStream.observer)||void 0===e||e.setLogin(!0))})),this._publisher.publish(this._localStream).then((()=>{var e;this._ctx.handler&&(null===(e=this._localStream)||void 0===e||e.startReport(this._onLocalStreamStats.bind(this),this._localStream.vendorHandler||this._ctx.handler)),this.emit(NM.ON_PUBLISH_RESULT,{isScreen:!1,state:Bu.PUBLISH_SUCC,retry:!0})})).catch((e=>{this.logger.error("failed repub error:".concat(e)),this.emit(NM.ON_PUBLISH_RESULT,{isScreen:!1,state:Bu.PUBLISH_FAIL,errorCode:e.code,retry:!0})}))),this._localScreenStream&&(this._publisher.cleanStream(this._localScreenStream).then((()=>{var e;this._localScreenStream&&(null===(e=this._localScreenStream.observer)||void 0===e||e.setLogin(!0))})),this._publisher.publish(this._localScreenStream).then((()=>{var e;this._ctx.handler&&(null===(e=this._localScreenStream)||void 0===e||e.startReport(this._onLocalStreamStats.bind(this),this._localScreenStream.vendorHandler||this._ctx.handler)),this.emit(NM.ON_PUBLISH_RESULT,{isScreen:!0,state:Bu.PUBLISH_SUCC,retry:!0})})).catch((e=>{this.logger.error("failed repub screen stream error:".concat(e)),this.emit(NM.ON_PUBLISH_RESULT,{isScreen:!0,state:Bu.PUBLISH_FAIL,errorCode:e.code,retry:!0})})));for(const t of this._remoteStreams.values())Array.isArray(t)&&t.forEach((async e=>{if(e.hasSubscribed){e.resetHasSubscribed();try{var t,i;this.logger.info("start resubscribe ".concat(e.userId," with ").concat(e.subMediaType)),Bf(e.subMediaType)&&(null===(t=e.observer)||void 0===t||t.setSubscribeVideo(!0)),Qf(e.subMediaType)&&(null===(i=e.observer)||void 0===i||i.setSubscribeAudio(!0)),await this._subscriber.subscribe(e,e.subMediaType),this.logger.info("success resubscribe ".concat(e.userId," with ").concat(e.subMediaType)),this.safeEmit(NM.RESUBSCRIBE,{stream:e}),this.emit(NM.ON_SUBSCRIBE_RESULT,{state:Qu.SUBSCRIBE_SUCC,userId:e.userId,isScreen:e.isScreen,retry:!0})}catch(oK){if(this.emit(NM.ON_SUBSCRIBE_RESULT,{state:Qu.SUBSCRIBE_FAIL,userId:e.userId,isScreen:e.isScreen,errorCode:oK.code,retry:!0}),this.logger.error("failed resubscribe ".concat(e.userId," with ").concat(e.subMediaType,", error:").concat(oK)),oK.code===RS.NOT_CONNECTED_YET)return void(e.streamState=PM.SUB_ED);await this._subscriber.cleanStream(e),e.resetHasSubscribed()}}}));null===(e=this._subtitleTool)||void 0===e||e.reconnect(),this._forwardStreamManager.resumeFromReconnect()}_handleFFAudioTrack(){var e,t;const i=null===(e=this._ctx.handler)||void 0===e?void 0:e.audioTrack4ff,o=null===(t=this._ctx.handler)||void 0===t?void 0:t.getTransceivers();if(i&&Array.isArray(o)){const e=o.find((e=>{var t;return(null==e||null===(t=e.receiver)||void 0===t?void 0:t.track)===i}));if(e){const t=new xM(this._ctx,"ff-stream","ff-stream",!1,!1,XY);t.virtual=!0,t.audioTransceiver=e,t.audioMid="0",t.audioTrack=fM(this._ctx,i,{streamIndex:Yg.VIRTUAL}),this._virtualStreams.push(t),this.safeEmit(NM.SUBSCRIBE_PUSH_TRACK,{stream:t})}}}_findRemoteStream(e,t){const i=this._remoteStreams.get(e);return Array.isArray(i)?i.find((e=>e.streamId===t)):null}_findRemoteStreamByScreen(e,t){const i=this._remoteStreams.get(e);return Array.isArray(i)?i.find((e=>e.isScreen===t)):null}_onAddStream(e){let{needEmit:t=!0,fromSignal:i=!0,virtual:o=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e.clientId===this.config.userId)return;const{isAutoSubscribeAudio:s,isAutoSubscribeVideo:r}=this.config,n=this._findRemoteStreamByScreen(e.clientId,e.screen);if(n&&n.streamId!==e.streamId){var a;const t=null===(a=this._remoteStreams.get(e.clientId))||void 0===a?void 0:a.filter((e=>e.streamId!==n.streamId));this._subscriber.cleanStream(n),this._remoteStreams.set(e.clientId,t||[])}let d=this._findRemoteStream(e.clientId,e.streamId);if(this._remoteStreamStreamIdUserIdMap[e.streamId]=e.clientId,d)d.attributes=e.attributes;else if(d=new xM(this._ctx,e.clientId,e.streamId,e.screen,!1,e.attributes),d.virtual=o,this._initStreamListeners(d),!o){const t=this._remoteStreams.get(e.clientId);t?t.push(d):this._remoteStreams.set(e.clientId,[d])}if(d.remoteSessionId=e.remoteSessionId||"",d.observer=new HM(this._ctx,d),!d.isScreen&&r&&!this._getRemoteUserMediaBanned(e.clientId,tm.VIDEO)&&(i&&d.hasVideo&&(d.attributes.extvideo?(d.observer.setExternalVideoSource(!0),d.observer.setPushVideo(!0)):(d.observer.setExternalVideoSource(!1),d.observer.setPublishVideo(!0))),i&&d.hasAudio&&s&&!this.config.isMultiChatMode()&&!this._getRemoteUserMediaBanned(e.clientId,tm.AUDIO)&&(d.attributes.extaudio?(d.observer.setExternalAudioSource(!0),d.observer.setPushAudio(!0)):(d.observer.setExternalAudioSource(!1),d.observer.setPublishAudio(!0))),t&&!i)){const{isAutoSubscribeAudio:e,isAutoSubscribeVideo:t}=this.config;d.observer.setLogin(!0,{audio:!!e&&!this.config.isMultiChatMode(),video:!!t})}return t&&this.safeEmit(Wg.ON_ADD_STREAM,{stream:d}),d}_onUserConnection(e){var t;if(e.clientId===this.config.userId)return;const i=this._userDuplicateLoginTimerMap.get(e.clientId);if("number"==typeof i)return this._userDuplicateLoginTimerMap.delete(e.clientId),void self.clearTimeout(i);const o={userId:e.clientId,extraInfo:null===(t=e.attributes)||void 0===t?void 0:t.extra_info};this._remoteUsers.set(e.clientId,Ju({},o)),this.safeEmit(Wg.USER_CONNECTION,{userInfo:o,publishState:this.config.getUserPubInfo(o.userId)}),this._checkClientBanned(e)}_onUserDisconnection(e){let{clientId:t,tag:i,code:o,forbiddenTime:s}=e;if(t)if(t===this.config.userInfo.userId){let e=null;i===Eg.kickedByAdmin?e=RS.KICKED_OUT:i===Eg.onUserTokenDidExpire?e=RS.TOKEN_EXPIRED:i===Eg.userDuplicateLogin&&(e=RS.DUPLICATE_LOGIN),o===Pg.roomDismissByAdmin&&(e=RS.ROOM_DISMISS),e&&this.safeEmit(NM.ON_ROOM_ERROR,{errorCode:e,forbiddenTime:s})}else{let e=Du.DROPPED;i===Eg.userLeave?e=Du.QUIT:i===Eg.kickedByAdmin?e=Du.KICKED_BY_ADMIN:i===Eg.roleChanged&&(e=Du.SWITCH_TO_INVISIBLE);const o=()=>{var o;this._remoteUsers.delete(t);const s=[];null===(o=this._remoteStreams.get(t))||void 0===o||o.forEach((e=>{s.push(this._onRemoveStream({clientId:e.userId,streamId:e.streamId,message:Xg.clientDisconnected}))})),this._remoteStreams.delete(t),Promise.all(s).finally((()=>{this.safeEmit(NM.ON_USER_LEAVE,{userInfo:{userId:t},reason:e,tag:i})}))};if(i===Eg.userDuplicateLogin){const e=this._userDuplicateLoginTimerMap.get(t);e&&self.clearTimeout(e);const i=self.setTimeout(o,5e3);this._userDuplicateLoginTimerMap.set(t,i)}else o()}}async _onRemoveStream(e){if(e.clientId===this.config.userId)return;const t=this._remoteStreams.get(e.clientId);if(!t)return;const i=t.find((t=>t.streamId===e.streamId));if(!i)return;var o,s;i.hasVideo&&(null===(o=i.observer)||void 0===o||o.setPublishVideo(!1));i.hasAudio&&!this.config.isMultiChatMode()&&(null===(s=i.observer)||void 0===s||s.setPublishAudio(!1));const r=t.filter((t=>t.streamId!==e.streamId));this._remoteStreams.set(e.clientId,r);const n={isScreen:i.isScreen,userId:i.userId,streamId:i.streamId,attributes:{audiostream:i.attributes.audiostream,videostream:i.attributes.videostream}};try{await this._subscriber.handleRemoveStream(i)}catch(a){console.error(a)}this.safeEmit(Wg.ON_REMOVE_STREAM,{stream:n,reason:e.message})}_onUpdateUserAttributes(e){this._checkClientBanned(e)}_onUpdateRoomAttributes(e){var t;e.roomAttributes&&(this.config.updateRoomAttributes(e.roomAttributes),this._ctx&&(this._ctx.callId=e.roomAttributes.callId)),null!==(t=e.roomAttributes)&&void 0!==t&&t.multiChatMode&&this._handleFFAudioTrack()}_onUpdateStreamAttributes(e){const{isAutoSubscribeAudio:t,isAutoSubscribeVideo:i}=this.config,{clientId:o,streamId:s,attributes:r}=e,n=this._findRemoteStream(o,s);if(!n)return;const a=n.attributes,d=Ju(Ju({},a),r);let c=!1;const l=d.localaudio!==a.localaudio;let u=!1,m=!1;const h=d.localvideo!==a.localvideo;let p=!1,b=US.NONE,_=US.NONE;if(d.audiostream!==a.audiostream&&(c=d.localaudio,u=!!d.audiostream,d.audiostream?b|=tm.AUDIO:_|=tm.AUDIO),d.videostream!==a.videostream&&(m=d.localvideo,p=!!d.videostream,d.videostream?b|=tm.VIDEO:_|=tm.VIDEO),b&&this.safeEmit(NM.ON_USER_PUBLISH_STATE_CHANGE,{userId:o,mediaType:b,isScreen:n.isScreen,pubState:YM.PUB,remoteStream:n}),_&&this.safeEmit(NM.ON_USER_PUBLISH_STATE_CHANGE,{userId:o,mediaType:_,isScreen:n.isScreen,pubState:YM.UNPUB,remoteStream:n}),n.remoteSessionId=e.remoteSessionId||"",n.attributes=d,d.localaudio!==a.localaudio)if(d.localaudio){var y,v,S,Z;if((t||n.subAudio)&&d.audiostream)if(d.extaudio)null===(y=n.observer)||void 0===y||y.setExternalAudioSource(!0),null===(v=n.observer)||void 0===v||v.setPushAudio(!0);else null===(S=n.observer)||void 0===S||S.setExternalAudioSource(!1),null===(Z=n.observer)||void 0===Z||Z.setEnableAudio(!0);this.safeEmit(NM.ON_USER_START_AUDIO_CAPTURE,{userId:o},n)}else{var f,T,I,g;if(d.extaudio)null===(f=n.observer)||void 0===f||f.setExternalAudioSource(!0),null===(T=n.observer)||void 0===T||T.setPushAudio(!1);else null===(I=n.observer)||void 0===I||I.setExternalAudioSource(!1),null===(g=n.observer)||void 0===g||g.setEnableAudio(!1);!n.isScreen&&this.safeEmit(NM.ON_USER_STOP_AUDIO_CAPTURE,{userId:o})}if(d.localvideo!==a.localvideo)if(d.localvideo){var R,X,L,C;if((i||n.subVideo)&&d.videostream)if(d.extvideo)null===(R=n.observer)||void 0===R||R.setExternalVideoSource(!0),null===(X=n.observer)||void 0===X||X.setPushVideo(!0);else null===(L=n.observer)||void 0===L||L.setExternalVideoSource(!1),null===(C=n.observer)||void 0===C||C.setEnableVideo(!0);this.safeEmit(NM.ON_USER_START_VIDEO_CAPTURE,{userId:o})}else{var W,G,V,E;if(d.extvideo)null===(W=n.observer)||void 0===W||W.setExternalVideoSource(!0),null===(G=n.observer)||void 0===G||G.setPushVideo(!1);else null===(V=n.observer)||void 0===V||V.setExternalVideoSource(!1),null===(E=n.observer)||void 0===E||E.setEnableVideo(!1);!n.isScreen&&this.safeEmit(NM.ON_USER_STOP_VIDEO_CAPTURE,{userId:o})}var P,k;c&&!l&&t&&(null===(P=n.observer)||void 0===P||P.setRemoteUnmuteAudio(u));m&&!h&&i&&(null===(k=n.observer)||void 0===k||k.setRemoteUnmuteVideo(p));"number"==typeof d.videoType&&d.videoType!==a.videoType&&this.safeEmit(NM.VIDEO_TYPE_CHANGE,{userId:n.userId,isScreen:n.isScreen,type:d.videoType===xg.BLACK?gg.BLACK:gg.NORMAL})}_onPushTrack(e){var t;if(null===(t=e.streamId)||void 0===t||!t.startsWith("audio_mux"))return void this.config.report("rtc_error",{message:"onPushTrack, userId: ".concat(e.clientId,", ").concat(e.streamId),error_code:rG.TRACK_ERROR});const i=this._onAddStream(Ju(Ju({},e),{},{attributes:XY}),{needEmit:!1,fromSignal:!1,virtual:!0});i&&this._subscriber.subscribe4pushTrack(i,e).then((()=>{this.safeEmit(NM.SUBSCRIBE_PUSH_TRACK,{stream:i}),this._virtualStreams.push(i)})).catch((e=>{this.logger.error("subscribe","push track failed %o",e)}))}_onRemoveTrack(e){let{clientId:t,streamId:i,message:o,trackType:s}=e;this.logger.info("_onRemoveTrack","remove track: %o",t);const r=this._findRemoteStream(t,i);r&&(r.removeTrack=!0,this._subscriber.unsubscribe4removeTrack(r,o,s),this.emit(NM.REMOVE_PUSH_TRACK,{stream:r,mediaType:s+1}))}_onMeetingSpeakerChange(e){if(Array.isArray(null==e?void 0:e.speakerCsrcInfo)){const t={};null==e||e.speakerCsrcInfo.forEach((e=>{let{csrc:i,userId:o,isScreen:s}=e;s||(t[i]=o)})),this._csrcUserIdMap=t}Array.isArray(e.muxStreamInUse)&&this._virtualStreams.forEach((t=>{var i;null!==(i=e.muxStreamInUse)&&void 0!==i&&i.includes(t.streamId)?t.virtualOccupy=!0:t.virtualOccupy=!1}))}getActiveSpeakerInMultiChatMode(){const e=[];return this._virtualStreams.forEach((t=>{var i;const o=null===(i=t.audioTransceiver)||void 0===i?void 0:i.receiver;if(o){const[t]=o.getContributingSources()||[];if(t){const{audioLevel:i,source:o}=t;this._csrcUserIdMap[o]&&e.push({userId:this._csrcUserIdMap[o],audioLevel:i})}}})),e.length&&vg(e).call(e,((e,t)=>e.audioLevel-t.audioLevel)),e}_onReconnecting(){var e,t;for(const i of this._remoteStreams.values())Array.isArray(i)&&i.forEach((e=>{var t;null===(t=e.observer)||void 0===t||t.setDisconnect(),this._subscriber.cleanStream(e)}));this._virtualStreams.forEach((e=>{var t;this.emit(NM.REMOVE_PUSH_TRACK,{stream:e,mediaType:tm.AUDIO}),null===(t=e.observer)||void 0===t||t.setDisconnect(),this._subscriber.cleanStream(e)})),this._virtualStreams=[],null===(e=this.localStream)||void 0===e||null===(e=e.observer)||void 0===e||e.setDisconnect(),this._publisher.cleanStream(this.localStream),null===(t=this.localScreenStream)||void 0===t||null===(t=t.observer)||void 0===t||t.setDisconnect(),this._publisher.cleanStream(this.localScreenStream)}_onConnectionStateChange(e){e.state===om.CONNECTION_STATE_RECONNECTING?this._onReconnecting():e.state===om.CONNECTION_STATE_RECONNECTED&&this._roomJoin.join(!0)}_initStreamListeners(e){e.on("ontrack",(e=>{e.track})),e.on("onSEIMessage",(t=>{this.emit(NM.ON_SEI_MESSAGED_RECEIVED,{sei:t,remoteStreamKey:{userId:e.userId,roomId:this.config.roomId,streamIndex:e.isScreen?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN}})})),e.on("stats-exception",(t=>{this.emit(NM.ON_REMOTE_STATS_EXCEPTION,Ju(Ju({},t),{},{userId:e.userId,isScreen:e.isScreen}))})),e.on("onJitterStabled",(t=>{this.emit(NM.ON_JITTER_STABLED,{descriptor:{userId:e.userId,streamIndex:e.isScreen?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN},target:t})}))}_onCustomMessage(e){var t;null!==(t=this._subtitleTool)&&void 0!==t&&t.onMessageRecv(e)||this.safeEmit(Wg.ON_CUSTOM_MESSAGE,e)}_onUserMessageReceived(e){this.safeEmit(Wg.USER_MESSAGE_RECEIVED,{userId:e.from,message:e.msg})}_onUserBinaryMessageReceived(e){var t;const i={userId:e.from,message:e.msg};null!==(t=this._subtitleTool)&&void 0!==t&&t.onMessageRecv(i)||this.safeEmit(Wg.USER_BINARY_MESSAGE_RECEIVED,i)}_initSubtitleTool(){this._subtitleTool=new jM(this._ctx,this.config),this._subtitleTool.onEvent=e=>{this.emit(NM.ON_SUBTITLE_STATE_CHANGED,e)},this._subtitleTool.onMessage=e=>{this.emit(NM.ON_SUBTITLE_MESSAGE_RECEIVED,e)}}_onPostProcessingMessage(e){if(!e.body)return;var t;if("subtitleCallback"===e.type)return void(null===(t=this._subtitleTool)||void 0===t||t.onResult(e));const i=e.body,o=i.error||0;let s=MM.START;const r=["success","parameter error","subscription timeout","ffmpeg error","cdn error","publish error"];if("2.0"===i.protocol){switch(i.eventType){case"TranscodeStarted":0!==i.error&&(s=MM.START_FAILED);break;case"TranscodeStateChanged":s=0!==i.error?MM.START_FAILED:MM.START_SUCCESS;break;case"TranscodeStopped":s=0!==i.error?MM.STOP_FAILED:MM.STOP_SUCCESS;break;case"TranscodeUpdated":s=0!==i.error?MM.UPDATE_FAILED:MM.UPDATE_SUCCESS}this.safeEmit(Wg.POST_PROCESSING_MESSAGE,{code:o,protocol:i.protocol,error:i.error,eventType:s,message:r[o]})}this.safeEmit(Wg.POST_PROCESSING_MESSAGE,{code:o,message:r[o],type:e.type})}_onUserTokenWillExpire(){this.safeEmit(Wg.ON_USER_TOKEN_WILL_EXPIRE,null)}_onUserTokePublishPrivilegeWillExpire(){this.safeEmit(Wg.ON_TOKEN_PUBLISH_PRIVILEGE_WILL_EXPIRE,null)}_onUserTokenPublishPrivilegeDidExpire(){this.safeEmit(Wg.ON_TOKEN_PUBLISH_PRIVILEGE_DID_EXPIRED,null)}_onUserTokeSubscribePrivilegeWillExpire(){this.safeEmit(Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_WILL_EXPIRE,null)}_onUserTokenSubscribePrivilegeDidExpire(){this.safeEmit(Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_DID_EXPIRED,null)}async _onStreamFailed(e){if("publish"===e.type){var t,i;let o;if((null===(t=this.localStream)||void 0===t?void 0:t.streamId)===e.streamId?o=this.localStream:(null===(i=this.localScreenStream)||void 0===i?void 0:i.streamId)===e.streamId&&(o=this.localScreenStream),!o)return;await this._publisher.unpublish(o).catch((()=>{})),await this._publisher.cleanStream(o),await this._publisher.publish(o).catch((()=>{}))}else if("subscribe"===e.type){const t=this._remoteStreamStreamIdUserIdMap[e.streamId],i=this._findRemoteStream(t,e.streamId);i&&(await this._subscriber.handleStreamFailed(i),this.safeEmit(NM.RESUBSCRIBE,{stream:i}))}}_onStreamControlMessage(e){var t,i;e.type===Lg.PushLimitWarn&&(null!==(t=this._localStream)&&void 0!==t&&t.pubAudio||null!==(i=this._localStream)&&void 0!==i&&i.pubVideo||this.unpublish())}async _onPublishOnDemand(){var e,t,i;if(this._publishOnDemandItem&&!this._publishOnDemandBusy&&!1!==(null===(e=this._serverConfig)||void 0===e||null===(e=e.engine_VPM)||void 0===e||null===(e=e.ondemand)||void 0===e?void 0:e.enable)){if(null!==(t=this._localStream)&&void 0!==t&&t.videoTransceiver){this._publishOnDemandBusy=!0;const e=this._publishOnDemandItem;this._publishOnDemandItem=void 0;const t=[],i=this._localStream.stream.id,{sender:o}=this._localStream.videoTransceiver,s=o.getParameters();if(vv(this._ctx.id,"sender.getParameters",JSON.stringify(s),0,i),Array.isArray(s.encodings)&&Array.isArray(e)){const o={};this.logger.info("_onPublishOnDemand exec","usedDescriptions: %o",e),e.forEach((e=>{var t;if(null!==(t=e.StreamIds)&&void 0!==t&&t.includes(i)){var s,r,n;const t=null!==(s=null===(r=e.Metadata)||void 0===r?void 0:r.VideoIndex)&&void 0!==s?s:0;let i=0;var a,d;if(null!==(n=this._ctx.serverConfig)&&void 0!==n&&n.e2eFeedback)i=Math.max(...Object.keys(null!==(a=null===(d=e.Metadata)||void 0===d?void 0:d.VideoKbpsHist)&&void 0!==a?a:{}).map((e=>Number(e))),0);o[t]={kbps:i}}}));const r=[...this._localStream.pubAttributes.videoDescriptions];s.encodings=s.encodings.map((e=>{if(e.rid){if(o[e.rid]){var i;e.active=!0;const t=null===(i=o[e.rid])||void 0===i?void 0:i.kbps;t&&(e.maxBitrate=1e3*cN(e.rid,t,r))}else e.active=!1;const s=Number(e.rid);t[s]=e.active}else{var s;const t=null===(s=o[0])||void 0===s?void 0:s.kbps;t&&(e.maxBitrate=1e3*cN(void 0,t,r))}return e})),this.config.report("rtc_invoke_status",{sdk_api_name:"onPublishOnDemand",message:JSON.stringify(s.encodings),error_code:0,stream_id:i,elapse:0}),this._ctx.videoProfile.activeSimStreams=t}this.logger.info("sender.setParameters()",JSON.stringify(s.encodings)),vv(this._ctx.id,"sender.setParameters",JSON.stringify(s),0,i),await o.setParameters(s),this._publishOnDemandBusy=!1}else if(null===(i=this._localStream)||void 0===i||!i.videoTransceiver)return;this._onPublishOnDemand()}}_onRTT(e){const{StreamIds:t,Metadata:i}=e;if(null!=t&&t.length&&i){const e=t[0];this._ctx.streamRTT[e]={audio:i.audio_rtt,video:i.video_rtt}}}_onRSCP(e,t){!!e.find((e=>{var t,i;return null==e||null===(t=e.StreamIds)||void 0===t?void 0:t.includes(null===(i=this._localStream)||void 0===i||null===(i=i.stream)||void 0===i?void 0:i.id)}))&&(t?this._pubTransceiverReady=!0:this._onceTriggerBySignal=!0,t&&this._onceTriggerBySignal||(this._publishOnDemandItem=e),this._pubTransceiverReady&&this._onPublishOnDemand())}_onSSC(e){const{StreamIds:t,Metadata:i}=e,o=t[0],s=this._remoteStreamStreamIdUserIdMap[o],r=this._findRemoteStream(s,o),n={userId:s,isScreen:!!r&&r.isScreen,beforeVideoIndex:i.ssc_items[0].prev_layer_id,afterVideoIndex:i.ssc_items[0].cur_layer_id,beforeEnable:0!==i.ssc_items[0].prev_video_open,afterEnable:0!==i.ssc_items[0].cur_video_open,reason:i.ssc_items[0].change_reason};this.emit(NM.ON_SIMULCAST_SUBSCRIBE_FALLBACK,n)}_reportNetworkQuality(e,t){this.emit(NM.ON_NETWORK_QUALITY,e,t)}_emitVideoSizeChange(e,t,i,o){this.emit(NM.ON_REMOTE_VIDEO_SIZE_CHANGED,{roomId:this.config.roomId,userId:e,streamIndex:t?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN},{width:i,height:o})}async setAudioEncodeMaxBitrate(e,t){const i=e===em.STREAM_INDEX_MAIN?this.localStream:this.localScreenStream;if(null!=i&&i.pubAudio){var o;const e=null===(o=i.audioTransceiver)||void 0===o?void 0:o.sender.getParameters();var s;if(vv(this._ctx.id,"sender.getParameters",JSON.stringify(e),0,i.streamId),null!=e&&e.encodings.length)e.encodings[0].maxBitrate=1e3*t,vv(this._ctx.id,"sender.setParameters",JSON.stringify(e),0,i.streamId),await(null===(s=i.audioTransceiver)||void 0===s?void 0:s.sender.setParameters(e))}}_onEngineControlMessage(e){let{type:t,body:i}=e;if(t===Cg.CHANGE_CODEC){if(!WZ("SDK_CODEC_NEGOTIATION"))return void this.logger.info("_onEngineControlMessage","SDK_CODEC_NEGOTIATION is false, ignore");const{codec:e,media:t,streamId:n}=i;if(!t||"audio"===t)return;const a=hT(e);let d;var o,s,r;if(this.logger.info("_onEngineControlMessage","changeCodec to %s",e),n)(null===(o=this.localStream)||void 0===o?void 0:o.streamId)===n?d=this.localStream:(null===(s=this.localScreenStream)||void 0===s?void 0:s.streamId)===n&&(d=this.localScreenStream),null===(r=d)||void 0===r||r.setChangeCodecs(a);else"video"===t?(d=this.localStream,this._ctx.setTargetCodec(a[0])):"screen"===t&&(d=this.localScreenStream,this._ctx.setTargetScreenCodec(a[0]));d&&this.emit(NM.UPDATE_PUBLISH,{streamIndex:d.isScreen?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN})}}_checkClientBanned(e){let{clientId:t,attributes:i}=e;if(!i||!t)return;const{serverMuteAudio:o,serverMuteVideo:s}=i;if(s){const e=1===s;this.safeEmit(NM.ON_VIDEO_STREAM_BANNED,{uid:t,banned:e}),this._setRemoteUserMediaBanned(t,tm.VIDEO,e),this._maybeStartReceiveFirstFrameForServerMute(t,tm.VIDEO,e)}if(o){const e=1===o;this.safeEmit(NM.ON_AUDIO_STREAM_BANNED,{uid:t,banned:e}),this._setRemoteUserMediaBanned(t,tm.AUDIO,e),this._maybeStartReceiveFirstFrameForServerMute(t,tm.AUDIO,e)}}_setRemoteUserMediaBanned(e,t,i){var o;let s=null!==(o=this._remoteUserMediaBanned.get(e))&&void 0!==o?o:0;i?s|=t:s&=~t,this._remoteUserMediaBanned.set(e,s)}_getRemoteUserMediaBanned(e,t){var i;return t&(null!==(i=this._remoteUserMediaBanned.get(e))&&void 0!==i?i:0)}_maybeStartReceiveFirstFrameForServerMute(e,t,i){var o;if(i)return;const s=null!==(o=this._remoteStreams.get(e))&&void 0!==o?o:[];for(const a of s){var r,n;a.isScreen||a.attributes.localvideo&&a.subVideo&&(null===(r=a.observer)||void 0===r||r.setExternalVideoSource(a.attributes.extvideo),null===(n=a.observer)||void 0===n||n.setUnmuteVideo(!0))}}}RY([tY],LY.prototype,"publishScreen",1),RY([tY],LY.prototype,"updatePubScreenTrack",1),RY([tY],LY.prototype,"unpublishScreen",1),RY([tY],LY.prototype,"liveControlMessage",1),RY([tY],LY.prototype,"publicStreamControlMessage",1),RY([tY],LY.prototype,"updateUserAttributes",1),RY([tY],LY.prototype,"publish",1),RY([tY],LY.prototype,"updatePubTrack",1),RY([tY],LY.prototype,"unpublish",1),RY([tY],LY.prototype,"subscribe",1),RY([tY],LY.prototype,"updateSubVideoConfig",1),RY([tY],LY.prototype,"unsubscribe",1),RY([tY],LY.prototype,"startSubtitle",1),RY([tY],LY.prototype,"stopSubtitle",1),RY([tY],LY.prototype,"startForwardStream2Rooms",1),RY([tY],LY.prototype,"updateForwardStream2Rooms",1),RY([tY],LY.prototype,"stopForwardStream2Rooms",1),RY([tY],LY.prototype,"pauseForwardStream2AllRooms",1),RY([tY],LY.prototype,"resumeForwardStream2AllRooms",1),RY([tY],LY.prototype,"updateMediaParams",1),RY([tY],LY.prototype,"updateRemoteUserPriority",1),RY([tY],LY.prototype,"updateToken",1),RY([tY],LY.prototype,"sendUserMessage",1),RY([tY],LY.prototype,"sendRoomMessage",1),RY([tY],LY.prototype,"maybeFillBackFrame2Stream",1);const CY=async(e,t)=>{const i=new Audio(DW.createObjectURL(new Blob([e],t)));try{return i.muted=!0,await i.play(),i.pause(),!0}catch(o){return!1}};var WY=Object.defineProperty,GY=Object.getOwnPropertyDescriptor,VY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?GY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&WY(t,i,r),r};class EY{constructor(e,t){Hu(this,"_sharedAudioContext",new AudioContext),Hu(this,"_workletReady",void 0),Hu(this,"_audioDestination",this._sharedAudioContext.createMediaStreamDestination()),Hu(this,"_localGainNode",this._sharedAudioContext.createGain()),Hu(this,"_bufferGainNode",this._sharedAudioContext.createGain()),Hu(this,"_audioBufferSource",void 0),Hu(this,"_localSource",void 0),Hu(this,"_context",void 0),Hu(this,"_failedAudioList",[]),Hu(this,"_startingIds",new Map),Hu(this,"_revokeURLs",new Set),Hu(this,"_audioFetchMap",new Map),Hu(this,"_audioFetchConfig",new Map),Hu(this,"mixingMap",new Map),Hu(this,"resourcesCache",new Map),Hu(this,"volumeConfig",new Map),Hu(this,"cachedBuffer",[]),Hu(this,"id","AudioMixingManager"),this.engineId=t,this._context=e;try{var i,o;this._workletReady=null===(i=this._sharedAudioContext.audioWorklet)||void 0===i||null===(o=i.addModule)||void 0===o?void 0:o.call(i,xN),this._workletReady.catch((()=>{this._workletReady=null}))}catch(s){this._workletReady=null}this._localGainNode.gain.value=1}mixMediaStream(e){this._localSource&&this._localSource.disconnect(this._localGainNode),this._localSource=this._sharedAudioContext.createMediaStreamSource(e),this._localSource.connect(this._localGainNode).connect(this._audioDestination)}async startAudioMixing(e,t,i){if(void 0!==this._startingIds.get(e))return void console.warn("AudioMixing task id: ".concat(e," is starting"));this._startingIds.set(e,e);const{playCount:o,type:s}=i;ES(s,"mixingType",mG(km));const r=this._context.getLocalAudioTrack();if(!r)return;const n=r.preprocessingTrack;n&&this.mixMediaStream(new MediaStream([n])),r.once("needReplaceTrack",(()=>{this.mixMediaStream(new MediaStream([r.preprocessingTrack]))}));const a=this.mixingMap.get(e);if(null!=a&&a.audioNode){a.audioNode.pause(),this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_STOPPED,error:XS.AUDIO_MIXING_ERROR_OK});try{a.gainNode.disconnect(this._audioDestination),a.audioSource.disconnect(a.gainNode)}catch(h){}}let d;const c=this.resourcesCache.get(e);if(c&&c.filePath===t)d=c.getAudioNode();else{const i=await fetch(t,{mode:"cors"}).then((t=>{if(t.ok)return t.arrayBuffer();throw this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_FAILED,error:XS.AUDIO_MIXING_ERROR_START_FAILED}),this._startingIds.delete(e),this.mixingMap.delete(e),new LS(RS.LOAD_RESOURCES_FAILED,t.statusText)}));let o;t.endsWith("mp3")?o={type:"audio/mpeg"}:t.endsWith("aac")&&(o={type:"audio/aac"});if(!(await CY(i,o)))throw this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_FAILED,error:XS.AUDIO_MIXING_ERROR_START_FAILED}),this._startingIds.delete(e),this.mixingMap.delete(e),new LS(RS.LOAD_RESOURCES_FAILED,"invalid audio resource");d=new Audio,d.crossOrigin="anonymous",d.src=DW.createObjectURL(new Blob([i],o))}if(o<=0)d.loop=!0;else if(o>0){let t=o;d.onended=()=>{--t>0?d.play():(this.mixingMap.delete(e),this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_FINISHED,error:XS.AUDIO_MIXING_ERROR_OK}))}}try{await d.play()}catch(h){console.error(h),this._failedAudioList.push(d),this._context.onAutoPlayFailed({userId:this.id,kind:"audio",streamIndex:em.STREAM_INDEX_MAIN,mediaType:tm.AUDIO})}this._startingIds.delete(e);const l=this._sharedAudioContext.createMediaElementSource(d),u=this._sharedAudioContext.createGain(),m=this.volumeConfig.get(e);if(u.gain.value=m?m/100:1,l.connect(u).connect(this._audioDestination),this.mixingMap.set(e,{audioSource:l,audioNode:d,gainNode:u,type:"file"}),s===km.PUBLISH)try{u.disconnect(this._sharedAudioContext.destination)}catch(h){}else u.connect(this._sharedAudioContext.destination);this._context.updateLocalAudioTrack(this._audioDestination.stream.getAudioTracks()[0],i.type),this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_PLAYING,error:XS.AUDIO_MIXING_ERROR_OK}),this.updateFetcher(e)}stopAudioMixing(e){const t=this.mixingMap.get(e);t&&"file"===t.type&&(this.mixingMap.delete(e),t.audioNode.pause(),t.audioSource.disconnect(t.gainNode),t.gainNode.disconnect(this._audioDestination),this.updateFetcher(e),this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_STOPPED,error:XS.AUDIO_MIXING_ERROR_OK}))}pauseAudioMixing(e){const t=this.mixingMap.get(e);t&&(this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_PAUSED,error:XS.AUDIO_MIXING_ERROR_OK}),t.audioNode.pause())}resumeAudioMixing(e){const t=this.mixingMap.get(e);t&&(this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_PLAYING,error:XS.AUDIO_MIXING_ERROR_OK}),t.audioNode.play())}async preloadAudioMixing(e,t){this.stopAudioMixing(e);const i=await fetch(t,{mode:"cors"}).then((e=>{if(e.ok)return e.arrayBuffer();throw new LS(RS.LOAD_RESOURCES_FAILED,e.statusText)})).catch((t=>{if(this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_FAILED,error:XS.AUDIO_MIXING_ERROR_PRELOAD_FAILED}),t instanceof LS)throw t;throw new LS(RS.LOAD_RESOURCES_FAILED,"Load resources failed",t)}));let o;t.endsWith("mp3")?o={type:"audio/mpeg"}:t.endsWith("aac")&&(o={type:"audio/aac"});if(!(await CY(i,o)))throw this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_FAILED,error:XS.AUDIO_MIXING_ERROR_PRELOAD_FAILED}),new LS(RS.LOAD_RESOURCES_FAILED,"Load resources failed");this._context.emitMessage({mixId:e,state:xm.AUDIO_MIXING_STATE_PRELOADED,error:XS.AUDIO_MIXING_ERROR_OK}),this.resourcesCache.set(e,{getAudioNode:()=>{const e=DW.createObjectURL(new Blob([i],o));return this._revokeURLs.add(e),new Audio(e)},filePath:t,duration:0}),await new Promise((t=>{const s=DW.createObjectURL(new Blob([i],o)),r=new Audio(s);r.addEventListener("durationchange",(()=>{const i=this.resourcesCache.get(e);i&&(i.duration=r.duration,this.resourcesCache.set(e,i)),DW.revokeObjectURL(s),t(null)}))}))}unloadAudioMixing(e){this.resourcesCache.has(e)&&this.resourcesCache.delete(e)}getAudioMixingVolume(e){const t=this.mixingMap.get(e);return t?100*t.gainNode.gain.value:0}setAudioMixingVolume(e,t){t<0?t=0:t>400&&(t=400),this.volumeConfig.set(e,t);const i=this.mixingMap.get(e);i&&(i.gainNode.gain.value=Number(t)/100)}getAudioMixingDuration(e){const t=this.mixingMap.get(e),i=this.resourcesCache.get(e);return t||i?t?1e3*t.audioNode.duration:i?1e3*i.duration:0:0}getAudioMixingCurrentPosition(e){const t=this.mixingMap.get(e);return t?1e3*t.audioNode.currentTime:0}setAudioMixingPosition(e,t){const i=this.mixingMap.get(e);i&&(i.audioNode.currentTime=t/1e3,i.audioNode.play())}setAudioFrameCallback(e,t){var i;let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:4096;if(ES(o,"frameSize",[256,512,1024,2048,4096,8192,16384]),o=null!==(i=o)&&void 0!==i?i:4096,null===this._workletReady)throw new LS(RS.NOT_SUPPORTED,"Not support AudioWorklet");t?this._audioFetchConfig.set(e,{callback:t,frameSize:o}):this._audioFetchConfig.delete(e),this.updateFetcher(e)}updateFetcher(e){var t,i;const{callback:o,frameSize:s}=null!==(t=this._audioFetchConfig.get(e))&&void 0!==t?t:{},r=null===(i=this.mixingMap.get(e))||void 0===i?void 0:i.gainNode;if(r&&o&&s){let t=this._audioFetchMap.get(e);t?t.setFrameSize(s):t=new YN(r,s,this._sharedAudioContext,this._workletReady),t.on("data",o),this._audioFetchMap.set(e,t)}else{const t=this._audioFetchMap.get(e);null==t||t.removeAllListeners("data"),null==t||t.destroy(),this._audioFetchMap.delete(e)}}enableAudioMixingBuffer(e){ES(e,"type",mG(km));const t=this._context.getLocalAudioTrack();if(!t)return;const i=t.preprocessingTrack;if(i&&this.mixMediaStream(new MediaStream([i])),e===km.PUBLISH)try{this._bufferGainNode.disconnect(this._sharedAudioContext.destination)}catch(o){}else this._bufferGainNode.connect(this._sharedAudioContext.destination);this._context.updateLocalAudioTrack(this._audioDestination.stream.getAudioTracks()[0],e),this._bufferGainNode.connect(this._audioDestination),this._context.emitMessage({mixId:-1,state:xm.AUDIO_MIXING_STATE_PCM_ENABLED,error:XS.AUDIO_MIXING_ERROR_OK})}disableAudioMixingBuffer(){if(this.cachedBuffer=[],this._audioBufferSource){try{this._audioBufferSource.onended=null,this._audioBufferSource.disconnect(this._bufferGainNode),this._bufferGainNode.disconnect(this._audioDestination),this._bufferGainNode.disconnect(this._sharedAudioContext.destination)}catch(e){}finally{this._audioBufferSource=void 0}this._context.updateLocalAudioTrack(),this._context.emitMessage({mixId:-1,state:xm.AUDIO_MIXING_STATE_PCM_DISABLED,error:XS.AUDIO_MIXING_ERROR_OK})}}pushAudioMixingBuffer(e){if(!(this._audioBufferSource&&(this.cachedBuffer.push(e),this.cachedBuffer.length>0))){this._audioBufferSource=this._sharedAudioContext.createBufferSource(),this._audioBufferSource.buffer=e,this._audioBufferSource.connect(this._bufferGainNode);try{this._audioBufferSource.start()}catch(t){this._failedAudioList.push(this._audioBufferSource)}this._audioBufferSource.onended=()=>{var e;if(null===(e=this._audioBufferSource)||void 0===e||e.disconnect(this._bufferGainNode),this._audioBufferSource=void 0,this.cachedBuffer.length){const e=this.cachedBuffer.shift();e&&this.pushAudioMixingBuffer(e)}}}}stopAll(){if(this._localSource)try{this._localSource.disconnect(this._localGainNode),delete this._localSource}catch(e){}this.mixingMap.forEach(((e,t)=>{this.stopAudioMixing(t)}))}get mixTrack(){return this._audioDestination.stream.getAudioTracks()[0]}get sharedAudioContext(){return this._sharedAudioContext}async resumeLocalPlay(){const e=[];for(const i of this._failedAudioList)try{i instanceof HTMLAudioElement?(i.muted=!1,await i.play()):i.start()}catch(t){e.push(i),console.error(t),this._context.onAutoPlayFailed({userId:this.id,kind:"audio",streamIndex:em.STREAM_INDEX_MAIN,mediaType:tm.AUDIO});break}this._failedAudioList=e}destroy(){const{_sharedAudioContext:e}=this;"closed"!==e.state&&"function"==typeof e.close&&e.close(),this.cachedBuffer=[],this.mixingMap.clear(),this.resourcesCache.clear(),this.volumeConfig.clear(),this._startingIds=new Map,this._revokeURLs.forEach((e=>{DW.revokeObjectURL(e)}))}}VY([bv(["id","filePath","options"])],EY.prototype,"startAudioMixing",1),VY([bv(["id"])],EY.prototype,"stopAudioMixing",1),VY([bv(["id"])],EY.prototype,"pauseAudioMixing",1),VY([bv(["id"])],EY.prototype,"resumeAudioMixing",1),VY([bv(["id"])],EY.prototype,"preloadAudioMixing",1),VY([bv(["id"])],EY.prototype,"unloadAudioMixing",1),VY([bv(["id"])],EY.prototype,"getAudioMixingVolume",1),VY([bv(["id","volume"])],EY.prototype,"setAudioMixingVolume",1),VY([bv(["id"])],EY.prototype,"getAudioMixingDuration",1),VY([bv(["id"])],EY.prototype,"getAudioMixingCurrentPosition",1),VY([bv(["id","position"])],EY.prototype,"setAudioMixingPosition",1),VY([bv(["id","callback","frameSize"])],EY.prototype,"setAudioFrameCallback",1),VY([bv(["type"])],EY.prototype,"enableAudioMixingBuffer",1),VY([bv()],EY.prototype,"disableAudioMixingBuffer",1),VY([bv(["buffer"])],EY.prototype,"pushAudioMixingBuffer",1);class PY extends Zg.EventEmitter{constructor(e){super(),Hu(this,"_loginSessionId",null),Hu(this,"_userId",null),Hu(this,"_token",null),Hu(this,"_loginResolveCallback",void 0),Hu(this,"_loginRejectCallback",void 0),Hu(this,"_waitLoginToken",!1),Hu(this,"_serverParamsCache",void 0),Hu(this,"id",void 0),Hu(this,"logger",void 0),Hu(this,"_clearListeners",void 0),this._ctx=e,this.id=e.id,this.logger=new xv("RTSClient",1,e.id)}login(e,t){return new Promise(((i,o)=>{var s;if(this.logger.info("login","invoke login, token: %o, userId: %o",e,t),this._loginSessionId)throw new LS(RS.ALREADY_LOGIN,"Already logined");if(this._loginResolveCallback)throw new LS(RS.LOGIN_FAILED,"Is logging in, please try again later.");this._userId=t,this._token=e,null===(s=mv(this.id))||void 0===s||s.set({rtm_user_id:t}),this._loginResolveCallback=i,this._loginRejectCallback=o,this._ctx.signalingManager.connect().then((()=>{this._addSignalEventHandler(),this._login()}))}))}async logout(){if(!this._loginSessionId||!this._userId)throw new LS(RS.NOT_LOGIN,"login first");this._checkNotInLimitMode("logout"),await this._ctx.signalingManager.sendSignaling("logout",{loginSessionId:this._loginSessionId,userId:this._userId,appId:this._ctx.appId},{functionType:zG.C2RTM}).catch((()=>{})),this._clearState()}async updateLoginToken(e){return this._checkNotInLimitMode("updateLoginToken"),this._token=e,new Promise(((e,t)=>{this._waitLoginToken?(this._loginResolveCallback=e,this._loginRejectCallback=t,this._login()):e()}))}async getPeerOnlineStatus(e){if(!this._loginSessionId||!this._userId)throw new LS(RS.NOT_LOGIN,"login first");this._checkNotInLimitMode("getPeerOnlineStatus");const t=await this._ctx.signalingManager.sendSignaling("getPeerOnlineStatus",{loginSessionId:this._loginSessionId,userId:this._userId,appId:this._ctx.appId,peerUserId:e},{functionType:zG.C2RTM});return null==t?void 0:t.status}async sendUserMessageOutsideRoom(e,t){if(!this._loginSessionId||!this._userId)throw new LS(RS.NOT_LOGIN,"login first");return this._checkNotInLimitMode("sendUserMessageOutsideRoom"),this._ctx.rtsLimiter.e2e.check(t),this._ctx.signalingManager.sendP2PMessage({from:this._userId,app:this._ctx.appId,to:e,room:"",msg:t})}async setRTSMessageLimit(e){e&&this._ctx.signalingManager.sendSignaling("RTSMessageLimit",{appId:this._ctx.appId,interval:e.rts_qps_interval,broadcast:e.rts_broadcast_qps_value,one2one:e.rts_e2e_qps_value,e2bs:e.rts_e2s_qps_value},{functionType:zG.C2RTM}).catch((()=>{}))}async setServerParams(e,t){try{if(VS(e,"signature"),VS(t,"url"),!this._loginSessionId||!this._userId)throw new LS(RS.NOT_LOGIN,"login first");await this._ctx.signalingManager.sendSignaling("setServerParams",{loginSessionId:this._loginSessionId,userId:this._userId,appId:this._ctx.appId,signature:e,url:t},{functionType:zG.C2RTM}).catch((e=>{throw new LS(RS.UNEXPECTED_ERROR,e.msg)})),Fy(this.id,t),this._serverParamsCache={signature:e,url:t},this.emit("onServerParamsSetResult")}catch(i){throw this.emit("onServerParamsSetResult",i),i}}async sendServerMessage(e){if(!this._loginSessionId||!this._userId)throw new LS(RS.NOT_LOGIN,"login first");return this._checkNotInLimitMode("sendServerMessage"),this._ctx.rtsLimiter.e2s.check(e),this._ctx.signalingManager.sendP2PMessage({from:this._userId,app:this._ctx.appId,to:"",room:"",type:FG.BUSINESS_SERVER,msg:e})}destroy(){this.logger.info("destroy","invoke."),super.removeAllListeners(),this._loginResolveCallback&&this._loginRejectCallback&&(this._loginRejectCallback(new LS(RS.LOGIN_FAILED,"logout")),delete this._loginResolveCallback,delete this._loginRejectCallback),this._clearState(),delete this._serverParamsCache}_login(){var e;if(!this._userId)return;const t=Kf();try{this._checkNotInLimitMode("login")}catch(o){var i;null===(i=this._loginRejectCallback)||void 0===i||i.call(this,o)}this._ctx.signalingManager.sendSignaling("login",{Token:Jf.token2auth(this._ctx.appId,null,this._userId,this._token),timestamp:Date.now(),loginSessionId:t,params:{userAgent:window.navigator.userAgent,sdkVersion:XZ.VERSION,deviceId:TS.getDeviceId(),appId:this._ctx.appId,userId:this._userId,deviceType:"web",rtsMode:this._ctx.rtsMode,mediaProcessingType:null!==(e=XZ.MEDIA_PROCESSING_TYPE)&&void 0!==e?e:0},accessParams:JSON.stringify({requireICEUfragV2:!0})},{functionType:zG.C2RTM}).then((()=>{"function"==typeof this._loginResolveCallback&&this._loginResolveCallback(),this._loginSessionId=t,Oy(this.id,t),this._waitLoginToken=!1,this._serverParamsCache&&this.setServerParams(this._serverParamsCache.signature,this._serverParamsCache.url)})).catch((e=>{const{code:t,message:i}=e||{};let o,s;this._waitLoginToken=!1,t>=700&&t<800?708===t?(o=RS.INVALID_PARAMS,s="Invalid userId"):(o=RS.INVALID_TOKEN,s="Invalid token",this._waitLoginToken=!0,this._loginRejectCallback||this.emit("onRTMTokenError")):(o=RS.LOGIN_FAILED,s="login failed"),"function"==typeof this._loginRejectCallback&&this._loginRejectCallback(new LS(o,i||s))})).finally((()=>{delete this._loginResolveCallback,delete this._loginRejectCallback}))}_addSignalEventHandler(){const e=e=>{e.state===om.CONNECTION_STATE_RECONNECTED&&this._login()},t=()=>this._clearState(),i=e=>{this.emit("onUserMessageReceivedOutsideRoom",{userId:e.from,message:e.msg})},o=e=>{this.emit("onUserBinaryMessageReceivedOutsideRoom",{userId:e.from,message:e.msg})},s=e=>{e.clientId!==this._userId||e.roomId||(this.emit("onUserDisconnection"),this._clearState())};this._ctx.signalingManager.on(Vg.ON_CONNECTION_STATE_CHANGE,e),this._ctx.signalingManager.on(Vg.ON_RECONNECT_FAILED,t),this._ctx.signalingManager.on(Wg.USER_MESSAGE_RECEIVED_OUTSIDE_ROOM,i),this._ctx.signalingManager.on(Wg.USER_BINARY_MESSAGE_RECEIVED_OUTSIDE_ROOM,o),this._ctx.signalingManager.on(Wg.USER_DISCONNECTION,s),this._clearListeners=()=>{this._ctx.signalingManager.off(Vg.ON_CONNECTION_STATE_CHANGE,e),this._ctx.signalingManager.off(Vg.ON_RECONNECT_FAILED,t),this._ctx.signalingManager.off(Wg.USER_MESSAGE_RECEIVED_OUTSIDE_ROOM,i),this._ctx.signalingManager.off(Wg.USER_BINARY_MESSAGE_RECEIVED_OUTSIDE_ROOM,o),this._ctx.signalingManager.off(Wg.USER_DISCONNECTION,s)}}_clearState(){var e;null===(e=this._clearListeners)||void 0===e||e.call(this),this._userId=null,this._token=null,this._loginSessionId=null,Oy(this.id,"")}_checkNotInLimitMode(e){if(this._ctx.rtsMode===kg.LIMIT_MODE)throw new LS(RS.NOT_ALLOWED_IN_RESTRICTED_MODE,"not allow to call ".concat(e," in rts restricted mode"))}}var kY=(e=>(e.onWTNPushStateChanged="onWTNPushStateChanged",e.onWTNPlayStateChanged="onWTNPlayStateChanged",e.onWTNRemoteAudioStateChanged="onWTNRemoteAudioStateChanged",e.onWTNRemoteVideoStateChanged="onWTNRemoteVideoStateChanged",e.onWTNRemoteVideoStats="onWTNRemoteVideoStats",e.onWTNRemoteAudioStats="onWTNRemoteAudioStats",e.onWTNFirstRemoteVideoFrameDecoded="onWTNFirstRemoteVideoFrameDecoded",e.onWTNSEIMessageReceived="onWTNSEIMessageReceived",e.onWTNRemoteStatsException="onWTNRemoteStatsException",e.onWTNLocalStatsException="onWTNLocalStatsException",e))(kY||{}),xY=(e=>(e[e.INIT=0]="INIT",e[e.START=1]="START",e[e.SUCCESS=2]="SUCCESS",e[e.STOP=3]="STOP",e[e.FAIL=4]="FAIL",e))(xY||{}),NY=(e=>(e[e.PUSH_SUCCESS=0]="PUSH_SUCCESS",e[e.START_PUSH=1]="START_PUSH",e[e.STOP_PUSH=2]="STOP_PUSH",e[e.IN_RETRY=3]="IN_RETRY",e[e.RETRY_FAIL=4]="RETRY_FAIL",e[e.NO_PUSH_PERMISSION=5]="NO_PUSH_PERMISSION",e[e.STREAM_PUSH_BY_OTHER=6]="STREAM_PUSH_BY_OTHER",e))(NY||{}),MY=(e=>(e[e.INIT=0]="INIT",e[e.START=1]="START",e[e.SUCCESS=2]="SUCCESS",e[e.STOP=3]="STOP",e[e.FAIL=4]="FAIL",e))(MY||{}),YY=(e=>(e[e.PLAY_SUCCESS=0]="PLAY_SUCCESS",e[e.START_PLAY=1]="START_PLAY",e[e.STOP_PLAY=2]="STOP_PLAY",e[e.REMOTE_STOP=3]="REMOTE_STOP",e[e.REMOTE_FAILURE=4]="REMOTE_FAILURE",e[e.STREAM_BANNED=5]="STREAM_BANNED",e[e.NO_PLAY_PERMISSION=6]="NO_PLAY_PERMISSION",e[e.STREAM_NOT_EXIST=7]="STREAM_NOT_EXIST",e[e.IN_RETRY=8]="IN_RETRY",e[e.RETRY_FAIL=9]="RETRY_FAIL",e[e.INTERNAL=10]="INTERNAL",e[e.OVER_CLIENT_SUBSCRIBE_STREAM_LIMIT=1310]="OVER_CLIENT_SUBSCRIBE_STREAM_LIMIT",e[e.OVER_STREAM_SUBSCRIBE_USER_LIMIT=1311]="OVER_STREAM_SUBSCRIBE_USER_LIMIT",e[e.OVER_STREAM_SUBSCRIBE_REQUES_TLIMIT=1312]="OVER_STREAM_SUBSCRIBE_REQUES_TLIMIT",e))(YY||{}),wY=(e=>(e[e.STOPED=0]="STOPED",e[e.STARTING=1]="STARTING",e[e.DECODING=2]="DECODING",e[e.FROZEN=3]="FROZEN",e[e.FAILED=4]="FAILED",e))(wY||{}),KY=(e=>(e[e.INTERNAL=0]="INTERNAL",e[e.NETWORK_CONGESTION=1]="NETWORK_CONGESTION",e[e.NETWORK_RECOVERY=2]="NETWORK_RECOVERY",e[e.UNMUTE=3]="UNMUTE",e[e.MUTE=4]="MUTE",e[e.REMOTE_START=5]="REMOTE_START",e[e.REMOTE_STOP=6]="REMOTE_STOP",e))(KY||{}),HY=(e=>(e[e.STOPED=0]="STOPED",e[e.STARTING=1]="STARTING",e[e.DECODING=2]="DECODING",e[e.FROZEN=3]="FROZEN",e[e.FAILED=4]="FAILED",e))(HY||{}),FY=(e=>(e[e.INTERNAL=0]="INTERNAL",e[e.NETWORK_CONGESTION=1]="NETWORK_CONGESTION",e[e.NETWORK_RECOVERY=2]="NETWORK_RECOVERY",e[e.UNMUTE=3]="UNMUTE",e[e.MUTE=4]="MUTE",e[e.REMOTE_START=5]="REMOTE_START",e[e.REMOTE_STOP=6]="REMOTE_STOP",e))(FY||{});const JY={interval:1e3,retryDuration:0};class OY extends kM{constructor(e,t,i){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];super(i,vN.STREAM_INDEX_MAIN),Hu(this,"_state",xY.INIT),Hu(this,"_stateChangeTs",Hf()),Hu(this,"streamId",void 0),Hu(this,"Authorization",void 0),Hu(this,"_backOff",JY),this.token=t,this.streamId=e,this.logName="WTNLocalStream-".concat(e),this.observer=new FM(this._ctx,this),this.Authorization=Jf.token2auth(i.appId,"",e,t),this._state=o?xY.FAIL:xY.INIT,this.isPublicStream=!0}setState(e,t){const i=this._state;if(i===e)return;this.logger.print("setState",e,t),this._state=e;const o=Hf();this.safeEmit(kY.onWTNPushStateChanged,{streamId:this.streamId,oldState:i,newState:e,reason:t,elapse:o-this._stateChangeTs}),this._stateChangeTs=o}getPushBackOff(){return this._backOff}updatePushBackOff(){this._backOff.retryDuration+=this._backOff.interval,this._backOff.interval=this._backOff.interval>4e3?8e3:2*this._backOff.interval}resetPushBackOff(){this._backOff=JY}}class UY extends xM{constructor(e,t,i){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];super(i,e,e,!1,!0,{audiostream:!0,localaudio:!0,videostream:!0,localvideo:!0,extaudio:!1,extvideo:!1,videoDescriptions:[]}),Hu(this,"_state",MY.INIT),Hu(this,"Authorization",void 0),Hu(this,"_stateChangeTs",Hf()),Hu(this,"streamId",void 0),Hu(this,"_backOff",JY),Hu(this,"_audioState",wY.STOPED),Hu(this,"_videoState",HY.STOPED),this.token=t,this.streamId=e,this.logName="WTNRemoteStream-".concat(e),this.observer=new HM(this._ctx,this),this._initObserverEvent(o),this.Authorization=Jf.token2auth(i.appId,"",e,t),this._state=o?MY.FAIL:MY.INIT,this.isPublicStream=!0}setState(e,t){const i=this._state;if(i===e)return;this.logger.print("setState",e,t),this._state=e;const o=Hf();this.safeEmit(kY.onWTNPlayStateChanged,{streamId:this.streamId,oldState:i,newState:e,reason:t,elapse:o-this._stateChangeTs}),this._stateChangeTs=o}get state(){return this._state}getPushBackOff(){return this._backOff}updatePushBackOff(){this._backOff.retryDuration+=this._backOff.interval,this._backOff.interval=this._backOff.interval>4e3?8e3:2*this._backOff.interval}resetPushBackOff(){this._backOff=JY}setVideoState(e,t){this._videoState!==e&&(e===HY.DECODING&&this.setVideoState(HY.STARTING,t),this.logger.print("setVideoState",e,t),this._videoState=e,this.safeEmit(kY.onWTNRemoteVideoStateChanged,{streamId:this.streamId,state:e,reason:t}))}setAudioState(e,t){this._audioState!==e&&(e===wY.DECODING&&this.setAudioState(wY.STARTING,t),this.logger.print("setAudioState",e,t),this._audioState=e,this.safeEmit(kY.onWTNRemoteAudioStateChanged,{streamId:this.streamId,state:e,reason:t}))}muteToSubMediaType(e,t){let i=!1;const o=Qf(this.subMediaType),s=Bf(this.subMediaType);return"boolean"==typeof e&&o===e&&(this.subMediaType+=e?-tm.AUDIO:tm.AUDIO,i=!0),"boolean"==typeof t&&s===t&&(this.subMediaType+=t?-tm.VIDEO:tm.VIDEO,i=!0),i}getEnableMediaType(){return{audio:Qf(this.subMediaType),video:Bf(this.subMediaType)}}_initObserverEvent(e){var t,i;null===(t=this.observer)||void 0===t||t.once("recvAudioFirstFrame",(()=>{this.setAudioState(wY.DECODING,e?KY.NETWORK_RECOVERY:KY.REMOTE_START)})),null===(i=this.observer)||void 0===i||i.once("recvVideoFirstFrame",(()=>{this.setVideoState(HY.DECODING,e?FY.NETWORK_RECOVERY:FY.REMOTE_START)}))}}const DY=["rid"];var AY=Object.defineProperty,zY=Object.getOwnPropertyDescriptor,jY=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?zY(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&AY(t,i,r),r};class QY extends Ig{constructor(e){super(),Hu(this,"_reportName","WTNStream"),Hu(this,"_localStreams",new Map),Hu(this,"_remoteStreams",new Map),Hu(this,"_logger",void 0),Hu(this,"_monitor",void 0),Hu(this,"_ontrackCallbackMap",new Map),Hu(this,"_pushTaskMap",new Map),Hu(this,"_playTaskMap",new Map),Hu(this,"engineId",void 0),Hu(this,"_publicVideoPlayerConfig",new Map),Hu(this,"__onSEIMessageReceived",void 0),Hu(this,"__onRemoteStreamStats",void 0),Hu(this,"__onResubscribe",void 0),Hu(this,"__onPlayerEvents",void 0),Hu(this,"_clearSignalListeners",void 0),this._ctx=e,this._monitor=mv(e.id),this._logger=new xv("WTNStream",1,e.id),this.engineId=e.id,this._addSignalListeners()}async startPushWTN(e,t,i,o){var s;let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(i=!!i,o=!!o,this._logger.print("startPushWTN",e,t,i,o),KS(t),!MS(e)&&VS(e,"token"),this._localStreams.get(t))return;const n=new OY(t,e,this._ctx,r);n.on("stats-exception",(e=>{this._logger.print("wtn local stats exception",JSON.stringify(e)),this.safeEmit(kY.onWTNLocalStatsException,Ju(Ju({},e),{},{streamId:t}))})),this._addLocalStreamEventHandler(n),n.setState(xY.START,NY.START_PUSH),this._localStreams.set(t,n),await this._ctx.signalingManager.connect(),n.videoTrack=this._ctx.localVideoTrack,n.audioTrack=this._ctx.localAudioTrack,n.pubAudio=!o,n.pubVideo=!i,null===(s=n.observer)||void 0===s||s.setLogin(!0),await new Promise(((e,i)=>{r||this._pushTaskMap.set(t,{resolve:()=>{e(),n.startReport((()=>{}),this._ctx.handler)},reject:i}),this._sendStartPushStreamSignal(n).catch((e=>i(e)))}))}async stopPushWTN(e){var t;this._logger.print("stopPushWTN",e);const i=this._localStreams.get(e);i&&(null===(t=i.observer)||void 0===t||t.setLogin(!1),i.setState(xY.STOP,NY.STOP_PUSH),this._ctx.signalingManager.sendSignaling("stopPushStream",{appId:this._ctx.appId,streamId:e}).catch((()=>{})),await this._stopLocalStream(i))}async muteWTNLocalAudio(e,t){var i;this._logger.print("muteWTNLocalAudio",e,t);const o=this._localStreams.get(e);if(!o)throw new LS(RS.INVALID_PARAMS,"streamId not found");this._assertNotConnect(),o.pubAudio=!t,null===(i=o.observer)||void 0===i||i.setUnmuteAudio(!t),await this._updatePushStream(o)}async muteWTNLocalVideo(e,t){var i;this._logger.print("muteWTNLocalVideo",e,t);const o=this._localStreams.get(e);if(!o)throw new LS(RS.INVALID_PARAMS,"streamId not found");this._assertNotConnect(),null===(i=o.observer)||void 0===i||i.setUnmuteVideo(!t),o.pubVideo=!t,await this._updatePushStream(o)}sendWTNSEIMessage(e,t,i){this._logger.info("sendWTNSEIMessage()","streamId: %o, sei: %o, repeatCount: %o",e,t,i);const o=this._localStreams.get(e);if(!o||!o.pubVideo&&!o.pubAudio)return;if(!cZ()&&!dZ())return tT("Your browser does not support sending SEI"),!1;GS(i,"repeatCount",0,30);const s="string"==typeof t?new Uint8Array(Jf.str2ab(t)):t;if(!t.length)return this._logger.warn("sei message must not be empty"),!1;if(s.byteLength>4096)return void this._logger.warn("sei size must not bigger than 4KB");eS||this._maybeFillBackFrame2Stream(o);const r=Kf();o.sendSEIMessage({content:s,uuid:r,repeatCount:i+1}),setTimeout((async()=>{if(!o)return;var e;await o.revokeSEIMessage(r)&&(console.error("[RTC WebSDK] sei timeout for message: %o",t),null===(e=this._monitor)||void 0===e||e.report("rtc_sdk_callback",{sdk_callback_name:"sendSEIMessage",message:"timeout for message: ".concat(t),error_code:400}))}),WZ("SEI_TIME_OUT"))}async startPlayWTN(e,t,i,o){var s;let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];i=!!i,o=!!o,this._logger.print("startPlayWTN",e,t,i,o),KS(t),!MS(e)&&VS(e,"token");let n=this._remoteStreams.get(t);if(n){if(n.state===MY.START||n.state===MY.SUCCESS)throw new LS(RS.REPEAT_PLAY,"repeat play public media stream");await this.stopPlayWTN(n.streamId)}n=new UY(t,e,this._ctx,r),n.on("stats-exception",(e=>{this._logger.print("wtn remote stats exception",JSON.stringify(e)),this.safeEmit(kY.onWTNLocalStatsException,Ju(Ju({},e),{},{streamId:t}))})),this._addRemoteStreamEventHandler(n),n.setState(MY.START,YY.START_PLAY),n.muteToSubMediaType(o,i),this._remoteStreams.set(t,n),null===(s=n.observer)||void 0===s||s.setLogin(!0,n.getEnableMediaType());try{await this._ctx.signalingManager.connect(),await new Promise(((e,i)=>{r||this._playTaskMap.set(t,{resolve:e,reject:i}),this._sendStartPullStreamSignal(n).catch((e=>i(e)))}))}catch(a){throw this._remoteStreams.delete(t),a}}async stopPlayWTN(e){var t,i;this._logger.print("stopPlayWTN",e);const o=this._remoteStreams.get(e);if(o)return o.setState(MY.STOP,YY.STOP_PLAY),o.setAudioState(wY.STOPED,KY.MUTE),o.setVideoState(HY.STOPED,FY.MUTE),null===(t=o.observer)||void 0===t||t.setLogin(!1),null==o||null===(i=o.audioTrack)||void 0===i||i.stop(),this._remoteStreams.delete(e),await this._ctx.signalingManager.connect(),this._unsubscribePublicStream(o)}async muteWTNRemoteAudio(e,t){this._logger.print("muteWTNRemoteAudio",e,t),this._assertNotConnect();const i=this._remoteStreams.get(e);if(!i)throw new LS(RS.INVALID_PARAMS,"streamId not found");var o;i.muteToSubMediaType(t,null)&&(null===(o=i.observer)||void 0===o||o.setUnmuteAudio(!t),await this._updatePullStream(e,i),i.setAudioState(t?wY.STOPED:wY.DECODING,t?KY.MUTE:KY.UNMUTE))}async muteWTNRemoteVideo(e,t){this._logger.print("muteWTNRemoteVideo",e,t),this._assertNotConnect();const i=this._remoteStreams.get(e);if(!i)throw new LS(RS.INVALID_PARAMS,"streamId not found");var o;i.muteToSubMediaType(null,t)&&(null===(o=i.observer)||void 0===o||o.setUnmuteVideo(!t),await this._updatePullStream(e,i),i.setVideoState(t?HY.STOPED:HY.DECODING,t?FY.MUTE:FY.UNMUTE))}setWTNRemoteVideoPlayer(e,t){var i;if(this._logger.print("setWTNRemoteVideoPlayer()","streamId: %o, videoPlayerOption: %o",e,t),null===(i=this._publicVideoPlayerConfig.get(e))||void 0===i||null===(i=i.player)||void 0===i||i.destroy(),!t.renderDom)return void this._publicVideoPlayerConfig.delete(e);const o=new nM(this._ctx.id,ON,Ju(Ju({},t),{},{isLocal:!1,userId:e})),s=Ju(Ju({},t),{},{player:o});return this._publicVideoPlayerConfig.set(e,s),this._updateVideoPlayerState(e),o.domElement}setWTNRemoteAudioPlaybackVolume(e,t){var i;VS(e,"publicStreamId"),t=OS(t,"volume",0,400),this._ctx.publicAudioVolume.set(e,t),null===(i=this._remoteStreams.get(e))||void 0===i||null===(i=i.audioTrack)||void 0===i||i.setVolume(t)}__getRemoteStreams(){return this._remoteStreams}__getPublicStreamTrack(e,t){const i=this._remoteStreams.get(e);if(i)return"video"===t?i.videoTrack:i.audioTrack}async _updatePushTrack(){0!==this._localStreams.size&&(this._logger.info("_updatePushTrack()"),await this._ctx.signalingManager.connect(),this._localStreams.forEach((async e=>{var t;e.videoTrack=this._ctx.localVideoTrack,e.audioTrack=this._ctx.localAudioTrack,null===(t=e.observer)||void 0===t||t.setEnableVideo(!0),await this._updatePushStream(e)})))}getWTNVideoPlayerVisibility(e){var t;const i=null===(t=this._publicVideoPlayerConfig.get(e))||void 0===t?void 0:t.player;if(!i)return;const o=i.getPlayerVisibility();return{descriptor:{streamId:e,mediaType:tm.VIDEO},status:o}}destroy(){var e;this._remoteStreams.forEach((e=>{e.destroy()})),this._remoteStreams=new Map,this.removeAllListeners(),this._ontrackCallbackMap.clear(),this._publicVideoPlayerConfig.forEach((e=>{e.player.destroy()})),this._publicVideoPlayerConfig.clear(),null===(e=this._clearSignalListeners)||void 0===e||e.call(this)}async _sendStartPushStreamSignal(e){var t,i,o,s;this._logger.print("_sendStartPushStreamSignal()","streamId: %s",e.streamId);const{streamId:r,Authorization:n,pubAudio:a,pubVideo:d}=e,{handler:c}=this._ctx;await(null==c?void 0:c.getDefaultSdp());const l=await c.publish(e),u=await QS(),{appId:m,businessId:h,useCloudProxy:p}=this._ctx,b={appId:m,streamId:r,Authorization:n,sdpInfo:{msid:e.stream.id,type:l.type,sdp:l.partialSdp,semantics:l.semantics},timestamp:Date.now(),params:{appId:m,businessId:h,userAgent:window.navigator.userAgent,sdkVersion:XZ.VERSION,deviceId:TS.getDeviceId(),enableCloudProxy:p,channelProfile:"0",SDKCodecNegotiation:!0,supportedCodecs:u,sdkType:"rtc",joinRoomMode:1,deviceType:"web",rtsMode:this._ctx.rtsMode,mediaProcessingType:null!==(t=XZ.MEDIA_PROCESSING_TYPE)&&void 0!==t?t:0},options:{supportCheckTokenPrivilege:!0,supportTokenExpireCallBack:!0,enableSceneConfigV2:!0,enableUnBundleMode:!0,enableAudioMux:!0,enableBigRoomMode:!0,needNegotiateSDP:!0,supportMultiVendor:!0,enableStreamStatusCallback:!0},attributes:{localaudio:!!e.audioTrack,localvideo:!!e.videoTrack,videostream:d,audiostream:a,extvideo:(null===(i=e.videoTrack)||void 0===i?void 0:i.sourceType)===Ng.EXTERNAL,extaudio:(null===(o=e.audioTrack)||void 0===o?void 0:o.sourceType)===Ng.EXTERNAL,videoDescriptions:l.videoDescriptions.map((e=>Cy(e,DY))),videoType:xg.NORMAL},video:d,audio:a,screen:e.isScreen,accessParams:JSON.stringify({requireICEUfragV2:!0})};let _;try{this.emit("__onSendingPushStreamMessageHook"),_=await this._ctx.signalingManager.sendSignaling("startPushStream",b)}catch(S){if(await(null==c?void 0:c.rollback({msid:e.stream.id,stream:e,audioMid:l.audioMid,videoMid:l.videoMid})),S.code>=500&&S.code<600){const t=e.getPushBackOff();if(t.retryDuration<6e4)return this._logger.info("pushRetry","start msid: %s, retryDuration: %s",e.id,t.retryDuration),await new Promise((e=>setTimeout(e,t.interval))),e.updatePushBackOff(),e.resetStream(),e.setState(xY.START,NY.IN_RETRY),this._sendStartPushStreamSignal(e);throw this._logger.info("pushRetry","end"),e.setState(xY.FAIL,NY.RETRY_FAIL),await this._stopLocalStream(e),e.resetPushBackOff(),new LS(RS.WTN_PUSH_FAILED,S.message||"server error")}if(401===S.code)throw e.setState(xY.FAIL,NY.NO_PUSH_PERMISSION),await this._stopLocalStream(e),new LS(RS.WTN_PUSH_FAILED,S.message||"token error");if(S.code===RS.OPERATION_CANCEL&&this._ctx.signalingManager.isReconnecting())return;throw new LS(RS.WTN_PUSH_FAILED,S.message||"push error")}e.pubAttributes=b.attributes;const y=await e.getSelectedCodec();e.currentVideoCodec=y,_&&_.relayMessage&&(_.relayMessage.sdp=EG(_.relayMessage.sdp));const v=new Promise(((t,i)=>{var o,s;null==c||c.handleAck({action:Yx.publish,streamId:r,audioMid:l.audioMid,videoMid:l.videoMid,audioTransceiverInit:null==l?void 0:l.audioTransceiverInit,videoTransceiverInit:null==l?void 0:l.videoTransceiverInit,signalingAck:{sdp:null===(o=_)||void 0===o||null===(o=o.relayMessage)||void 0===o?void 0:o.sdp,sequenceId:null===(s=_)||void 0===s||null===(s=s.relayMessage)||void 0===s?void 0:s.sequenceId},stream:e,videoCodec:y,onSuccess:()=>{this._logger.info("pushStream()","pushStream success"),e.setState(xY.SUCCESS,NY.PUSH_SUCCESS),t(0)},onFail:e=>{this._logger.info("pushStream()","pushStream fail"),i(e)}})}));!wv&&await v,null===(s=this._pushTaskMap.get(r))||void 0===s||s.resolve(),this._pushTaskMap.delete(r)}async _stopLocalStream(e){var t;e.stopBlackFrame(),await(null===(t=this._ctx.handler)||void 0===t?void 0:t.handleAck({action:Yx.unpublish,audioMid:e.audioMid,videoMid:e.videoMid,stream:e,streamId:e.streamId})),e.destroy(),this._localStreams.delete(e.streamId)}async _updatePushStream(e){var t,i,o,s;const{videoTrack:r,audioTrack:n,pubAudio:a,pubVideo:d}=e;let c=null===(t=e.audioTrack)||void 0===t?void 0:t.preprocessingTrack;const l=null===(i=e.videoTrack)||void 0===i?void 0:i.preprocessingTrack;var u,m;d&&l?(e.stopBlackFrame(),await(null===(u=e.videoTransceiver)||void 0===u?void 0:u.sender.replaceTrack(l))):await(null===(m=e.videoTransceiver)||void 0===m?void 0:m.sender.replaceTrack(null));if(a&&c){var h;const{mixType:t,mixedAudioTrack:i}=e.audioTrack;i&&t!==km.PLAYOUT&&c.enabled&&(c=i),await(null===(h=e.audioTransceiver)||void 0===h?void 0:h.sender.replaceTrack(c))}else{var p;await(null===(p=e.audioTransceiver)||void 0===p?void 0:p.sender.replaceTrack(null))}const b={localaudio:!!n,localvideo:!!r,videostream:d,audiostream:a,extvideo:(null==r?void 0:r.sourceType)===Ng.EXTERNAL,extaudio:(null==n?void 0:n.sourceType)===Ng.EXTERNAL,videoType:r?xg.NORMAL:e.pubAttributes.videoType},_={};for(const[v,S]of Object.entries(b))S!==Reflect.get(e.pubAttributes,v)&&Reflect.set(_,v,S);var y;Object.keys(_).length&&(e.pubAudio=null!==(o=b.audiostream)&&void 0!==o?o:e.pubAudio,e.pubVideo=null!==(s=b.videostream)&&void 0!==s?s:e.pubVideo,e.pubAttributes=Ju(Ju({},e.pubAttributes),b),e.pubAttributes.videostream||e.stopBlackFrame(),await this._ctx.signalingManager.sendSignaling("updatePushStream",{appId:this._ctx.appId,streamId:e.streamId,attributes:b}),wv&&await(null===(y=this._ctx.handler)||void 0===y?void 0:y.setCurrentDescription()))}async _sendStartPullStreamSignal(e){var t,i,o,s,r;this._logger.print("startPullStream()","streamId:",e.streamId);const{streamId:n,Authorization:a}=e,{handler:d}=this._ctx,c=await(null==d?void 0:d.subscribe(e,{multiChatMode:!1}));if(!c)throw new LS(RS.ADD_TRANSCEIVER_FAILED,"add transceiver failed");const l=Hf(),{audioMid:u,videoMid:m}=c,{appId:h,businessId:p,useCloudProxy:b}=this._ctx,_=await QS(),y={appId:h,streamId:n,Authorization:a,audio:!0,video:!0,screen:!1,timestamp:Date.now(),sdpInfo:{sdp:c.partialSdp,semantics:c.semantics,type:c.type},params:{appId:h,businessId:p,userAgent:window.navigator.userAgent,sdkVersion:XZ.VERSION,deviceId:TS.getDeviceId(),enableCloudProxy:b,channelProfile:"0",SDKCodecNegotiation:!0,supportedCodecs:_,sdkType:"rtc",joinRoomMode:1,deviceType:"web",rtsMode:this._ctx.rtsMode,mediaProcessingType:null!==(t=XZ.MEDIA_PROCESSING_TYPE)&&void 0!==t?t:0},options:{supportCheckTokenPrivilege:!0,supportTokenExpireCallBack:!0,enableSceneConfigV2:!0,enableUnBundleMode:!0,enableAudioMux:!0,enableBigRoomMode:!0,needNegotiateSDP:!0,supportMultiVendor:!0,enableStreamStatusCallback:!0},config:{enableMediaType:e.getEnableMediaType(),qualityLayer:{spatialLayer:0,temporalLayer:0}},accessParams:JSON.stringify({requireICEUfragV2:!0}),extra:{enableSendRTT:!0}};let v;try{this.emit("__onSendingPullStreamMessageHook"),v=await this._ctx.signalingManager.sendSignaling("startPullStream",y)}catch(I){if(await(null==d?void 0:d.rollback({msid:n,stream:e}).catch((()=>{}))),401===I.code)throw e.setState(MY.FAIL,YY.NO_PLAY_PERMISSION),new LS(RS.WTN_PLAY_FAILED,I.message||"token error");if(433===I.code)throw e.setState(MY.FAIL,YY.OVER_CLIENT_SUBSCRIBE_STREAM_LIMIT),new LS(RS.WTN_PLAY_FAILED,I.message||"over client subscribe stream limit");if(434===I.code)throw e.setState(MY.FAIL,YY.OVER_STREAM_SUBSCRIBE_USER_LIMIT),new LS(RS.WTN_PLAY_FAILED,I.message||"over stream subscribe user limit");if(I.code===RS.OPERATION_CANCEL&&this._ctx.signalingManager.isReconnecting())return;throw e.setState(MY.FAIL,YY.INTERNAL),new LS(RS.WTN_PLAY_FAILED,I.message||"play wtn error")}const S=[];S.push(new Promise(((t,i)=>{const o=setTimeout((()=>i(new LS(RS.WTN_PLAY_FAILED,"wait video timeout for streamId: ".concat(n)))),$M),s=i=>{"video"===i.mediaType&&(this._logger.success("remoteStream ".concat(e.userId," received video track")),e.off("ontrack",s),clearTimeout(o),t(0))};e.on("ontrack",s)}))),S.push(new Promise(((t,i)=>{const o=setTimeout((()=>i(new LS(RS.WTN_PLAY_FAILED,"wait audio timeout for streamId: ".concat(n)))),$M),s=i=>{"audio"===i.mediaType&&(this._logger.success("remoteStream ".concat(e.userId," received audio track")),e.off("ontrack",s),clearTimeout(o),t(0))};e.on("ontrack",s)})));const Z=t=>{e.ontrack(t)};null===(i=this._ctx.handler)||void 0===i||i.on("ontrack",Z),this._ontrackCallbackMap.set(e,Z),v&&v.relayMessage&&(v.relayMessage.sdp=EG(v.relayMessage.sdp));const{sequenceId:f,sdp:T}=v.relayMessage;e.videoMid=m,e.audioMid=u,e.sequenceId=f,e.streamState=PM.SUB_ED,await(null===(o=this._ctx.handler)||void 0===o?void 0:o.handleAck({action:Yx.subscribe,streamId:n,audioMid:u,videoMid:m,audioTransceiverInit:c.audioTransceiverInit,videoTransceiverInit:c.videoTransceiverInit,signalingAck:{sdp:T,sequenceId:f},stream:e})),await Promise.all(S),null===(s=this._monitor)||void 0===s||s.report("rtc_subscribe_stat",{result:"success",start:l,message:"unknown",stream_user_id:e.userId}),e.startReport((t=>{var i;t.publicStreamId=t.userId,delete t.userId,delete t.isScreen;const o=qf(t);o.audioStats&&this.safeEmit(kY.onWTNRemoteAudioStats,{streamId:e.streamId,audioStats:o.audioStats}),o.videoStats&&this.safeEmit(kY.onWTNRemoteVideoStats,{streamId:e.streamId,videoStats:o.videoStats}),null===(i=this.__onRemoteStreamStats)||void 0===i||i.call(this,o)}),this._ctx.handler),this._updateVideoPlayerState(n),this._initAudioPlayer(n),e.subVideo=e.getEnableMediaType().video,e.subAudio=e.getEnableMediaType().audio,null===(r=this._playTaskMap.get(n))||void 0===r||r.resolve(),this._playTaskMap.delete(n)}async _unsubscribePublicStream(e){var t;eY("_unsubscribePublicStream()",e,this._logger);const i={appId:this._ctx.appId,streamId:e.streamId};try{await this._ctx.signalingManager.sendSignaling("stopPullStream",i)}catch(o){}e.streamState=PM.INIT,await(null===(t=this._ctx.handler)||void 0===t?void 0:t.handleAck({action:Yx.unsubscribe,streamId:e.streamId,audioMid:e.audioMid,videoMid:e.videoMid,stream:e})),e.subMediaType=US.NONE,this._removeOnTrackListener(e),e.statsReport.unsubscribe(),e.destroy()}async _updatePullStream(e,t){const i=t.getEnableMediaType();await this._ctx.signalingManager.sendSignaling("updatePullStream",{appId:this._ctx.appId,streamId:e,config:{enableMediaType:i}}),t.subVideo=i.video,t.subAudio=i.audio}_removeOnTrackListener(e){const t=this._ontrackCallbackMap.get(e);if(t){const i=e.vendorHandler||this._ctx.handler;null==i||i.off("ontrack",t),this._ontrackCallbackMap.delete(e)}}_addSignalListeners(){const e={[Vg.ON_CONNECTION_STATE_CHANGE]:e=>{e.state===om.CONNECTION_STATE_RECONNECTED?(Array.from(this._remoteStreams.values()).forEach((e=>{const{streamId:t,token:i}=e,{audio:o,video:s}=e.getEnableMediaType();e.destroy(),this._remoteStreams.delete(t),this.startPlayWTN(i,t,!s,!o,!0).then((()=>{var t;null===(t=this.__onResubscribe)||void 0===t||t.call(this,{stream:e})}))})),Array.from(this._localStreams.values()).forEach((e=>{const{token:t,pubAudio:i,pubVideo:o}=e;e.destroy(),this._localStreams.delete(e.streamId),this.startPushWTN(t,e.streamId,!o,!i,!0)}))):e.state===om.CONNECTION_STATE_DISCONNECTED&&(this._remoteStreams.forEach((e=>{e.setState(MY.FAIL,YY.IN_RETRY),e.setAudioState(wY.FROZEN,KY.NETWORK_CONGESTION),e.setVideoState(HY.FROZEN,FY.NETWORK_CONGESTION)})),this._localStreams.forEach((e=>{e.setState(xY.FAIL,NY.IN_RETRY)})))},[Wg.ON_STREAM_PUSHED_BY_OTHER]:e=>{const t=this._localStreams.get(e.streamId);this._logger.print("_addSignalListeners","onStreamPushedByOther",e.streamId),t&&(t.setState(xY.FAIL,NY.STREAM_PUSH_BY_OTHER),this._stopLocalStream(t))},[Wg.ON_STREAM_PULL_STATE_CHANGED]:async e=>{const t=this._remoteStreams.get(e.streamId);if(this._logger.print("_addSignalListeners","onStreamPullStateChanged",e),t)switch(e.code){case 0:t.setState(MY.SUCCESS,YY.PLAY_SUCCESS);break;case 1:case 2:case 3:const o={1:YY.STREAM_NOT_EXIST,2:YY.REMOTE_STOP,3:YY.REMOTE_FAILURE}[e.code];t.setAudioState(wY.STOPED,KY.REMOTE_STOP),t.setVideoState(HY.STOPED,FY.REMOTE_STOP),t.setState(MY.FAIL,o);break;case 4:const s=t.getPushBackOff();var i;if(s.retryDuration<6e4)this._logger.info("subRetry",t.streamId,s.retryDuration),t.setState(MY.START,YY.IN_RETRY),await new Promise((e=>setTimeout(e,s.interval))),t.updatePushBackOff(),await(null===(i=this._ctx)||void 0===i||null===(i=i.handler)||void 0===i?void 0:i.handleAck({action:Yx.unsubscribe,streamId:t.streamId,audioMid:t.audioMid,videoMid:t.videoMid,stream:t})),t.clean(),await this._sendStartPullStreamSignal(t);else t.setState(MY.FAIL,YY.RETRY_FAIL),this._logger.info("subRetry","end",t.streamId),t.resetPushBackOff()}},[Gg.RTT]:e=>{const{StreamIds:t,Metadata:i}=e;if(null!=t&&t.length&&i){const e=t[0];this._ctx.streamRTT[e]={audio:i.audio_rtt,video:i.video_rtt}}}};Object.keys(e).forEach((t=>{this._ctx.signalingManager.on(t,e[t])})),this._clearSignalListeners=()=>{Object.keys(e).forEach((t=>{this._ctx.signalingManager.off(t,e[t])}))}}_addLocalStreamEventHandler(e){e.on(kY.onWTNPushStateChanged,(e=>{this.safeEmit(kY.onWTNPushStateChanged,e)}))}_addRemoteStreamEventHandler(e){e.on(kY.onWTNPlayStateChanged,(e=>{this.safeEmit(kY.onWTNPlayStateChanged,e)})),e.on(kY.onWTNRemoteAudioStateChanged,(e=>{this.safeEmit(kY.onWTNRemoteAudioStateChanged,e)})),e.on(kY.onWTNRemoteVideoStateChanged,(e=>{this.safeEmit(kY.onWTNRemoteVideoStateChanged,e)})),e.on("onSEIMessage",(t=>{if(t instanceof Uint8Array){const o=function(e){const t=new DataView(e.buffer);if(t.byteLength<=4||65535!==t.getUint16(0))return{seiCount:1,seis:[e]};const i={seiCount:0,seis:[]};let o=!1,s=2;for(;s<t.byteLength;){const r=t.getUint16(s);if(s+=2,t.byteLength-s<r){o=!0;break}const n=new Uint8Array(e.buffer,s,r);if(s+=r,t.byteLength-s>0&&t.byteLength-s<=2){o=!0;break}i.seiCount++,i.seis.push(n)}return o&&(i.seiCount=1,i.seis=[e]),i}(t);for(let t=0;t<o.seiCount;t++){var i;null===(i=this.__onSEIMessageReceived)||void 0===i||i.call(this,{sei:o.seis[t],publicStreamId:e.streamId}),this.safeEmit(kY.onWTNSEIMessageReceived,{streamId:e.streamId,sei:o.seis[t]})}}}))}_updateVideoPlayerState(e){const t=this._remoteStreams.get(e);if(t){const s=this._publicVideoPlayerConfig.get(e);var i,o;if(s)null===(i=t.videoTrack)||void 0===i||i.setPlayer(this._ctx.id,s,null===(o=this._ctx)||void 0===o?void 0:o.autoPlayPolicy,this._initPlayerEvents.bind(this))}}_initAudioPlayer(e){const t=this._remoteStreams.get(e);if(null!=t&&t.audioTrack){var i,o;const s=new aM(this._ctx.id,e,{muted:(null===(i=this._ctx)||void 0===i?void 0:i.autoPlayPolicy)===Sm.VIDEO_ONLY||(null===(o=this._ctx)||void 0===o?void 0:o.autoPlayPolicy)===Sm.PLAY_MANUALLY,isScreen:!1});t.audioTrack.setPlayer(s),t.audioTrack.bindPlayerEvent(this._initPlayerEvents.bind(this)),t.audioTrack.play()}}_initPlayerEvents(e){var t;let i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:em.STREAM_INDEX_MAIN;null===(t=this.__onPlayerEvents)||void 0===t||t.call(this,e,i,o),e.on("playback_event",(t=>{const i=this._remoteStreams.get(e.userId);if("loadeddata"===t.eventName){const e=()=>{i&&"video"===t.type&&this.safeEmit(kY.onWTNFirstRemoteVideoFrameDecoded,{streamId:i.streamId})};null==i||!i.observer||i.observer.audioFirstFrameReceived?e():i.observer.once("recvVideoFirstFrame",e)}}))}async _maybeFillBackFrame2Stream(e){var t;if(e.refreshBlackFrameLifetime(),null===(t=e.videoTransceiver)||void 0===t||!t.sender.track){var i;const t=await e.getSelectedCodec(),o=e.genBlackFrame(t);if(!o)return;null===(i=e.videoTransceiver)||void 0===i||null===(i=i.sender)||void 0===i||i.replaceTrack(o),e.pubAttributes.videoType=xg.BLACK,this._ctx.signalingManager.sendSignaling("updatePushStream",{streamId:e.streamId,appId:this._ctx.appId,attributes:{videoType:xg.BLACK}}),e.on("black-frame-ended",(()=>{var t;null===(t=e.videoTransceiver)||void 0===t||null===(t=t.sender)||void 0===t||t.replaceTrack(null),e.pubAttributes.videoType=xg.NORMAL,this._ctx.signalingManager.sendSignaling("updatePushStream",{streamId:e.streamId,appId:this._ctx.appId,attributes:{videoType:xg.NORMAL}})}))}}safeEmit(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return yv(this._ctx.id,e,i),super.safeEmit(e,...i)}_assertNotConnect(){if(!this._ctx.signalingManager.isConnected())throw new LS(RS.NOT_CONNECTED_YET,"server not connected")}}jY([bv()],QY.prototype,"startPushWTN",1),jY([bv()],QY.prototype,"stopPushWTN",1),jY([bv()],QY.prototype,"muteWTNLocalAudio",1),jY([bv()],QY.prototype,"muteWTNLocalVideo",1),jY([bv()],QY.prototype,"sendWTNSEIMessage",1),jY([bv()],QY.prototype,"startPlayWTN",1),jY([bv()],QY.prototype,"stopPlayWTN",1),jY([bv()],QY.prototype,"muteWTNRemoteAudio",1),jY([bv()],QY.prototype,"muteWTNRemoteVideo",1),jY([bv()],QY.prototype,"setWTNRemoteVideoPlayer",1),jY([bv()],QY.prototype,"setWTNRemoteAudioPlaybackVolume",1),jY([bv()],QY.prototype,"getWTNVideoPlayerVisibility",1),jY([XN],QY.prototype,"_sendStartPushStreamSignal",1),jY([XN],QY.prototype,"_stopLocalStream",1),jY([XN],QY.prototype,"_sendStartPullStreamSignal",1),jY([XN],QY.prototype,"_unsubscribePublicStream",1);const BY=new xv("AudioDeviceManager",1);class qY extends Zg.EventEmitter{constructor(e){super(),Hu(this,"_audioLevelFetcher",void 0),Hu(this,"_playbackDeviceTestTimer",void 0),Hu(this,"_audioElement",void 0),Hu(this,"_audioTrack",void 0),Hu(this,"_mediaRecorder",void 0),Hu(this,"_recoderTimer",void 0),Hu(this,"_isAudioPlaybackDeviceTesting",!1),Hu(this,"_isAudioDeviceRecordTesting",!1),Hu(this,"_audioCaptureAndRecoderResolve",void 0),Hu(this,"_onAutoplayFailed",void 0),Hu(this,"_audioPlaybackDeviceId",void 0),this._ctx=e}get audioTrack(){return this._audioTrack}async startAudioPlaybackDeviceTest(e,t){if(this._isAudioPlaybackDeviceTesting||this._isAudioDeviceRecordTesting)throw new LS(RS.REPEAT_DEVICE_TEST,"device test cannot be called repeatedly at the same time.");this._isAudioPlaybackDeviceTesting=!0,BY.info("startAudioPlaybackDeviceTest()","Invoke");try{await this._playAudioFile(e,{loop:!0})}catch(oK){throw BY.error("startAudioPlaybackDeviceTest()","error",oK),this.stopAudioPlaybackDeviceTest(),oK}this._startEmitAudioPlaybackDeviceTestVolume(t)}stopAudioPlaybackDeviceTest(){this._isAudioPlaybackDeviceTesting&&(BY.info("stopAudioPlaybackDeviceTest()","Invoke"),this._isAudioPlaybackDeviceTesting=!1,this._stopEmitAudioPlaybackDeviceTestVolume(),this._destroyAudioElement())}async startAudioDeviceRecordTest(e,t,i){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:3e4;if(!window.MediaRecorder)throw new LS(RS.NOT_SUPPORTED,"Your browser does not support MediaRecorder.");if(this._isAudioDeviceRecordTesting||this._isAudioPlaybackDeviceTesting)throw new LS(RS.REPEAT_DEVICE_TEST,"device test cannot be called repeatedly at the same time.");this._isAudioDeviceRecordTesting=!0,BY.info("startAudioDeviceRecordTest()","Invoke"),this._recoderTimer=setTimeout((()=>{BY.info("startAudioDeviceRecordTest()","".concat(o,'ms automatic call method "stopAudioDeviceRecordAndPlayTest"')),this._stopAudioCaptureAndRecoder()}),o);try{this._onAutoplayFailed=t,await this._startAudioCaptureAndRecoder(e,null!=i?i:100)}catch(s){throw this._isAudioDeviceRecordTesting=!1,delete this._onAutoplayFailed,s}delete this._audioCaptureAndRecoderResolve}stopAudioDeviceRecordAndPlayTest(){BY.info("stopAudioDeviceRecordAndPlayTest()","Invoke"),void 0!==this._recoderTimer&&(clearTimeout(this._recoderTimer),delete this._recoderTimer),this._stopAudioCaptureAndRecoder()}stopAudioDevicePlayTest(){this._isAudioDeviceRecordTesting&&(BY.info("stopAudioDevicePlayTest()","Invoke"),this._isAudioDeviceRecordTesting=!1,this._mediaRecorder&&(this._mediaRecorder.ondataavailable=null),this.stopAudioDeviceRecordAndPlayTest(),this._stopEmitAudioPlaybackDeviceTestVolume(),this._destroyAudioElement()),delete this._onAutoplayFailed}getRecordTrack(){return this._audioTrack}async setSinkId(e){if(BY.info("setSinkId()","Invoke"),void 0===HTMLAudioElement.prototype.setSinkId)throw new LS(RS.NOT_SUPPORTED,"setSinkId not supported by current browser");const t=await HN.getAudioPlaybackDeviceById(e);if(!t)throw new LS(RS.INVALID_DEVICE_ID,"audio playback device id ".concat(e," is invalid"));return this._audioPlaybackDeviceId=e,this._setAudioCtxSinkId(),t}getSinkId(){return this._audioPlaybackDeviceId}destroy(){BY.info("destroy()","Invoke"),super.removeAllListeners(),this.stopAudioPlaybackDeviceTest(),this.stopAudioDevicePlayTest()}async _playAudioFile(e,t){return BY.info("_playAudioFile()","Invoke url=".concat(e,"; loop=").concat(t.loop)),new Promise(((i,o)=>{const s=KN("audio",{attributes:{src:e,crossOrigin:"anonymous"}});this._audioElement=s,s.loop=t.loop,this._audioLevelFetcher=new MN(s),s.onplaying=()=>{s.onplaying=null,BY.info("_playAudioFile()","onplaying"),i()},s.onerror=async e=>{var t;BY.error("_playAudioFile()","onerror",e);const i=e.message||(null==s||null===(t=s.error)||void 0===t?void 0:t.message);o(new LS(RS.LOAD_RESOURCES_FAILED,"Failed to play recorded audio".concat(i?", reason: ".concat(i):".")))},this._setAudioCtxSinkId().then((()=>{var e,t;return null===(e=s.play())||void 0===e||null===(t=e.catch)||void 0===t?void 0:t.call(e,(e=>{BY.warn("_playAudioFile()","autoplay error",e);const t="Failed to play recorded audio, ".concat(e.name,": ").concat(e.message);"NotAllowedError"===e.name&&this._onAutoplayFailed?this._onAutoplayFailed((()=>{var e;return Promise.all([null===(e=this._audioLevelFetcher)||void 0===e?void 0:e.resume(),s.play()])})):o(new LS(RS.LOAD_RESOURCES_FAILED,t))}))}))}))}_destroyAudioElement(){this._audioElement&&(BY.info("_destroyAudioElement()","Invoke"),this._audioElement.onplaying=null,this._audioElement.onerror=null,this._audioElement.src="",delete this._audioElement,"function"==typeof this._audioCaptureAndRecoderResolve&&this._audioCaptureAndRecoderResolve())}_startEmitAudioPlaybackDeviceTestVolume(e){e=Math.max(e,100),this._audioElement&&(BY.info("_startEmitAudioPlaybackDeviceTestVolume()","start timer(".concat(e,"ms)")),this._playbackDeviceTestTimer=self.setInterval((()=>{this._audioLevelFetcher&&this.emit("onAudioPlaybackDeviceTestVolume",this._audioLevelFetcher.getAudioLevel())}),e))}_stopEmitAudioPlaybackDeviceTestVolume(){var e;void 0!==this._playbackDeviceTestTimer&&(BY.info("_stopEmitAudioPlaybackDeviceTestVolume()","stop timer"),self.clearInterval(this._playbackDeviceTestTimer),delete this._playbackDeviceTestTimer),null===(e=this._audioLevelFetcher)||void 0===e||e.destroy(),delete this._audioLevelFetcher}async _startAudioCaptureAndRecoder(e,t){this._audioTrack=await SM(this._ctx,this._ctx.audioProfileManager.getConstraints()),this._audioTrack.setVolume(t+.01);const i=new MediaStream([this._audioTrack.preprocessingTrack]);return BY.info("startAudioDeviceRecordTest()","create microphone track success!"),new Promise(((t,o)=>{let s;"function"==typeof MediaRecorder.isTypeSupported&&(s=["audio/webm","audio/mp4"].find((e=>MediaRecorder.isTypeSupported(e))),BY.info("startAudioDeviceRecordTest()","use mimeType: ".concat(s))),this._mediaRecorder=new MediaRecorder(i,s?{mimeType:s}:void 0);const r=this._mediaRecorder.mimeType;this._mediaRecorder.ondataavailable=async i=>{if(this._isAudioDeviceRecordTesting){var s;BY.info("startAudioDeviceRecordTest()","get recorded file(mimeType: ".concat(r,")."));const a=new Blob([i.data],{type:r});try{await this._playAudioFile(DW.createObjectURL(a),{loop:!1})}catch(n){return o(n)}this._startEmitAudioPlaybackDeviceTestVolume(e),null===(s=this._audioElement)||void 0===s||s.addEventListener("ended",(()=>{this.stopAudioDevicePlayTest(),t()})),this._audioCaptureAndRecoderResolve=t}else t()},this._mediaRecorder.onerror=e=>{o(new LS(RS.AUDIO_DEVICE_TEST_FAILED,e.message||"mediaRecorder error"))},this._audioCaptureAndRecoderResolve=t,this._mediaRecorder.start()}))}_stopAudioCaptureAndRecoder(){var e;this._mediaRecorder&&("recording"===this._mediaRecorder.state&&this._mediaRecorder.stop(),delete this._mediaRecorder),null===(e=this._audioTrack)||void 0===e||e.destroy(),delete this._audioTrack}async _setAudioCtxSinkId(){let e=this._audioPlaybackDeviceId;if(e){"default"===e&&(e="");try{var t,i;null===(t=wN.getAudioContextInstance())||void 0===t||null===(i=t.setSinkId)||void 0===i||i.call(t,e),BY.info("setSinkId","ctx.sinkId=".concat(e))}catch(o){BY.error("setSinkId","failed, ".concat(o.name," - ").concat(o.message))}}}}const $Y=()=>({url:"",video:{codec:fm.H264,width:640,height:360,fps:15,gop:2,kBitRate:ew(640,360,15)},audio:{codec:"AAC",kBitRate:64,sampleRate:48e3,channels:2,AACProfile:Zm.LC},layout:{regions:[],appData:"",backgroundColor:"#000000"}});function ew(e,t,i){return e*t<=288e3?i<=15?800:1200:e*t<=864e3?i<=15?1200:1800:e*t<=1152e3?i<=15?1600:2400:e*t<=2592e3?i<=15?2500:3750:i<=15?3300:5e3}function tw(e){if("string"!=typeof e||!/^rtmps?:\/\//.test(e))throw new LS(RS.INVALID_PARAMS,"Invalid rtmp address")}function iw(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(null==e||!e.length)throw new LS(RS.INVALID_PARAMS,"regions should not be empty.");for(const t of e){if("string"!=typeof t.userId)throw new LS(RS.INVALID_PARAMS,"region.userId(".concat(t.userId,") should be a string."));if(wS(t.userId),"boolean"!=typeof t.isScreenStream)throw new LS(RS.INVALID_PARAMS,"region.isScreenStream(".concat(t.isScreenStream,") should be a boolean."))}}function ow(e,t){var i,o;const s=(e,i)=>{const o=e.reduce(((e,t)=>null==e?void 0:e[t]),t),s=e.reduce(((e,t)=>null==e?void 0:e[t]),$Y());return o&&i(o)?o:s},r=e=>e%2==0?e:e+1,n=r(s(["video","width"],(e=>e>=2&&e<=1920))),a=r(s(["video","height"],(e=>e>=2&&e<=1920))),d=s(["video","fps"],(e=>e>=1&&e<=60)),c=(null===(i=t.video)||void 0===i?void 0:i.kBitRate)||0,l=s(["audio","sampleRate"],(e=>!![32e3,44100,48e3].find((t=>t===e||t/1e3===e))));return{type:"transcode",action:e,transcodeMeta:{transcode:{url:t.url},control:{protocol:"2.0"},audio:{codec:s(["audio","codec"],(e=>"AAC"===e)),bitRate:1e3*s(["audio","kBitRate"],(e=>e>=32&&e<=192)),sampleRate:l<100?1e3*l:l,channels:s(["audio","channels"],(e=>[1,2].includes(e))),profile:s(["audio","AACProfile"],(e=>[Zm.LC,Zm.HEv1,Zm.HEv2].includes(e)))},video:{codec:s(["video","codec"],(e=>["H264","H265"].includes(e))),fps:d,gop:s(["video","gop"],(e=>e>=1&&e<=5))*d,bitRate:1e3*(c>=16&&c<=1e4?c:ew(n,a,d)),width:n,height:a},layout:{canvas:{bgnd:s(["layout","backgroundColor"],(e=>/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/.test(e)))},regions:(null===(o=t.layout)||void 0===o||null===(o=o.regions)||void 0===o?void 0:o.map((e=>({alpha:!e.alpha||Number(e.alpha)>1||Number(e.alpha)<=0?1:Number(e.alpha),uid:e.userId,zorder:!e.zorder||Number(e.zorder)<0||Number(e.zorder)>100?0:Number(e.zorder),x:!e.x||Number(e.x)>=1||Number(e.x)<0?0:Number(e.x),y:!e.y||Number(e.y)>=1||Number(e.y)<0?0:Number(e.y),w:!e.w||Number(e.w)>1||Number(e.w)<=0?1:Number(e.w),h:!e.h||Number(e.h)>1||Number(e.h)<=0?1:Number(e.h),renderMode:e.renderMode&&[1,2,3].includes(e.renderMode)?e.renderMode:1,contentControl:e.contentControl&&[0,1,2].includes(e.contentControl)?e.contentControl:0,screen:!!e.isScreenStream}))))||[],app_data:s(["layout","appData"],(e=>"string"==typeof e))}}}}const sw={getDefaultValue:$Y,checkStartParams:function(e){var t;tw(e.url),iw(null===(t=e.layout)||void 0===t?void 0:t.regions)},checkUpdateParams:function(e){var t;e.url&&tw(e.url),iw(null===(t=e.layout)||void 0===t?void 0:t.regions)},getStartParams:function(e){return ow("started",e)},getUpdateParams:function(e){return ow("layoutChanged",e)}};let rw;var nw=WV,aw=wd;Vi({target:"Object",stat:!0},{fromEntries:function(e){var t={};return nw(e,(function(e,i){aw(t,e,i)}),{AS_ENTRIES:!0}),t}});var dw=i($.Object.fromEntries);const cw=["ele","fakeEle"],lw=["orgTrack","mediaTrack","preprocessingTrack"],uw=["orgTrack","mediaTrack","preprocessingTrack"],mw=["currentTime","duration","ended","error","muted","networkState","paused","readyState","seekable","sinkId","src","volume"],hw=["currentTime","sampleRate","state","baseLatency","outputLatency","sinkId"],pw=["contentHint","enabled","id","kind","label","muted","readyState"],bw=["currentDirection","direction","mid","stopped"];let _w;function yw(e){const t={};if(e instanceof MediaStream){t.id=e.id,t.active=e.active;const i=e.getTracks();t.tracks=i.map((e=>dw(pw.map((t=>[t,e[t]])))))}return t}function vw(e){const t=[];let i=[];e&&e._room&&e._room._remoteStreams&&(i=e._room._remoteStreams.values());for(const o of i)o.forEach((e=>{e.audioTrack&&t.push(e.audioTrack)}));e._localAudioTrack&&t.push(e._localAudioTrack),e._localScreenAudioTrack&&t.push(e._localScreenAudioTrack);for(const o of t){if(o._audioLevelFetcher&&o._audioLevelFetcher._ctx)return o._audioLevelFetcher._ctx;if(o._ac)return o._ac;if(o._audioFetchMap&&Array.from(o._audioFetchMap.values()).length)return Array.from(o._audioFetchMap.values())[0]._ctx;if(o._ap&&o._ap._ac)return o._ap._ac}return null}function Sw(e){const t=[];e._localAudioTrack&&t.push({userId:"__local__",mediaType:"audio",isScreen:!1,isPublic:!1,isVirtual:!1,orgTrack:e._localAudioTrack._originTrack,mediaTrack:e._localAudioTrack._mediaTrack,preprocessingTrack:e._localAudioTrack._preProcessingTrack}),e._localScreenAudioTrack&&t.push({userId:"__local__",mediaType:"audio",isScreen:!0,isPublic:!1,isVirtual:!1,orgTrack:e._localScreenAudioTrack._originTrack,mediaTrack:e._localScreenAudioTrack._mediaTrack,preprocessingTrack:e._localScreenAudioTrack._preProcessingTrack}),e._localVideoTrack&&t.push({userId:"__local__",mediaType:"video",isScreen:!1,isPublic:!1,isVirtual:!1,orgTrack:e._localVideoTrack._originTrack,mediaTrack:e._localVideoTrack._mediaTrack,preprocessingTrack:e._localVideoTrack._preProcessingTrack}),e._localScreenVideoTrack&&t.push({userId:"__local__",mediaType:"video",isScreen:!0,isPublic:!1,isVirtual:!1,orgTrack:e._localScreenVideoTrack._originTrack,mediaTrack:e._localScreenVideoTrack._mediaTrack,preprocessingTrack:e._localScreenVideoTrack._preProcessingTrack}),e._room&&e._room._remoteStreams&&e._room._remoteStreams.forEach(((e,i)=>{e.forEach((e=>{e.audioTrack&&t.push({userId:i,mediaType:"audio",isScreen:e.isScreen,isPublic:!1,isVirtual:!1,orgTrack:e.audioTrack._originTrack,mediaTrack:e.audioTrack._mediaTrack}),e.videoTrack&&t.push({userId:i,mediaType:"video",isScreen:e.isScreen,isPublic:!1,isVirtual:!1,orgTrack:e.videoTrack._originTrack,mediaTrack:e.videoTrack._mediaTrack})}))}));let i=e._publicStreamManager;return i||(i=e._outsideRoom),i&&i.remoteStreams&&i.remoteStreams.forEach(((e,i)=>{e.audioTrack&&t.push({userId:i,mediaType:"audio",isScreen:e.isScreen,isPublic:!0,isVirtual:!1,orgTrack:e.audioTrack._originTrack,mediaTrack:e.audioTrack._mediaTrack}),e.videoTrack&&t.push({userId:i,mediaType:"video",isScreen:e.isScreen,isPublic:!0,isVirtual:!1,orgTrack:e.videoTrack._originTrack,mediaTrack:e.videoTrack._mediaTrack})})),e&&e._room&&e._room._virtualStreams&&e._room._virtualStreams.forEach(((e,i)=>{e.audioTrack&&t.push({userId:"virtualStream-".concat(i),mediaType:"audio",isScreen:!1,isPublic:!1,isVirtual:!0,orgTrack:e.audioTrack._originTrack,mediaTrack:e.audioTrack._mediaTrack}),e.videoTrack&&t.push({userId:"virtualStream-".concat(i),mediaType:"video",isScreen:!1,isPublic:!1,isVirtual:!0,orgTrack:e.videoTrack._originTrack,mediaTrack:e.videoTrack._mediaTrack})})),t}async function Zw(e,t){if(!e)return;const i=new MediaStream;i.addTrack(e);const o=t.createMediaStreamSource(i),s=t.createAnalyser();o.connect(s),"suspended"===t.state&&(console.warn(t.state),t.resume());const r=new Uint8Array(2048);s.getByteTimeDomainData(r),await new Promise((e=>{setTimeout(e,50)})),s.getByteTimeDomainData(r),await new Promise((e=>{setTimeout(e,50)}));let n=0;r.forEach((e=>n=Math.max(n,Math.abs(e-128))));const a=n/128*256,d=a>2?a:0;return o.disconnect(),s.disconnect(),d}function fw(e){if(!e)return;const t={track:e.track?e.track.id:void 0,transport:{state:e.transport?e.transport.state:void 0}};return e.transport&&e.transport.iceTransport&&(t.iceTransport={state:e.transport.iceTransport.state,role:e.transport.iceTransport.role,gatheringState:e.transport.iceTransport.gatheringState,component:e.transport.iceTransport.component}),t}async function Tw(e){const t={stats:[],mediaElementStates:[],audioContextStates:[],volumes:[],trackStates:[],tranceiverStates:[]},i=[];return await new Promise((o=>{let s,r=0;const n=()=>{i.push(async function(e){const t=Date.now();let i=[];e._ctx.handler&&e._ctx.handler._peerConnection&&(i=await e._ctx.handler._peerConnection.getStats());const o=[];return i.forEach((e=>{o.push(e)})),{timestamp:t,stats:o}}(e).then((e=>{t.stats.push(e)})),async function(e){const t=Date.now(),i=[];var o;e._videoPlayer&&i.push({userId:"__local__",mediaType:"video",isScreen:!1,isPublic:!1,ele:e._videoPlayer._videoDom}),e._screenPlayer&&i.push({userId:"__local__",mediaType:"video",isScreen:!0,isPublic:!1,ele:e._screenPlayer._videoDom}),e._remoteVideoPlayer&&e._remoteVideoPlayer.forEach(((e,t)=>{i.push({userId:t,mediaType:"video",isScreen:!1,isPublic:!1,ele:e?e._videoDom:void 0})})),e._remoteScreenPlayer&&(null===(o=e._remoteScreenPlayer)||void 0===o||o.forEach(((e,t)=>{i.push({userId:t,mediaType:"video",isScreen:!0,isPublic:!1,ele:e?e._videoDom:void 0})}))),e._remoteAudioPlayer&&e._remoteAudioPlayer.forEach(((e,t)=>{i.push({userId:t,mediaType:"audio",isScreen:!1,isPublic:!1,ele:e?e._audioDom:void 0,fakeEle:e?e._fakeAudioDom:void 0})})),e._remoteScreenAudioPlayer&&e._remoteScreenAudioPlayer.forEach(((e,t)=>{i.push({userId:t,mediaType:"audio",isScreen:!0,isPublic:!1,ele:e?e._audioDom:void 0,fakeEle:e?e._fakeAudioDom:void 0})})),e._publicStreamVideoPlayer&&e._publicStreamVideoPlayer.forEach(((e,t)=>{i.push({userId:t,mediaType:"video",isScreen:!1,isPublic:!0,ele:e?e._videoDom:void 0})})),e._publicStreamAudioPlayer&&e._publicStreamAudioPlayer.forEach(((e,t)=>{i.push({userId:t,mediaType:"audio",isScreen:!1,isPublic:!0,ele:e?e._audioDom:void 0,fakeEle:e?e._fakeAudioDom:void 0})})),e._localVideoTrack&&e._localVideoTrack.videoPlayers&&e._localVideoTrack.videoPlayers.forEach(((e,t)=>{i.push({playerId:t.toString(),userId:"__local__",mediaType:"video",isScreen:!1,isPublic:!1,ele:e._videoDom})})),e._localScreenTrack&&e._localScreenTrack.videoPlayers&&e._localScreenTrack.videoPlayers.forEach(((e,t)=>{i.push({playerId:t.toString(),userId:"__local__",mediaType:"video",isScreen:!0,isPublic:!1,ele:e._videoDom})})),e._room&&e._room._remoteStreams&&e._room._remoteStreams.forEach(((e,t)=>{e.forEach((e=>{if(e.audioTrack){const o=e.audioTrack._audioPlayer;i.push({userId:t,mediaType:"audio",isScreen:e.isScreen,isPublic:!1,ele:o?o._audioDom:void 0,fakeEle:o?o._fakeAudioDom:void 0})}e.videoTrack&&e.videoTrack.videoPlayers&&e.videoTrack.videoPlayers.forEach(((o,s)=>{i.push({playerId:s.toString(),userId:t,mediaType:"video",isScreen:e.isScreen,isPublic:!1,ele:o?o._videoDom:void 0})}))}))}));let s=e._publicStreamManager;return s||(s=e._outsideRoom),s&&s.remoteStreams&&s.remoteStreams.forEach(((e,t)=>{if(e.audioTrack){const o=e.audioTrack._audioPlayer;i.push({userId:t,mediaType:"audio",isScreen:!1,isPublic:!0,ele:o?o._audioDom:void 0,fakeEle:o?o._fakeAudioDom:void 0})}e.videoTrack&&e.videoTrack.videoPlayers&&e.videoTrack.videoPlayers.forEach(((e,o)=>{i.push({playerId:o.toString(),userId:t,mediaType:"video",isScreen:!1,isPublic:!0,ele:e?e._videoDom:void 0})}))})),e&&e._room&&e._room._virtualStreams&&e._room._virtualStreams.forEach(((e,t)=>{if(e.audioTrack){const o=e.audioTrack._audioPlayer;i.push({userId:"virtualStream-".concat(t),mediaType:"audio",isScreen:!1,isPublic:!1,isVirtual:!0,ele:o?o._audioDom:void 0,fakeEle:o?o._fakeAudioDom:void 0})}})),{timestamp:t,elementStats:i.map((e=>{let{ele:t,fakeEle:i}=e,o=Cy(e,cw);const s=Ju({ele:Ju({srcObject:t?yw(t.srcObject):void 0},dw(mw.map((e=>[e,t[e]]))))},o);return i&&(s.fakeEle=Ju({srcObject:yw(i.srcObject)},dw(mw.map((e=>[e,i[e]]))))),s}))}}(e).then((e=>{t.mediaElementStates.push(e)})),async function(e){const t=Date.now(),i=vw(e),o={};return i?(hw.forEach((e=>{o[e]=i[e]})),{timestamp:t,acState:o}):{timestamp:t,acState:void 0}}(e).then((e=>{t.audioContextStates.push(e)})),async function(e){const t=Date.now();if(_w||(_w=new AudioContext),"suspended"===_w.state&&await new Promise((t=>{const i=setTimeout((()=>{console.warn("[RTC_AMBULANCE] AudioContext resume failed, try to find one in RTCEngine"),_w=vw(e),_w&&console.warn("[RTC_AMBULANCE] find AudioContext in RTCEngine success"),t()}),1e3);_w.resume().then((()=>{clearTimeout(i),t()}),(()=>{clearTimeout(i),_w=null,t()}))})),!_w)return void console.error("[RTC_AMBULANCE] get volume is not supported");const i=Sw(e),o=[];return await Promise.all(i.filter((e=>"audio"===e.mediaType)).map((async e=>{let{orgTrack:t,mediaTrack:i,preprocessingTrack:s}=e;const r=Ju({},Cy(e,lw));await Promise.all([Zw(t,_w).then((e=>{r.orgTrackVolume=e})),Zw(i,_w).then((e=>{r.mediaTrackVolume=e})),Zw(s,_w).then((e=>{r.preprocessingTrackVolume=e}))]),o.push(r)}))),{timestamp:t,trackVolumes:o}}(e).then((e=>{t.volumes.push(e)})),async function(e){return{timestamp:Date.now(),trackStates:Sw(e).map((e=>{let{orgTrack:t,mediaTrack:i,preprocessingTrack:o}=e,s=Cy(e,uw);return Ju({orgTrack:t?dw(pw.map((e=>[e,t[e]]))):void 0,mediaTrack:i?dw(pw.map((e=>[e,i[e]]))):void 0,preprocessingTrack:o?dw(pw.map((e=>[e,o[e]]))):void 0},s)}))}}(e).then((e=>{t.trackStates.push(e)})),async function(e){const t=Date.now();let i=[];e._ctx._handler&&e._ctx._handler._peerConnection&&(i=e._ctx._handler._peerConnection.getTransceivers());const o=[];return i.forEach((e=>{const t=Ju({sender:fw(e.sender),receiver:fw(e.receiver)},dw(bw.map((t=>[t,e[t]]))));o.push(t)})),{timestamp:t,tranceiverStates:o}}(e).then((e=>{t.tranceiverStates.push(e)}))),r++,r>=10?Promise.all(i).then((()=>{o()})):(clearTimeout(s),s=setTimeout(n,500))};s=setTimeout(n,500)})),console.log("RTC_AMBULANCE",t),t}class Iw{constructor(){Hu(this,"containers",new WeakSet)}getContainerById(e){return document.getElementById(e)}registerContainer(e){var t;"string"==typeof e&&(e=null!==(t=this.getContainerById(e))&&void 0!==t?t:void 0);return!(!e||this.containers.has(e))&&(this.containers.add(e),!0)}unregisterContainer(e){var t;"string"==typeof e&&(e=null!==(t=this.getContainerById(e))&&void 0!==t?t:void 0);return!!e&&(this.containers.delete(e),!0)}}const gw=["videoStats","audioStats"];var Rw,Xw=Object.defineProperty,Lw=Object.getOwnPropertyDescriptor,Cw=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?Lw(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&Xw(t,i,r),r};const Ww=(Rw=class extends Ig{constructor(e,t,i){var o;super(),o=this,Hu(this,"monitor",void 0),Hu(this,"logger",void 0),Hu(this,"_room",void 0),Hu(this,"_wtnStreamManager",void 0),Hu(this,"_appId",void 0),Hu(this,"_localImgVideoTrack",void 0),Hu(this,"_localImgScreenTrack",void 0),Hu(this,"_localScreenVideoTrack",void 0),Hu(this,"_localScreenAudioTrack",void 0),Hu(this,"_tempMixingAudioTrack",void 0),Hu(this,"_localAudioVolume",100),Hu(this,"_localScreenAudioVolume",100),Hu(this,"_remoteAudioVolume",new Map),Hu(this,"_remoteScreenAudioVolume",new Map),Hu(this,"_localVideoPlayerConfig",{[em.STREAM_INDEX_MAIN]:new Map,[em.STREAM_INDEX_SCREEN]:new Map}),Hu(this,"_remoteVideoPlayerConfig",{[em.STREAM_INDEX_MAIN]:new Map,[em.STREAM_INDEX_SCREEN]:new Map}),Hu(this,"_publicStreamIds",new Map),Hu(this,"_dummyMainImage",void 0),Hu(this,"_dummyScreenImage",void 0),Hu(this,"_trackSourceType",void 0),Hu(this,"_liveTranscodeConfig",void 0),Hu(this,"_startCloudProxyTimestamp",void 0),Hu(this,"_pauseAllSubscribeState",{audio:void 0,video:void 0,resumeAudioStreamIds:{},resumeVideoStreamIds:{}}),Hu(this,"_audioVolumeIndicationTimer",void 0),Hu(this,"_dummyMainTimer",void 0),Hu(this,"_dummyScreenTimer",void 0),Hu(this,"_audioPropertiesReportTimer",null),Hu(this,"_mirrorType",nm.MIRROR_TYPE_RENDER),Hu(this,"_audioMixingManager",void 0),Hu(this,"_pubLock",void 0),Hu(this,"_subLocks",void 0),Hu(this,"_audioCaptureLock",void 0),Hu(this,"_videoCaptureLock",void 0),Hu(this,"_screenCaptureLock",void 0),Hu(this,"_subScreenLocks",void 0),Hu(this,"_rtmClient",void 0),Hu(this,"_messageStatisticsObserver",void 0),Hu(this,"_waitForNewToken",!1),Hu(this,"_originIceConfigRequestUrls",void 0),Hu(this,"_originConfigServerUrls",void 0),Hu(this,"_originLogServerUrl",void 0),Hu(this,"_audioDeviceManager",void 0),Hu(this,"_config",void 0),Hu(this,"_playerVisibilityReportTimer",void 0),Hu(this,"_needClosePreTrack",!1),Hu(this,"_containerCollisionDetector",new Iw),Hu(this,"_ctx",void 0),Hu(this,"_removeDeviceEventHandler",void 0),Hu(this,"_updateMixAudioTrack",(async function(e){var t;let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:km.PLAYOUT_AND_PUBLISH;if(o.logger.info("_updateMixAudioTrack()"),!o._localAudioTrack)return void(e&&(o._tempMixingAudioTrack={track:e,type:i}));e?(o._localAudioTrack.mixType=i,o._localAudioTrack.mixedAudioTrack=e):(delete o._localAudioTrack.mixType,delete o._localAudioTrack.mixedAudioTrack);await(null===(t=o._room)||void 0===t?void 0:t.hasPublished())&&await o._updatePublish(),o._wtnStreamManager._updatePushTrack()})),Hu(this,"_onVideoDeviceStateChange",(e=>{this.safeEmit(Mm.onVideoDeviceStateChanged,e)})),Hu(this,"_onAudioDeviceStateChange",(e=>{this.safeEmit(Mm.onAudioDeviceStateChanged,e)})),Hu(this,"_onAudioMixingMessage",(e=>{this.safeEmit(Mm.onAudioMixingStateChanged,e)})),Hu(this,"_onAudioMixingAutoplayFailed",(e=>{this.safeEmit(Mm.onAutoplayFailed,e)})),Hu(this,"_revokeAutoplayFailedWorkaround",void 0),this.id=t,this._appId=e,this.monitor=mv(t),this._ctx=new RN(t,e,i),this._pubLock=new nN("pubLock"),this._subLocks=new Map,this._subScreenLocks=new Map,this._audioCaptureLock=new nN("audioCap"),this._videoCaptureLock=new nN("videoCap"),this._screenCaptureLock=new nN("screenCap"),this._addDeviceEventHandler(),this._audioDeviceManager=new qY(this._ctx),this._addSignalingEventHandler(),this._wtnStreamManager=new QY(this._ctx),this._addWTNStreamEventHandler(),rT&&(window.__rtc_engine__=this,window["__rtc_engine__".concat(Math.floor(100*Math.random()+1))]=this),this._trackSourceType={video:Ou.VIDEO_SOURCE_TYPE_INTERNAL,screenVideo:Ou.VIDEO_SOURCE_TYPE_INTERNAL,audio:Uu.AUDIO_SOURCE_TYPE_INTERNAL,screenAudio:Uu.AUDIO_SOURCE_TYPE_INTERNAL},this._config=i,this._rtmClient=new PY(this._ctx),this._handleRTMClient(this._rtmClient),this._handleAudioDeviceManager(),this._messageStatisticsObserver=new ov(t),this.logger=new xv("Engine",0,t),Uy(this.id),Ww.hasReportNativeDetector||(this.monitor.reportLongString("NativeDetector",JSON.stringify(LT)),Ww.hasReportNativeDetector=!0),this._playerVisibilityReportTimer=setInterval(this._checkPlayerVisibilityInterval.bind(this),3e4),this._initAutoplayFailedWorkaround()}get appId(){return this._appId}set appId(e){this._appId=e}async updateToken(e){if(this.logger.info("updateToken()","token: %s",e),VS(e,"token"),this._room&&this._waitForNewToken)return this._waitForNewToken=!1,this._room.config.token=e,await this._join(this._room);if(!this._room)throw new LS(RS.UPDATE_TOKEN_BEFORE_JOIN,"update token before join room");await this._room.updateToken(e);const t=[];if(this._room.config.tokenPublishPrivilegeExpired&&this._room.config.isAutoPublish&&this._ctx.visibility&&t.push(this._updatePublish({mediaType:tm.AUDIO_AND_VIDEO})),this._room.config.tokenSubscribePrivilegeExpired){const{isAutoSubscribeAudio:e,isAutoSubscribeVideo:i}=this._room.config,o=(e?tm.AUDIO:0)|(i?tm.VIDEO:0);o&&t.push(this._triedResumeAllRemoteStreams(o,!0))}await Promise.allSettled(t)}async setVideoCaptureDevice(e){if(this.logger.info("setVideoCaptureDevice()","deviceId: %s",e),VS(e,"deviceId"),!this._localVideoTrack)return void this._ctx.videoProfile.setCaptureDeviceId(e);if(Bv&&eS){if(this._localVideoTrack.originTrack.getSettings().deviceId===e)return}const t=this._ctx.videoProfile.getCaptureConfig(e);var i;eS&&Hv&&pS>=85&&pS<=91&&(null===(i=this.localVideoTrack)||void 0===i||i.removePlayerTrack());this._needClosePreTrack=this._needClosePreTrack||pZ,this._needClosePreTrack&&(this._removeLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.destroy(),delete this._localVideoTrack),this.logger.info("setVideoCaptureDevice()","start createCameraVideoTrack...");const o=await vM(this._ctx,t).catch((e=>{if(this._localVideoTrack&&!this._localVideoTrack.dummy)return this.logger.warn("setVideoCaptureDevice()","createCameraVideoTrack failed, stop pre VideoTrack."),this._removeLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.destroy(),delete this._localVideoTrack,vM(this._ctx,t).then((e=>(this._needClosePreTrack=!0,e))).catch((async()=>{this.logger.error("setVideoCaptureDevice()","createCameraVideoTrack failed, rollback.");const t=await vM(this._ctx);throw this._switchTrack(t),e}));throw e}));this.logger.success("setVideoCaptureDevice()","createCameraVideoTrack success."),this._ctx.videoProfile.setCaptureDeviceId(e),this._localVideoTrack&&(this._removeLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.destroy());const s=this._ctx.videoProfile.getContentHint();s&&o.setContentHint(s),await this._switchTrack(o)}async setAudioCaptureDevice(e){var t;if(this.logger.info("setAudioCaptureDevice()","deviceId: %s",e),VS(e,"deviceId"),this._ctx.audioProfileManager.updateConstraints({deviceId:{exact:e}}),!this._localAudioTrack)return;this._localAudioTrack.destroy(),this._removeLocalTrackEvents(this._localAudioTrack);const i=await SM(this._ctx,this._ctx.audioProfileManager.getConstraints());this._initLocalTrackEvents(i),this._localAudioTrack=i,this._localAudioTrack.setVolume(this._localAudioVolume),this._wtnStreamManager._updatePushTrack(),this._room&&null!==(t=this._room.localStream)&&void 0!==t&&t.pubAudio&&await this._updatePublish()}_addDeviceEventHandler(){HN.on(Mm.onVideoDeviceStateChanged,this._onVideoDeviceStateChange),HN.on(Mm.onAudioDeviceStateChanged,this._onAudioDeviceStateChange),this._removeDeviceEventHandler=()=>{HN.off(Mm.onVideoDeviceStateChanged,this._onVideoDeviceStateChange),HN.off(Mm.onAudioDeviceStateChanged,this._onAudioDeviceStateChange)}}_addSignalingEventHandler(){const e=this._ctx.signalingManager;e.on(Vg.ON_CONNECTION_STATE_CHANGE,this._onConnectionStateChange.bind(this)),e.on(Vg.ON_RECONNECT_FAILED,(()=>{this.safeEmit(Mm.onError,{errorCode:RS.RECONNECT_FAILED})})),e.on(Vg.CONNECT_WITH_TCP,(()=>{this.safeEmit(Mm.onIceConnectWithTcp)})),e.on(Vg.JOIN_ROOM_FAILED_PRIVATE_CALLBACK,(e=>{WZ("TURN_ON_JOIN_ROOM_FAILURE_CALLBACK")&&this.safeEmit("onJoinRoomFailedPrivateCallback",e)}))}_addWTNStreamEventHandler(){this._wtnStreamManager.__onResubscribe=e=>{const t=e.stream;t&&(t.audioTrack&&this._updateAudioPlayerState(t),t.videoTrack&&this._updateVideoPlayerState(t))},this._wtnStreamManager.__onRemoteStreamStats=e=>{this.safeEmit(Mm.onPublicStreamStats,e)},this._wtnStreamManager.__onSEIMessageReceived=e=>{this.safeEmit(Mm.onPublicStreamSEIMessageReceived,e)},this._wtnStreamManager.__onPlayerEvents=(e,t,i)=>{this._initPlayerEvents(e,t,i)}}_addHandlerEventHandler(){var e,t,i,o,s,r,n,a,d,c,l,u,m,h,p,b,_,y,v,S,Z,f,T,I,g,R,X,L,C,W,G,V,E,P,k,x,N,M,Y,w,K,H,F,J,O;null===(e=this._room)||void 0===e||e.on(Wg.ON_ADD_STREAM,this._onAddStream.bind(this)),null===(t=this._room)||void 0===t||t.on(Wg.ON_REMOVE_STREAM,this._onRemoveStream.bind(this)),null===(i=this._room)||void 0===i||i.on(Wg.USER_CONNECTION,this._onUserConnection.bind(this)),null===(o=this._room)||void 0===o||o.on(NM.ON_USER_LEAVE,this._onUserLeave.bind(this)),null===(s=this._room)||void 0===s||s.on(NM.ON_ROOM_ERROR,this._onRoomError.bind(this)),null===(r=this._room)||void 0===r||r.on(NM.ON_NETWORK_QUALITY,this._onNetworkQuality.bind(this)),null===(n=this._room)||void 0===n||n.on(Wg.ON_CUSTOM_MESSAGE,this._onCustomMessage.bind(this)),null===(a=this._room)||void 0===a||a.on(Wg.USER_MESSAGE_RECEIVED,this._onUserMessageReceived.bind(this)),null===(d=this._room)||void 0===d||d.on(Wg.USER_BINARY_MESSAGE_RECEIVED,this._onUserBinaryMessageReceived.bind(this)),null===(c=this._room)||void 0===c||c.on(Wg.ON_USER_TOKEN_WILL_EXPIRE,this._onUserTokenWillExpire.bind(this)),null===(l=this._room)||void 0===l||l.on(Wg.ON_TOKEN_PUBLISH_PRIVILEGE_WILL_EXPIRE,this._onUserTokenPublishPrivilegeWillExpire.bind(this)),null===(u=this._room)||void 0===u||u.on(Wg.ON_TOKEN_PUBLISH_PRIVILEGE_DID_EXPIRED,this._onUserTokenPublishPrivilegeDidExpired.bind(this)),null===(m=this._room)||void 0===m||m.on(Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_WILL_EXPIRE,this._onUserTokenSubscribePrivilegeWillExpire.bind(this)),null===(h=this._room)||void 0===h||h.on(Wg.ON_TOKEN_SUBSCRIBE_PRIVILEGE_DID_EXPIRED,this._onUserTokenSubscribePrivilegeDidExpired.bind(this)),null===(p=this._room)||void 0===p||p.on(Wg.POST_PROCESSING_MESSAGE,(e=>{var t;"2.0"===(null==(t=e)?void 0:t.protocol)?this._onStreamMixingEvent({error:e.error,event:e.eventType,message:e.message}):"publicStreamCallback"===e.type?this._onPushPublicStreamResult(e):"transcodeStatusCallback"===e.type&&this._onLiveTranscodingResult(e)})),null===(b=this._room)||void 0===b||b.on(Vg.ON_VENDOR_CONNECTION_STATE_CHANGE,(e=>this.safeEmit(Mm.onVendorConnectionStateChanged,e))),null===(_=this._room)||void 0===_||_.on(NM.RESUBSCRIBE,this._onResubscribe.bind(this)),null===(y=this._room)||void 0===y||y.on(NM.SUBSCRIBE_PUSH_TRACK,this._onSubscribePushTrack.bind(this)),null===(v=this._room)||void 0===v||v.on(NM.REMOVE_PUSH_TRACK,this._onRemovePushTrack.bind(this)),null===(S=this._room)||void 0===S||S.on(NM.ON_PUBLISH_RESULT,(e=>{var t,i,o;e.state===Bu.PUBLISH_SUCC&&(null===(i=this._room)||void 0===i||i.config.setTokenPublishPrivilegeExpired(!1));e.state===Bu.PUBLISH_FAIL&&e.errorCode===RS.TOKEN_NO_PUBLISH_PERMISSION&&(null===(o=this._room)||void 0===o||o.config.setTokenPublishPrivilegeExpired(!0));const s=!(e.retry||null===(t=this._room)||void 0===t||!t.config.isAutoPublish);s&&this.safeEmit(Mm.onAutoPublishResult,e),this.safeEmit(Mm.onPublishResult,{isScreen:e.isScreen,isAutoPublish:s,errorCode:e.errorCode})})),null===(Z=this._room)||void 0===Z||Z.on(NM.ON_SUBSCRIBE_RESULT,(e=>{var t;e.state===Qu.SUBSCRIBE_SUCC&&(null===(t=this._room)||void 0===t||t.config.setTokenSubscribePrivilegeExpired(!1));e.state===Qu.SUBSCRIBE_FAIL&&e.errorCode===RS.TOKEN_NO_SUBSCRIBE_PERMISSION&&this._handleLoseSubscribePrivilege(),this.safeEmit(Mm.onSubscribeResult,{userId:e.userId,isScreen:e.isScreen,isAutoSubscribe:!1,errorCode:e.errorCode})})),null===(f=this._room)||void 0===f||f.on(NM.ON_REMOTE_STREAM_STATS,(e=>{this.safeEmit(Mm.onRemoteStreamStats,e)})),null===(T=this._room)||void 0===T||T.on(NM.ON_LOCAL_STREAM_STATS,(e=>{this.safeEmit(Mm.onLocalStreamStats,e)})),null===(I=this._room)||void 0===I||I.on(NM.ON_SUBTITLE_STATE_CHANGED,(e=>{this.safeEmit(Mm.onSubtitleStateChanged,e)})),null===(g=this._room)||void 0===g||g.on(NM.ON_SUBTITLE_MESSAGE_RECEIVED,(e=>{this.safeEmit(Mm.onSubtitleMessageReceived,e)})),null===(R=this._room)||void 0===R||R.on(NM.ON_USER_PUBLISH_STATE_CHANGE,this._onUserPublishStateChange.bind(this)),null===(X=this._room)||void 0===X||X.on(NM.ON_USER_START_AUDIO_CAPTURE,((e,t)=>{let{userId:i}=e;this._updateAudioPlayerState(t),this.safeEmit(Mm.onUserStartAudioCapture,{userId:i})})),null===(L=this._room)||void 0===L||L.on(NM.ON_USER_STOP_AUDIO_CAPTURE,(e=>{let{userId:t}=e;this.safeEmit(Mm.onUserStopAudioCapture,{userId:t})})),null===(C=this._room)||void 0===C||C.on(NM.ON_USER_START_VIDEO_CAPTURE,(e=>{let{userId:t}=e;this.safeEmit(Mm.onUserStartVideoCapture,{userId:t})})),null===(W=this._room)||void 0===W||W.on(NM.ON_USER_STOP_VIDEO_CAPTURE,(e=>{let{userId:t}=e;this.safeEmit(Mm.onUserStopVideoCapture,{userId:t})})),null===(G=this._room)||void 0===G||G.on(NM.ON_SEI_MESSAGED_RECEIVED,(e=>{this.safeEmit(Mm.onSEIMessageReceived,e)})),null===(V=this._room)||void 0===V||V.on(NM.ON_REMOTE_VIDEO_SIZE_CHANGED,((e,t)=>{this.safeEmit(Mm.onRemoteVideoSizeChanged,e,t)})),null===(E=this._room)||void 0===E||E.on(NM.ON_SIMULCAST_SUBSCRIBE_FALLBACK,(e=>this.safeEmit(Mm.onSimulcastSubscribeFallback,e))),null===(P=this._room)||void 0===P||P.on(NM.ON_VIDEO_STREAM_BANNED,(e=>{this.safeEmit(Mm.onVideoStreamBanned,{uid:e.uid,banned:e.banned})})),null===(k=this._room)||void 0===k||k.on(NM.ON_AUDIO_STREAM_BANNED,(e=>{this.safeEmit(Mm.onAudioStreamBanned,{uid:e.uid,banned:e.banned})})),null===(x=this._room)||void 0===x||x.on(NM.ON_FORWARD_STREAM_ERROR,(e=>{this.safeEmit(Mm.onForwardStreamError,e)})),null===(N=this._room)||void 0===N||N.on(NM.ON_REJOIN_WITH_TCP,(()=>{this.safeEmit(Mm.onRejoinWithTcp)})),null===(M=this._room)||void 0===M||M.on(NM.PUB_RETRY,(e=>{this.safeEmit(Mm.onPublishRetry,e)})),null===(Y=this._room)||void 0===Y||Y.on(NM.SUB_RETRY,(e=>{this.safeEmit(Mm.onSubscribeRetry,e)})),null===(w=this._room)||void 0===w||w.on(NM.VIDEO_TYPE_CHANGE,(e=>{this.safeEmit(Mm.onSEIStreamUpdate,e)})),null===(K=this._room)||void 0===K||K.on(NM.JOIN_SUCCESS,(e=>{this._ctx.isPreConnection||this.safeEmit(Mm.onConnectionStateChanged,{state:e?om.CONNECTION_STATE_RECONNECTED:om.CONNECTION_STATE_CONNECTED})})),null===(H=this._room)||void 0===H||H.on(NM.UPDATE_PUBLISH,(e=>{let{streamIndex:t}=e;t===em.STREAM_INDEX_MAIN?this._updatePublish():t===em.STREAM_INDEX_SCREEN&&this._updateScreenPublish()})),null===(F=this._room)||void 0===F||F.on(NM.ON_LOCAL_STATS_EXCEPTION,(e=>{this.logger.info("local stats exception",JSON.stringify(e)),this.safeEmit(Mm.onLocalStatsException,Ju({},e))})),null===(J=this._room)||void 0===J||J.on(NM.ON_REMOTE_STATS_EXCEPTION,(e=>{this.logger.info("remote stats exception",JSON.stringify(e)),this.safeEmit(Mm.onRemoteStatsException,Ju({},e))})),null===(O=this._room)||void 0===O||O.on(NM.ON_JITTER_STABLED,(e=>{this.safeEmit(Mm.onJitterBufferTargetStabled,Ju({},e))}))}safeEmit(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];if(function(e){const t=WZ("FORCE_ENABLED_REPORT_CALLBACKS");if(null!=t&&t.includes(e))return!0;if(e===Mm.onRemoteStreamStats&&WZ("UPLOAD_REMOTE_STATS"))return!0;return![Mm.onRemoteStreamStats,Mm.onLocalStreamStats,Mm.onAudioVolumeIndication,Mm.onLocalAudioPropertiesReport,Mm.onRemoteAudioPropertiesReport].includes(e)}(e)){if(e===Mm.onRemoteStreamStats){const e=WZ("UPLOAD_REMOTE_STATS"),t=WZ("FORCE_ENABLED_REPORT_CALLBACKS").includes("onRemoteStreamStats"),o=i[0],{videoStats:s,audioStats:r}=o,n=Cy(o,gw);i[0]=Ju({},n),(e&tm.VIDEO||t)&&(i[0].videoStats=s),(e&tm.AUDIO||t)&&(i[0].audioStats=r)}yv(this.id,e,i)}return super.safeEmit(e,...i)}_removeHandlerEventHandler(){var e;null===(e=this._room)||void 0===e||e.removeAllListeners()}async connect(){await this._ctx.signalingManager.connect()}async joinRoom(e,t,i,o){var s,r,n,a,d;if(this.logger.info("joinRoom()","token: %o roomId: %o, userInfo: %o, roomConfig: %o",e,t,i,o),MS(e)||VS(e,"token"),this._room)throw new LS(RS.REPEAT_JOIN,"Already joined");null===(s=this._ctx.monitor)||void 0===s||s.report("rtc_sdk_api_call",{sdk_api_name:"host",message:location.host,error_code:0}),YS(t),function(e){kS(e,"userInfo"),wS(e.userId),MS(e.extraInfo)||VS(e.extraInfo,"userInfo.extraInfo",1,200)}(i);const c=new qM({token:e,roomId:t,userInfo:i},this._ctx);return function(e){kS(e,"roomConfig"),CS(e.isAutoPublish,"roomConfig.isAutoPublish"),CS(e.isAutoSubscribeAudio,"roomConfig.isAutoSubscribeAudio"),CS(e.isAutoSubscribeVideo,"roomConfig.isAutoSubscribeVideo"),MS(e.roomProfileType)||ES(e.roomProfileType,"roomConfig",[ym.communication,ym.chat,ym.chatRoom,ym.coHost,ym.meeting,ym.classRoom])}(c.updateRoomConfig(o)),c.setLiveControlMessage(this._liveTranscodeConfig&&sw.getStartParams(this._liveTranscodeConfig)),this._room=new LY(c,this._ctx),this.monitor.set({rtc_session_id:this._room.config.sessionId}),this._addHandlerEventHandler(),this._ctx.useCloudProxy&&(this._startCloudProxyTimestamp=Date.now()),null===(r=this._localVideoTrack)||void 0===r||r.setUserId(i.userId),null===(n=this._localScreenVideoTrack)||void 0===n||n.setUserId(i.userId),null===(a=this._localAudioTrack)||void 0===a||a.setUserId(i.userId),null===(d=this._localScreenAudioTrack)||void 0===d||d.setUserId(i.userId),(e=>{if(e.extraInfo)try{const t=JSON.parse(e.extraInfo);t.source_language&&["zh","en","ja"].indexOf(t.source_language)}catch(i){}else{var t;const i=(null===(t=navigator.language)||void 0===t?void 0:t.substring(0,2))||"";["zh","en","ja"].indexOf(i)>-1&&(e.extraInfo=JSON.stringify({source_language:i}))}})(i),await this._join(this._room)}async _join(e){try{var t;const i=await e.join();return this._waitForNewToken=!1,this._ctx.audioProfileManager.setRoomId(e.config.roomId),null!==(t=this._room)&&void 0!==t&&t.config.isAutoPublish&&(this._ctx.visibility?this._updatePublish({invokeByJoinRoom:!0,mediaType:tm.AUDIO_AND_VIDEO}).catch((e=>{this.logger.error("_join","_updatePublish failed",e)})):(this.safeEmit(Mm.onAutoPublishResult,{isScreen:!1,state:Bu.PUBLISH_FAIL}),this.safeEmit(Mm.onPublishResult,{isScreen:!1,isAutoPublish:!0,errorCode:RS.NO_PUBLISH_PERMISSION}))),this.monitor.set({rtc_vid:e.config.rtcVid}),Ay(this.id,e.config.roomId),zy(this.id,e.config.userId),i}catch(i){throw i.code===RS.INVALID_TOKEN?this._waitForNewToken=!0:(e.destroy(),this._room===e&&delete this._room),i}}async leaveRoom(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.logger.info("leaveRoom()");const t=this._room;delete this._room,this._ctx.resetPubSubLock(IN.LEAVE),this._ctx.callId=void 0,e?await(null==t?void 0:t.leave(e)):null==t||t.leave(e).catch(),this._removeHandlerEventHandler(),this._subLocks=new Map,this._subScreenLocks=new Map,this._ctx.audioProfileManager.setRoomId(),this._liveTranscodeConfig&&this.stopLiveTranscoding(),null==t||t.destroy(),this._remoteVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((e=>{e.forEach((e=>{const{player:t,renderDom:i}=e;null==t||t.destroy(),this._containerCollisionDetector.unregisterContainer(i)}))})),this._remoteVideoPlayerConfig[em.STREAM_INDEX_MAIN].clear(),this._remoteVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach((e=>{e.forEach((e=>{const{player:t,renderDom:i}=e;null==t||t.destroy(),this._containerCollisionDetector.unregisterContainer(i)}))})),this._remoteVideoPlayerConfig[em.STREAM_INDEX_SCREEN].clear(),this._publicStreamIds=new Map,Ay(this.id,""),zy(this.id,""),this.monitor.set({rtc_session_id:"",rtc_vid:""})}_destroyLocalTrack(){this._localAudioTrack&&(this._removeLocalTrackEvents(this._localAudioTrack),this._localAudioTrack.destroy(),this._localAudioTrack=void 0),this._localVideoTrack&&(this._removeLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.destroy(),this._localVideoTrack=void 0),this._localScreenAudioTrack&&(this._removeLocalTrackEvents(this._localScreenAudioTrack),this._localScreenAudioTrack.destroy(),this._localScreenAudioTrack=void 0),this._localScreenVideoTrack&&(this._removeLocalTrackEvents(this._localScreenVideoTrack),this._localScreenVideoTrack.destroy(),this._localScreenVideoTrack=void 0),this._localImgVideoTrack&&(this._localImgVideoTrack.stop(),this._localImgVideoTrack=void 0),this._localImgScreenTrack&&(this._localImgScreenTrack.stop(),this._localImgScreenTrack=void 0)}destroy(){var e,t,i,o;this.logger.info("destroy()"),this.removeAllListeners(),this._removeHandlerEventHandler(),null===(e=this._removeDeviceEventHandler)||void 0===e||e.call(this),null===(t=this._revokeAutoplayFailedWorkaround)||void 0===t||t.call(this),null===(i=this._room)||void 0===i||i.destroy(),this._room=void 0,this._subLocks=new Map,this._subScreenLocks=new Map,this._audioCaptureLock=new nN("audioCap"),this._videoCaptureLock=new nN("videoCap"),this._screenCaptureLock=new nN("screenCap"),this._pauseAllSubscribeState={audio:void 0,video:void 0,resumeVideoStreamIds:{},resumeAudioStreamIds:{}},this._messageStatisticsObserver.destroy(),this.monitor.destroy(),Dy(this.id),clearInterval(this._audioVolumeIndicationTimer),clearInterval(this._dummyMainTimer),clearInterval(this._dummyScreenTimer),this._audioVolumeIndicationTimer=void 0,this._stopAudioPropertiesReport(),this._destroyLocalTrack(),null===(o=this._audioMixingManager)||void 0===o||o.destroy(),this._rtmClient.destroy(),this._wtnStreamManager.destroy(),this._publicStreamIds=new Map,this._audioDeviceManager.destroy(),this._ctx.destroy(),this._localAudioVolume=100,this._localScreenAudioVolume=100,this._remoteAudioVolume.clear(),this._remoteScreenAudioVolume.clear(),clearInterval(this._playerVisibilityReportTimer),this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((e=>{e.player.destroy()})),this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].clear(),this._localVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach((e=>{e.player.destroy()})),this._localVideoPlayerConfig[em.STREAM_INDEX_SCREEN].clear(),this._remoteVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((e=>{e.forEach((e=>{e.player.destroy()}))})),this._remoteVideoPlayerConfig[em.STREAM_INDEX_MAIN].clear(),this._remoteVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach((e=>{e.forEach((e=>{e.player.destroy()}))})),this._remoteVideoPlayerConfig[em.STREAM_INDEX_SCREEN].clear()}async publishStream(e){this.logger.info("publishStream()","mediaType: %o",e),this._checkMediaType(e),this._assertNotInRoom(),Bf(e)&&!this._localVideoTrack&&this._localImgVideoTrack&&(this._localVideoTrack=await async function(e,t){const i=new DN(e,t,{streamIndex:Yg.MAIN,sourceType:Ng.INTERNAL,isDummy:!0});return await i.isTrackReady,i}(this._ctx,this._localImgVideoTrack)),await this._updatePublish({mediaType:e},!0)}async unpublishStream(e,t){var i;if(this.logger.info("unpublishStream()","mediaType: %o",e),this._checkMediaType(e),this._assertNotInRoom(),t)return null===(i=this._room)||void 0===i?void 0:i.unpublish();await this._updatePublish({mediaType:e,pubState:YM.UNPUB},!0)}async publishScreen(e){this.logger.info("publishScreen()","mediaType: %o",e),this._checkMediaType(e),this._assertNotInRoom();try{Bf(e)&&!this._localScreenVideoTrack&&this._localImgScreenTrack&&(this._localScreenVideoTrack=await async function(e,t){const i=new DN(e,t,{isDummy:!0,streamIndex:Yg.SCREEN,sourceType:Ng.INTERNAL});return await i.isTrackReady,i}(this._ctx,this._localImgScreenTrack)),await this._updateScreenPublish({mediaType:e,pubState:YM.PUB})}catch(oK){throw oK instanceof LS?oK:new LS(RS.UNEXPECTED_ERROR,"unexpected error",oK)}}async unpublishScreen(e){this.logger.info("unpublishScreen()","mediaType: %o",e),this._checkMediaType(e),this._assertNotInRoom(),await this._updateScreenPublish({mediaType:e,pubState:YM.UNPUB})}async subscribeStream(e,t){return this.logger.info("subscribeStream()","userId: %o, mediaType: %o",e,t),this._subscribe(!1,e,t)}async _subscribe(e,t,i){var o;const s=i;if(i===tm.AUDIO&&null!==(o=this._room)&&void 0!==o&&o.config.isMultiChatMode())return void this.logger.warn("subscribeStream()","due to multiChatMode return");const r=this._room.remoteStreams.get(t),n=null==r?void 0:r.find((t=>t.isScreen===e));if(!n)throw new LS(RS.STREAM_NOT_EXIST,"stream not exist");const a=this._pauseAllSubscribeState.audio,d=this._pauseAllSubscribeState.video;this._pauseAllSubscribeState.audio&&(i-=i&tm.AUDIO),this._pauseAllSubscribeState.video&&(i-=i&tm.VIDEO),this.logger.warn("subscribeStream()","due to pauseAll mediaType: %o",i);const{hasSubscribed:c}=n;n.originalMediaType=i;try{var l;await this._room.subscribe(n,i),Qf(i)&&this._updateAudioPlayerState(n),Bf(i)&&this._updateVideoPlayerState(n);let o=0,r=0;if(a!==this._pauseAllSubscribeState.audio&&(this._pauseAllSubscribeState.audio?o|=tm.AUDIO:r|=tm.AUDIO),d!==this._pauseAllSubscribeState.video&&(this._pauseAllSubscribeState.video?o|=tm.VIDEO:r|=tm.VIDEO),o&&this.pauseAllSubscribedStream(o),r&&this.resumeAllSubscribedStream(r),Qf(s)&&(this._pauseAllSubscribeState.resumeAudioStreamIds[n.streamId]=n.streamId),Bf(s)&&(this._pauseAllSubscribeState.resumeVideoStreamIds[n.streamId]=n.streamId),n.audioTrack||n.videoTrack){var u,m;const i=!(e||!(null!==(u=this._room)&&void 0!==u&&u.config.isAutoSubscribeAudio||null!==(m=this._room)&&void 0!==m&&m.config.isAutoSubscribeVideo)),o={userId:t,isScreen:!1,state:Qu.SUBSCRIBE_SUCC};i&&this.safeEmit(Mm.onAutoSubscribeResult,o),this.safeEmit(Mm.onSubscribeResult,{userId:t,isScreen:e,isAutoSubscribe:i})}var h,p;if((null===(l=this._room)||void 0===l||!l.config.isMultiChatMode())&&!c&&Qf(i)&&n.hasAudio)null===(h=n.observer)||void 0===h||h.setSubscribeAudio(!0);if(!c&&Bf(i)&&n.hasVideo)null===(p=n.observer)||void 0===p||p.setSubscribeVideo(!0)}catch(oK){throw oK instanceof LS&&oK.code===RS.TOKEN_NO_SUBSCRIBE_PERMISSION&&this._handleLoseSubscribePrivilege(),oK}}async _handleLoseSubscribePrivilege(){var e;null===(e=this._room)||void 0===e||e.config.setTokenSubscribePrivilegeExpired(!0);try{await this._unSubscribeAllRemoteStreams()}catch(oK){}}async unsubscribeStream(e,t){return this.logger.info("unsubscribeStream()","userId: %o, mediaType: %o",e,t),this._unsubscribe(!1,e,t)}async subscribeScreen(e,t){return this.logger.info("subscribeScreen() userId: %o, mediaType: %o",e,t),this._subscribe(!0,e,t)}async unsubscribeScreen(e,t){return this.logger.info("unsubscribeScreen() userId: %o, mediaType: %o",e,t),this._unsubscribe(!0,e,t)}_unsubscribe(e,t,i,o){var s;if(i===tm.AUDIO&&null!==(s=this._room)&&void 0!==s&&s.config.isMultiChatMode())return void this.logger.warn("subscribeStream()","due to multiChatMode return");const r=this._room.remoteStreams.get(t),n=null==r?void 0:r.find((t=>t.isScreen===e));if(!n)throw new LS(RS.STREAM_NOT_EXIST,"stream not exist");var a;eS&&pS&&pS>=85&&pS<=91&&i!==tm.AUDIO&&(null===(a=n.videoTrack)||void 0===a||a.stopAll());return this._room.unsubscribe(n,i).then((()=>{o||(Qf(i)&&delete this._pauseAllSubscribeState.resumeAudioStreamIds[n.streamId],Bf(i)&&delete this._pauseAllSubscribeState.resumeVideoStreamIds[n.streamId])}))}async setRemoteVideoConfig(e,t){var i;return this.logger.info("setRemoteVideoConfig() userId: %o, remoteVideoConfig: %o",e,t),this._ctx.videoProfile.checkSimulcastApiVersion("old"),wS(e),function(e){if("number"!=typeof(null==e?void 0:e.width)||"number"!=typeof(null==e?void 0:e.height))throw new LS(RS.INVALID_PARAMS,"remoteVideoConfig must contain width, height, frameRate")}(t),this._ctx.videoProfile.setRemoteUserVideoConfig(e,t),null===(i=this._room)||void 0===i?void 0:i.updateSubVideoConfig(e).then((()=>{}))}async setRemoteSimulcastStreamType(e,t){var i;this.logger.info("setRemoteSimulcastStreamType()","userId: %s, streamType: %s",e,t),this._ctx.videoProfile.checkSimulcastApiVersion("new"),wS(e),ES(t,"SimulcastStreamType",[Cm.VIDEO_STREAM_HIGH,Cm.VIDEO_STREAM_MID,Cm.VIDEO_STREAM_LOW]),this._ctx.videoProfile.setRemoteUserVideoConfig(e,t),await(null===(i=this._room)||void 0===i?void 0:i.updateSubVideoConfig(e))}async startVideoCapture(e){var t,i;if(this.logger.info("startVideoCapture()","deviceId: %s",e),MS(e)||VS(e,"deviceId"),e&&this._ctx.videoProfile.setCaptureDeviceId(e),this._trackSourceType.video===Ou.VIDEO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setVideoSourceType as internal first");if(this._localVideoTrack&&!this._localVideoTrack.dummy)throw new LS(RS.REPEAT_CAPTURE,"Has already capture");let o={};const s=await vM(this._ctx),r=this._ctx.videoProfile.getContentHint();r&&s.setContentHint(r),this._initLocalTrackEvents(s),this._localVideoTrack=s;this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((e=>{var t,i;null===(t=this._localVideoTrack)||void 0===t||t.setPlayer(e,this._mirrorType,null===(i=this._config)||void 0===i?void 0:i.autoPlayPolicy,this._initPlayerEvents.bind(this))}));o=s.originTrack.getSettings();const n={width:o.width,height:o.height};if(this._localVideoTrack.resolution=n,this._ctx.videoProfile.__autoResetVideoEncoderConfig(o),setTimeout((()=>this.safeEmit(Mm.onLocalVideoSizeChanged,{streamIndex:em.STREAM_INDEX_MAIN,info:n}))),this._ctx.engineDestroyed)return this._destroyLocalTrack(),o;if(this._wtnStreamManager._updatePushTrack(),!this._room)return o;const{isAutoPublish:a}=this._room.config;return(null!==(t=this._room.localStream)&&void 0!==t&&t.pubVideo||a)&&this._ctx.visibility&&this._updatePublish(),null===(i=this._room.localStream)||void 0===i||null===(i=i.observer)||void 0===i||i.setEnableVideo(!0),o}async getLocalStreamStats(){var e;return await(null===(e=this._room)||void 0===e?void 0:e.getLocalStreamStats())}async stopVideoCapture(){var e,t;if(this.logger.info("stopVideoCapture()"),this._trackSourceType.video===Ou.VIDEO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setVideoSourceType as internal first");if(this._localVideoTrack&&!this._localVideoTrack.dummy){const e=this._ctx.extensionManager.getPluginByName(yN.PRE_PROCESSING,"RTCBeautyExtension");e&&e.emit("stop"),this._removeLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.destroy(),this._localImgVideoTrack?this._localVideoTrack.setTrack(this._localImgVideoTrack,{isDummy:!0}):this._localVideoTrack=void 0}this._wtnStreamManager._updatePushTrack(),this._room&&(null!==(e=this._room.localStream)&&void 0!==e&&e.pubVideo&&await this._updatePublish(),null===(t=this._room.localStream)||void 0===t||null===(t=t.observer)||void 0===t||t.setEnableVideo(!1))}async startAudioCapture(e){var t,i;if(this.logger.info("startAudioCapture()","deviceId: $o",e),MS(e)||VS(e,"deviceId"),e&&this._ctx.audioProfileManager.updateConstraints({deviceId:{exact:e}}),this._trackSourceType.audio===Uu.AUDIO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setAudioSourceType as internal first");if(this._localAudioTrack)throw new LS(RS.REPEAT_CAPTURE,"Has already capture");let o={};const s=await SM(this._ctx,this._ctx.audioProfileManager.getConstraints());o=s.originTrack.getSettings(),this._initLocalTrackEvents(s),this._localAudioTrack=s,this._localAudioTrack.setVolume(this._localAudioVolume);const{frameSize:r,callback:n}=this._ctx._localAudioTrackDumpConfig[em.STREAM_INDEX_MAIN];r&&n&&this._localAudioTrack.setDataFetcher(r,n);const{position:a,volume:d}=this._ctx.earMonitorSettings[em.STREAM_INDEX_MAIN];if(a!==Wm.NONE&&(this._localAudioTrack.play(a),this._localAudioTrack.setPlaybackVolume(d)),this._tempMixingAudioTrack&&(this._localAudioTrack.mixType=this._tempMixingAudioTrack.type,this._localAudioTrack.mixedAudioTrack=this._tempMixingAudioTrack.track,delete this._tempMixingAudioTrack),this._ctx.engineDestroyed)return this._destroyLocalTrack(),o;if(this._wtnStreamManager._updatePushTrack(),!this._room)return o;const{isAutoPublish:c}=this._room.config;return(null!==(t=this._room.localStream)&&void 0!==t&&t.pubAudio||c)&&this._ctx.visibility&&this._updatePublish(),null===(i=this._room.localStream)||void 0===i||null===(i=i.observer)||void 0===i||i.setEnableAudio(!0),o}async stopAudioCapture(){var e,t,i;if(this.logger.info("stopAudioCapture()"),this._trackSourceType.audio===Uu.AUDIO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setAudioSourceType as internal first");this._localAudioTrack&&(this._removeLocalTrackEvents(this._localAudioTrack),this._localAudioTrack.destroy()),this._localAudioTrack=void 0,null===(e=this._audioMixingManager)||void 0===e||e.stopAll(),this._wtnStreamManager._updatePushTrack(),this._room&&(null!==(t=this._room.localStream)&&void 0!==t&&t.pubAudio&&await this._updatePublish(),null===(i=this._room.localStream)||void 0===i||null===(i=i.observer)||void 0===i||i.setEnableAudio(!1))}async startAudioAndVideoCapture(e,t){var i,o,s,r;this.logger.print("startAudioAndVideoCapture","optionsOrAudioDeviceId: $o",e,"videoDeviceId: $o",t);const{audioDeviceId:n,videoDeviceId:a}=function(e,t){let i;return MS(t)||VS(t,"videoDeviceId"),MS(e)||("string"==typeof e?(VS(e,"audioDeviceId"),i=e):(i=null==e?void 0:e.audioDeviceId,t=null==e?void 0:e.videoDeviceId,VS(i,"audioDeviceId"),VS(t,"videoDeviceId"))),{audioDeviceId:i,videoDeviceId:t}}(e,t);if(n&&this._ctx.audioProfileManager.updateConstraints({deviceId:{exact:n}}),this._trackSourceType.video===Ou.VIDEO_SOURCE_TYPE_EXTERNAL||this._trackSourceType.audio===Uu.AUDIO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,this._trackSourceType.video===Ou.VIDEO_SOURCE_TYPE_EXTERNAL?"setVideoSourceType as internal first":"setAudioSourceType as internal first");if(this._localVideoTrack&&!this._localVideoTrack.dummy)throw new LS(RS.REPEAT_CAPTURE,"video has already capture");if(this._localAudioTrack)throw new LS(RS.REPEAT_CAPTURE,"audio has already capture");const d=this._ctx.videoProfile.getCaptureConfig(a);let c={},l={};const{audioTrack:u,videoTrack:m}=await async function(e,t,i){var o,s;let r;new xv("TrackFactory",0,e.id).print("createCameraAndMicrophoneTrack","audioConstraints:",t,"videoConstraints:",i);const n=(null===(o=t.deviceId)||void 0===o?void 0:o.exact)||"default",a=(null===(s=i.deviceId)||void 0===s?void 0:s.exact)||"default",d=ap(),c=ap();try{var l,u,m,h,p,b;null===(l=e.monitor)||void 0===l||l.report("rtc_video_capture_event",{event_type:"start",media_device_id:a,capture_session_id:d}),null===(u=e.monitor)||void 0===u||u.report("rtc_audio_device_event",{device_type:"audio_record",event_type:"start_begin",media_device_id:n,event_session_id:c});const o=Hf();wv&&(i.frameRate={ideal:30,max:30}),e.extensionManager.getPluginByName(yN.PRE_PROCESSING,"RTCAIAnsExtension")&&(t.autoGainControl=!0,t.noiseSuppression=!1),r=await HN.getUserMedia({audio:t,video:i}),null===(m=e.monitor)||void 0===m||m.report("rtc_video_capture_event",{event_type:"start_capture_result",media_device_id:a,media_device_name:(null===(h=r.getVideoTracks()[0])||void 0===h?void 0:h.label)||"",reason:"success",elapse:Hf()-o,capture_session_id:d}),null===(p=e.monitor)||void 0===p||p.report("rtc_audio_device_event",{device_type:"audio_record",event_type:"start_result",media_device_id:n,media_device_name:(null===(b=r.getAudioTracks()[0])||void 0===b?void 0:b.label)||"",reason:"success",elapse:Hf()-o,event_session_id:c})}catch(oK){var _,y;throw null===(_=e.monitor)||void 0===_||_.report("rtc_video_capture_event",{event_type:"running_failed",media_device_id:a,error_code:oK.code,reason:oK.name+oK.message,capture_session_id:d}),null===(y=e.monitor)||void 0===y||y.report("rtc_audio_device_event",{device_type:"audio_record",event_type:"start_end",media_device_id:n,error_code:oK.code,reason:oK.name+oK.message,event_session_id:c}),new LS(RS.GET_VIDEO_TRACK_FAILED,"throw error from getUserMedia. [".concat(oK.name||"unknown name","]: ").concat(oK.message||"unknown message","."),oK)}const v=r.getVideoTracks()[0],S=new DN(e,v,{streamIndex:Yg.MAIN,sourceType:Ng.INTERNAL,captureSessionId:d}),Z=r.getAudioTracks()[0],f=new cM(e,Z,{streamIndex:Yg.MAIN,sourceType:Ng.INTERNAL,captureSessionId:c});return await Promise.all([S.isTrackReady,f.isTrackReady]),{videoTrack:S,audioTrack:f}}(this._ctx,this._ctx.audioProfileManager.getConstraints(),d),h=this._ctx.videoProfile.getContentHint();h&&m.setContentHint(h),a&&this._ctx.videoProfile.setCaptureDeviceId(a),this._initLocalTrackEvents(m),this._localVideoTrack=m;this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((e=>{var t,i;null===(t=this._localVideoTrack)||void 0===t||t.setPlayer(e,this._mirrorType,null===(i=this._config)||void 0===i?void 0:i.autoPlayPolicy,this._initPlayerEvents.bind(this))})),this._initLocalTrackEvents(u),this._localAudioTrack=u,this._localAudioTrack.setVolume(this._localAudioVolume);const{frameSize:p,callback:b}=this._ctx._localAudioTrackDumpConfig[em.STREAM_INDEX_MAIN];p&&b&&this._localAudioTrack.setDataFetcher(p,b),this._tempMixingAudioTrack&&(this._localAudioTrack.mixType=this._tempMixingAudioTrack.type,this._localAudioTrack.mixedAudioTrack=this._tempMixingAudioTrack.track,delete this._tempMixingAudioTrack);let _=m.originTrack;c=_.getSettings();const y={width:c.width||0,height:c.height||0};if(this._localVideoTrack.resolution=y,this._ctx.videoProfile.__autoResetVideoEncoderConfig(c),setTimeout((()=>this.safeEmit(Mm.onLocalVideoSizeChanged,{streamIndex:em.STREAM_INDEX_MAIN,info:y}))),_=u.originTrack,l=_.getSettings(),this._ctx.engineDestroyed)return this._destroyLocalTrack(),{audioTrackSettings:l,videoTrackSettings:c};if(this._wtnStreamManager._updatePushTrack(),!this._room)return{audioTrackSettings:l,videoTrackSettings:c};const{isAutoPublish:v}=this._room.config;return(null!==(i=this._room.localStream)&&void 0!==i&&i.pubVideo||null!==(o=this._room.localStream)&&void 0!==o&&o.pubAudio||v)&&this._ctx.visibility&&this._updatePublish(),null===(s=this._room.localStream)||void 0===s||null===(s=s.observer)||void 0===s||s.setEnableVideo(!0),null===(r=this._room.localStream)||void 0===r||null===(r=r.observer)||void 0===r||r.setEnableAudio(!0),{audioTrackSettings:l,videoTrackSettings:c}}async startVideoAndAudioCapture(e,t){return this.startAudioAndVideoCapture(t,e)}getAudioMixingManager(){return this.logger.info("getAudioMixingManager()","invoke"),this._audioMixingManager||(this._audioMixingManager=new EY({getLocalAudioTrack:()=>this._localAudioTrack,updateLocalAudioTrack:this._updateMixAudioTrack,emitMessage:this._onAudioMixingMessage,onAutoPlayFailed:this._onAudioMixingAutoplayFailed},this.id)),this._audioMixingManager}getWTNStreamManager(){return this._wtnStreamManager}getCallId(){var e;return null===(e=this._ctx)||void 0===e?void 0:e.callId}async startScreenCapture(){var e,t,i;let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.logger.info("startScreenCapture()","config: %o",o),this._trackSourceType.screenVideo===Ou.VIDEO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setVideoSourceType as internal first");if(this._trackSourceType.screenAudio===Uu.AUDIO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setAudioSourceType as internal first");const[s,r]=await ZM(this._ctx,o);null==r||r.setVolume(this._localScreenAudioVolume),this._localScreenVideoTrack&&!this._localScreenVideoTrack.dummy&&(this._removeLocalTrackEvents(this._localScreenVideoTrack),this._localScreenVideoTrack.destroy()),null===(e=this._localScreenAudioTrack)||void 0===e||e.destroy(),delete this._localScreenAudioTrack,this._localScreenVideoTrack=s;const{contentHint:n}=this._ctx.videoProfile.getScreenEncodeConfig();n&&s.setContentHint(n);const a=s.originTrack;setTimeout((()=>{const e=a.getSettings(),t={width:e.width,height:e.height};s.resolution=t,this.safeEmit(Mm.onLocalVideoSizeChanged,{streamIndex:em.STREAM_INDEX_SCREEN,info:{width:e.width,height:e.height}})}),500),r&&(this._localScreenAudioTrack=r,this._initLocalTrackEvents(r));this._localVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach((e=>{var t,i;null===(t=this._localScreenVideoTrack)||void 0===t||t.setPlayer(e,nm.MIRROR_TYPE_NONE,null===(i=this._config)||void 0===i?void 0:i.autoPlayPolicy,this._initPlayerEvents.bind(this))})),this._initLocalTrackEvents(this._localScreenVideoTrack,!0),(null!==(t=this._room)&&void 0!==t&&null!==(t=t.localScreenStream)&&void 0!==t&&t.pubAudio||null!==(i=this._room)&&void 0!==i&&null!==(i=i.localScreenStream)&&void 0!==i&&i.pubVideo)&&await this._updateScreenPublish()}async stopScreenCapture(){var e,t,i,o;this.logger.info("stopScreenCapture()"),null===(e=this._localScreenVideoTrack)||void 0===e||e.stopAll(),this._localScreenVideoTrack&&(this._localScreenVideoTrack.dummy||(this._removeLocalTrackEvents(this._localScreenVideoTrack),this._localScreenVideoTrack.destroy(),this._localImgScreenTrack&&this._localScreenVideoTrack.setTrack(this._localImgScreenTrack,{isDummy:!0}))),this._localScreenAudioTrack&&(this._removeLocalTrackEvents(this._localScreenAudioTrack),this._localScreenAudioTrack.destroy()),this._localScreenAudioTrack=void 0,null!==(t=this._localScreenVideoTrack)&&void 0!==t&&t.dummy||(this._localScreenVideoTrack=void 0),(null!==(i=this._room)&&void 0!==i&&null!==(i=i.localScreenStream)&&void 0!==i&&i.pubAudio||null!==(o=this._room)&&void 0!==o&&null!==(o=o.localScreenStream)&&void 0!==o&&o.pubVideo)&&await this._updateScreenPublish()}setLocalVideoPlayer(e,t){var i;this.logger.info("setLocalVideoPlayer()","streamIndex: %o, videoPlayerOption: %o",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]);const o=e===em.STREAM_INDEX_MAIN?this._localVideoTrack:this._localScreenVideoTrack,s=null!==(i=null==t?void 0:t.playerId)&&void 0!==i?i:ON;if(null==t||!t.renderDom){var r,n;null===(r=this._localVideoPlayerConfig[e].get(s))||void 0===r||null===(r=r.player)||void 0===r||r.destroy(),null==o||o.removePlayer(s);const t=null===(n=this._localVideoPlayerConfig[e].get(s))||void 0===n?void 0:n.renderDom;return this._containerCollisionDetector.unregisterContainer(t),void this._localVideoPlayerConfig[e].delete(s)}HS(t);const a=this._localVideoPlayerConfig[e].get(s);if(!a){var d,c,l;const{renderDom:i}=t;if(!this._containerCollisionDetector.registerContainer(i))return this.monitor.report("rtc_error",{message:"RenderDom is not empty",error_code:rG.DUPLICATE_DOM}),void tT("renderDom is not empty");const r=new nM(this._ctx.id,s,Ju(Ju({},t),{},{isLocal:!0,isScreen:e===em.STREAM_INDEX_SCREEN,userId:null!==(d=t.userId)&&void 0!==d?d:"_local_"})),n=Ju(Ju({},t),{},{player:r});return this._localVideoPlayerConfig[e].set(s,n),null==o||o.setPlayer(n,e===em.STREAM_INDEX_MAIN?this._mirrorType:nm.MIRROR_TYPE_NONE,null===(c=this._config)||void 0===c?void 0:c.autoPlayPolicy,this._initPlayerEvents.bind(this)),null===(l=n.player)||void 0===l?void 0:l.domElement}void 0!==t.renderMode&&(null==o||o.setRenderMode(s,t.renderMode),a.renderMode=t.renderMode)}async startLiveTranscoding(e){var t;this.logger.info("startLiveTranscoding()","transcode: %o",e),sw.checkStartParams(e),this._liveTranscodeConfig=e;const i=null===(t=this._room)||void 0===t?void 0:t.config;if(i&&i.roomId.length+i.userId.length>126)throw new LS(RS.INVALID_PARAMS,"The roomId+userId must be within 126 bytes");try{this.safeEmit(Mm.onStreamMixingEvent,{event:MM.START,error:0,message:""}),this._room&&this._ctx.signalingManager.isConnected()&&await this._room.liveControlMessage(sw.getStartParams(this._liveTranscodeConfig))}catch(oK){throw oK instanceof LS?oK:new LS(RS.UNEXPECTED_ERROR,"unexpected error",oK)}}async updateLiveTranscoding(e){var t,i;if(this.logger.info("updateLiveTranscoding()","transcode: %o",e),!this._liveTranscodeConfig)return;const o=lG({},e);delete o.audio,null===(t=o.video)||void 0===t||delete t.codec,null===(i=o.video)||void 0===i||delete i.gop,sw.checkUpdateParams(o),this._liveTranscodeConfig=lG(this._liveTranscodeConfig,o);try{var s;this.safeEmit(Mm.onStreamMixingEvent,{event:MM.UPDATE,error:0,message:""}),await(null===(s=this._room)||void 0===s?void 0:s.liveControlMessage(sw.getUpdateParams(this._liveTranscodeConfig)))}catch(oK){throw oK instanceof LS?oK:new LS(RS.UNEXPECTED_ERROR,"unexpected error",oK)}}async stopLiveTranscoding(){if(this.logger.info("stopLiveTranscoding()"),this._liveTranscodeConfig){delete this._liveTranscodeConfig;try{var e;this.safeEmit(Mm.onStreamMixingEvent,{event:MM.STOP,error:0,message:""}),await(null===(e=this._room)||void 0===e?void 0:e.liveControlMessage({action:"stopped",type:"transcode"}))}catch(oK){throw oK instanceof LS?oK:new LS(RS.UNEXPECTED_ERROR,"unexpected error",oK)}}}async startSubtitle(e){var t;this.logger.info("startSubtitle()","config: %o",e),this._assertNotInRoom(),await(null===(t=this._room)||void 0===t?void 0:t.startSubtitle(e))}async updateSubtitleConfig(e){var t;this.logger.info("updateSubtitleConfig()","config: %o",e),this._assertNotInRoom(),await(null===(t=this._room)||void 0===t?void 0:t.updateSubtitleConfig(e))}stopSubtitle(){var e;this.logger.info("stopSubtitle()","invoke"),null===(e=this._room)||void 0===e||e.stopSubtitle()}setBusinessId(e){return this.logger.info("setBusinessId()","businessId: %s",e),!function(e){return"string"!=typeof e}(e)&&!this._room&&(this._ctx.businessId=e,!0)}async setUserVisibility(e){var t;if(this.logger.info("setUserVisibility()","enable: %o",e),e=!!e,this._ctx.visibility!==e)if(this._room){var i;if(this._assertNotInRoom(),this._room.localStream)null===(i=this._room.localStream.observer)||void 0===i||i.setPublisher(e);if(!e){const e=await this._pubLock.lock();try{this._room.unpublish(),this._room.unpublishScreen()}finally{e()}}this._ctx.visibility=e;try{await this._room.updateUserAttributes()}catch(o){throw this._ctx.visibility=!e,o}e&&null!==(t=this._room)&&void 0!==t&&t.config.isAutoPublish&&this._updatePublish({mediaType:tm.AUDIO_AND_VIDEO})}else this._ctx.visibility=e}_initPlayerEvents(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const i=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:em.STREAM_INDEX_MAIN)===em.STREAM_INDEX_SCREEN;e.on("playback_event",(o=>{switch(o.eventName){case"timeupdate":if(!e.hasStartPlaying&&e instanceof aM){var s;e.hasStartPlaying=!0;const t=e.userId.replace("_screen",""),o=null===(s=this._room)||void 0===s||null===(s=s.remoteStreams.get(t))||void 0===s?void 0:s.find((e=>e.isScreen===i));setTimeout((()=>{var e;const t={is_screen:i,media_type:"audio",codec:null==o||null===(e=o.getRemoteStreamStats())||void 0===e||null===(e=e.audioStats)||void 0===e?void 0:e.codecType};this.logger.info("remote_audio_playing",JSON.stringify(t)),this.monitor.report("remote_audio_playing",t)}),8e3)}return;case"loadeddata":if("audio"===o.type){var r;const o=e.userId.replace("_screen",""),s=null===(r=this._room)||void 0===r||null===(r=r.remoteStreams.get(o))||void 0===r?void 0:r.find((e=>e.isScreen===i)),n=()=>{t?this.safeEmit(Mm.onFirstPublicStreamAudioFrameDecoded,{publicStreamId:o}):(this.safeEmit(Mm.onAudioFirstFrameDecoded,{userId:o,isScreen:i}),this.safeEmit(Mm.onRemoteAudioFirstFrame,{userId:o,isScreen:i})),this.monitor.report("first_remote_audio_render",{stream_id:"",stream_user_id:o||""},{isScreen:i})};null==s||!s.observer||s.observer.audioFirstFrameReceived?n():s.observer.once("recvAudioFirstFrame",n)}else{const s={userId:e.userId,height:e.videoHeight||0,width:e.videoWidth||0,isScreen:i,playerId:e.playerId};t?(s.publicStreamId=s.userId,delete s.userId,delete s.isScreen,this.safeEmit(Mm.onFirstPublicStreamVideoFrameRendered,s),this.safeEmit(Mm.onFirstPublicStreamVideoFrameDecoded,s)):e.isLocal||(this.safeEmit(Mm.onVideoFirstFrameRendered,s),this.safeEmit(Mm.onVideoFirstFrameDecoded,s),this.safeEmit(Mm.onRemoteVideoFirstFrame,s)),this.monitor.report("first_remote_video_render",{stream_id:"",stream_user_id:o.userId||""},{isScreen:i})}break;case"autoplay-error":{t&&(o.publicStreamId=o.userId),vv(this.id,"autoplay-error",e instanceof nM?"video":"audio",0,o.userId||"");const i={userId:o.userId,kind:e instanceof nM?"video":"audio",mediaType:e instanceof nM?tm.VIDEO:tm.AUDIO,streamIndex:e.isScreen?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN};return e instanceof nM&&(i.playerId=e.playerId===ON?void 0:e.playerId),void this.safeEmit(Mm.onAutoplayFailed,i)}case"playing":{var n;const t=e.userId.replace("_screen",""),s=null===(n=this._room)||void 0===n||null===(n=n.remoteStreams.get(t))||void 0===n?void 0:n.find((e=>e.isScreen===i));"video"===o.type&&setTimeout((()=>{var e,t,o,r,n,a,d,c,l,u;const m={is_screen:i,media_type:"video",codec:null==s||null===(e=s.getRemoteStreamStats())||void 0===e||null===(e=e.videoStats)||void 0===e?void 0:e.codecType,stats_frame_size_width:null==s||null===(t=s.getRemoteStreamStats())||void 0===t||null===(t=t.videoStats)||void 0===t?void 0:t.frameSizeWidth,stats_frame_size_height:null==s||null===(o=s.getRemoteStreamStats())||void 0===o||null===(o=o.videoStats)||void 0===o?void 0:o.frameSizeHeight,stats_frame_rate_decode:null==s||null===(r=s.getRemoteStreamStats())||void 0===r||null===(r=r.videoStats)||void 0===r?void 0:r.decoderOutputFrameRate,stats_frame_rate_receive:null==s||null===(n=s.getRemoteStreamStats())||void 0===n||null===(n=n.videoStats)||void 0===n?void 0:n.receivedFrameRate,stats_frame_decoder_name:null==s||null===(a=s.getRemoteStreamStats())||void 0===a||null===(a=a.videoStats)||void 0===a?void 0:a.decoderName,stats_gpu_url:XZ.GPU_URL||(null===(d=lT())||void 0===d?void 0:d.renderer),track_frame_size_width:null==s||null===(c=s.videoTrack)||void 0===c||null===(c=c.originTrack)||void 0===c?void 0:c.getSettings().width,track_frame_size_height:null==s||null===(l=s.videoTrack)||void 0===l||null===(l=l.originTrack)||void 0===l?void 0:l.getSettings().height,track_frame_rate:null==s||null===(u=s.videoTrack)||void 0===u||null===(u=u.originTrack)||void 0===u?void 0:u.getSettings().frameRate};this.logger.info("remote_video_playing",JSON.stringify(m)),this.monitor.report("remote_video_playing",m)}),8e3);break}}e instanceof nM&&(o.playerId=e.playerId===ON?void 0:e.playerId),this.safeEmit(Mm.onPlayerEvent,o)}))}_initLocalTrackEvents(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];["track-ended","track-mute","track-unmute"].forEach((t=>{e.on(t,(async e=>{this.monitor.report("rtc_error",{message:"track-".concat(t," mediaType: ").concat(e.originTrack.kind),error_code:rG.TRACK_ERROR,capture_session_id:e.captureSessionId,media_type:t,reason:t});let i=!1;e!==this._localScreenAudioTrack&&e!==this._localScreenVideoTrack||(i=!0);const{kind:o}=e.originTrack,s=e.sourceType;this.safeEmit({"track-ended":Mm.onTrackEnded,"track-mute":Mm.onTrackMute,"track-unmute":Mm.onTrackUnmute}[t],{kind:o,isScreen:i}),XZ.DISABLE_IOS_MUTE_WORKAROUND||!$v&&!jv||("track-mute"===t&&(kN.emit(EN.ON_IOS_LOCAL_TRACK_MUTE,o),"audio"===o&&s===Ng.INTERNAL&&(await this.stopAudioCapture(),this.startAudioCapture())),"track-unmute"===t&&kN.emit(EN.ON_IOS_LOCAL_TRACK_UNMUTE,o))}))})),e.on("resolution-change",(e=>{this._ctx.extensionManager.getPluginsByType(yN.PRE_PROCESSING).forEach((i=>{var o;null==i||null===(o=i.applyConstraints)||void 0===o||o.call(i,t?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN,e)})),this.safeEmit(Mm.onLocalVideoSizeChanged,{streamIndex:t?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN,info:e})})),e.on("needReplaceTrack",(()=>{if(e instanceof cM){var t,i;e.stopDataFetcher();const r=this._ctx._localAudioTrackDumpConfig[null!==(t=e.streamIndex)&&void 0!==t?t:em.STREAM_INDEX_MAIN];null!=r&&r.frameSize&&null!=r&&r.callback&&e.setDataFetcher(r.frameSize,r.callback);const{position:n,volume:a}=this._ctx.earMonitorSettings[null!==(i=e.streamIndex)&&void 0!==i?i:em.STREAM_INDEX_MAIN];if(n!==Wm.NONE&&(e.play(n),e.setPlaybackVolume(a)),this._room){const{streamIndex:t}=e;var o,s;if(t===em.STREAM_INDEX_MAIN)null!==(o=this._room.localStream)&&void 0!==o&&o.pubAudio&&this._ctx.visibility&&this._updatePublish();else null!==(s=this._room.localStream)&&void 0!==s&&s.pubAudio&&this._ctx.visibility&&this._updateScreenPublish()}}})),e.on("autoplay-error",(e=>{this.safeEmit(Mm.onAutoplayFailed,e)}))}_removeLocalTrackEvents(e){e.removeAllListeners("track-ended"),e.removeAllListeners("track-mute"),e.removeAllListeners("track-unmute"),e.removeAllListeners("resolution-change")}setRemoteVideoPlayer(e,t){var i,o,s,r,n,a;this.logger.info("setRemoteVideoPlayer()","streamIndex: %o, videoPlayerOption: %o",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),HS(t);const{userId:d}=t,c=e===em.STREAM_INDEX_SCREEN,l=null===(i=this._room)||void 0===i||null===(i=i.remoteStreams.get(d))||void 0===i?void 0:i.find((e=>e.isScreen===c)),u=null==l?void 0:l.videoTrack,m=null!==(o=t.playerId)&&void 0!==o?o:ON;null===(s=this._getRemoteVideoPlayerConfig(e,d,m))||void 0===s||null===(s=s.player)||void 0===s||s.destroy();const h=null===(r=this._getRemoteVideoPlayerConfig(e,d,m))||void 0===r?void 0:r.renderDom;var p;if(this._containerCollisionDetector.unregisterContainer(h),!t.renderDom)return null===(p=this._remoteVideoPlayerConfig[e].get(d))||void 0===p||p.delete(m),void(null==u||u.removePlayer(m));const{renderDom:b}=t;if(!this._containerCollisionDetector.registerContainer(b))return this.monitor.report("rtc_error",{message:"RenderDom is not empty",error_code:rG.DUPLICATE_DOM}),void tT("renderDom is not empty");const _=new nM(this.id,m,Ju(Ju({},t),{},{isLocal:!1,isScreen:c,userId:d,alphaInfo:null==l?void 0:l.attributes.alphaInfo})),y=Ju(Ju({},t),{},{player:_});return this._setRemoteVideoPlayerConfig(e,d,m,y),null==u||u.setPlayer(this.id,y,null===(n=this._config)||void 0===n?void 0:n.autoPlayPolicy,this._initPlayerEvents.bind(this)),l&&this._updateVideoPlayerState(l),null===(a=y.player)||void 0===a?void 0:a.domElement}setLocalVideoMirrorType(e){var t;this.logger.info("setLocalVideoMirrorType()","mirrorType: %o",e),ES(e,"mirrorType",[nm.MIRROR_TYPE_NONE,nm.MIRROR_TYPE_RENDER]),this._mirrorType=e,null===(t=this.localVideoTrack)||void 0===t||t.mirror(!!e)}setRemoteVideoMirrorType(e,t,i){var o;this.logger.info("setRemoteVideoMirrorType()","userId: %s, streamIndex: %o, mirrorType: %o",e,t,i),wS(e),ES(t,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),ES(i,"mirrorType",[nm.MIRROR_TYPE_NONE,nm.MIRROR_TYPE_RENDER]),this._ctx.setUserStreamConf(e,t,{mirrorType:i}),null===(o=this._room)||void 0===o||null===(o=o.remoteStreams.get(e))||void 0===o||null===(o=o.find((e=>e.isScreen===(t===em.STREAM_INDEX_SCREEN))))||void 0===o||null===(o=o.videoTrack)||void 0===o||o.mirror(!!i)}async setAudioPlaybackDevice(e){var t;this.logger.info("setAudioPlaybackDevice()","deviceId: %s",e),VS(e,"deviceId");const i=await this._audioDeviceManager.setSinkId(e);null===(t=this._room)||void 0===t||t.remoteStreams.forEach((t=>{t.forEach((t=>{var i;null===(i=t.audioTrack)||void 0===i||i.setPlaybackDevice(e)}))})),this.safeEmit(Mm.onAudioPlaybackDeviceChanged,i),this.monitor.report("rtc_audio_device",{audio_event:"playout_device_switch",message:JSON.stringify(i),error_code:0})}async play(e){var t;let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:tm.AUDIO_AND_VIDEO,o=arguments.length>2?arguments[2]:void 0,s=arguments.length>3?arguments[3]:void 0;this.logger.info("play()","userId: %s, mediaType: %s, streamIndex: %s",e,i,o);const r=null!=s?s:ON,n=!e||e===this._getUserId()||"local_user"===e,a=void 0===o||o===em.STREAM_INDEX_MAIN,d=void 0===o||o===em.STREAM_INDEX_SCREEN,c=i!==tm.VIDEO,l=i!==tm.AUDIO,u=[];if(n&&l){if(a&&this._localVideoTrack){this._localVideoTrack.mirror(!!this._mirrorType);const e=this._localVideoTrack.play(r);e&&u.push(e)}if(d&&this._localScreenVideoTrack){var m;(null===(m=this._localScreenVideoTrack)||void 0===m?void 0:m.manuallyPlay(r))&&u.push()}}this._audioMixingManager&&e===this._audioMixingManager.id&&u.push(this._audioMixingManager.resumeLocalPlay());let h=[];var p;(null===(t=this._room)||void 0===t||t.remoteStreams.forEach(((t,i)=>{e&&e!==i||t.forEach((e=>{e.audioTrack&&h.push(e.audioTrack),e.videoTrack&&h.push(e.videoTrack)}))})),this._wtnStreamManager.__getRemoteStreams().forEach(((t,i)=>{e&&e!==i||(t.audioTrack&&h.push(t.audioTrack),t.videoTrack&&h.push(t.videoTrack))})),a||(h=h.filter((e=>!!e.isScreen))),d||(h=h.filter((e=>!e.isScreen))),c||(h=h.filter((e=>"audio"!==e.mediaType))),l||(h=h.filter((e=>"video"!==e.mediaType))),c)&&(null===(p=this._room)||void 0===p||p.virtualStreams.forEach((e=>{e.audioTrack&&h.push(e.audioTrack)})));return h.forEach((e=>{const t=e.manuallyPlay(r);t&&u.push(t)})),Promise.all(u).then((()=>{}))}async stop(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:tm.AUDIO_AND_VIDEO,i=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0;this.logger.info("stop()","userId: %s, mediaType: %s, streamIndex: %s, playerId: %s",e,t,i,o);const s=null!=o?o:ON,r=!e||e===this._getUserId()||"local_user"===e,n=void 0===i||i===em.STREAM_INDEX_MAIN,a=void 0===i||i===em.STREAM_INDEX_SCREEN,d=t!==tm.VIDEO,c=t!==tm.AUDIO;if(r&&c&&(n&&this._localVideoTrack&&this._localVideoTrack.pause(s),a&&this._localScreenVideoTrack&&this._localScreenVideoTrack.pause(s)),e){var l;let t=[];null===(l=this._room)||void 0===l||null===(l=l.remoteStreams.get(e))||void 0===l||l.forEach((e=>{e.audioTrack&&t.push(e.audioTrack),e.videoTrack&&t.push(e.videoTrack)}));const i=this._wtnStreamManager.__getPublicStreamTrack(e,"audio"),o=this._wtnStreamManager.__getPublicStreamTrack(e,"video");i&&t.push(i),o&&t.push(o),n||(t=t.filter((e=>!!e.isScreen))),a||(t=t.filter((e=>!e.isScreen))),d||(t=t.filter((e=>"audio"!==e.mediaType))),c||(t=t.filter((e=>"video"!==e.mediaType))),t.forEach((e=>{e.pause(s)}))}}getAudioVolume(e,t){ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]);let i=0;if(t){var o;const s=null===(o=this._room)||void 0===o||null===(o=o.remoteStreams.get(t))||void 0===o||null===(o=o.find((t=>t.isScreen===(e===em.STREAM_INDEX_SCREEN))))||void 0===o?void 0:o.audioTrack;s&&(i=s.getAudioLevel())}else{const t=e===em.STREAM_INDEX_MAIN?this._localAudioTrack:this._localScreenAudioTrack;t&&(i=t.getAudioLevel())}return{linearVolume:i,nonlinearVolume:jf(i)}}setAudioFrameCallback(e,t,i){var o;let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4096;if(this.logger.info("setAudioFrameCallback()","streamIndex: %s, userId: %s, callback: %s, frameSize: %s",e,t,i?"true":"false",s),ES(s,"frameSize",[256,512,1024,2048,4096,8192,16384]),void 0===wN.isWorkletReady&&wN.getAudioContextInstance(),null===wN.isWorkletReady)throw this.logger.error("setAudioFrameCallback()","Not support AudioWorklet"),new LS(RS.NOT_SUPPORTED,"Not support AudioWorklet");t?i?this._ctx._remoteAudioTrackDumpConfig[e].set(t,{callback:i,frameSize:s}):this._ctx._remoteAudioTrackDumpConfig[e].delete(t):this._ctx._localAudioTrackDumpConfig[e]={callback:i,frameSize:i?s:void 0};const r=t?null===(o=this._room)||void 0===o||null===(o=o.remoteStreams.get(t))||void 0===o||null===(o=o.find((t=>t.isScreen===(e===em.STREAM_INDEX_SCREEN))))||void 0===o?void 0:o.audioTrack:e===em.STREAM_INDEX_MAIN?this._localAudioTrack:this._localScreenAudioTrack;r?i?r.setDataFetcher(s,i):r.stopDataFetcher():this.logger.warn("setAudioFrameCallback()","track not found")}async pauseAllSubscribedStream(e){this.logger.info("pauseAllSubscribedStream()","mediaType: %o",e),this._checkMediaType(e);return(()=>{Qf(e)&&(this._pauseAllSubscribeState.audio=!0),Bf(e)&&(this._pauseAllSubscribeState.video=!0)})(),this._room?this._pauseAllRemoteStreams(e):Promise.resolve()}async _pauseAllRemoteStreams(e){if(!this._room)return Promise.resolve();const t=[];return this._room.remoteStreams.forEach((i=>{Array.isArray(i)&&i.forEach((i=>{if(i.hasSubscribed){i.attributes.audiostream&&Qf(e)&&(this._pauseAllSubscribeState.resumeAudioStreamIds[i.streamId]=i.streamId),i.attributes.videostream&&Bf(e)&&(this._pauseAllSubscribeState.resumeVideoStreamIds[i.streamId]=i.streamId);const o=this._unsubscribe(i.isScreen,i.userId,e,!0);o&&t.push(o)}}))})),Promise.all(t).then((()=>{}))}async resumeAllSubscribedStream(e){this.logger.info("resumeAllSubscribedStream()","mediaType: %o",e),this._checkMediaType(e);if((()=>{Qf(e)&&(this._pauseAllSubscribeState.audio=!1),Bf(e)&&(this._pauseAllSubscribeState.video=!1)})(),!this._room)return Promise.resolve();await this._triedResumeAllRemoteStreams(e,!1)}async _triedResumeAllRemoteStreams(e,t){if(!this._room)return Promise.resolve();if(this._pauseAllSubscribeState.audio&&e===tm.AUDIO)return Promise.resolve();if(this._pauseAllSubscribeState.video&&e===tm.VIDEO)return Promise.resolve();if(this._pauseAllSubscribeState.video&&this._pauseAllSubscribeState.audio&&e===tm.AUDIO_AND_VIDEO)return Promise.resolve();const i=[],o=[...Object.keys(this._pauseAllSubscribeState.resumeAudioStreamIds)],s=[...Object.keys(this._pauseAllSubscribeState.resumeVideoStreamIds)];return this._room.remoteStreams.forEach((o=>{Array.isArray(o)&&o.forEach((o=>{if(t&&o.isScreen)return;const s=this._pauseAllSubscribeState.resumeAudioStreamIds[o.streamId],r=this._pauseAllSubscribeState.resumeVideoStreamIds[o.streamId];if(s&&Qf(e)||r&&Bf(e)){const t=this._subscribe(o.isScreen,o.userId,e).then((()=>{s&&Qf(e)&&delete this._pauseAllSubscribeState.resumeAudioStreamIds[o.streamId],r&&Bf(e)&&delete this._pauseAllSubscribeState.resumeVideoStreamIds[o.streamId]}));t&&i.push(t)}}))})),Promise.all(i).then((()=>{var e;return null===(e=this._room)||void 0===e||e.remoteStreams.forEach((e=>{Array.isArray(e)&&e.forEach((e=>{this._updateAudioPlayerState(e),this._updateVideoPlayerState(e)}))})),Promise.resolve()})).finally((()=>{var e;return null!==(e=this._room)&&void 0!==e&&e.config.tokenSubscribePrivilegeExpired&&(o.forEach((e=>{this._pauseAllSubscribeState.resumeAudioStreamIds[e]=e})),s.forEach((e=>{this._pauseAllSubscribeState.resumeVideoStreamIds[e]=e}))),Promise.resolve()}))}async sendUserMessage(e,t){var i;wS(e),this._assertNotInRoom();const o=Date.now();return null===(i=this._room)||void 0===i||null===(i=i.sendUserMessage(e,t))||void 0===i?void 0:i.then((t=>(this._messageStatisticsObserver.countP2PMessage(!0,e,!1,o,t),t.id))).catch((t=>{throw this._messageStatisticsObserver.countP2PMessage(!1,e,!1,o,t),t}))}async sendUserBinaryMessage(e,t){var i;wS(e),xS(t,"message"),this._assertNotInRoom();const o=Date.now();return null===(i=this._room)||void 0===i||null===(i=i.sendUserMessage(e,t))||void 0===i?void 0:i.then((t=>(this._messageStatisticsObserver.countP2PMessage(!0,e,!0,o,t),t.id))).catch((t=>{throw this._messageStatisticsObserver.countP2PMessage(!1,e,!0,o,t),t}))}async sendRoomMessage(e){var t,i;this._assertNotInRoom();const o=null===(t=this._room)||void 0===t?void 0:t.config.roomId,s=Date.now();return null===(i=this._room)||void 0===i||null===(i=i.sendRoomMessage(e))||void 0===i?void 0:i.then((e=>(this._messageStatisticsObserver.countRoomMessage(!0,o,!1,s),e))).catch((e=>{throw this._messageStatisticsObserver.countRoomMessage(!1,o,!1,s),e}))}async sendRoomBinaryMessage(e){var t,i;this._assertNotInRoom();const o=null===(t=this._room)||void 0===t?void 0:t.config.roomId,s=Date.now();return null===(i=this._room)||void 0===i||null===(i=i.sendRoomMessage(e,!0))||void 0===i?void 0:i.then((e=>(this._messageStatisticsObserver.countRoomMessage(!0,o,!0,s),e))).catch((e=>{throw this._messageStatisticsObserver.countRoomMessage(!1,o,!0,s),e}))}async setAudioCaptureConfig(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.logger.info("setAudioCaptureConfig()","config: %o",e),delete e.deviceId,NS(e);await this._shouldUpdateAudioConf("setAudioCaptureConfig")&&this._ctx.audioProfileManager.updateConstraints(e)}async setVideoCaptureConfig(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.logger.info("setVideoCaptureConfig()","config: %o",e),this._setVideoCaptureConfig(e)}async _setVideoCaptureConfig(){var e;let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};delete t.deviceId,NS(t);const i=Ju(Ju({},this._ctx.videoProfile.getCaptureConfig()),t);return this._localVideoTrack&&await this._localVideoTrack.updateVideoCaptureConfig(i),this._ctx.videoProfile.setCaptureConfig(i),(null===(e=this._localVideoTrack)||void 0===e?void 0:e.originTrack.getSettings())||{}}enableSimulcastMode(e){this.logger.info("enableSimulcastMode()","enabled: %o",e),this._ctx.videoProfile.checkSimulcastApiVersion("old");try{return this._ctx.videoProfile.setSimulcastMode(e?Lm.VIDEO_ON_DEMAND:Lm.VIDEO_ONLY_ONE,this._room),!0}catch(t){return!1}}async setLocalSimulcastMode(e,t){var i;this.logger.info("setLocalSimulcastMode()","mode: %o, config: %o",e,t),this._ctx.videoProfile.checkSimulcastApiVersion("new"),await this._ctx.videoProfile.setSimulcastMode(e,this._room),await this._ctx.videoProfile.setSubVideoEncodeConfig(t,this._room,this._localVideoTrack);await(null===(i=this._room)||void 0===i?void 0:i.hasPublished())&&this._updatePublish()}async setVideoEncoderConfig(e){var t;if(this.logger.info("setVideoEncoderConfig()","descriptions: %o",e),await this._ctx.videoProfile.setVideoEncodeConfigPolyfill(e),this._localVideoTrack){const e=this._ctx.videoProfile.getContentHint();e&&this._localVideoTrack.setContentHint(e),await this._localVideoTrack.updateVideoCaptureConfig(this._ctx.videoProfile.getCaptureConfig())}this._updateDummyCaptureImage(em.STREAM_INDEX_MAIN);await(null===(t=this._room)||void 0===t?void 0:t.hasPublished())&&this._updatePublish()}setVideoEncoderAutoConfigList(e){if(Array.isArray(e))return vg(e).call(e,((e,t)=>e.maxKbps-t.maxKbps)),EZ(e)}async setScreenEncoderConfig(e){var t;this.logger.info("setScreenEncoderConfig()","description: %o",e),this._ctx.videoProfile.setScreenEncodeConfig(e),this._localScreenVideoTrack&&("16.1"!==lS&&await this._localScreenVideoTrack.updateVideoCaptureConfig(e),e.contentHint&&this._localScreenVideoTrack.setContentHint(e.contentHint)),this._updateDummyCaptureImage(em.STREAM_INDEX_SCREEN);await(null===(t=this._room)||void 0===t?void 0:t.hasScreenPublished())&&this._updateScreenPublish()}sendSEIMessage(e,t,i){if(this.logger.info("sendSEIMessage()","streamIdex: %o, message: %o, repeatCount: %o",e,t,i),!cZ()&&!dZ())return tT("Your browser does not support sending SEI"),!1;ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),GS(i,"repeatCount",0,30);const o="string"==typeof t?new Uint8Array(Jf.str2ab(t)):t;if(!t.length)return this.logger.warn("sei message must not be empty"),!1;let s;if(e===em.STREAM_INDEX_MAIN){var r,n;if(!(null!==(r=this._room)&&void 0!==r&&null!==(r=r.localStream)&&void 0!==r&&r.pubAudio||null!==(n=this._room)&&void 0!==n&&null!==(n=n.localStream)&&void 0!==n&&n.pubVideo))return;s=this._room.localStream}else{var a,d;if(!(null!==(a=this._room)&&void 0!==a&&null!==(a=a.localScreenStream)&&void 0!==a&&a.pubAudio||null!==(d=this._room)&&void 0!==d&&null!==(d=d.localScreenStream)&&void 0!==d&&d.pubVideo))return;s=this._room.localScreenStream}if(o.byteLength>4096)return void this.logger.warn("sei size must not bigger than 4KB");var c;eS||(null===(c=this._room)||void 0===c||c.maybeFillBackFrame2Stream(s));const l=Kf();return s.sendSEIMessage({content:o,uuid:l,repeatCount:i+1}),setTimeout((async()=>{if(!s)return;if(await s.revokeSEIMessage(l)){const e="timeout for sei message(id: ".concat(l,")");console.error("[RTC WebSDK] ".concat(e)),this.monitor.report("rtc_sdk_callback",{sdk_callback_name:"sendSEIMessageTimeout",message:e,error_code:400})}}),WZ("SEI_TIME_OUT")),l}setAudioVolumeIndicationInterval(e){this.logger.info("setAudioVolumeIndicationInterval()","interval %o: ",e),("number"!=typeof e||e<200)&&(e=200);let t=[];this._audioVolumeIndicationTimer&&clearInterval(this._audioVolumeIndicationTimer),this._audioVolumeIndicationTimer=setInterval((()=>{var e,i;t=[],null===(e=this._room)||void 0===e||e.remoteStreams.forEach(((e,i)=>{var o;if(0===e.length)return;const s=e.find((e=>!e.isScreen)),r=null==s||null===(o=s.audioTrack)||void 0===o?void 0:o.getAudioLevel();t.push({userId:i,volume:r||0})}));const o=null===(i=this._localAudioTrack)||void 0===i?void 0:i.getAudioLevel();t.push({userId:this._getUserId(),volume:o||0}),this.safeEmit(Mm.onAudioVolumeIndication,{speakers:t})}),e)}_sendActiveSpeaker(e,t){if(this._room&&this._room.remoteUsers.size>=1){const i=e[0],o=t.reduce(((e,t)=>e&&e.audioPropertiesInfo.nonlinearVolume>t.audioPropertiesInfo.nonlinearVolume?e:t),void 0);let s;if(s=i?o?i.audioPropertiesInfo.nonlinearVolume>o.audioPropertiesInfo.nonlinearVolume?i:o:i:o,s&&s.audioPropertiesInfo.nonlinearVolume>-35){let e;e=s.streamKey?this._room.remoteUsers.get(s.streamKey.userId):this._room.config.userInfo,e&&this.safeEmit(Mm.onActiveSpeaker,{userId:e.userId,extraInfo:e.extraInfo})}}}enableAudioPropertiesReport(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.logger.info("enableAudioPropertiesReport()","config %o: ",e);const{enableInBackground:t=!0,localMainReportMode:i=am.NORMAL,audioReportMode:o=dm.MICROPHONE}=e;let{interval:s=100}=e;this._stopAudioPropertiesReport(),s<=0||(s=Math.max(100,s),this._audioPropertiesReportTimer=self.setInterval((()=>{if(!t&&"hidden"===document.visibilityState)return;const e=[],s=this._audioDeviceManager.getRecordTrack()||this._localAudioTrack;if(s){var r;const t=null===(r=this._room)||void 0===r||null===(r=r.localStream)||void 0===r?void 0:r.audioHasPublish,n=!!this._audioDeviceManager.getRecordTrack(),a=s.getAudioLevel(o),d=jf(a),c={streamIndex:em.STREAM_INDEX_MAIN,audioPropertiesInfo:{linearVolume:a,nonlinearVolume:d}};if(t||n)e.push(c);else switch(i){case am.DISCONNECT:break;case am.RESET:c.audioPropertiesInfo.linearVolume=0,c.audioPropertiesInfo.nonlinearVolume=-127,e.push(c);break;case am.NORMAL:e.push(c);break;default:throw new LS(RS.INVALID_PARAMS,"invalid localMainReportMode: ".concat(i," in config"))}}if(this._localScreenAudioTrack){const t=this._localScreenAudioTrack.getAudioLevel();e.push({streamIndex:em.STREAM_INDEX_SCREEN,audioPropertiesInfo:{linearVolume:t,nonlinearVolume:jf(t)}})}if(this.safeEmit(Mm.onLocalAudioPropertiesReport,e),this._room){const t=[];if(this._room.config.isMultiChatMode()){this._room.getActiveSpeakerInMultiChatMode().forEach((e=>{var i,o;const s=255*e.audioLevel;t.push({streamKey:{userId:e.userId,streamIndex:em.STREAM_INDEX_MAIN,roomId:null!==(i=null===(o=this._room)||void 0===o?void 0:o.config.roomId)&&void 0!==i?i:""},audioPropertiesInfo:{linearVolume:s,nonlinearVolume:jf(s)}})}))}else this._room.remoteStreams.forEach(((e,i)=>{e.forEach((e=>{if(e.audioTrack){var o,s;const r=e.audioTrack.getAudioLevel();t.push({streamKey:{userId:i,streamIndex:e.isScreen?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN,roomId:null!==(o=null===(s=this._room)||void 0===s?void 0:s.config.roomId)&&void 0!==o?o:""},audioPropertiesInfo:{linearVolume:r,nonlinearVolume:jf(r)}})}}))}));this.safeEmit(Mm.onRemoteAudioPropertiesReport,t),this._sendActiveSpeaker(e,t.filter((e=>e.streamKey.streamIndex!==em.STREAM_INDEX_SCREEN)))}}),s))}async setVideoSourceType(e,t){this.logger.print("setVideoSourceType()","index: %o, videoSourceType: %o",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),ES(t,"VideoSourceType",[Ou.VIDEO_SOURCE_TYPE_EXTERNAL,Ou.VIDEO_SOURCE_TYPE_INTERNAL]);const i=e===em.STREAM_INDEX_MAIN?"video":"screenVideo";if(this._trackSourceType[i]!==t){if(this._trackSourceType[i]=t,this.logger.print("setVideoSourceType","set ".concat(i," source type to ").concat(t)),this._localVideoTrack&&e===em.STREAM_INDEX_MAIN){var o,s,r;let e=!1;if(t===Ou.VIDEO_SOURCE_TYPE_EXTERNAL){e=!0;const t=this._ctx.extensionManager.getPluginByName(yN.PRE_PROCESSING,"RTCBeautyExtension");t&&t.emit("stop"),this._removeLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.destroy()}null===(o=this._localVideoTrack)||void 0===o||o.destroy(),this._localVideoTrack=void 0;const i=null===(s=this._room)||void 0===s?void 0:s.config.isAutoPublish;var n,a;if(e)null===(n=this._room)||void 0===n||null===(n=n.localStream)||void 0===n||null===(n=n.observer)||void 0===n||n.setEnableVideo(!1);else null===(a=this._room)||void 0===a||null===(a=a.localStream)||void 0===a||null===(a=a.observer)||void 0===a||a.setPushVideo(!1);(null!==(r=this._room)&&void 0!==r&&null!==(r=r.localStream)&&void 0!==r&&r.pubVideo||i)&&await this._updatePublish()}if(this._localScreenVideoTrack&&e===em.STREAM_INDEX_SCREEN){var d,c;let e=!1;var l,u;if(t===Ou.VIDEO_SOURCE_TYPE_EXTERNAL&&(e=!0,this._removeLocalTrackEvents(this._localScreenVideoTrack),this._localScreenVideoTrack.destroy()),null===(d=this._localScreenVideoTrack)||void 0===d||d.destroy(),this._localScreenVideoTrack=void 0,e)null===(l=this._room)||void 0===l||null===(l=l.localScreenStream)||void 0===l||null===(l=l.observer)||void 0===l||l.setEnableVideo(!1);else null===(u=this._room)||void 0===u||null===(u=u.localScreenStream)||void 0===u||null===(u=u.observer)||void 0===u||u.setPushVideo(!1);null!==(c=this._room)&&void 0!==c&&null!==(c=c.localScreenStream)&&void 0!==c&&c.pubVideo&&await this._updateScreenPublish()}}}async setExternalVideoTrack(e,t){if(this.logger.print("setExternalVideoTrack()","index: %o, track: %o",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),PS(t),e===em.STREAM_INDEX_MAIN){var i,o;if(this._trackSourceType.video!==Ou.VIDEO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setVideoSourceType as external first");this._localVideoTrack=await async function(e,t){const i=new DN(e,t,{streamIndex:Yg.MAIN,sourceType:Ng.EXTERNAL});return await i.isTrackReady,i}(this._ctx,t);const e=this._ctx.videoProfile.getContentHint();!t.contentHint&&e&&this._localVideoTrack.setContentHint(e),this._initLocalTrackEvents(this._localVideoTrack),this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((e=>{var t,i;null===(t=this._localVideoTrack)||void 0===t||t.setPlayer(e,this._mirrorType,null===(i=this._config)||void 0===i?void 0:i.autoPlayPolicy,this._initPlayerEvents.bind(this))}));const s=null===(i=this._room)||void 0===i?void 0:i.config.isAutoPublish;(null!==(o=this._room)&&void 0!==o&&null!==(o=o.localStream)&&void 0!==o&&o.pubVideo||s)&&await this._updatePublish()}if(e===em.STREAM_INDEX_SCREEN){var s,r;if(this._trackSourceType.screenVideo!==Ou.VIDEO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setVideoSourceType as external first");this._localScreenVideoTrack=await async function(e,t){const i=new DN(e,t,{sourceType:Ng.EXTERNAL,streamIndex:Yg.SCREEN});return await i.isTrackReady,i}(this._ctx,t),this._initLocalTrackEvents(this._localScreenVideoTrack,!0),this._localVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach((e=>{var t,i;null===(t=this._localScreenVideoTrack)||void 0===t||t.setPlayer(e,this._mirrorType,null===(i=this._config)||void 0===i?void 0:i.autoPlayPolicy,this._initPlayerEvents.bind(this))})),null===(s=this._room)||void 0===s||null===(s=s.localScreenStream)||void 0===s||null===(s=s.observer)||void 0===s||s.setPushVideo(!0),null!==(r=this._room)&&void 0!==r&&null!==(r=r.localScreenStream)&&void 0!==r&&r.pubVideo&&await this._updateScreenPublish()}}async setAudioSourceType(e,t){this.logger.print("setAudioSourceType()","index: %o, audioSourceType: %o",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),ES(t,"audioSourceType",[Uu.AUDIO_SOURCE_TYPE_EXTERNAL,Uu.AUDIO_SOURCE_TYPE_INTERNAL]);const i=e===em.STREAM_INDEX_MAIN?"audio":"screenAudio";if(this._trackSourceType[i]!==t){if(this._trackSourceType[i]=t,this.logger.print("setVideoSourceType","set ".concat(i," source type to ").concat(t)),this._localAudioTrack&&e===em.STREAM_INDEX_MAIN){var o,s;let e=!1;this._trackSourceType.audio===Uu.AUDIO_SOURCE_TYPE_EXTERNAL&&(e=!0,this._removeLocalTrackEvents(this._localAudioTrack),this._localAudioTrack.destroy()),this._localAudioTrack=void 0;const t=null===(o=this._room)||void 0===o?void 0:o.config.isAutoPublish;var r,n;if(e)null===(r=this._room)||void 0===r||null===(r=r.localStream)||void 0===r||null===(r=r.observer)||void 0===r||r.setEnableAudio(!1);else null===(n=this._room)||void 0===n||null===(n=n.localStream)||void 0===n||null===(n=n.observer)||void 0===n||n.setPushAudio(!1);(null!==(s=this._room)&&void 0!==s&&null!==(s=s.localStream)&&void 0!==s&&s.pubAudio||t)&&await this._updatePublish()}if(this._localScreenAudioTrack&&e===em.STREAM_INDEX_SCREEN){var a;let e=!1;var d,c;if(this._trackSourceType.audio===Uu.AUDIO_SOURCE_TYPE_EXTERNAL&&(e=!0,this._removeLocalTrackEvents(this._localScreenAudioTrack),this._localScreenAudioTrack.destroy()),this._localScreenAudioTrack=void 0,e)null===(d=this._room)||void 0===d||null===(d=d.localScreenStream)||void 0===d||null===(d=d.observer)||void 0===d||d.setEnableAudio(!1);else null===(c=this._room)||void 0===c||null===(c=c.localScreenStream)||void 0===c||null===(c=c.observer)||void 0===c||c.setPushAudio(!1);null!==(a=this._room)&&void 0!==a&&null!==(a=a.localScreenStream)&&void 0!==a&&a.pubAudio&&await this._updateScreenPublish()}}}async setExternalAudioTrack(e,t){if(this.logger.print("setExternalAudioTrack()","index: %o, track: %o",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),PS(t),e===em.STREAM_INDEX_MAIN){var i,o,s;if(this._trackSourceType.audio!==Uu.AUDIO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setAudioSourceType as external first");this._localAudioTrack=await async function(e,t){const i=new cM(e,t,{streamIndex:Yg.MAIN,sourceType:Ng.EXTERNAL});return await i.isTrackReady,i}(this._ctx,t),this._localAudioTrack.setVolume(this._localAudioVolume),this._initLocalTrackEvents(this._localAudioTrack);const e=this._ctx._localAudioTrackDumpConfig[em.STREAM_INDEX_MAIN];e.frameSize&&e.callback&&this._localAudioTrack.setDataFetcher(e.frameSize,e.callback);const{position:r,volume:n}=this._ctx.earMonitorSettings[em.STREAM_INDEX_MAIN];r!==Wm.NONE&&(this.setEarMonitorMode(em.STREAM_INDEX_MAIN,r),this.setEarMonitorVolume(em.STREAM_INDEX_MAIN,n));const a=null===(i=this._room)||void 0===i?void 0:i.config.isAutoPublish;null===(o=this._room)||void 0===o||null===(o=o.localStream)||void 0===o||null===(o=o.observer)||void 0===o||o.setPushAudio(!0),(null!==(s=this._room)&&void 0!==s&&null!==(s=s.localStream)&&void 0!==s&&s.pubAudio||a)&&await this._updatePublish()}if(e===em.STREAM_INDEX_SCREEN){var r,n;if(this._trackSourceType.screenAudio!==Uu.AUDIO_SOURCE_TYPE_EXTERNAL)throw new LS(RS.STREAM_TYPE_NOT_MATCH,"setAudioSourceType as external first");this._localScreenAudioTrack=await async function(e,t){const i=new cM(e,t,{sourceType:Ng.EXTERNAL,streamIndex:Yg.SCREEN});return await i.isTrackReady,i}(this._ctx,t),this._localScreenAudioTrack.setVolume(this._localScreenAudioVolume),this._initLocalTrackEvents(this._localScreenAudioTrack);const e=this._ctx._localAudioTrackDumpConfig[em.STREAM_INDEX_SCREEN];e.frameSize&&e.callback&&this._localScreenAudioTrack.setDataFetcher(e.frameSize,e.callback);const{position:i,volume:o}=this._ctx.earMonitorSettings[em.STREAM_INDEX_SCREEN];i!==Wm.NONE&&(this.setEarMonitorMode(em.STREAM_INDEX_SCREEN,i),this.setEarMonitorVolume(em.STREAM_INDEX_SCREEN,o)),null===(r=this._room)||void 0===r||null===(r=r.localScreenStream)||void 0===r||null===(r=r.observer)||void 0===r||r.setPushAudio(!0),null!==(n=this._room)&&void 0!==n&&null!==(n=n.localScreenStream)&&void 0!==n&&n.pubAudio&&await this._updateScreenPublish()}}async login(e,t){return this.logger.info("login()","token: %o, userInfo: %o",e,t),MS(e)||VS(e,"token"),wS(t),this._rtmClient.login(e,t)}async logout(){return this.logger.info("logout()"),this._rtmClient.logout()}async updateLoginToken(e){return this.logger.info("updateLoginToken()","token: %o",e),MS(e)||VS(e,"token"),this._rtmClient.updateLoginToken(e)}async getPeerOnlineStatus(e){return this.logger.info("getPeerOnlineStatus()","userId: %o",e),wS(e),this._rtmClient.getPeerOnlineStatus(e)}async sendUserMessageOutsideRoom(e,t){wS(e);const i=Date.now();return this._rtmClient.sendUserMessageOutsideRoom(e,t).then((t=>(this._messageStatisticsObserver.countUserMessageOutsideRoom(!0,e,!1,i,t),t.id))).catch((t=>{throw this._messageStatisticsObserver.countUserMessageOutsideRoom(!1,e,!1,i,t),t}))}async sendUserBinaryMessageOutsideRoom(e,t){wS(e),xS(t,"message");const i=Date.now();return this._rtmClient.sendUserMessageOutsideRoom(e,t).then((t=>(this._messageStatisticsObserver.countUserMessageOutsideRoom(!0,e,!0,i,t),t.id))).catch((t=>{throw this._messageStatisticsObserver.countUserMessageOutsideRoom(!1,e,!0,i,t),t}))}async setServerParams(e,t){return this.logger.info("setServerParams()","signature: %o, url: %0",e,t),this._rtmClient.setServerParams(e,t)}async sendServerMessage(e){VS(e,"message");const t=Date.now();return this._rtmClient.sendServerMessage(e).then((e=>{this._messageStatisticsObserver.countServerMessage(!0,!1,t,e)})).catch((e=>{throw this._messageStatisticsObserver.countServerMessage(!1,!1,t,e),e}))}async sendServerBinaryMessage(e){xS(e,"message");const t=Date.now();return this._rtmClient.sendServerMessage(e).then((e=>{this._messageStatisticsObserver.countServerMessage(!0,!0,t,e)})).catch((e=>{throw this._messageStatisticsObserver.countServerMessage(!1,!0,t,e),e}))}startCloudProxy(e){if(this._room)throw new LS(RS.START_CLOUD_PROXY_AFTER_JOIN,"[startCloudProxy] should be invoke before join room ");if(this.logger.info("startCloudProxy()",e),VS(e.logProxy,"logProxy"),Array.isArray(e.accessProxy))for(const t of e.accessProxy)VS(t,"accessProxy");else VS(e.accessProxy,"accessProxy");VS(e.configProxy,"configProxy"),this._originIceConfigRequestUrls=WZ("ICE_CONFIG_REQUEST_URLS"),this._originLogServerUrl=WZ("LOG_SERVER_URL"),this._originConfigServerUrls=WZ("CONFIG_REQUEST_DOMAINS"),CZ("ICE_CONFIG_REQUEST_URLS",e.accessProxy),CZ("LOG_SERVER_URL",function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?(/^https?:\/\/.+/.test(e)||(e="https://".concat(e)),"".concat(e,"/video/v1/webrtc_log/")):""}(e.logProxy)),CZ("CONFIG_REQUEST_DOMAINS",[e.configProxy]),TS.clearAccessNode(this._appId),TS.clearAccessUrls(),this._ctx.useCloudProxy=!0}stopCloudProxy(){var e,t,i;if(this._room)throw new LS(RS.STOP_CLOUD_PROXY_BEFORE_LEAVE,"[stopCloudProxy] should be invoke after leave room ");this.logger.info("stopCloudProxy()");const o=null===(e=this._originIceConfigRequestUrls)||void 0===e?void 0:e.map((e=>e.replace("https://","").replace("/dispatch/v1/AccessInfo?Action=GetAccessInfo","")));CZ("ICE_CONFIG_REQUEST_URLS",null!=o?o:[]),CZ("LOG_SERVER_URL",null!==(t=this._originLogServerUrl)&&void 0!==t?t:""),CZ("CONFIG_REQUEST_DOMAINS",null!==(i=this._originConfigServerUrls)&&void 0!==i?i:[]),TS.clearAccessNode(this._appId),TS.clearAccessUrls(),this._ctx.useCloudProxy=!1,this._startCloudProxyTimestamp=void 0}async startPushPublicStream(e,t){var i,o;if(this.logger.print("startPushPublicStream()","publicStreamId: %o, publicStreamParam: %o",e,t),KS(e),this._assertNotInRoom(),this._publicStreamIds.get(e))throw new LS(RS.REPEAT_PUSH,"repeat push public media stream");this._room&&(null===(o=t.layout)||void 0===o||null===(o=o.regions)||void 0===o||o.map((e=>{var t;e.roomId=null===(t=this._room)||void 0===t?void 0:t.config.roomId})));const s=GZ(e,"started",t);return null===(i=this._room)||void 0===i||null===(i=i.publicStreamControlMessage(s))||void 0===i?void 0:i.then((()=>{this._publicStreamIds.set(e,e)}))}async updatePublicStreamParam(e,t){var i;this.logger.print("startPushPublicStream()","publicStreamId: %o, publicStreamParam: %o",e,t),KS(e),this._assertNotInRoom();const o=GZ(e,"layoutChanged",t);return null===(i=this._room)||void 0===i?void 0:i.publicStreamControlMessage(o)}async stopPushPublicStream(e){var t;return this.logger.print("startPushPublicStream()","publicStreamId: %o",e),KS(e),this._assertNotInRoom(),null===(t=this._room)||void 0===t?void 0:t.publicStreamControlMessage({type:"publicstream",action:"stopped",publicStreamID:e}).then((()=>{this._publicStreamIds.delete(e)}))}async startPlayPublicStream(e){await this._wtnStreamManager.startPlayWTN(null,e,!1,!1)}async stopPlayPublicStream(e){await this._wtnStreamManager.stopPlayWTN(e)}async setAudioProfile(e){this.logger.info("setAudioProfile()","profile: %o",e);await this._shouldUpdateAudioConf("setAudioProfile")&&this._ctx.audioProfileManager.setAudioProfile(e)}async setAudioEncodeMaxBitrate(e){if(this.logger.print("setAudioEncodeMaxBitrate()",e),GS(e,"maxBitrate",6,256),this._ctx.audioProfileManager.setCustomMaxBitrate(e),this._ctx.audioProfileManager.customMaxBitrate){var t,i,o,s;if(wv&&(null!==(t=this._room)&&void 0!==t&&null!==(t=t.localStream)&&void 0!==t&&t.pubAudio||null!==(i=this._room)&&void 0!==i&&null!==(i=i.localScreenStream)&&void 0!==i&&i.pubAudio))throw new LS(RS.NOT_SUPPORTED,"Your browser does not support set audio encode maxBitrate dynamically.");await(null===(o=this._room)||void 0===o?void 0:o.setAudioEncodeMaxBitrate(em.STREAM_INDEX_MAIN,e)),await(null===(s=this._room)||void 0===s?void 0:s.setAudioEncodeMaxBitrate(em.STREAM_INDEX_SCREEN,e))}}setPublicStreamVideoPlayer(e,t){return this._wtnStreamManager.setWTNRemoteVideoPlayer(e,t)}async setDummyCaptureImagePath(e,t){return new Promise(((i,o)=>{VS(t,"filePath");const s=new Image;s.crossOrigin="anonymous",s.src=t,s.onload=()=>{e===em.STREAM_INDEX_MAIN?this._dummyMainImage=s:this._dummyScreenImage=s;try{this._updateDummyCaptureImage(e),i()}catch(t){o(new LS(RS.UNEXPECTED_ERROR,t.message))}},s.onerror=()=>{o(new LS(RS.UNEXPECTED_ERROR,"Load image error"))}}))}_updateDummyCaptureImage(e){let t,i;if(e===em.STREAM_INDEX_MAIN?(t=this._dummyMainImage,i=this._ctx.videoProfile.getVideoEncodeConfig()[0]):(t=this._dummyScreenImage,i=this._ctx.videoProfile.getScreenEncodeConfig()),!t)return;const o=document.createElement("canvas"),s=o.getContext("2d"),r=iT(i.width),n=iT(i.height);if(!s)throw new LS(RS.UNEXPECTED_ERROR,"Not support canvas");let a,d;!r||!n||t.width<=r&&t.height<=n?(a=t.width,d=t.height):(a=Math.min(r,t.width*n/t.height),d=Math.min(n,t.height*r/t.width)),o.width=a,o.height=d,s.drawImage(t,0,0,t.width,t.height,0,0,a,d);const c=window.setInterval((()=>{t&&s.drawImage(t,0,0,t.width,t.height,0,0,a,d)}),200);e===em.STREAM_INDEX_MAIN?(clearInterval(this._dummyMainTimer),this._dummyMainTimer=c):(clearInterval(this._dummyScreenTimer),this._dummyScreenTimer=c);const l=o.captureStream(5).getVideoTracks()[0];var u,m;e===em.STREAM_INDEX_MAIN?(this._localImgVideoTrack=l,null!==(u=this._localVideoTrack)&&void 0!==u&&u.dummy&&this._localVideoTrack.setTrack(this._localImgVideoTrack)):(this._localImgScreenTrack=l,null!==(m=this._localScreenVideoTrack)&&void 0!==m&&m.dummy&&this._localScreenVideoTrack.setTrack(this._localImgScreenTrack))}_addListenExtensionEvent(e){e.on("re-capture-audio",(()=>{this._localAudioTrack&&this.stopAudioCapture().then((()=>{this.startAudioCapture()}))})),e.on("re-capture-video",(()=>{this._localVideoTrack&&!this._localVideoTrack.dummy&&this.stopVideoCapture().then((()=>{this.startVideoCapture()}))})),e.on("reset-video-effect",(async(e,t)=>{if(this._localVideoTrack&&!this._localVideoTrack.dummy){var i;this._localVideoTrack&&this._removeLocalTrackEvents(this._localVideoTrack);try{await this._localVideoTrack.generatePreProcessingTrack()}catch(o){t(o)}this._initLocalTrackEvents(this._localVideoTrack),this._localVideoTrack.stopAll(),this._localVideoTrack.playAll(),this.safeEmit(Mm.onLocalStreamTrackChangedByExtension,{streamIndex:em.STREAM_INDEX_MAIN,type:"video"}),e(),null!==(i=this._room)&&void 0!==i&&null!==(i=i.localStream)&&void 0!==i&&i.pubVideo&&await this._updatePublish(),this._wtnStreamManager._updatePushTrack()}e()}))}async registerExtension(e){var t,i,o;e.monitor=this.monitor,e.logger=new xv(e.name,0,this.id);try{if(!(await e.isSupported()))throw new Error("This extension is not supported.")}catch(r){throw new Error("This extension is not supported.")}WZ("VERSION")!==e.version&&(tT("This extension version is ".concat(e.version,", but the sdk version is ").concat(WZ("VERSION"),".")),this.monitor.report("rtc_error",{message:"This extension version is ".concat(e.version,", but the sdk version is ").concat(WZ("VERSION"),"."),error_code:-1}));let s={};if("RTCAIAnsExtension"===e.name){s={overloadThreshold:WZ("AINR_OVERLOAD_THRESHOLD"),enableCache:WZ("AINR_ENABLE_DUMP"),url:WZ("AINR_URL"),cacheTime:WZ("AINR_CACHE_TIME"),dumpTime:WZ("AINR_DUMP_TIME")}}"RTCBeautyExtension"===e.name&&(s={videoCaptureConfig:this._ctx.videoProfile.getCaptureConfig()}),s=function(e){const t={};return Object.keys(e).forEach((i=>{void 0!==e[i]&&(t[i]=e[i])})),t}(s),await e.init(s),this._ctx.extensionManager.register(e),this._addListenExtensionEvent(e),null===(t=this._localAudioTrack)||void 0===t||t.generatePreProcessingTrack(),null===(i=this._localVideoTrack)||void 0===i||i.generatePreProcessingTrack(),null===(o=this._localScreenAudioTrack)||void 0===o||o.generatePreProcessingTrack()}defaultTranscoding(){return JSON.parse(JSON.stringify(sw.getDefaultValue()))}async _updatePublish(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.logger.info("_updatePublish()","config: %o",e);if(e=Ju(Ju({},{mediaType:void 0,invokeByJoinRoom:!1,pubState:YM.PUB}),e),!this._ctx.visibility)throw new LS(RS.NO_PUBLISH_PERMISSION,"no publish permission");const i=await this._pubLock.lock();if(this._room&&this._ctx.signalingManager.isConnected())try{await this._room.publish(this._localVideoTrack,this._localAudioTrack,e.mediaType,e.pubState,e.invokeByJoinRoom)}catch(oK){throw oK instanceof LS?(oK.code===RS.TOKEN_NO_PUBLISH_PERMISSION&&this._room.config.setTokenPublishPrivilegeExpired(!0),oK):new LS(RS.UNEXPECTED_ERROR,"unexpected error",oK)}finally{i()}else if(i(),t)throw new LS(RS.NOT_CONNECTED_YET,"not connected")}async startAudioPlaybackDeviceTest(e,t){return this.logger.print("startAudioPlaybackDeviceTest()","filePath: %o, indicationInterval: %o",e,t),VS(e,"filePath"),GS(t,"indicationInterval"),await this._audioDeviceManager.startAudioPlaybackDeviceTest(e,t)}stopAudioPlaybackDeviceTest(){this.logger.info("stopAudioPlaybackDeviceTest()"),this._audioDeviceManager.stopAudioPlaybackDeviceTest()}async startAudioDeviceRecordTest(e,t){this.logger.print("startAudioDeviceRecordTest()","indicationInterval: %o",e),GS(e,"indicationInterval"),await this._audioDeviceManager.startAudioDeviceRecordTest(e,t,this._localAudioVolume)}stopAudioDeviceRecordAndPlayTest(){this.logger.info("stopAudioDeviceRecordAndPlayTest()"),this._audioDeviceManager.stopAudioDeviceRecordAndPlayTest()}stopAudioDevicePlayTest(){this.logger.info("stopAudioDevicePlayTest()"),this._audioDeviceManager.stopAudioDevicePlayTest()}setRemoteUserPriority(e,t){var i;this.logger.print("setRemoteUserPriority()","userId: %o, priority: %o",e,t);try{wS(e),ES(t,"priority",[pm.HIGH,pm.MEDIUM,pm.LOW])}catch(o){return console.warn(o),!1}return this._ctx.userPriority.set(e,t),null===(i=this._room)||void 0===i||i.updateRemoteUserPriority(e),!0}async takeLocalSnapshot(e){this.logger.print("takeLocalSnapshot()","streamIndex: %o",e),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]);const t=e===em.STREAM_INDEX_MAIN?this.localVideoTrack:this.localScreenVideoTrack;if(!t)throw new LS(RS.INVOKED_BEFORE_CAPTURE,"capture first");return t.snapshot()}async takeRemoteSnapshot(e,t){var i;this.logger.print("takeRemoteSnapshot()","id: %o, streamIndex: %o",e,t),VS(e,"id"),ES(t,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]);const o=(null===(i=this._room)||void 0===i||null===(i=i.remoteStreams.get(e))||void 0===i||null===(i=i.find((e=>e.isScreen===(t===em.STREAM_INDEX_SCREEN))))||void 0===i?void 0:i.videoTrack)||this._wtnStreamManager.__getPublicStreamTrack(e,"video");if(!o)throw new LS(RS.STREAM_NOT_EXIST,"stream not exist");return o.snapshot()}setSubscribeFallbackOption(e){this.logger.info("setSubscribeFallbackOption()","option: %o",e);try{ES(e,"option",[hm.DISABLE,hm.VIDEO_STREAM_LOW,hm.AUDIO_ONLY])}catch(t){return console.warn(t),!1}return!this._room&&(this._ctx.subscribeFallbackOption=e,!0)}getLocalStreamTrack(e,t){let i,o;if(e===em.STREAM_INDEX_MAIN?(i="video"===t?this.localVideoTrack:this.localAudioTrack,o=()=>{var e;return null===(e=this._room)||void 0===e?void 0:e.localStream}):(i="video"===t?this.localScreenVideoTrack:this.localScreenAudioTrack,o=()=>{var e;return null===(e=this._room)||void 0===e?void 0:e.localScreenStream}),!i)return;const s=i instanceof cM&&i.mixedAudioTrack?i.mixedAudioTrack:i.preprocessingTrack;if(!s)return;const r=o();return this._reportMsTrackEvent(s,(null==r?void 0:r.stream.id)||"local"),s}getRemoteStreamTrack(e,t,i){var o;let s;const r=(null===(o=this._room)||void 0===o?void 0:o.remoteStreams.get(e))||[];if(null==r||!r.length)return;let n;var a,d,c,l;t===em.STREAM_INDEX_MAIN?(n=r.find((e=>!e.isScreen)),s="video"===i?null===(a=n)||void 0===a?void 0:a.videoTrack:null===(d=n)||void 0===d?void 0:d.audioTrack):(n=r.find((e=>e.isScreen)),s="video"===i?null===(c=n)||void 0===c?void 0:c.videoTrack:null===(l=n)||void 0===l?void 0:l.audioTrack);if(!s)return;const u=s.preprocessingTrack;if(!u||!n)return;const{streamId:m}=n;return this._reportMsTrackEvent(u,m),u}getPublicStreamTrack(e,t){const i=this._wtnStreamManager.__getPublicStreamTrack(e,t),o=null==i?void 0:i.preprocessingTrack;if(o)return o?(this._reportMsTrackEvent(o,e),o):void 0}setRemoteStreamRenderSync(e){return!this._room&&(this._ctx.avSync=!!e,!0)}setJoinRoomParams(e){e&&(this._ctx.joinRoomParams=e)}async setAudioSelectionConfig(e){ES(e,"audioSelectionPriority",[Xm.DEFAULT,Xm.HIGH]),this._ctx.mediaParams||(this._ctx.mediaParams={}),this._ctx.mediaParams.audioSelectionConfig={isHighPriority:e===Xm.HIGH},this._room&&await this._room.updateMediaParams(this._ctx.mediaParams)}setCaptureVolume(e,t){ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),t=OS(t,"volume",0,400);var i,o,s,r,n;e===em.STREAM_INDEX_SCREEN?(null===(i=this._localScreenAudioTrack)||void 0===i||i.once("needReplaceTrack",(()=>{var e;null===(e=this._room)||void 0===e||e.updatePubScreenTrack()})),null===(o=this._localScreenAudioTrack)||void 0===o||o.setVolume(t),this._localScreenAudioVolume=t):(null===(s=this._localAudioTrack)||void 0===s||s.once("needReplaceTrack",(()=>{var e;null===(e=this._room)||void 0===e||e.updatePubTrack()})),null===(r=this._localAudioTrack)||void 0===r||r.setVolume(t),null===(n=this._audioDeviceManager.audioTrack)||void 0===n||n.setVolume(t),this._localAudioVolume=t)}setPlaybackVolume(e,t,i){var o,s,r;if(wS(e),ES(t,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),i=OS(i,"volume",0,400),null!==(o=this._room)&&void 0!==o&&o.config.isMultiChatMode())return void tT("setPlaybackVolume is not supported in Conference mode");const n=t===em.STREAM_INDEX_SCREEN;n?this._remoteScreenAudioVolume.set(e,i):this._remoteAudioVolume.set(e,i);const a=null===(s=this._room)||void 0===s||null===(s=s.remoteStreams.get(e))||void 0===s?void 0:s.find((e=>e.isScreen===n));null==a||null===(r=a.audioTrack)||void 0===r||r.setVolume(i)}setPublicStreamVolume(e,t){this._wtnStreamManager.setWTNRemoteAudioPlaybackVolume(e,t)}async startForwardStreamToRooms(e){e.forEach((e=>{YS(e.roomId)})),this._assertNotInRoom();return await this._room.startForwardStream2Rooms(e)}async updateForwardStreamToRooms(e){e.forEach((e=>{YS(e.roomId)})),this._assertNotInRoom();return await this._room.updateForwardStream2Rooms(e)}async stopForwardStreamToRooms(){this._assertNotInRoom();return await this._room.stopForwardStream2Rooms()}async pauseForwardStreamToAllRooms(){this._assertNotInRoom();return await this._room.pauseForwardStream2AllRooms()}async resumeForwardStreamToAllRooms(){this._assertNotInRoom();return await this._room.resumeForwardStream2AllRooms()}async ambulance(){const e=await Tw(this),t=JSON.stringify(e);return this.monitor.reportLongString("ambulance",t),e}async setEarMonitorMode(e,t){this.logger.info("setEarMonitorMode()","streamIndex: %s, position: %s",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),ES(t,"position",[Wm.NONE,Wm.AFTER_CAPTURE,Wm.AFTER_PROCESS]),this._ctx.earMonitorSettings[e].position=t;const i=e===em.STREAM_INDEX_MAIN?this.localAudioTrack:e===em.STREAM_INDEX_SCREEN?this.localScreenAudioTrack:void 0;if(i)return t!==Wm.NONE?i.play(t):i.stop();this.logger.warn("setEarMonitorMode()","local audio track not exist")}setEarMonitorVolume(e,t){this.logger.info("setEarMonitorVolume()","streamIndex: %s, volume: %s",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]),t=OS(t,"volume",0,400),this._ctx.earMonitorSettings[e].volume=t;const i=e===em.STREAM_INDEX_MAIN?this.localAudioTrack:e===em.STREAM_INDEX_SCREEN?this.localScreenAudioTrack:void 0;if(i)return i.setPlaybackVolume(t);this.logger.warn("setEarMonitorVolume()","local audio track not exist")}setUserInfo(e,t){YS(e),wS(t),this.monitor.set({room_id:e,user_id:t})}getLocalVideoPlayerVisibility(e,t){var i;this.logger.info("getLocalVideoPlayerVisibility","streamIndex: %s, playerId: %s",e,t),ES(e,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]);const o=null!=t?t:ON,s=null===(i=this._localVideoPlayerConfig[e].get(o))||void 0===i?void 0:i.player;if(!s)return void this.logger.error("getLocalVideoPlayerVisibility","no matched player, silent return");const r=s.getPlayerVisibility();return{descriptor:{mediaType:tm.VIDEO,streamIndex:e,playerId:t},status:r}}getRemotePlayerVisibility(e,t,i){var o;this.logger.info("getRemotePlayerVisibility","userId: %s, streamIndex: %s, playerId: %s",e,t,i),ES(t,"streamIndex",[em.STREAM_INDEX_MAIN,em.STREAM_INDEX_SCREEN]);const s=null!=i?i:ON,r=null===(o=this._getRemoteVideoPlayerConfig(t,e,s))||void 0===o?void 0:o.player;if(!r)return void this.logger.error("getRemotePlayerVisibility","no matched player, silent return");const n=r.getPlayerVisibility();return{descriptor:{mediaType:tm.VIDEO,streamIndex:t,userId:e,playerId:i},status:n}}setJitterBufferTarget(e,t,i){var o;let s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];if(this.logger.info("setJitterBufferTarget","userId: %s, streamIndex: %s, target: %s, progressive: %s",e,t,i,s),null!==i&&GS(i,"target",0,4e3),this._ctx.jitterTargetConfig[t].get(e)===i)return void this.logger.warn("setJitterBufferTarget","same as previous, silent return");if(this._ctx.jitterTargetConfig[t].set(e,i),!this._room)return void this.logger.warn("setJitterBufferTarget","not in room, silent return");const r=null===(o=this._room)||void 0===o||null===(o=o.remoteStreams.get(e))||void 0===o?void 0:o.find((e=>e.isScreen===(t===em.STREAM_INDEX_SCREEN)));r?r.updateJitterTarget(i,s):this.logger.warn("setJitterBufferTarget","stream not found, silent return")}_reportMsTrackEvent(e,t){if(!e.hookStop){e.hookStop=!0;const i=e.stop;e.stop=()=>{vv(this.id,"stop",t,0,t),i.call(e)}}}async _updateScreenPublish(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.logger.info("_updateScreenPublish()");if(e=Ju(Ju({},{mediaType:void 0,pubState:YM.PUB}),e),!this._ctx.visibility)throw new LS(RS.NO_PUBLISH_PERMISSION,"no publish permission");const t=await this._pubLock.lock();if(this._room&&this._ctx.signalingManager.isConnected())try{await this._room.publishScreen(this._localScreenVideoTrack,this._localScreenAudioTrack,e.mediaType,e.pubState)}catch(oK){throw oK instanceof LS?oK:new LS(RS.UNEXPECTED_ERROR,"unexpected error",oK)}finally{t()}else t()}_updateAudioPlayerState(e){this.logger.info("_updateAudioPlayerState()");const{userId:t,isScreen:i,isPublic:o}=e;if(e.audioTrack&&e.attributes.audiostream&&e.subAudio){var s,r,n;if(!e.audioTrack.havePlayer()){var a,d;const s=new aM(this.id,t,{muted:(null===(a=this._config)||void 0===a?void 0:a.autoPlayPolicy)===Sm.VIDEO_ONLY||(null===(d=this._config)||void 0===d?void 0:d.autoPlayPolicy)===Sm.PLAY_MANUALLY,isScreen:!o&&i});e.audioTrack.setPlayer(s),e.audioTrack.bindPlayerEvent(this._initPlayerEvents.bind(this));const r=this._audioDeviceManager.getSinkId();r&&e.audioTrack.setPlaybackDevice(r)}e.audioTrack.play();const u=o?null!==(s=this._ctx.publicAudioVolume.get(t))&&void 0!==s?s:100:i?null!==(r=this._remoteScreenAudioVolume.get(t))&&void 0!==r?r:100:null!==(n=this._remoteAudioVolume.get(t))&&void 0!==n?n:100;if(e.audioTrack.setVolume(u),Kv&&jv){var c,l;const e=null!==(c=null===(l=this._room)||void 0===l?void 0:l.remoteStreams)&&void 0!==c?c:new Map;m=e,rw&&clearTimeout(rw),rw=setTimeout((()=>{for(const[e,t]of m)null!=e&&e.startsWith("mux")&&t.forEach((e=>{var t;null===(t=e.audioTrack)||void 0===t||t.pause()}));for(const[e,t]of m)null!=e&&e.startsWith("mux")&&t.forEach((e=>{var t;null===(t=e.audioTrack)||void 0===t||t.play()}))}),2e3)}}else{var u;null===(u=e.audioTrack)||void 0===u||u.stop()}var m}_updateVideoPlayerState(e){if(this.logger.info("_updateVideoPlayerState()"),e.videoTrack){const i=e.isPublic?this._wtnStreamManager._publicVideoPlayerConfig:this._remoteVideoPlayerConfig[e.isScreen?em.STREAM_INDEX_SCREEN:em.STREAM_INDEX_MAIN].get(e.userId);if(i)for(const[,o]of i){var t;e.videoTrack.setPlayer(this.id,o,null===(t=this._config)||void 0===t?void 0:t.autoPlayPolicy,this._initPlayerEvents.bind(this))}}}get _localVideoTrack(){return this._ctx.localVideoTrack}set _localVideoTrack(e){this._ctx.localVideoTrack=e}get _localAudioTrack(){return this._ctx.localAudioTrack}set _localAudioTrack(e){this._ctx.localAudioTrack=e}async _onAddStream(e){const t=e.stream,{localaudio:i,audiostream:o,localvideo:s,videostream:r}=t.attributes;let n=US.NONE;o&&(n|=tm.AUDIO),r&&(n|=tm.VIDEO),n&&(await new Promise((e=>setTimeout(e))),t.isScreen?this.safeEmit(Mm.onUserPublishScreen,{userId:t.userId,mediaType:n}):(this.safeEmit(Mm.onUserPublishStream,{userId:t.userId,mediaType:n,videoStreamDescriptions:t.attributes.videoDescriptions}),this._handleAutoSubscribe(t,!0)),this.safeEmit("onAddStream",{userId:t.userId,mediaType:n,isScreen:!!t.isScreen}),t.isScreen||(i&&this.safeEmit(Mm.onUserStartAudioCapture,{userId:t.userId}),s&&this.safeEmit(Mm.onUserStartVideoCapture,{userId:t.userId})))}_handleAutoSubscribe(e,t){var i,o;let s=US.NONE;if(null!==(i=this._room)&&void 0!==i&&i.config.isAutoSubscribeAudio&&(s|=tm.AUDIO),null!==(o=this._room)&&void 0!==o&&o.config.isAutoSubscribeVideo&&(s|=tm.VIDEO),s){var r,n,a;if(t&&Qf(s))null===(n=e.observer)||void 0===n||n.setAutoSubscribeAudio(!0);if(t&&Bf(s))null===(a=e.observer)||void 0===a||a.setAutoSubscribeVideo(!0);null!==(r=this._room)&&void 0!==r&&r.config.tokenSubscribePrivilegeExpired?(Qf(s)&&(this._pauseAllSubscribeState.resumeAudioStreamIds[e.streamId]=e.streamId),Bf(s)&&(this._pauseAllSubscribeState.resumeVideoStreamIds[e.streamId]=e.streamId)):this._subscribe(!1,e.userId,s)}}_onRemoveStream(e){var t;const i=e.stream,o=null!==(t=Vw[e.reason])&&void 0!==t?t:im.STREAM_REMOVE_REASON_OTHER,s=i.isScreen?Mm.onUserUnpublishScreen:Mm.onUserUnpublishStream;let r=US.NONE;i.attributes.audiostream&&(r|=tm.AUDIO),i.attributes.videostream&&(r|=tm.VIDEO),r!==US.NONE&&(this.safeEmit(s,{userId:i.userId,mediaType:r,reason:o}),this.safeEmit("onRemoveStream",{userId:i.userId,isScreen:i.isScreen})),delete this._pauseAllSubscribeState.resumeAudioStreamIds[i.streamId],delete this._pauseAllSubscribeState.resumeVideoStreamIds[i.streamId]}_onUserConnection(e){setTimeout((()=>this.safeEmit(Mm.onUserJoined,e)))}_onUserLeave(e){this.safeEmit(Mm.onUserLeave,e)}_onRoomError(e){var t;this.safeEmit(Mm.onError,e),null===(t=this._room)||void 0===t||t.destroy(),this._room=void 0}_onNetworkQuality(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];this.safeEmit(Mm.onNetworkQuality,...t)}_onConnectionStateChange(e){if(void 0!==this._startCloudProxyTimestamp&&this._ctx.useCloudProxy&&e.state===om.CONNECTION_STATE_CONNECTED&&this.safeEmit(Mm.onCloudProxyConnected,{interval:Date.now()-this._startCloudProxyTimestamp}),(this._ctx.isPreConnection||e.state!==om.CONNECTION_STATE_CONNECTED&&e.state!==om.CONNECTION_STATE_RECONNECTED)&&this.safeEmit(Mm.onConnectionStateChanged,e),e.state===om.CONNECTION_STATE_RECONNECTING)for(const[o,s]of null!==(t=null===(i=this._room)||void 0===i?void 0:i.remoteStreams)&&void 0!==t?t:new Map){var t,i;o.startsWith("mux")&&s.forEach((e=>{var t;return null===(t=e.audioTrack)||void 0===t?void 0:t.stop()}))}else e.state===om.CONNECTION_STATE_CONNECTED&&this._rtmClient.setRTSMessageLimit(this._ctx.rtsLimiter.conf)}_stopAudioPropertiesReport(){null!==this._audioPropertiesReportTimer&&(clearInterval(this._audioPropertiesReportTimer),this._audioPropertiesReportTimer=null)}_onResubscribe(e){var t,i;e.stream&&(null===(t=e.stream.videoTrack)||void 0===t||t.stopAll(),null===(i=e.stream.audioTrack)||void 0===i||i.stop(),this._updateAudioPlayerState(e.stream),this._updateVideoPlayerState(e.stream))}_onSubscribePushTrack(e){e.stream&&this._updateAudioPlayerState(e.stream)}_onRemovePushTrack(e){e.stream&&this._updateAudioPlayerState(e.stream)}_onUserPublishStateChange(e){let{userId:t,isScreen:i,mediaType:o,pubState:s,remoteStream:r}=e;const n={userId:t,mediaType:o};o&tm.AUDIO&&setTimeout((()=>{this._updateAudioPlayerState(r)})),i?s===YM.PUB?this.safeEmit(Mm.onUserPublishScreen,n):this.safeEmit(Mm.onUserUnpublishScreen,Ju(Ju({},n),{},{reason:im.STREAM_REMOVE_REASON_UNPUBLISH})):s===YM.PUB?(n.videoStreamDescriptions=r.attributes.videoDescriptions,this.safeEmit(Mm.onUserPublishStream,n),this._handleAutoSubscribe(r,!0)):this.safeEmit(Mm.onUserUnpublishStream,Ju(Ju({},n),{},{reason:im.STREAM_REMOVE_REASON_UNPUBLISH}))}_onCustomMessage(e){const{message:t}=e;e.binary?this.safeEmit(Mm.onRoomBinaryMessageReceived,{userId:e.clientId,message:t}):this.safeEmit(Mm.onRoomMessageReceived,{userId:e.clientId,message:t})}_onUserMessageReceived(e){this._messageStatisticsObserver.recvP2PMessage(e.userId),this.safeEmit(Mm.onUserMessageReceived,e)}_onUserBinaryMessageReceived(e){this._messageStatisticsObserver.recvP2PMessage(e.userId),this.safeEmit(Mm.onUserBinaryMessageReceived,e)}_onLiveTranscodingResult(e){this.safeEmit(Mm.onLiveTranscodingResult,e)}_onStreamMixingEvent(e){this.safeEmit(Mm.onStreamMixingEvent,e)}_onUserTokenWillExpire(){this.safeEmit(Mm.onTokenWillExpire)}_onUserTokenPublishPrivilegeWillExpire(){this.safeEmit(Mm.onTokenPublishPrivilegeWillExpire)}async _onUserTokenPublishPrivilegeDidExpired(){var e,t,i;await(null===(e=this._room)||void 0===e?void 0:e.unpublish().catch((()=>{}))),await(null===(t=this._room)||void 0===t?void 0:t.unpublishScreen().catch((()=>{}))),null===(i=this._room)||void 0===i||i.config.setTokenPublishPrivilegeExpired(!0),this.safeEmit(Mm.onTokenPublishPrivilegeDidExpired,{errorCode:RS.TOKEN_NO_PUBLISH_PERMISSION,message:"Token no longer has publish privilege"})}_onUserTokenSubscribePrivilegeWillExpire(){this.safeEmit(Mm.onTokenSubscribePrivilegeWillExpire)}async _onUserTokenSubscribePrivilegeDidExpired(){this._handleLoseSubscribePrivilege(),this.safeEmit(Mm.onTokenSubscribePrivilegeDidExpired,{errorCode:RS.TOKEN_NO_SUBSCRIBE_PERMISSION,message:"Token no longer has subscribe privilege"})}async _unSubscribeAllRemoteStreams(){return this._room?this._pauseAllRemoteStreams(tm.AUDIO_AND_VIDEO):Promise.resolve()}_onPushPublicStreamResult(e){this.safeEmit(Mm.onPushPublicStreamResult,e)}_handleRTMClient(e){e.on("onUserMessageReceivedOutsideRoom",(e=>{this._messageStatisticsObserver.recvP2POutRoomMessage(e.userId),this.safeEmit(Mm.onUserMessageReceivedOutsideRoom,e)})),e.on("onUserBinaryMessageReceivedOutsideRoom",(e=>{this._messageStatisticsObserver.recvP2POutRoomMessage(e.userId),this.safeEmit(Mm.onUserBinaryMessageReceivedOutsideRoom,e)})),e.on("onUserDisconnection",(()=>{this.safeEmit(Mm.onError,{errorCode:RS.RTM_DUPLICATE_LOGIN})})),e.on("onRTMTokenError",(()=>{this.safeEmit(Mm.onError,{errorCode:RS.RTM_TOKEN_ERROR})})),e.on("onServerParamsSetResult",(e=>{this.safeEmit(Mm.onServerParamsSetResult,null==e?void 0:e.code)}))}getSubLock(e,t){const i=e?this._subScreenLocks:this._subLocks;let o=i.get(t);return o||(o=new nN("sub_".concat(e?1:0,"_").concat(t)),i.set(t,o)),o}get localAudioTrack(){return this._localAudioTrack}get localVideoTrack(){return this._localVideoTrack}get localScreenAudioTrack(){return this._localScreenAudioTrack}get localScreenVideoTrack(){return this._localScreenVideoTrack}get remoteStreams(){var e;const t=[];return null!==(e=this._room)&&void 0!==e&&e.remoteStreams&&this._room.remoteStreams.forEach((e=>{Array.isArray(e)&&e.forEach((e=>{t.push({userId:e.userId,isScreen:e.isScreen,hasVideo:e.hasVideo,hasAudio:e.hasAudio,videoStreamDescriptions:e.attributes.videoDescriptions})}))})),t}get iceState(){var e;return null===(e=this._ctx.peerConnection)||void 0===e?void 0:e.getIceConnectionState()}get remoteUsers(){var e;const t=[];return null!==(e=this._room)&&void 0!==e&&e.remoteUsers&&this._room.remoteUsers.forEach((e=>{t.push({userId:e.userId})})),t}get multiChatMode(){var e;return!(null===(e=this._room)||void 0===e||!e.config.isMultiChatMode())}get checkMediaType(){return this._checkMediaType}get assertNotInRoom(){return this._assertNotInRoom}get peerConnection(){var e;return null===(e=this._ctx.peerConnection)||void 0===e?void 0:e.getOriginRTCPeerConnection()}_handleAudioDeviceManager(){this._audioDeviceManager.on("onAudioPlaybackDeviceTestVolume",(e=>{this.safeEmit(Mm.onAudioPlaybackDeviceTestVolume,e)}))}_assertNotInRoom(){if(!this._room||!this._ctx.signalingManager.isConnected())throw new LS(RS.NOT_CONNECTED_YET,"server not connected")}_checkMediaType(e){ES(e,"mediaType",[tm.AUDIO,tm.VIDEO,tm.AUDIO_AND_VIDEO])}_getUserId(){var e;return(null===(e=this._room)||void 0===e?void 0:e.config.userInfo.userId)||"local_user"}async _switchTrack(e){var t;this._initLocalTrackEvents(e),this._localVideoTrack=e,this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((t=>{var i;e.setPlayer(t,this._mirrorType,null===(i=this._config)||void 0===i?void 0:i.autoPlayPolicy,this._initPlayerEvents.bind(this))})),null!==(t=this._room)&&void 0!==t&&null!==(t=t.localStream)&&void 0!==t&&t.pubVideo&&await this._updatePublish(),this._wtnStreamManager._updatePushTrack()}async _shouldUpdateAudioConf(e){var t,i;const o=await(null===(t=this._room)||void 0===t?void 0:t.hasPublished())||(null===(i=this._room)||void 0===i||null===(i=i.localStream)||void 0===i?void 0:i.pubAudio)||this._localAudioTrack&&this._localAudioTrack.sourceType===Ng.INTERNAL;if(o){const t="engine.".concat(e," should be called before publishing or capturing.");console.warn("[RTC WebSDK]: ".concat(t)),vv(this.id,e,t)}return!o}_getRemoteVideoPlayerConfig(e,t,i){var o;return null===(o=this._remoteVideoPlayerConfig[e].get(t))||void 0===o?void 0:o.get(i)}_setRemoteVideoPlayerConfig(e,t,i,o){const s=this._remoteVideoPlayerConfig[e].get(t)||new Map;s.set(i,o),this._remoteVideoPlayerConfig[e].set(t,s)}getRemoteVideoStats(){var e;const t=null===(e=this._room)||void 0===e?void 0:e.remoteStreams;if(!t||0===t.size)return{};const i={};return t.forEach(((e,t)=>{var o,s,r;let n,a;null!==(o=e[0])&&void 0!==o&&o.isScreen?(a=e[0],n=e[1]):(a=e[1],n=e[0]);const d={mainVideoStats:qf((null===(s=n)||void 0===s?void 0:s.getRemoteStreamStats().videoStats)||{}),screenVideoStats:qf((null===(r=a)||void 0===r?void 0:r.getRemoteStreamStats().videoStats)||{})};i[t]=d})),i}getRemoteAudioStats(){var e;const t=null===(e=this._room)||void 0===e?void 0:e.remoteStreams;if(!t||0===t.size)return{};const i={};return t.forEach(((e,t)=>{var o,s,r;let n,a;null!==(o=e[0])&&void 0!==o&&o.isScreen?(a=e[0],n=e[1]):(a=e[1],n=e[0]);const d={mainAudioStats:qf((null===(s=n)||void 0===s?void 0:s.getRemoteStreamStats().audioStats)||{}),screenAudioStats:qf((null===(r=a)||void 0===r?void 0:r.getRemoteStreamStats().audioStats)||{})};i[t]=d})),i}getLocalVideoStats(){var e,t;return{mainVideoStats:qf((null===(e=this._room)||void 0===e||null===(e=e.localStream)||void 0===e?void 0:e.getLocalStreamStats().videoStats)||{}),screenVideoStats:qf((null===(t=this._room)||void 0===t||null===(t=t.localScreenStream)||void 0===t?void 0:t.getLocalStreamStats().videoStats)||{})}}getLocalAudioStats(){var e,t;return{mainAudioStats:qf((null===(e=this._room)||void 0===e||null===(e=e.localStream)||void 0===e?void 0:e.getLocalStreamStats().audioStats)||{}),screenAudioStats:qf((null===(t=this._room)||void 0===t||null===(t=t.localScreenStream)||void 0===t?void 0:t.getLocalStreamStats().audioStats)||{})}}getPublicVideoStats(){const e=this._wtnStreamManager.__getRemoteStreams();if(!e||0===e.size)return{};const t={};return e.forEach(((e,i)=>{const o=qf(e.getRemoteStreamStats().videoStats||{});delete o.isScreen,t[i]=o})),t}getPublicAudioStats(){const e=this._wtnStreamManager.__getRemoteStreams();if(!e||0===e.size)return{};const t={};return e.forEach(((e,i)=>{const o=qf(e.getRemoteStreamStats().audioStats||{});delete o.isScreen,t[i]=o})),t}_checkPlayerVisibilityInterval(){const e=[];this._localVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach((t=>{const i=t.player.getPlayerVisibility(),o={playerId:t.playerId,mediaType:tm.VIDEO,streamIndex:em.STREAM_INDEX_MAIN};e.push({descriptor:o,status:i})})),this._localVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach((t=>{const i=t.player.getPlayerVisibility(),o={playerId:t.playerId,mediaType:tm.VIDEO,streamIndex:em.STREAM_INDEX_SCREEN};e.push({descriptor:o,status:i})})),this._remoteVideoPlayerConfig[em.STREAM_INDEX_MAIN].forEach(((t,i)=>{t.forEach((t=>{const o=t.player.getPlayerVisibility(),s={playerId:t.playerId,mediaType:tm.VIDEO,streamIndex:em.STREAM_INDEX_MAIN,userId:i};e.push({descriptor:s,status:o})}))})),this._remoteVideoPlayerConfig[em.STREAM_INDEX_SCREEN].forEach(((t,i)=>{t.forEach((t=>{const o=t.player.getPlayerVisibility(),s={playerId:t.playerId,mediaType:tm.VIDEO,streamIndex:em.STREAM_INDEX_SCREEN,userId:i};e.push({descriptor:s,status:o})}))})),this._wtnStreamManager._publicVideoPlayerConfig.forEach(((t,i)=>{const o=t.player.getPlayerVisibility(),s={mediaType:tm.VIDEO,streamId:i};e.push({descriptor:s,status:o})})),e.length>0&&this.safeEmit(Mm.onPlayerVisibility,e)}_initAutoplayFailedWorkaround(){if(XZ.AUTOPLAY_WORKAROUND&&(XZ.ENABLE_PLAY_AFTER_CLICK||Bv)){let e=[];this.on(Mm.onAutoplayFailed,(t=>{e.push(t),o()}));const t=()=>{e.length>0&&(vv(this.id,"resumePlay",JSON.stringify(e)),Promise.all(e.map((e=>this.play(e.userId,e.mediaType,e.streamIndex,e.playerId)))).then((()=>{e=[],vv(this.id,"resumePlaySuccess",JSON.stringify(e))})).catch((()=>{vv(this.id,"resumePlayFailed",JSON.stringify(e))})))};let i;XZ.ENABLE_PLAY_AFTER_CLICK&&(document.addEventListener("click",t),i=()=>{document.removeEventListener("click",t)});const o=()=>{var i,o;window.WeixinJSBridge&&(vv(this.id,"resumePlayInWxBridge",JSON.stringify(e)),null===(i=(o=window.WeixinJSBridge).invoke)||void 0===i||i.call(o,"getNetworkType",{},t))};let s;Bv&&!window.WeixinJSBridge&&(document.addEventListener("WeixinJSBridgeReady",o,!1),s=()=>{document.removeEventListener("WeixinJSBridgeReady",o)}),this._revokeAutoplayFailedWorkaround=()=>{var e,t;null===(e=i)||void 0===e||e(),null===(t=s)||void 0===t||t()}}}},Hu(Rw,"hasReportNativeDetector",!1),Rw);let Gw=Ww;Cw([bv()],Gw.prototype,"updateToken",1),Cw([bv(),kw("video")],Gw.prototype,"setVideoCaptureDevice",1),Cw([bv(),kw("audio")],Gw.prototype,"setAudioCaptureDevice",1),Cw([bv()],Gw.prototype,"connect",1),Cw([function(e,t,i){if("function"==typeof i.value){const e=i.value;i.value=function(){var t;const i=mv(this.id);for(var o=arguments.length,s=new Array(o),r=0;r<o;r++)s[r]=arguments[r];return null==i||i.set({room_id:s[1],user_id:null===(t=s[2])||void 0===t?void 0:t.userId}),e.apply(this,s)}}},bv()],Gw.prototype,"joinRoom",1),Cw([bv()],Gw.prototype,"leaveRoom",1),Cw([bv()],Gw.prototype,"destroy",1),Cw([bv(),LN],Gw.prototype,"publishStream",1),Cw([bv(),LN],Gw.prototype,"unpublishStream",1),Cw([bv(),LN],Gw.prototype,"publishScreen",1),Cw([bv(),LN],Gw.prototype,"unpublishScreen",1),Cw([bv(),LN],Gw.prototype,"subscribeStream",1),Cw([Ew],Gw.prototype,"_subscribe",1),Cw([bv(),LN],Gw.prototype,"unsubscribeStream",1),Cw([bv(),LN],Gw.prototype,"subscribeScreen",1),Cw([bv(),LN],Gw.prototype,"unsubscribeScreen",1),Cw([Ew],Gw.prototype,"_unsubscribe",1),Cw([bv(),Pw],Gw.prototype,"setRemoteVideoConfig",1),Cw([bv()],Gw.prototype,"setRemoteSimulcastStreamType",1),Cw([bv(),kw("video")],Gw.prototype,"startVideoCapture",1),Cw([bv(),kw("video")],Gw.prototype,"stopVideoCapture",1),Cw([bv(),kw("audio")],Gw.prototype,"startAudioCapture",1),Cw([bv(),kw("audio")],Gw.prototype,"stopAudioCapture",1),Cw([bv(),kw("all")],Gw.prototype,"startAudioAndVideoCapture",1),Cw([bv()],Gw.prototype,"startVideoAndAudioCapture",1),Cw([bv()],Gw.prototype,"getAudioMixingManager",1),Cw([bv()],Gw.prototype,"getWTNStreamManager",1),Cw([bv()],Gw.prototype,"getCallId",1),Cw([bv(),xw],Gw.prototype,"startScreenCapture",1),Cw([bv(),xw],Gw.prototype,"stopScreenCapture",1),Cw([bv()],Gw.prototype,"setLocalVideoPlayer",1),Cw([bv(),LN],Gw.prototype,"startLiveTranscoding",1),Cw([bv(),LN],Gw.prototype,"updateLiveTranscoding",1),Cw([bv(),LN],Gw.prototype,"stopLiveTranscoding",1),Cw([bv(),LN],Gw.prototype,"startSubtitle",1),Cw([bv(),LN],Gw.prototype,"updateSubtitleConfig",1),Cw([bv(),LN],Gw.prototype,"stopSubtitle",1),Cw([bv()],Gw.prototype,"setBusinessId",1),Cw([bv(),LN],Gw.prototype,"setUserVisibility",1),Cw([bv()],Gw.prototype,"setRemoteVideoPlayer",1),Cw([bv()],Gw.prototype,"setLocalVideoMirrorType",1),Cw([bv()],Gw.prototype,"setRemoteVideoMirrorType",1),Cw([bv()],Gw.prototype,"setAudioPlaybackDevice",1),Cw([bv()],Gw.prototype,"play",1),Cw([bv()],Gw.prototype,"stop",1),Cw([bv()],Gw.prototype,"getAudioVolume",1),Cw([bv()],Gw.prototype,"setAudioFrameCallback",1),Cw([bv(),LN],Gw.prototype,"pauseAllSubscribedStream",1),Cw([bv(),LN],Gw.prototype,"resumeAllSubscribedStream",1),Cw([bv()],Gw.prototype,"sendUserMessage",1),Cw([bv()],Gw.prototype,"sendUserBinaryMessage",1),Cw([bv()],Gw.prototype,"sendRoomMessage",1),Cw([bv()],Gw.prototype,"sendRoomBinaryMessage",1),Cw([bv()],Gw.prototype,"setAudioCaptureConfig",1),Cw([eT("4.51"),bv()],Gw.prototype,"setVideoCaptureConfig",1),Cw([bv()],Gw.prototype,"enableSimulcastMode",1),Cw([bv()],Gw.prototype,"setLocalSimulcastMode",1),Cw([bv()],Gw.prototype,"setVideoEncoderConfig",1),Cw([bv()],Gw.prototype,"setScreenEncoderConfig",1),Cw([bv(),LN],Gw.prototype,"sendSEIMessage",1),Cw([eT("4.42"),bv()],Gw.prototype,"setAudioVolumeIndicationInterval",1),Cw([bv()],Gw.prototype,"enableAudioPropertiesReport",1),Cw([bv()],Gw.prototype,"setVideoSourceType",1),Cw([bv()],Gw.prototype,"setExternalVideoTrack",1),Cw([bv()],Gw.prototype,"setAudioSourceType",1),Cw([bv()],Gw.prototype,"setExternalAudioTrack",1),Cw([bv()],Gw.prototype,"login",1),Cw([bv()],Gw.prototype,"logout",1),Cw([bv()],Gw.prototype,"updateLoginToken",1),Cw([bv()],Gw.prototype,"getPeerOnlineStatus",1),Cw([bv()],Gw.prototype,"sendUserMessageOutsideRoom",1),Cw([bv()],Gw.prototype,"sendUserBinaryMessageOutsideRoom",1),Cw([bv()],Gw.prototype,"setServerParams",1),Cw([bv()],Gw.prototype,"sendServerMessage",1),Cw([bv()],Gw.prototype,"sendServerBinaryMessage",1),Cw([bv()],Gw.prototype,"startCloudProxy",1),Cw([bv()],Gw.prototype,"stopCloudProxy",1),Cw([bv()],Gw.prototype,"startPushPublicStream",1),Cw([bv()],Gw.prototype,"updatePublicStreamParam",1),Cw([bv()],Gw.prototype,"stopPushPublicStream",1),Cw([bv(["streamId"])],Gw.prototype,"startPlayPublicStream",1),Cw([bv(["streamId"])],Gw.prototype,"stopPlayPublicStream",1),Cw([bv()],Gw.prototype,"setAudioProfile",1),Cw([bv()],Gw.prototype,"setAudioEncodeMaxBitrate",1),Cw([bv()],Gw.prototype,"setPublicStreamVideoPlayer",1),Cw([bv()],Gw.prototype,"setDummyCaptureImagePath",1),Cw([bv()],Gw.prototype,"registerExtension",1),Cw([bv()],Gw.prototype,"startAudioPlaybackDeviceTest",1),Cw([bv()],Gw.prototype,"stopAudioPlaybackDeviceTest",1),Cw([bv()],Gw.prototype,"startAudioDeviceRecordTest",1),Cw([bv()],Gw.prototype,"stopAudioDeviceRecordAndPlayTest",1),Cw([bv()],Gw.prototype,"stopAudioDevicePlayTest",1),Cw([bv(),Pw],Gw.prototype,"setRemoteUserPriority",1),Cw([bv()],Gw.prototype,"takeLocalSnapshot",1),Cw([bv()],Gw.prototype,"takeRemoteSnapshot",1),Cw([bv()],Gw.prototype,"setSubscribeFallbackOption",1),Cw([bv()],Gw.prototype,"getLocalStreamTrack",1),Cw([bv()],Gw.prototype,"getRemoteStreamTrack",1),Cw([bv()],Gw.prototype,"getPublicStreamTrack",1),Cw([bv()],Gw.prototype,"setRemoteStreamRenderSync",1),Cw([bv()],Gw.prototype,"setJoinRoomParams",1),Cw([bv(),LN],Gw.prototype,"setAudioSelectionConfig",1),Cw([bv(),LN],Gw.prototype,"startForwardStreamToRooms",1),Cw([bv(),LN],Gw.prototype,"updateForwardStreamToRooms",1),Cw([bv(),LN],Gw.prototype,"stopForwardStreamToRooms",1),Cw([bv(),LN],Gw.prototype,"pauseForwardStreamToAllRooms",1),Cw([bv(),LN],Gw.prototype,"resumeForwardStreamToAllRooms",1),Cw([bv()],Gw.prototype,"setEarMonitorMode",1),Cw([bv([],{debounce:2e3,debounceTag:function(e){return"".concat(e)}})],Gw.prototype,"setEarMonitorVolume",1),Cw([bv()],Gw.prototype,"setUserInfo",1),Cw([bv()],Gw.prototype,"getLocalVideoPlayerVisibility",1),Cw([bv()],Gw.prototype,"getRemotePlayerVisibility",1);const Vw={"client unpublished":im.STREAM_REMOVE_REASON_UNPUBLISH,"publish failed":im.STREAM_REMOVE_REASON_PUBLISH_FAILED,"stream removed":im.STREAM_REMOVE_REASON_KEEP_LIVE_FAILED,"client disconnected":im.STREAM_REMOVE_REASON_CLIENT_DISCONNECTED,"client republish":im.STREAM_REMOVE_REASON_REPUBLISH,"token publish privilege expired":im.STREAM_REMOVE_REASON_TOKEN_PRIVILEGE_EXPIRED};function Ew(e,t,i){const o=i.value;return i.value=async function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];const[s,r,n]=t;this.checkMediaType(n),this.assertNotInRoom();const a=await this.getSubLock(s,r).lock();try{return await o.apply(this,t)}finally{a()}},i}function Pw(e,t,i){const o=i.value;return i.value=async function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];const[s]=t,r=await this.getSubLock(!1,s).lock();try{return await o.apply(this,t)}finally{r()}},i}function kw(e){return function(t,i,o){const s=o.value;return o.value=async function(){const t=[];"video"!==e&&t.push(this._audioCaptureLock.lock()),"audio"!==e&&t.push(this._videoCaptureLock.lock());const i=await Promise.all(t);try{for(var o=arguments.length,r=new Array(o),n=0;n<o;n++)r[n]=arguments[n];return await s.apply(this,r)}finally{i.forEach((e=>e()))}},o}}function xw(e,t,i){const o=i.value;return i.value=async function(){const e=await this._screenCaptureLock.lock();try{for(var t=arguments.length,i=new Array(t),s=0;s<t;s++)i[s]=arguments[s];return await o.apply(this,i)}finally{e()}},i}var Nw=Object.defineProperty,Mw=Object.getOwnPropertyDescriptor,Yw=(e,t,i,o)=>{for(var s,r=o>1?void 0:o?Mw(t,i):t,n=e.length-1;n>=0;n--)(s=e[n])&&(r=(o?s(t,i,r):s(r))||r);return o&&r&&Nw(t,i,r),r};class ww extends Gw{constructor(e,t,i){super(e,t,i),Hu(this,"singleStreamRenderMode",!1),this.id=t,this.logger=new xv("BLWEngine",0,t),EZ([{width:192,height:108,frameRate:15,maxKbps:100},{width:320,height:180,frameRate:15,maxKbps:140},{width:640,height:360,frameRate:15,maxKbps:400},{width:1280,height:720,frameRate:15,maxKbps:1e3},{width:1920,height:1080,frameRate:15,maxKbps:2e3}]),this._handleEngineEvents()}async subscribeStream(e,t){return this.logger.print("subscribeStream()","userId: %o, mediaType: %o",e,t),this.singleStreamRenderMode&&Bf(t)&&super.subscribeScreen(e,tm.VIDEO).catch((e=>{this.logger.error("singleStreamRenderMode subscribeScreen()",e)})),super.subscribeStream(e,t)}async unsubscribeStream(e,t){return this.logger.print("unsubscribeStream()","userId: %o, mediaType: %o",e,t),this.singleStreamRenderMode&&Bf(t)&&super.unsubscribeScreen(e,tm.VIDEO).catch((e=>{this.logger.error("singleStreamRenderMode unsubscribeScreen()",e)})),super.unsubscribeStream(e,t)}setRemoteScreenVideoStreamIndex(e){return this.logger.print("setRemoteScreenVideoStreamIndex()","streamIndex: %o",e),!this._room&&(this.singleStreamRenderMode=e===em.STREAM_INDEX_MAIN,!0)}setRemoteVideoPlayer(e,t){if(this.logger.print("setRemoteVideoPlayer()","streamIndex: %o, videoPlayerOption: %o",e,t),null==t||delete t.playerId,!this.singleStreamRenderMode||e!==em.STREAM_INDEX_SCREEN)return super.setRemoteVideoPlayer(e,t)}destroy(){this.singleStreamRenderMode=!1,super.destroy()}_updateVideoPlayerState(e){var t,i,o,s;if(!this.singleStreamRenderMode)return super._updateVideoPlayerState(e);const{userId:r}=e,n=null===(t=this._room)||void 0===t?void 0:t.remoteStreams.get(r);let a,d;Array.isArray(n)&&n.forEach((e=>{e.isScreen?a=e:d=e}));let c=null===(i=d)||void 0===i||null===(i=i.videoTrack)||void 0===i?void 0:i.dangerousGetPlayer(ON);if(!c){var l;const e=null===(l=this._remoteVideoPlayerConfig[em.STREAM_INDEX_MAIN].get(r))||void 0===l?void 0:l.get(ON);if(!e)return;var u,m,h;null===(u=d)||void 0===u||null===(u=u.videoTrack)||void 0===u||u.setPlayer(this.id,e,null===(m=this._config)||void 0===m?void 0:m.autoPlayPolicy,this._initPlayerEvents.bind(this)),c=null===(h=d)||void 0===h||null===(h=h.videoTrack)||void 0===h?void 0:h.dangerousGetPlayer(ON)}var p,b,_;if(!e.isScreen&&null!==(o=a)&&void 0!==o&&o.videoTrack&&a.videoHasPublish)return this.logger.print("_updateVideoPlayerState","prevent play main stream"),void(null===(p=c)||void 0===p||p.playVideo(a.videoTrack));e.videoTrack?(null===(b=this._config)||void 0===b?void 0:b.autoPlayPolicy)!==Sm.PLAY_MANUALLY&&(null===(_=c)||void 0===_||_.playVideo(e.videoTrack)):null!==(s=c)&&void 0!==s&&s.played&&c.stop()}_handleEngineEvents(){this.on(Mm.onUserPublishScreen,(e=>{if(this.singleStreamRenderMode&&Bf(e.mediaType)){var t,i;const o=null===(t=this._room)||void 0===t?void 0:t.remoteStreams.get(e.userId),s=null==o?void 0:o.find((e=>!e.isScreen)),r=null==o?void 0:o.find((e=>e.isScreen));null!=r&&r.hasSubscribed?(this.logger.info("onUserPublishScreen","singleStreamRenderMode screen hasSubscribed"),this._updateVideoPlayerState(r)):(null!==(i=this._room)&&void 0!==i&&i.config.isAutoSubscribeVideo||null!=s&&s.hasSubscribed&&Bf(s.subMediaType))&&(this.logger.info("onUserPublishScreen","singleStreamRenderMode subscribeScreen"),this.subscribeScreen(e.userId,tm.VIDEO))}})),this.on(Mm.onUserUnpublishScreen,(e=>{if(this.singleStreamRenderMode&&Bf(e.mediaType)){var t;const i=null===(t=this._room)||void 0===t?void 0:t.remoteStreams.get(e.userId),o=null==i?void 0:i.find((e=>!e.isScreen));o&&setTimeout((()=>{this._updateVideoPlayerState(o)}))}}))}}Yw([bv()],ww.prototype,"subscribeStream",1),Yw([bv()],ww.prototype,"unsubscribeStream",1),Yw([bv()],ww.prototype,"setRemoteScreenVideoStreamIndex",1),Yw([bv()],ww.prototype,"setRemoteVideoPlayer",1),Yw([bv()],ww.prototype,"destroy",1);const Kw=new xv("VERTC",0);_p.storeKey="".concat(Date.now(),"-").concat(TS.getDeviceId()),sv({rtc_sdk_version:XZ.VERSION,device_id:TS.getDeviceId(),log_cache_key:_p.storeKey}),rv(XZ.LOG_SERVER_URL);let Hw=1;const Fw=(e,t)=>{Kw.info("createEngine","Invoke VERTC.createEngine"),VS(e,"appId");const i=(Hw++).toString();return hv(i,{rtc_app_id:e,auto_play_policy:null==t?void 0:t.autoPlayPolicy}),new Gw(e,i,t)},Jw=(e,t)=>{Kw.print("createBLWEngine","Invoke VERTC.createBLWEngine"),VS(e,"appId");const i=(Hw++).toString();return hv(i,{rtc_app_id:e,auto_play_policy:null==t?void 0:t.autoPlayPolicy}),new ww(e,i,t)},Ow=e=>{if(Kw.info("destroyEngine","Invoke VERTC.destroyEngine"),!(e instanceof Gw))throw new LS(RS.INVALID_ENGINE,"Invalid engine object");var t;e.destroy(),(t=e.monitor).report("sdk_init_engine",{start:Date.now(),type:"end"}),uv.delete(t.id)},Uw=async()=>HN.enumerateDevices(),Dw=async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{video:!0,audio:!0};const{video:t,audio:i}=e,o={video:!1,audio:!1},s=[];return t&&s.push(HN.getPermissions({video:!0,force:!0}).then((e=>{o.video=e.video,e.video||(o.videoExceptionError=e.reason)}))),i&&s.push(HN.getPermissions({audio:!0,force:!0}).then((e=>{o.audio=e.audio,e.audio||(o.audioExceptionError=e.reason)}))),await Promise.allSettled(s),o},Aw=async()=>HN.enumerateAudioCaptureDevices(),zw=async()=>HN.enumerateVideoCaptureDevices(),jw=async()=>HN.enumerateAudioPlaybackDevices(),Qw=()=>XZ.VERSION,Bw=()=>(async()=>{try{return!(Nv()||!window.RTCPeerConnection||!window.RTCPeerConnection.prototype.addTransceiver||!window.RTCPeerConnection.prototype.createDataChannel)&&await oZ()&&await iZ()}catch(e){return!1}})(),qw=()=>(async()=>(await QS()).map((e=>e.toUpperCase())))(),$w=e=>{let{logLevel:t,LogfileSize:i}=e;t&&(_p.logLevel=t),i&&(_p.LogfileSize=i)},eK=e=>{_p.download(e)};function tK(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];return JSON.stringify(t.map((e=>e instanceof Gw?"[ENGINE]":e)))}function iK(e,t){return function(){av(t,0,tK(...arguments));const i=e(...arguments);return"function"==typeof(null==i?void 0:i.then)?i.then((e=>(dv(t,0,tK(e)),e))).catch((e=>{throw dv(t,e.code,e.message),e})):(dv(t,0,tK(i)),i)}}return Ju(Ju(Ju(Ju({},new class{constructor(){Hu(this,"getSdkVersion",iK(Qw,"getSdkVersion")),Hu(this,"createEngine",iK(Fw,"createEngine")),Hu(this,"createBLWEngine",iK(Jw,"createBLWEngine")),Hu(this,"destroyEngine",iK(Ow,"destroyEngine")),Hu(this,"enumerateDevices",iK(Uw,"enumerateDevices")),Hu(this,"enableDevices",iK(Dw,"enableDevices")),Hu(this,"enumerateAudioCaptureDevices",iK(Aw,"enumerateAudioCaptureDevices")),Hu(this,"enumerateVideoCaptureDevices",iK(zw,"enumerateVideoCaptureDevices")),Hu(this,"enumerateAudioPlaybackDevices",iK(jw,"enumerateAudioPlaybackDevices")),Hu(this,"getParameter",WZ),Hu(this,"setParameter",CZ),Hu(this,"isSupported",iK(Bw,"isSupported")),Hu(this,"getSupportedCodecs",iK(qw,"getSupportedCodecs")),Hu(this,"getElectronScreenSources",iK(_M,"getElectronScreenSources")),Hu(this,"events",Mm),Hu(this,"ErrorCode",RS),Hu(this,"platform","VolcEngine"),Hu(this,"commitInfo","HEAD<10420b0*>"),Hu(this,"downloadLog",iK(eK,"downloadLog")),Hu(this,"setLogConfig",iK($w,"setLogConfig"))}}),Em),Nm),{},{events:Mm})}));
