@vonage/ml-transformers 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/assets/highlight.css +0 -14
- package/dist/docs/assets/search.js +1 -1
- package/dist/docs/index.html +1 -1
- package/dist/docs/modules.html +16 -10
- package/dist/ml-transformers.es.js +779 -26
- package/dist/ml-transformers.umd.js +4 -2
- package/dist/types/main.d.ts +17 -54
- package/dist/types/src/transformers/BackgroundTransformer.d.ts +1 -0
- package/dist/types/src/utils/Tools.d.ts +1 -0
- package/dist/types/src/vonage/VonageMediaProcessorThread.d.ts +5 -1
- package/dist/types/src/vonage/VonageMediaProcessorWorker.d.ts +8 -2
- package/package.json +2 -2
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`),function(e){if(m=e.indexOf(":"),b=g.trim(e.substr(0,m)).toLowerCase(),c=g.trim(e.substr(m+1)),b){if(Z[b]&&_l.indexOf(b)>=0)return;b==="set-cookie"?Z[b]=(Z[b]?Z[b]:[]).concat([c]):Z[b]=Z[b]?Z[b]+", "+c:c}}),Z},bl=W,$l=bl.isStandardBrowserEnv()?function(){var l=/(msie|trident)/i.test(navigator.userAgent),Z=document.createElement("a"),b;function c(m){var t=m;return l&&(Z.setAttribute("href",t),t=Z.href),Z.setAttribute("href",t),{href:Z.href,protocol:Z.protocol?Z.protocol.replace(/:$/,""):"",host:Z.host,search:Z.search?Z.search.replace(/^\?/,""):"",hash:Z.hash?Z.hash.replace(/^#/,""):"",hostname:Z.hostname,port:Z.port,pathname:Z.pathname.charAt(0)==="/"?Z.pathname:"/"+Z.pathname}}return b=c(window.location.href),function(t){var e=bl.isString(t)?c(t):t;return e.protocol===b.protocol&&e.host===b.host}}():function(){return function(){return!0}}();function Q(d){this.message=d}Q.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},Q.prototype.__CANCEL__=!0;var v=Q,F=W,ld=Pl,dd=jl,Zd=dl,cd=Al,bd=ql,md=$l,w=cl,nd=f,td=v,ml=function(l){return new Promise(function(b,c){var m=l.data,t=l.headers,e=l.responseType,i;function a(){l.cancelToken&&l.cancelToken.unsubscribe(i),l.signal&&l.signal.removeEventListener("abort",i)}F.isFormData(m)&&delete t["Content-Type"];var n=new XMLHttpRequest;if(l.auth){var u=l.auth.username||"",y=l.auth.password?unescape(encodeURIComponent(l.auth.password)):"";t.Authorization="Basic "+btoa(u+":"+y)}var G=cd(l.baseURL,l.url);n.open(l.method.toUpperCase(),Zd(G,l.params,l.paramsSerializer),!0),n.timeout=l.timeout;function rl(){if(!!n){var V="getAllResponseHeaders"in n?bd(n.getAllResponseHeaders()):null,I=!e||e==="text"||e==="json"?n.responseText:n.response,r={data:I,status:n.status,statusText:n.statusText,headers:V,config:l,request:n};ld(function(O){b(O),a()},function(O){c(O),a()},r),n=null}}if("onloadend"in n?n.onloadend=rl:n.onreadystatechange=function(){!n||n.readyState!==4||n.status===0&&!(n.responseURL&&n.responseURL.indexOf("file:")===0)||setTimeout(rl)},n.onabort=function(){!n||(c(w("Request aborted",l,"ECONNABORTED",n)),n=null)},n.onerror=function(){c(w("Network Error",l,null,n)),n=null},n.ontimeout=function(){var I=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded",r=l.transitional||nd.transitional;l.timeoutErrorMessage&&(I=l.timeoutErrorMessage),c(w(I,l,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",n)),n=null},F.isStandardBrowserEnv()){var Rl=(l.withCredentials||md(G))&&l.xsrfCookieName?dd.read(l.xsrfCookieName):void 0;Rl&&(t[l.xsrfHeaderName]=Rl)}"setRequestHeader"in n&&F.forEach(t,function(I,r){typeof m=="undefined"&&r.toLowerCase()==="content-type"?delete t[r]:n.setRequestHeader(r,I)}),F.isUndefined(l.withCredentials)||(n.withCredentials=!!l.withCredentials),e&&e!=="json"&&(n.responseType=l.responseType),typeof l.onDownloadProgress=="function"&&n.addEventListener("progress",l.onDownloadProgress),typeof l.onUploadProgress=="function"&&n.upload&&n.upload.addEventListener("progress",l.onUploadProgress),(l.cancelToken||l.signal)&&(i=function(V){!n||(c(!V||V&&V.type?new td("canceled"):V),n.abort(),n=null)},l.cancelToken&&l.cancelToken.subscribe(i),l.signal&&(l.signal.aborted?i():l.signal.addEventListener("abort",i))),m||(m=null),n.send(m)})},X=W,nl=gl,ed=Zl,id={"Content-Type":"application/x-www-form-urlencoded"};function tl(d,l){!X.isUndefined(d)&&X.isUndefined(d["Content-Type"])&&(d["Content-Type"]=l)}function ud(){var d;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(d=ml),d}function ad(d,l,Z){if(X.isString(d))try{return(l||JSON.parse)(d),X.trim(d)}catch(b){if(b.name!=="SyntaxError")throw b}return(Z||JSON.stringify)(d)}var z={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:ud(),transformRequest:[function(l,Z){return nl(Z,"Accept"),nl(Z,"Content-Type"),X.isFormData(l)||X.isArrayBuffer(l)||X.isBuffer(l)||X.isStream(l)||X.isFile(l)||X.isBlob(l)?l:X.isArrayBufferView(l)?l.buffer:X.isURLSearchParams(l)?(tl(Z,"application/x-www-form-urlencoded;charset=utf-8"),l.toString()):X.isObject(l)||Z&&Z["Content-Type"]==="application/json"?(tl(Z,"application/json"),ad(l)):l}],transformResponse:[function(l){var Z=this.transitional||z.transitional,b=Z&&Z.silentJSONParsing,c=Z&&Z.forcedJSONParsing,m=!b&&this.responseType==="json";if(m||c&&X.isString(l)&&l.length)try{return JSON.parse(l)}catch(t){if(m)throw t.name==="SyntaxError"?ed(t,this,"E_JSON_PARSE"):t}return l}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(l){return l>=200&&l<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};X.forEach(["delete","get","head"],function(l){z.headers[l]={}}),X.forEach(["post","put","patch"],function(l){z.headers[l]=X.merge(id)});var f=z,Xd=W,Wd=f,Gd=function(l,Z,b){var c=this||Wd;return Xd.forEach(b,function(t){l=t.call(c,l,Z)}),l},el=function(l){return!!(l&&l.__CANCEL__)},il=W,P=Gd,od=el,sd=f,Vd=v;function j(d){if(d.cancelToken&&d.cancelToken.throwIfRequested(),d.signal&&d.signal.aborted)throw new Vd("canceled")}var hd=function(l){j(l),l.headers=l.headers||{},l.data=P.call(l,l.data,l.headers,l.transformRequest),l.headers=il.merge(l.headers.common||{},l.headers[l.method]||{},l.headers),il.forEach(["delete","get","head","post","put","patch","common"],function(c){delete l.headers[c]});var Z=l.adapter||sd.adapter;return Z(l).then(function(c){return j(l),c.data=P.call(l,c.data,c.headers,l.transformResponse),c},function(c){return od(c)||(j(l),c&&c.response&&(c.response.data=P.call(l,c.response.data,c.response.headers,l.transformResponse))),Promise.reject(c)})},o=W,ul=function(l,Z){Z=Z||{};var b={};function c(n,u){return o.isPlainObject(n)&&o.isPlainObject(u)?o.merge(n,u):o.isPlainObject(u)?o.merge({},u):o.isArray(u)?u.slice():u}function m(n){if(o.isUndefined(Z[n])){if(!o.isUndefined(l[n]))return c(void 0,l[n])}else return c(l[n],Z[n])}function t(n){if(!o.isUndefined(Z[n]))return c(void 0,Z[n])}function e(n){if(o.isUndefined(Z[n])){if(!o.isUndefined(l[n]))return c(void 0,l[n])}else return c(void 0,Z[n])}function i(n){if(n in Z)return c(l[n],Z[n]);if(n in l)return c(void 0,l[n])}var a={url:t,method:t,data:t,baseURL:e,transformRequest:e,transformResponse:e,paramsSerializer:e,timeout:e,timeoutMessage:e,withCredentials:e,adapter:e,responseType:e,xsrfCookieName:e,xsrfHeaderName:e,onUploadProgress:e,onDownloadProgress:e,decompress:e,maxContentLength:e,maxBodyLength:e,transport:e,httpAgent:e,httpsAgent:e,cancelToken:e,socketPath:e,responseEncoding:e,validateStatus:i};return o.forEach(Object.keys(l).concat(Object.keys(Z)),function(u){var y=a[u]||m,G=y(u);o.isUndefined(G)&&y!==i||(b[u]=G)}),b},al={version:"0.25.0"},yd=al.version,M={};["object","boolean","number","function","string","symbol"].forEach(function(d,l){M[d]=function(b){return typeof b===d||"a"+(l<1?"n ":" ")+d}});var Xl={};M.transitional=function(l,Z,b){function c(m,t){return"[Axios v"+yd+"] Transitional option '"+m+"'"+t+(b?". "+b:"")}return function(m,t,e){if(l===!1)throw new Error(c(t," has been removed"+(Z?" in "+Z:"")));return Z&&!Xl[t]&&(Xl[t]=!0,console.warn(c(t," has been deprecated since v"+Z+" and will be removed in the near future"))),l?l(m,t,e):!0}};function pd(d,l,Z){if(typeof d!="object")throw new TypeError("options must be an object");for(var b=Object.keys(d),c=b.length;c-- >0;){var m=b[c],t=l[m];if(t){var e=d[m],i=e===void 0||t(e,m,d);if(i!==!0)throw new TypeError("option "+m+" must be "+i);continue}if(Z!==!0)throw Error("Unknown option "+m)}}var rd={assertOptions:pd,validators:M},Wl=W,Rd=dl,Gl=Bl,ol=hd,k=ul,sl=rd,Y=sl.validators;function N(d){this.defaults=d,this.interceptors={request:new Gl,response:new Gl}}N.prototype.request=function(l,Z){if(typeof l=="string"?(Z=Z||{},Z.url=l):Z=l||{},!Z.url)throw new Error("Provided config url is not valid");Z=k(this.defaults,Z),Z.method?Z.method=Z.method.toLowerCase():this.defaults.method?Z.method=this.defaults.method.toLowerCase():Z.method="get";var b=Z.transitional;b!==void 0&&sl.assertOptions(b,{silentJSONParsing:Y.transitional(Y.boolean),forcedJSONParsing:Y.transitional(Y.boolean),clarifyTimeoutError:Y.transitional(Y.boolean)},!1);var c=[],m=!0;this.interceptors.request.forEach(function(G){typeof G.runWhen=="function"&&G.runWhen(Z)===!1||(m=m&&G.synchronous,c.unshift(G.fulfilled,G.rejected))});var t=[];this.interceptors.response.forEach(function(G){t.push(G.fulfilled,G.rejected)});var e;if(!m){var i=[ol,void 0];for(Array.prototype.unshift.apply(i,c),i=i.concat(t),e=Promise.resolve(Z);i.length;)e=e.then(i.shift(),i.shift());return e}for(var a=Z;c.length;){var n=c.shift(),u=c.shift();try{a=n(a)}catch(y){u(y);break}}try{e=ol(a)}catch(y){return Promise.reject(y)}for(;t.length;)e=e.then(t.shift(),t.shift());return e},N.prototype.getUri=function(l){if(!l.url)throw new Error("Provided config url is not valid");return l=k(this.defaults,l),Rd(l.url,l.params,l.paramsSerializer).replace(/^\?/,"")},Wl.forEach(["delete","get","head","options"],function(l){N.prototype[l]=function(Z,b){return this.request(k(b||{},{method:l,url:Z,data:(b||{}).data}))}}),Wl.forEach(["post","put","patch"],function(l){N.prototype[l]=function(Z,b,c){return this.request(k(c||{},{method:l,url:Z,data:b}))}});var Yd=N,Jd=v;function J(d){if(typeof d!="function")throw new TypeError("executor must be a function.");var l;this.promise=new Promise(function(c){l=c});var Z=this;this.promise.then(function(b){if(!!Z._listeners){var c,m=Z._listeners.length;for(c=0;c<m;c++)Z._listeners[c](b);Z._listeners=null}}),this.promise.then=function(b){var c,m=new Promise(function(t){Z.subscribe(t),c=t}).then(b);return m.cancel=function(){Z.unsubscribe(c)},m},d(function(c){Z.reason||(Z.reason=new Jd(c),l(Z.reason))})}J.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},J.prototype.subscribe=function(l){if(this.reason){l(this.reason);return}this._listeners?this._listeners.push(l):this._listeners=[l]},J.prototype.unsubscribe=function(l){if(!!this._listeners){var Z=this._listeners.indexOf(l);Z!==-1&&this._listeners.splice(Z,1)}},J.source=function(){var l,Z=new J(function(c){l=c});return{token:Z,cancel:l}};var Id=J,Kd=function(l){return function(b){return l.apply(null,b)}},Nd=W,Sd=function(l){return Nd.isObject(l)&&l.isAxiosError===!0},Vl=W,Hd=A,C=Yd,Ld=ul,vd=f;function hl(d){var l=new C(d),Z=Hd(C.prototype.request,l);return Vl.extend(Z,C.prototype,l),Vl.extend(Z,l),Z.create=function(c){return hl(Ld(d,c))},Z}var h=hl(vd);h.Axios=C,h.Cancel=v,h.CancelToken=Id,h.isCancel=el,h.VERSION=al.version,h.all=function(l){return Promise.all(l)},h.spread=Kd,h.isAxiosError=Sd,D.exports=h,D.exports.default=h;for(var Fd=[],E=0;E<256;++E)Fd.push((E+256).toString(16).substr(1));class zd{constructor(){this.processor_=null,this.generator_=null}init(l){return new Promise((Z,b)=>{try{this.processor_=new MediaStreamTrackProcessor(l)}catch(c){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${c}`),b(c)}try{l.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):l.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):b("kind not supported")}catch(c){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${c}`),b(c)}Z()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class fd{constructor(l){this.insertableStreamHelper_=new zd,this.mediaProcessor_=l}setTrack(l){return new Promise((Z,b)=>{this.insertableStreamHelper_.init(l).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{Z(this.insertableStreamHelper_.getProccesorTrack())}).catch(c=>{b(c)})}).catch(c=>{b(c)})})}destroy(){return new Promise((l,Z)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{l()}).catch(b=>{Z(b)}):Z("no processor")})}}const yl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIER7fUQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxELmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgX2U9e2V4cG9ydHM6e319LHhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LG10PXhlLGs9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBnZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiB2ZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIF90KHIpe3JldHVybiByIT09bnVsbCYmIXZlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIXZlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBOZShyKXtyZXR1cm4gay5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBndChyKXtyZXR1cm4gay5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiB2dChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJk5lKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIHl0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gd3Qocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBMZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBLKHIpe2lmKGsuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIEN0KHIpe3JldHVybiBrLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gYnQocil7cmV0dXJuIGsuY2FsbChyKT09PSJbb2JqZWN0IEZpbGVdIn1mdW5jdGlvbiBUdChyKXtyZXR1cm4gay5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFVlKHIpe3JldHVybiBrLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIEV0KHIpe3JldHVybiBMZShyKSYmVWUoci5waXBlKX1mdW5jdGlvbiBSdChyKXtyZXR1cm4gay5jYWxsKHIpPT09IltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSJ9ZnVuY3Rpb24gUHQocil7cmV0dXJuIHIudHJpbT9yLnRyaW0oKTpyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBPdCgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiB5ZShyLGUpe2lmKCEocj09PW51bGx8fHR5cGVvZiByPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIHIhPSJvYmplY3QiJiYocj1bcl0pLGdlKHIpKWZvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIHMgaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixzKSYmZS5jYWxsKG51bGwscltzXSxzLHIpfWZ1bmN0aW9uIHdlKCl7dmFyIHI9e307ZnVuY3Rpb24gZShzLG8pe0socltvXSkmJksocyk/cltvXT13ZShyW29dLHMpOksocyk/cltvXT13ZSh7fSxzKTpnZShzKT9yW29dPXMuc2xpY2UoKTpyW29dPXN9Zm9yKHZhciB0PTAsbj1hcmd1bWVudHMubGVuZ3RoO3Q8bjt0KyspeWUoYXJndW1lbnRzW3RdLGUpO3JldHVybiByfWZ1bmN0aW9uIFN0KHIsZSx0KXtyZXR1cm4geWUoZSxmdW5jdGlvbihzLG8pe3QmJnR5cGVvZiBzPT0iZnVuY3Rpb24iP3Jbb109bXQocyx0KTpyW29dPXN9KSxyfWZ1bmN0aW9uIEl0KHIpe3JldHVybiByLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKHI9ci5zbGljZSgxKSkscn12YXIgUD17aXNBcnJheTpnZSxpc0FycmF5QnVmZmVyOk5lLGlzQnVmZmVyOl90LGlzRm9ybURhdGE6Z3QsaXNBcnJheUJ1ZmZlclZpZXc6dnQsaXNTdHJpbmc6eXQsaXNOdW1iZXI6d3QsaXNPYmplY3Q6TGUsaXNQbGFpbk9iamVjdDpLLGlzVW5kZWZpbmVkOnZlLGlzRGF0ZTpDdCxpc0ZpbGU6YnQsaXNCbG9iOlR0LGlzRnVuY3Rpb246VWUsaXNTdHJlYW06RXQsaXNVUkxTZWFyY2hQYXJhbXM6UnQsaXNTdGFuZGFyZEJyb3dzZXJFbnY6T3QsZm9yRWFjaDp5ZSxtZXJnZTp3ZSxleHRlbmQ6U3QsdHJpbTpQdCxzdHJpcEJPTTpJdH0sVz1QO2Z1bmN0aW9uIEJlKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBrZT1mdW5jdGlvbihlLHQsbil7aWYoIXQpcmV0dXJuIGU7dmFyIHM7aWYobilzPW4odCk7ZWxzZSBpZihXLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXM9dC50b1N0cmluZygpO2Vsc2V7dmFyIG89W107Vy5mb3JFYWNoKHQsZnVuY3Rpb24oYyxnKXtjPT09bnVsbHx8dHlwZW9mIGM9PSJ1bmRlZmluZWQifHwoVy5pc0FycmF5KGMpP2c9ZysiW10iOmM9W2NdLFcuZm9yRWFjaChjLGZ1bmN0aW9uKGQpe1cuaXNEYXRlKGQpP2Q9ZC50b0lTT1N0cmluZygpOlcuaXNPYmplY3QoZCkmJihkPUpTT04uc3RyaW5naWZ5KGQpKSxvLnB1c2goQmUoZykrIj0iK0JlKGQpKX0pKX0pLHM9by5qb2luKCImIil9aWYocyl7dmFyIGY9ZS5pbmRleE9mKCIjIik7ZiE9PS0xJiYoZT1lLnNsaWNlKDAsZikpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK3N9cmV0dXJuIGV9LE10PVA7ZnVuY3Rpb24gWSgpe3RoaXMuaGFuZGxlcnM9W119WS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOm4/bi5zeW5jaHJvbm91czohMSxydW5XaGVuOm4/bi5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxZLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sWS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtNdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIEF0PVksRnQ9UCx4dD1mdW5jdGlvbihlLHQpe0Z0LmZvckVhY2goZSxmdW5jdGlvbihzLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPXMsZGVsZXRlIGVbb10pfSl9LEhlPWZ1bmN0aW9uKGUsdCxuLHMsbyl7cmV0dXJuIGUuY29uZmlnPXQsbiYmKGUuY29kZT1uKSxlLnJlcXVlc3Q9cyxlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSxOdD1IZSxEZT1mdW5jdGlvbihlLHQsbixzLG8pe3ZhciBmPW5ldyBFcnJvcihlKTtyZXR1cm4gTnQoZix0LG4scyxvKX0sTHQ9RGUsVXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBzPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFuLnN0YXR1c3x8IXN8fHMobi5zdGF0dXMpP2Uobik6dChMdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKX0sWj1QLEJ0PVouaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGYsbCl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksWi5pc051bWJlcihzKSYmYy5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUocykudG9HTVRTdHJpbmcoKSksWi5pc1N0cmluZyhvKSYmYy5wdXNoKCJwYXRoPSIrbyksWi5pc1N0cmluZyhmKSYmYy5wdXNoKCJkb21haW49IitmKSxsPT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksa3Q9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sSHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sRHQ9a3QsJHQ9SHQsV3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIUR0KHQpPyR0KGUsdCk6dH0sQ2U9UCxxdD1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGp0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZDZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbihsKXtpZihvPWwuaW5kZXhPZigiOiIpLG49Q2UudHJpbShsLnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9Q2UudHJpbShsLnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZxdC5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sJGU9UCxWdD0kZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGY9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixmKSxmPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGYpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihmKXt2YXIgbD0kZS5pc1N0cmluZyhmKT9zKGYpOmY7cmV0dXJuIGwucHJvdG9jb2w9PT1uLnByb3RvY29sJiZsLmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIGJlKHIpe3RoaXMubWVzc2FnZT1yfWJlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxiZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgZWU9YmUsdGU9UCx6dD1VdCxHdD1CdCxKdD1rZSxRdD1XdCxYdD1qdCxLdD1WdCxUZT1EZSxZdD1uZSxadD1lZSxXZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsZj1lLmhlYWRlcnMsbD1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIGcoKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9dGUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGZbIkNvbnRlbnQtVHlwZSJdO3ZhciB1PW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsUj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2YuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK1IpfXZhciB5PVF0KGUuYmFzZVVSTCxlLnVybCk7dS5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksSnQoeSxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSx1LnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIEkoKXtpZighIXUpe3ZhciBUPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gdT9YdCh1LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IWx8fGw9PT0idGV4dCJ8fGw9PT0ianNvbiI/dS5yZXNwb25zZVRleHQ6dS5yZXNwb25zZSxBPXtkYXRhOk8sc3RhdHVzOnUuc3RhdHVzLHN0YXR1c1RleHQ6dS5zdGF0dXNUZXh0LGhlYWRlcnM6VCxjb25maWc6ZSxyZXF1ZXN0OnV9O3p0KGZ1bmN0aW9uKHope24oeiksZygpfSxmdW5jdGlvbih6KXtzKHopLGcoKX0sQSksdT1udWxsfX1pZigib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9STp1Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyF1fHx1LnJlYWR5U3RhdGUhPT00fHx1LnN0YXR1cz09PTAmJiEodS5yZXNwb25zZVVSTCYmdS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoSSl9LHUub25hYm9ydD1mdW5jdGlvbigpeyF1fHwocyhUZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLHUpKSx1PW51bGwpfSx1Lm9uZXJyb3I9ZnVuY3Rpb24oKXtzKFRlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsdSkpLHU9bnVsbH0sdS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsQT1lLnRyYW5zaXRpb25hbHx8WXQudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKFRlKE8sZSxBLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbH0sdGUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIE09KGUud2l0aENyZWRlbnRpYWxzfHxLdCh5KSkmJmUueHNyZkNvb2tpZU5hbWU/R3QucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7TSYmKGZbZS54c3JmSGVhZGVyTmFtZV09TSl9InNldFJlcXVlc3RIZWFkZXIiaW4gdSYmdGUuZm9yRWFjaChmLGZ1bmN0aW9uKE8sQSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZBLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgZltBXTp1LnNldFJlcXVlc3RIZWFkZXIoQSxPKX0pLHRlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KHUud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLGwmJmwhPT0ianNvbiImJih1LnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmdS51cGxvYWQmJnUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKFQpeyF1fHwocyghVHx8VCYmVC50eXBlP25ldyBadCgiY2FuY2VsZWQiKTpUKSx1LmFib3J0KCksdT1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSx1LnNlbmQobyl9KX0sdz1QLHFlPXh0LGVyPUhlLHRyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gamUocixlKXshdy5pc1VuZGVmaW5lZChyKSYmdy5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBycigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPVdlKSxyfWZ1bmN0aW9uIG5yKHIsZSx0KXtpZih3LmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksdy50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciByZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOnJyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gcWUodCwiQWNjZXB0IikscWUodCwiQ29udGVudC1UeXBlIiksdy5pc0Zvcm1EYXRhKGUpfHx3LmlzQXJyYXlCdWZmZXIoZSl8fHcuaXNCdWZmZXIoZSl8fHcuaXNTdHJlYW0oZSl8fHcuaXNGaWxlKGUpfHx3LmlzQmxvYihlKT9lOncuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6dy5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oamUodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOncuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhqZSh0LCJhcHBsaWNhdGlvbi9qc29uIiksbnIoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHJlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJncuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChmKXtpZihvKXRocm93IGYubmFtZT09PSJTeW50YXhFcnJvciI/ZXIoZix0aGlzLCJFX0pTT05fUEFSU0UiKTpmfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O3cuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXtyZS5oZWFkZXJzW2VdPXt9fSksdy5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7cmUuaGVhZGVyc1tlXT13Lm1lcmdlKHRyKX0pO3ZhciBuZT1yZSxzcj1QLGlyPW5lLG9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxpcjtyZXR1cm4gc3IuZm9yRWFjaChuLGZ1bmN0aW9uKGYpe2U9Zi5jYWxsKHMsZSx0KX0pLGV9LFZlPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LHplPVAsRWU9b3IsYXI9VmUsdXI9bmUsZnI9ZWU7ZnVuY3Rpb24gUmUocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IGZyKCJjYW5jZWxlZCIpfXZhciBscj1mdW5jdGlvbihlKXtSZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9RWUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9emUubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSx6ZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fHVyLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4gUmUoZSkscy5kYXRhPUVlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBhcihzKXx8KFJlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9RWUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsR2U9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHModSxkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KHUpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZSh1LGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKHUpe2lmKFMuaXNVbmRlZmluZWQodFt1XSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBzKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBzKGVbdV0sdFt1XSl9ZnVuY3Rpb24gZih1KXtpZighUy5pc1VuZGVmaW5lZCh0W3VdKSlyZXR1cm4gcyh2b2lkIDAsdFt1XSl9ZnVuY3Rpb24gbCh1KXtpZihTLmlzVW5kZWZpbmVkKHRbdV0pKXtpZighUy5pc1VuZGVmaW5lZChlW3VdKSlyZXR1cm4gcyh2b2lkIDAsZVt1XSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFt1XSl9ZnVuY3Rpb24gYyh1KXtpZih1IGluIHQpcmV0dXJuIHMoZVt1XSx0W3VdKTtpZih1IGluIGUpcmV0dXJuIHModm9pZCAwLGVbdV0pfXZhciBnPXt1cmw6ZixtZXRob2Q6ZixkYXRhOmYsYmFzZVVSTDpsLHRyYW5zZm9ybVJlcXVlc3Q6bCx0cmFuc2Zvcm1SZXNwb25zZTpsLHBhcmFtc1NlcmlhbGl6ZXI6bCx0aW1lb3V0OmwsdGltZW91dE1lc3NhZ2U6bCx3aXRoQ3JlZGVudGlhbHM6bCxhZGFwdGVyOmwscmVzcG9uc2VUeXBlOmwseHNyZkNvb2tpZU5hbWU6bCx4c3JmSGVhZGVyTmFtZTpsLG9uVXBsb2FkUHJvZ3Jlc3M6bCxvbkRvd25sb2FkUHJvZ3Jlc3M6bCxkZWNvbXByZXNzOmwsbWF4Q29udGVudExlbmd0aDpsLG1heEJvZHlMZW5ndGg6bCx0cmFuc3BvcnQ6bCxodHRwQWdlbnQ6bCxodHRwc0FnZW50OmwsY2FuY2VsVG9rZW46bCxzb2NrZXRQYXRoOmwscmVzcG9uc2VFbmNvZGluZzpsLHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgUj1nW2RdfHxvLHk9UihkKTtTLmlzVW5kZWZpbmVkKHkpJiZSIT09Y3x8KG5bZF09eSl9KSxufSxKZT17dmVyc2lvbjoiMC4yNS4wIn0sY3I9SmUudmVyc2lvbixQZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtQZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgUWU9e307UGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sZil7cmV0dXJuIltBeGlvcyB2IitjcisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2YrKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxmLGwpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhmLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFRZVtmXSYmKFFlW2ZdPSEwLGNvbnNvbGUud2FybihzKGYsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sZixsKTohMH19O2Z1bmN0aW9uIGhyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sZj1lW29dO2lmKGYpe3ZhciBsPXJbb10sYz1sPT09dm9pZCAwfHxmKGwsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBkcj17YXNzZXJ0T3B0aW9uczpocix2YWxpZGF0b3JzOlBlfSxYZT1QLHByPWtlLEtlPUF0LFllPWxyLHNlPUdlLFplPWRyLHE9WmUudmFsaWRhdG9ycztmdW5jdGlvbiBHKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgS2UscmVzcG9uc2U6bmV3IEtlfX1HLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PXNlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJlplLmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6cS50cmFuc2l0aW9uYWwocS5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpxLnRyYW5zaXRpb25hbChxLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6cS50cmFuc2l0aW9uYWwocS5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHkpe3R5cGVvZiB5LnJ1bldoZW49PSJmdW5jdGlvbiImJnkucnVuV2hlbih0KT09PSExfHwobz1vJiZ5LnN5bmNocm9ub3VzLHMudW5zaGlmdCh5LmZ1bGZpbGxlZCx5LnJlamVjdGVkKSl9KTt2YXIgZj1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHkpe2YucHVzaCh5LmZ1bGZpbGxlZCx5LnJlamVjdGVkKX0pO3ZhciBsO2lmKCFvKXt2YXIgYz1bWWUsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGYpLGw9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOylsPWwudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gbH1mb3IodmFyIGc9dDtzLmxlbmd0aDspe3ZhciB1PXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7Zz11KGcpfWNhdGNoKFIpe2QoUik7YnJlYWt9fXRyeXtsPVllKGcpfWNhdGNoKFIpe3JldHVybiBQcm9taXNlLnJlamVjdChSKX1mb3IoO2YubGVuZ3RoOylsPWwudGhlbihmLnNoaWZ0KCksZi5zaGlmdCgpKTtyZXR1cm4gbH0sRy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9c2UodGhpcy5kZWZhdWx0cyxlKSxwcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxYZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtHLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3Qoc2Uobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLFhlLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtHLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChzZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBtcj1HLF9yPWVlO2Z1bmN0aW9uIGoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGYpe3Quc3Vic2NyaWJlKGYpLHM9Zn0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBfcihzKSxlKHQucmVhc29uKSl9KX1qLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LGoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxqLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxqLnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IGooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgZ3I9aix2cj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LHlyPVAsd3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHlyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxldD1QLENyPXhlLGllPW1yLGJyPUdlLFRyPW5lO2Z1bmN0aW9uIHR0KHIpe3ZhciBlPW5ldyBpZShyKSx0PUNyKGllLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBldC5leHRlbmQodCxpZS5wcm90b3R5cGUsZSksZXQuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHR0KGJyKHIscykpfSx0fXZhciBOPXR0KFRyKTtOLkF4aW9zPWllLE4uQ2FuY2VsPWVlLE4uQ2FuY2VsVG9rZW49Z3IsTi5pc0NhbmNlbD1WZSxOLlZFUlNJT049SmUudmVyc2lvbixOLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LE4uc3ByZWFkPXZyLE4uaXNBeGlvc0Vycm9yPXdyLF9lLmV4cG9ydHM9TixfZS5leHBvcnRzLmRlZmF1bHQ9Tjt2YXIgRXI9X2UuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHJ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHJ0KGUpOm5ldyBudH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IG50fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHJ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3MgbnQgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgUnI9IjEuMC4xIjtjbGFzcyBMe2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVwb3J0PXthY3Rpb246cC5lbXB0eSgpLGFwcGxpY2F0aW9uSWQ6cC5vZk51bGxhYmxlKG51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpwLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6cC5lbXB0eSgpLGd1aWQ6cC5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpwLmVtcHR5KCksbWVzc2FnZTpwLmVtcHR5KCksc291cmNlOnAub2ZOdWxsYWJsZShudWxsKSx0cmFuc2Zvcm1lZEZwczpwLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOnAuZW1wdHkoKSx2YXJpYXRpb246cC5lbXB0eSgpLHZpZGVvSGVpZ2h0OnAuZW1wdHkoKSx2aWRlb1dpZHRoOnAuZW1wdHkoKSx2ZXJzaW9uOlJyfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1wLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1wLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9cC5vZk51bGxhYmxlKGUpLHRoaXN9YnVpbGQoKXtyZXR1cm4gdGhpcy5fcmVwb3J0fX1jb25zdCBQcj1yPT5KU09OLnN0cmluZ2lmeShyLChlLHQpPT57aWYodCE9PW51bGwpcmV0dXJuIHR9KTtjbGFzcyBVe3N0YXRpYyByZXBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57bGV0IHM9RXIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fTtjb25zdCBmPSJodHRwczovL2hsZy5kZXYudG9rYm94LmNvbS9kZXYvbG9nZ2luZy92Y3Bfd2VicnRjIjtzLnBvc3QoZixQcihlKSxvKS50aGVuKGw9Pntjb25zb2xlLmxvZyhsKSx0KCJzdWNjZXNzIil9KS5jYXRjaChsPT57Y29uc29sZS5sb2cobCksbihsKX0pfSl9fXZhciBvZSxPcj1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gU3IoKXtpZighb2UmJihvZT10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhb2UpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gb2UoT3IpfXZhciBJcj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmSXIudGVzdChyKX1mb3IodmFyIEM9W10sT2U9MDtPZTwyNTY7KytPZSlDLnB1c2goKE9lKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gQXIocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oQ1tyW2UrMF1dK0NbcltlKzFdXStDW3JbZSsyXV0rQ1tyW2UrM11dKyItIitDW3JbZSs0XV0rQ1tyW2UrNV1dKyItIitDW3JbZSs2XV0rQ1tyW2UrN11dKyItIitDW3JbZSs4XV0rQ1tyW2UrOV1dKyItIitDW3JbZSsxMF1dK0NbcltlKzExXV0rQ1tyW2UrMTJdXStDW3JbZSsxM11dK0NbcltlKzE0XV0rQ1tyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighTXIodCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBzdChyLGUsdCl7cj1yfHx7fTt2YXIgbj1yLnJhbmRvbXx8KHIucm5nfHxTcikoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBzPTA7czwxNjsrK3MpZVt0K3NdPW5bc107cmV0dXJuIGV9cmV0dXJuIEFyKG4pfWNvbnN0IEZyPTUwMDtjbGFzcyB4cntjb25zdHJ1Y3RvcihlKXt0aGlzLnV1aWRfPXN0KCksdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZwc189MCx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpO2NvbnN0IHQ9bmV3IEwoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTtVLnJlcG9ydCh0KX1hc3luYyBzdGFydChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaHtjb25zdCBuPW5ldyBMKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKEQuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtVLnJlcG9ydChuKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG4scyxvLGY7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSx0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShzPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9zOjAsKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgoZj0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6Zi5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PUZyJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaHtjb25zdCBjPW5ldyBMKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKEQuZXJyb3JzLnRyYW5zZm9ybWVyX3RyYW5zZm9ybSkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7VS5yZXBvcnQoYyl9fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2h7Y29uc3Qgcz1uZXcgTCgpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShELmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO1UucmVwb3J0KHMpfX10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKTtjb25zdCB0PW5ldyBMKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7VS5yZXBvcnQodCl9c3RvcCgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFN0b3Agc3RyZWFtLiIpLHRoaXMuc2hvdWxkU3RvcF89ITB9bWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpe2xldCBlPShEYXRlLm5vdygpLXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXykvMWUzLHQ9dGhpcy5mcmFtZXNGcm9tU291cmNlXy9lLG49dGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8vZTtjb25zdCBzPW5ldyBMKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKG4pLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTtVLnJlcG9ydChzKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3MgTnJ7Y29uc3RydWN0b3IoZSl7dGhpcy50cmFuc2Zvcm1lcnNfPVtdO2ZvcihsZXQgdCBvZiBlKXRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKG5ldyB4cih0KSl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IG49ZTtmb3IobGV0IHMgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKHMpKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgbi5jYW5jZWwoKX0pLmNhdGNoKGFzeW5jIHM9PntlLmNhbmNlbCgpLnRoZW4oKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTaHV0dGluZyBkb3duIHN0cmVhbXMgYWZ0ZXIgYWJvcnQuIil9KS5jYXRjaChvPT57Y29uc29sZS5lcnJvcigiW1BpcGVsaW5lXSBFcnJvciBmcm9tIHN0cmVhbSB0cmFuc2Zvcm06IixvKX0pLGF3YWl0IHQuYWJvcnQocyksYXdhaXQgbi5jYW5jZWwocyl9KX1jYXRjaHt0aGlzLmRlc3Ryb3koKTtyZXR1cm59Y29uc29sZS5sb2coIltQaXBlbGluZV0gUGlwZWxpbmUgc3RhcnRlZC4iKX1hc3luYyBkZXN0cm95KCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gRGVzdHJveWluZyBQaXBlbGluZS4iKTtmb3IobGV0IGUgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWUuc3RvcCgpfX1jbGFzcyBMcntjb25zdHJ1Y3Rvcigpe3RoaXMudXVpZF89c3QoKTtjb25zdCBlPW5ldyBMKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO1UucmVwb3J0KGUpfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IEwoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKEQuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO1UucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpfXRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCksdGhpcy5waXBlbGluZV89bmV3IE5yKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChuPT57dChuKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IEwoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKEQudXBkYXRlcy50cmFuc2Zvcm1lcl9uZXcpLnZhcmlhdGlvbigiVXBkYXRlIikuYnVpbGQoKTtyZXR1cm4gVS5yZXBvcnQodCksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpO2NvbnN0IHQ9bmV3IEwoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7VS5yZXBvcnQodCksZSgpfSl9fXZhciBhZTsoZnVuY3Rpb24ocil7ci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIn0pKGFlfHwoYWU9e30pKTtjbGFzcyBpdHtjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1hZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5maWx0ZXI9dGhpcy5ibHVyRmlsdGVyXyxlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNsYXNzIFVye2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuaW1hZ2VDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLmltYWdlQ3R4Xz10aGlzLmltYWdlQ2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLHdpbGxSZWFkRnJlcXVlbnRseTohMCxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLmltYWdlQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7dGhpcy5pbWFnZUJsb2JfPXZvaWQgMCxmZXRjaChlKS50aGVuKHQ9Pnt0LmJsb2IoKS50aGVuKG49Pnt0aGlzLmltYWdlQmxvYl89bn0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJibG9iIGVycm9yIixuKX0pfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoImZldGNoIGVycm9yIix0KX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKHR5cGVvZiB0aGlzLmltYWdlQmxvYl8hPSJ1bmRlZmluZWQiJiYodGhpcy5pbWFnZUNhbnZhc18ud2lkdGghPXQud2lkdGh8fHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCE9dC5oZWlnaHQpKXt0aGlzLmltYWdlQ2FudmFzXy53aWR0aD10LndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodD10LmhlaWdodDtjb25zdCBuPSJoaWdoIixzPXtyZXNpemVXaWR0aDp0LndpZHRoLHJlc2l6ZUhlaWdodDp0LmhlaWdodCxyZXNpemVRdWFsaXR5Om59LG89Y3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5pbWFnZUJsb2JfLHMpLnRoZW4oZj0+e3RoaXMuaW1hZ2VDdHhfLmRyYXdJbWFnZShmLDAsMCl9KS5jYXRjaChmPT57Y29uc29sZS5lcnJvcigiZXJyb3IgY3JlYXRlSW1hZ2VCaXRtYXAiLGYpfSl9ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZHJhd0ltYWdlKHRoaXMuaW1hZ2VDYW52YXNfLDAsMCx0aGlzLmltYWdlQ2FudmFzXy53aWR0aCx0aGlzLmltYWdlQ2FudmFzXy5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlydHVhbFBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgQnJ7Y29uc3RydWN0b3IoZT0xLzApe3RoaXMuY2FwYWNpdHk9ZSx0aGlzLnN0b3JhZ2U9W119ZW5xdWV1ZShlKXtpZih0aGlzLnNpemUoKT09PXRoaXMuY2FwYWNpdHkpdGhyb3cgRXJyb3IoIlF1ZXVlIGhhcyByZWFjaGVkIG1heCBjYXBhY2l0eSwgeW91IGNhbm5vdCBhZGQgbW9yZSBpdGVtcyIpO3RoaXMuc3RvcmFnZS5wdXNoKGUpfWRlcXVldWUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLnNoaWZ0KCl9c2l6ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2UubGVuZ3RofX1jbGFzcyBrcntjb25zdHJ1Y3RvcihlKXtjb25zb2xlLmxvZygiW1ZpZGVvUG9zdFByb2Nlc3NdIEN0b3IiKSx0aGlzLnF1ZXVlXz1uZXcgQnIsZSYmKHRoaXMuZnJhbWVSZWFkZXJfPWUuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXByb2Nlc3NGcmFtZShlKXtlLmRvbmV8fCh0aGlzLnF1ZXVlXy5lbnF1ZXVlKGUudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHRoaXMucHJvY2Vzc0ZyYW1lLmJpbmQodGhpcykpLmNhdGNoKHQ9PmNvbnNvbGUuZXJyb3IodCkpKX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtpZihlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IG49dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UuZHJhd0ltYWdlKG4sMCwwLHQud2lkdGgsdC5oZWlnaHQpLG4uY2xvc2UoKX1lbHNlIGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWZ1bmN0aW9uIEhyKCl7cmV0dXJuInNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIn12YXIgdWU9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZSE9InVuZGVmaW5lZCI/ZTp7fSxuLHM7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihpLGEpe249aSxzPWF9KTt2YXIgbz17fSxmO2ZvcihmIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShmKSYmKG9bZl09dFtmXSk7dmFyIGw9Ii4vdGhpcy5wcm9ncmFtIixjPWZ1bmN0aW9uKGksYSl7dGhyb3cgYX0sZz0hMCx1PSIiO2Z1bmN0aW9uIGQoaSl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUoaSx1KTp1K2l9dmFyIFI7dHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHU9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJih1PXIpLHUuaW5kZXhPZigiYmxvYjoiKSE9PTA/dT11LnN1YnN0cigwLHUucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTp1PSIiO3ZhciB5PXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksST10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IoZiBpbiBvKW8uaGFzT3duUHJvcGVydHkoZikmJih0W2ZdPW9bZl0pO289bnVsbCx0LmFyZ3VtZW50cyx0LnRoaXNQcm9ncmFtJiYobD10LnRoaXNQcm9ncmFtKSx0LnF1aXQmJihjPXQucXVpdCk7dmFyIE07dC53YXNtQmluYXJ5JiYoTT10Lndhc21CaW5hcnkpO3ZhciBUPXQubm9FeGl0UnVudGltZXx8ITA7dHlwZW9mIFdlYkFzc2VtYmx5IT0ib2JqZWN0IiYmSCgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBPLEE9ITEsZmU9dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24geihpLGEsaCl7Zm9yKHZhciBtPWEraCx2PWE7aVt2XSYmISh2Pj1tKTspKyt2O2lmKHYtYT4xNiYmaS5zdWJhcnJheSYmZmUpcmV0dXJuIGZlLmRlY29kZShpLnN1YmFycmF5KGEsdikpO2Zvcih2YXIgYj0iIjthPHY7KXt2YXIgXz1pW2ErK107aWYoIShfJjEyOCkpe2IrPVN0cmluZy5mcm9tQ2hhckNvZGUoXyk7Y29udGludWV9dmFyIEU9aVthKytdJjYzO2lmKChfJjIyNCk9PTE5Mil7Yis9U3RyaW5nLmZyb21DaGFyQ29kZSgoXyYzMSk8PDZ8RSk7Y29udGludWV9dmFyIEI9aVthKytdJjYzO2lmKChfJjI0MCk9PTIyND9fPShfJjE1KTw8MTJ8RTw8NnxCOl89KF8mNyk8PDE4fEU8PDEyfEI8PDZ8aVthKytdJjYzLF88NjU1MzYpYis9U3RyaW5nLmZyb21DaGFyQ29kZShfKTtlbHNle3ZhciBwdD1fLTY1NTM2O2IrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8cHQ+PjEwLDU2MzIwfHB0JjEwMjMpfX1yZXR1cm4gYn1mdW5jdGlvbiBsZShpLGEpe3JldHVybiBpP3ooSixpLGEpOiIifWZ1bmN0aW9uIHFyKGksYSxoKXtmb3IodmFyIG09MDttPGkubGVuZ3RoOysrbSljZVthKys+PjBdPWkuY2hhckNvZGVBdChtKTtofHwoY2VbYT4+MF09MCl9ZnVuY3Rpb24ganIoaSxhKXtyZXR1cm4gaSVhPjAmJihpKz1hLWklYSksaX12YXIgb3QsY2UsSixGO2Z1bmN0aW9uIGF0KGkpe290PWksdC5IRUFQOD1jZT1uZXcgSW50OEFycmF5KGkpLHQuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGkpLHQuSEVBUDMyPUY9bmV3IEludDMyQXJyYXkoaSksdC5IRUFQVTg9Sj1uZXcgVWludDhBcnJheShpKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGkpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkoaSksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoaSksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoaSl9dC5JTklUSUFMX01FTU9SWTt2YXIgSWUsdXQ9W10sZnQ9W10sbHQ9W10sVnI9MDtmdW5jdGlvbiB6cigpe3JldHVybiBUfHxWcj4wfWZ1bmN0aW9uIEdyKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspWHIodC5wcmVSdW4uc2hpZnQoKSk7TWUodXQpfWZ1bmN0aW9uIEpyKCl7TWUoZnQpfWZ1bmN0aW9uIFFyKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOylZcih0LnBvc3RSdW4uc2hpZnQoKSk7TWUobHQpfWZ1bmN0aW9uIFhyKGkpe3V0LnVuc2hpZnQoaSl9ZnVuY3Rpb24gS3IoaSl7ZnQudW5zaGlmdChpKX1mdW5jdGlvbiBZcihpKXtsdC51bnNoaWZ0KGkpfXZhciAkPTAsUT1udWxsO2Z1bmN0aW9uIFpyKGkpeyQrKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcygkKX1mdW5jdGlvbiBlbihpKXtpZigkLS0sdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoJCksJD09MCYmUSl7dmFyIGE9UTtRPW51bGwsYSgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBIKGkpe3Qub25BYm9ydCYmdC5vbkFib3J0KGkpLGk9IkFib3J0ZWQoIitpKyIpIixJKGkpLEE9ITAsaSs9Ii4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3ZhciBhPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoaSk7dGhyb3cgcyhhKSxhfXZhciB0bj0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gY3QoaSl7cmV0dXJuIGkuc3RhcnRzV2l0aCh0bil9dmFyIHg7eD0idGZsaXRlLXNpbWQud2FzbSIsY3QoeCl8fCh4PWQoeCkpO2Z1bmN0aW9uIGh0KGkpe3RyeXtpZihpPT14JiZNKXJldHVybiBuZXcgVWludDhBcnJheShNKTtpZighUil0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2goYSl7SChhKX19ZnVuY3Rpb24gcm4oKXtyZXR1cm4hTSYmZyYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHgse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGkpe2lmKCFpLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIreCsiJyI7cmV0dXJuIGkuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGh0KHgpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBodCh4KX0pfWZ1bmN0aW9uIG5uKCl7dmFyIGk9e2E6Um59O2Z1bmN0aW9uIGEoXyxFKXt2YXIgQj1fLmV4cG9ydHM7dC5hc209QixPPXQuYXNtLnEsYXQoTy5idWZmZXIpLEllPXQuYXNtLkQsS3IodC5hc20uciksZW4oKX1acigpO2Z1bmN0aW9uIGgoXyl7YShfLmluc3RhbmNlKX1mdW5jdGlvbiBtKF8pe3JldHVybiBybigpLnRoZW4oZnVuY3Rpb24oRSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEUsaSl9KS50aGVuKGZ1bmN0aW9uKEUpe3JldHVybiBFfSkudGhlbihfLGZ1bmN0aW9uKEUpe0koImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrRSksSChFKX0pfWZ1bmN0aW9uIHYoKXtyZXR1cm4hTSYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhY3QoeCkmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaCh4LHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihfKXt2YXIgRT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhfLGkpO3JldHVybiBFLnRoZW4oaCxmdW5jdGlvbihCKXtyZXR1cm4gSSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrQiksSSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxtKGgpfSl9KTptKGgpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgYj10Lmluc3RhbnRpYXRlV2FzbShpLGEpO3JldHVybiBifWNhdGNoKF8pe3JldHVybiBJKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK18pLCExfXJldHVybiB2KCkuY2F0Y2gocykse319ZnVuY3Rpb24gTWUoaSl7Zm9yKDtpLmxlbmd0aD4wOyl7dmFyIGE9aS5zaGlmdCgpO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXthKHQpO2NvbnRpbnVlfXZhciBoPWEuZnVuYzt0eXBlb2YgaD09Im51bWJlciI/YS5hcmc9PT12b2lkIDA/SWUuZ2V0KGgpKCk6SWUuZ2V0KGgpKGEuYXJnKTpoKGEuYXJnPT09dm9pZCAwP251bGw6YS5hcmcpfX1mdW5jdGlvbiBzbihpLGEsaCxtKXtIKCJBc3NlcnRpb24gZmFpbGVkOiAiK2xlKGkpKyIsIGF0OiAiK1thP2xlKGEpOiJ1bmtub3duIGZpbGVuYW1lIixoLG0/bGUobSk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gb24oaSxhKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBhbihpLGEpe0goIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIHVuKCl7SCgiIil9dmFyIGhlO2hlPWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTt2YXIgZm49ITA7ZnVuY3Rpb24gbG4oaSl7cmV0dXJuIEZbZHQoKT4+Ml09aSxpfWZ1bmN0aW9uIGNuKGksYSl7dmFyIGg7aWYoaT09PTApaD1EYXRlLm5vdygpO2Vsc2UgaWYoKGk9PT0xfHxpPT09NCkmJmZuKWg9aGUoKTtlbHNlIHJldHVybiBsbigyOCksLTE7cmV0dXJuIEZbYT4+Ml09aC8xZTN8MCxGW2ErND4+Ml09aCUxZTMqMWUzKjFlM3wwLDB9ZnVuY3Rpb24gaG4oKXtyZXR1cm4gMjE0NzQ4MzY0OH1mdW5jdGlvbiBkbihpLGEsaCl7Si5jb3B5V2l0aGluKGksYSxhK2gpfWZ1bmN0aW9uIHBuKGkpe3RyeXtyZXR1cm4gTy5ncm93KGktb3QuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2KSxhdChPLmJ1ZmZlciksMX1jYXRjaHt9fWZ1bmN0aW9uIG1uKGkpe3ZhciBhPUoubGVuZ3RoO2k9aT4+PjA7dmFyIGg9MjE0NzQ4MzY0ODtpZihpPmgpcmV0dXJuITE7Zm9yKHZhciBtPTE7bTw9NDttKj0yKXt2YXIgdj1hKigxKy4yL20pO3Y9TWF0aC5taW4odixpKzEwMDY2MzI5Nik7dmFyIGI9TWF0aC5taW4oaCxqcihNYXRoLm1heChpLHYpLDY1NTM2KSksXz1wbihiKTtpZihfKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIF9uKGkpe2Zvcih2YXIgYT1oZSgpO2hlKCktYTxpOyk7fXZhciBBZT17fTtmdW5jdGlvbiBnbigpe3JldHVybiBsfHwiLi90aGlzLnByb2dyYW0ifWZ1bmN0aW9uIFgoKXtpZighWC5zdHJpbmdzKXt2YXIgaT0odHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixhPXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6aSxfOmduKCl9O2Zvcih2YXIgaCBpbiBBZSlBZVtoXT09PXZvaWQgMD9kZWxldGUgYVtoXTphW2hdPUFlW2hdO3ZhciBtPVtdO2Zvcih2YXIgaCBpbiBhKW0ucHVzaChoKyI9IithW2hdKTtYLnN0cmluZ3M9bX1yZXR1cm4gWC5zdHJpbmdzfXZhciBkZT17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGksYSl7dmFyIGg9ZGUuYnVmZmVyc1tpXTthPT09MHx8YT09PTEwPygoaT09PTE/eTpJKSh6KGgsMCkpLGgubGVuZ3RoPTApOmgucHVzaChhKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7ZGUudmFyYXJncys9NDt2YXIgaT1GW2RlLnZhcmFyZ3MtND4+Ml07cmV0dXJuIGl9LGdldFN0cjpmdW5jdGlvbihpKXt2YXIgYT1sZShpKTtyZXR1cm4gYX0sZ2V0NjQ6ZnVuY3Rpb24oaSxhKXtyZXR1cm4gaX19O2Z1bmN0aW9uIHZuKGksYSl7dmFyIGg9MDtyZXR1cm4gWCgpLmZvckVhY2goZnVuY3Rpb24obSx2KXt2YXIgYj1hK2g7RltpK3YqND4+Ml09YixxcihtLGIpLGgrPW0ubGVuZ3RoKzF9KSwwfWZ1bmN0aW9uIHluKGksYSl7dmFyIGg9WCgpO0ZbaT4+Ml09aC5sZW5ndGg7dmFyIG09MDtyZXR1cm4gaC5mb3JFYWNoKGZ1bmN0aW9uKHYpe20rPXYubGVuZ3RoKzF9KSxGW2E+PjJdPW0sMH1mdW5jdGlvbiB3bihpKXtPbihpKX1mdW5jdGlvbiBDbihpKXtyZXR1cm4gMH1mdW5jdGlvbiBibihpLGEsaCxtLHYpe31mdW5jdGlvbiBUbihpLGEsaCxtKXtmb3IodmFyIHY9MCxiPTA7YjxoO2IrKyl7Zm9yKHZhciBfPUZbYStiKjg+PjJdLEU9RlthKyhiKjgrNCk+PjJdLEI9MDtCPEU7QisrKWRlLnByaW50Q2hhcihpLEpbXytCXSk7dis9RX1yZXR1cm4gRlttPj4yXT12LDB9ZnVuY3Rpb24gRW4oKXtpZih0eXBlb2YgY3J5cHRvPT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiIpe3ZhciBpPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGkpLGlbMF19fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKCl7SCgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIHBlKGksYSl7cGUucmFuZG9tRGV2aWNlfHwocGUucmFuZG9tRGV2aWNlPUVuKCkpO2Zvcih2YXIgaD0wO2g8YTtoKyspY2VbaStoPj4wXT1wZS5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgUm49e2E6c24sZTpvbixkOmFuLGI6dW4sbjpjbixoOmhuLGw6ZG4sbTptbixwOl9uLGY6dm4sZzp5bixqOnduLGk6Q24sazpibixjOlRuLG86cGV9O25uKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgZHQ9dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybihkdD10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbWU7ZnVuY3Rpb24gUG4oaSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitpKyIpIix0aGlzLnN0YXR1cz1pfVE9ZnVuY3Rpb24gaSgpe21lfHxGZSgpLG1lfHwoUT1pKX07ZnVuY3Rpb24gRmUoaSl7aWYoJD4wfHwoR3IoKSwkPjApKXJldHVybjtmdW5jdGlvbiBhKCl7bWV8fChtZT0hMCx0LmNhbGxlZFJ1bj0hMCwhQSYmKEpyKCksbih0KSx0Lm9uUnVudGltZUluaXRpYWxpemVkJiZ0Lm9uUnVudGltZUluaXRpYWxpemVkKCksUXIoKSkpfXQuc2V0U3RhdHVzPyh0LnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zZXRTdGF0dXMoIiIpfSwxKSxhKCl9LDEpKTphKCl9dC5ydW49RmU7ZnVuY3Rpb24gT24oaSxhKXtTbihpKX1mdW5jdGlvbiBTbihpKXt6cigpfHwodC5vbkV4aXQmJnQub25FeGl0KGkpLEE9ITApLGMoaSxuZXcgUG4oaSkpfWlmKHQucHJlSW5pdClmb3IodHlwZW9mIHQucHJlSW5pdD09ImZ1bmN0aW9uIiYmKHQucHJlSW5pdD1bdC5wcmVJbml0XSk7dC5wcmVJbml0Lmxlbmd0aD4wOyl0LnByZUluaXQucG9wKCkoKTtyZXR1cm4gRmUoKSxlLnJlYWR5fX0oKTt0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiP21vZHVsZS5leHBvcnRzPXVlOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHVlfSk6dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiYoZXhwb3J0cy5jcmVhdGVWb25hZ2VURkxpdGVTaW1kTW9kdWxlPXVlKTtjbGFzcyBEcntjb25zdHJ1Y3Rvcigpe3RoaXMuaXNTSU1EU3VwcG9ydGVkXz0hMSx0aGlzLmlzVGhyZWFkc1N1cHBvcnRlZF89ITEsdGhpcy5pbnB1dFdpZHRoXz0wLHRoaXMuaW5wdXRIZWlnaHRfPTAsdGhpcy5pbnB1dENoYW5uZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0V2lkdGhfPTAsdGhpcy5vdXRwdXRIZWlnaHRfPTAsdGhpcy5vdXRwdXRDaGFubmVsQ291bnRfPTAsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPTB9fWFzeW5jIGZ1bmN0aW9uICRyKHIsZSl7bGV0IHQ9bmV3IERyO3ZhciBuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsbyl7YXN5bmMgZnVuY3Rpb24gZigpe3JldHVybiB1ZSh7bG9jYXRlRmlsZTpmdW5jdGlvbihnKXtyZXR1cm4gcitnfX0pfWFzeW5jIGZ1bmN0aW9uIGwoYyl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKGcsdSk9Pntjb25zdCBkPWM7aWYodHlwZW9mIGQ9PSJ1bmRlZmluZWQiKXJldHVybiB1KCJURkxpdGUgYmFja2VuZCB1bmF2YWlsYWJsZTogd2FzbVNpbWQiKTtjb25zdCBSPUhyKCk7Y29uc29sZS5sb2coIkxvYWRpbmcgdGZsaXRlIG1vZGVsOiIsUik7bGV0IHk9ZStgJHtSfS50ZmxpdGVgO2NvbnNvbGUubG9nKCJURkxpdGUgbW9kZWxVcmw6ICIreSk7dHJ5e2NvbnN0IE09YXdhaXQoYXdhaXQgZmV0Y2goeSkpLmFycmF5QnVmZmVyKCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBzaXplOiIsTS5ieXRlTGVuZ3RoKTtjb25zdCBUPWQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0KCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBtZW1vcnkgb2Zmc2V0OiIsVCksY29uc29sZS5sb2coIkxvYWRpbmcgbW9kZWwgYnVmZmVyLi4uIiksZC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KE0pLFQpO2NvbnN0IE89ZC5fbG9hZE1vZGVsKE0uYnl0ZUxlbmd0aCk7aWYoY29uc29sZS5sb2coIkxvYWQgbW9kZWwgcmVzdWx0OiIsTyksTyE9PTApe3UoIkNhbm5vdCBsb2FkIG1vZGVsIik7cmV0dXJufXQuaW5wdXRXaWR0aF89ZC5fZ2V0SW5wdXRXaWR0aCgpLHQuaW5wdXRIZWlnaHRfPWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudF89ZC5fZ2V0SW5wdXRDaGFubmVsQ291bnQoKSx0LmlucHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpLGNvbnNvbGUubG9nKCJJbnB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5pbnB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0XyksY29uc29sZS5sb2coIklucHV0IHdpZHRoOiIsdC5pbnB1dFdpZHRoXyksY29uc29sZS5sb2coIklucHV0IGNoYW5uZWxzOiIsdC5pbnB1dENoYW5uZWxDb3VudF8pLHQub3V0cHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSx0Lm91dHB1dFdpZHRoXz1kLl9nZXRPdXRwdXRXaWR0aCgpLHQub3V0cHV0SGVpZ2h0Xz1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudF89ZC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCksY29uc29sZS5sb2coIk91dHB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5vdXRwdXRNZW1vcnlPZmZzZXRfKSxjb25zb2xlLmxvZygiT3V0cHV0IGhlaWdodDoiLHQub3V0cHV0SGVpZ2h0XyksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGhfKSxjb25zb2xlLmxvZygiT3V0cHV0IGNoYW5uZWxzOiIsdC5vdXRwdXRDaGFubmVsQ291bnRfKSx0LnNlbGVjdGVkVEZMaXRlXz1kfWNhdGNoKEkpe3UoSSk7cmV0dXJufWcoKX0pfWYoKS50aGVuKGM9PntpZihjPT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjtsKGMpLnRoZW4oZz0+e3ModCl9KS5jYXRjaChnPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKGM9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsYyksbygibG9hZFRGTGl0ZSBlcnJvcjoiK2MpfSl9KTtyZXR1cm4gbn1jbGFzcyBXcntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1hZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNvbnN0IFY9Y2xhc3N7Y29uc3RydWN0b3Iocil7aWYodGhpcy5jb25maWdfPXIsdGhpcy5mcmFtZUNvdW50ZXJfPTAsdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz0wLHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF89dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPTAsdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MCxyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCI/KHRoaXMudGltZXJHYXBfPVYuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IFVyKHIuYmFja2dyb3VuZEFzc2V0VXJpKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iQmFja2dyb3VuZEJsdXIiPyh0aGlzLnRpbWVyR2FwXz1WLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBpdChyLnJhZGl1cykpOnIudHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCI/dGhpcy50aW1lckdhcF89Vi5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORDpyLnRyYW5zZm9ybWVyVHlwZT09PSJTaWx1ZXRlQmx1ciI/KHRoaXMudGltZXJHYXBfPVYuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IFdyKHIucmFkaXVzKSk6KHRoaXMudGltZXJHYXBfPVYuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IGl0KX1hc3luYyBzdGFydCgpe2F3YWl0ICRyKHRoaXMuY29uZmlnXy53YXNtQXNzZXRVcmlQYXRoLHRoaXMuY29uZmlnXy50ZmxpdGVBc3NldFVyaVBhdGgpLnRoZW4ocj0+e3ImJih0aGlzLnZvYW5nZVRGTGl0ZUluZm9fPXIsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0PXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyp0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tfPW5ldyBJbWFnZURhdGEodGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XyksdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dE1lbW9yeU9mZnNldF8vNCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5vdXRwdXRNZW1vcnlPZmZzZXRfLzQpfSkuY2F0Y2gocj0+e2NvbnNvbGUubG9nKCJlcnJvciB1c2VURkxpdGU6IixyKX0pfWFzeW5jIHRyYW5zZm9ybShyLGUpeyh0aGlzLnJlc3VsdENhbnZhc18ud2lkdGghPXIuZGlzcGxheVdpZHRofHx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0IT1yLmRpc3BsYXlIZWlnaHQpJiYodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoPXIuZGlzcGxheVdpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQ9ci5kaXNwbGF5SGVpZ2h0KSwodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKG49PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxuLHQpfSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImNyZWF0ZUltYWdlQml0bWFwIixuKSxlLmVucXVldWUocil9KX1wcm9jZXNzRnJhbWUocixlLHQpe3QtdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz49dGhpcy50aW1lckdhcF8mJih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPXQsdGhpcy5wcm9jZXNzU291cmNlKGUpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1hdG9wIix0aGlzLnJlc3VsdEN0eF8uZmlsdGVyPSJub25lIix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfJiZ0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5ydW5Qb3N0UHJvY2Vzc2luZyh0aGlzLnJlc3VsdEN0eF8sZSksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLHRoaXMuZnJhbWVDb3VudGVyXysrfXByb2Nlc3NTb3VyY2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZHJhd0ltYWdlKHIsMCwwLHIud2lkdGgsci5oZWlnaHQsMCwwLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pO2xldCBlPXRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozXT1lLmRhdGFbdCo0XS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMV09ZS5kYXRhW3QqNCsxXS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMl09ZS5kYXRhW3QqNCsyXS8yNTU7dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uX3J1bkluZmVyZW5jZSgpO2ZvcihsZXQgdD0wO3Q8dGhpcy5zZWdtZW50YXRpb25QaXhlbENvdW50Xzt0Kyspe2NvbnN0IG49dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLm91dHB1dE1lbW9yeU9mZnNldF8rdF07dGhpcy5zZWdtZW50YXRpb25NYXNrXy5kYXRhW3QqNCszXT0yNTUqbn10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLnB1dEltYWdlRGF0YSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tfLDAsMCksdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCl9Zmx1c2goKXt9Z2V0VHJhbnNmb3JtZXJUeXBlKCl7cmV0dXJuIkJhY2tncm91bmRUcmFuc2Zvcm1lciJ9c2V0VmlkZW9CR1JlYWRhYmxlKHIpe3RoaXMuY29uZmlnXy50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIiYmKHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBrcihyKSl9fTtsZXQgU2U9VjtpZihTZS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUsU2UuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MTVlNCx0eXBlb2YgaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIil7bGV0IHI9bmV3IExyO29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3R7b3BlcmF0aW9uOnR9PWUuZGF0YTtpZihjb25zb2xlLmxvZygib3BlcmF0aW9uPSIsdCksdD09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpuLHdyaXRhYmxlOnMsY29uZmlnOm8sdmlkZW9CR1JlYWRhYmxlOmZ9PWUuZGF0YTtsZXQgbD1bXTtjb25zdCBjPW5ldyBTZShKU09OLnBhcnNlKG8pKTtjLnNldFZpZGVvQkdSZWFkYWJsZShmKSxsLnB1c2goYyksci5zZXRUcmFuc2Zvcm1lcnMobCkudGhlbigoKT0+e3IudHJhbnNmb3JtKG4scykudGhlbigoKT0+e3Bvc3RNZXNzYWdlKCJzdWNjZXNzIil9KS5jYXRjaChnPT57cG9zdE1lc3NhZ2UoImVycm9yOiIrZyl9KX0pLmNhdGNoKGc9Pntwb3N0TWVzc2FnZSgiZXJyb3I6IitnKX0pfWVsc2UgdD09PSJkZXN0cm95IiYmci5kZXN0cm95KCkudGhlbigoKT0+e3Bvc3RNZXNzYWdlKCJzdWNjZXNzIil9KS5jYXRjaChuPT57cG9zdE1lc3NhZ2UoImVycm9yOiIrbil9KX19fSkoKTsK",pl=typeof window!="undefined"&&window.Blob&&new Blob([atob(yl)],{type:"text/javascript;charset=utf-8"});function kd(){const d=pl&&(window.URL||window.webkitURL).createObjectURL(pl);try{return d?new Worker(d):new Worker("data:application/javascript;base64,"+yl,{type:"module"})}finally{d&&(window.URL||window.webkitURL).revokeObjectURL(d)}}class Cd{constructor(l){this.config_=l,this.worker_=new kd}transform(l,Z){return new Promise(async(b,c)=>{console.log("Created a worker thread.");const m=new Promise((t,e)=>{this.worker_.addEventListener("message",function(a){a.data==="success"?t():e(a.data)})});if(this.config_.transformerType==="VideoBackground"){const t=document.createElement("video");t.src=this.config_.backgroundAssetUri,t.muted=!0;try{await t.play()}catch(n){c(n);return}const e=t.captureStream().getVideoTracks()[0],a=new MediaStreamTrackProcessor(e).readable;this.worker_.postMessage({operation:"transform",readable:l,writable:Z,config:JSON.stringify(this.config_),videoBGReadable:a},[l,Z,a])}else this.worker_.postMessage({operation:"transform",readable:l,writable:Z,config:JSON.stringify(this.config_)},[l,Z]);m.then(()=>{console.log("Worker inited"),b()}).catch(t=>{console.log("Worker inited error"),c(t)})})}destroy(){return new Promise(async(l,Z)=>{console.log("destroy a worker thread.");const b=new Promise((c,m)=>{this.worker_.addEventListener("message",function(e){e.data==="success"?c():m(e.data)})});this.worker_.postMessage({operation:"destroy"}),b.then(()=>{console.log("Worker destroyed"),l()}).catch(c=>{console.log("Worker destroy error"),Z(c)})})}}s.BlurRadius=void 0,function(d){d.Low="Low",d.High="High"}(s.BlurRadius||(s.BlurRadius={}));const xd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Ud(){return new Promise(async(d,l)=>{try{await K()}catch(Z){l(Z);return}xd().then(Z=>{if(Z===!1){l("Your browser does not support WebAssembly features.");return}d()}).catch(Z=>{l(Z)})})}function Bd(d){return new Promise(async(l,Z)=>{const b=new fd(new Cd(d));l(b)})}s.createVonageMediaProcessorConnector=Bd,s.isSupported=Ud,Object.defineProperty(s,"__esModule",{value:!0}),s[Symbol.toStringTag]="Module"});
|
|
1
|
+
(function(r,g){typeof exports=="object"&&typeof module!="undefined"?g(exports):typeof define=="function"&&define.amd?define(["exports"],g):(r=typeof globalThis!="undefined"?globalThis:r||self,g(r["ml-transformers"]={}))})(this,function(r){"use strict";function g(){return new Promise((Z,l)=>{typeof MediaStreamTrackProcessor=="undefined"||typeof MediaStreamTrackGenerator=="undefined"?l("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):Z()})}var Yl={exports:{}},Jl=function(l,d){return function(){for(var b=new Array(arguments.length),e=0;e<b.length;e++)b[e]=arguments[e];return l.apply(d,b)}},nd=Jl,y=Object.prototype.toString;function el(Z){return Array.isArray(Z)}function nl(Z){return typeof Z=="undefined"}function td(Z){return Z!==null&&!nl(Z)&&Z.constructor!==null&&!nl(Z.constructor)&&typeof Z.constructor.isBuffer=="function"&&Z.constructor.isBuffer(Z)}function Il(Z){return y.call(Z)==="[object ArrayBuffer]"}function id(Z){return y.call(Z)==="[object FormData]"}function md(Z){var l;return typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView?l=ArrayBuffer.isView(Z):l=Z&&Z.buffer&&Il(Z.buffer),l}function ud(Z){return typeof Z=="string"}function od(Z){return typeof Z=="number"}function Kl(Z){return Z!==null&&typeof Z=="object"}function T(Z){if(y.call(Z)!=="[object Object]")return!1;var l=Object.getPrototypeOf(Z);return l===null||l===Object.prototype}function ad(Z){return y.call(Z)==="[object Date]"}function sd(Z){return y.call(Z)==="[object File]"}function Xd(Z){return y.call(Z)==="[object Blob]"}function fl(Z){return y.call(Z)==="[object Function]"}function Wd(Z){return Kl(Z)&&fl(Z.pipe)}function rd(Z){return y.call(Z)==="[object URLSearchParams]"}function Gd(Z){return Z.trim?Z.trim():Z.replace(/^\s+|\s+$/g,"")}function hd(){return typeof navigator!="undefined"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window!="undefined"&&typeof document!="undefined"}function tl(Z,l){if(!(Z===null||typeof Z=="undefined"))if(typeof Z!="object"&&(Z=[Z]),el(Z))for(var d=0,c=Z.length;d<c;d++)l.call(null,Z[d],d,Z);else for(var b in Z)Object.prototype.hasOwnProperty.call(Z,b)&&l.call(null,Z[b],b,Z)}function il(){var Z={};function l(b,e){T(Z[e])&&T(b)?Z[e]=il(Z[e],b):T(b)?Z[e]=il({},b):el(b)?Z[e]=b.slice():Z[e]=b}for(var d=0,c=arguments.length;d<c;d++)tl(arguments[d],l);return Z}function pd(Z,l,d){return tl(l,function(b,e){d&&typeof b=="function"?Z[e]=nd(b,d):Z[e]=b}),Z}function yd(Z){return Z.charCodeAt(0)===65279&&(Z=Z.slice(1)),Z}var a={isArray:el,isArrayBuffer:Il,isBuffer:td,isFormData:id,isArrayBufferView:md,isString:ud,isNumber:od,isObject:Kl,isPlainObject:T,isUndefined:nl,isDate:ad,isFile:sd,isBlob:Xd,isFunction:fl,isStream:Wd,isURLSearchParams:rd,isStandardBrowserEnv:hd,forEach:tl,merge:il,extend:pd,trim:Gd,stripBOM:yd},I=a;function Sl(Z){return encodeURIComponent(Z).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Hl=function(l,d,c){if(!d)return l;var b;if(c)b=c(d);else if(I.isURLSearchParams(d))b=d.toString();else{var e=[];I.forEach(d,function(m,s){m===null||typeof m=="undefined"||(I.isArray(m)?s=s+"[]":m=[m],I.forEach(m,function(u){I.isDate(u)?u=u.toISOString():I.isObject(u)&&(u=JSON.stringify(u)),e.push(Sl(s)+"="+Sl(u))}))}),b=e.join("&")}if(b){var n=l.indexOf("#");n!==-1&&(l=l.slice(0,n)),l+=(l.indexOf("?")===-1?"?":"&")+b}return l},Vd=a;function w(){this.handlers=[]}w.prototype.use=function(l,d,c){return this.handlers.push({fulfilled:l,rejected:d,synchronous:c?c.synchronous:!1,runWhen:c?c.runWhen:null}),this.handlers.length-1},w.prototype.eject=function(l){this.handlers[l]&&(this.handlers[l]=null)},w.prototype.forEach=function(l){Vd.forEach(this.handlers,function(c){c!==null&&l(c)})};var Rd=w,Yd=a,Jd=function(l,d){Yd.forEach(l,function(b,e){e!==d&&e.toUpperCase()===d.toUpperCase()&&(l[d]=b,delete l[e])})},Ll=function(l,d,c,b,e){return l.config=d,c&&(l.code=c),l.request=b,l.response=e,l.isAxiosError=!0,l.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},l},Id=Ll,Nl=function(l,d,c,b,e){var n=new Error(l);return Id(n,d,c,b,e)},Kd=Nl,fd=function(l,d,c){var b=c.config.validateStatus;!c.status||!b||b(c.status)?l(c):d(Kd("Request failed with status code "+c.status,c.config,null,c.request,c))},Q=a,Sd=Q.isStandardBrowserEnv()?function(){return{write:function(d,c,b,e,n,t){var m=[];m.push(d+"="+encodeURIComponent(c)),Q.isNumber(b)&&m.push("expires="+new Date(b).toGMTString()),Q.isString(e)&&m.push("path="+e),Q.isString(n)&&m.push("domain="+n),t===!0&&m.push("secure"),document.cookie=m.join("; ")},read:function(d){var c=document.cookie.match(new RegExp("(^|;\\s*)("+d+")=([^;]*)"));return c?decodeURIComponent(c[3]):null},remove:function(d){this.write(d,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Hd=function(l){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(l)},Ld=function(l,d){return d?l.replace(/\/+$/,"")+"/"+d.replace(/^\/+/,""):l},Nd=Hd,Fd=Ld,vd=function(l,d){return l&&!Nd(d)?Fd(l,d):d},ml=a,zd=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],gd=function(l){var d={},c,b,e;return l&&ml.forEach(l.split(`
|
|
2
|
+
`),function(t){if(e=t.indexOf(":"),c=ml.trim(t.substr(0,e)).toLowerCase(),b=ml.trim(t.substr(e+1)),c){if(d[c]&&zd.indexOf(c)>=0)return;c==="set-cookie"?d[c]=(d[c]?d[c]:[]).concat([b]):d[c]=d[c]?d[c]+", "+b:b}}),d},Fl=a,kd=Fl.isStandardBrowserEnv()?function(){var l=/(msie|trident)/i.test(navigator.userAgent),d=document.createElement("a"),c;function b(e){var n=e;return l&&(d.setAttribute("href",n),n=d.href),d.setAttribute("href",n),{href:d.href,protocol:d.protocol?d.protocol.replace(/:$/,""):"",host:d.host,search:d.search?d.search.replace(/^\?/,""):"",hash:d.hash?d.hash.replace(/^#/,""):"",hostname:d.hostname,port:d.port,pathname:d.pathname.charAt(0)==="/"?d.pathname:"/"+d.pathname}}return c=b(window.location.href),function(n){var t=Fl.isString(n)?b(n):n;return t.protocol===c.protocol&&t.host===c.host}}():function(){return function(){return!0}}();function ul(Z){this.message=Z}ul.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},ul.prototype.__CANCEL__=!0;var P=ul,j=a,Cd=fd,xd=Sd,Ud=Hl,Bd=vd,Td=gd,wd=kd,ol=Nl,Qd=E,Pd=P,vl=function(l){return new Promise(function(c,b){var e=l.data,n=l.headers,t=l.responseType,m;function s(){l.cancelToken&&l.cancelToken.unsubscribe(m),l.signal&&l.signal.removeEventListener("abort",m)}j.isFormData(e)&&delete n["Content-Type"];var i=new XMLHttpRequest;if(l.auth){var u=l.auth.username||"",p=l.auth.password?unescape(encodeURIComponent(l.auth.password)):"";n.Authorization="Basic "+btoa(u+":"+p)}var X=Bd(l.baseURL,l.url);i.open(l.method.toUpperCase(),Ud(X,l.params,l.paramsSerializer),!0),i.timeout=l.timeout;function bd(){if(!!i){var G="getAllResponseHeaders"in i?Td(i.getAllResponseHeaders()):null,z=!t||t==="text"||t==="json"?i.responseText:i.response,J={data:z,status:i.status,statusText:i.statusText,headers:G,config:l,request:i};Cd(function(Rl){c(Rl),s()},function(Rl){b(Rl),s()},J),i=null}}if("onloadend"in i?i.onloadend=bd:i.onreadystatechange=function(){!i||i.readyState!==4||i.status===0&&!(i.responseURL&&i.responseURL.indexOf("file:")===0)||setTimeout(bd)},i.onabort=function(){!i||(b(ol("Request aborted",l,"ECONNABORTED",i)),i=null)},i.onerror=function(){b(ol("Network Error",l,null,i)),i=null},i.ontimeout=function(){var z=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded",J=l.transitional||Qd.transitional;l.timeoutErrorMessage&&(z=l.timeoutErrorMessage),b(ol(z,l,J.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",i)),i=null},j.isStandardBrowserEnv()){var ed=(l.withCredentials||wd(X))&&l.xsrfCookieName?xd.read(l.xsrfCookieName):void 0;ed&&(n[l.xsrfHeaderName]=ed)}"setRequestHeader"in i&&j.forEach(n,function(z,J){typeof e=="undefined"&&J.toLowerCase()==="content-type"?delete n[J]:i.setRequestHeader(J,z)}),j.isUndefined(l.withCredentials)||(i.withCredentials=!!l.withCredentials),t&&t!=="json"&&(i.responseType=l.responseType),typeof l.onDownloadProgress=="function"&&i.addEventListener("progress",l.onDownloadProgress),typeof l.onUploadProgress=="function"&&i.upload&&i.upload.addEventListener("progress",l.onUploadProgress),(l.cancelToken||l.signal)&&(m=function(G){!i||(b(!G||G&&G.type?new Pd("canceled"):G),i.abort(),i=null)},l.cancelToken&&l.cancelToken.subscribe(m),l.signal&&(l.signal.aborted?m():l.signal.addEventListener("abort",m))),e||(e=null),i.send(e)})},o=a,zl=Jd,jd=Ll,Md={"Content-Type":"application/x-www-form-urlencoded"};function gl(Z,l){!o.isUndefined(Z)&&o.isUndefined(Z["Content-Type"])&&(Z["Content-Type"]=l)}function Ed(){var Z;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(Z=vl),Z}function Od(Z,l,d){if(o.isString(Z))try{return(l||JSON.parse)(Z),o.trim(Z)}catch(c){if(c.name!=="SyntaxError")throw c}return(d||JSON.stringify)(Z)}var M={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:Ed(),transformRequest:[function(l,d){return zl(d,"Accept"),zl(d,"Content-Type"),o.isFormData(l)||o.isArrayBuffer(l)||o.isBuffer(l)||o.isStream(l)||o.isFile(l)||o.isBlob(l)?l:o.isArrayBufferView(l)?l.buffer:o.isURLSearchParams(l)?(gl(d,"application/x-www-form-urlencoded;charset=utf-8"),l.toString()):o.isObject(l)||d&&d["Content-Type"]==="application/json"?(gl(d,"application/json"),Od(l)):l}],transformResponse:[function(l){var d=this.transitional||M.transitional,c=d&&d.silentJSONParsing,b=d&&d.forcedJSONParsing,e=!c&&this.responseType==="json";if(e||b&&o.isString(l)&&l.length)try{return JSON.parse(l)}catch(n){if(e)throw n.name==="SyntaxError"?jd(n,this,"E_JSON_PARSE"):n}return l}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(l){return l>=200&&l<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};o.forEach(["delete","get","head"],function(l){M.headers[l]={}}),o.forEach(["post","put","patch"],function(l){M.headers[l]=o.merge(Md)});var E=M,Dd=a,Ad=E,$d=function(l,d,c){var b=this||Ad;return Dd.forEach(c,function(n){l=n.call(b,l,d)}),l},kl=function(l){return!!(l&&l.__CANCEL__)},Cl=a,al=$d,_d=kl,qd=E,lc=P;function sl(Z){if(Z.cancelToken&&Z.cancelToken.throwIfRequested(),Z.signal&&Z.signal.aborted)throw new lc("canceled")}var dc=function(l){sl(l),l.headers=l.headers||{},l.data=al.call(l,l.data,l.headers,l.transformRequest),l.headers=Cl.merge(l.headers.common||{},l.headers[l.method]||{},l.headers),Cl.forEach(["delete","get","head","post","put","patch","common"],function(b){delete l.headers[b]});var d=l.adapter||qd.adapter;return d(l).then(function(b){return sl(l),b.data=al.call(l,b.data,b.headers,l.transformResponse),b},function(b){return _d(b)||(sl(l),b&&b.response&&(b.response.data=al.call(l,b.response.data,b.response.headers,l.transformResponse))),Promise.reject(b)})},W=a,xl=function(l,d){d=d||{};var c={};function b(i,u){return W.isPlainObject(i)&&W.isPlainObject(u)?W.merge(i,u):W.isPlainObject(u)?W.merge({},u):W.isArray(u)?u.slice():u}function e(i){if(W.isUndefined(d[i])){if(!W.isUndefined(l[i]))return b(void 0,l[i])}else return b(l[i],d[i])}function n(i){if(!W.isUndefined(d[i]))return b(void 0,d[i])}function t(i){if(W.isUndefined(d[i])){if(!W.isUndefined(l[i]))return b(void 0,l[i])}else return b(void 0,d[i])}function m(i){if(i in d)return b(l[i],d[i]);if(i in l)return b(void 0,l[i])}var s={url:n,method:n,data:n,baseURL:t,transformRequest:t,transformResponse:t,paramsSerializer:t,timeout:t,timeoutMessage:t,withCredentials:t,adapter:t,responseType:t,xsrfCookieName:t,xsrfHeaderName:t,onUploadProgress:t,onDownloadProgress:t,decompress:t,maxContentLength:t,maxBodyLength:t,transport:t,httpAgent:t,httpsAgent:t,cancelToken:t,socketPath:t,responseEncoding:t,validateStatus:m};return W.forEach(Object.keys(l).concat(Object.keys(d)),function(u){var p=s[u]||e,X=p(u);W.isUndefined(X)&&p!==m||(c[u]=X)}),c},Ul={version:"0.25.0"},cc=Ul.version,Xl={};["object","boolean","number","function","string","symbol"].forEach(function(Z,l){Xl[Z]=function(c){return typeof c===Z||"a"+(l<1?"n ":" ")+Z}});var Bl={};Xl.transitional=function(l,d,c){function b(e,n){return"[Axios v"+cc+"] Transitional option '"+e+"'"+n+(c?". "+c:"")}return function(e,n,t){if(l===!1)throw new Error(b(n," has been removed"+(d?" in "+d:"")));return d&&!Bl[n]&&(Bl[n]=!0,console.warn(b(n," has been deprecated since v"+d+" and will be removed in the near future"))),l?l(e,n,t):!0}};function Zc(Z,l,d){if(typeof Z!="object")throw new TypeError("options must be an object");for(var c=Object.keys(Z),b=c.length;b-- >0;){var e=c[b],n=l[e];if(n){var t=Z[e],m=t===void 0||n(t,e,Z);if(m!==!0)throw new TypeError("option "+e+" must be "+m);continue}if(d!==!0)throw Error("Unknown option "+e)}}var bc={assertOptions:Zc,validators:Xl},Tl=a,ec=Hl,wl=Rd,Ql=dc,O=xl,Pl=bc,K=Pl.validators;function k(Z){this.defaults=Z,this.interceptors={request:new wl,response:new wl}}k.prototype.request=function(l,d){if(typeof l=="string"?(d=d||{},d.url=l):d=l||{},!d.url)throw new Error("Provided config url is not valid");d=O(this.defaults,d),d.method?d.method=d.method.toLowerCase():this.defaults.method?d.method=this.defaults.method.toLowerCase():d.method="get";var c=d.transitional;c!==void 0&&Pl.assertOptions(c,{silentJSONParsing:K.transitional(K.boolean),forcedJSONParsing:K.transitional(K.boolean),clarifyTimeoutError:K.transitional(K.boolean)},!1);var b=[],e=!0;this.interceptors.request.forEach(function(X){typeof X.runWhen=="function"&&X.runWhen(d)===!1||(e=e&&X.synchronous,b.unshift(X.fulfilled,X.rejected))});var n=[];this.interceptors.response.forEach(function(X){n.push(X.fulfilled,X.rejected)});var t;if(!e){var m=[Ql,void 0];for(Array.prototype.unshift.apply(m,b),m=m.concat(n),t=Promise.resolve(d);m.length;)t=t.then(m.shift(),m.shift());return t}for(var s=d;b.length;){var i=b.shift(),u=b.shift();try{s=i(s)}catch(p){u(p);break}}try{t=Ql(s)}catch(p){return Promise.reject(p)}for(;n.length;)t=t.then(n.shift(),n.shift());return t},k.prototype.getUri=function(l){if(!l.url)throw new Error("Provided config url is not valid");return l=O(this.defaults,l),ec(l.url,l.params,l.paramsSerializer).replace(/^\?/,"")},Tl.forEach(["delete","get","head","options"],function(l){k.prototype[l]=function(d,c){return this.request(O(c||{},{method:l,url:d,data:(c||{}).data}))}}),Tl.forEach(["post","put","patch"],function(l){k.prototype[l]=function(d,c,b){return this.request(O(b||{},{method:l,url:d,data:c}))}});var nc=k,tc=P;function f(Z){if(typeof Z!="function")throw new TypeError("executor must be a function.");var l;this.promise=new Promise(function(b){l=b});var d=this;this.promise.then(function(c){if(!!d._listeners){var b,e=d._listeners.length;for(b=0;b<e;b++)d._listeners[b](c);d._listeners=null}}),this.promise.then=function(c){var b,e=new Promise(function(n){d.subscribe(n),b=n}).then(c);return e.cancel=function(){d.unsubscribe(b)},e},Z(function(b){d.reason||(d.reason=new tc(b),l(d.reason))})}f.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},f.prototype.subscribe=function(l){if(this.reason){l(this.reason);return}this._listeners?this._listeners.push(l):this._listeners=[l]},f.prototype.unsubscribe=function(l){if(!!this._listeners){var d=this._listeners.indexOf(l);d!==-1&&this._listeners.splice(d,1)}},f.source=function(){var l,d=new f(function(b){l=b});return{token:d,cancel:l}};var ic=f,mc=function(l){return function(c){return l.apply(null,c)}},uc=a,oc=function(l){return uc.isObject(l)&&l.isAxiosError===!0},jl=a,ac=Jl,D=nc,sc=xl,Xc=E;function Ml(Z){var l=new D(Z),d=ac(D.prototype.request,l);return jl.extend(d,D.prototype,l),jl.extend(d,l),d.create=function(b){return Ml(sc(Z,b))},d}var h=Ml(Xc);h.Axios=D,h.Cancel=P,h.CancelToken=ic,h.isCancel=kl,h.VERSION=Ul.version,h.all=function(l){return Promise.all(l)},h.spread=mc,h.isAxiosError=oc,Yl.exports=h,Yl.exports.default=h;for(var Wc=[],Wl=0;Wl<256;++Wl)Wc.push((Wl+256).toString(16).substr(1));const V=new WeakMap,A=new WeakMap,C=new WeakMap,rl=Symbol("anyProducer"),El=Promise.resolve(),$=Symbol("listenerAdded"),_=Symbol("listenerRemoved");let Gl=!1;function S(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function q(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function H(Z,l){const d=A.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function x(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:rl,c=C.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function rc(Z,l,d){const c=C.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(rl)){const b=Promise.all([l,d]);for(const e of c.get(rl))e.enqueue(b)}}function Ol(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(n){b.push(n),c()},finish(){d=!0,c()}};for(const n of l)x(Z,n).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(n=>{c=n}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(n){b=void 0;for(const t of l)x(Z,t).delete(e);return c(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Dl(Z){if(Z===void 0)return Al;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Al.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const hl=Z=>Z===$||Z===_;class L{static mixin(l,d){return d=Dl(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const n of d)if(c.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new L}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=n=>function(...t){return this[l][n](...t)};for(const n of d)Object.defineProperty(c.prototype,n,{enumerable:!1,value:e(n)});return c}}static get isDebugEnabled(){if(typeof process!="object")return Gl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||Gl}static set isDebugEnabled(l){Gl=l}constructor(l={}){V.set(this,new Set),A.set(this,new Map),C.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const n=new Date,t=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${t}][emittery:${d}][${c}] Event Name: ${b}
|
|
3
|
+
data: ${e}`)})}logIfDebugEnabled(l,d,c){(L.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){q(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),H(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),hl(c)||this.emit($,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){q(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),H(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),hl(c)||this.emit(_,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)S(d);return Ol(this,l)}async emit(l,d){S(l),this.logIfDebugEnabled("emit",l,d),rc(this,l,d);const c=H(this,l),b=V.get(this),e=[...c],n=hl(l)?[]:[...b];await El,await Promise.all([...e.map(async t=>{if(c.has(t))return t(d)}),...n.map(async t=>{if(b.has(t))return t(l,d)})])}async emitSerial(l,d){S(l),this.logIfDebugEnabled("emitSerial",l,d);const c=H(this,l),b=V.get(this),e=[...c],n=[...b];await El;for(const t of e)c.has(t)&&await t(d);for(const t of n)b.has(t)&&await t(l,d)}onAny(l){return q(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),V.get(this).add(l),this.emit($,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return Ol(this)}offAny(l){q(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(_,{listener:l}),V.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){H(this,d).clear();const c=x(this,d);for(const b of c)b.finish();c.clear()}else{V.get(this).clear();for(const c of A.get(this).values())c.clear();for(const c of C.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=V.get(this).size+H(this,c).size+x(this,c).size+x(this).size;continue}typeof c!="undefined"&&S(c),d+=V.get(this).size;for(const b of A.get(this).values())d+=b.size;for(const b of C.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=Dl(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Al=Object.getOwnPropertyNames(L.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(L,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(L,"listenerRemoved",{value:_,writable:!1,enumerable:!0,configurable:!1});var $l;(function(Z){Z.FPS_DROP="fps_drop"})($l||($l={}));class Gc{constructor(){this.processor_=null,this.generator_=null}init(l){return new Promise((d,c)=>{try{this.processor_=new MediaStreamTrackProcessor(l)}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${b}`),c(b)}try{l.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):l.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):c("kind not supported")}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${b}`),c(b)}d()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class hc{constructor(l){this.insertableStreamHelper_=new Gc,this.mediaProcessor_=l}setTrack(l){return new Promise((d,c)=>{this.insertableStreamHelper_.init(l).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{d(this.insertableStreamHelper_.getProccesorTrack())}).catch(b=>{c(b)})}).catch(b=>{c(b)})})}destroy(){return new Promise((l,d)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{l()}).catch(c=>{d(c)}):d("no processor")})}}const _l="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzICR7fSQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSwkLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgUGU9e2V4cG9ydHM6e319LFhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LER0PVhlLEI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBPZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBTZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIFV0KHIpe3JldHVybiByIT09bnVsbCYmIVNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIVNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBLZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBCdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBOdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJktlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIEh0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gJHQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBZZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBuZShyKXtpZihCLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiBXdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIGp0KHIpe3JldHVybiBCLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gcXQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBaZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBWdChyKXtyZXR1cm4gWWUocikmJlplKHIucGlwZSl9ZnVuY3Rpb24genQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIEp0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gTWUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxPZShyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBzIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIscykmJmUuY2FsbChudWxsLHJbc10scyxyKX1mdW5jdGlvbiBBZSgpe3ZhciByPXt9O2Z1bmN0aW9uIGUocyxvKXtuZShyW29dKSYmbmUocyk/cltvXT1BZShyW29dLHMpOm5lKHMpP3Jbb109QWUoe30scyk6T2Uocyk/cltvXT1zLnNsaWNlKCk6cltvXT1zfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKU1lKGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBRdChyLGUsdCl7cmV0dXJuIE1lKGUsZnVuY3Rpb24ocyxvKXt0JiZ0eXBlb2Ygcz09ImZ1bmN0aW9uIj9yW29dPUR0KHMsdCk6cltvXT1zfSkscn1mdW5jdGlvbiBYdChyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyIFA9e2lzQXJyYXk6T2UsaXNBcnJheUJ1ZmZlcjpLZSxpc0J1ZmZlcjpVdCxpc0Zvcm1EYXRhOkJ0LGlzQXJyYXlCdWZmZXJWaWV3Ok50LGlzU3RyaW5nOkh0LGlzTnVtYmVyOiR0LGlzT2JqZWN0OlllLGlzUGxhaW5PYmplY3Q6bmUsaXNVbmRlZmluZWQ6U2UsaXNEYXRlOld0LGlzRmlsZTpqdCxpc0Jsb2I6cXQsaXNGdW5jdGlvbjpaZSxpc1N0cmVhbTpWdCxpc1VSTFNlYXJjaFBhcmFtczp6dCxpc1N0YW5kYXJkQnJvd3NlckVudjpHdCxmb3JFYWNoOk1lLG1lcmdlOkFlLGV4dGVuZDpRdCx0cmltOkp0LHN0cmlwQk9NOlh0fSxxPVA7ZnVuY3Rpb24gZXQocil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHR0PWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgcztpZihuKXM9bih0KTtlbHNlIGlmKHEuaXNVUkxTZWFyY2hQYXJhbXModCkpcz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtxLmZvckVhY2godCxmdW5jdGlvbihjLG0pe2M9PT1udWxsfHx0eXBlb2YgYz09InVuZGVmaW5lZCJ8fChxLmlzQXJyYXkoYyk/bT1tKyJbXSI6Yz1bY10scS5mb3JFYWNoKGMsZnVuY3Rpb24oZCl7cS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6cS5pc09iamVjdChkKSYmKGQ9SlNPTi5zdHJpbmdpZnkoZCkpLG8ucHVzaChldChtKSsiPSIrZXQoZCkpfSkpfSkscz1vLmpvaW4oIiYiKX1pZihzKXt2YXIgYT1lLmluZGV4T2YoIiMiKTthIT09LTEmJihlPWUuc2xpY2UoMCxhKSksZSs9KGUuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrc31yZXR1cm4gZX0sS3Q9UDtmdW5jdGlvbiBzZSgpe3RoaXMuaGFuZGxlcnM9W119c2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sc2UucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxzZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtLdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIFl0PXNlLFp0PVAsZXI9ZnVuY3Rpb24oZSx0KXtadC5mb3JFYWNoKGUsZnVuY3Rpb24ocyxvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1zLGRlbGV0ZSBlW29dKX0pfSxydD1mdW5jdGlvbihlLHQsbixzLG8pe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXMsZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sdHI9cnQsbnQ9ZnVuY3Rpb24oZSx0LG4scyxvKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIHRyKGEsdCxuLHMsbyl9LHJyPW50LG5yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshbi5zdGF0dXN8fCFzfHxzKG4uc3RhdHVzKT9lKG4pOnQocnIoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSl9LGllPVAsc3I9aWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGEsdSl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksaWUuaXNOdW1iZXIocykmJmMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHMpLnRvR01UU3RyaW5nKCkpLGllLmlzU3RyaW5nKG8pJiZjLnB1c2goInBhdGg9IitvKSxpZS5pc1N0cmluZyhhKSYmYy5wdXNoKCJkb21haW49IithKSx1PT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksaXI9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sb3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sYXI9aXIsdXI9b3IsZnI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIWFyKHQpP3VyKGUsdCk6dH0sSWU9UCxscj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGNyPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZJZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbih1KXtpZihvPXUuaW5kZXhPZigiOiIpLG49SWUudHJpbSh1LnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9SWUudHJpbSh1LnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZsci5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sc3Q9UCxocj1zdC5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGE9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixhKSxhPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihhKXt2YXIgdT1zdC5pc1N0cmluZyhhKT9zKGEpOmE7cmV0dXJuIHUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZ1Lmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIHhlKHIpe3RoaXMubWVzc2FnZT1yfXhlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSx4ZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgb2U9eGUsYWU9UCxkcj1ucixwcj1zcixtcj10dCxncj1mcixfcj1jcix5cj1ocixGZT1udCx2cj1mZSx3cj1vZSxpdD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsYT1lLmhlYWRlcnMsdT1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIG0oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9YWUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGFbIkNvbnRlbnQtVHlwZSJdO3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsUj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2EuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK1IpfXZhciB2PWdyKGUuYmFzZVVSTCxlLnVybCk7Zi5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksbXIodixlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIE0oKXtpZighIWYpe3ZhciBUPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj9fcihmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IXV8fHU9PT0idGV4dCJ8fHU9PT0ianNvbiI/Zi5yZXNwb25zZVRleHQ6Zi5yZXNwb25zZSxJPXtkYXRhOk8sc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGhlYWRlcnM6VCxjb25maWc6ZSxyZXF1ZXN0OmZ9O2RyKGZ1bmN0aW9uKFgpe24oWCksbSgpfSxmdW5jdGlvbihYKXtzKFgpLG0oKX0sSSksZj1udWxsfX1pZigib25sb2FkZW5kImluIGY/Zi5vbmxvYWRlbmQ9TTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHxmLnJlYWR5U3RhdGUhPT00fHxmLnN0YXR1cz09PTAmJiEoZi5yZXNwb25zZVVSTCYmZi5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoTSl9LGYub25hYm9ydD1mdW5jdGlvbigpeyFmfHwocyhGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtzKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsZikpLGY9bnVsbH0sZi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsST1lLnRyYW5zaXRpb25hbHx8dnIudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKEZlKE8sZSxJLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIEE9KGUud2l0aENyZWRlbnRpYWxzfHx5cih2KSkmJmUueHNyZkNvb2tpZU5hbWU/cHIucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7QSYmKGFbZS54c3JmSGVhZGVyTmFtZV09QSl9InNldFJlcXVlc3RIZWFkZXIiaW4gZiYmYWUuZm9yRWFjaChhLGZ1bmN0aW9uKE8sSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgYVtJXTpmLnNldFJlcXVlc3RIZWFkZXIoSSxPKX0pLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGYud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHUmJnUhPT0ianNvbiImJihmLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZmLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmZi51cGxvYWQmJmYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKFQpeyFmfHwocyghVHx8VCYmVC50eXBlP25ldyB3cigiY2FuY2VsZWQiKTpUKSxmLmFib3J0KCksZj1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSxmLnNlbmQobyl9KX0sdz1QLG90PWVyLGJyPXJ0LEVyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gYXQocixlKXshdy5pc1VuZGVmaW5lZChyKSYmdy5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBUcigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPWl0KSxyfWZ1bmN0aW9uIENyKHIsZSx0KXtpZih3LmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksdy50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciB1ZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOlRyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QodCwiQWNjZXB0Iiksb3QodCwiQ29udGVudC1UeXBlIiksdy5pc0Zvcm1EYXRhKGUpfHx3LmlzQXJyYXlCdWZmZXIoZSl8fHcuaXNCdWZmZXIoZSl8fHcuaXNTdHJlYW0oZSl8fHcuaXNGaWxlKGUpfHx3LmlzQmxvYihlKT9lOncuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6dy5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oYXQodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOncuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhhdCh0LCJhcHBsaWNhdGlvbi9qc29uIiksQ3IoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHVlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJncuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChhKXtpZihvKXRocm93IGEubmFtZT09PSJTeW50YXhFcnJvciI/YnIoYSx0aGlzLCJFX0pTT05fUEFSU0UiKTphfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O3cuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXt1ZS5oZWFkZXJzW2VdPXt9fSksdy5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7dWUuaGVhZGVyc1tlXT13Lm1lcmdlKEVyKX0pO3ZhciBmZT11ZSxScj1QLFByPWZlLE9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxQcjtyZXR1cm4gUnIuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe2U9YS5jYWxsKHMsZSx0KX0pLGV9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LGZ0PVAsTGU9T3IsU3I9dXQsTXI9ZmUsQXI9b2U7ZnVuY3Rpb24ga2Uocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEFyKCJjYW5jZWxlZCIpfXZhciBJcj1mdW5jdGlvbihlKXtrZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9TGUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ZnQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxmdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fE1yLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4ga2UoZSkscy5kYXRhPUxlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBTcihzKXx8KGtlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9TGUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsbHQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHMoZixkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KGYpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZShmLGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKGYpe2lmKFMuaXNVbmRlZmluZWQodFtmXSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbZl0pKXJldHVybiBzKHZvaWQgMCxlW2ZdKX1lbHNlIHJldHVybiBzKGVbZl0sdFtmXSl9ZnVuY3Rpb24gYShmKXtpZighUy5pc1VuZGVmaW5lZCh0W2ZdKSlyZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gdShmKXtpZihTLmlzVW5kZWZpbmVkKHRbZl0pKXtpZighUy5pc1VuZGVmaW5lZChlW2ZdKSlyZXR1cm4gcyh2b2lkIDAsZVtmXSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gYyhmKXtpZihmIGluIHQpcmV0dXJuIHMoZVtmXSx0W2ZdKTtpZihmIGluIGUpcmV0dXJuIHModm9pZCAwLGVbZl0pfXZhciBtPXt1cmw6YSxtZXRob2Q6YSxkYXRhOmEsYmFzZVVSTDp1LHRyYW5zZm9ybVJlcXVlc3Q6dSx0cmFuc2Zvcm1SZXNwb25zZTp1LHBhcmFtc1NlcmlhbGl6ZXI6dSx0aW1lb3V0OnUsdGltZW91dE1lc3NhZ2U6dSx3aXRoQ3JlZGVudGlhbHM6dSxhZGFwdGVyOnUscmVzcG9uc2VUeXBlOnUseHNyZkNvb2tpZU5hbWU6dSx4c3JmSGVhZGVyTmFtZTp1LG9uVXBsb2FkUHJvZ3Jlc3M6dSxvbkRvd25sb2FkUHJvZ3Jlc3M6dSxkZWNvbXByZXNzOnUsbWF4Q29udGVudExlbmd0aDp1LG1heEJvZHlMZW5ndGg6dSx0cmFuc3BvcnQ6dSxodHRwQWdlbnQ6dSxodHRwc0FnZW50OnUsY2FuY2VsVG9rZW46dSxzb2NrZXRQYXRoOnUscmVzcG9uc2VFbmNvZGluZzp1LHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgUj1tW2RdfHxvLHY9UihkKTtTLmlzVW5kZWZpbmVkKHYpJiZSIT09Y3x8KG5bZF09dil9KSxufSxjdD17dmVyc2lvbjoiMC4yNS4wIn0seHI9Y3QudmVyc2lvbixEZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtEZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgaHQ9e307RGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sYSl7cmV0dXJuIltBeGlvcyB2Iit4cisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2ErKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxhLHUpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFodFthXSYmKGh0W2FdPSEwLGNvbnNvbGUud2FybihzKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sYSx1KTohMH19O2Z1bmN0aW9uIEZyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sYT1lW29dO2lmKGEpe3ZhciB1PXJbb10sYz11PT09dm9pZCAwfHxhKHUsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBMcj17YXNzZXJ0T3B0aW9uczpGcix2YWxpZGF0b3JzOkRlfSxkdD1QLGtyPXR0LHB0PVl0LG10PUlyLGxlPWx0LGd0PUxyLFY9Z3QudmFsaWRhdG9ycztmdW5jdGlvbiBLKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgcHQscmVzcG9uc2U6bmV3IHB0fX1LLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PWxlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJmd0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpWLnRyYW5zaXRpb25hbChWLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHYpe3R5cGVvZiB2LnJ1bldoZW49PSJmdW5jdGlvbiImJnYucnVuV2hlbih0KT09PSExfHwobz1vJiZ2LnN5bmNocm9ub3VzLHMudW5zaGlmdCh2LmZ1bGZpbGxlZCx2LnJlamVjdGVkKSl9KTt2YXIgYT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2EucHVzaCh2LmZ1bGZpbGxlZCx2LnJlamVjdGVkKX0pO3ZhciB1O2lmKCFvKXt2YXIgYz1bbXQsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGEpLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOyl1PXUudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gdX1mb3IodmFyIG09dDtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7bT1mKG0pfWNhdGNoKFIpe2QoUik7YnJlYWt9fXRyeXt1PW10KG0pfWNhdGNoKFIpe3JldHVybiBQcm9taXNlLnJlamVjdChSKX1mb3IoO2EubGVuZ3RoOyl1PXUudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gdX0sSy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9bGUodGhpcy5kZWZhdWx0cyxlKSxrcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QobGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChsZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBEcj1LLFVyPW9lO2Z1bmN0aW9uIHoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe3Quc3Vic2NyaWJlKGEpLHM9YX0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBVcihzKSxlKHQucmVhc29uKSl9KX16LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSx6LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSx6LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IHooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgQnI9eixOcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LEhyPVAsJHI9ZnVuY3Rpb24oZSl7cmV0dXJuIEhyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxfdD1QLFdyPVhlLGNlPURyLGpyPWx0LHFyPWZlO2Z1bmN0aW9uIHl0KHIpe3ZhciBlPW5ldyBjZShyKSx0PVdyKGNlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBfdC5leHRlbmQodCxjZS5wcm90b3R5cGUsZSksX3QuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHl0KGpyKHIscykpfSx0fXZhciBMPXl0KHFyKTtMLkF4aW9zPWNlLEwuQ2FuY2VsPW9lLEwuQ2FuY2VsVG9rZW49QnIsTC5pc0NhbmNlbD11dCxMLlZFUlNJT049Y3QudmVyc2lvbixMLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEwuc3ByZWFkPU5yLEwuaXNBeGlvc0Vycm9yPSRyLFBlLmV4cG9ydHM9TCxQZS5leHBvcnRzLmRlZmF1bHQ9TDt2YXIgVnI9UGUuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHZ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHZ0KGUpOm5ldyB3dH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IHd0fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHZ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3Mgd3QgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgenI9IjEuMS4xIjtjbGFzcyBre2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVwb3J0PXthY3Rpb246cC5lbXB0eSgpLGFwcGxpY2F0aW9uSWQ6cC5vZk51bGxhYmxlKG51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpwLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6cC5lbXB0eSgpLGd1aWQ6cC5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpwLmVtcHR5KCksbWVzc2FnZTpwLmVtcHR5KCksc291cmNlOnAub2ZOdWxsYWJsZShudWxsKSx0cmFuc2Zvcm1lZEZwczpwLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOnAuZW1wdHkoKSx2YXJpYXRpb246cC5lbXB0eSgpLHZpZGVvSGVpZ2h0OnAuZW1wdHkoKSx2aWRlb1dpZHRoOnAuZW1wdHkoKSx2ZXJzaW9uOnpyLGVycm9yOnAuZW1wdHkoKX19YWN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuYWN0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfWZyYW1lc1RyYW5zZm9ybWVkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnJhbWVzVHJhbnNmb3JtZWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnBzPXAub2ZOdWxsYWJsZShlKSx0aGlzfWd1aWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5ndWlkPXAub2ZOdWxsYWJsZShlKSx0aGlzfW1lc3NhZ2UoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5tZXNzYWdlPXAub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVkRnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZWRGcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZXJUeXBlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZXJUeXBlPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZhcmlhdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZhcmlhdGlvbj1wLm9mTnVsbGFibGUoZSksdGhpc312aWRlb0hlaWdodChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvSGVpZ2h0PXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvV2lkdGgoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb1dpZHRoPXAub2ZOdWxsYWJsZShlKSx0aGlzfWVycm9yKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZXJyb3I9cC5vZk51bGxhYmxlKGUpLHRoaXN9YnVpbGQoKXtyZXR1cm4gdGhpcy5fcmVwb3J0fX1jb25zdCBKcj1yPT5KU09OLnN0cmluZ2lmeShyLChlLHQpPT57aWYodCE9PW51bGwpcmV0dXJuIHR9KTtjbGFzcyBEe3N0YXRpYyByZXBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57aWYoZS5hcHBsaWNhdGlvbklkPT09bnVsbHx8ZS5zb3VyY2U9PT1udWxsKXt0KCJzdWNjZXNzIik7cmV0dXJufWxldCBzPVZyLmNyZWF0ZSgpLG89e3RpbWVvdXQ6MWU0LHRpbWVvdXRFcnJvck1lc3NhZ2U6IlJlcXVlc3QgdGltZW91dCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX07Y29uc3QgYT0iaHR0cHM6Ly9obGcuZGV2LnRva2JveC5jb20vZGV2L2xvZ2dpbmcvdmNwX3dlYnJ0YyI7cy5wb3N0KGEsSnIoZSksbykudGhlbih1PT57Y29uc29sZS5sb2codSksdCgic3VjY2VzcyIpfSkuY2F0Y2godT0+e2NvbnNvbGUubG9nKHUpLG4odSl9KX0pfX12YXIgaGUsR3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIFFyKCl7aWYoIWhlJiYoaGU9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWhlKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGhlKEdyKX12YXIgWHI9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIEtyKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJlhyLnRlc3Qocil9Zm9yKHZhciBiPVtdLFVlPTA7VWU8MjU2OysrVWUpYi5wdXNoKChVZSsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIFlyKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KGJbcltlKzBdXStiW3JbZSsxXV0rYltyW2UrMl1dK2JbcltlKzNdXSsiLSIrYltyW2UrNF1dK2JbcltlKzVdXSsiLSIrYltyW2UrNl1dK2JbcltlKzddXSsiLSIrYltyW2UrOF1dK2JbcltlKzldXSsiLSIrYltyW2UrMTBdXStiW3JbZSsxMV1dK2JbcltlKzEyXV0rYltyW2UrMTNdXStiW3JbZSsxNF1dK2JbcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIUtyKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gYnQocixlLHQpe3I9cnx8e307dmFyIG49ci5yYW5kb218fChyLnJuZ3x8UXIpKCk7aWYobls2XT1uWzZdJjE1fDY0LG5bOF09bls4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgcz0wO3M8MTY7KytzKWVbdCtzXT1uW3NdO3JldHVybiBlfXJldHVybiBZcihuKX1jb25zdCBOPW5ldyBXZWFrTWFwLGRlPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsQmU9U3ltYm9sKCJhbnlQcm9kdWNlciIpLEV0PVByb21pc2UucmVzb2x2ZSgpLHBlPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLG1lPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IE5lPSExO2Z1bmN0aW9uIEoocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBnZShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBHKHIsZSl7Y29uc3QgdD1kZS5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIFoocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6QmUsbj1ZLmdldChyKTtyZXR1cm4gbi5oYXModCl8fG4uc2V0KHQsbmV3IFNldCksbi5nZXQodCl9ZnVuY3Rpb24gWnIocixlLHQpe2NvbnN0IG49WS5nZXQocik7aWYobi5oYXMoZSkpZm9yKGNvbnN0IHMgb2Ygbi5nZXQoZSkpcy5lbnF1ZXVlKHQpO2lmKG4uaGFzKEJlKSl7Y29uc3Qgcz1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygbi5nZXQoQmUpKW8uZW5xdWV1ZShzKX19ZnVuY3Rpb24gVHQocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEsbj0oKT0+e30scz1bXTtjb25zdCBvPXtlbnF1ZXVlKGEpe3MucHVzaChhKSxuKCl9LGZpbmlzaCgpe3Q9ITAsbigpfX07Zm9yKGNvbnN0IGEgb2YgZSlaKHIsYSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIHM/cy5sZW5ndGg9PT0wP3Q/KHM9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoYT0+e249YX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBzLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGEpe3M9dm9pZCAwO2Zvcihjb25zdCB1IG9mIGUpWihyLHUpLmRlbGV0ZShvKTtyZXR1cm4gbigpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBhfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIEN0KHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIFJ0O2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighUnQuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBIZT1yPT5yPT09cGV8fHI9PT1tZTtjbGFzcyBXe3N0YXRpYyBtaXhpbihlLHQpe3JldHVybiB0PUN0KHQpLG49PntpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGZ1bmN0aW9uIik7Zm9yKGNvbnN0IGEgb2YgdClpZihuLnByb3RvdHlwZVthXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7YX1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7ZnVuY3Rpb24gcygpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiExLHZhbHVlOm5ldyBXfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6c30pO2NvbnN0IG89YT0+ZnVuY3Rpb24oLi4udSl7cmV0dXJuIHRoaXNbZV1bYV0oLi4udSl9O2Zvcihjb25zdCBhIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITEsdmFsdWU6byhhKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBOZTtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxOZX1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe05lPWV9Y29uc3RydWN0b3IoZT17fSl7Ti5zZXQodGhpcyxuZXcgU2V0KSxkZS5zZXQodGhpcyxuZXcgTWFwKSxZLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LG4scyxvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIHM9PSJzeW1ib2wiJiYocz1zLnRvU3RyaW5nKCkpO2NvbnN0IGE9bmV3IERhdGUsdT1gJHthLmdldEhvdXJzKCl9OiR7YS5nZXRNaW51dGVzKCl9OiR7YS5nZXRTZWNvbmRzKCl9LiR7YS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHt1fV1bZW1pdHRlcnk6JHt0fV1bJHtufV0gRXZlbnQgTmFtZTogJHtzfQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LG4peyhXLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LG4pfW9uKGUsdCl7Z2UodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpSihuKSxHKHRoaXMsbikuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLEhlKG4pfHx0aGlzLmVtaXQocGUse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7Z2UodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpSihuKSxHKHRoaXMsbikuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixuLHZvaWQgMCksSGUobil8fHRoaXMuZW1pdChtZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBuPXRoaXMub24oZSxzPT57bigpLHQocyl9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlKKHQpO3JldHVybiBUdCh0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtKKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCksWnIodGhpcyxlLHQpO2NvbnN0IG49Ryh0aGlzLGUpLHM9Ti5nZXQodGhpcyksbz1bLi4ubl0sYT1IZShlKT9bXTpbLi4uc107YXdhaXQgRXQsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm8ubWFwKGFzeW5jIHU9PntpZihuLmhhcyh1KSlyZXR1cm4gdSh0KX0pLC4uLmEubWFwKGFzeW5jIHU9PntpZihzLmhhcyh1KSlyZXR1cm4gdShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7SihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IG49Ryh0aGlzLGUpLHM9Ti5nZXQodGhpcyksbz1bLi4ubl0sYT1bLi4uc107YXdhaXQgRXQ7Zm9yKGNvbnN0IHUgb2YgbyluLmhhcyh1KSYmYXdhaXQgdSh0KTtmb3IoY29uc3QgdSBvZiBhKXMuaGFzKHUpJiZhd2FpdCB1KGUsdCl9b25BbnkoZSl7cmV0dXJuIGdlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksTi5nZXQodGhpcykuYWRkKGUpLHRoaXMuZW1pdChwZSx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBUdCh0aGlzKX1vZmZBbnkoZSl7Z2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChtZSx7bGlzdGVuZXI6ZX0pLE4uZ2V0KHRoaXMpLmRlbGV0ZShlKX1jbGVhckxpc3RlbmVycyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlpZih0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJjbGVhciIsdCx2b2lkIDApLHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJzeW1ib2wiKXtHKHRoaXMsdCkuY2xlYXIoKTtjb25zdCBuPVoodGhpcyx0KTtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7Ti5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBkZS5nZXQodGhpcykudmFsdWVzKCkpbi5jbGVhcigpO2Zvcihjb25zdCBuIG9mIFkuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgcyBvZiBuKXMuZmluaXNoKCk7bi5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXtpZih0eXBlb2Ygbj09InN0cmluZyIpe3QrPU4uZ2V0KHRoaXMpLnNpemUrRyh0aGlzLG4pLnNpemUrWih0aGlzLG4pLnNpemUrWih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBuIT0idW5kZWZpbmVkIiYmSihuKSx0Kz1OLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBzIG9mIGRlLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1zLnNpemU7Zm9yKGNvbnN0IHMgb2YgWS5nZXQodGhpcykudmFsdWVzKCkpdCs9cy5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9Q3QodCk7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IFJ0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFcucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6cGUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVywibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6bWUsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgJGU9VztmdW5jdGlvbiBlbihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gdG4ocil7aWYoZW4ocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gV2Uocil7cmV0dXJuIHRuKHIpLm1lc3NhZ2V9dmFyIGplOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KShqZXx8KGplPXt9KSk7Y29uc3Qgcm49NTAwLG5uPS44O2NsYXNzIHNuIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1idCgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQobil9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaCh0KXtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoV2UodCkpLmJ1aWxkKCk7RC5yZXBvcnQobik7Y29uc3Qgcz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoic3RhcnQifTt0aGlzLmVtaXQoImVycm9yIixzKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG4scyxvLGE7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSx0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShzPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9zOjAsKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgoYT0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6YS5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PXJuJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaCh1KXtjb25zdCBjPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX3RyYW5zZm9ybSkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKFdlKHUpKS5idWlsZCgpO0QucmVwb3J0KGMpO2NvbnN0IG09e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnUsZnVuY3Rpb246InRyYW5zZm9ybSJ9O3RoaXMuZW1pdCgiZXJyb3IiLG0pfX1hc3luYyBmbHVzaChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoPT0iZnVuY3Rpb24iJiYhdGhpcy5pc0ZsYXNoZWRfKXt0aGlzLmlzRmxhc2hlZF89ITA7dHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoKGUpfWNhdGNoKG4pe2NvbnN0IHM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfZmx1c2gpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihXZShuKSkuYnVpbGQoKTtELnJlcG9ydChzKTtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjpuLGZ1bmN0aW9uOiJmbHVzaCJ9O3RoaXMuZW1pdCgiZXJyb3IiLG8pfX10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKTtjb25zdCB0PW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQodCl9c3RvcCgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFN0b3Agc3RyZWFtLiIpLHRoaXMuc2hvdWxkU3RvcF89ITB9bWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpe2xldCBlPShEYXRlLm5vdygpLXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXykvMWUzLHQ9dGhpcy5mcmFtZXNGcm9tU291cmNlXy9lLG49dGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8vZTtpZih0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKm5uPnQpe2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LHdhcm5pbmdUeXBlOmplLkZQU19EUk9QLGRyb3BJbmZvOntyZXF1ZXN0ZWQ6dGhpcy50cmFja0V4cGVjdGVkUmF0ZV8sY3VycmVudDp0fX07dGhpcy5lbWl0KCJ3YXJuIixvKX1jb25zdCBzPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKG4pLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTtELnJlcG9ydChzKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3Mgb24gZXh0ZW5kcyAkZXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMudHJhbnNmb3JtZXJzXz1bXSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49bmV3IHNuKGVbdF0sdCk7bi5vbigiZXJyb3IiLHM9Pnt0aGlzLmVtaXQoImVycm9yIixzKX0pLG4ub24oIndhcm4iLHM9Pnt0aGlzLmVtaXQoIndhcm4iLHMpfSksdGhpcy50cmFuc2Zvcm1lcnNfLnB1c2gobil9fXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWU7Zm9yKGxldCB0IG9mIHRoaXMudHJhbnNmb3JtZXJzXyl0LnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX1hc3luYyBzdGFydChlLHQpe2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBObyB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufXRyeXtsZXQgbj1lO2ZvcihsZXQgcyBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZT1lLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0ocykpO2UucGlwZVRvKHQpLnRoZW4oYXN5bmMoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNldHVwLiIpLGF3YWl0IHQuYWJvcnQoKSxhd2FpdCBuLmNhbmNlbCgpfSkuY2F0Y2goYXN5bmMgcz0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChzKSxhd2FpdCBuLmNhbmNlbChzKX0pfWNhdGNoe3RoaXMuZGVzdHJveSgpO3JldHVybn1jb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIGFuIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMudXVpZF89YnQoKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO0QucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBuPW5ldyBrKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZSgkLmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtELnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKX10aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpLHRoaXMucGlwZWxpbmVfPW5ldyBvbih0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChuPT57dChuKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQudXBkYXRlcy50cmFuc2Zvcm1lcl9uZXcpLnZhcmlhdGlvbigiVXBkYXRlIikuYnVpbGQoKTtyZXR1cm4gRC5yZXBvcnQodCksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpO2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQodCksZSgpfSl9fXZhciBfZTsoZnVuY3Rpb24ocil7ci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIn0pKF9lfHwoX2U9e30pKTtjbGFzcyBQdHtjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5maWx0ZXI9dGhpcy5ibHVyRmlsdGVyXyxlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNsYXNzIHVue2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuaW1hZ2VDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLmltYWdlQ3R4Xz10aGlzLmltYWdlQ2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLHdpbGxSZWFkRnJlcXVlbnRseTohMCxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLmltYWdlQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7dGhpcy5pbWFnZUJsb2JfPXZvaWQgMCxmZXRjaChlKS50aGVuKHQ9Pnt0LmJsb2IoKS50aGVuKG49Pnt0aGlzLmltYWdlQmxvYl89bn0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJibG9iIGVycm9yIixuKX0pfSkuY2F0Y2godD0+e2NvbnNvbGUuZXJyb3IoImZldGNoIGVycm9yIix0KX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKHR5cGVvZiB0aGlzLmltYWdlQmxvYl8hPSJ1bmRlZmluZWQiJiYodGhpcy5pbWFnZUNhbnZhc18ud2lkdGghPXQud2lkdGh8fHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCE9dC5oZWlnaHQpKXt0aGlzLmltYWdlQ2FudmFzXy53aWR0aD10LndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodD10LmhlaWdodDtjb25zdCBuPSJoaWdoIixzPXtyZXNpemVXaWR0aDp0LndpZHRoLHJlc2l6ZUhlaWdodDp0LmhlaWdodCxyZXNpemVRdWFsaXR5Om59LG89Y3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5pbWFnZUJsb2JfLHMpLnRoZW4oYT0+e3RoaXMuaW1hZ2VDdHhfLmRyYXdJbWFnZShhLDAsMCl9KS5jYXRjaChhPT57Y29uc29sZS5lcnJvcigiZXJyb3IgY3JlYXRlSW1hZ2VCaXRtYXAiLGEpfSl9ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZHJhd0ltYWdlKHRoaXMuaW1hZ2VDYW52YXNfLDAsMCx0aGlzLmltYWdlQ2FudmFzXy53aWR0aCx0aGlzLmltYWdlQ2FudmFzXy5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlydHVhbFBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgZm57Y29uc3RydWN0b3IoZT0xLzApe3RoaXMuY2FwYWNpdHk9ZSx0aGlzLnN0b3JhZ2U9W119ZW5xdWV1ZShlKXtpZih0aGlzLnNpemUoKT09PXRoaXMuY2FwYWNpdHkpdGhyb3cgRXJyb3IoIlF1ZXVlIGhhcyByZWFjaGVkIG1heCBjYXBhY2l0eSwgeW91IGNhbm5vdCBhZGQgbW9yZSBpdGVtcyIpO3RoaXMuc3RvcmFnZS5wdXNoKGUpfWRlcXVldWUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLnNoaWZ0KCl9c2l6ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2UubGVuZ3RofX1jbGFzcyBsbntjb25zdHJ1Y3RvcihlKXtjb25zb2xlLmxvZygiW1ZpZGVvUG9zdFByb2Nlc3NdIEN0b3IiKSx0aGlzLnF1ZXVlXz1uZXcgZm4sZSYmKHRoaXMuZnJhbWVSZWFkZXJfPWUuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXByb2Nlc3NGcmFtZShlKXtlLmRvbmV8fCh0aGlzLnF1ZXVlXy5lbnF1ZXVlKGUudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHRoaXMucHJvY2Vzc0ZyYW1lLmJpbmQodGhpcykpLmNhdGNoKHQ9PmNvbnNvbGUuZXJyb3IodCkpKX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtpZihlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IG49dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UuZHJhd0ltYWdlKG4sMCwwLHQud2lkdGgsdC5oZWlnaHQpLG4uY2xvc2UoKX1lbHNlIGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWZ1bmN0aW9uIGNuKCl7cmV0dXJuInNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIn12YXIgeWU9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZSE9InVuZGVmaW5lZCI/ZTp7fSxuLHM7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihpLGwpe249aSxzPWx9KTt2YXIgbz17fSxhO2ZvcihhIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShhKSYmKG9bYV09dFthXSk7dmFyIHU9Ii4vdGhpcy5wcm9ncmFtIixjPWZ1bmN0aW9uKGksbCl7dGhyb3cgbH0sbT0hMCxmPSIiO2Z1bmN0aW9uIGQoaSl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUoaSxmKTpmK2l9dmFyIFI7dHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGY9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihmPXIpLGYuaW5kZXhPZigiYmxvYjoiKSE9PTA/Zj1mLnN1YnN0cigwLGYucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpmPSIiO3ZhciB2PXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksTT10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IoYSBpbiBvKW8uaGFzT3duUHJvcGVydHkoYSkmJih0W2FdPW9bYV0pO289bnVsbCx0LmFyZ3VtZW50cyx0LnRoaXNQcm9ncmFtJiYodT10LnRoaXNQcm9ncmFtKSx0LnF1aXQmJihjPXQucXVpdCk7dmFyIEE7dC53YXNtQmluYXJ5JiYoQT10Lndhc21CaW5hcnkpO3ZhciBUPXQubm9FeGl0UnVudGltZXx8ITA7dHlwZW9mIFdlYkFzc2VtYmx5IT0ib2JqZWN0IiYmSCgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBPLEk9ITEsdmU9dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gWChpLGwsaCl7Zm9yKHZhciBnPWwraCx5PWw7aVt5XSYmISh5Pj1nKTspKyt5O2lmKHktbD4xNiYmaS5zdWJhcnJheSYmdmUpcmV0dXJuIHZlLmRlY29kZShpLnN1YmFycmF5KGwseSkpO2Zvcih2YXIgRT0iIjtsPHk7KXt2YXIgXz1pW2wrK107aWYoIShfJjEyOCkpe0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoXyk7Y29udGludWV9dmFyIEM9aVtsKytdJjYzO2lmKChfJjIyNCk9PTE5Mil7RSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoXyYzMSk8PDZ8Qyk7Y29udGludWV9dmFyIFU9aVtsKytdJjYzO2lmKChfJjI0MCk9PTIyND9fPShfJjE1KTw8MTJ8Qzw8NnxVOl89KF8mNyk8PDE4fEM8PDEyfFU8PDZ8aVtsKytdJjYzLF88NjU1MzYpRSs9U3RyaW5nLmZyb21DaGFyQ29kZShfKTtlbHNle3ZhciBrdD1fLTY1NTM2O0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8a3Q+PjEwLDU2MzIwfGt0JjEwMjMpfX1yZXR1cm4gRX1mdW5jdGlvbiB3ZShpLGwpe3JldHVybiBpP1goZWUsaSxsKToiIn1mdW5jdGlvbiBfbihpLGwsaCl7Zm9yKHZhciBnPTA7ZzxpLmxlbmd0aDsrK2cpYmVbbCsrPj4wXT1pLmNoYXJDb2RlQXQoZyk7aHx8KGJlW2w+PjBdPTApfWZ1bmN0aW9uIHluKGksbCl7cmV0dXJuIGklbD4wJiYoaSs9bC1pJWwpLGl9dmFyIE90LGJlLGVlLHg7ZnVuY3Rpb24gU3QoaSl7T3Q9aSx0LkhFQVA4PWJlPW5ldyBJbnQ4QXJyYXkoaSksdC5IRUFQMTY9bmV3IEludDE2QXJyYXkoaSksdC5IRUFQMzI9eD1uZXcgSW50MzJBcnJheShpKSx0LkhFQVBVOD1lZT1uZXcgVWludDhBcnJheShpKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGkpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkoaSksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoaSksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoaSl9dC5JTklUSUFMX01FTU9SWTt2YXIgemUsTXQ9W10sQXQ9W10sSXQ9W10sdm49MDtmdW5jdGlvbiB3bigpe3JldHVybiBUfHx2bj4wfWZ1bmN0aW9uIGJuKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspQ24odC5wcmVSdW4uc2hpZnQoKSk7SmUoTXQpfWZ1bmN0aW9uIEVuKCl7SmUoQXQpfWZ1bmN0aW9uIFRuKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOylQbih0LnBvc3RSdW4uc2hpZnQoKSk7SmUoSXQpfWZ1bmN0aW9uIENuKGkpe010LnVuc2hpZnQoaSl9ZnVuY3Rpb24gUm4oaSl7QXQudW5zaGlmdChpKX1mdW5jdGlvbiBQbihpKXtJdC51bnNoaWZ0KGkpfXZhciBqPTAsdGU9bnVsbDtmdW5jdGlvbiBPbihpKXtqKyssdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoail9ZnVuY3Rpb24gU24oaSl7aWYoai0tLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKGopLGo9PTAmJnRlKXt2YXIgbD10ZTt0ZT1udWxsLGwoKX19dC5wcmVsb2FkZWRJbWFnZXM9e30sdC5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gSChpKXt0Lm9uQWJvcnQmJnQub25BYm9ydChpKSxpPSJBYm9ydGVkKCIraSsiKSIsTShpKSxJPSEwLGkrPSIuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgbD1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGkpO3Rocm93IHMobCksbH12YXIgTW49ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIHh0KGkpe3JldHVybiBpLnN0YXJ0c1dpdGgoTW4pfXZhciBGO0Y9InRmbGl0ZS1zaW1kLndhc20iLHh0KEYpfHwoRj1kKEYpKTtmdW5jdGlvbiBGdChpKXt0cnl7aWYoaT09RiYmQSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQSk7aWYoIVIpdGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKGwpe0gobCl9fWZ1bmN0aW9uIEFuKCl7cmV0dXJuIUEmJm0mJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChGLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihpKXtpZighaS5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK0YrIiciO3JldHVybiBpLmFycmF5QnVmZmVyKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBGdChGKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRnQoRil9KX1mdW5jdGlvbiBJbigpe3ZhciBpPXthOllufTtmdW5jdGlvbiBsKF8sQyl7dmFyIFU9Xy5leHBvcnRzO3QuYXNtPVUsTz10LmFzbS5xLFN0KE8uYnVmZmVyKSx6ZT10LmFzbS5ELFJuKHQuYXNtLnIpLFNuKCl9T24oKTtmdW5jdGlvbiBoKF8pe2woXy5pbnN0YW5jZSl9ZnVuY3Rpb24gZyhfKXtyZXR1cm4gQW4oKS50aGVuKGZ1bmN0aW9uKEMpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShDLGkpfSkudGhlbihmdW5jdGlvbihDKXtyZXR1cm4gQ30pLnRoZW4oXyxmdW5jdGlvbihDKXtNKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK0MpLEgoQyl9KX1mdW5jdGlvbiB5KCl7cmV0dXJuIUEmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09ImZ1bmN0aW9uIiYmIXh0KEYpJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goRix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oXyl7dmFyIEM9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoXyxpKTtyZXR1cm4gQy50aGVuKGgsZnVuY3Rpb24oVSl7cmV0dXJuIE0oIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK1UpLE0oImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksZyhoKX0pfSk6ZyhoKX1pZih0Lmluc3RhbnRpYXRlV2FzbSl0cnl7dmFyIEU9dC5pbnN0YW50aWF0ZVdhc20oaSxsKTtyZXR1cm4gRX1jYXRjaChfKXtyZXR1cm4gTSgiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitfKSwhMX1yZXR1cm4geSgpLmNhdGNoKHMpLHt9fWZ1bmN0aW9uIEplKGkpe2Zvcig7aS5sZW5ndGg+MDspe3ZhciBsPWkuc2hpZnQoKTtpZih0eXBlb2YgbD09ImZ1bmN0aW9uIil7bCh0KTtjb250aW51ZX12YXIgaD1sLmZ1bmM7dHlwZW9mIGg9PSJudW1iZXIiP2wuYXJnPT09dm9pZCAwP3plLmdldChoKSgpOnplLmdldChoKShsLmFyZyk6aChsLmFyZz09PXZvaWQgMD9udWxsOmwuYXJnKX19ZnVuY3Rpb24geG4oaSxsLGgsZyl7SCgiQXNzZXJ0aW9uIGZhaWxlZDogIit3ZShpKSsiLCBhdDogIitbbD93ZShsKToidW5rbm93biBmaWxlbmFtZSIsaCxnP3dlKGcpOiJ1bmtub3duIGZ1bmN0aW9uIl0pfWZ1bmN0aW9uIEZuKGksbCl7SCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gTG4oaSxsKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBrbigpe0goIiIpfXZhciBFZTtFZT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07dmFyIERuPSEwO2Z1bmN0aW9uIFVuKGkpe3JldHVybiB4W0x0KCk+PjJdPWksaX1mdW5jdGlvbiBCbihpLGwpe3ZhciBoO2lmKGk9PT0wKWg9RGF0ZS5ub3coKTtlbHNlIGlmKChpPT09MXx8aT09PTQpJiZEbiloPUVlKCk7ZWxzZSByZXR1cm4gVW4oMjgpLC0xO3JldHVybiB4W2w+PjJdPWgvMWUzfDAseFtsKzQ+PjJdPWglMWUzKjFlMyoxZTN8MCwwfWZ1bmN0aW9uIE5uKCl7cmV0dXJuIDIxNDc0ODM2NDh9ZnVuY3Rpb24gSG4oaSxsLGgpe2VlLmNvcHlXaXRoaW4oaSxsLGwraCl9ZnVuY3Rpb24gJG4oaSl7dHJ5e3JldHVybiBPLmdyb3coaS1PdC5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLFN0KE8uYnVmZmVyKSwxfWNhdGNoe319ZnVuY3Rpb24gV24oaSl7dmFyIGw9ZWUubGVuZ3RoO2k9aT4+PjA7dmFyIGg9MjE0NzQ4MzY0ODtpZihpPmgpcmV0dXJuITE7Zm9yKHZhciBnPTE7Zzw9NDtnKj0yKXt2YXIgeT1sKigxKy4yL2cpO3k9TWF0aC5taW4oeSxpKzEwMDY2MzI5Nik7dmFyIEU9TWF0aC5taW4oaCx5bihNYXRoLm1heChpLHkpLDY1NTM2KSksXz0kbihFKTtpZihfKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGpuKGkpe2Zvcih2YXIgbD1FZSgpO0VlKCktbDxpOyk7fXZhciBHZT17fTtmdW5jdGlvbiBxbigpe3JldHVybiB1fHwiLi90aGlzLnByb2dyYW0ifWZ1bmN0aW9uIHJlKCl7aWYoIXJlLnN0cmluZ3Mpe3ZhciBpPSh0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLGw9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzppLF86cW4oKX07Zm9yKHZhciBoIGluIEdlKUdlW2hdPT09dm9pZCAwP2RlbGV0ZSBsW2hdOmxbaF09R2VbaF07dmFyIGc9W107Zm9yKHZhciBoIGluIGwpZy5wdXNoKGgrIj0iK2xbaF0pO3JlLnN0cmluZ3M9Z31yZXR1cm4gcmUuc3RyaW5nc312YXIgVGU9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihpLGwpe3ZhciBoPVRlLmJ1ZmZlcnNbaV07bD09PTB8fGw9PT0xMD8oKGk9PT0xP3Y6TSkoWChoLDApKSxoLmxlbmd0aD0wKTpoLnB1c2gobCl9LHZhcmFyZ3M6dm9pZCAwLGdldDpmdW5jdGlvbigpe1RlLnZhcmFyZ3MrPTQ7dmFyIGk9eFtUZS52YXJhcmdzLTQ+PjJdO3JldHVybiBpfSxnZXRTdHI6ZnVuY3Rpb24oaSl7dmFyIGw9d2UoaSk7cmV0dXJuIGx9LGdldDY0OmZ1bmN0aW9uKGksbCl7cmV0dXJuIGl9fTtmdW5jdGlvbiBWbihpLGwpe3ZhciBoPTA7cmV0dXJuIHJlKCkuZm9yRWFjaChmdW5jdGlvbihnLHkpe3ZhciBFPWwraDt4W2kreSo0Pj4yXT1FLF9uKGcsRSksaCs9Zy5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gem4oaSxsKXt2YXIgaD1yZSgpO3hbaT4+Ml09aC5sZW5ndGg7dmFyIGc9MDtyZXR1cm4gaC5mb3JFYWNoKGZ1bmN0aW9uKHkpe2crPXkubGVuZ3RoKzF9KSx4W2w+PjJdPWcsMH1mdW5jdGlvbiBKbihpKXtlcyhpKX1mdW5jdGlvbiBHbihpKXtyZXR1cm4gMH1mdW5jdGlvbiBRbihpLGwsaCxnLHkpe31mdW5jdGlvbiBYbihpLGwsaCxnKXtmb3IodmFyIHk9MCxFPTA7RTxoO0UrKyl7Zm9yKHZhciBfPXhbbCtFKjg+PjJdLEM9eFtsKyhFKjgrNCk+PjJdLFU9MDtVPEM7VSsrKVRlLnByaW50Q2hhcihpLGVlW18rVV0pO3krPUN9cmV0dXJuIHhbZz4+Ml09eSwwfWZ1bmN0aW9uIEtuKCl7aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXt2YXIgaT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpKSxpWzBdfX1lbHNlIHJldHVybiBmdW5jdGlvbigpe0goInJhbmRvbURldmljZSIpfX1mdW5jdGlvbiBDZShpLGwpe0NlLnJhbmRvbURldmljZXx8KENlLnJhbmRvbURldmljZT1LbigpKTtmb3IodmFyIGg9MDtoPGw7aCsrKWJlW2kraD4+MF09Q2UucmFuZG9tRGV2aWNlKCk7cmV0dXJuIDB9dmFyIFluPXthOnhuLGU6Rm4sZDpMbixiOmtuLG46Qm4saDpObixsOkhuLG06V24scDpqbixmOlZuLGc6em4sajpKbixpOkduLGs6UW4sYzpYbixvOkNlfTtJbigpLHQuX19fd2FzbV9jYWxsX2N0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX19fd2FzbV9jYWxsX2N0b3JzPXQuYXNtLnIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQ9dC5hc20ucykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dE1lbW9yeU9mZnNldD10LmFzbS50KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0SGVpZ2h0PXQuYXNtLnUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRXaWR0aD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dFdpZHRoPXQuYXNtLnYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRDaGFubmVsQ291bnQ9dC5hc20udykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0PXQuYXNtLngpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dEhlaWdodD10LmFzbS55KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dFdpZHRoPXQuYXNtLnopLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dENoYW5uZWxDb3VudD10LmFzbS5BKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2xvYWRNb2RlbD1mdW5jdGlvbigpe3JldHVybih0Ll9sb2FkTW9kZWw9dC5hc20uQikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9ydW5JbmZlcmVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4odC5fcnVuSW5mZXJlbmNlPXQuYXNtLkMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIEx0PXQuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4oTHQ9dC5fX19lcnJub19sb2NhdGlvbj10LmFzbS5FKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFJlO2Z1bmN0aW9uIFpuKGkpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIraSsiKSIsdGhpcy5zdGF0dXM9aX10ZT1mdW5jdGlvbiBpKCl7UmV8fFFlKCksUmV8fCh0ZT1pKX07ZnVuY3Rpb24gUWUoaSl7aWYoaj4wfHwoYm4oKSxqPjApKXJldHVybjtmdW5jdGlvbiBsKCl7UmV8fChSZT0hMCx0LmNhbGxlZFJ1bj0hMCwhSSYmKEVuKCksbih0KSx0Lm9uUnVudGltZUluaXRpYWxpemVkJiZ0Lm9uUnVudGltZUluaXRpYWxpemVkKCksVG4oKSkpfXQuc2V0U3RhdHVzPyh0LnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zZXRTdGF0dXMoIiIpfSwxKSxsKCl9LDEpKTpsKCl9dC5ydW49UWU7ZnVuY3Rpb24gZXMoaSxsKXt0cyhpKX1mdW5jdGlvbiB0cyhpKXt3bigpfHwodC5vbkV4aXQmJnQub25FeGl0KGkpLEk9ITApLGMoaSxuZXcgWm4oaSkpfWlmKHQucHJlSW5pdClmb3IodHlwZW9mIHQucHJlSW5pdD09ImZ1bmN0aW9uIiYmKHQucHJlSW5pdD1bdC5wcmVJbml0XSk7dC5wcmVJbml0Lmxlbmd0aD4wOyl0LnByZUluaXQucG9wKCkoKTtyZXR1cm4gUWUoKSxlLnJlYWR5fX0oKTt0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiP21vZHVsZS5leHBvcnRzPXllOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHllfSk6dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiYoZXhwb3J0cy5jcmVhdGVWb25hZ2VURkxpdGVTaW1kTW9kdWxlPXllKTtjbGFzcyBobntjb25zdHJ1Y3Rvcigpe3RoaXMuaXNTSU1EU3VwcG9ydGVkXz0hMSx0aGlzLmlzVGhyZWFkc1N1cHBvcnRlZF89ITEsdGhpcy5pbnB1dFdpZHRoXz0wLHRoaXMuaW5wdXRIZWlnaHRfPTAsdGhpcy5pbnB1dENoYW5uZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0V2lkdGhfPTAsdGhpcy5vdXRwdXRIZWlnaHRfPTAsdGhpcy5vdXRwdXRDaGFubmVsQ291bnRfPTAsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPTB9fWFzeW5jIGZ1bmN0aW9uIGRuKHIsZSl7bGV0IHQ9bmV3IGhuO3ZhciBuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsbyl7YXN5bmMgZnVuY3Rpb24gYSgpe3JldHVybiB5ZSh7bG9jYXRlRmlsZTpmdW5jdGlvbihtKXtyZXR1cm4gcittfX0pfWFzeW5jIGZ1bmN0aW9uIHUoYyl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKG0sZik9Pntjb25zdCBkPWM7aWYodHlwZW9mIGQ9PSJ1bmRlZmluZWQiKXJldHVybiBmKCJURkxpdGUgYmFja2VuZCB1bmF2YWlsYWJsZTogd2FzbVNpbWQiKTtjb25zdCBSPWNuKCk7Y29uc29sZS5sb2coIkxvYWRpbmcgdGZsaXRlIG1vZGVsOiIsUik7bGV0IHY9ZStgJHtSfS50ZmxpdGVgO2NvbnNvbGUubG9nKCJURkxpdGUgbW9kZWxVcmw6ICIrdik7dHJ5e2NvbnN0IEE9YXdhaXQoYXdhaXQgZmV0Y2godikpLmFycmF5QnVmZmVyKCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBzaXplOiIsQS5ieXRlTGVuZ3RoKTtjb25zdCBUPWQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0KCk7Y29uc29sZS5sb2coIk1vZGVsIGJ1ZmZlciBtZW1vcnkgb2Zmc2V0OiIsVCksY29uc29sZS5sb2coIkxvYWRpbmcgbW9kZWwgYnVmZmVyLi4uIiksZC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KEEpLFQpO2NvbnN0IE89ZC5fbG9hZE1vZGVsKEEuYnl0ZUxlbmd0aCk7aWYoY29uc29sZS5sb2coIkxvYWQgbW9kZWwgcmVzdWx0OiIsTyksTyE9PTApe2YoIkNhbm5vdCBsb2FkIG1vZGVsIik7cmV0dXJufXQuaW5wdXRXaWR0aF89ZC5fZ2V0SW5wdXRXaWR0aCgpLHQuaW5wdXRIZWlnaHRfPWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudF89ZC5fZ2V0SW5wdXRDaGFubmVsQ291bnQoKSx0LmlucHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpLGNvbnNvbGUubG9nKCJJbnB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5pbnB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0XyksY29uc29sZS5sb2coIklucHV0IHdpZHRoOiIsdC5pbnB1dFdpZHRoXyksY29uc29sZS5sb2coIklucHV0IGNoYW5uZWxzOiIsdC5pbnB1dENoYW5uZWxDb3VudF8pLHQub3V0cHV0TWVtb3J5T2Zmc2V0Xz1kLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSx0Lm91dHB1dFdpZHRoXz1kLl9nZXRPdXRwdXRXaWR0aCgpLHQub3V0cHV0SGVpZ2h0Xz1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudF89ZC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCksY29uc29sZS5sb2coIk91dHB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5vdXRwdXRNZW1vcnlPZmZzZXRfKSxjb25zb2xlLmxvZygiT3V0cHV0IGhlaWdodDoiLHQub3V0cHV0SGVpZ2h0XyksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGhfKSxjb25zb2xlLmxvZygiT3V0cHV0IGNoYW5uZWxzOiIsdC5vdXRwdXRDaGFubmVsQ291bnRfKSx0LnNlbGVjdGVkVEZMaXRlXz1kfWNhdGNoKE0pe2YoTSk7cmV0dXJufW0oKX0pfWEoKS50aGVuKGM9PntpZihjPT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjt1KGMpLnRoZW4obT0+e3ModCl9KS5jYXRjaChtPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKGM9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsYyksbygibG9hZFRGTGl0ZSBlcnJvcjoiK2MpfSl9KTtyZXR1cm4gbn1jbGFzcyBwbntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChuKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixuKX19fWNvbnN0IFE9Y2xhc3N7Y29uc3RydWN0b3Iocil7aWYodGhpcy5jb25maWdfPXIsdGhpcy5mcmFtZUNvdW50ZXJfPTAsdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz0wLHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF89dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPTAsdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MCxyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCI/KHRoaXMudGltZXJHYXBfPVEuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IHVuKHIuYmFja2dyb3VuZEFzc2V0VXJpKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iQmFja2dyb3VuZEJsdXIiPyh0aGlzLnRpbWVyR2FwXz1RLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBQdChyLnJhZGl1cykpOnIudHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCI/dGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORDpyLnRyYW5zZm9ybWVyVHlwZT09PSJTaWx1ZXRlQmx1ciI/KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IHBuKHIucmFkaXVzKSk6KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IFB0KX1pbml0KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHIsZSk9Pnthd2FpdCBkbih0aGlzLmNvbmZpZ18ud2FzbUFzc2V0VXJpUGF0aCx0aGlzLmNvbmZpZ18udGZsaXRlQXNzZXRVcmlQYXRoKS50aGVuKHQ9Pnt0JiYodGhpcy52b2FuZ2VURkxpdGVJbmZvXz10LHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18ud2lkdGg9dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8qdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8sdGhpcy5zZWdtZW50YXRpb25NYXNrXz1uZXcgSW1hZ2VEYXRhKHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRNZW1vcnlPZmZzZXRfLzQsdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfPXRoaXMudm9hbmdlVEZMaXRlSW5mb18ub3V0cHV0TWVtb3J5T2Zmc2V0Xy80LHIoKSl9KS5jYXRjaCh0PT57Y29uc29sZS5sb2coImVycm9yIHVzZVRGTGl0ZToiLHQpLGUodCl9KX0pfWFzeW5jIHN0YXJ0KCl7aWYodHlwZW9mIHRoaXMudm9hbmdlVEZMaXRlSW5mb189PSJ1bmRlZmluZWQiKXRocm93InRyYW5zZm9ybWVyIG5vdCBpbml0In1hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCksKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aCE9ci5kaXNwbGF5V2lkdGh8fHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQhPXIuZGlzcGxheUhlaWdodCkmJih0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGg9ci5kaXNwbGF5V2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodD1yLmRpc3BsYXlIZWlnaHQpO2NvbnN0IHQ9ci50aW1lc3RhbXA7Y3JlYXRlSW1hZ2VCaXRtYXAocikudGhlbihuPT57ci5jbG9zZSgpLHRoaXMucHJvY2Vzc0ZyYW1lKGUsbix0KX0pLmNhdGNoKG49Pntjb25zb2xlLmVycm9yKCJjcmVhdGVJbWFnZUJpdG1hcCIsbiksZS5lbnF1ZXVlKHIpfSl9cHJvY2Vzc0ZyYW1lKHIsZSx0KXt0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfJiYodGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz10LHRoaXMucHJvY2Vzc1NvdXJjZShlKSksdGhpcy5yZXN1bHRDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18sMCwwLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0KSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHIuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSh0aGlzLnJlc3VsdENhbnZhc18se3RpbWVzdGFtcDp0LGFscGhhOiJkaXNjYXJkIn0pKSx0aGlzLmZyYW1lQ291bnRlcl8rK31wcm9jZXNzU291cmNlKHIpe3RoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmdldEltYWdlRGF0YSgwLDAsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyk7Zm9yKGxldCB0PTA7dDx0aGlzLnNlZ21lbnRhdGlvblBpeGVsQ291bnRfO3QrKyl0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLnNlbGVjdGVkVEZMaXRlXy5IRUFQRjMyW3RoaXMuaW5wdXRNZW1vcnlPZmZzZXRfK3QqM109ZS5kYXRhW3QqNF0vMjU1LHRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozKzFdPWUuZGF0YVt0KjQrMV0vMjU1LHRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozKzJdPWUuZGF0YVt0KjQrMl0vMjU1O3RoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLl9ydW5JbmZlcmVuY2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXtjb25zdCBuPXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5vdXRwdXRNZW1vcnlPZmZzZXRfK3RdO3RoaXMuc2VnbWVudGF0aW9uTWFza18uZGF0YVt0KjQrM109MjU1Km59dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5wdXRJbWFnZURhdGEodGhpcy5zZWdtZW50YXRpb25NYXNrXywwLDApLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXywwLDAsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpfWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXNldFZpZGVvQkdSZWFkYWJsZShyKXt0aGlzLmNvbmZpZ18udHJhbnNmb3JtZXJUeXBlPT09IlZpZGVvQmFja2dyb3VuZCImJih0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgbG4ocikpfX07bGV0IHFlPVE7cWUuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MmU1LHFlLlZJUlRVQUxfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EPTE1ZTQ7ZnVuY3Rpb24gbW4ocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIGduKHIpe2lmKG1uKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFZlKHIpe3JldHVybiB0eXBlb2Ygcj09InVuZGVmaW5lZCI/IiI6Z24ocikubWVzc2FnZX1pZih0eXBlb2YgaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIil7bGV0IHI9bmV3IGFuO3Iub24oImVycm9yIixlPT57Y29uc3QgdD17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6ZX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodCkpfSksci5vbigid2FybiIsZT0+e2NvbnN0IHQ9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6ZX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodCkpfSksb25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdHtvcGVyYXRpb246dH09ZS5kYXRhO2lmKGNvbnNvbGUubG9nKCJvcGVyYXRpb249Iix0KSx0PT09InRyYW5zZm9ybSIpe2NvbnN0e3JlYWRhYmxlOm4sd3JpdGFibGU6cyxjb25maWc6byx2aWRlb0JHUmVhZGFibGU6YX09ZS5kYXRhO2xldCB1PVtdO2NvbnN0IGM9bmV3IHFlKEpTT04ucGFyc2UobykpO2Muc2V0VmlkZW9CR1JlYWRhYmxlKGEpLGMuaW5pdCgpLnRoZW4oKCk9Pnt1LnB1c2goYyksci5zZXRUcmFuc2Zvcm1lcnModSkudGhlbigoKT0+e3IudHJhbnNmb3JtKG4scykudGhlbigoKT0+e2NvbnN0IG09e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZToidHJhbnNmb3JtIn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobSkpfSkuY2F0Y2gobT0+e2NvbnN0IGY9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6VmUobSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGYpKX0pfSl9KS5jYXRjaChtPT57Y29uc3QgZj17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShtKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZikpfSl9ZWxzZSB0PT09ImRlc3Ryb3kiP3IuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBuPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6ImRlc3Ryb3kifTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShuKSl9KS5jYXRjaChuPT57Y29uc3Qgcz17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShuKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkocykpfSk6dD09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSImJnIuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZS5kYXRhLnJhdGUpfX19KSgpOwo=",ql=typeof window!="undefined"&&window.Blob&&new Blob([atob(_l)],{type:"text/javascript;charset=utf-8"});function pc(){const Z=ql&&(window.URL||window.webkitURL).createObjectURL(ql);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+_l,{type:"module"})}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}const R=new WeakMap,ll=new WeakMap,U=new WeakMap,pl=Symbol("anyProducer"),ld=Promise.resolve(),dl=Symbol("listenerAdded"),cl=Symbol("listenerRemoved");let yl=!1;function N(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function Zl(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function F(Z,l){const d=ll.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function B(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:pl,c=U.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function yc(Z,l,d){const c=U.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(pl)){const b=Promise.all([l,d]);for(const e of c.get(pl))e.enqueue(b)}}function dd(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(n){b.push(n),c()},finish(){d=!0,c()}};for(const n of l)B(Z,n).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(n=>{c=n}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(n){b=void 0;for(const t of l)B(Z,t).delete(e);return c(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cd(Z){if(Z===void 0)return Zd;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Zd.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const Vl=Z=>Z===dl||Z===cl;class Y{static mixin(l,d){return d=cd(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const n of d)if(c.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new Y}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=n=>function(...t){return this[l][n](...t)};for(const n of d)Object.defineProperty(c.prototype,n,{enumerable:!1,value:e(n)});return c}}static get isDebugEnabled(){if(typeof process!="object")return yl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||yl}static set isDebugEnabled(l){yl=l}constructor(l={}){R.set(this,new Set),ll.set(this,new Map),U.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const n=new Date,t=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${t}][emittery:${d}][${c}] Event Name: ${b}
|
|
4
|
+
data: ${e}`)})}logIfDebugEnabled(l,d,c){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)N(c),F(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),Vl(c)||this.emit(dl,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)N(c),F(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),Vl(c)||this.emit(cl,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)N(d);return dd(this,l)}async emit(l,d){N(l),this.logIfDebugEnabled("emit",l,d),yc(this,l,d);const c=F(this,l),b=R.get(this),e=[...c],n=Vl(l)?[]:[...b];await ld,await Promise.all([...e.map(async t=>{if(c.has(t))return t(d)}),...n.map(async t=>{if(b.has(t))return t(l,d)})])}async emitSerial(l,d){N(l),this.logIfDebugEnabled("emitSerial",l,d);const c=F(this,l),b=R.get(this),e=[...c],n=[...b];await ld;for(const t of e)c.has(t)&&await t(d);for(const t of n)b.has(t)&&await t(l,d)}onAny(l){return Zl(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(l),this.emit(dl,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return dd(this)}offAny(l){Zl(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(cl,{listener:l}),R.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){F(this,d).clear();const c=B(this,d);for(const b of c)b.finish();c.clear()}else{R.get(this).clear();for(const c of ll.get(this).values())c.clear();for(const c of U.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=R.get(this).size+F(this,c).size+B(this,c).size+B(this).size;continue}typeof c!="undefined"&&N(c),d+=R.get(this).size;for(const b of ll.get(this).values())d+=b.size;for(const b of U.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=cd(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Zd=Object.getOwnPropertyNames(Y.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:dl,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:cl,writable:!1,enumerable:!0,configurable:!1});var Vc=Y;class Rc extends Vc{constructor(l){super();this.config_=l,this.worker_=new pc,this.trackExpectedRate_=-1,this.workerInited_=!1,this.onMessage_=new Promise((d,c)=>{this.worker_.addEventListener("message",b=>{let e=JSON.parse(b.data);e.callbackType==="success"?d():e.callbackType==="error"?c(e.message):e.callbackType==="media_processor_error_event"?this.emit("error",e.message):e.callbackType==="media_processor_warn_event"&&this.emit("warn",e.message)})})}transform(l,d){return new Promise(async(c,b)=>{if(this.config_.transformerType==="VideoBackground"){const e=document.createElement("video");e.src=this.config_.backgroundAssetUri,e.muted=!0;try{await e.play()}catch(s){b(s);return}const n=e.captureStream().getVideoTracks()[0],m=new MediaStreamTrackProcessor(n).readable;this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_),videoBGReadable:m},[l,d,m])}else this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_)},[l,d]);this.onMessage_.then(()=>{console.log("Worker inited"),this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),c()}).catch(e=>{console.log("Worker inited error"),b(e)})})}destroy(){return new Promise(async(l,d)=>{this.worker_.postMessage({operation:"destroy"}),this.onMessage_.then(()=>{console.log("Worker destroyed"),l()}).catch(c=>{console.log("Worker destroy error"),d(c)})})}setTrackExpectedRate(l){this.trackExpectedRate_=l,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}}r.BlurRadius=void 0,function(Z){Z.Low="Low",Z.High="High"}(r.BlurRadius||(r.BlurRadius={}));const Yc=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Jc(){return new Promise(async(Z,l)=>{try{await g()}catch(d){l(d);return}Yc().then(d=>{if(d===!1){l("Your browser does not support WebAssembly features.");return}Z()}).catch(d=>{l(d)})})}let v,bl=-1;function Ic(){return v}function Kc(Z){bl=Z,typeof v!="undefined"&&v.setTrackExpectedRate(bl)}function fc(Z){return new Promise(async(l,d)=>{v=new Rc(Z),bl!=-1&&v.setTrackExpectedRate(bl);const c=new hc(v);l(c)})}r.createVonageMediaProcessorConnector=fc,r.getVonageEventEmitter=Ic,r.isSupported=Jc,r.setTrackExpectedRate=Kc,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
package/dist/types/main.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { MediaProcessorConnectorInterface } from '@vonage/media-processor';
|
|
1
|
+
import { EventDataMap, MediaProcessorConnectorInterface } from '@vonage/media-processor';
|
|
2
2
|
import { BlurRadius, BackgroundBlurConfig, VirtualBackgroundConfig, AssetBackgroundConfig, VideoBackgroundConfig, MediaProcessorBaseConfig, SilueteBlurConfig } from './src/types';
|
|
3
3
|
import { isSupported } from './src/utils/utils';
|
|
4
|
+
import Emittery from 'emittery';
|
|
4
5
|
/**
|
|
5
6
|
* MediaProcessorConfig specifies the transformer logic to be performed.
|
|
6
7
|
*
|
|
@@ -41,59 +42,21 @@ import { isSupported } from './src/utils/utils';
|
|
|
41
42
|
*/
|
|
42
43
|
declare type MediaProcessorConfig = MediaProcessorBaseConfig & (BackgroundBlurConfig | ((VirtualBackgroundConfig | VideoBackgroundConfig) & AssetBackgroundConfig) | SilueteBlurConfig);
|
|
43
44
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* @param config Specifies the transformer logic that the MediaProcessorConnectorInterface instance will be enabled with.
|
|
47
|
-
* @returns A promise that is resolved with a given MediaProcessorConnectorInterface instance.
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
*
|
|
51
|
-
* ```ts
|
|
52
|
-
* createVonageMediaProcessorConnector(config).then(mediaProcessorConnector => {
|
|
53
|
-
* setMediaProcessorConnector(mediaProcessorConnector);
|
|
54
|
-
* })
|
|
55
|
-
* .catch(e => {
|
|
56
|
-
* console.error(e)
|
|
57
|
-
* });
|
|
58
|
-
*
|
|
59
|
-
* // ..
|
|
60
|
-
*
|
|
61
|
-
* setMediaProcessorConnector(mediaProcessorConnector: MediaProcessorConnectorInterface): Promise<void> {
|
|
62
|
-
* return new Promise<void>(async (resolve, reject) => {
|
|
63
|
-
* this.mediaProcessorConnector_ = mediaProcessorConnector;
|
|
64
|
-
* if (!this.stream_)
|
|
65
|
-
* {
|
|
66
|
-
* console.log('[CameraSource] Requesting camera.');
|
|
67
|
-
* reject("no stream")
|
|
68
|
-
* }
|
|
69
|
-
* this.mediaProcessorConnector_.setTrack(this.videoTrack_).then(newTrack => {
|
|
70
|
-
* let processedStream = new MediaStream();
|
|
71
|
-
* processedStream.addTrack(newTrack);
|
|
72
|
-
* this.sink_.setMediaStream(processedStream);
|
|
73
|
-
* resolve();
|
|
74
|
-
* })
|
|
75
|
-
* .catch(e => {
|
|
76
|
-
* reject(e)
|
|
77
|
-
* })
|
|
78
|
-
* });
|
|
79
|
-
* }
|
|
80
|
-
*
|
|
81
|
-
* // ..
|
|
82
|
-
*
|
|
83
|
-
* async stopMediaProcessorConnector() {
|
|
84
|
-
* if(this.mediaProcessorConnector_){
|
|
85
|
-
* this.mediaProcessorConnector_.destroy().then(() => {
|
|
86
|
-
* let processedStream = new MediaStream();
|
|
87
|
-
* processedStream.addTrack(this.videoTrack_);
|
|
88
|
-
* this.sink_.setMediaStream(processedStream);
|
|
89
|
-
* })
|
|
90
|
-
* .catch(e => {
|
|
91
|
-
* console.error(e);
|
|
92
|
-
* });
|
|
93
|
-
* }
|
|
94
|
-
* }
|
|
95
|
-
* ```
|
|
45
|
+
* Registers for error and warn events that come from the library on run time.
|
|
46
|
+
* see @EventDataMap for more info.
|
|
96
47
|
*/
|
|
48
|
+
declare function getVonageEventEmitter(): Emittery<EventDataMap>;
|
|
49
|
+
/**
|
|
50
|
+
* Sets the expected rate of the track per second.
|
|
51
|
+
* The media processor will use this number for calculating drops in the rate.
|
|
52
|
+
* This could happen when the transformation will take more time than expected.
|
|
53
|
+
* This will not cause an error, just warning to the client.
|
|
54
|
+
* Mostly:
|
|
55
|
+
* Video: 30 frames per second
|
|
56
|
+
* Audio: 50 audio data per second for OPUS
|
|
57
|
+
* @param trackExpectedRate - number holds the predicted track rate. -1 for disable this monitor.
|
|
58
|
+
*/
|
|
59
|
+
declare function setTrackExpectedRate(trackExpectedRate: number): void;
|
|
97
60
|
declare function createVonageMediaProcessorConnector(config: MediaProcessorConfig): Promise<MediaProcessorConnectorInterface>;
|
|
98
61
|
export type { MediaProcessorBaseConfig, BackgroundBlurConfig, VirtualBackgroundConfig, VideoBackgroundConfig, AssetBackgroundConfig, SilueteBlurConfig, MediaProcessorConfig };
|
|
99
|
-
export { BlurRadius, createVonageMediaProcessorConnector, isSupported, };
|
|
62
|
+
export { BlurRadius, createVonageMediaProcessorConnector, getVonageEventEmitter, setTrackExpectedRate, isSupported, };
|
|
@@ -23,6 +23,7 @@ declare class BackgroundTransformer {
|
|
|
23
23
|
postProcessInterface_?: PostProcessInterface;
|
|
24
24
|
config_: MediaProcessorConfig;
|
|
25
25
|
constructor(config: MediaProcessorConfig);
|
|
26
|
+
init(): Promise<void>;
|
|
26
27
|
start(): Promise<void>;
|
|
27
28
|
transform(frame: any, controller: TransformStreamDefaultController): Promise<void>;
|
|
28
29
|
processFrame(controller: TransformStreamDefaultController, image: ImageBitmap, timestamp: number): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { MediaProcessorInterface } from '@vonage/media-processor';
|
|
1
|
+
import { EventDataMap, MediaProcessorInterface } from '@vonage/media-processor';
|
|
2
2
|
import { MediaProcessorConfig } from '../../main';
|
|
3
|
-
|
|
3
|
+
import Emittery from 'emittery';
|
|
4
|
+
declare class VonageMediaProcessorWorker extends Emittery<EventDataMap> implements MediaProcessorInterface {
|
|
4
5
|
worker_: any;
|
|
5
6
|
config_: MediaProcessorConfig;
|
|
7
|
+
onMessage_: Promise<void>;
|
|
8
|
+
trackExpectedRate_: number;
|
|
9
|
+
workerInited_: boolean;
|
|
6
10
|
constructor(config: MediaProcessorConfig);
|
|
7
11
|
transform(readable: ReadableStream, writable: WritableStream): Promise<void>;
|
|
8
12
|
destroy(): Promise<void>;
|
|
13
|
+
setTrackExpectedRate(trackExpectedRate: number): void;
|
|
14
|
+
postTrackExpectedRate(): void;
|
|
9
15
|
}
|
|
10
16
|
export default VonageMediaProcessorWorker;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vonage/ml-transformers",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"author": "Guy Mininberg <guy.mininberg@vonage.com>",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Guy Mininberg <guy.mininberg@vonage.com>",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"axios": "^0.25.0",
|
|
38
38
|
"uuid": "^8.3.2",
|
|
39
39
|
"typescript-optional": "3.0.0-alpha.3",
|
|
40
|
-
"@vonage/media-processor": "1.
|
|
40
|
+
"@vonage/media-processor": "1.1.1"
|
|
41
41
|
},
|
|
42
42
|
"files": [
|
|
43
43
|
"dist"
|