@worktif/runtime 0.3.0-edge.14 → 0.3.0-edge.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,21 @@
1
- "use strict";var Zt=Object.create;var Re=Object.defineProperty;var Xt=Object.getOwnPropertyDescriptor;var Qt=Object.getOwnPropertyNames;var en=Object.getPrototypeOf,tn=Object.prototype.hasOwnProperty;var nn=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),rn=(r,e)=>{for(var t in e)Re(r,t,{get:e[t],enumerable:!0})},ft=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Qt(e))!tn.call(r,o)&&o!==t&&Re(r,o,{get:()=>e[o],enumerable:!(n=Xt(e,o))||n.enumerable});return r};var B=(r,e,t)=>(t=r!=null?Zt(en(r)):{},ft(e||!r||!r.__esModule?Re(t,"default",{value:r,enumerable:!0}):t,r)),on=r=>ft(Re({},"__esModule",{value:!0}),r);var me=nn(()=>{var pt;(function(r){(function(e){var t=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:m(),n=o(r);typeof t.Reflect<"u"&&(n=o(t.Reflect,n)),e(n,t),typeof t.Reflect>"u"&&(t.Reflect=r);function o(b,R){return function(w,$){Object.defineProperty(b,w,{configurable:!0,writable:!0,value:$}),R&&R(w,$)}}function s(){try{return Function("return this;")()}catch{}}function u(){try{return(0,eval)("(function() { return this; })()")}catch{}}function m(){return s()||u()}})(function(e,t){var n=Object.prototype.hasOwnProperty,o=typeof Symbol=="function",s=o&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",u=o&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",m=typeof Object.create=="function",b={__proto__:[]}instanceof Array,R=!m&&!b,w={create:m?function(){return We(Object.create(null))}:b?function(){return We({__proto__:null})}:function(){return We({})},has:R?function(i,a){return n.call(i,a)}:function(i,a){return a in i},get:R?function(i,a){return n.call(i,a)?i[a]:void 0}:function(i,a){return i[a]}},$=Object.getPrototypeOf(Function),_=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:Ht(),j=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:Yt(),N=typeof WeakMap=="function"?WeakMap:Kt(),x=o?Symbol.for("@reflect-metadata:registry"):void 0,re=Gt(),ee=Ut(re);function Se(i,a,l,d){if(v(l)){if(!ot(i))throw new TypeError;if(!it(a))throw new TypeError;return Bt(i,a)}else{if(!ot(i))throw new TypeError;if(!P(a))throw new TypeError;if(!P(d)&&!v(d)&&!ie(d))throw new TypeError;return ie(d)&&(d=void 0),l=H(l),$t(i,a,l,d)}}e("decorate",Se);function oe(i,a){function l(d,y){if(!P(d))throw new TypeError;if(!v(y)&&!Wt(y))throw new TypeError;Qe(i,a,d,y)}return l}e("metadata",oe);function ke(i,a,l,d){if(!P(l))throw new TypeError;return v(d)||(d=H(d)),Qe(i,a,l,d)}e("defineMetadata",ke);function fe(i,a,l){if(!P(a))throw new TypeError;return v(l)||(l=H(l)),qe(i,a,l)}e("hasMetadata",fe);function Z(i,a,l){if(!P(a))throw new TypeError;return v(l)||(l=H(l)),Le(i,a,l)}e("hasOwnMetadata",Z);function Je(i,a,l){if(!P(a))throw new TypeError;return v(l)||(l=H(l)),Ze(i,a,l)}e("getMetadata",Je);function _t(i,a,l){if(!P(a))throw new TypeError;return v(l)||(l=H(l)),Xe(i,a,l)}e("getOwnMetadata",_t);function Pt(i,a){if(!P(i))throw new TypeError;return v(a)||(a=H(a)),et(i,a)}e("getMetadataKeys",Pt);function At(i,a){if(!P(i))throw new TypeError;return v(a)||(a=H(a)),tt(i,a)}e("getOwnMetadataKeys",At);function It(i,a,l){if(!P(a))throw new TypeError;if(v(l)||(l=H(l)),!P(a))throw new TypeError;v(l)||(l=H(l));var d=pe(a,l,!1);return v(d)?!1:d.OrdinaryDeleteMetadata(i,a,l)}e("deleteMetadata",It);function Bt(i,a){for(var l=i.length-1;l>=0;--l){var d=i[l],y=d(a);if(!v(y)&&!ie(y)){if(!it(y))throw new TypeError;a=y}}return a}function $t(i,a,l,d){for(var y=i.length-1;y>=0;--y){var A=i[y],L=A(a,l,d);if(!v(L)&&!ie(L)){if(!P(L))throw new TypeError;d=L}}return d}function qe(i,a,l){var d=Le(i,a,l);if(d)return!0;var y=Fe(a);return ie(y)?!1:qe(i,y,l)}function Le(i,a,l){var d=pe(a,l,!1);return v(d)?!1:rt(d.OrdinaryHasOwnMetadata(i,a,l))}function Ze(i,a,l){var d=Le(i,a,l);if(d)return Xe(i,a,l);var y=Fe(a);if(!ie(y))return Ze(i,y,l)}function Xe(i,a,l){var d=pe(a,l,!1);if(!v(d))return d.OrdinaryGetOwnMetadata(i,a,l)}function Qe(i,a,l,d){var y=pe(l,d,!0);y.OrdinaryDefineOwnMetadata(i,a,l,d)}function et(i,a){var l=tt(i,a),d=Fe(i);if(d===null)return l;var y=et(d,a);if(y.length<=0)return l;if(l.length<=0)return y;for(var A=new j,L=[],S=0,f=l;S<f.length;S++){var p=f[S],h=A.has(p);h||(A.add(p),L.push(p))}for(var g=0,k=y;g<k.length;g++){var p=k[g],h=A.has(p);h||(A.add(p),L.push(p))}return L}function tt(i,a){var l=pe(i,a,!1);return l?l.OrdinaryOwnMetadataKeys(i,a):[]}function nt(i){if(i===null)return 1;switch(typeof i){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return i===null?1:6;default:return 6}}function v(i){return i===void 0}function ie(i){return i===null}function jt(i){return typeof i=="symbol"}function P(i){return typeof i=="object"?i!==null:typeof i=="function"}function Lt(i,a){switch(nt(i)){case 0:return i;case 1:return i;case 2:return i;case 3:return i;case 4:return i;case 5:return i}var l=a===3?"string":a===5?"number":"default",d=st(i,s);if(d!==void 0){var y=d.call(i,l);if(P(y))throw new TypeError;return y}return Nt(i,l==="default"?"number":l)}function Nt(i,a){if(a==="string"){var l=i.toString;if(se(l)){var d=l.call(i);if(!P(d))return d}var y=i.valueOf;if(se(y)){var d=y.call(i);if(!P(d))return d}}else{var y=i.valueOf;if(se(y)){var d=y.call(i);if(!P(d))return d}var A=i.toString;if(se(A)){var d=A.call(i);if(!P(d))return d}}throw new TypeError}function rt(i){return!!i}function Ft(i){return""+i}function H(i){var a=Lt(i,3);return jt(a)?a:Ft(a)}function ot(i){return Array.isArray?Array.isArray(i):i instanceof Object?i instanceof Array:Object.prototype.toString.call(i)==="[object Array]"}function se(i){return typeof i=="function"}function it(i){return typeof i=="function"}function Wt(i){switch(nt(i)){case 3:return!0;case 4:return!0;default:return!1}}function Ne(i,a){return i===a||i!==i&&a!==a}function st(i,a){var l=i[a];if(l!=null){if(!se(l))throw new TypeError;return l}}function at(i){var a=st(i,u);if(!se(a))throw new TypeError;var l=a.call(i);if(!P(l))throw new TypeError;return l}function lt(i){return i.value}function ct(i){var a=i.next();return a.done?!1:a}function ut(i){var a=i.return;a&&a.call(i)}function Fe(i){var a=Object.getPrototypeOf(i);if(typeof i!="function"||i===$||a!==$)return a;var l=i.prototype,d=l&&Object.getPrototypeOf(l);if(d==null||d===Object.prototype)return a;var y=d.constructor;return typeof y!="function"||y===i?a:y}function zt(){var i;!v(x)&&typeof t.Reflect<"u"&&!(x in t.Reflect)&&typeof t.Reflect.defineMetadata=="function"&&(i=Vt(t.Reflect));var a,l,d,y=new N,A={registerProvider:L,getProvider:f,setProvider:h};return A;function L(g){if(!Object.isExtensible(A))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case i===g:break;case v(a):a=g;break;case a===g:break;case v(l):l=g;break;case l===g:break;default:d===void 0&&(d=new j),d.add(g);break}}function S(g,k){if(!v(a)){if(a.isProviderFor(g,k))return a;if(!v(l)){if(l.isProviderFor(g,k))return a;if(!v(d))for(var T=at(d);;){var I=ct(T);if(!I)return;var G=lt(I);if(G.isProviderFor(g,k))return ut(T),G}}}if(!v(i)&&i.isProviderFor(g,k))return i}function f(g,k){var T=y.get(g),I;return v(T)||(I=T.get(k)),v(I)&&(I=S(g,k),v(I)||(v(T)&&(T=new _,y.set(g,T)),T.set(k,I))),I}function p(g){if(v(g))throw new TypeError;return a===g||l===g||!v(d)&&d.has(g)}function h(g,k,T){if(!p(T))throw new Error("Metadata provider not registered.");var I=f(g,k);if(I!==T){if(!v(I))return!1;var G=y.get(g);v(G)&&(G=new _,y.set(g,G)),G.set(k,T)}return!0}}function Gt(){var i;return!v(x)&&P(t.Reflect)&&Object.isExtensible(t.Reflect)&&(i=t.Reflect[x]),v(i)&&(i=zt()),!v(x)&&P(t.Reflect)&&Object.isExtensible(t.Reflect)&&Object.defineProperty(t.Reflect,x,{enumerable:!1,configurable:!1,writable:!1,value:i}),i}function Ut(i){var a=new N,l={isProviderFor:function(p,h){var g=a.get(p);return v(g)?!1:g.has(h)},OrdinaryDefineOwnMetadata:L,OrdinaryHasOwnMetadata:y,OrdinaryGetOwnMetadata:A,OrdinaryOwnMetadataKeys:S,OrdinaryDeleteMetadata:f};return re.registerProvider(l),l;function d(p,h,g){var k=a.get(p),T=!1;if(v(k)){if(!g)return;k=new _,a.set(p,k),T=!0}var I=k.get(h);if(v(I)){if(!g)return;if(I=new _,k.set(h,I),!i.setProvider(p,h,l))throw k.delete(h),T&&a.delete(p),new Error("Wrong provider for target.")}return I}function y(p,h,g){var k=d(h,g,!1);return v(k)?!1:rt(k.has(p))}function A(p,h,g){var k=d(h,g,!1);if(!v(k))return k.get(p)}function L(p,h,g,k){var T=d(g,k,!0);T.set(p,h)}function S(p,h){var g=[],k=d(p,h,!1);if(v(k))return g;for(var T=k.keys(),I=at(T),G=0;;){var dt=ct(I);if(!dt)return g.length=G,g;var Jt=lt(dt);try{g[G]=Jt}catch(qt){try{ut(I)}finally{throw qt}}G++}}function f(p,h,g){var k=d(h,g,!1);if(v(k)||!k.delete(p))return!1;if(k.size===0){var T=a.get(h);v(T)||(T.delete(g),T.size===0&&a.delete(T))}return!0}}function Vt(i){var a=i.defineMetadata,l=i.hasOwnMetadata,d=i.getOwnMetadata,y=i.getOwnMetadataKeys,A=i.deleteMetadata,L=new N,S={isProviderFor:function(f,p){var h=L.get(f);return!v(h)&&h.has(p)?!0:y(f,p).length?(v(h)&&(h=new j,L.set(f,h)),h.add(p),!0):!1},OrdinaryDefineOwnMetadata:a,OrdinaryHasOwnMetadata:l,OrdinaryGetOwnMetadata:d,OrdinaryOwnMetadataKeys:y,OrdinaryDeleteMetadata:A};return S}function pe(i,a,l){var d=re.getProvider(i,a);if(!v(d))return d;if(l){if(re.setProvider(i,a,ee))return ee;throw new Error("Illegal state.")}}function Ht(){var i={},a=[],l=(function(){function S(f,p,h){this._index=0,this._keys=f,this._values=p,this._selector=h}return S.prototype["@@iterator"]=function(){return this},S.prototype[u]=function(){return this},S.prototype.next=function(){var f=this._index;if(f>=0&&f<this._keys.length){var p=this._selector(this._keys[f],this._values[f]);return f+1>=this._keys.length?(this._index=-1,this._keys=a,this._values=a):this._index++,{value:p,done:!1}}return{value:void 0,done:!0}},S.prototype.throw=function(f){throw this._index>=0&&(this._index=-1,this._keys=a,this._values=a),f},S.prototype.return=function(f){return this._index>=0&&(this._index=-1,this._keys=a,this._values=a),{value:f,done:!0}},S})(),d=(function(){function S(){this._keys=[],this._values=[],this._cacheKey=i,this._cacheIndex=-2}return Object.defineProperty(S.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),S.prototype.has=function(f){return this._find(f,!1)>=0},S.prototype.get=function(f){var p=this._find(f,!1);return p>=0?this._values[p]:void 0},S.prototype.set=function(f,p){var h=this._find(f,!0);return this._values[h]=p,this},S.prototype.delete=function(f){var p=this._find(f,!1);if(p>=0){for(var h=this._keys.length,g=p+1;g<h;g++)this._keys[g-1]=this._keys[g],this._values[g-1]=this._values[g];return this._keys.length--,this._values.length--,Ne(f,this._cacheKey)&&(this._cacheKey=i,this._cacheIndex=-2),!0}return!1},S.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=i,this._cacheIndex=-2},S.prototype.keys=function(){return new l(this._keys,this._values,y)},S.prototype.values=function(){return new l(this._keys,this._values,A)},S.prototype.entries=function(){return new l(this._keys,this._values,L)},S.prototype["@@iterator"]=function(){return this.entries()},S.prototype[u]=function(){return this.entries()},S.prototype._find=function(f,p){if(!Ne(this._cacheKey,f)){this._cacheIndex=-1;for(var h=0;h<this._keys.length;h++)if(Ne(this._keys[h],f)){this._cacheIndex=h;break}}return this._cacheIndex<0&&p&&(this._cacheIndex=this._keys.length,this._keys.push(f),this._values.push(void 0)),this._cacheIndex},S})();return d;function y(S,f){return S}function A(S,f){return f}function L(S,f){return[S,f]}}function Yt(){var i=(function(){function a(){this._map=new _}return Object.defineProperty(a.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),a.prototype.has=function(l){return this._map.has(l)},a.prototype.add=function(l){return this._map.set(l,l),this},a.prototype.delete=function(l){return this._map.delete(l)},a.prototype.clear=function(){this._map.clear()},a.prototype.keys=function(){return this._map.keys()},a.prototype.values=function(){return this._map.keys()},a.prototype.entries=function(){return this._map.entries()},a.prototype["@@iterator"]=function(){return this.keys()},a.prototype[u]=function(){return this.keys()},a})();return i}function Kt(){var i=16,a=w.create(),l=d();return(function(){function f(){this._key=d()}return f.prototype.has=function(p){var h=y(p,!1);return h!==void 0?w.has(h,this._key):!1},f.prototype.get=function(p){var h=y(p,!1);return h!==void 0?w.get(h,this._key):void 0},f.prototype.set=function(p,h){var g=y(p,!0);return g[this._key]=h,this},f.prototype.delete=function(p){var h=y(p,!1);return h!==void 0?delete h[this._key]:!1},f.prototype.clear=function(){this._key=d()},f})();function d(){var f;do f="@@WeakMap@@"+S();while(w.has(a,f));return a[f]=!0,f}function y(f,p){if(!n.call(f,l)){if(!p)return;Object.defineProperty(f,l,{value:w.create()})}return f[l]}function A(f,p){for(var h=0;h<p;++h)f[h]=Math.random()*255|0;return f}function L(f){if(typeof Uint8Array=="function"){var p=new Uint8Array(f);return typeof crypto<"u"?crypto.getRandomValues(p):typeof msCrypto<"u"?msCrypto.getRandomValues(p):A(p,f),p}return A(new Array(f),f)}function S(){var f=L(i);f[6]=f[6]&79|64,f[8]=f[8]&191|128;for(var p="",h=0;h<i;++h){var g=f[h];(h===4||h===6||h===8)&&(p+="-"),g<16&&(p+="0"),p+=g.toString(16).toLowerCase()}return p}}function We(i){return i.__=void 0,delete i.__,i}})})(pt||(pt={}))});var Ln={};rn(Ln,{PurenowRuntimeStacksDeployService:()=>ce,RuntimeBuildError:()=>Ce,RuntimeCliError:()=>U,RuntimeConfigError:()=>Te,RuntimeDeploymentError:()=>Ee,RuntimeDeploymentStrategy:()=>Me,RuntimeFriendlyErrorFormatter:()=>ae,RuntimeStructuredLogger:()=>De,RuntimeTemplateError:()=>Y,RuntimeTemplateService:()=>le,RuntimeTemplateStructureError:()=>X,RuntimeValidationError:()=>xe,RuntimeWebCli:()=>be,RuntimeWebDeploymentService:()=>te,buildStaticHtml:()=>gt,createRuntimeCli:()=>Mt});module.exports=on(Ln);var Vr=B(me());var $r=B(me()),W=B(require("process")),je=require("@worktif/purenow/bin");var C=B(require("fs")),D=B(require("path")),mt=require("@worktif/purenow/bin");var U=class extends Error{constructor(t,n,o){super(t);this.code=n;this.hint=o;this.name="RuntimeCliError",Error.captureStackTrace(this,this.constructor)}},Te=class extends U{constructor(e,t){super(e,"RUNTIME_CONFIG_ERROR",t),this.name="RuntimeConfigError"}},Ce=class extends U{constructor(e,t){super(e,"RUNTIME_BUILD_ERROR",t),this.name="RuntimeBuildError"}},Ee=class extends U{constructor(e,t){super(e,"RUNTIME_DEPLOYMENT_ERROR",t),this.name="RuntimeDeploymentError"}};var xe=class extends U{constructor(e,t){super(e,"RUNTIME_VALIDATION_ERROR",t),this.name="RuntimeValidationError"}},Y=class extends U{constructor(t,n,o,s,u,m,b){super(t,"RUNTIME_TEMPLATE_ERROR",b);this.templateName=n;this.coreDir=o;this.searchedPaths=s;this.packageContext=u;this.resolutionStrategy=m;this.name="RuntimeTemplateError"}},X=class extends U{constructor(t,n,o,s){super(t,"RUNTIME_TEMPLATE_STRUCTURE_ERROR",s);this.templateDir=n;this.validationErrors=o;this.name="RuntimeTemplateStructureError"}},ae=class{formatError(e,t=!1){let n=[];return n.push(`Error: ${e.name||"RuntimeError"}`),n.push(""),n.push(`Message: ${e.message}`),n.push(""),e instanceof U&&e.hint&&(n.push(`Hint: ${e.hint}`),n.push("")),t&&e.stack&&(n.push("--- Stack Trace (--verbose) ---"),n.push(e.stack),n.push("")),n.join(`
2
- `)}formatValidationError(e,t,n=!1){let o=[];return o.push("Validation Error"),o.push(""),o.push(`Field: ${e}`),o.push(`Issue: ${t}`),o.push(""),n&&(o.push("--- Technical Details (--verbose) ---"),o.push(`Field validation failed for: ${e}`),o.push(`Validation message: ${t}`),o.push("")),o.join(`
3
- `)}formatDeploymentError(e,t,n,o=!1){let s=[];return s.push("Deployment Error"),s.push(""),s.push(`Stack: ${e}`),s.push(`Operation: ${t}`),s.push(`Issue: ${n}`),s.push(""),s.push("Troubleshooting:"),s.push("1. Check AWS credentials and permissions"),s.push("2. Verify stack configuration"),s.push("3. Review CloudFormation events in AWS Console"),s.push(""),o&&(s.push("--- Technical Details (--verbose) ---"),s.push(`Stack name: ${e}`),s.push(`Failed operation: ${t}`),s.push(`Error details: ${n}`),s.push("")),s.join(`
4
- `)}formatTemplateError(e,t=!1){let n=[];return n.push("Runtime Template Error"),n.push(""),n.push(`Issue: ${e.message}`),n.push(""),e.templateName&&n.push(`Template: ${e.templateName}`),e.coreDir&&n.push(`Core Directory: ${e.coreDir}`),e.packageContext&&n.push(`Package Context: ${e.packageContext}`),e.resolutionStrategy&&n.push(`Resolution Strategy: ${e.resolutionStrategy}`),n.push(""),e.searchedPaths&&e.searchedPaths.length>0&&(n.push("Searched Paths:"),e.searchedPaths.forEach(o=>{n.push(` - ${o}`)}),n.push("")),n.push("Troubleshooting:"),n.push("1. Ensure @worktif/runtime package is properly installed"),n.push("2. Verify the package contains src/bin/templates/runtime-web/ directory"),n.push("3. Check that runtime-web directory contains template subdirectories"),n.push("4. If running from source, ensure you're in the runtime package directory"),n.push("5. Try reinstalling the runtime package: npm install @worktif/runtime"),n.push(""),e.hint&&(n.push(`Hint: ${e.hint}`),n.push("")),t&&(n.push("--- Technical Details (--verbose) ---"),n.push(`Error code: ${e.code}`),e.stack&&(n.push("Stack trace:"),n.push(e.stack)),n.push("")),n.join(`
5
- `)}formatTemplateStructureError(e,t=!1){let n=[];return n.push("Runtime Template Structure Error"),n.push(""),n.push(`Issue: ${e.message}`),n.push(""),e.templateDir&&(n.push(`Template Directory: ${e.templateDir}`),n.push("")),e.validationErrors&&e.validationErrors.length>0&&(n.push("Validation Errors:"),e.validationErrors.forEach(o=>{n.push(` - ${o}`)}),n.push("")),n.push("Troubleshooting:"),n.push("1. Verify the runtime package installation is complete"),n.push("2. Check that src/bin/templates/runtime-web/ exists in the package"),n.push("3. Ensure template directories contain the required files"),n.push("4. Try reinstalling: npm install @worktif/runtime"),n.push("5. If developing locally, ensure templates are built correctly"),n.push(""),e.hint&&(n.push(`Hint: ${e.hint}`),n.push("")),t&&(n.push("--- Technical Details (--verbose) ---"),n.push(`Error code: ${e.code}`),e.stack&&(n.push("Stack trace:"),n.push(e.stack)),n.push("")),n.join(`
6
- `)}},De=class{constructor(e=!1){this.verbose=e}info(e,t){let n={level:"info",message:e,timestamp:new Date().toISOString(),...t};this.verbose?console.log(JSON.stringify(n,null,2)):console.log(e)}warn(e,t){let n={level:"warn",message:e,timestamp:new Date().toISOString(),...t};this.verbose?console.warn(JSON.stringify(n,null,2)):console.warn(`Warning: ${e}`)}error(e,t){let n={level:"error",message:e,timestamp:new Date().toISOString(),...t};this.verbose?console.error(JSON.stringify(n,null,2)):console.error(`Error: ${e}`)}debug(e,t){if(!this.verbose)return;let n={level:"debug",message:e,timestamp:new Date().toISOString(),...t};console.debug(JSON.stringify(n,null,2))}};var le=class extends mt.TemplateService{constructor(e=process.cwd()){super(e),this.runtimeTemplatesDir=this.resolveRuntimeTemplateDirectory()}async scaffold(e,t,n,o="runtime-web"){let s=this.validateTemplateStructure(o);if(!s.valid)throw new X("Runtime template directory validation failed",this.runtimeTemplatesDir,s.errors,"Ensure the runtime package is properly installed and contains the expected template structure");let u=D.join(this.runtimeTemplatesDir,o,e);if(!C.existsSync(u)){let R=this.getAvailableTemplates(o),w=this.getTemplateResolutionInfo();throw new Y(`Runtime template '${e}' not found`,e,o,[u],w.packageContext||"unknown",w.resolutionStrategy,R.length>0?`Available templates: ${R.join(", ")}. Try: runtime init <project-name> --template ${R[0]}`:`No templates found in '${o}'. The runtime package may not be properly installed.`)}if(C.readdirSync(u).length===0){let R=this.getTemplateResolutionInfo();throw new Y(`Runtime template '${e}' directory is empty`,e,o,[u],R.packageContext||"unknown",R.resolutionStrategy,"This indicates a corrupted or incomplete template installation. Try reinstalling the runtime package.")}let b=this.templatesDir;this.templatesDir=this.runtimeTemplatesDir;try{let R=this.copyTemplateFiles;this.copyTemplateFiles=async(w,$,_)=>{let j={..._,packageVersion:this.getRuntimePackageVersion(),PURENOW_VERSION:this.getRuntimePackageVersion(),STACK_NAME:_.projectName,PROJECT_NAME:_.projectName,REGION:"us-east-1",ENABLE_SEO:"false",STAGE:"dev"};return R.call(this,w,$,j)},await super.scaffold(e,t,n,o)}finally{this.templatesDir=b}}resolveRuntimeTemplateDirectory(){let e=[],t=[],n=this.detectRuntimePackageRoot();if(n){let w=D.join(n,"src","bin","templates");e.push(w),t.push({path:w,strategy:"package.json detection",valid:this.validateTemplateDirectory(w)})}let o=this.getModuleBasedPaths();for(let w of o)e.push(w),t.push({path:w,strategy:"module location",valid:this.validateTemplateDirectory(w)});let s=this.getNodeModulePaths();for(let w of s)e.push(w),t.push({path:w,strategy:"node_modules resolution",valid:this.validateTemplateDirectory(w)});let u=this.getEnvironmentBasedPaths();for(let w of u)e.push(w),t.push({path:w,strategy:"environment detection",valid:this.validateTemplateDirectory(w)});let m=t.find(w=>w.valid);if(m)return m.path;let b=t.map(w=>w.path),R=this.detectRuntimePackageRoot();throw new Y("Runtime templates directory not found",void 0,"runtime-web",b,R||"unknown","comprehensive search","Ensure @worktif/runtime package is properly installed with template directory structure")}detectRuntimePackageRoot(){let e=__dirname;for(;e!==D.dirname(e);){let t=D.join(e,"package.json");if(C.existsSync(t))try{if(JSON.parse(C.readFileSync(t,"utf-8")).name==="@worktif/runtime")return e}catch{}e=D.dirname(e)}return null}getModuleBasedPaths(){return[D.join(__dirname,"templates"),D.join(__dirname,"..","templates"),D.join(__dirname,"..","..","bin","templates"),D.join(__dirname,"..","..","..","src","bin","templates")]}getNodeModulePaths(){let e=[];try{let t=require.resolve("@worktif/runtime/package.json"),n=D.dirname(t);e.push(D.join(n,"src","bin","templates")),e.push(D.join(n,"out","dist","bin","templates"))}catch{}return e}getEnvironmentBasedPaths(){let e=[];if(process.argv[1]){let t=D.dirname(process.argv[1]);e.push(D.join(t,"templates")),e.push(D.join(t,"..","templates"))}return e.push(D.join(process.cwd(),"src","bin","templates")),e.push(D.join(process.cwd(),"node_modules","@worktif","runtime","src","bin","templates")),e}validateTemplateDirectory(e){try{if(!C.existsSync(e)||!C.statSync(e).isDirectory())return!1;let n=D.join(e,"runtime-web");return!C.existsSync(n)||!C.statSync(n).isDirectory()?!1:C.readdirSync(n,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).length>0}catch{return!1}}getAvailableTemplates(e){try{let t=D.join(this.runtimeTemplatesDir,e);return C.existsSync(t)?C.readdirSync(t,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name):[]}catch{return[]}}validateRuntimeTemplates(){try{return this.validateTemplateDirectory(this.runtimeTemplatesDir)}catch{return!1}}validateTemplateStructure(e="runtime-web"){let t=[];try{if(!C.existsSync(this.runtimeTemplatesDir))return t.push(`Templates directory does not exist: ${this.runtimeTemplatesDir}`),{valid:!1,errors:t};let n=D.join(this.runtimeTemplatesDir,e);if(!C.existsSync(n))return t.push(`Core directory does not exist: ${n}`),{valid:!1,errors:t};if(!C.statSync(n).isDirectory())return t.push(`Core path is not a directory: ${n}`),{valid:!1,errors:t};let s=C.readdirSync(n,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name);if(s.length===0)return t.push(`No template directories found in: ${n}`),{valid:!1,errors:t};for(let u of s){let m=D.join(n,u);C.readdirSync(m).length===0&&t.push(`Template directory is empty: ${m}`)}return{valid:t.length===0,errors:t}}catch(n){return t.push(`Validation error: ${n instanceof Error?n.message:String(n)}`),{valid:!1,errors:t}}}getRuntimeTemplatesDirectory(){return this.runtimeTemplatesDir}getRuntimePackageVersion(){try{let e=this.detectRuntimePackageRoot();if(e){let t=D.join(e,"package.json");if(C.existsSync(t))return JSON.parse(C.readFileSync(t,"utf-8")).version||"0.3.0"}try{let t=require.resolve("@worktif/runtime/package.json");return JSON.parse(C.readFileSync(t,"utf-8")).version||"0.3.0"}catch{return"0.3.0"}}catch{return"0.3.0"}}getTemplateResolutionInfo(){let e=this.detectRuntimePackageRoot(),t="unknown";e&&this.runtimeTemplatesDir.includes(e)?t="package.json detection":this.runtimeTemplatesDir.includes("node_modules")?t="node_modules resolution":this.runtimeTemplatesDir.includes(__dirname)?t="module location":t="environment detection";let n=[];try{C.existsSync(this.runtimeTemplatesDir)&&n.push(...C.readdirSync(this.runtimeTemplatesDir,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name))}catch{}return{runtimeTemplatesDir:this.runtimeTemplatesDir,isValid:this.validateRuntimeTemplates(),availableCores:n,packageContext:e,resolutionStrategy:t}}};var Oe=B(require("fs"));function he(r){if(!r||typeof r!="string")throw new Error("Stack name must be a non-empty string");let e=r.replace(/[^a-zA-Z0-9-]/g,"-");return/^[a-zA-Z]/.test(e)||(e="stack-"+e),e=e.replace(/-+/g,"-"),e=e.replace(/-+$/,""),e.length>128&&(e=e.substring(0,128).replace(/-+$/,"")),e||(e="stack"),e}var q=require("@worktif/purenow/bin"),ce=class extends q.StacksDeployService{constructor(t=process.cwd()){super(t);this.cwd=t;this.DEFAULT_CDK_DIR="cdk"}async executeDeploy(t,n){let{stage:o,config:s}=t,u=he(`${t.config.projectName}-PurenowInfra-${o}`),m=he(`${t.config.projectName}-PurenowRuntime-${o}`),b=he(`${t.config.projectName}-RuntimeWeb-${o}`);if(!(0,q.getStage)(s,o))throw new q.DeploymentError(`Stage '${o}' not found in configuration`,`Available stages: ${s.stages.map(N=>N.name).join(", ")}`);console.log("Deploying Infrastructure stack...");let w=await this.deployCdkStack(u,o,s);if(!w.success)throw new q.DeploymentError("Infrastructure deployment failed","Runtime stack will not be deployed. Fix Infra issues and retry.");console.log("Deploying PurenowRuntime stack...");let $=await this.deployCdkStack(m,o,s);if(!$.success)throw new q.DeploymentError("Runtime deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");console.log("Deploying RuntimeWeb stack...");let _=await this.deployCdkStack(b,o,s);if(!_.success)throw new q.DeploymentError("RuntimeWeb deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");let j=Date.now()-n;return{success:!0,infraStack:w,runtimeStack:$,runtimeWebStack:_,duration:j}}parseStackOutputs(t,n){let o=super.parseStackOutputs(t,n);if(!Oe.existsSync(n))return o;try{let s=Oe.readFileSync(n,"utf-8"),m=JSON.parse(s)[t];m&&(o.lambdaArnList=Object.keys(m).filter(b=>b.match(/(?:Lambda)[a-zA-Z]+Arn$/)).map(b=>m[b]))}catch(s){console.warn(`Failed to parse outputs file for ${t}: ${s instanceof Error?s.message:String(s)}`)}return o}getRegionSignature(t){return t?t.split("-").filter(Boolean).map(n=>n[0]??"").join(""):""}resourceName({name:t,serviceName:n,stage:o,region:s}){let u=he(this.getRegionSignature(s||"us-east-1"));return`${n}-${t}-${u}-${o}`}};var Me=class{constructor(){this.role="deployment";this.name="runtime-purenow-runtime-stacks"}async validateDeployment(e){try{return e.envValidator.isValid(),e.logger.info("Runtime deployment validation passed"),!0}catch(t){return e.logger.error(`Runtime deployment validation failed: ${t instanceof Error?t.message:String(t)}`),!1}}async executeDeployment(e,t){let n=t,{logger:o,options:s}=n;try{if(!(await e.stacksDeployService.deploy({stage:s.stage,config:e.config,skipBuild:s.skipBuild||!1})).success)throw new Error("Runtime Target stacks deployment failed");o.info("Runtime Target stack deployed successfully"),o.success("Infrastructure stack deployed successfully")}catch(u){throw o.error(`Runtime Target deployment failed: ${u instanceof Error?u.message:String(u)}`),u}}async postDeployment(e){}};var ge=B(require("path")),K=B(require("fs")),_e=5*1024*1024,ze=10*1024*1024,ht=1*1024*1024;function sn(){let r=process.cwd(),e=ge.default.join(r,"public/index.html"),t=!0;if(!K.default.existsSync(e)){if(t)return console.warn(`
1
+ "use strict";var In=Object.create;var Me=Object.defineProperty;var Bn=Object.getOwnPropertyDescriptor;var $n=Object.getOwnPropertyNames;var jn=Object.getPrototypeOf,Ln=Object.prototype.hasOwnProperty;var V=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Fn=(r,e)=>{for(var n in e)Me(r,n,{get:e[n],enumerable:!0})},Tt=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of $n(e))!Ln.call(r,o)&&o!==n&&Me(r,o,{get:()=>e[o],enumerable:!(t=Bn(e,o))||t.enumerable});return r};var $=(r,e,n)=>(n=r!=null?In(jn(r)):{},Tt(e||!r||!r.__esModule?Me(n,"default",{value:r,enumerable:!0}):n,r)),Nn=r=>Tt(Me({},"__esModule",{value:!0}),r);var ve=V(()=>{var Mt;(function(r){(function(e){var n=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:c(),t=o(r);typeof n.Reflect<"u"&&(t=o(n.Reflect,t)),e(t,n),typeof n.Reflect>"u"&&(n.Reflect=r);function o(d,v){return function(w,E){Object.defineProperty(d,w,{configurable:!0,writable:!0,value:E}),v&&v(w,E)}}function i(){try{return Function("return this;")()}catch{}}function s(){try{return(0,eval)("(function() { return this; })()")}catch{}}function c(){return i()||s()}})(function(e,n){var t=Object.prototype.hasOwnProperty,o=typeof Symbol=="function",i=o&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",s=o&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",c=typeof Object.create=="function",d={__proto__:[]}instanceof Array,v=!c&&!d,w={create:c?function(){return Ye(Object.create(null))}:d?function(){return Ye({__proto__:null})}:function(){return Ye({})},has:v?function(a,l){return t.call(a,l)}:function(a,l){return l in a},get:v?function(a,l){return t.call(a,l)?a[l]:void 0}:function(a,l){return a[l]}},E=Object.getPrototypeOf(Function),T=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:On(),j=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:Dn(),N=typeof WeakMap=="function"?WeakMap:Pn(),P=o?Symbol.for("@reflect-metadata:registry"):void 0,se=Cn(),re=Tn(se);function Ce(a,l,u,f){if(S(u)){if(!vt(a))throw new TypeError;if(!wt(l))throw new TypeError;return bn(a,l)}else{if(!vt(a))throw new TypeError;if(!A(l))throw new TypeError;if(!A(f)&&!S(f)&&!le(f))throw new TypeError;return le(f)&&(f=void 0),u=H(u),vn(a,l,u,f)}}e("decorate",Ce);function ae(a,l){function u(f,k){if(!A(f))throw new TypeError;if(!S(k)&&!xn(k))throw new TypeError;mt(a,l,f,k)}return u}e("metadata",ae);function Te(a,l,u,f){if(!A(u))throw new TypeError;return S(f)||(f=H(f)),mt(a,l,u,f)}e("defineMetadata",Te);function ye(a,l,u){if(!A(l))throw new TypeError;return S(u)||(u=H(u)),dt(a,l,u)}e("hasMetadata",ye);function Q(a,l,u){if(!A(l))throw new TypeError;return S(u)||(u=H(u)),He(a,l,u)}e("hasOwnMetadata",Q);function ut(a,l,u){if(!A(l))throw new TypeError;return S(u)||(u=H(u)),ft(a,l,u)}e("getMetadata",ut);function mn(a,l,u){if(!A(l))throw new TypeError;return S(u)||(u=H(u)),pt(a,l,u)}e("getOwnMetadata",mn);function hn(a,l){if(!A(a))throw new TypeError;return S(l)||(l=H(l)),ht(a,l)}e("getMetadataKeys",hn);function gn(a,l){if(!A(a))throw new TypeError;return S(l)||(l=H(l)),gt(a,l)}e("getOwnMetadataKeys",gn);function yn(a,l,u){if(!A(l))throw new TypeError;if(S(u)||(u=H(u)),!A(l))throw new TypeError;S(u)||(u=H(u));var f=be(l,u,!1);return S(f)?!1:f.OrdinaryDeleteMetadata(a,l,u)}e("deleteMetadata",yn);function bn(a,l){for(var u=a.length-1;u>=0;--u){var f=a[u],k=f(l);if(!S(k)&&!le(k)){if(!wt(k))throw new TypeError;l=k}}return l}function vn(a,l,u,f){for(var k=a.length-1;k>=0;--k){var I=a[k],L=I(l,u,f);if(!S(L)&&!le(L)){if(!A(L))throw new TypeError;f=L}}return f}function dt(a,l,u){var f=He(a,l,u);if(f)return!0;var k=Je(l);return le(k)?!1:dt(a,k,u)}function He(a,l,u){var f=be(l,u,!1);return S(f)?!1:bt(f.OrdinaryHasOwnMetadata(a,l,u))}function ft(a,l,u){var f=He(a,l,u);if(f)return pt(a,l,u);var k=Je(l);if(!le(k))return ft(a,k,u)}function pt(a,l,u){var f=be(l,u,!1);if(!S(f))return f.OrdinaryGetOwnMetadata(a,l,u)}function mt(a,l,u,f){var k=be(u,f,!0);k.OrdinaryDefineOwnMetadata(a,l,u,f)}function ht(a,l){var u=gt(a,l),f=Je(a);if(f===null)return u;var k=ht(f,l);if(k.length<=0)return u;if(u.length<=0)return k;for(var I=new j,L=[],R=0,p=u;R<p.length;R++){var h=p[R],g=I.has(h);g||(I.add(h),L.push(h))}for(var b=0,x=k;b<x.length;b++){var h=x[b],g=I.has(h);g||(I.add(h),L.push(h))}return L}function gt(a,l){var u=be(a,l,!1);return u?u.OrdinaryOwnMetadataKeys(a,l):[]}function yt(a){if(a===null)return 1;switch(typeof a){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return a===null?1:6;default:return 6}}function S(a){return a===void 0}function le(a){return a===null}function wn(a){return typeof a=="symbol"}function A(a){return typeof a=="object"?a!==null:typeof a=="function"}function kn(a,l){switch(yt(a)){case 0:return a;case 1:return a;case 2:return a;case 3:return a;case 4:return a;case 5:return a}var u=l===3?"string":l===5?"number":"default",f=kt(a,i);if(f!==void 0){var k=f.call(a,u);if(A(k))throw new TypeError;return k}return Sn(a,u==="default"?"number":u)}function Sn(a,l){if(l==="string"){var u=a.toString;if(ce(u)){var f=u.call(a);if(!A(f))return f}var k=a.valueOf;if(ce(k)){var f=k.call(a);if(!A(f))return f}}else{var k=a.valueOf;if(ce(k)){var f=k.call(a);if(!A(f))return f}var I=a.toString;if(ce(I)){var f=I.call(a);if(!A(f))return f}}throw new TypeError}function bt(a){return!!a}function Rn(a){return""+a}function H(a){var l=kn(a,3);return wn(l)?l:Rn(l)}function vt(a){return Array.isArray?Array.isArray(a):a instanceof Object?a instanceof Array:Object.prototype.toString.call(a)==="[object Array]"}function ce(a){return typeof a=="function"}function wt(a){return typeof a=="function"}function xn(a){switch(yt(a)){case 3:return!0;case 4:return!0;default:return!1}}function Ke(a,l){return a===l||a!==a&&l!==l}function kt(a,l){var u=a[l];if(u!=null){if(!ce(u))throw new TypeError;return u}}function St(a){var l=kt(a,s);if(!ce(l))throw new TypeError;var u=l.call(a);if(!A(u))throw new TypeError;return u}function Rt(a){return a.value}function xt(a){var l=a.next();return l.done?!1:l}function Et(a){var l=a.return;l&&l.call(a)}function Je(a){var l=Object.getPrototypeOf(a);if(typeof a!="function"||a===E||l!==E)return l;var u=a.prototype,f=u&&Object.getPrototypeOf(u);if(f==null||f===Object.prototype)return l;var k=f.constructor;return typeof k!="function"||k===a?l:k}function En(){var a;!S(P)&&typeof n.Reflect<"u"&&!(P in n.Reflect)&&typeof n.Reflect.defineMetadata=="function"&&(a=Mn(n.Reflect));var l,u,f,k=new N,I={registerProvider:L,getProvider:p,setProvider:g};return I;function L(b){if(!Object.isExtensible(I))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case a===b:break;case S(l):l=b;break;case l===b:break;case S(u):u=b;break;case u===b:break;default:f===void 0&&(f=new j),f.add(b);break}}function R(b,x){if(!S(l)){if(l.isProviderFor(b,x))return l;if(!S(u)){if(u.isProviderFor(b,x))return l;if(!S(f))for(var M=St(f);;){var B=xt(M);if(!B)return;var U=Rt(B);if(U.isProviderFor(b,x))return Et(M),U}}}if(!S(a)&&a.isProviderFor(b,x))return a}function p(b,x){var M=k.get(b),B;return S(M)||(B=M.get(x)),S(B)&&(B=R(b,x),S(B)||(S(M)&&(M=new T,k.set(b,M)),M.set(x,B))),B}function h(b){if(S(b))throw new TypeError;return l===b||u===b||!S(f)&&f.has(b)}function g(b,x,M){if(!h(M))throw new Error("Metadata provider not registered.");var B=p(b,x);if(B!==M){if(!S(B))return!1;var U=k.get(b);S(U)&&(U=new T,k.set(b,U)),U.set(x,M)}return!0}}function Cn(){var a;return!S(P)&&A(n.Reflect)&&Object.isExtensible(n.Reflect)&&(a=n.Reflect[P]),S(a)&&(a=En()),!S(P)&&A(n.Reflect)&&Object.isExtensible(n.Reflect)&&Object.defineProperty(n.Reflect,P,{enumerable:!1,configurable:!1,writable:!1,value:a}),a}function Tn(a){var l=new N,u={isProviderFor:function(h,g){var b=l.get(h);return S(b)?!1:b.has(g)},OrdinaryDefineOwnMetadata:L,OrdinaryHasOwnMetadata:k,OrdinaryGetOwnMetadata:I,OrdinaryOwnMetadataKeys:R,OrdinaryDeleteMetadata:p};return se.registerProvider(u),u;function f(h,g,b){var x=l.get(h),M=!1;if(S(x)){if(!b)return;x=new T,l.set(h,x),M=!0}var B=x.get(g);if(S(B)){if(!b)return;if(B=new T,x.set(g,B),!a.setProvider(h,g,u))throw x.delete(g),M&&l.delete(h),new Error("Wrong provider for target.")}return B}function k(h,g,b){var x=f(g,b,!1);return S(x)?!1:bt(x.has(h))}function I(h,g,b){var x=f(g,b,!1);if(!S(x))return x.get(h)}function L(h,g,b,x){var M=f(b,x,!0);M.set(h,g)}function R(h,g){var b=[],x=f(h,g,!1);if(S(x))return b;for(var M=x.keys(),B=St(M),U=0;;){var Ct=xt(B);if(!Ct)return b.length=U,b;var _n=Rt(Ct);try{b[U]=_n}catch(An){try{Et(B)}finally{throw An}}U++}}function p(h,g,b){var x=f(g,b,!1);if(S(x)||!x.delete(h))return!1;if(x.size===0){var M=l.get(g);S(M)||(M.delete(b),M.size===0&&l.delete(M))}return!0}}function Mn(a){var l=a.defineMetadata,u=a.hasOwnMetadata,f=a.getOwnMetadata,k=a.getOwnMetadataKeys,I=a.deleteMetadata,L=new N,R={isProviderFor:function(p,h){var g=L.get(p);return!S(g)&&g.has(h)?!0:k(p,h).length?(S(g)&&(g=new j,L.set(p,g)),g.add(h),!0):!1},OrdinaryDefineOwnMetadata:l,OrdinaryHasOwnMetadata:u,OrdinaryGetOwnMetadata:f,OrdinaryOwnMetadataKeys:k,OrdinaryDeleteMetadata:I};return R}function be(a,l,u){var f=se.getProvider(a,l);if(!S(f))return f;if(u){if(se.setProvider(a,l,re))return re;throw new Error("Illegal state.")}}function On(){var a={},l=[],u=(function(){function R(p,h,g){this._index=0,this._keys=p,this._values=h,this._selector=g}return R.prototype["@@iterator"]=function(){return this},R.prototype[s]=function(){return this},R.prototype.next=function(){var p=this._index;if(p>=0&&p<this._keys.length){var h=this._selector(this._keys[p],this._values[p]);return p+1>=this._keys.length?(this._index=-1,this._keys=l,this._values=l):this._index++,{value:h,done:!1}}return{value:void 0,done:!0}},R.prototype.throw=function(p){throw this._index>=0&&(this._index=-1,this._keys=l,this._values=l),p},R.prototype.return=function(p){return this._index>=0&&(this._index=-1,this._keys=l,this._values=l),{value:p,done:!0}},R})(),f=(function(){function R(){this._keys=[],this._values=[],this._cacheKey=a,this._cacheIndex=-2}return Object.defineProperty(R.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),R.prototype.has=function(p){return this._find(p,!1)>=0},R.prototype.get=function(p){var h=this._find(p,!1);return h>=0?this._values[h]:void 0},R.prototype.set=function(p,h){var g=this._find(p,!0);return this._values[g]=h,this},R.prototype.delete=function(p){var h=this._find(p,!1);if(h>=0){for(var g=this._keys.length,b=h+1;b<g;b++)this._keys[b-1]=this._keys[b],this._values[b-1]=this._values[b];return this._keys.length--,this._values.length--,Ke(p,this._cacheKey)&&(this._cacheKey=a,this._cacheIndex=-2),!0}return!1},R.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=a,this._cacheIndex=-2},R.prototype.keys=function(){return new u(this._keys,this._values,k)},R.prototype.values=function(){return new u(this._keys,this._values,I)},R.prototype.entries=function(){return new u(this._keys,this._values,L)},R.prototype["@@iterator"]=function(){return this.entries()},R.prototype[s]=function(){return this.entries()},R.prototype._find=function(p,h){if(!Ke(this._cacheKey,p)){this._cacheIndex=-1;for(var g=0;g<this._keys.length;g++)if(Ke(this._keys[g],p)){this._cacheIndex=g;break}}return this._cacheIndex<0&&h&&(this._cacheIndex=this._keys.length,this._keys.push(p),this._values.push(void 0)),this._cacheIndex},R})();return f;function k(R,p){return R}function I(R,p){return p}function L(R,p){return[R,p]}}function Dn(){var a=(function(){function l(){this._map=new T}return Object.defineProperty(l.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),l.prototype.has=function(u){return this._map.has(u)},l.prototype.add=function(u){return this._map.set(u,u),this},l.prototype.delete=function(u){return this._map.delete(u)},l.prototype.clear=function(){this._map.clear()},l.prototype.keys=function(){return this._map.keys()},l.prototype.values=function(){return this._map.keys()},l.prototype.entries=function(){return this._map.entries()},l.prototype["@@iterator"]=function(){return this.keys()},l.prototype[s]=function(){return this.keys()},l})();return a}function Pn(){var a=16,l=w.create(),u=f();return(function(){function p(){this._key=f()}return p.prototype.has=function(h){var g=k(h,!1);return g!==void 0?w.has(g,this._key):!1},p.prototype.get=function(h){var g=k(h,!1);return g!==void 0?w.get(g,this._key):void 0},p.prototype.set=function(h,g){var b=k(h,!0);return b[this._key]=g,this},p.prototype.delete=function(h){var g=k(h,!1);return g!==void 0?delete g[this._key]:!1},p.prototype.clear=function(){this._key=f()},p})();function f(){var p;do p="@@WeakMap@@"+R();while(w.has(l,p));return l[p]=!0,p}function k(p,h){if(!t.call(p,u)){if(!h)return;Object.defineProperty(p,u,{value:w.create()})}return p[u]}function I(p,h){for(var g=0;g<h;++g)p[g]=Math.random()*255|0;return p}function L(p){if(typeof Uint8Array=="function"){var h=new Uint8Array(p);return typeof crypto<"u"?crypto.getRandomValues(h):typeof msCrypto<"u"?msCrypto.getRandomValues(h):I(h,p),h}return I(new Array(p),p)}function R(){var p=L(a);p[6]=p[6]&79|64,p[8]=p[8]&191|128;for(var h="",g=0;g<a;++g){var b=p[g];(g===4||g===6||g===8)&&(h+="-"),b<16&&(h+="0"),h+=b.toString(16).toLowerCase()}return h}}function Ye(a){return a.__=void 0,delete a.__,a}})})(Mt||(Mt={}))});var At=V((Gr,_t)=>{"use strict";_t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Xe=V((Ur,Bt)=>{var Se=At(),It={};for(let r of Object.keys(Se))It[Se[r]]=r;var y={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};Bt.exports=y;for(let r of Object.keys(y)){if(!("channels"in y[r]))throw new Error("missing channels property: "+r);if(!("labels"in y[r]))throw new Error("missing channel labels property: "+r);if(y[r].labels.length!==y[r].channels)throw new Error("channel and label counts mismatch: "+r);let{channels:e,labels:n}=y[r];delete y[r].channels,delete y[r].labels,Object.defineProperty(y[r],"channels",{value:e}),Object.defineProperty(y[r],"labels",{value:n})}y.rgb.hsl=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255,o=Math.min(e,n,t),i=Math.max(e,n,t),s=i-o,c,d;i===o?c=0:e===i?c=(n-t)/s:n===i?c=2+(t-e)/s:t===i&&(c=4+(e-n)/s),c=Math.min(c*60,360),c<0&&(c+=360);let v=(o+i)/2;return i===o?d=0:v<=.5?d=s/(i+o):d=s/(2-i-o),[c,d*100,v*100]};y.rgb.hsv=function(r){let e,n,t,o,i,s=r[0]/255,c=r[1]/255,d=r[2]/255,v=Math.max(s,c,d),w=v-Math.min(s,c,d),E=function(T){return(v-T)/6/w+1/2};return w===0?(o=0,i=0):(i=w/v,e=E(s),n=E(c),t=E(d),s===v?o=t-n:c===v?o=1/3+e-t:d===v&&(o=2/3+n-e),o<0?o+=1:o>1&&(o-=1)),[o*360,i*100,v*100]};y.rgb.hwb=function(r){let e=r[0],n=r[1],t=r[2],o=y.rgb.hsl(r)[0],i=1/255*Math.min(e,Math.min(n,t));return t=1-1/255*Math.max(e,Math.max(n,t)),[o,i*100,t*100]};y.rgb.cmyk=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255,o=Math.min(1-e,1-n,1-t),i=(1-e-o)/(1-o)||0,s=(1-n-o)/(1-o)||0,c=(1-t-o)/(1-o)||0;return[i*100,s*100,c*100,o*100]};function Hn(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}y.rgb.keyword=function(r){let e=It[r];if(e)return e;let n=1/0,t;for(let o of Object.keys(Se)){let i=Se[o],s=Hn(r,i);s<n&&(n=s,t=o)}return t};y.keyword.rgb=function(r){return Se[r]};y.rgb.xyz=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92;let o=e*.4124+n*.3576+t*.1805,i=e*.2126+n*.7152+t*.0722,s=e*.0193+n*.1192+t*.9505;return[o*100,i*100,s*100]};y.rgb.lab=function(r){let e=y.rgb.xyz(r),n=e[0],t=e[1],o=e[2];n/=95.047,t/=100,o/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let i=116*t-16,s=500*(n-t),c=200*(t-o);return[i,s,c]};y.hsl.rgb=function(r){let e=r[0]/360,n=r[1]/100,t=r[2]/100,o,i,s;if(n===0)return s=t*255,[s,s,s];t<.5?o=t*(1+n):o=t+n-t*n;let c=2*t-o,d=[0,0,0];for(let v=0;v<3;v++)i=e+1/3*-(v-1),i<0&&i++,i>1&&i--,6*i<1?s=c+(o-c)*6*i:2*i<1?s=o:3*i<2?s=c+(o-c)*(2/3-i)*6:s=c,d[v]=s*255;return d};y.hsl.hsv=function(r){let e=r[0],n=r[1]/100,t=r[2]/100,o=n,i=Math.max(t,.01);t*=2,n*=t<=1?t:2-t,o*=i<=1?i:2-i;let s=(t+n)/2,c=t===0?2*o/(i+o):2*n/(t+n);return[e,c*100,s*100]};y.hsv.rgb=function(r){let e=r[0]/60,n=r[1]/100,t=r[2]/100,o=Math.floor(e)%6,i=e-Math.floor(e),s=255*t*(1-n),c=255*t*(1-n*i),d=255*t*(1-n*(1-i));switch(t*=255,o){case 0:return[t,d,s];case 1:return[c,t,s];case 2:return[s,t,d];case 3:return[s,c,t];case 4:return[d,s,t];case 5:return[t,s,c]}};y.hsv.hsl=function(r){let e=r[0],n=r[1]/100,t=r[2]/100,o=Math.max(t,.01),i,s;s=(2-n)*t;let c=(2-n)*o;return i=n*o,i/=c<=1?c:2-c,i=i||0,s/=2,[e,i*100,s*100]};y.hwb.rgb=function(r){let e=r[0]/360,n=r[1]/100,t=r[2]/100,o=n+t,i;o>1&&(n/=o,t/=o);let s=Math.floor(6*e),c=1-t;i=6*e-s,(s&1)!==0&&(i=1-i);let d=n+i*(c-n),v,w,E;switch(s){default:case 6:case 0:v=c,w=d,E=n;break;case 1:v=d,w=c,E=n;break;case 2:v=n,w=c,E=d;break;case 3:v=n,w=d,E=c;break;case 4:v=d,w=n,E=c;break;case 5:v=c,w=n,E=d;break}return[v*255,w*255,E*255]};y.cmyk.rgb=function(r){let e=r[0]/100,n=r[1]/100,t=r[2]/100,o=r[3]/100,i=1-Math.min(1,e*(1-o)+o),s=1-Math.min(1,n*(1-o)+o),c=1-Math.min(1,t*(1-o)+o);return[i*255,s*255,c*255]};y.xyz.rgb=function(r){let e=r[0]/100,n=r[1]/100,t=r[2]/100,o,i,s;return o=e*3.2406+n*-1.5372+t*-.4986,i=e*-.9689+n*1.8758+t*.0415,s=e*.0557+n*-.204+t*1.057,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=Math.min(Math.max(0,o),1),i=Math.min(Math.max(0,i),1),s=Math.min(Math.max(0,s),1),[o*255,i*255,s*255]};y.xyz.lab=function(r){let e=r[0],n=r[1],t=r[2];e/=95.047,n/=100,t/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,t=t>.008856?t**(1/3):7.787*t+16/116;let o=116*n-16,i=500*(e-n),s=200*(n-t);return[o,i,s]};y.lab.xyz=function(r){let e=r[0],n=r[1],t=r[2],o,i,s;i=(e+16)/116,o=n/500+i,s=i-t/200;let c=i**3,d=o**3,v=s**3;return i=c>.008856?c:(i-16/116)/7.787,o=d>.008856?d:(o-16/116)/7.787,s=v>.008856?v:(s-16/116)/7.787,o*=95.047,i*=100,s*=108.883,[o,i,s]};y.lab.lch=function(r){let e=r[0],n=r[1],t=r[2],o;o=Math.atan2(t,n)*360/2/Math.PI,o<0&&(o+=360);let s=Math.sqrt(n*n+t*t);return[e,s,o]};y.lch.lab=function(r){let e=r[0],n=r[1],o=r[2]/360*2*Math.PI,i=n*Math.cos(o),s=n*Math.sin(o);return[e,i,s]};y.rgb.ansi16=function(r,e=null){let[n,t,o]=r,i=e===null?y.rgb.hsv(r)[2]:e;if(i=Math.round(i/50),i===0)return 30;let s=30+(Math.round(o/255)<<2|Math.round(t/255)<<1|Math.round(n/255));return i===2&&(s+=60),s};y.hsv.ansi16=function(r){return y.rgb.ansi16(y.hsv.rgb(r),r[2])};y.rgb.ansi256=function(r){let e=r[0],n=r[1],t=r[2];return e===n&&n===t?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(t/255*5)};y.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let n=(~~(r>50)+1)*.5,t=(e&1)*n*255,o=(e>>1&1)*n*255,i=(e>>2&1)*n*255;return[t,o,i]};y.ansi256.rgb=function(r){if(r>=232){let i=(r-232)*10+8;return[i,i,i]}r-=16;let e,n=Math.floor(r/36)/5*255,t=Math.floor((e=r%36)/6)/5*255,o=e%6/5*255;return[n,t,o]};y.rgb.hex=function(r){let n=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return"000000".substring(n.length)+n};y.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let n=e[0];e[0].length===3&&(n=n.split("").map(c=>c+c).join(""));let t=parseInt(n,16),o=t>>16&255,i=t>>8&255,s=t&255;return[o,i,s]};y.rgb.hcg=function(r){let e=r[0]/255,n=r[1]/255,t=r[2]/255,o=Math.max(Math.max(e,n),t),i=Math.min(Math.min(e,n),t),s=o-i,c,d;return s<1?c=i/(1-s):c=0,s<=0?d=0:o===e?d=(n-t)/s%6:o===n?d=2+(t-e)/s:d=4+(e-n)/s,d/=6,d%=1,[d*360,s*100,c*100]};y.hsl.hcg=function(r){let e=r[1]/100,n=r[2]/100,t=n<.5?2*e*n:2*e*(1-n),o=0;return t<1&&(o=(n-.5*t)/(1-t)),[r[0],t*100,o*100]};y.hsv.hcg=function(r){let e=r[1]/100,n=r[2]/100,t=e*n,o=0;return t<1&&(o=(n-t)/(1-t)),[r[0],t*100,o*100]};y.hcg.rgb=function(r){let e=r[0]/360,n=r[1]/100,t=r[2]/100;if(n===0)return[t*255,t*255,t*255];let o=[0,0,0],i=e%1*6,s=i%1,c=1-s,d=0;switch(Math.floor(i)){case 0:o[0]=1,o[1]=s,o[2]=0;break;case 1:o[0]=c,o[1]=1,o[2]=0;break;case 2:o[0]=0,o[1]=1,o[2]=s;break;case 3:o[0]=0,o[1]=c,o[2]=1;break;case 4:o[0]=s,o[1]=0,o[2]=1;break;default:o[0]=1,o[1]=0,o[2]=c}return d=(1-n)*t,[(n*o[0]+d)*255,(n*o[1]+d)*255,(n*o[2]+d)*255]};y.hcg.hsv=function(r){let e=r[1]/100,n=r[2]/100,t=e+n*(1-e),o=0;return t>0&&(o=e/t),[r[0],o*100,t*100]};y.hcg.hsl=function(r){let e=r[1]/100,t=r[2]/100*(1-e)+.5*e,o=0;return t>0&&t<.5?o=e/(2*t):t>=.5&&t<1&&(o=e/(2*(1-t))),[r[0],o*100,t*100]};y.hcg.hwb=function(r){let e=r[1]/100,n=r[2]/100,t=e+n*(1-e);return[r[0],(t-e)*100,(1-t)*100]};y.hwb.hcg=function(r){let e=r[1]/100,t=1-r[2]/100,o=t-e,i=0;return o<1&&(i=(t-o)/(1-o)),[r[0],o*100,i*100]};y.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};y.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};y.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};y.gray.hsl=function(r){return[0,0,r[0]]};y.gray.hsv=y.gray.hsl;y.gray.hwb=function(r){return[0,100,r[0]]};y.gray.cmyk=function(r){return[0,0,0,r[0]]};y.gray.lab=function(r){return[r[0],0,0]};y.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,t=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(t.length)+t};y.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var jt=V((Vr,$t)=>{var je=Xe();function Kn(){let r={},e=Object.keys(je);for(let n=e.length,t=0;t<n;t++)r[e[t]]={distance:-1,parent:null};return r}function Jn(r){let e=Kn(),n=[r];for(e[r].distance=0;n.length;){let t=n.pop(),o=Object.keys(je[t]);for(let i=o.length,s=0;s<i;s++){let c=o[s],d=e[c];d.distance===-1&&(d.distance=e[t].distance+1,d.parent=t,n.unshift(c))}}return e}function Yn(r,e){return function(n){return e(r(n))}}function Zn(r,e){let n=[e[r].parent,r],t=je[e[r].parent][r],o=e[r].parent;for(;e[o].parent;)n.unshift(e[o].parent),t=Yn(je[e[o].parent][o],t),o=e[o].parent;return t.conversion=n,t}$t.exports=function(r){let e=Jn(r),n={},t=Object.keys(e);for(let o=t.length,i=0;i<o;i++){let s=t[i];e[s].parent!==null&&(n[s]=Zn(s,e))}return n}});var Ft=V((qr,Lt)=>{var Qe=Xe(),Xn=jt(),pe={},Qn=Object.keys(Qe);function er(r){let e=function(...n){let t=n[0];return t==null?t:(t.length>1&&(n=t),r(n))};return"conversion"in r&&(e.conversion=r.conversion),e}function tr(r){let e=function(...n){let t=n[0];if(t==null)return t;t.length>1&&(n=t);let o=r(n);if(typeof o=="object")for(let i=o.length,s=0;s<i;s++)o[s]=Math.round(o[s]);return o};return"conversion"in r&&(e.conversion=r.conversion),e}Qn.forEach(r=>{pe[r]={},Object.defineProperty(pe[r],"channels",{value:Qe[r].channels}),Object.defineProperty(pe[r],"labels",{value:Qe[r].labels});let e=Xn(r);Object.keys(e).forEach(t=>{let o=e[t];pe[r][t]=tr(o),pe[r][t].raw=er(o)})});Lt.exports=pe});var Vt=V((Hr,Ut)=>{"use strict";var Nt=(r,e)=>(...n)=>`\x1B[${r(...n)+e}m`,Wt=(r,e)=>(...n)=>{let t=r(...n);return`\x1B[${38+e};5;${t}m`},zt=(r,e)=>(...n)=>{let t=r(...n);return`\x1B[${38+e};2;${t[0]};${t[1]};${t[2]}m`},Le=r=>r,Gt=(r,e,n)=>[r,e,n],me=(r,e,n)=>{Object.defineProperty(r,e,{get:()=>{let t=n();return Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0}),t},enumerable:!0,configurable:!0})},et,he=(r,e,n,t)=>{et===void 0&&(et=Ft());let o=t?10:0,i={};for(let[s,c]of Object.entries(et)){let d=s==="ansi16"?"ansi":s;s===e?i[d]=r(n,o):typeof c=="object"&&(i[d]=r(c[e],o))}return i};function nr(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[n,t]of Object.entries(e)){for(let[o,i]of Object.entries(t))e[o]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},t[o]=e[o],r.set(i[0],i[1]);Object.defineProperty(e,n,{value:t,enumerable:!1})}return Object.defineProperty(e,"codes",{value:r,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",me(e.color,"ansi",()=>he(Nt,"ansi16",Le,!1)),me(e.color,"ansi256",()=>he(Wt,"ansi256",Le,!1)),me(e.color,"ansi16m",()=>he(zt,"rgb",Gt,!1)),me(e.bgColor,"ansi",()=>he(Nt,"ansi16",Le,!0)),me(e.bgColor,"ansi256",()=>he(Wt,"ansi256",Le,!0)),me(e.bgColor,"ansi16m",()=>he(zt,"rgb",Gt,!0)),e}Object.defineProperty(Ut,"exports",{enumerable:!0,get:nr})});var Ht=V((Kr,qt)=>{"use strict";qt.exports=(r,e=process.argv)=>{let n=r.startsWith("-")?"":r.length===1?"-":"--",t=e.indexOf(n+r),o=e.indexOf("--");return t!==-1&&(o===-1||t<o)}});var Yt=V((Jr,Jt)=>{"use strict";var rr=require("os"),Kt=require("tty"),G=Ht(),{env:F}=process,te;G("no-color")||G("no-colors")||G("color=false")||G("color=never")?te=0:(G("color")||G("colors")||G("color=true")||G("color=always"))&&(te=1);"FORCE_COLOR"in F&&(F.FORCE_COLOR==="true"?te=1:F.FORCE_COLOR==="false"?te=0:te=F.FORCE_COLOR.length===0?1:Math.min(parseInt(F.FORCE_COLOR,10),3));function tt(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function nt(r,e){if(te===0)return 0;if(G("color=16m")||G("color=full")||G("color=truecolor"))return 3;if(G("color=256"))return 2;if(r&&!e&&te===void 0)return 0;let n=te||0;if(F.TERM==="dumb")return n;if(process.platform==="win32"){let t=rr.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in F)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(t=>t in F)||F.CI_NAME==="codeship"?1:n;if("TEAMCITY_VERSION"in F)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(F.TEAMCITY_VERSION)?1:0;if(F.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in F){let t=parseInt((F.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(F.TERM_PROGRAM){case"iTerm.app":return t>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(F.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(F.TERM)||"COLORTERM"in F?1:n}function or(r){let e=nt(r,r&&r.isTTY);return tt(e)}Jt.exports={supportsColor:or,stdout:tt(nt(!0,Kt.isatty(1))),stderr:tt(nt(!0,Kt.isatty(2)))}});var Xt=V((Yr,Zt)=>{"use strict";var ir=(r,e,n)=>{let t=r.indexOf(e);if(t===-1)return r;let o=e.length,i=0,s="";do s+=r.substr(i,t-i)+e+n,i=t+o,t=r.indexOf(e,i);while(t!==-1);return s+=r.substr(i),s},sr=(r,e,n,t)=>{let o=0,i="";do{let s=r[t-1]==="\r";i+=r.substr(o,(s?t-1:t)-o)+e+(s?`\r
2
+ `:`
3
+ `)+n,o=t+1,t=r.indexOf(`
4
+ `,o)}while(t!==-1);return i+=r.substr(o),i};Zt.exports={stringReplaceAll:ir,stringEncaseCRLFWithFirstIndex:sr}});var rn=V((Zr,nn)=>{"use strict";var ar=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,Qt=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,lr=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,cr=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,ur=new Map([["n",`
5
+ `],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function tn(r){let e=r[0]==="u",n=r[1]==="{";return e&&!n&&r.length===5||r[0]==="x"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&n?String.fromCodePoint(parseInt(r.slice(2,-1),16)):ur.get(r)||r}function dr(r,e){let n=[],t=e.trim().split(/\s*,\s*/g),o;for(let i of t){let s=Number(i);if(!Number.isNaN(s))n.push(s);else if(o=i.match(lr))n.push(o[2].replace(cr,(c,d,v)=>d?tn(d):v));else throw new Error(`Invalid Chalk template style argument: ${i} (in style '${r}')`)}return n}function fr(r){Qt.lastIndex=0;let e=[],n;for(;(n=Qt.exec(r))!==null;){let t=n[1];if(n[2]){let o=dr(t,n[2]);e.push([t].concat(o))}else e.push([t])}return e}function en(r,e){let n={};for(let o of e)for(let i of o.styles)n[i[0]]=o.inverse?null:i.slice(1);let t=r;for(let[o,i]of Object.entries(n))if(Array.isArray(i)){if(!(o in t))throw new Error(`Unknown Chalk style: ${o}`);t=i.length>0?t[o](...i):t[o]}return t}nn.exports=(r,e)=>{let n=[],t=[],o=[];if(e.replace(ar,(i,s,c,d,v,w)=>{if(s)o.push(tn(s));else if(d){let E=o.join("");o=[],t.push(n.length===0?E:en(r,n)(E)),n.push({inverse:c,styles:fr(d)})}else if(v){if(n.length===0)throw new Error("Found extraneous } in Chalk template literal");t.push(en(r,n)(o.join(""))),o=[],n.pop()}else o.push(w)}),t.push(o.join("")),n.length>0){let i=`Chalk template literal is missing ${n.length} closing bracket${n.length===1?"":"s"} (\`}\`)`;throw new Error(i)}return t.join("")}});var Ge=V((Xr,un)=>{"use strict";var Re=Vt(),{stdout:ot,stderr:it}=Yt(),{stringReplaceAll:pr,stringEncaseCRLFWithFirstIndex:mr}=Xt(),{isArray:Fe}=Array,sn=["ansi","ansi","ansi256","ansi16m"],ge=Object.create(null),hr=(r,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let n=ot?ot.level:0;r.level=e.level===void 0?n:e.level},st=class{constructor(e){return an(e)}},an=r=>{let e={};return hr(e,r),e.template=(...n)=>cn(e.template,...n),Object.setPrototypeOf(e,Ne.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=st,e.template};function Ne(r){return an(r)}for(let[r,e]of Object.entries(Re))ge[r]={get(){let n=We(this,at(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:n}),n}};ge.visible={get(){let r=We(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:r}),r}};var ln=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let r of ln)ge[r]={get(){let{level:e}=this;return function(...n){let t=at(Re.color[sn[e]][r](...n),Re.color.close,this._styler);return We(this,t,this._isEmpty)}}};for(let r of ln){let e="bg"+r[0].toUpperCase()+r.slice(1);ge[e]={get(){let{level:n}=this;return function(...t){let o=at(Re.bgColor[sn[n]][r](...t),Re.bgColor.close,this._styler);return We(this,o,this._isEmpty)}}}}var gr=Object.defineProperties(()=>{},{...ge,level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}}),at=(r,e,n)=>{let t,o;return n===void 0?(t=r,o=e):(t=n.openAll+r,o=e+n.closeAll),{open:r,close:e,openAll:t,closeAll:o,parent:n}},We=(r,e,n)=>{let t=(...o)=>Fe(o[0])&&Fe(o[0].raw)?on(t,cn(t,...o)):on(t,o.length===1?""+o[0]:o.join(" "));return Object.setPrototypeOf(t,gr),t._generator=r,t._styler=e,t._isEmpty=n,t},on=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?"":e;let n=r._styler;if(n===void 0)return e;let{openAll:t,closeAll:o}=n;if(e.indexOf("\x1B")!==-1)for(;n!==void 0;)e=pr(e,n.close,n.open),n=n.parent;let i=e.indexOf(`
6
+ `);return i!==-1&&(e=mr(e,o,t,i)),t+e+o},rt,cn=(r,...e)=>{let[n]=e;if(!Fe(n)||!Fe(n.raw))return e.join(" ");let t=e.slice(1),o=[n.raw[0]];for(let i=1;i<n.length;i++)o.push(String(t[i-1]).replace(/[{}\\]/g,"\\$&"),String(n.raw[i]));return rt===void 0&&(rt=rn()),rt(r,o.join(""))};Object.defineProperties(Ne.prototype,ge);var ze=Ne();ze.supportsColor=ot;ze.stderr=Ne({level:it?it.level:0});ze.stderr.supportsColor=it;un.exports=ze});var Or={};Fn(Or,{PurenowRuntimeStacksDeployService:()=>fe,RuntimeBuildError:()=>De,RuntimeCliError:()=>q,RuntimeConfigError:()=>Oe,RuntimeDeploymentError:()=>Pe,RuntimeDeploymentStrategy:()=>Be,RuntimeFriendlyErrorFormatter:()=>ue,RuntimeStructuredLogger:()=>Ae,RuntimeTemplateError:()=>K,RuntimeTemplateService:()=>de,RuntimeTemplateStructureError:()=>ee,RuntimeValidationError:()=>_e,RuntimeWebCli:()=>Ee,RuntimeWebDeploymentService:()=>oe,buildStaticHtml:()=>Pt,createRuntimeCli:()=>pn});module.exports=Nn(Or);var Io=$(ve());var Eo=$(ve()),z=$(require("process")),qe=require("@worktif/purenow/bin");var O=$(require("fs")),_=$(require("path")),Ot=require("@worktif/purenow/bin");var q=class extends Error{constructor(n,t,o){super(n);this.code=t;this.hint=o;this.name="RuntimeCliError",Error.captureStackTrace(this,this.constructor)}},Oe=class extends q{constructor(e,n){super(e,"RUNTIME_CONFIG_ERROR",n),this.name="RuntimeConfigError"}},De=class extends q{constructor(e,n){super(e,"RUNTIME_BUILD_ERROR",n),this.name="RuntimeBuildError"}},Pe=class extends q{constructor(e,n){super(e,"RUNTIME_DEPLOYMENT_ERROR",n),this.name="RuntimeDeploymentError"}};var _e=class extends q{constructor(e,n){super(e,"RUNTIME_VALIDATION_ERROR",n),this.name="RuntimeValidationError"}},K=class extends q{constructor(n,t,o,i,s,c,d){super(n,"RUNTIME_TEMPLATE_ERROR",d);this.templateName=t;this.coreDir=o;this.searchedPaths=i;this.packageContext=s;this.resolutionStrategy=c;this.name="RuntimeTemplateError"}},ee=class extends q{constructor(n,t,o,i){super(n,"RUNTIME_TEMPLATE_STRUCTURE_ERROR",i);this.templateDir=t;this.validationErrors=o;this.name="RuntimeTemplateStructureError"}},ue=class{formatError(e,n=!1){let t=[];return t.push(`Error: ${e.name||"RuntimeError"}`),t.push(""),t.push(`Message: ${e.message}`),t.push(""),e instanceof q&&e.hint&&(t.push(`Hint: ${e.hint}`),t.push("")),n&&e.stack&&(t.push("--- Stack Trace (--verbose) ---"),t.push(e.stack),t.push("")),t.join(`
7
+ `)}formatValidationError(e,n,t=!1){let o=[];return o.push("Validation Error"),o.push(""),o.push(`Field: ${e}`),o.push(`Issue: ${n}`),o.push(""),t&&(o.push("--- Technical Details (--verbose) ---"),o.push(`Field validation failed for: ${e}`),o.push(`Validation message: ${n}`),o.push("")),o.join(`
8
+ `)}formatDeploymentError(e,n,t,o=!1){let i=[];return i.push("Deployment Error"),i.push(""),i.push(`Stack: ${e}`),i.push(`Operation: ${n}`),i.push(`Issue: ${t}`),i.push(""),i.push("Troubleshooting:"),i.push("1. Check AWS credentials and permissions"),i.push("2. Verify stack configuration"),i.push("3. Review CloudFormation events in AWS Console"),i.push(""),o&&(i.push("--- Technical Details (--verbose) ---"),i.push(`Stack name: ${e}`),i.push(`Failed operation: ${n}`),i.push(`Error details: ${t}`),i.push("")),i.join(`
9
+ `)}formatTemplateError(e,n=!1){let t=[];return t.push("Runtime Template Error"),t.push(""),t.push(`Issue: ${e.message}`),t.push(""),e.templateName&&t.push(`Template: ${e.templateName}`),e.coreDir&&t.push(`Core Directory: ${e.coreDir}`),e.packageContext&&t.push(`Package Context: ${e.packageContext}`),e.resolutionStrategy&&t.push(`Resolution Strategy: ${e.resolutionStrategy}`),t.push(""),e.searchedPaths&&e.searchedPaths.length>0&&(t.push("Searched Paths:"),e.searchedPaths.forEach(o=>{t.push(` - ${o}`)}),t.push("")),t.push("Troubleshooting:"),t.push("1. Ensure @worktif/runtime package is properly installed"),t.push("2. Verify the package contains src/bin/templates/runtime-web/ directory"),t.push("3. Check that runtime-web directory contains template subdirectories"),t.push("4. If running from source, ensure you're in the runtime package directory"),t.push("5. Try reinstalling the runtime package: npm install @worktif/runtime"),t.push(""),e.hint&&(t.push(`Hint: ${e.hint}`),t.push("")),n&&(t.push("--- Technical Details (--verbose) ---"),t.push(`Error code: ${e.code}`),e.stack&&(t.push("Stack trace:"),t.push(e.stack)),t.push("")),t.join(`
10
+ `)}formatTemplateStructureError(e,n=!1){let t=[];return t.push("Runtime Template Structure Error"),t.push(""),t.push(`Issue: ${e.message}`),t.push(""),e.templateDir&&(t.push(`Template Directory: ${e.templateDir}`),t.push("")),e.validationErrors&&e.validationErrors.length>0&&(t.push("Validation Errors:"),e.validationErrors.forEach(o=>{t.push(` - ${o}`)}),t.push("")),t.push("Troubleshooting:"),t.push("1. Verify the runtime package installation is complete"),t.push("2. Check that src/bin/templates/runtime-web/ exists in the package"),t.push("3. Ensure template directories contain the required files"),t.push("4. Try reinstalling: npm install @worktif/runtime"),t.push("5. If developing locally, ensure templates are built correctly"),t.push(""),e.hint&&(t.push(`Hint: ${e.hint}`),t.push("")),n&&(t.push("--- Technical Details (--verbose) ---"),t.push(`Error code: ${e.code}`),e.stack&&(t.push("Stack trace:"),t.push(e.stack)),t.push("")),t.join(`
11
+ `)}},Ae=class{constructor(e=!1){this.verbose=e}info(e,n){let t={level:"info",message:e,timestamp:new Date().toISOString(),...n};this.verbose?console.log(JSON.stringify(t,null,2)):console.log(e)}warn(e,n){let t={level:"warn",message:e,timestamp:new Date().toISOString(),...n};this.verbose?console.warn(JSON.stringify(t,null,2)):console.warn(`Warning: ${e}`)}error(e,n){let t={level:"error",message:e,timestamp:new Date().toISOString(),...n};this.verbose?console.error(JSON.stringify(t,null,2)):console.error(`Error: ${e}`)}debug(e,n){if(!this.verbose)return;let t={level:"debug",message:e,timestamp:new Date().toISOString(),...n};console.debug(JSON.stringify(t,null,2))}};var de=class extends Ot.TemplateService{constructor(e=process.cwd()){super(e),this.runtimeTemplatesDir=this.resolveRuntimeTemplateDirectory()}async scaffold(e,n,t,o="runtime-web"){let i=this.validateTemplateStructure(o);if(!i.valid)throw new ee("Runtime template directory validation failed",this.runtimeTemplatesDir,i.errors,"Ensure the runtime package is properly installed and contains the expected template structure");let s=_.join(this.runtimeTemplatesDir,o,e);if(!O.existsSync(s)){let v=this.getAvailableTemplates(o),w=this.getTemplateResolutionInfo();throw new K(`Runtime template '${e}' not found`,e,o,[s],w.packageContext||"unknown",w.resolutionStrategy,v.length>0?`Available templates: ${v.join(", ")}. Try: runtime init <project-name> --template ${v[0]}`:`No templates found in '${o}'. The runtime package may not be properly installed.`)}if(O.readdirSync(s).length===0){let v=this.getTemplateResolutionInfo();throw new K(`Runtime template '${e}' directory is empty`,e,o,[s],v.packageContext||"unknown",v.resolutionStrategy,"This indicates a corrupted or incomplete template installation. Try reinstalling the runtime package.")}let d=this.templatesDir;this.templatesDir=this.runtimeTemplatesDir;try{let v=this.copyTemplateFiles;this.copyTemplateFiles=async(w,E,T)=>{let j={...T,packageVersion:this.getRuntimePackageVersion(),PURENOW_VERSION:this.getRuntimePackageVersion(),STACK_NAME:T.projectName,PROJECT_NAME:T.projectName,REGION:"us-east-1",ENABLE_SEO:"false",STAGE:"dev"};return v.call(this,w,E,j)},await super.scaffold(e,n,t,o)}finally{this.templatesDir=d}}resolveRuntimeTemplateDirectory(){let e=[],n=[],t=this.detectRuntimePackageRoot();if(t){let w=_.join(t,"src","bin","templates");e.push(w),n.push({path:w,strategy:"package.json detection",valid:this.validateTemplateDirectory(w)})}let o=this.getModuleBasedPaths();for(let w of o)e.push(w),n.push({path:w,strategy:"module location",valid:this.validateTemplateDirectory(w)});let i=this.getNodeModulePaths();for(let w of i)e.push(w),n.push({path:w,strategy:"node_modules resolution",valid:this.validateTemplateDirectory(w)});let s=this.getEnvironmentBasedPaths();for(let w of s)e.push(w),n.push({path:w,strategy:"environment detection",valid:this.validateTemplateDirectory(w)});let c=n.find(w=>w.valid);if(c)return c.path;let d=n.map(w=>w.path),v=this.detectRuntimePackageRoot();throw new K("Runtime templates directory not found",void 0,"runtime-web",d,v||"unknown","comprehensive search","Ensure @worktif/runtime package is properly installed with template directory structure")}detectRuntimePackageRoot(){let e=__dirname;for(;e!==_.dirname(e);){let n=_.join(e,"package.json");if(O.existsSync(n))try{if(JSON.parse(O.readFileSync(n,"utf-8")).name==="@worktif/runtime")return e}catch{}e=_.dirname(e)}return null}getModuleBasedPaths(){return[_.join(__dirname,"templates"),_.join(__dirname,"..","templates"),_.join(__dirname,"..","..","bin","templates"),_.join(__dirname,"..","..","..","src","bin","templates")]}getNodeModulePaths(){let e=[];try{let n=require.resolve("@worktif/runtime/package.json"),t=_.dirname(n);e.push(_.join(t,"src","bin","templates")),e.push(_.join(t,"out","dist","bin","templates"))}catch{}return e}getEnvironmentBasedPaths(){let e=[];if(process.argv[1]){let n=_.dirname(process.argv[1]);e.push(_.join(n,"templates")),e.push(_.join(n,"..","templates"))}return e.push(_.join(process.cwd(),"src","bin","templates")),e.push(_.join(process.cwd(),"node_modules","@worktif","runtime","src","bin","templates")),e}validateTemplateDirectory(e){try{if(!O.existsSync(e)||!O.statSync(e).isDirectory())return!1;let t=_.join(e,"runtime-web");return!O.existsSync(t)||!O.statSync(t).isDirectory()?!1:O.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name).length>0}catch{return!1}}getAvailableTemplates(e){try{let n=_.join(this.runtimeTemplatesDir,e);return O.existsSync(n)?O.readdirSync(n,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name):[]}catch{return[]}}validateRuntimeTemplates(){try{return this.validateTemplateDirectory(this.runtimeTemplatesDir)}catch{return!1}}validateTemplateStructure(e="runtime-web"){let n=[];try{if(!O.existsSync(this.runtimeTemplatesDir))return n.push(`Templates directory does not exist: ${this.runtimeTemplatesDir}`),{valid:!1,errors:n};let t=_.join(this.runtimeTemplatesDir,e);if(!O.existsSync(t))return n.push(`Core directory does not exist: ${t}`),{valid:!1,errors:n};if(!O.statSync(t).isDirectory())return n.push(`Core path is not a directory: ${t}`),{valid:!1,errors:n};let i=O.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);if(i.length===0)return n.push(`No template directories found in: ${t}`),{valid:!1,errors:n};for(let s of i){let c=_.join(t,s);O.readdirSync(c).length===0&&n.push(`Template directory is empty: ${c}`)}return{valid:n.length===0,errors:n}}catch(t){return n.push(`Validation error: ${t instanceof Error?t.message:String(t)}`),{valid:!1,errors:n}}}getRuntimeTemplatesDirectory(){return this.runtimeTemplatesDir}getRuntimePackageVersion(){try{let e=this.detectRuntimePackageRoot();if(e){let n=_.join(e,"package.json");if(O.existsSync(n))return JSON.parse(O.readFileSync(n,"utf-8")).version||"0.3.0"}try{let n=require.resolve("@worktif/runtime/package.json");return JSON.parse(O.readFileSync(n,"utf-8")).version||"0.3.0"}catch{return"0.3.0"}}catch{return"0.3.0"}}getTemplateResolutionInfo(){let e=this.detectRuntimePackageRoot(),n="unknown";e&&this.runtimeTemplatesDir.includes(e)?n="package.json detection":this.runtimeTemplatesDir.includes("node_modules")?n="node_modules resolution":this.runtimeTemplatesDir.includes(__dirname)?n="module location":n="environment detection";let t=[];try{O.existsSync(this.runtimeTemplatesDir)&&t.push(...O.readdirSync(this.runtimeTemplatesDir,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name))}catch{}return{runtimeTemplatesDir:this.runtimeTemplatesDir,isValid:this.validateRuntimeTemplates(),availableCores:t,packageContext:e,resolutionStrategy:n}}};var Ie=$(require("fs"));function we(r){if(!r||typeof r!="string")throw new Error("Stack name must be a non-empty string");let e=r.replace(/[^a-zA-Z0-9-]/g,"-");return/^[a-zA-Z]/.test(e)||(e="stack-"+e),e=e.replace(/-+/g,"-"),e=e.replace(/-+$/,""),e.length>128&&(e=e.substring(0,128).replace(/-+$/,"")),e||(e="stack"),e}var Z=require("@worktif/purenow/bin"),fe=class extends Z.StacksDeployService{constructor(n=process.cwd()){super(n);this.cwd=n;this.DEFAULT_CDK_DIR="cdk"}async executeDeploy(n,t){let{stage:o,config:i}=n,s=we(`${n.config.projectName}-PurenowInfra-${o}`),c=we(`${n.config.projectName}-PurenowRuntime-${o}`),d=we(`${n.config.projectName}-RuntimeWeb-${o}`);if(!(0,Z.getStage)(i,o))throw new Z.DeploymentError(`Stage '${o}' not found in configuration`,`Available stages: ${i.stages.map(N=>N.name).join(", ")}`);console.log("Deploying Infrastructure stack...");let w=await this.deployCdkStack(s,o,i);if(!w.success)throw new Z.DeploymentError("Infrastructure deployment failed","Runtime stack will not be deployed. Fix Infra issues and retry.");console.log("Deploying PurenowRuntime stack...");let E=await this.deployCdkStack(c,o,i);if(!E.success)throw new Z.DeploymentError("Runtime deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");console.log("Deploying RuntimeWeb stack...");let T=await this.deployCdkStack(d,o,i);if(!T.success)throw new Z.DeploymentError("RuntimeWeb deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");let j=Date.now()-t;return{success:!0,infraStack:w,runtimeStack:E,runtimeWebStack:T,duration:j}}parseStackOutputs(n,t){let o=super.parseStackOutputs(n,t);if(!Ie.existsSync(t))return o;try{let i=Ie.readFileSync(t,"utf-8"),c=JSON.parse(i)[n];c&&(o.lambdaArnList=Object.keys(c).filter(d=>d.match(/(?:Lambda)[a-zA-Z]+Arn$/)).map(d=>c[d]))}catch(i){console.warn(`Failed to parse outputs file for ${n}: ${i instanceof Error?i.message:String(i)}`)}return o}getRegionSignature(n){return n?n.split("-").filter(Boolean).map(t=>t[0]??"").join(""):""}resourceName({name:n,serviceName:t,stage:o,region:i}){let s=we(this.getRegionSignature(i||"us-east-1"));return`${t}-${n}-${s}-${o}`}};var Be=class{constructor(){this.role="deployment";this.name="runtime-purenow-runtime-stacks"}async validateDeployment(e){try{return e.envValidator.isValid(),e.logger.info("Runtime deployment validation passed"),!0}catch(n){return e.logger.error(`Runtime deployment validation failed: ${n instanceof Error?n.message:String(n)}`),!1}}async executeDeployment(e,n){let t=n,{logger:o,options:i}=t;try{if(!(await e.stacksDeployService.deploy({stage:i.stage,config:e.config,skipBuild:i.skipBuild||!1})).success)throw new Error("Runtime Target stacks deployment failed");o.info("Runtime Target stack deployed successfully"),o.success("Infrastructure stack deployed successfully")}catch(s){throw o.error(`Runtime Target deployment failed: ${s instanceof Error?s.message:String(s)}`),s}}async postDeployment(e){}};var ke=$(require("path")),J=$(require("fs")),$e=5*1024*1024,Ze=10*1024*1024,Dt=1*1024*1024;function Wn(){let r=process.cwd(),e=ke.default.join(r,"public/index.html"),n=!0;if(!J.default.existsSync(e)){if(n)return console.warn(`
7
12
  `+"=".repeat(80)),console.warn("DEPRECATION WARNING: Missing public/index.html"),console.warn("=".repeat(80)),console.warn(`
8
13
  File not found: ${e}`),console.warn(`
9
14
  The Purenow framework is using a fallback HTML template.`),console.warn("This fallback will be removed in a future version."),console.warn(`
10
15
  Action required: Create public/index.html in your project root.`),console.warn(`
11
16
  Minimal template structure:`),console.warn(""),console.warn("<!DOCTYPE html>"),console.warn('<html lang="en">'),console.warn(" <head>"),console.warn(' <meta charset="utf-8" />'),console.warn(' <meta name="viewport" content="width=device-width, initial-scale=1" />'),console.warn(" </head>"),console.warn(" <body>"),console.warn(' <div id="root-purenow"></div>'),console.warn(" </body>"),console.warn("</html>"),console.warn(`
12
17
  `+"=".repeat(80)+`
13
- `),cn();throw new Error(`
18
+ `),Un();throw new Error(`
14
19
  ${"=".repeat(80)}
15
20
  BUILD ERROR: Missing public/index.html
16
21
  ${"=".repeat(80)}
@@ -33,7 +38,7 @@ Action required: Create public/index.html with the following minimal structure:
33
38
  </html>
34
39
 
35
40
  ${"=".repeat(80)}
36
- `)}let n=K.default.readFileSync(e,"utf-8");if(!n||n.trim().length===0)throw new Error(`
41
+ `)}let t=J.default.readFileSync(e,"utf-8");if(!t||t.trim().length===0)throw new Error(`
37
42
  ${"=".repeat(80)}
38
43
  BUILD ERROR: Empty public/index.html
39
44
  ${"=".repeat(80)}
@@ -45,13 +50,13 @@ The file exists but is empty. It must contain a valid HTML document structure.
45
50
  Action required: Add HTML content to public/index.html.
46
51
 
47
52
  ${"=".repeat(80)}
48
- `);return an(n,e),ln(n,e),n}function an(r,e){let t=Buffer.byteLength(r,"utf-8"),n=(t/(1024*1024)).toFixed(2);if(t>_e){let o=(_e/1048576).toFixed(2);throw new Error(`
53
+ `);return zn(t,e),Gn(t,e),t}function zn(r,e){let n=Buffer.byteLength(r,"utf-8"),t=(n/(1024*1024)).toFixed(2);if(n>$e){let o=($e/1048576).toFixed(2);throw new Error(`
49
54
  ${"=".repeat(80)}
50
55
  BUILD ERROR: HTML template too large
51
56
  ${"=".repeat(80)}
52
57
 
53
58
  File: ${e}
54
- Size: ${n} MB
59
+ Size: ${t} MB
55
60
  Maximum allowed: ${o} MB
56
61
 
57
62
  The HTML template is too large and will cause the Lambda bundle to exceed
@@ -64,19 +69,19 @@ Action required: Reduce the size of public/index.html by:
64
69
  - Minimizing HTML comments and whitespace
65
70
 
66
71
  ${"=".repeat(80)}
67
- `)}if(t>ht){let o=(ht/1048576).toFixed(2);console.warn(`
72
+ `)}if(n>Dt){let o=(Dt/1048576).toFixed(2);console.warn(`
68
73
  `+"=".repeat(80)),console.warn("WARNING: Large HTML template detected"),console.warn("=".repeat(80)),console.warn(`
69
- File: ${e}`),console.warn(`Size: ${n} MB (threshold: ${o} MB)`),console.warn(`
74
+ File: ${e}`),console.warn(`Size: ${t} MB (threshold: ${o} MB)`),console.warn(`
70
75
  A large HTML template increases Lambda bundle size and cold start time.`),console.warn(`
71
76
  Consider:`),console.warn(" - Moving inline styles to external CSS files"),console.warn(" - Moving inline scripts to external JS files"),console.warn(" - Reducing embedded data and comments"),console.warn(`
72
77
  `+"=".repeat(80)+`
73
- `)}}function ln(r,e){let t=[];/<html[^>]*>/i.test(r)||t.push("<html>"),/<head[^>]*>/i.test(r)||t.push("<head>"),/<body[^>]*>/i.test(r)||t.push("<body>"),t.length>0&&(console.warn(`
78
+ `)}}function Gn(r,e){let n=[];/<html[^>]*>/i.test(r)||n.push("<html>"),/<head[^>]*>/i.test(r)||n.push("<head>"),/<body[^>]*>/i.test(r)||n.push("<body>"),n.length>0&&(console.warn(`
74
79
  `+"=".repeat(80)),console.warn("WARNING: Invalid HTML structure detected"),console.warn("=".repeat(80)),console.warn(`
75
- File: ${e}`),console.warn(`Missing required tags: ${t.join(", ")}`),console.warn(`
80
+ File: ${e}`),console.warn(`Missing required tags: ${n.join(", ")}`),console.warn(`
76
81
  The HTML template may not render correctly at runtime.`),console.warn(`
77
82
  Action recommended: Add the missing tags to public/index.html.`),console.warn(`
78
83
  `+"=".repeat(80)+`
79
- `))}function cn(){return`<!DOCTYPE html>
84
+ `))}function Un(){return`<!DOCTYPE html>
80
85
  <html lang="en">
81
86
  <head>
82
87
  <meta charset="utf-8" />
@@ -88,14 +93,14 @@ Action recommended: Add the missing tags to public/index.html.`),console.warn(`
88
93
  <div id="root-internal">Loading...</div>
89
94
  <div id="root-purenow"></div>
90
95
  </body>
91
- </html>`}function un(r){if(!K.default.existsSync(r)){console.warn(`Warning: Could not validate bundle size - embedded file not found: ${r}`);return}let e=K.default.statSync(r).size,t=(e/(1024*1024)).toFixed(2);if(e>_e)throw new Error(`
96
+ </html>`}function Vn(r){if(!J.default.existsSync(r)){console.warn(`Warning: Could not validate bundle size - embedded file not found: ${r}`);return}let e=J.default.statSync(r).size,n=(e/(1024*1024)).toFixed(2);if(e>$e)throw new Error(`
92
97
  ${"=".repeat(80)}
93
98
  BUILD ERROR: Embedded template file too large
94
99
  ${"=".repeat(80)}
95
100
 
96
101
  File: ${r}
97
- Size: ${t} MB
98
- Maximum allowed: ${(_e/(1024*1024)).toFixed(2)} MB
102
+ Size: ${n} MB
103
+ Maximum allowed: ${($e/(1024*1024)).toFixed(2)} MB
99
104
 
100
105
  The embedded template file will cause the Lambda bundle to exceed the
101
106
  AWS 10MB deployment limit.
@@ -103,18 +108,18 @@ AWS 10MB deployment limit.
103
108
  Action required: Reduce the size of public/index.html.
104
109
 
105
110
  ${"=".repeat(80)}
106
- `);let n=ge.default.join(__dirname,"../../out/dist/lambda/bundle.js");if(K.default.existsSync(n)){let o=K.default.statSync(n).size,s=(o/(1024*1024)).toFixed(2);console.log(` Lambda bundle size: ${s} MB (existing bundle)`),o>ze?(console.warn(`
111
+ `);let t=ke.default.join(__dirname,"../../out/dist/lambda/bundle.js");if(J.default.existsSync(t)){let o=J.default.statSync(t).size,i=(o/(1024*1024)).toFixed(2);console.log(` Lambda bundle size: ${i} MB (existing bundle)`),o>Ze?(console.warn(`
107
112
  `+"=".repeat(80)),console.warn("WARNING: Existing Lambda bundle exceeds AWS limit"),console.warn("=".repeat(80)),console.warn(`
108
- Bundle: ${n}`),console.warn(`Size: ${s} MB`),console.warn(`AWS Lambda limit: ${(ze/(1024*1024)).toFixed(2)} MB`),console.warn(`
113
+ Bundle: ${t}`),console.warn(`Size: ${i} MB`),console.warn(`AWS Lambda limit: ${(Ze/(1024*1024)).toFixed(2)} MB`),console.warn(`
109
114
  Note: This is the existing bundle before template embedding.`),console.warn("The bundle will be rebuilt with the new template."),console.warn(`
110
115
  If the bundle size issue persists after rebuild:`),console.warn(" 1. Externalize large dependencies in esbuild config"),console.warn(" 2. Use Lambda layers for large dependencies"),console.warn(" 3. Reduce the size of public/index.html if needed"),console.warn(`
111
116
  `+"=".repeat(80)+`
112
117
  `)):o>8388608&&(console.warn(`
113
118
  `+"=".repeat(80)),console.warn("WARNING: Lambda bundle approaching size limit"),console.warn("=".repeat(80)),console.warn(`
114
- Bundle size: ${s} MB`),console.warn(`AWS limit: ${(ze/(1024*1024)).toFixed(2)} MB`),console.warn(`
119
+ Bundle size: ${i} MB`),console.warn(`AWS limit: ${(Ze/(1024*1024)).toFixed(2)} MB`),console.warn(`
115
120
  Consider optimizing the bundle to avoid deployment failures.`),console.warn(`
116
121
  `+"=".repeat(80)+`
117
- `))}}function dn(){let r=sn(),e=`/*
122
+ `))}}function qn(){let r=Wn(),e=`/*
118
123
  * Elastic License 2.0
119
124
  * Copyright (C) 2025\u2013present Raman Marozau, Work Target Insight Function. All rights reserved.
120
125
  * Contact: raman@worktif.com
@@ -140,15 +145,11 @@ Consider optimizing the bundle to avoid deployment failures.`),console.warn(`
140
145
  */
141
146
 
142
147
  export const HTML_TEMPLATE = ${JSON.stringify(r)};
143
- `,t=ge.default.join(__dirname,"../../src/core/services/template/html-template.embedded.ts"),n=ge.default.dirname(t);K.default.existsSync(n)||K.default.mkdirSync(n,{recursive:!0}),K.default.writeFileSync(t,e,"utf-8");let o=(r.length/1024).toFixed(2);un(t)}function gt(r=!1){try{dn(),r&&process.exit(0)}catch(e){console.error(`
148
+ `,n=ke.default.join(__dirname,"../../src/core/services/template/html-template.embedded.ts"),t=ke.default.dirname(n);J.default.existsSync(t)||J.default.mkdirSync(t,{recursive:!0}),J.default.writeFileSync(n,e,"utf-8");let o=(r.length/1024).toFixed(2);Vn(n)}function Pt(r=!1){try{qn(),r&&process.exit(0)}catch(e){console.error(`
144
149
  `+"=".repeat(80)),console.error("BUILD FAILED: HTML Template Generation Error"),console.error("=".repeat(80)),console.error(`
145
150
  `+e.message),e.stack&&process.env.DEBUG&&(console.error(`
146
- Stack trace:`),console.error(e.stack)),r&&process.exit(1)}}var Pr=B(me());var lr=B(me());var yt=(r=0)=>e=>`\x1B[${e+r}m`,vt=(r=0)=>e=>`\x1B[${38+r};5;${e}m`,wt=(r=0)=>(e,t,n)=>`\x1B[${38+r};2;${e};${t};${n}m`,O={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Xn=Object.keys(O.modifier),fn=Object.keys(O.color),pn=Object.keys(O.bgColor),Qn=[...fn,...pn];function mn(){let r=new Map;for(let[e,t]of Object.entries(O)){for(let[n,o]of Object.entries(t))O[n]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},t[n]=O[n],r.set(o[0],o[1]);Object.defineProperty(O,e,{value:t,enumerable:!1})}return Object.defineProperty(O,"codes",{value:r,enumerable:!1}),O.color.close="\x1B[39m",O.bgColor.close="\x1B[49m",O.color.ansi=yt(),O.color.ansi256=vt(),O.color.ansi16m=wt(),O.bgColor.ansi=yt(10),O.bgColor.ansi256=vt(10),O.bgColor.ansi16m=wt(10),Object.defineProperties(O,{rgbToAnsi256:{value(e,t,n){return e===t&&t===n?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(e){let t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!t)return[0,0,0];let[n]=t;n.length===3&&(n=[...n].map(s=>s+s).join(""));let o=Number.parseInt(n,16);return[o>>16&255,o>>8&255,o&255]},enumerable:!1},hexToAnsi256:{value:e=>O.rgbToAnsi256(...O.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let t,n,o;if(e>=232)t=((e-232)*10+8)/255,n=t,o=t;else{e-=16;let m=e%36;t=Math.floor(e/36)/5,n=Math.floor(m/6)/5,o=m%6/5}let s=Math.max(t,n,o)*2;if(s===0)return 30;let u=30+(Math.round(o)<<2|Math.round(n)<<1|Math.round(t));return s===2&&(u+=60),u},enumerable:!1},rgbToAnsi:{value:(e,t,n)=>O.ansi256ToAnsi(O.rgbToAnsi256(e,t,n)),enumerable:!1},hexToAnsi:{value:e=>O.ansi256ToAnsi(O.hexToAnsi256(e)),enumerable:!1}}),O}var hn=mn(),V=hn;var Ae=B(require("node:process"),1),St=B(require("node:os"),1),Ge=B(require("node:tty"),1);function z(r,e=globalThis.Deno?globalThis.Deno.args:Ae.default.argv){let t=r.startsWith("-")?"":r.length===1?"-":"--",n=e.indexOf(t+r),o=e.indexOf("--");return n!==-1&&(o===-1||n<o)}var{env:M}=Ae.default,Pe;z("no-color")||z("no-colors")||z("color=false")||z("color=never")?Pe=0:(z("color")||z("colors")||z("color=true")||z("color=always"))&&(Pe=1);function gn(){if("FORCE_COLOR"in M)return M.FORCE_COLOR==="true"?1:M.FORCE_COLOR==="false"?0:M.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(M.FORCE_COLOR,10),3)}function yn(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function vn(r,{streamIsTTY:e,sniffFlags:t=!0}={}){let n=gn();n!==void 0&&(Pe=n);let o=t?Pe:n;if(o===0)return 0;if(t){if(z("color=16m")||z("color=full")||z("color=truecolor"))return 3;if(z("color=256"))return 2}if("TF_BUILD"in M&&"AGENT_NAME"in M)return 1;if(r&&!e&&o===void 0)return 0;let s=o||0;if(M.TERM==="dumb")return s;if(Ae.default.platform==="win32"){let u=St.default.release().split(".");return Number(u[0])>=10&&Number(u[2])>=10586?Number(u[2])>=14931?3:2:1}if("CI"in M)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(u=>u in M)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(u=>u in M)||M.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in M)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(M.TEAMCITY_VERSION)?1:0;if(M.COLORTERM==="truecolor"||M.TERM==="xterm-kitty"||M.TERM==="xterm-ghostty"||M.TERM==="wezterm")return 3;if("TERM_PROGRAM"in M){let u=Number.parseInt((M.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(M.TERM_PROGRAM){case"iTerm.app":return u>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(M.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(M.TERM)||"COLORTERM"in M?1:s}function bt(r,e={}){let t=vn(r,{streamIsTTY:r&&r.isTTY,...e});return yn(t)}var wn={stdout:bt({isTTY:Ge.default.isatty(1)}),stderr:bt({isTTY:Ge.default.isatty(2)})},kt=wn;function Rt(r,e,t){let n=r.indexOf(e);if(n===-1)return r;let o=e.length,s=0,u="";do u+=r.slice(s,n)+e+t,s=n+o,n=r.indexOf(e,s);while(n!==-1);return u+=r.slice(s),u}function Tt(r,e,t,n){let o=0,s="";do{let u=r[n-1]==="\r";s+=r.slice(o,u?n-1:n)+e+(u?`\r
147
- `:`
148
- `)+t,o=n+1,n=r.indexOf(`
149
- `,o)}while(n!==-1);return s+=r.slice(o),s}var{stdout:Ct,stderr:Et}=kt,Ue=Symbol("GENERATOR"),ue=Symbol("STYLER"),ye=Symbol("IS_EMPTY"),xt=["ansi","ansi","ansi256","ansi16m"],de=Object.create(null),bn=(r,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let t=Ct?Ct.level:0;r.level=e.level===void 0?t:e.level};var Sn=r=>{let e=(...t)=>t.join(" ");return bn(e,r),Object.setPrototypeOf(e,ve.prototype),e};function ve(r){return Sn(r)}Object.setPrototypeOf(ve.prototype,Function.prototype);for(let[r,e]of Object.entries(V))de[r]={get(){let t=Ie(this,He(e.open,e.close,this[ue]),this[ye]);return Object.defineProperty(this,r,{value:t}),t}};de.visible={get(){let r=Ie(this,this[ue],!0);return Object.defineProperty(this,"visible",{value:r}),r}};var Ve=(r,e,t,...n)=>r==="rgb"?e==="ansi16m"?V[t].ansi16m(...n):e==="ansi256"?V[t].ansi256(V.rgbToAnsi256(...n)):V[t].ansi(V.rgbToAnsi(...n)):r==="hex"?Ve("rgb",e,t,...V.hexToRgb(...n)):V[t][r](...n),kn=["rgb","hex","ansi256"];for(let r of kn){de[r]={get(){let{level:t}=this;return function(...n){let o=He(Ve(r,xt[t],"color",...n),V.color.close,this[ue]);return Ie(this,o,this[ye])}}};let e="bg"+r[0].toUpperCase()+r.slice(1);de[e]={get(){let{level:t}=this;return function(...n){let o=He(Ve(r,xt[t],"bgColor",...n),V.bgColor.close,this[ue]);return Ie(this,o,this[ye])}}}}var Rn=Object.defineProperties(()=>{},{...de,level:{enumerable:!0,get(){return this[Ue].level},set(r){this[Ue].level=r}}}),He=(r,e,t)=>{let n,o;return t===void 0?(n=r,o=e):(n=t.openAll+r,o=e+t.closeAll),{open:r,close:e,openAll:n,closeAll:o,parent:t}},Ie=(r,e,t)=>{let n=(...o)=>Tn(n,o.length===1?""+o[0]:o.join(" "));return Object.setPrototypeOf(n,Rn),n[Ue]=r,n[ue]=e,n[ye]=t,n},Tn=(r,e)=>{if(r.level<=0||!e)return r[ye]?"":e;let t=r[ue];if(t===void 0)return e;let{openAll:n,closeAll:o}=t;if(e.includes("\x1B"))for(;t!==void 0;)e=Rt(e,t.close,t.open),t=t.parent;let s=e.indexOf(`
150
- `);return s!==-1&&(e=Tt(e,o,n,s)),n+e+o};Object.defineProperties(ve.prototype,de);var Cn=ve(),sr=ve({level:Et?Et.level:0});var c=Cn;var Be=B(require("process")),E=require("@worktif/purenow/bin"),te=class extends E.DeploymentService{async deployCommand(e,t,n,o,s=Be.default.cwd(),u){try{if(u)try{if(u.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(x){if(x instanceof Error){let ee=new E.FriendlyErrorFormatter().formatMissingCredentialsError(["AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY"],!1);console.error(ee),Be.default.exit(1)}throw x}let m=t.stage||Be.default.env.STAGE||n.stages[0]?.name||"dev",b=(0,E.getStage)(n,m);if(!b)throw new E.DeploymentError(`Stage '${m}' not found in configuration`,`Available stages: ${n.stages.map(x=>x.name).join(", ")}
151
- Update your purenow.config.ts to add this stage.`);(0,E.buildStaticHtml)(),o.info(c.bold(`Deploying to AWS (stage: ${c.cyan(m)})...`)),console.log();let R=new E.DeployService(s),w=new E.BuildService(s),$=new E.CdkBootstrapService(o),_=await(0,E.detectAndValidateCredentials)(o),j=b.awsRegion??_.region??"us-east-1";await this.validateCredentials(R,b,o),await this.ensureBootstrapped($,n,b,_,o,s),await this.performPreDeploymentValidation(m,n,t,o,s);let N=await this.executeStacksDeployment(e,m,n,o,t.skipBuild,t.verbose);return await this.clearS3CacheDeployment(N.infraStack,n,j,o),await this.uploadReactBundle(N.infraStack,n,j,o,s),await this.uploadPublicAssets(N.infraStack,n,j,o,s),await this.invalidateCloudFrontCache(N.runtimeWebStack,n,j,o),await this.injectApiGatewayUrl(N.runtimeWebStack,n,o,s),this.displayStacksDeploymentSummary(N,o),{success:!0,exitCode:0}}catch(m){return m instanceof E.DeploymentError||m instanceof E.BuildError?(o.error(m.message),m.hint&&(console.log(),o.info(c.dim(m.hint)))):m instanceof E.BootstrapCredentialsError||m instanceof E.BootstrapRegionError||o.error(m instanceof Error?m.message:String(m)),{success:!1,error:m instanceof Error?m:new Error(String(m)),exitCode:1}}}displayStacksDeploymentSummary(e,t){super.displayStacksDeploymentSummary(e,t,{modified:!0}),console.log(),console.log(c.bold("Runtime Web Stack:")),console.log(c.dim(" "),c.cyan("Stack Name:"),c.white(e.runtimeWebStack.stackName)),console.log(c.dim(" "),c.cyan("Duration:"),c.white(this.formatDuration(e.runtimeWebStack.duration))),e.runtimeWebStack.outputs.apiGatewayUrl&&console.log(c.dim(" "),c.cyan("API Gateway:"),c.white(e.runtimeWebStack.outputs.apiGatewayUrl)),e.runtimeWebStack.outputs.lambdaArnList&&e.runtimeWebStack.outputs.lambdaArnList.length>0&&(console.log(c.dim(" "),c.cyan("Lambdas:"),c.white(e.runtimeWebStack.outputs.lambdaArnList.length)),e.runtimeWebStack.outputs.lambdaArnList.forEach((n,o)=>{console.log(c.dim(" "),c.cyan(" Lambda ARN:"),c.white(n))})),console.log(),console.log(c.bold("Deployment Info:")),console.log(c.dim(" "),c.cyan("Region:"),c.white(e.infraStack.region)),console.log(c.dim(" "),c.cyan("Stage:"),c.white(e.infraStack.stage)),console.log()}};var we=B(require("fs")),ne=B(require("path"));var J=require("@worktif/purenow/bin");function En(r){return r==="lambda"||r==="cdk"||r==="all"}async function Ye(r,e,t,n=process.cwd(),o){try{let s=r.target||"all";if(En(s)&&o)try{if(o.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(R){R instanceof J.FriendlyEnvironmentError&&(t.warn("AWS credentials not configured"),console.log(),t.info(c.dim("Building without AWS credentials. You will need to configure them before deployment.")),console.log())}(0,J.buildStaticHtml)();let u=new J.BuildService(n);t.info(c.bold("Building Runtime application...")),console.log();let m,b=!1;return s==="all"?(b=we.existsSync(ne.join(n,"src/core/index.ts")),m=await xn(u,e,t)):m=await Dn(u,s,e,t),b&&await On(u,e,t),Mn(m,n,t),{success:!0,exitCode:0}}catch(s){return s instanceof J.BuildError?(t.error(s.message),s.hint&&(console.log(),t.info(c.dim(s.hint)))):t.error(s instanceof Error?s.message:String(s)),{success:!1,error:s instanceof Error?s:new Error(String(s)),exitCode:1}}}async function xn(r,e,t){let o=we.existsSync(ne.join(process.cwd(),"src/core/index.ts"))?["react","lambda","cdk"]:["react"],s=[];for(let u of o){let m=t.spinner(`Building ${u} bundle...`);m.start();let b=await r.buildTarget(u,e);if(s.push(b),b.success)m.succeed(`${$e(u)} bundle (${Ke(b.duration)})`);else throw m.fail(`${$e(u)} bundle failed`),new J.BuildError(`Build failed for target '${u}'`,b.error?.message)}return s}async function Dn(r,e,t,n){let o=n.spinner(`Building ${e} bundle...`);o.start();let s=await r.buildTarget(e,t);if(s.success)o.succeed(`${$e(e)} bundle (${Ke(s.duration)})`);else throw o.fail(`${$e(e)} bundle failed`),new J.BuildError(`Build failed for target '${e}'`,s.error?.message);return[s]}async function On(r,e,t){let n=t.spinner("Generating type declarations...");n.start();try{await r.generateTypes(e),n.succeed("Type declarations")}catch(o){throw n.fail("Type declarations failed"),o}}function Mn(r,e,t){console.log();let n=r.reduce((o,s)=>o+s.duration,0);t.success(c.bold(`Build complete in ${Ke(n)}`)),console.log(),console.log(c.bold("Artifacts:"));for(let o of r)if(o.success){let s=ne.resolve(e,o.outputPath),u=_n(s),m=ne.relative(e,s);console.log(c.dim(" "),c.white(m),c.dim(`(${u})`))}console.log()}function _n(r){try{let e=we.statSync(r);return Pn(e.size)}catch{return"unknown"}}function Pn(r){if(r===0)return"0 B";let e=1024,t=["B","KB","MB","GB"],n=Math.floor(Math.log(r)/Math.log(e));return`${(r/Math.pow(e,n)).toFixed(1)} ${t[n]}`}function Ke(r){return r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`}function $e(r){return r.charAt(0).toUpperCase()+r.slice(1)}var F=B(require("path")),Dt=B(require("fs"));var Q=require("@worktif/purenow/bin");async function Ot(r,e,t=process.cwd(),n){let o=e.spinner(r.cdk?"Initializing CDK infrastructure...":"Initializing Runtime project...");try{let s=new le(t),u=new Q.PromptService;if(r.cdk&&!r.force&&s.cdkDirectoryExists(t))throw new Q.ValidationError("CDK directory already exists","Use --force flag to overwrite existing CDK infrastructure");let m=r.dir||(r.cdk?"cdk":t),b=r.cdk?"cdk":r.template||"basic",R="runtime-web",w=r.force||!1,$=F.basename(F.resolve(t,r.cdk?t:m));if(!r.cdk&&!w){let _=F.resolve(t,m),j=await jn(_);if(j.length>0){if(console.log(),e.warn("Existing project files detected:"),j.forEach(x=>{console.log(c.dim(` - ${x}`))}),console.log(),!await u.confirm("Do you want to overwrite these files?",!1))return console.log(),e.info("Project initialization cancelled. Existing files preserved."),console.log(),{success:!0,exitCode:0};w=!0}}if(o.start(),await s.scaffold(b,m,{projectName:$,force:w},R),o.succeed(r.cdk?"CDK infrastructure initialized successfully!":"Runtime project initialized successfully!"),r.cdk){if(In(e,$,m,t),n){let _=F.resolve(t,m);await $n(e,n,_)}}else An(e,$,m,t),await new Q.PromptService().confirm("Do you want to initialize AWS CDK infrastructure for this project now?",!0)?(await Bn(e,$,F.resolve(t,m),R,s,n)).success||(e.warn("CDK initialization failed, but your Runtime project was created successfully."),e.info("You can initialize CDK later by running: npm install && runtime init --cdk")):(console.log(),e.info("You can initialize CDK later by running: npm install && runtime init --cdk"),console.log());return{success:!0,exitCode:0}}catch(s){return o.fail(r.cdk?"Failed to initialize CDK infrastructure":"Failed to initialize Runtime project"),s instanceof Q.ValidationError?(e.error(s.message),s.hint&&e.info(c.dim(s.hint))):e.error(s instanceof Error?s.message:String(s)),{success:!1,error:s instanceof Error?s:new Error(String(s)),exitCode:1}}}function An(r,e,t,n){let o=F.resolve(n,t),s=o===n;console.log(),r.success(c.bold(`Runtime project '${e}' created successfully!`)),console.log(),console.log(c.bold("Project structure:")),console.log(c.dim(" \u251C\u2500\u2500 src/")),console.log(c.dim(" \u2502 \u251C\u2500\u2500 index.tsx # React app entry")),console.log(c.dim(" \u2502 \u251C\u2500\u2500 App.tsx # Root component")),console.log(c.dim(" \u2502 \u2514\u2500\u2500 routes.tsx # React Router routes")),console.log(c.dim(" \u251C\u2500\u2500 public/")),console.log(c.dim(" \u2502 \u2514\u2500\u2500 index.html")),console.log(c.dim(" \u251C\u2500\u2500 runtime.config.ts # Runtime configuration")),console.log(c.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(c.dim(" \u2514\u2500\u2500 package.json")),console.log(),console.log(c.bold("Next steps:")),console.log(),s||console.log(c.cyan(` cd ${F.relative(n,o)}`)),console.log(),console.log(c.bold("Development:")),console.log(),console.log(c.cyan(" npx runtime dev")),console.log(c.dim(" # Start local development server")),console.log(),console.log(c.bold("Build & Deploy:")),console.log(),console.log(c.cyan(" npx runtime build")),console.log(c.dim(" # Build all targets (React, Lambda, CDK)")),console.log(),console.log(c.cyan(" npx runtime deploy --stage dev")),console.log(c.dim(" # Deploy to AWS")),console.log(),console.log(c.bold("\u{1F4DA} Learn more:")),console.log(c.dim(" https://runtimeweb.com/docs")),console.log()}function In(r,e,t,n){let o=F.resolve(n,t),s=F.relative(n,o);console.log(),r.success(c.bold(`CDK infrastructure for '${e}' created successfully!`)),console.log(),console.log(c.bold("CDK structure:")),console.log(c.dim(" cdk/")),console.log(c.dim(" \u251C\u2500\u2500 bin/")),console.log(c.dim(" \u2502 \u2514\u2500\u2500 app.ts # CDK app entry point")),console.log(c.dim(" \u251C\u2500\u2500 cdk.json # CDK configuration")),console.log(c.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(c.dim(" \u2514\u2500\u2500 .env.example # Environment variables template")),console.log(),console.log(c.bold("Ready to deploy:")),console.log(),console.log(c.cyan(` cd ${s}`)),console.log(c.dim(" # All dependencies are already installed")),console.log(),console.log(c.bold("Deploy to AWS:")),console.log(),console.log(c.cyan(" npx runtime init --cdk")),console.log(c.dim(" # Bootstrap CDK (only needed once per account/region)")),console.log(),console.log(c.cyan(" cdk diff")),console.log(c.dim(" # Preview changes before deploying")),console.log(),console.log(c.cyan(" npx runtime deploy --stage dev")),console.log(c.dim(" # Deploy your infrastructure")),console.log(),console.log(c.bold("\u{1F3AF} Deploy to different stages:")),console.log(),console.log(c.cyan(" npx runtime deploy --stage dev")),console.log(c.cyan(" npx runtime deploy --stage staging")),console.log(c.cyan(" npx runtime deploy --stage prod")),console.log(),console.log(c.bold("\u{1F4DA} Learn more:")),console.log(c.dim(" Runtime CDK: https://runtimeweb.com/docs/cdk")),console.log(c.dim(" AWS CDK: https://docs.aws.amazon.com/cdk/")),console.log()}async function Bn(r,e,t,n,o,s){let{PromptService:u,PackageManagerService:m,CdkInitService:b,AwsCredentialsDetector:R,AwsRegionResolver:w}=await import("@worktif/purenow/bin"),$=new u,_=new m,j=new b(o,_,r),N=new R;try{console.log();let x=await j.checkCdkDirectoryExists(t);if(x&&!await $.confirm("A /cdk folder already exists. Overwrite it?",!1))return console.log(),r.info("Existing CDK setup preserved."),console.log(),{success:!0,exitCode:0};let ee=await new w().resolveRegion(),Se=ee.region||w.getDefaultRegion();r.debug(`Resolved AWS region: ${Se} (source: ${ee.source})`);let oe={projectName:e,stage:"dev",region:Se,enableSeo:!0},ke=_.detectPackageManager(t);r.info(`Using package manager: ${c.cyan(ke)}`),console.log();let fe=r.spinner("Initializing CDK infrastructure...");fe.start();let Z=await j.initializeCdk({projectDir:t,projectName:oe.projectName,stage:oe.stage,region:oe.region,enableSeo:oe.enableSeo,overwriteExisting:x,runBootstrap:!1,packageManager:ke},n);return Z.success?(fe.succeed("CDK infrastructure initialized successfully!"),Z.projectDependenciesInstalled&&r.info(c.green("\u2713 Project dependencies installed")),Z.cdkDependenciesInstalled&&r.info(c.green("\u2713 CDK dependencies installed")),{success:!0,exitCode:0}):(fe.fail("Failed to initialize CDK infrastructure"),Z.error&&r.error(Z.error.message),{success:!1,error:Z.error,exitCode:1})}catch(x){return r.error(x instanceof Error?x.message:String(x)),{success:!1,error:x instanceof Error?x:new Error(String(x)),exitCode:1}}}async function $n(r,e,t){console.log();try{if(!e.getConfig().isAwsCredentialsDump())r.info(c.green("\u2713 AWS credentials detected")),console.log(),r.info("Your CDK infrastructure is ready. You can now:"),console.log(),console.log(c.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(c.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();else{(0,Q.logCredentialsError)(r);return}}catch(n){if(n instanceof Error){r.warn(c.yellow("! AWS credentials not configured.")),console.log(),r.info("CDK infrastructure files were created successfully in /cdk"),r.info("However, AWS credentials are required for deployment."),console.log(),r.info("Please configure AWS credentials before deploying:"),console.log(),console.log(c.bold("Option 1: AWS CLI (Recommended)")),console.log(c.dim(" $ aws configure")),console.log(),console.log(c.bold("Option 2: Environment Variables")),console.log(c.dim(" $ export AWS_ACCESS_KEY_ID=your_key_id")),console.log(c.dim(" $ export AWS_SECRET_ACCESS_KEY=your_secret_key")),console.log(c.dim(" $ export AWS_REGION=us-east-1")),console.log(),console.log(c.bold("Option 3: AWS Profile")),console.log(c.dim(" $ export AWS_PROFILE=your_profile_name")),console.log(),r.info("After configuring credentials, you can deploy by running:"),console.log(),console.log(c.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(c.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();return}throw n}}async function jn(r){let e=[],t=["package.json","node_modules","src/index.tsx","src/App.tsx","runtime.config.ts","purenow.config.ts","tsconfig.json"];for(let n of t){let o=F.join(r,n);try{await Dt.promises.access(o),e.push(n)}catch{}}return e}var be=class r extends je.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:r.defaultToolName,helperToolName:"Runtime Web",title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,je.purenowCommandConfig)(r.defaultToolName),this.addBuildCommands()}addBuildCommands(){let e=[{name:"build:browser",target:"react",desc:"Build browser bundle (ESM)"},{name:"build:lambda",target:"lambda",desc:"Build Lambda bundle (CommonJS)"},{name:"build:lib",target:"lib",desc:"Build library bundle (CommonJS)"},{name:"build:lib-esm",target:"lib-esm",desc:"Build library bundle (ESM)"},{name:"build:infra",target:"infra",desc:"Build infrastructure bundle"},{name:"build:cli",target:"cli",desc:"Build CLI bundle"},{name:"build:bin",target:"bin",desc:"Build bin utilities bundle"},{name:"build:cdk",target:"cdk",desc:"Build CDK application bundle"}];for(let{name:t,target:n,desc:o}of e)this.program.command(t).description(o).option("--dev","Enable development mode",!1).option("--skip-validation","Skip bundle validation",!1).option("-v, --verbose","Enable verbose output",!1).action(async s=>{try{await Ye({target:n},{},console)}catch(u){console.error(`${t} failed:`,u instanceof Error?u.message:String(u)),W.default.exit(1)}});this.program.command("dev:validate").description("Start development mode bundle validation with real-time feedback").option("-t, --targets <targets>","Comma-separated list of targets to validate","react,lambda").option("--no-watch","Disable file watching",!1).option("--interval <ms>","Validation interval in milliseconds","5000").option("--no-immediate","Skip immediate validation on startup",!1).option("-v, --verbose","Enable verbose output",!1).action(async t=>{try{let o={targets:t.targets.split(",").map(s=>s.trim()),watch:t.watch,interval:parseInt(t.interval,10),immediate:t.immediate,verbose:t.verbose};console.log("Dev validation not implemented yet")}catch(n){console.error("Development validation failed:",n instanceof Error?n.message:String(n)),W.default.exit(1)}})}async createContext(e,t=W.default.cwd()){let n=await super.createContext({...e,config:e.config??"runtime.config.ts"},t),o=new ce(t);return{...n,stacksDeployService:o}}async deployCommand(e,t,n){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let u=await new te().deployCommand(o.stacksDeployService,e,o.config,o.logger,o.cwd,o.envValidator);u.success||W.default.exit(u.exitCode)}catch(s){o.logger.error(s instanceof Error?s.message:String(s)),W.default.exit(1)}}async initCommand(e,t,n){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let u=await Ot(e,o.logger,o.cwd,o.envValidator);u.success||W.default.exit(u.exitCode)}catch(s){o.logger.error(s instanceof Error?s.message:String(s)),W.default.exit(1)}}async destroyCommand(e,t,n){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let{destroyCommand:s}=await import("@worktif/purenow/bin"),u=await s({...e,backupDir:"./.runtime-backups"},o.logger,o.cwd);u.success||W.default.exit(u.exitCode)}catch(s){o.logger.error(s instanceof Error?s.message:String(s)),W.default.exit(1)}}async run(e){await this.program.parseAsync(e||W.default.argv)}static handleError(e){let t=new ae,n=!!W.default.env.DEBUG;if(e instanceof Y){let o=t.formatTemplateError(e,n);console.error(o)}else if(e instanceof X){let o=t.formatTemplateStructureError(e,n);console.error(o)}else if(e instanceof Error){let o=t.formatError(e,n);console.error(o)}else console.error("Unknown error:",String(e));W.default.exit(1)}};function Mt(){return new be}0&&(module.exports={PurenowRuntimeStacksDeployService,RuntimeBuildError,RuntimeCliError,RuntimeConfigError,RuntimeDeploymentError,RuntimeDeploymentStrategy,RuntimeFriendlyErrorFormatter,RuntimeStructuredLogger,RuntimeTemplateError,RuntimeTemplateService,RuntimeTemplateStructureError,RuntimeValidationError,RuntimeWebCli,RuntimeWebDeploymentService,buildStaticHtml,createRuntimeCli});
151
+ Stack trace:`),console.error(e.stack)),r&&process.exit(1)}}var ko=$(ve());var Qr=$(ve()),C=$(Ge()),Ue=$(require("process")),D=require("@worktif/purenow/bin"),oe=class extends D.DeploymentService{async deployCommand(e,n,t,o,i=Ue.default.cwd(),s){try{if(s)try{if(s.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(P){if(P instanceof Error){let re=new D.FriendlyErrorFormatter().formatMissingCredentialsError(["AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY"],!1);console.error(re),Ue.default.exit(1)}throw P}let c=n.stage||Ue.default.env.STAGE||t.stages[0]?.name||"dev",d=(0,D.getStage)(t,c);if(!d)throw new D.DeploymentError(`Stage '${c}' not found in configuration`,`Available stages: ${t.stages.map(P=>P.name).join(", ")}
152
+ Update your purenow.config.ts to add this stage.`);(0,D.buildStaticHtml)(),o.info(C.default.bold(`Deploying to AWS (stage: ${C.default.cyan(c)})...`)),console.log();let v=new D.DeployService(i),w=new D.BuildService(i),E=new D.CdkBootstrapService(o),T=await(0,D.detectAndValidateCredentials)(o),j=d.awsRegion??T.region??"us-east-1";await this.validateCredentials(v,d,o),await this.ensureBootstrapped(E,t,d,T,o,i),await this.performPreDeploymentValidation(c,t,n,o,i);let N=await this.executeStacksDeployment(e,c,t,o,n.skipBuild,n.verbose);return await this.clearS3CacheDeployment(N.infraStack,t,j,o),await this.uploadReactBundle(N.infraStack,t,j,o,i),await this.uploadPublicAssets(N.infraStack,t,j,o,i),await this.invalidateCloudFrontCache(N.runtimeWebStack,t,j,o),await this.injectApiGatewayUrl(N.runtimeWebStack,t,o,i),this.displayStacksDeploymentSummary(N,o),{success:!0,exitCode:0}}catch(c){return c instanceof D.DeploymentError||c instanceof D.BuildError?(o.error(c.message),c.hint&&(console.log(),o.info(C.default.dim(c.hint)))):c instanceof D.BootstrapCredentialsError||c instanceof D.BootstrapRegionError||o.error(c instanceof Error?c.message:String(c)),{success:!1,error:c instanceof Error?c:new Error(String(c)),exitCode:1}}}displayStacksDeploymentSummary(e,n){super.displayStacksDeploymentSummary(e,n,{modified:!0}),console.log(),console.log(C.default.bold("Runtime Web Stack:")),console.log(C.default.dim(" "),C.default.cyan("Stack Name:"),C.default.white(e.runtimeWebStack.stackName)),console.log(C.default.dim(" "),C.default.cyan("Duration:"),C.default.white(this.formatDuration(e.runtimeWebStack.duration))),e.runtimeWebStack.outputs.apiGatewayUrl&&console.log(C.default.dim(" "),C.default.cyan("API Gateway:"),C.default.white(e.runtimeWebStack.outputs.apiGatewayUrl)),e.runtimeWebStack.outputs.lambdaArnList&&e.runtimeWebStack.outputs.lambdaArnList.length>0&&(console.log(C.default.dim(" "),C.default.cyan("Lambdas:"),C.default.white(e.runtimeWebStack.outputs.lambdaArnList.length)),e.runtimeWebStack.outputs.lambdaArnList.forEach((t,o)=>{console.log(C.default.dim(" "),C.default.cyan(" Lambda ARN:"),C.default.white(t))})),console.log(),console.log(C.default.bold("Deployment Info:")),console.log(C.default.dim(" "),C.default.cyan("Region:"),C.default.white(e.infraStack.region)),console.log(C.default.dim(" "),C.default.cyan("Stage:"),C.default.white(e.infraStack.stage)),console.log()}};var xe=$(require("fs")),ie=$(require("path")),X=$(Ge()),Y=require("@worktif/purenow/bin");function yr(r){return r==="lambda"||r==="cdk"||r==="all"}async function lt(r,e,n,t=process.cwd(),o){try{let i=r.target||"all";if(yr(i)&&o)try{if(o.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch(v){v instanceof Y.FriendlyEnvironmentError&&(n.warn("AWS credentials not configured"),console.log(),n.info(X.default.dim("Building without AWS credentials. You will need to configure them before deployment.")),console.log())}(0,Y.buildStaticHtml)();let s=new Y.BuildService(t);n.info(X.default.bold("Building Runtime application...")),console.log();let c,d=!1;return i==="all"?(d=xe.existsSync(ie.join(t,"src/core/index.ts")),c=await br(s,e,n)):c=await vr(s,i,e,n),d&&await wr(s,e,n),kr(c,t,n),{success:!0,exitCode:0}}catch(i){return i instanceof Y.BuildError?(n.error(i.message),i.hint&&(console.log(),n.info(X.default.dim(i.hint)))):n.error(i instanceof Error?i.message:String(i)),{success:!1,error:i instanceof Error?i:new Error(String(i)),exitCode:1}}}async function br(r,e,n){let o=xe.existsSync(ie.join(process.cwd(),"src/core/index.ts"))?["react","lambda","cdk"]:["react"],i=[];for(let s of o){let c=n.spinner(`Building ${s} bundle...`);c.start();let d=await r.buildTarget(s,e);if(i.push(d),d.success)c.succeed(`${Ve(s)} bundle (${ct(d.duration)})`);else throw c.fail(`${Ve(s)} bundle failed`),new Y.BuildError(`Build failed for target '${s}'`,d.error?.message)}return i}async function vr(r,e,n,t){let o=t.spinner(`Building ${e} bundle...`);o.start();let i=await r.buildTarget(e,n);if(i.success)o.succeed(`${Ve(e)} bundle (${ct(i.duration)})`);else throw o.fail(`${Ve(e)} bundle failed`),new Y.BuildError(`Build failed for target '${e}'`,i.error?.message);return[i]}async function wr(r,e,n){let t=n.spinner("Generating type declarations...");t.start();try{await r.generateTypes(e),t.succeed("Type declarations")}catch(o){throw t.fail("Type declarations failed"),o}}function kr(r,e,n){console.log();let t=r.reduce((o,i)=>o+i.duration,0);n.success(X.default.bold(`Build complete in ${ct(t)}`)),console.log(),console.log(X.default.bold("Artifacts:"));for(let o of r)if(o.success){let i=ie.resolve(e,o.outputPath),s=Sr(i),c=ie.relative(e,i);console.log(X.default.dim(" "),X.default.white(c),X.default.dim(`(${s})`))}console.log()}function Sr(r){try{let e=xe.statSync(r);return Rr(e.size)}catch{return"unknown"}}function Rr(r){if(r===0)return"0 B";let e=1024,n=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(e));return`${(r/Math.pow(e,t)).toFixed(1)} ${n[t]}`}function ct(r){return r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`}function Ve(r){return r.charAt(0).toUpperCase()+r.slice(1)}var W=$(require("path")),dn=$(require("fs"));var ne=require("@worktif/purenow/bin"),m=$(Ge());async function fn(r,e,n=process.cwd(),t){let o=e.spinner(r.cdk?"Initializing CDK infrastructure...":"Initializing Runtime project...");try{let i=new de(n),s=new ne.PromptService;if(r.cdk&&!r.force&&i.cdkDirectoryExists(n))throw new ne.ValidationError("CDK directory already exists","Use --force flag to overwrite existing CDK infrastructure");let c=r.dir||(r.cdk?"cdk":n),d=r.cdk?"cdk":r.template||"basic",v="runtime-web",w=r.force||!1,E=W.basename(W.resolve(n,r.cdk?n:c));if(!r.cdk&&!w){let T=W.resolve(n,c),j=await Mr(T);if(j.length>0){if(console.log(),e.warn("Existing project files detected:"),j.forEach(P=>{console.log(m.default.dim(` - ${P}`))}),console.log(),!await s.confirm("Do you want to overwrite these files?",!1))return console.log(),e.info("Project initialization cancelled. Existing files preserved."),console.log(),{success:!0,exitCode:0};w=!0}}if(o.start(),await i.scaffold(d,c,{projectName:E,force:w},v),o.succeed(r.cdk?"CDK infrastructure initialized successfully!":"Runtime project initialized successfully!"),r.cdk){if(Er(e,E,c,n),t){let T=W.resolve(n,c);await Tr(e,t,T)}}else xr(e,E,c,n),await new ne.PromptService().confirm("Do you want to initialize AWS CDK infrastructure for this project now?",!0)?(await Cr(e,E,W.resolve(n,c),v,i,t)).success||(e.warn("CDK initialization failed, but your Runtime project was created successfully."),e.info("You can initialize CDK later by running: npm install && runtime init --cdk")):(console.log(),e.info("You can initialize CDK later by running: npm install && runtime init --cdk"),console.log());return{success:!0,exitCode:0}}catch(i){return o.fail(r.cdk?"Failed to initialize CDK infrastructure":"Failed to initialize Runtime project"),i instanceof ne.ValidationError?(e.error(i.message),i.hint&&e.info(m.default.dim(i.hint))):e.error(i instanceof Error?i.message:String(i)),{success:!1,error:i instanceof Error?i:new Error(String(i)),exitCode:1}}}function xr(r,e,n,t){let o=W.resolve(t,n),i=o===t;console.log(),r.success(m.default.bold(`Runtime project '${e}' created successfully!`)),console.log(),console.log(m.default.bold("Project structure:")),console.log(m.default.dim(" \u251C\u2500\u2500 src/")),console.log(m.default.dim(" \u2502 \u251C\u2500\u2500 index.tsx # React app entry")),console.log(m.default.dim(" \u2502 \u251C\u2500\u2500 App.tsx # Root component")),console.log(m.default.dim(" \u2502 \u2514\u2500\u2500 routes.tsx # React Router routes")),console.log(m.default.dim(" \u251C\u2500\u2500 public/")),console.log(m.default.dim(" \u2502 \u2514\u2500\u2500 index.html")),console.log(m.default.dim(" \u251C\u2500\u2500 runtime.config.ts # Runtime configuration")),console.log(m.default.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(m.default.dim(" \u2514\u2500\u2500 package.json")),console.log(),console.log(m.default.bold("Next steps:")),console.log(),i||console.log(m.default.cyan(` cd ${W.relative(t,o)}`)),console.log(),console.log(m.default.bold("Development:")),console.log(),console.log(m.default.cyan(" npx runtime dev")),console.log(m.default.dim(" # Start local development server")),console.log(),console.log(m.default.bold("Build & Deploy:")),console.log(),console.log(m.default.cyan(" npx runtime build")),console.log(m.default.dim(" # Build all targets (React, Lambda, CDK)")),console.log(),console.log(m.default.cyan(" npx runtime deploy --stage dev")),console.log(m.default.dim(" # Deploy to AWS")),console.log(),console.log(m.default.bold("\u{1F4DA} Learn more:")),console.log(m.default.dim(" https://runtimeweb.com/docs")),console.log()}function Er(r,e,n,t){let o=W.resolve(t,n),i=W.relative(t,o);console.log(),r.success(m.default.bold(`CDK infrastructure for '${e}' created successfully!`)),console.log(),console.log(m.default.bold("CDK structure:")),console.log(m.default.dim(" cdk/")),console.log(m.default.dim(" \u251C\u2500\u2500 bin/")),console.log(m.default.dim(" \u2502 \u2514\u2500\u2500 app.ts # CDK app entry point")),console.log(m.default.dim(" \u251C\u2500\u2500 cdk.json # CDK configuration")),console.log(m.default.dim(" \u251C\u2500\u2500 tsconfig.json # TypeScript config")),console.log(m.default.dim(" \u2514\u2500\u2500 .env.example # Environment variables template")),console.log(),console.log(m.default.bold("Ready to deploy:")),console.log(),console.log(m.default.cyan(` cd ${i}`)),console.log(m.default.dim(" # All dependencies are already installed")),console.log(),console.log(m.default.bold("Deploy to AWS:")),console.log(),console.log(m.default.cyan(" npx runtime init --cdk")),console.log(m.default.dim(" # Bootstrap CDK (only needed once per account/region)")),console.log(),console.log(m.default.cyan(" cdk diff")),console.log(m.default.dim(" # Preview changes before deploying")),console.log(),console.log(m.default.cyan(" npx runtime deploy --stage dev")),console.log(m.default.dim(" # Deploy your infrastructure")),console.log(),console.log(m.default.bold("\u{1F3AF} Deploy to different stages:")),console.log(),console.log(m.default.cyan(" npx runtime deploy --stage dev")),console.log(m.default.cyan(" npx runtime deploy --stage staging")),console.log(m.default.cyan(" npx runtime deploy --stage prod")),console.log(),console.log(m.default.bold("\u{1F4DA} Learn more:")),console.log(m.default.dim(" Runtime CDK: https://runtimeweb.com/docs/cdk")),console.log(m.default.dim(" AWS CDK: https://docs.aws.amazon.com/cdk/")),console.log()}async function Cr(r,e,n,t,o,i){let{PromptService:s,PackageManagerService:c,CdkInitService:d,AwsCredentialsDetector:v,AwsRegionResolver:w}=await import("@worktif/purenow/bin"),E=new s,T=new c,j=new d(o,T,r),N=new v;try{console.log();let P=await j.checkCdkDirectoryExists(n);if(P&&!await E.confirm("A /cdk folder already exists. Overwrite it?",!1))return console.log(),r.info("Existing CDK setup preserved."),console.log(),{success:!0,exitCode:0};let re=await new w().resolveRegion(),Ce=re.region||w.getDefaultRegion();r.debug(`Resolved AWS region: ${Ce} (source: ${re.source})`);let ae={projectName:e,stage:"dev",region:Ce,enableSeo:!0},Te=T.detectPackageManager(n);r.info(`Using package manager: ${m.default.cyan(Te)}`),console.log();let ye=r.spinner("Initializing CDK infrastructure...");ye.start();let Q=await j.initializeCdk({projectDir:n,projectName:ae.projectName,stage:ae.stage,region:ae.region,enableSeo:ae.enableSeo,overwriteExisting:P,runBootstrap:!1,packageManager:Te},t);return Q.success?(ye.succeed("CDK infrastructure initialized successfully!"),Q.projectDependenciesInstalled&&r.info(m.default.green("\u2713 Project dependencies installed")),Q.cdkDependenciesInstalled&&r.info(m.default.green("\u2713 CDK dependencies installed")),{success:!0,exitCode:0}):(ye.fail("Failed to initialize CDK infrastructure"),Q.error&&r.error(Q.error.message),{success:!1,error:Q.error,exitCode:1})}catch(P){return r.error(P instanceof Error?P.message:String(P)),{success:!1,error:P instanceof Error?P:new Error(String(P)),exitCode:1}}}async function Tr(r,e,n){console.log();try{if(!e.getConfig().isAwsCredentialsDump())r.info(m.default.green("\u2713 AWS credentials detected")),console.log(),r.info("Your CDK infrastructure is ready. You can now:"),console.log(),console.log(m.default.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(m.default.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();else{(0,ne.logCredentialsError)(r);return}}catch(t){if(t instanceof Error){r.warn(m.default.yellow("! AWS credentials not configured.")),console.log(),r.info("CDK infrastructure files were created successfully in /cdk"),r.info("However, AWS credentials are required for deployment."),console.log(),r.info("Please configure AWS credentials before deploying:"),console.log(),console.log(m.default.bold("Option 1: AWS CLI (Recommended)")),console.log(m.default.dim(" $ aws configure")),console.log(),console.log(m.default.bold("Option 2: Environment Variables")),console.log(m.default.dim(" $ export AWS_ACCESS_KEY_ID=your_key_id")),console.log(m.default.dim(" $ export AWS_SECRET_ACCESS_KEY=your_secret_key")),console.log(m.default.dim(" $ export AWS_REGION=us-east-1")),console.log(),console.log(m.default.bold("Option 3: AWS Profile")),console.log(m.default.dim(" $ export AWS_PROFILE=your_profile_name")),console.log(),r.info("After configuring credentials, you can deploy by running:"),console.log(),console.log(m.default.cyan(" npx runtime init --cdk # Bootstrap your AWS environment (first time only)")),console.log(m.default.cyan(" npx runtime deploy --stage dev # Deploy your infrastructure")),console.log();return}throw t}}async function Mr(r){let e=[],n=["package.json","node_modules","src/index.tsx","src/App.tsx","runtime.config.ts","purenow.config.ts","tsconfig.json"];for(let t of n){let o=W.join(r,t);try{await dn.promises.access(o),e.push(t)}catch{}}return e}var Ee=class r extends qe.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:r.defaultToolName,helperToolName:"Runtime Web",title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,qe.purenowCommandConfig)(r.defaultToolName),this.addBuildCommands()}addBuildCommands(){let e=[{name:"build:browser",target:"react",desc:"Build browser bundle (ESM)"},{name:"build:lambda",target:"lambda",desc:"Build Lambda bundle (CommonJS)"},{name:"build:lib",target:"lib",desc:"Build library bundle (CommonJS)"},{name:"build:lib-esm",target:"lib-esm",desc:"Build library bundle (ESM)"},{name:"build:infra",target:"infra",desc:"Build infrastructure bundle"},{name:"build:cli",target:"cli",desc:"Build CLI bundle"},{name:"build:bin",target:"bin",desc:"Build bin utilities bundle"},{name:"build:cdk",target:"cdk",desc:"Build CDK application bundle"}];for(let{name:n,target:t,desc:o}of e)this.program.command(n).description(o).option("--dev","Enable development mode",!1).option("--skip-validation","Skip bundle validation",!1).option("-v, --verbose","Enable verbose output",!1).action(async i=>{try{await lt({target:t},{},console)}catch(s){console.error(`${n} failed:`,s instanceof Error?s.message:String(s)),z.default.exit(1)}});this.program.command("dev:validate").description("Start development mode bundle validation with real-time feedback").option("-t, --targets <targets>","Comma-separated list of targets to validate","react,lambda").option("--no-watch","Disable file watching",!1).option("--interval <ms>","Validation interval in milliseconds","5000").option("--no-immediate","Skip immediate validation on startup",!1).option("-v, --verbose","Enable verbose output",!1).action(async n=>{try{let o={targets:n.targets.split(",").map(i=>i.trim()),watch:n.watch,interval:parseInt(n.interval,10),immediate:n.immediate,verbose:n.verbose};console.log("Dev validation not implemented yet")}catch(t){console.error("Development validation failed:",t instanceof Error?t.message:String(t)),z.default.exit(1)}})}async createContext(e,n=z.default.cwd()){let t=await super.createContext({...e,config:e.config??"runtime.config.ts"},n),o=new fe(n);return{...t,stacksDeployService:o}}async deployCommand(e,n,t){if(this.isHelpRequested(n)){n.help();return}let o=await this.getContext(e,n);try{let s=await new oe().deployCommand(o.stacksDeployService,e,o.config,o.logger,o.cwd,o.envValidator);s.success||z.default.exit(s.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),z.default.exit(1)}}async initCommand(e,n,t){if(this.isHelpRequested(n)){n.help();return}let o=await this.getContext(e,n);try{let s=await fn(e,o.logger,o.cwd,o.envValidator);s.success||z.default.exit(s.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),z.default.exit(1)}}async destroyCommand(e,n,t){if(this.isHelpRequested(n)){n.help();return}let o=await this.getContext(e,n);try{let{destroyCommand:i}=await import("@worktif/purenow/bin"),s=await i({...e,backupDir:"./.runtime-backups"},o.logger,o.cwd);s.success||z.default.exit(s.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),z.default.exit(1)}}async run(e){await this.program.parseAsync(e||z.default.argv)}static handleError(e){let n=new ue,t=!!z.default.env.DEBUG;if(e instanceof K){let o=n.formatTemplateError(e,t);console.error(o)}else if(e instanceof ee){let o=n.formatTemplateStructureError(e,t);console.error(o)}else if(e instanceof Error){let o=n.formatError(e,t);console.error(o)}else console.error("Unknown error:",String(e));z.default.exit(1)}};function pn(){return new Ee}0&&(module.exports={PurenowRuntimeStacksDeployService,RuntimeBuildError,RuntimeCliError,RuntimeConfigError,RuntimeDeploymentError,RuntimeDeploymentStrategy,RuntimeFriendlyErrorFormatter,RuntimeStructuredLogger,RuntimeTemplateError,RuntimeTemplateService,RuntimeTemplateStructureError,RuntimeValidationError,RuntimeWebCli,RuntimeWebDeploymentService,buildStaticHtml,createRuntimeCli});
152
153
  /*! Bundled license information:
153
154
 
154
155
  reflect-metadata/Reflect.js:
@@ -167,4 +168,4 @@ reflect-metadata/Reflect.js:
167
168
  and limitations under the License.
168
169
  ***************************************************************************** *)
169
170
  */
170
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vcnVudGltZS13ZWItY2xpLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvdGVtcGxhdGUuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvYmluL3V0aWxzL2Vycm9ycy50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3N0YWNrLW5hbWUtc2FuaXRpemVyLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvcHVyZW5vdy1ydW50aW1lLWRlcGxveW1lbnQuc3RyYXRlZ3kudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy91dGlscy9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvcnVudGltZS13ZWItZGVwbG95bWVudC5zZXJ2aWNlLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdmVuZG9yL2Fuc2ktc3R5bGVzL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdmVuZG9yL3N1cHBvcnRzLWNvbG9yL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdXRpbGl0aWVzLmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9jb21tYW5kcy9idWlsZC5jb21tYW5kLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvaW5pdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgUmVmbGVjdDtcbihmdW5jdGlvbiAoUmVmbGVjdCkge1xuICAgIC8vIE1ldGFkYXRhIFByb3Bvc2FsXG4gICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS9cbiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbFRoaXMgOlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BweU1vZGVUaGlzKCk7XG4gICAgICAgIHZhciBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihSZWZsZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKHJvb3QuUmVmbGVjdCwgZXhwb3J0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0ZXIsIHJvb3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcm9vdC5SZWZsZWN0ID0gUmVmbGVjdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlRXhwb3J0ZXIodGFyZ2V0LCBwcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmdW5jdGlvblRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGluZGlyZWN0RXZhbFRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAwLCBldmFsKShcIihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pKClcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2xvcHB5TW9kZVRoaXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UaGlzKCkgfHwgaW5kaXJlY3RFdmFsVGhpcygpO1xuICAgICAgICB9XG4gICAgfSkoZnVuY3Rpb24gKGV4cG9ydGVyLCByb290KSB7XG4gICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgdmFyIHRvUHJpbWl0aXZlU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6IFwiQEB0b1ByaW1pdGl2ZVwiO1xuICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLml0ZXJhdG9yIDogXCJAQGl0ZXJhdG9yXCI7XG4gICAgICAgIHZhciBzdXBwb3J0c0NyZWF0ZSA9IHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCI7IC8vIGZlYXR1cmUgdGVzdCBmb3IgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0geyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheTsgLy8gZmVhdHVyZSB0ZXN0IGZvciBfX3Byb3RvX18gc3VwcG9ydFxuICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvO1xuICAgICAgICB2YXIgSGFzaE1hcCA9IHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgaW4gZGljdGlvbmFyeSBtb2RlIChhLmsuYS4gXCJzbG93XCIgbW9kZSBpbiB2OClcbiAgICAgICAgICAgIGNyZWF0ZTogc3VwcG9ydHNDcmVhdGVcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9XG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0c1Byb3RvXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoeyBfX3Byb3RvX186IG51bGwgfSk7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sXG4gICAgICAgICAgICBoYXM6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSk7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSxcbiAgICAgICAgICAgIGdldDogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KSA/IG1hcFtrZXldIDogdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBMb2FkIGdsb2JhbCBvciBzaGltIHZlcnNpb25zIG9mIE1hcCwgU2V0LCBhbmQgV2Vha01hcFxuICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xuICAgICAgICB2YXIgX01hcCA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1NldCA9IHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gXCJmdW5jdGlvblwiID8gV2Vha01hcCA6IENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgcmVnaXN0cnlTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCA/IFN5bWJvbC5mb3IoXCJAcmVmbGVjdC1tZXRhZGF0YTpyZWdpc3RyeVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnkgPSBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhUHJvdmlkZXIgPSBDcmVhdGVNZXRhZGF0YVByb3ZpZGVyKG1ldGFkYXRhUmVnaXN0cnkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlEZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMS4xIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihwcm92aWRlci5PcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjMuMSBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS41LjEgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICBwcm92aWRlci5PcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA2IEVDTUFTY3JpcHQgRGF0YSBUeXBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHkgfHwgeCAhPT0geCAmJiB5ICE9PSB5O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2xvYmFsIG1ldGFkYXRhIHJlZ2lzdHJ5XG4gICAgICAgIC8vIC0gQWxsb3dzIGBpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCJgIGFuZCBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YS9uby1jb25mbGljdFwiYCB0byBpbnRlcm9wZXJhdGUuXG4gICAgICAgIC8vIC0gVXNlcyBpc29sYXRlZCBtZXRhZGF0YSBpZiBgUmVmbGVjdGAgaXMgZnJvemVuIGJlZm9yZSB0aGUgcmVnaXN0cnkgY2FuIGJlIGluc3RhbGxlZC5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSByZWdpc3RyeSB1c2VkIHRvIGFsbG93IG11bHRpcGxlIGByZWZsZWN0LW1ldGFkYXRhYCBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIGZhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgIShyZWdpc3RyeVN5bWJvbCBpbiByb290LlJlZmxlY3QpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJvcGVyYXRlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBgcmVmbGVjdC1tZXRhZGF0YWAgdGhhdCBkaWQgbm90IHN1cHBvcnQgYSByZWdpc3RyeS5cbiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocm9vdC5SZWZsZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmaXJzdDtcbiAgICAgICAgICAgIHZhciBzZWNvbmQ7XG4gICAgICAgICAgICB2YXIgcmVzdDtcbiAgICAgICAgICAgIHZhciB0YXJnZXRQcm92aWRlck1hcCA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvdmlkZXI6IHJlZ2lzdGVyUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXI6IGdldFByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHNldFByb3ZpZGVyOiBzZXRQcm92aWRlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIHByb3ZpZGVyIHRvIGEgZnJvemVuIHJlZ2lzdHJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsbGJhY2sgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChmaXJzdCk6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3QgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChzZWNvbmQpOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWNvbmQgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0LmFkZChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5pc1Byb3ZpZGVyRm9yKE8sIFApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmQuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3IocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXIoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlck1hcC5nZXQoUCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBoYXNQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgPT09IHByb3ZpZGVyIHx8IHNlY29uZCA9PT0gcHJvdmlkZXIgfHwgIUlzVW5kZWZpbmVkKHJlc3QpICYmIHJlc3QuaGFzKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldFByb3ZpZGVyKE8sIFAsIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQcm92aWRlcihwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgcHJvdmlkZXIgbm90IHJlZ2lzdGVyZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IGdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyICE9PSBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGV4aXN0aW5nUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyTWFwID0gdGFyZ2V0UHJvdmlkZXJNYXAuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm92aWRlck1hcC5zZXQoTywgcHJvdmlkZXJNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwLnNldChQLCBwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNoYXJlZCByZWdpc3RyeSBvZiBtZXRhZGF0YSBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFSZWdpc3RyeTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IHJvb3QuUmVmbGVjdFtyZWdpc3RyeVN5bWJvbF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFSZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5ID0gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiYgSXNPYmplY3Qocm9vdC5SZWZsZWN0KSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKHJvb3QuUmVmbGVjdCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9vdC5SZWZsZWN0LCByZWdpc3RyeVN5bWJvbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YWRhdGFSZWdpc3RyeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihyZWdpc3RyeSkge1xuICAgICAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0YWRhdGEuaGFzKFApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBPcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5R2V0T3duTWV0YWRhdGE6IE9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeS5yZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSB0YXJnZXRNZXRhZGF0YS5nZXQoUCk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuc2V0KFAsIG1ldGFkYXRhTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkVGFyZ2V0TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUoTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBwcm92aWRlciBmb3IgdGFyZ2V0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNy4xIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihrZXlzT2JqKTtcbiAgICAgICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5c1trXSA9IG5leHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhTWFwLmRlbGV0ZShNZXRhZGF0YUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TWV0YWRhdGEuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlbGV0ZSh0YXJnZXRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlRmFsbGJhY2tQcm92aWRlcihyZWZsZWN0KSB7XG4gICAgICAgICAgICB2YXIgZGVmaW5lTWV0YWRhdGEgPSByZWZsZWN0LmRlZmluZU1ldGFkYXRhLCBoYXNPd25NZXRhZGF0YSA9IHJlZmxlY3QuaGFzT3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YSwgZ2V0T3duTWV0YWRhdGFLZXlzID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMsIGRlbGV0ZU1ldGFkYXRhID0gcmVmbGVjdC5kZWxldGVNZXRhZGF0YTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU93bmVyID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBtZXRhZGF0YU93bmVyLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSAmJiBtZXRhZGF0YVByb3BlcnR5U2V0LmhhcyhQKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE93bk1ldGFkYXRhS2V5cyhPLCBQKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhT3duZXIuc2V0KE8sIG1ldGFkYXRhUHJvcGVydHlTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9wZXJ0eVNldC5hZGQoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhOiBkZWZpbmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBoYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBnZXRPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeU93bk1ldGFkYXRhS2V5czogZ2V0T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IGRlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgcHJvdmlkZXIgZm9yIGFuIG9iamVjdC4gSWYgdGhlIG9iamVjdCBoYXMgbm8gbWV0YWRhdGEgcHJvdmlkZXIgYW5kIHRoaXMgaXMgZm9yIGEgY3JlYXRlIG9wZXJhdGlvbixcbiAgICAgICAgICogdGhlbiB0aGlzIG1vZHVsZSdzIG1ldGFkYXRhIHByb3ZpZGVyIGlzIGFzc2lnbmVkIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRQcm92aWRlciA9IG1ldGFkYXRhUmVnaXN0cnkuZ2V0UHJvdmlkZXIoTywgUCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdGVyZWRQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YVJlZ2lzdHJ5LnNldFByb3ZpZGVyKE8sIFAsIG1ldGFkYXRhUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgdmFyIE1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhbWVWYWx1ZVplcm8oa2V5LCB0aGlzLl9jYWNoZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVNhbWVWYWx1ZVplcm8odGhpcy5fY2FjaGVLZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKHRoaXMuX2tleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVJbmRleCA8IDAgJiYgaW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlSW5kZXg7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgU2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgV2Vha01hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBVVUlEX1NJWkUgPSAxNjtcbiAgICAgICAgICAgIHZhciBrZXlzID0gSGFzaE1hcC5jcmVhdGUoKTtcbiAgICAgICAgICAgIHZhciByb290S2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5oYXModGFibGUsIHRoaXMuX2tleSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmdldCh0YWJsZSwgdGhpcy5fa2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVbdGhpcy5fa2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBkZWxldGUgdGFibGVbdGhpcy5fa2V5XSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5vdCBhIHJlYWwgY2xlYXIsIGp1c3QgbWFrZXMgdGhlIHByZXZpb3VzIGRhdGEgdW5yZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gV2Vha01hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVbmlxdWVLZXkoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBcIkBAV2Vha01hcEBAXCIgKyBDcmVhdGVVVUlEKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKEhhc2hNYXAuaGFzKGtleXMsIGtleSkpO1xuICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh0YXJnZXQsIHJvb3RLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcm9vdEtleSwgeyB2YWx1ZTogSGFzaE1hcC5jcmVhdGUoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtyb290S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEZpbGxSYW5kb21CeXRlcyhidWZmZXIsIHNpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gTWF0aC5yYW5kb20oKSAqIDB4ZmYgfCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZW5SYW5kb21CeXRlcyhzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbXNDcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxsUmFuZG9tQnl0ZXMoYXJyYXksIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxSYW5kb21CeXRlcyhuZXcgQXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVVVJRCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEdlblJhbmRvbUJ5dGVzKFVVSURfU0laRSk7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiBcdTAwQTcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzIChhdm9pZCBjb25mbGljdHMgd2l0aCBwdXJlbm93KVxuZXhwb3J0IHsgUnVudGltZVdlYkNsaSwgY3JlYXRlUnVudGltZUNsaSB9IGZyb20gJ0BiaW4vcnVudGltZS13ZWItY2xpJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgc2VydmljZSB3aXRoIGRpZmZlcmVudCBuYW1lcyB0byBhdm9pZCBjb25mbGljdHNcbmV4cG9ydCB7XG4gIFRlbXBsYXRlU2VydmljZSBhcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlLFxuICBTY2FmZm9sZE9wdGlvbnMgYXMgUnVudGltZVNjYWZmb2xkT3B0aW9ucyxcbiAgVGVtcGxhdGVDb250ZXh0IGFzIFJ1bnRpbWVUZW1wbGF0ZUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSxcbiAgUnVudGltZURlcGxveW1lbnRTdHJhdGVneSxcbiAgYnVpbGRTdGF0aWNIdG1sLFxuICBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxufSBmcm9tICcuL3NlcnZpY2VzJztcblxuZXhwb3J0IHsgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5leHBvcnQge1xuICBSdW50aW1lQnVpbGRFcnJvcixcbiAgUnVudGltZUNsaUVycm9yLFxuICBSdW50aW1lQ29uZmlnRXJyb3IsXG4gIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IsXG4gIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IsXG4gIFJ1bnRpbWVUZW1wbGF0ZUVycm9yLFxuICBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcixcbiAgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyLFxufSBmcm9tICcuL3V0aWxzL2Vycm9ycyc7XG5cbi8vIGV4cG9ydCB7IFB1cmVub3dSdW50aW1lQ2xpIH0gZnJvbSAnLi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtZGVwbG95bWVudC5zdHJhdGVneSc7XG4iLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5cbmltcG9ydCB7XG4gIEdsb2JhbE9wdGlvbnMsXG4gIFB1cmVub3dDbGksXG4gIFB1cmVub3dDbGlDb250ZXh0LFxuICBwdXJlbm93Q29tbWFuZENvbmZpZyxcbiAgdHlwZSBTdHJhdGVneUNvbnRhaW5lcixcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDb21tYW5kLFxuICB0eXBlIEJ1aWxkT3B0aW9ucyxcbiAgLy8gZGV2VmFsaWRhdGlvbkNvbW1hbmQsIC8vIFRPRE86IEltcGxlbWVudCBkZXYgdmFsaWRhdGlvblxuICAvLyB0eXBlIERldlZhbGlkYXRpb25PcHRpb25zLFxuICBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UsXG59IGZyb20gJ0BiaW4vY29tbWFuZHMnO1xuXG5pbXBvcnQgeyBydW50aW1lSW5pdENvbW1hbmQsIHR5cGUgUnVudGltZUluaXRPcHRpb25zIH0gZnJvbSAnQGJpbi9jb21tYW5kcy9pbml0JztcblxuaW1wb3J0IHsgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsIFJ1bnRpbWVUZW1wbGF0ZUVycm9yLCBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciB9IGZyb20gJ0BiaW4vdXRpbHMvZXJyb3JzJztcbmltcG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgYXMgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnQGJpbi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBSdW50aW1lIENMSSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgUHVyZW5vd0NsaSB1c2luZyB0aGUgZXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmVcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHVyZW5vdydzIEV4dGVuc2libGVDbGlDb3JlLmFkZENvbW1hbmRzKCkgYW5kIGFkZEFjdGlvbnMoKVxuICogdG8gYWRkIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB3aGlsZSBwcmVzZXJ2aW5nIGFsbCBleGlzdGluZyBwdXJlbm93IGNvbW1hbmRzLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkNsaSBleHRlbmRzIFB1cmVub3dDbGkge1xuICBzdGF0aWMgZGVmYXVsdFRvb2xOYW1lOiBzdHJpbmcgPSAncnVudGltZSc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgc3RyYXRlZ2llc1xuICAgIC8vIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU3RyYXRlZ3lDb250YWluZXIoKTtcbiAgICAvL1xuICAgIC8vIC8vIEFkZCBydW50aW1lIGRlcGxveW1lbnQgc3RyYXRlZ3kgZm9yIHRocmVlLXN0YWNrIGRlcGxveW1lbnRcbiAgICAvLyBzdHJhdGVnaWVzLmFkZFN0cmF0ZWd5KG5ldyBSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5KCkpO1xuXG4gICAgc3VwZXIodm9pZCAwIC8qc3RyYXRlZ2llcyovLCB7XG4gICAgICB0b29sTmFtZTogUnVudGltZVdlYkNsaS5kZWZhdWx0VG9vbE5hbWUsXG4gICAgICBoZWxwZXJUb29sTmFtZTogJ1J1bnRpbWUgV2ViJyxcbiAgICAgIHRpdGxlOiAnUnVudGltZSB0YXJnZXQgZnJhbWV3b3JrIGZvciBBV1MgTGFtYmRhJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUnVudGltZSB0YXJnZXQgZnJhbWV3b3JrIGZvciBBV1MgTGFtYmRhJyxcbiAgICAgIGZhbGxiYWNrVmVyc2lvbjogJzAuMi4xMzUnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb21tYW5kcyA9IHB1cmVub3dDb21tYW5kQ29uZmlnKFJ1bnRpbWVXZWJDbGkuZGVmYXVsdFRvb2xOYW1lKTtcblxuICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGJ1aWxkIGNvbW1hbmRzXG4gICAgdGhpcy5hZGRCdWlsZENvbW1hbmRzKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIHJ1bnRpbWUtd2ViIGV4dGVuc2lvbnNcbiAgICAvLyB0aGlzLnJ1bnRpbWVFeHRlbnNpb25zID0gbmV3IFJ1bnRpbWVXZWJDbGlFeHRlbnNpb25zKCk7XG5cbiAgICAvLyBBZGQgcnVudGltZS1zcGVjaWZpYyBjb21tYW5kcyB1c2luZyBleHRlbnNpYmxlIGFyY2hpdGVjdHVyZVxuICAgIC8vIEBub3RlOiBpcyBub3QgbmVjZXNzYXJ5LCB3ZSBleHBlY3QgdG8gcmVkZWZpbmUgZGVwbG95bWVudCBzdHJhdGVneSBvbmx5XG4gICAgLy8gdGhpcy5hZGRSdW50aW1lQ29tbWFuZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcnVudGltZS1zcGVjaWZpYyBidWlsZCBjb21tYW5kc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRCdWlsZENvbW1hbmRzKCk6IHZvaWQge1xuICAgIC8vIEVuaGFuY2VkIGJ1aWxkIGNvbW1hbmQgd2l0aCBtdWx0aXBsZSB0YXJnZXQgc3VwcG9ydFxuICAgIC8vIHRoaXMucHJvZ3JhbVxuICAgIC8vICAgLmNvbW1hbmQoJ2J1aWxkJylcbiAgICAvLyAgIC5kZXNjcmlwdGlvbignQnVpbGQgcnVudGltZSBidW5kbGVzIGZvciBkaWZmZXJlbnQgdGFyZ2V0cycpXG4gICAgLy8gICAub3B0aW9uKCctdCwgLS10YXJnZXQgPHRhcmdldD4nLCAnQnVpbGQgdGFyZ2V0IChhbGx8YnJvd3NlcnxsYW1iZGF8bGlifGxpYi1lc218aW5mcmF8Y2xpfGJpbnxjZGspJywgJ2FsbCcpXG4gICAgLy8gICAub3B0aW9uKCctLWRldicsICdFbmFibGUgZGV2ZWxvcG1lbnQgbW9kZSAoZmFzdGVyIGJ1aWxkcywgc291cmNlIG1hcHMpJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLXdhdGNoJywgJ0VuYWJsZSB3YXRjaCBtb2RlIGZvciBjb250aW51b3VzIHJlYnVpbGRzJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLXNraXAtdmFsaWRhdGlvbicsICdTa2lwIGJ1bmRsZSB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLWRldi12YWxpZGF0aW9uJywgJ0VuYWJsZSBlbmhhbmNlZCBkZXZlbG9wbWVudCB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctdiwgLS12ZXJib3NlJywgJ0VuYWJsZSB2ZXJib3NlIG91dHB1dCcsIGZhbHNlKVxuICAgIC8vICAgLm9wdGlvbignLS1vdXRkaXIgPGRpcj4nLCAnT3ZlcnJpZGUgb3V0cHV0IGRpcmVjdG9yeScpXG4gICAgLy8gICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0ID09PSAnYnJvd3NlcicgPyAncmVhY3QnIDogb3B0aW9ucy50YXJnZXQsXG4gICAgLy8gICAgICAgICBkZXY6IG9wdGlvbnMuZGV2LFxuICAgIC8vICAgICAgICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2gsXG4gICAgLy8gICAgICAgICBza2lwVmFsaWRhdGlvbjogb3B0aW9ucy5za2lwVmFsaWRhdGlvbixcbiAgICAvLyAgICAgICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcbiAgICAvLyAgICAgICAgIG91dGRpcjogb3B0aW9ucy5vdXRkaXIsXG4gICAgLy8gICAgICAgfTtcbiAgICAvL1xuICAgIC8vICAgICAgIGF3YWl0IGJ1aWxkQ29tbWFuZChidWlsZE9wdGlvbnMpO1xuICAgIC8vXG4gICAgLy8gICAgICAgLy8gUnVuIGRldmVsb3BtZW50IHZhbGlkYXRpb24gaWYgcmVxdWVzdGVkXG4gICAgLy8gICAgICAgaWYgKG9wdGlvbnMuZGV2VmFsaWRhdGlvbikge1xuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coJ1xcblx1RDgzRFx1REQwRCBTdGFydGluZyBkZXZlbG9wbWVudCB2YWxpZGF0aW9uLi4uJyk7XG4gICAgLy8gICAgICAgICBjb25zdCBkZXZPcHRpb25zOiBEZXZWYWxpZGF0aW9uT3B0aW9ucyA9IHtcbiAgICAvLyAgICAgICAgICAgdGFyZ2V0czogW29wdGlvbnMudGFyZ2V0ID09PSAnYnJvd3NlcicgPyAncmVhY3QnIDogb3B0aW9ucy50YXJnZXRdLFxuICAgIC8vICAgICAgICAgICB3YXRjaDogZmFsc2UsIC8vIFNpbmdsZSBydW4gZm9yIGJ1aWxkIGNvbW1hbmRcbiAgICAvLyAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgIC8vICAgICAgICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXG4gICAgLy8gICAgICAgICB9O1xuICAgIC8vXG4gICAgLy8gICAgICAgICBjb25zdCB7IERldlZhbGlkYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJ0BiaW4vY29tbWFuZHMnKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IGRldlNlcnZpY2UgPSBuZXcgRGV2VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICAvLyAgICAgICAgIGF3YWl0IGRldlNlcnZpY2UucnVuVmFsaWRhdGlvbihkZXZPcHRpb25zLnRhcmdldHMhLCBkZXZPcHRpb25zLnZlcmJvc2UpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdCdWlsZCBmYWlsZWQ6JywgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAvLyAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pO1xuXG4gICAgLy8gSW5kaXZpZHVhbCB0YXJnZXQgYnVpbGQgY29tbWFuZHMgZm9yIGNvbnZlbmllbmNlXG4gICAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmJyb3dzZXInLCB0YXJnZXQ6ICdyZWFjdCcsIGRlc2M6ICdCdWlsZCBicm93c2VyIGJ1bmRsZSAoRVNNKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxhbWJkYScsIHRhcmdldDogJ2xhbWJkYScsIGRlc2M6ICdCdWlsZCBMYW1iZGEgYnVuZGxlIChDb21tb25KUyknIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDpsaWInLCB0YXJnZXQ6ICdsaWInLCBkZXNjOiAnQnVpbGQgbGlicmFyeSBidW5kbGUgKENvbW1vbkpTKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxpYi1lc20nLCB0YXJnZXQ6ICdsaWItZXNtJywgZGVzYzogJ0J1aWxkIGxpYnJhcnkgYnVuZGxlIChFU00pJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6aW5mcmEnLCB0YXJnZXQ6ICdpbmZyYScsIGRlc2M6ICdCdWlsZCBpbmZyYXN0cnVjdHVyZSBidW5kbGUnIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDpjbGknLCB0YXJnZXQ6ICdjbGknLCBkZXNjOiAnQnVpbGQgQ0xJIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmJpbicsIHRhcmdldDogJ2JpbicsIGRlc2M6ICdCdWlsZCBiaW4gdXRpbGl0aWVzIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmNkaycsIHRhcmdldDogJ2NkaycsIGRlc2M6ICdCdWlsZCBDREsgYXBwbGljYXRpb24gYnVuZGxlJyB9LFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdGFyZ2V0LCBkZXNjIH0gb2YgdGFyZ2V0cykge1xuICAgICAgdGhpcy5wcm9ncmFtXG4gICAgICAgIC5jb21tYW5kKG5hbWUpXG4gICAgICAgIC5kZXNjcmlwdGlvbihkZXNjKVxuICAgICAgICAub3B0aW9uKCctLWRldicsICdFbmFibGUgZGV2ZWxvcG1lbnQgbW9kZScsIGZhbHNlKVxuICAgICAgICAub3B0aW9uKCctLXNraXAtdmFsaWRhdGlvbicsICdTa2lwIGJ1bmRsZSB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0IGFzIGFueSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEdldCBjb25maWcgYW5kIGxvZ2dlciBmcm9tIHNvbWV3aGVyZSAtIHRoaXMgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgcHJvcGVybHlcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHt9IGFzIGFueTsgLy8gVE9ETzogR2V0IHByb3BlciBjb25maWdcbiAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGNvbnNvbGUgYXMgYW55OyAvLyBUT0RPOiBHZXQgcHJvcGVyIGxvZ2dlclxuXG4gICAgICAgICAgICBhd2FpdCBidWlsZENvbW1hbmQoYnVpbGRPcHRpb25zLCBjb25maWcsIGxvZ2dlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bmFtZX0gZmFpbGVkOmAsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZXZlbG9wbWVudCB2YWxpZGF0aW9uIGNvbW1hbmRcbiAgICB0aGlzLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdkZXY6dmFsaWRhdGUnKVxuICAgICAgLmRlc2NyaXB0aW9uKCdTdGFydCBkZXZlbG9wbWVudCBtb2RlIGJ1bmRsZSB2YWxpZGF0aW9uIHdpdGggcmVhbC10aW1lIGZlZWRiYWNrJylcbiAgICAgIC5vcHRpb24oJy10LCAtLXRhcmdldHMgPHRhcmdldHM+JywgJ0NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMgdG8gdmFsaWRhdGUnLCAncmVhY3QsbGFtYmRhJylcbiAgICAgIC5vcHRpb24oJy0tbm8td2F0Y2gnLCAnRGlzYWJsZSBmaWxlIHdhdGNoaW5nJywgZmFsc2UpXG4gICAgICAub3B0aW9uKCctLWludGVydmFsIDxtcz4nLCAnVmFsaWRhdGlvbiBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMnLCAnNTAwMCcpXG4gICAgICAub3B0aW9uKCctLW5vLWltbWVkaWF0ZScsICdTa2lwIGltbWVkaWF0ZSB2YWxpZGF0aW9uIG9uIHN0YXJ0dXAnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IG9wdGlvbnMudGFyZ2V0cy5zcGxpdCgnLCcpLm1hcCgodDogc3RyaW5nKSA9PiB0LnRyaW0oKSk7XG4gICAgICAgICAgY29uc3QgZGV2T3B0aW9uczogYW55ID0geyAvLyBUT0RPOiBVc2UgcHJvcGVyIERldlZhbGlkYXRpb25PcHRpb25zIHR5cGVcbiAgICAgICAgICAgIHRhcmdldHMsXG4gICAgICAgICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCxcbiAgICAgICAgICAgIGludGVydmFsOiBwYXJzZUludChvcHRpb25zLmludGVydmFsLCAxMCksXG4gICAgICAgICAgICBpbW1lZGlhdGU6IG9wdGlvbnMuaW1tZWRpYXRlLFxuICAgICAgICAgICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBhd2FpdCBkZXZWYWxpZGF0aW9uQ29tbWFuZChkZXZPcHRpb25zKTsgLy8gVE9ETzogSW1wbGVtZW50IGRldiB2YWxpZGF0aW9uXG4gICAgICAgICAgY29uc29sZS5sb2coJ0RldiB2YWxpZGF0aW9uIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZXZlbG9wbWVudCB2YWxpZGF0aW9uIGZhaWxlZDonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFB1cmVub3ctc3BlY2lmaWMgY29udGV4dCB3aXRoIGFsbCByZXF1aXJlZCBzZXJ2aWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUNvbnRleHQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0PihcbiAgICBnbG9iYWxPcHRzOiBHbG9iYWxPcHRpb25zLCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHB1cmVub3dDb250ZXh0ID1cbiAgICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUNvbnRleHQ8UHVyZW5vd0NsaUNvbnRleHQ+KHtcbiAgICAgICAgLi4uZ2xvYmFsT3B0cyxcbiAgICAgICAgY29uZmlnOiBnbG9iYWxPcHRzLmNvbmZpZyA/PyAncnVudGltZS5jb25maWcudHMnXG4gICAgICB9LCBjd2QpO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2VcbiAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZvciBkZXBsb3kgY29tbWFuZCAocmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzKVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlZmF1bHQgZGVwbG95bWVudCBiZWhhdmlvclxuICAgICAgY29uc3QgZGVwbG95bWVudFNlcnZpY2UgPSBuZXcgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50U2VydmljZS5kZXBsb3lDb21tYW5kKFxuICAgICAgICBjb250ZXh0LnN0YWNrc0RlcGxveVNlcnZpY2UsXG4gICAgICAgIG9wdGlvbnMgYXMgYW55LFxuICAgICAgICBjb250ZXh0LmNvbmZpZyxcbiAgICAgICAgY29udGV4dC5sb2dnZXIsXG4gICAgICAgIGNvbnRleHQuY3dkLFxuICAgICAgICBjb250ZXh0LmVudlZhbGlkYXRvcixcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KHJlc3VsdC5leGl0Q29kZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZm9yIGluaXQgY29tbWFuZCAodXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlKVxuICAgKi9cbiAgYXN5bmMgaW5pdENvbW1hbmQob3B0aW9uczogdW5rbm93biwgY21kOiBDb21tYW5kLCBzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBoZWxwIHdhcyByZXF1ZXN0ZWQgLSBsZXQgQ29tbWFuZGVyLmpzIGhhbmRsZSBpdFxuICAgIGlmICh0aGlzLmlzSGVscFJlcXVlc3RlZChjbWQpKSB7XG4gICAgICBjbWQuaGVscCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmdldENvbnRleHQob3B0aW9ucywgY21kKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgcnVudGltZS1zcGVjaWZpYyBpbml0IGNvbW1hbmQgd2l0aCBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gICAgICBjb25zdCBpbml0T3B0aW9ucyA9IG9wdGlvbnMgYXMgUnVudGltZUluaXRPcHRpb25zO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW50aW1lSW5pdENvbW1hbmQoXG4gICAgICAgIGluaXRPcHRpb25zLFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBwcm9jZXNzLmV4aXQocmVzdWx0LmV4aXRDb2RlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBmb3IgZGVzdHJveSBjb21tYW5kIChyZXF1aXJlcyBBV1MgY3JlZGVudGlhbHMpXG4gICAqL1xuICBhc3luYyBkZXN0cm95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCBhbmQgZXhlY3V0ZSBkZXN0cm95IGNvbW1hbmRcbiAgICAgIGNvbnN0IHsgZGVzdHJveUNvbW1hbmQgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmt0aWYvcHVyZW5vdy9iaW4nKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlc3Ryb3lDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ub3B0aW9ucyBhcyBhbnksXG4gICAgICAgICAgYmFja3VwRGlyOiAnLi8ucnVudGltZS1iYWNrdXBzJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdChyZXN1bHQuZXhpdENvZGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIENMSSB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKi9cbiAgYXN5bmMgcnVuKGFyZ3M/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvZ3JhbS5wYXJzZUFzeW5jKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBsb2dnaW5nIChubyBlbW9qaSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyKCk7XG4gICAgY29uc3QgdmVyYm9zZSA9ICEhcHJvY2Vzcy5lbnYuREVCVUc7XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lVGVtcGxhdGVFcnJvcikge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBmb3JtYXR0ZXIuZm9ybWF0VGVtcGxhdGVFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEVycm9yID0gZm9ybWF0dGVyLmZvcm1hdFRlbXBsYXRlU3RydWN0dXJlRXJyb3IoZXJyb3IsIHZlcmJvc2UpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRFcnJvcik7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRFcnJvciA9IGZvcm1hdHRlci5mb3JtYXRFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBlcnJvcjonLCBTdHJpbmcoZXJyb3IpKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIENMSSBpbnN0YW5jZSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgcHVyZW5vd1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVudGltZUNsaSgpOiBSdW50aW1lV2ViQ2xpIHtcbiAgcmV0dXJuIG5ldyBSdW50aW1lV2ViQ2xpKCk7XG59XG5cbi8vIC8qKlxuLy8gICogTWFpbiBDTEkgZW50cnkgcG9pbnQgdXNpbmcgcHJvcGVyIHB1cmVub3cgZXh0ZW5zaW9uXG4vLyAgKi9cbi8vIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuLy8gICB0cnkge1xuLy8gICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbi8vICAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG4vL1xuLy8gICAgIC8vIFBhcnNlIGFuZCBleGVjdXRlIENMSSBjb21tYW5kc1xuLy8gICAgIGF3YWl0IGNsaS5ydW4oKTtcbi8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICBQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4vLyAgIH1cbi8vIH1cblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuLy8gICBtYWluKCkuY2F0Y2goUHVyZW5vd1J1bnRpbWVDbGkuaGFuZGxlRXJyb3IpO1xuLy8gfVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFRlbXBsYXRlU2VydmljZSBhcyBQdXJlbm93VGVtcGxhdGVTZXJ2aWNlLCB0eXBlIFNjYWZmb2xkT3B0aW9ucywgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBSdW50aW1lVGVtcGxhdGVFcnJvciwgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IgfSBmcm9tICdAYmluL3V0aWxzL2Vycm9ycyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmb3IgY29tcGF0aWJpbGl0eVxuZXhwb3J0IHR5cGUgeyBTY2FmZm9sZE9wdGlvbnMsIFRlbXBsYXRlQ29udGV4dCB9O1xuXG4vKipcbiAqIFJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgc2VydmljZSB0aGF0IGV4dGVuZHMgcHVyZW5vdydzIFRlbXBsYXRlU2VydmljZVxuICogdG8gcmVzb2x2ZSB0ZW1wbGF0ZXMgZnJvbSB0aGUgcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0gaW5zdGVhZCBvZiBwdXJlbm93J3MuXG4gKiBcbiAqIFRoaXMgc2VydmljZSBhZGRyZXNzZXMgdGhlIGlzc3VlIHdoZXJlIGBAd29ya3RpZi9ydW50aW1lIGluaXRgIHdhcyB1c2luZ1xuICogcHVyZW5vdyB0ZW1wbGF0ZXMgaW5zdGVhZCBvZiBydW50aW1lLXNwZWNpZmljIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgZXh0ZW5kcyBQdXJlbm93VGVtcGxhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lVGVtcGxhdGVzRGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKSB7XG4gICAgc3VwZXIoY3dkKTtcblxuICAgIC8vIFJlc29sdmUgcnVudGltZSBwYWNrYWdlIHRlbXBsYXRlIGRpcmVjdG9yeVxuICAgIHRoaXMucnVudGltZVRlbXBsYXRlc0RpciA9IHRoaXMucmVzb2x2ZVJ1bnRpbWVUZW1wbGF0ZURpcmVjdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWZmb2xkIGEgbmV3IHByb2plY3QgdXNpbmcgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZXNcbiAgICogXG4gICAqIE92ZXJyaWRlcyB0aGUgcGFyZW50IG1ldGhvZCB0byB1c2UgcnVudGltZSB0ZW1wbGF0ZXMgZnJvbSB0aGVcbiAgICogcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0gaW5zdGVhZCBvZiBwdXJlbm93IHRlbXBsYXRlcy5cbiAgICogXG4gICAqIEltcGxlbWVudHMgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGFuZCBmYWxsYmFjayBzdHJhdGVnaWVzOlxuICAgKiAtIFZhbGlkYXRlcyB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAqIC0gUHJvdmlkZXMgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMgZm9yIHRyb3VibGVzaG9vdGluZ1xuICAgKiAtIEVuc3VyZXMgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZSByZXNvbHV0aW9uXG4gICAqL1xuICBhc3luYyBzY2FmZm9sZChcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXREaXI6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTY2FmZm9sZE9wdGlvbnMsXG4gICAgY29yZURpcjogc3RyaW5nID0gJ3J1bnRpbWUtd2ViJyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmFsaWRhdGUgcnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlVGVtcGxhdGVTdHJ1Y3R1cmUoY29yZURpcik7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IoXG4gICAgICAgIGBSdW50aW1lIHRlbXBsYXRlIGRpcmVjdG9yeSB2YWxpZGF0aW9uIGZhaWxlZGAsXG4gICAgICAgIHRoaXMucnVudGltZVRlbXBsYXRlc0RpcixcbiAgICAgICAgdmFsaWRhdGlvbi5lcnJvcnMsXG4gICAgICAgIGBFbnN1cmUgdGhlIHJ1bnRpbWUgcGFja2FnZSBpcyBwcm9wZXJseSBpbnN0YWxsZWQgYW5kIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJ1Y3R1cmVgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIGNvcmVEaXIsIHRlbXBsYXRlTmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBzcGVjaWZpYyB0ZW1wbGF0ZSBleGlzdHMgaW4gcnVudGltZSBwYWNrYWdlXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZVRlbXBsYXRlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlVGVtcGxhdGVzKGNvcmVEaXIpO1xuICAgICAgY29uc3QgcmVzb2x1dGlvbkluZm8gPSB0aGlzLmdldFRlbXBsYXRlUmVzb2x1dGlvbkluZm8oKTtcblxuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVUZW1wbGF0ZUVycm9yKFxuICAgICAgICBgUnVudGltZSB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZU5hbWV9JyBub3QgZm91bmRgLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUsXG4gICAgICAgIGNvcmVEaXIsXG4gICAgICAgIFt0ZW1wbGF0ZVBhdGhdLFxuICAgICAgICByZXNvbHV0aW9uSW5mby5wYWNrYWdlQ29udGV4dCB8fCAndW5rbm93bicsXG4gICAgICAgIHJlc29sdXRpb25JbmZvLnJlc29sdXRpb25TdHJhdGVneSxcbiAgICAgICAgYXZhaWxhYmxlVGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGBBdmFpbGFibGUgdGVtcGxhdGVzOiAke2F2YWlsYWJsZVRlbXBsYXRlcy5qb2luKCcsICcpfS4gVHJ5OiBydW50aW1lIGluaXQgPHByb2plY3QtbmFtZT4gLS10ZW1wbGF0ZSAke2F2YWlsYWJsZVRlbXBsYXRlc1swXX1gXG4gICAgICAgICAgOiBgTm8gdGVtcGxhdGVzIGZvdW5kIGluICcke2NvcmVEaXJ9Jy4gVGhlIHJ1bnRpbWUgcGFja2FnZSBtYXkgbm90IGJlIHByb3Blcmx5IGluc3RhbGxlZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRlbXBsYXRlIGRpcmVjdG9yeSBpcyBub3QgZW1wdHlcbiAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gZnMucmVhZGRpclN5bmModGVtcGxhdGVQYXRoKTtcbiAgICBpZiAodGVtcGxhdGVGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gdGhpcy5nZXRUZW1wbGF0ZVJlc29sdXRpb25JbmZvKCk7XG5cbiAgICAgIHRocm93IG5ldyBSdW50aW1lVGVtcGxhdGVFcnJvcihcbiAgICAgICAgYFJ1bnRpbWUgdGVtcGxhdGUgJyR7dGVtcGxhdGVOYW1lfScgZGlyZWN0b3J5IGlzIGVtcHR5YCxcbiAgICAgICAgdGVtcGxhdGVOYW1lLFxuICAgICAgICBjb3JlRGlyLFxuICAgICAgICBbdGVtcGxhdGVQYXRoXSxcbiAgICAgICAgcmVzb2x1dGlvbkluZm8ucGFja2FnZUNvbnRleHQgfHwgJ3Vua25vd24nLFxuICAgICAgICByZXNvbHV0aW9uSW5mby5yZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgICAgIGBUaGlzIGluZGljYXRlcyBhIGNvcnJ1cHRlZCBvciBpbmNvbXBsZXRlIHRlbXBsYXRlIGluc3RhbGxhdGlvbi4gVHJ5IHJlaW5zdGFsbGluZyB0aGUgcnVudGltZSBwYWNrYWdlLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBwYXJlbnQgY2xhc3MgbG9naWMgYnV0IHdpdGggcnVudGltZSB0ZW1wbGF0ZSBwYXRoXG4gICAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSBvdmVycmlkZSB0aGUgdGVtcGxhdGVzRGlyIGZvciB0aGlzIG9wZXJhdGlvblxuICAgIGNvbnN0IG9yaWdpbmFsVGVtcGxhdGVzRGlyID0gKHRoaXMgYXMgYW55KS50ZW1wbGF0ZXNEaXI7XG4gICAgKHRoaXMgYXMgYW55KS50ZW1wbGF0ZXNEaXIgPSB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXI7XG5cbiAgICB0cnkge1xuICAgICAgLy8gT3ZlcnJpZGUgdGhlIGNvcHlUZW1wbGF0ZUZpbGVzIG1ldGhvZCB0byBpbmNsdWRlIHJ1bnRpbWUtc3BlY2lmaWMgdmFyaWFibGVzXG4gICAgICBjb25zdCBvcmlnaW5hbENvcHlUZW1wbGF0ZUZpbGVzID0gKHRoaXMgYXMgYW55KS5jb3B5VGVtcGxhdGVGaWxlcztcbiAgICAgICh0aGlzIGFzIGFueSkuY29weVRlbXBsYXRlRmlsZXMgPSBhc3luYyAoc291cmNlUGF0aDogc3RyaW5nLCB0YXJnZXRQYXRoOiBzdHJpbmcsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCkgPT4ge1xuICAgICAgICAvLyBBZGQgcnVudGltZS1zcGVjaWZpYyB2YXJpYWJsZXMgdG8gdGhlIGNvbnRleHRcbiAgICAgICAgY29uc3QgcnVudGltZUNvbnRleHQgPSB7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICBwYWNrYWdlVmVyc2lvbjogdGhpcy5nZXRSdW50aW1lUGFja2FnZVZlcnNpb24oKSxcbiAgICAgICAgICBQVVJFTk9XX1ZFUlNJT046IHRoaXMuZ2V0UnVudGltZVBhY2thZ2VWZXJzaW9uKCksXG4gICAgICAgICAgU1RBQ0tfTkFNRTogY29udGV4dC5wcm9qZWN0TmFtZSxcbiAgICAgICAgICBQUk9KRUNUX05BTUU6IGNvbnRleHQucHJvamVjdE5hbWUsXG4gICAgICAgICAgUkVHSU9OOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICBFTkFCTEVfU0VPOiAnZmFsc2UnLFxuICAgICAgICAgIFNUQUdFOiAnZGV2JyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsQ29weVRlbXBsYXRlRmlsZXMuY2FsbCh0aGlzLCBzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBydW50aW1lQ29udGV4dCk7XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBzdXBlci5zY2FmZm9sZCh0ZW1wbGF0ZU5hbWUsIHRhcmdldERpciwgb3B0aW9ucywgY29yZURpcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgdGVtcGxhdGVzRGlyXG4gICAgICAodGhpcyBhcyBhbnkpLnRlbXBsYXRlc0RpciA9IG9yaWdpbmFsVGVtcGxhdGVzRGlyO1xuICAgIH1cbiAgfVxuXG5cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgcnVudGltZSBwYWNrYWdlJ3MgdGVtcGxhdGUgZGlyZWN0b3J5XG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBkZXRlY3RzIHRoZSBydW50aW1lIHBhY2thZ2UgY29udGV4dCBhbmQgZmluZHMgdGhlIGNvcnJlY3RcbiAgICogdGVtcGxhdGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0uXG4gICAqIFxuICAgKiBJbXBsZW1lbnRzIG11bHRpcGxlIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIHJvYnVzdCB0ZW1wbGF0ZSBwYXRoIGRldGVjdGlvbjpcbiAgICogMS4gUGFja2FnZS5qc29uIGRldGVjdGlvbiAobW9zdCByZWxpYWJsZSlcbiAgICogMi4gTW9kdWxlIGxvY2F0aW9uLWJhc2VkIGRldGVjdGlvblxuICAgKiAzLiBOb2RlLmpzIG1vZHVsZSByZXNvbHV0aW9uXG4gICAqIDQuIEVudmlyb25tZW50LWJhc2VkIGRldGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUnVudGltZVRlbXBsYXRlRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0czogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IHN0cmF0ZWd5OiBzdHJpbmc7IHZhbGlkOiBib29sZWFuIH0+ID0gW107XG5cbiAgICAvLyBTdHJhdGVneSAxOiBQYWNrYWdlLmpzb24gZGV0ZWN0aW9uIChtb3N0IHJlbGlhYmxlKVxuICAgIGNvbnN0IHBhY2thZ2VCYXNlZFBhdGggPSB0aGlzLmRldGVjdFJ1bnRpbWVQYWNrYWdlUm9vdCgpO1xuICAgIGlmIChwYWNrYWdlQmFzZWRQYXRoKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZXNQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VCYXNlZFBhdGgsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpO1xuICAgICAgc2VhcmNoUGF0aHMucHVzaCh0ZW1wbGF0ZXNQYXRoKTtcbiAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHBhdGg6IHRlbXBsYXRlc1BhdGgsXG4gICAgICAgIHN0cmF0ZWd5OiAncGFja2FnZS5qc29uIGRldGVjdGlvbicsXG4gICAgICAgIHZhbGlkOiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkodGVtcGxhdGVzUGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IDI6IE1vZHVsZSBsb2NhdGlvbi1iYXNlZCBkZXRlY3Rpb25cbiAgICBjb25zdCBtb2R1bGVCYXNlZFBhdGhzID0gdGhpcy5nZXRNb2R1bGVCYXNlZFBhdGhzKCk7XG4gICAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIG1vZHVsZUJhc2VkUGF0aHMpIHtcbiAgICAgIHNlYXJjaFBhdGhzLnB1c2gobW9kdWxlUGF0aCk7XG4gICAgICBzZWFyY2hSZXN1bHRzLnB1c2goe1xuICAgICAgICBwYXRoOiBtb2R1bGVQYXRoLFxuICAgICAgICBzdHJhdGVneTogJ21vZHVsZSBsb2NhdGlvbicsXG4gICAgICAgIHZhbGlkOiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkobW9kdWxlUGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IDM6IE5vZGUuanMgbW9kdWxlIHJlc29sdXRpb25cbiAgICBjb25zdCBub2RlTW9kdWxlUGF0aHMgPSB0aGlzLmdldE5vZGVNb2R1bGVQYXRocygpO1xuICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZVBhdGggb2Ygbm9kZU1vZHVsZVBhdGhzKSB7XG4gICAgICBzZWFyY2hQYXRocy5wdXNoKG5vZGVNb2R1bGVQYXRoKTtcbiAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHBhdGg6IG5vZGVNb2R1bGVQYXRoLFxuICAgICAgICBzdHJhdGVneTogJ25vZGVfbW9kdWxlcyByZXNvbHV0aW9uJyxcbiAgICAgICAgdmFsaWQ6IHRoaXMudmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeShub2RlTW9kdWxlUGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IDQ6IEVudmlyb25tZW50LWJhc2VkIGRldGVjdGlvblxuICAgIGNvbnN0IGVudkJhc2VkUGF0aHMgPSB0aGlzLmdldEVudmlyb25tZW50QmFzZWRQYXRocygpO1xuICAgIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZCYXNlZFBhdGhzKSB7XG4gICAgICBzZWFyY2hQYXRocy5wdXNoKGVudlBhdGgpO1xuICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgcGF0aDogZW52UGF0aCxcbiAgICAgICAgc3RyYXRlZ3k6ICdlbnZpcm9ubWVudCBkZXRlY3Rpb24nLFxuICAgICAgICB2YWxpZDogdGhpcy52YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KGVudlBhdGgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBmaXJzdCB2YWxpZCBwYXRoXG4gICAgY29uc3QgdmFsaWRSZXN1bHQgPSBzZWFyY2hSZXN1bHRzLmZpbmQocmVzdWx0ID0+IHJlc3VsdC52YWxpZCk7XG5cbiAgICBpZiAodmFsaWRSZXN1bHQpIHtcbiAgICAgIHJldHVybiB2YWxpZFJlc3VsdC5wYXRoO1xuICAgIH1cblxuICAgIC8vIElmIG5vIHZhbGlkIHBhdGggZm91bmQsIHByb3ZpZGUgZGV0YWlsZWQgZXJyb3IgaW5mb3JtYXRpb25cbiAgICBjb25zdCBzZWFyY2hlZFBhdGhzID0gc2VhcmNoUmVzdWx0cy5tYXAocmVzdWx0ID0+IHJlc3VsdC5wYXRoKTtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHRoaXMuZGV0ZWN0UnVudGltZVBhY2thZ2VSb290KCk7XG5cbiAgICB0aHJvdyBuZXcgUnVudGltZVRlbXBsYXRlRXJyb3IoXG4gICAgICBgUnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IG5vdCBmb3VuZGAsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAncnVudGltZS13ZWInLFxuICAgICAgc2VhcmNoZWRQYXRocyxcbiAgICAgIHBhY2thZ2VSb290IHx8ICd1bmtub3duJyxcbiAgICAgICdjb21wcmVoZW5zaXZlIHNlYXJjaCcsXG4gICAgICBgRW5zdXJlIEB3b3JrdGlmL3J1bnRpbWUgcGFja2FnZSBpcyBwcm9wZXJseSBpbnN0YWxsZWQgd2l0aCB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHJ1bnRpbWUgcGFja2FnZSByb290IGJ5IHNlYXJjaGluZyBmb3IgcGFja2FnZS5qc29uIHdpdGggQHdvcmt0aWYvcnVudGltZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnREaXIgPSBfX2Rpcm5hbWU7XG5cbiAgICAvLyBTZWFyY2ggdXAgdGhlIGRpcmVjdG9yeSB0cmVlIGZvciBwYWNrYWdlLmpzb25cbiAgICB3aGlsZSAoY3VycmVudERpciAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgICBpZiAocGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3b3JrdGlmL3J1bnRpbWUnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gQ29udGludWUgc2VhcmNoaW5nIGlmIEpTT04gcGFyc2UgZmFpbHNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3NzaWJsZSB0ZW1wbGF0ZSBwYXRocyBiYXNlZCBvbiBtb2R1bGUgbG9jYXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0TW9kdWxlQmFzZWRQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIGluc3RhbGxlZCBydW50aW1lIHBhY2thZ2VcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIHNvdXJjZSBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIEFsdGVybmF0aXZlOiByZWxhdGl2ZSB0byB0aGUgcnVudGltZSBwYWNrYWdlIHJvb3RcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdiaW4nLCAndGVtcGxhdGVzJyksXG4gICAgICAvLyBCdW5kbGVkIGxvY2F0aW9uXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3NzaWJsZSB0ZW1wbGF0ZSBwYXRocyBmcm9tIG5vZGVfbW9kdWxlcyByZXNvbHV0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldE5vZGVNb2R1bGVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHJlc29sdmUgQHdvcmt0aWYvcnVudGltZSBwYWNrYWdlXG4gICAgICBjb25zdCBydW50aW1lUGFja2FnZVBhdGggPSByZXF1aXJlLnJlc29sdmUoJ0B3b3JrdGlmL3J1bnRpbWUvcGFja2FnZS5qc29uJyk7XG4gICAgICBjb25zdCBydW50aW1lUm9vdCA9IHBhdGguZGlybmFtZShydW50aW1lUGFja2FnZVBhdGgpO1xuICAgICAgcGF0aHMucHVzaChwYXRoLmpvaW4ocnVudGltZVJvb3QsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKHJ1bnRpbWVSb290LCAnb3V0JywgJ2Rpc3QnLCAnYmluJywgJ3RlbXBsYXRlcycpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUGFja2FnZSBub3QgZm91bmQgaW4gbm9kZV9tb2R1bGVzLCBjb250aW51ZSB3aXRoIG90aGVyIHN0cmF0ZWdpZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3NpYmxlIHRlbXBsYXRlIHBhdGhzIGJhc2VkIG9uIGVudmlyb25tZW50XG4gICAqL1xuICBwcml2YXRlIGdldEVudmlyb25tZW50QmFzZWRQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDaGVjayBpZiBydW5uaW5nIGZyb20gQ0xJIGJpbmFyeVxuICAgIGlmIChwcm9jZXNzLmFyZ3ZbMV0pIHtcbiAgICAgIGNvbnN0IGNsaVBhdGggPSBwYXRoLmRpcm5hbWUocHJvY2Vzcy5hcmd2WzFdKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKGNsaVBhdGgsICd0ZW1wbGF0ZXMnKSk7XG4gICAgICBwYXRocy5wdXNoKHBhdGguam9pbihjbGlQYXRoLCAnLi4nLCAndGVtcGxhdGVzJykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgICBwYXRocy5wdXNoKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSk7XG4gICAgcGF0aHMucHVzaChwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcycsICdAd29ya3RpZicsICdydW50aW1lJywgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJykpO1xuXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgYSB0ZW1wbGF0ZSBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGRpcmVjdG9yeVxuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKHRlbXBsYXRlUGF0aCk7XG4gICAgICBpZiAoIXN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJ1bnRpbWUtd2ViIHN1YmRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHJ1bnRpbWVXZWJQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aCwgJ3J1bnRpbWUtd2ViJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocnVudGltZVdlYlBhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgcnVudGltZS13ZWIgY29udGFpbnMgdGVtcGxhdGUgZGlyZWN0b3JpZXNcbiAgICAgIGNvbnN0IHJ1bnRpbWVXZWJTdGF0ID0gZnMuc3RhdFN5bmMocnVudGltZVdlYlBhdGgpO1xuICAgICAgaWYgKCFydW50aW1lV2ViU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHJ1bnRpbWUtd2ViIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVEaXJzID0gZnMucmVhZGRpclN5bmMocnVudGltZVdlYlBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSk7XG5cbiAgICAgIHJldHVybiB0ZW1wbGF0ZURpcnMubGVuZ3RoID4gMDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG5cblxuICAvKipcbiAgICogR2V0IGF2YWlsYWJsZSB0ZW1wbGF0ZXMgaW4gdGhlIHNwZWNpZmllZCBjb3JlIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdmFpbGFibGVUZW1wbGF0ZXMoY29yZURpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb3JlUGF0aCA9IHBhdGguam9pbih0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIGNvcmVEaXIpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvcmVQYXRoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhjb3JlUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICogXG4gICAqIFBlcmZvcm1zIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZTpcbiAgICogLSBWZXJpZmllcyBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlXG4gICAqIC0gVmFsaWRhdGVzIHJ1bnRpbWUtd2ViIHN1YmRpcmVjdG9yeSBleGlzdHNcbiAgICogLSBDaGVja3MgdGhhdCB0ZW1wbGF0ZXMgY29udGFpbiByZXF1aXJlZCBmaWxlc1xuICAgKiAtIFZhbGlkYXRlcyB0ZW1wbGF0ZSBzdHJ1Y3R1cmUgaW50ZWdyaXR5XG4gICAqL1xuICB2YWxpZGF0ZVJ1bnRpbWVUZW1wbGF0ZXMoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkodGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYSBzcGVjaWZpYyBjb3JlIGRpcmVjdG9yeVxuICAgKi9cbiAgdmFsaWRhdGVUZW1wbGF0ZVN0cnVjdHVyZShjb3JlRGlyOiBzdHJpbmcgPSAncnVudGltZS13ZWInKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgbWFpbiB0ZW1wbGF0ZXMgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMucnVudGltZVRlbXBsYXRlc0RpcikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYFRlbXBsYXRlcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7dGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyfWApO1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBjb3JlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IGNvcmVQYXRoID0gcGF0aC5qb2luKHRoaXMucnVudGltZVRlbXBsYXRlc0RpciwgY29yZURpcik7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29yZVBhdGgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBDb3JlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJHtjb3JlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgY29yZSBkaXJlY3RvcnkgaXMgYWN0dWFsbHkgYSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGNvcmVTdGF0ID0gZnMuc3RhdFN5bmMoY29yZVBhdGgpO1xuICAgICAgaWYgKCFjb3JlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBDb3JlIHBhdGggaXMgbm90IGEgZGlyZWN0b3J5OiAke2NvcmVQYXRofWApO1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgYXZhaWxhYmxlIHRlbXBsYXRlc1xuICAgICAgY29uc3QgdGVtcGxhdGVEaXJzID0gZnMucmVhZGRpclN5bmMoY29yZVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSk7XG5cbiAgICAgIGlmICh0ZW1wbGF0ZURpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBObyB0ZW1wbGF0ZSBkaXJlY3RvcmllcyBmb3VuZCBpbjogJHtjb3JlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZWFjaCB0ZW1wbGF0ZSBkaXJlY3RvcnlcbiAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVEaXIgb2YgdGVtcGxhdGVEaXJzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihjb3JlUGF0aCwgdGVtcGxhdGVEaXIpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gZnMucmVhZGRpclN5bmModGVtcGxhdGVQYXRoKTtcblxuICAgICAgICBpZiAodGVtcGxhdGVGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgVGVtcGxhdGUgZGlyZWN0b3J5IGlzIGVtcHR5OiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCwgZXJyb3JzIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBWYWxpZGF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVzb2x2ZWQgcnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIGdldFJ1bnRpbWVUZW1wbGF0ZXNEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcnVudGltZSBwYWNrYWdlIHZlcnNpb24gZm9yIHRlbXBsYXRlIHN1YnN0aXR1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSdW50aW1lUGFja2FnZVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2ZXJzaW9uIGZyb20gcnVudGltZSBwYWNrYWdlLmpzb25cbiAgICAgIGNvbnN0IHBhY2thZ2VSb290ID0gdGhpcy5kZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTtcbiAgICAgIGlmIChwYWNrYWdlUm9vdCkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ocGFja2FnZVJvb3QsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgICAgICAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMy4wJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogdHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVQYWNrYWdlUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHdvcmt0aWYvcnVudGltZS9wYWNrYWdlLmpzb24nKTtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhydW50aW1lUGFja2FnZVBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMy4wJztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGaW5hbCBmYWxsYmFja1xuICAgICAgICByZXR1cm4gJzAuMy4wJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAnMC4zLjAnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGVtcGxhdGUgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAqL1xuICBnZXRUZW1wbGF0ZVJlc29sdXRpb25JbmZvKCk6IHtcbiAgICBydW50aW1lVGVtcGxhdGVzRGlyOiBzdHJpbmc7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBhdmFpbGFibGVDb3Jlczogc3RyaW5nW107XG4gICAgcGFja2FnZUNvbnRleHQ6IHN0cmluZyB8IG51bGw7XG4gICAgcmVzb2x1dGlvblN0cmF0ZWd5OiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gdGhpcy5kZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTtcblxuICAgIC8vIERldGVybWluZSB3aGljaCByZXNvbHV0aW9uIHN0cmF0ZWd5IHdhcyB1c2VkXG4gICAgbGV0IHJlc29sdXRpb25TdHJhdGVneSA9ICd1bmtub3duJztcbiAgICBpZiAocGFja2FnZVJvb3QgJiYgdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLmluY2x1ZGVzKHBhY2thZ2VSb290KSkge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ3BhY2thZ2UuanNvbiBkZXRlY3Rpb24nO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSkge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ25vZGVfbW9kdWxlcyByZXNvbHV0aW9uJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucnVudGltZVRlbXBsYXRlc0Rpci5pbmNsdWRlcyhfX2Rpcm5hbWUpKSB7XG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3kgPSAnbW9kdWxlIGxvY2F0aW9uJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ2Vudmlyb25tZW50IGRldGVjdGlvbic7XG4gICAgfVxuXG4gICAgLy8gR2V0IGF2YWlsYWJsZSBjb3JlIGRpcmVjdG9yaWVzXG4gICAgY29uc3QgYXZhaWxhYmxlQ29yZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMucnVudGltZVRlbXBsYXRlc0RpcikpIHtcbiAgICAgICAgYXZhaWxhYmxlQ29yZXMucHVzaCguLi5mcy5yZWFkZGlyU3luYyh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAubWFwKGVudHJ5ID0+IGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgd2hlbiByZWFkaW5nIGRpcmVjdG9yeVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBydW50aW1lVGVtcGxhdGVzRGlyOiB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsXG4gICAgICBpc1ZhbGlkOiB0aGlzLnZhbGlkYXRlUnVudGltZVRlbXBsYXRlcygpLFxuICAgICAgYXZhaWxhYmxlQ29yZXMsXG4gICAgICBwYWNrYWdlQ29udGV4dDogcGFja2FnZVJvb3QsXG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgfTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgYXMgVGVtcGxhdGVTZXJ2aWNlIGZvciBjb21wYXRpYmlsaXR5XG5leHBvcnQgeyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIGFzIFRlbXBsYXRlU2VydmljZSB9O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgUnVudGltZSBDTEkgZXJyb3JzXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDbGlFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nXG4gKiBFeHRlbmRzIHB1cmVub3cgQ29uZmlnRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNvbmZpZ0Vycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfQ09ORklHX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGJ1aWxkIG9wZXJhdGlvbnMgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IEJ1aWxkRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUJ1aWxkRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9CVUlMRF9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQnVpbGRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGRlcGxveW1lbnQgb3BlcmF0aW9ucyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgRGVwbG95bWVudEVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9ERVBMT1lNRU5UX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgdG8gbWF0Y2ggcHVyZW5vdyBwYXR0ZXJuc1xuICovXG5leHBvcnQgY2xhc3MgRGVwbG95bWVudEVycm9yIGV4dGVuZHMgUnVudGltZURlcGxveW1lbnRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB2YWxpZGF0aW9uIGNoZWNrcyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgVmFsaWRhdGlvbkVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9WQUxJREFUSU9OX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB0ZW1wbGF0ZSByZXNvbHV0aW9uIGZhaWxzXG4gKiBQcm92aWRlcyBkZXRhaWxlZCBjb250ZXh0IGFib3V0IHBhY2thZ2UgcmVzb2x1dGlvbiBhbmQgc2VhcmNoZWQgcGF0aHNcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVUZW1wbGF0ZUVycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZU5hbWU/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvcmVEaXI/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNlYXJjaGVkUGF0aHM/OiBzdHJpbmdbXSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFja2FnZUNvbnRleHQ/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc29sdXRpb25TdHJhdGVneT86IHN0cmluZyxcbiAgICBoaW50Pzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9URU1QTEFURV9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lVGVtcGxhdGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIHRlbXBsYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgaW52YWxpZFxuICogUHJvdmlkZXMgZGV0YWlsZWQgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHRyb3VibGVzaG9vdGluZyBndWlkYW5jZVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlRGlyPzogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWxpZGF0aW9uRXJyb3JzPzogc3RyaW5nW10sXG4gICAgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfVEVNUExBVEVfU1RSVUNUVVJFX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEZyaWVuZGx5IGVycm9yIGZvcm1hdHRlciBmb3IgcnVudGltZSB3b3Jrc3BhY2VcbiAqIEZvbGxvd3MgcHVyZW5vdyBGcmllbmRseUVycm9yRm9ybWF0dGVyIHBhdHRlcm4gd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIge1xuICAvKipcbiAgICogRm9ybWF0IGVycm9yIGFzIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugd2l0aG91dCBlbW9qaVxuICAgKi9cbiAgZm9ybWF0RXJyb3IoZXJyb3I6IEVycm9yLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSGVhZGVyIHdpdGhvdXQgZW1vamlcbiAgICBsaW5lcy5wdXNoKGBFcnJvcjogJHtlcnJvci5uYW1lIHx8ICdSdW50aW1lRXJyb3InfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gRXJyb3IgbWVzc2FnZVxuICAgIGxpbmVzLnB1c2goYE1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIEhpbnQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZUNsaUVycm9yICYmIGVycm9yLmhpbnQpIHtcbiAgICAgIGxpbmVzLnB1c2goYEhpbnQ6ICR7ZXJyb3IuaGludH1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIFN0YWNrIHRyYWNlIGluIHZlcmJvc2UgbW9kZVxuICAgIGlmICh2ZXJib3NlICYmIGVycm9yLnN0YWNrKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gU3RhY2sgVHJhY2UgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGVycm9yLnN0YWNrKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdmFsaWRhdGlvbiBlcnJvciB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXRWYWxpZGF0aW9uRXJyb3IoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ1ZhbGlkYXRpb24gRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBGaWVsZDogJHtmaWVsZE5hbWV9YCk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7bWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBGaWVsZCB2YWxpZGF0aW9uIGZhaWxlZCBmb3I6ICR7ZmllbGROYW1lfWApO1xuICAgICAgbGluZXMucHVzaChgVmFsaWRhdGlvbiBtZXNzYWdlOiAke21lc3NhZ2V9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGRlcGxveW1lbnQgZXJyb3Igd2l0aG91dCBlbW9qaVxuICAgKi9cbiAgZm9ybWF0RGVwbG95bWVudEVycm9yKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCdEZXBsb3ltZW50IEVycm9yJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgU3RhY2s6ICR7c3RhY2tOYW1lfWApO1xuICAgIGxpbmVzLnB1c2goYE9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7bWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGxpbmVzLnB1c2goJ1Ryb3VibGVzaG9vdGluZzonKTtcbiAgICBsaW5lcy5wdXNoKCcxLiBDaGVjayBBV1MgY3JlZGVudGlhbHMgYW5kIHBlcm1pc3Npb25zJyk7XG4gICAgbGluZXMucHVzaCgnMi4gVmVyaWZ5IHN0YWNrIGNvbmZpZ3VyYXRpb24nKTtcbiAgICBsaW5lcy5wdXNoKCczLiBSZXZpZXcgQ2xvdWRGb3JtYXRpb24gZXZlbnRzIGluIEFXUyBDb25zb2xlJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbGluZXMucHVzaCgnLS0tIFRlY2huaWNhbCBEZXRhaWxzICgtLXZlcmJvc2UpIC0tLScpO1xuICAgICAgbGluZXMucHVzaChgU3RhY2sgbmFtZTogJHtzdGFja05hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKGBGYWlsZWQgb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICAgIGxpbmVzLnB1c2goYEVycm9yIGRldGFpbHM6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgcnVudGltZSB0ZW1wbGF0ZSBlcnJvciB3aXRoIGRldGFpbGVkIGNvbnRleHRcbiAgICovXG4gIGZvcm1hdFRlbXBsYXRlRXJyb3IoZXJyb3I6IFJ1bnRpbWVUZW1wbGF0ZUVycm9yLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnUnVudGltZSBUZW1wbGF0ZSBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYElzc3VlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBUZW1wbGF0ZSBjb250ZXh0XG4gICAgaWYgKGVycm9yLnRlbXBsYXRlTmFtZSkge1xuICAgICAgbGluZXMucHVzaChgVGVtcGxhdGU6ICR7ZXJyb3IudGVtcGxhdGVOYW1lfWApO1xuICAgIH1cbiAgICBpZiAoZXJyb3IuY29yZURpcikge1xuICAgICAgbGluZXMucHVzaChgQ29yZSBEaXJlY3Rvcnk6ICR7ZXJyb3IuY29yZURpcn1gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLnBhY2thZ2VDb250ZXh0KSB7XG4gICAgICBsaW5lcy5wdXNoKGBQYWNrYWdlIENvbnRleHQ6ICR7ZXJyb3IucGFja2FnZUNvbnRleHR9YCk7XG4gICAgfVxuICAgIGlmIChlcnJvci5yZXNvbHV0aW9uU3RyYXRlZ3kpIHtcbiAgICAgIGxpbmVzLnB1c2goYFJlc29sdXRpb24gU3RyYXRlZ3k6ICR7ZXJyb3IucmVzb2x1dGlvblN0cmF0ZWd5fWApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIFNlYXJjaGVkIHBhdGhzXG4gICAgaWYgKGVycm9yLnNlYXJjaGVkUGF0aHMgJiYgZXJyb3Iuc2VhcmNoZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdTZWFyY2hlZCBQYXRoczonKTtcbiAgICAgIGVycm9yLnNlYXJjaGVkUGF0aHMuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgbGluZXMucHVzaChgICAtICR7cGF0aH1gKTtcbiAgICAgIH0pO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVHJvdWJsZXNob290aW5nIGd1aWRhbmNlXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIEVuc3VyZSBAd29ya3RpZi9ydW50aW1lIHBhY2thZ2UgaXMgcHJvcGVybHkgaW5zdGFsbGVkJyk7XG4gICAgbGluZXMucHVzaCgnMi4gVmVyaWZ5IHRoZSBwYWNrYWdlIGNvbnRhaW5zIHNyYy9iaW4vdGVtcGxhdGVzL3J1bnRpbWUtd2ViLyBkaXJlY3RvcnknKTtcbiAgICBsaW5lcy5wdXNoKCczLiBDaGVjayB0aGF0IHJ1bnRpbWUtd2ViIGRpcmVjdG9yeSBjb250YWlucyB0ZW1wbGF0ZSBzdWJkaXJlY3RvcmllcycpO1xuICAgIGxpbmVzLnB1c2goJzQuIElmIHJ1bm5pbmcgZnJvbSBzb3VyY2UsIGVuc3VyZSB5b3VcXCdyZSBpbiB0aGUgcnVudGltZSBwYWNrYWdlIGRpcmVjdG9yeScpO1xuICAgIGxpbmVzLnB1c2goJzUuIFRyeSByZWluc3RhbGxpbmcgdGhlIHJ1bnRpbWUgcGFja2FnZTogbnBtIGluc3RhbGwgQHdvcmt0aWYvcnVudGltZScpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEVycm9yIGNvZGU6ICR7ZXJyb3IuY29kZX1gKTtcbiAgICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICBsaW5lcy5wdXNoKCdTdGFjayB0cmFjZTonKTtcbiAgICAgICAgbGluZXMucHVzaChlcnJvci5zdGFjayk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJ1bnRpbWUgdGVtcGxhdGUgc3RydWN0dXJlIGVycm9yIHdpdGggdmFsaWRhdGlvbiBkZXRhaWxzXG4gICAqL1xuICBmb3JtYXRUZW1wbGF0ZVN0cnVjdHVyZUVycm9yKGVycm9yOiBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciwgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ1J1bnRpbWUgVGVtcGxhdGUgU3RydWN0dXJlIEVycm9yJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmIChlcnJvci50ZW1wbGF0ZURpcikge1xuICAgICAgbGluZXMucHVzaChgVGVtcGxhdGUgRGlyZWN0b3J5OiAke2Vycm9yLnRlbXBsYXRlRGlyfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGlvbiBlcnJvcnNcbiAgICBpZiAoZXJyb3IudmFsaWRhdGlvbkVycm9ycyAmJiBlcnJvci52YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJ1ZhbGlkYXRpb24gRXJyb3JzOicpO1xuICAgICAgZXJyb3IudmFsaWRhdGlvbkVycm9ycy5mb3JFYWNoKHZhbGlkYXRpb25FcnJvciA9PiB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgLSAke3ZhbGlkYXRpb25FcnJvcn1gKTtcbiAgICAgIH0pO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVHJvdWJsZXNob290aW5nIGd1aWRhbmNlXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIFZlcmlmeSB0aGUgcnVudGltZSBwYWNrYWdlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZScpO1xuICAgIGxpbmVzLnB1c2goJzIuIENoZWNrIHRoYXQgc3JjL2Jpbi90ZW1wbGF0ZXMvcnVudGltZS13ZWIvIGV4aXN0cyBpbiB0aGUgcGFja2FnZScpO1xuICAgIGxpbmVzLnB1c2goJzMuIEVuc3VyZSB0ZW1wbGF0ZSBkaXJlY3RvcmllcyBjb250YWluIHRoZSByZXF1aXJlZCBmaWxlcycpO1xuICAgIGxpbmVzLnB1c2goJzQuIFRyeSByZWluc3RhbGxpbmc6IG5wbSBpbnN0YWxsIEB3b3JrdGlmL3J1bnRpbWUnKTtcbiAgICBsaW5lcy5wdXNoKCc1LiBJZiBkZXZlbG9waW5nIGxvY2FsbHksIGVuc3VyZSB0ZW1wbGF0ZXMgYXJlIGJ1aWx0IGNvcnJlY3RseScpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEVycm9yIGNvZGU6ICR7ZXJyb3IuY29kZX1gKTtcbiAgICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICBsaW5lcy5wdXNoKCdTdGFjayB0cmFjZTonKTtcbiAgICAgICAgbGluZXMucHVzaChlcnJvci5zdGFjayk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmVkIGxvZ2dlciBmb3IgcnVudGltZSB3b3Jrc3BhY2VcbiAqIEZvbGxvd3MgcHVyZW5vdyBsb2dnaW5nIHBhdHRlcm5zIHdpdGhvdXQgZW1vamlcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGNvbnN0IGxvZ0VudHJ5ID0ge1xuICAgICAgbGV2ZWw6ICd3YXJuJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLndhcm4oSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmICghdGhpcy52ZXJib3NlKSByZXR1cm47XG5cbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnNvbGUuZGVidWcoSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgUHVyZW5vd0luZnJhUmVzb3VyY2VPcHRpb25zLCBQdXJlbm93SW5mcmFSZXNvdXJjZXMgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2luZnJhJztcbmltcG9ydCB7IHNhbml0aXplU3RhY2tOYW1lIH0gZnJvbSAnQHV0aWxzL3N0YWNrLW5hbWUtc2FuaXRpemVyJztcbmltcG9ydCB7XG4gIERlcGxveW1lbnRFcnJvcixcbiAgdHlwZSBEZXBsb3ltZW50T3V0cHV0cyxcbiAgZ2V0U3RhZ2UsXG4gIFN0YWNrc0RlcGxveU9wdGlvbnMsIFN0YWNrc0RlcGxveVJlc3VsdCxcbiAgU3RhY2tzRGVwbG95U2VydmljZSxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cywgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHlwZXMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgZXh0ZW5kcyBTdGFja3NEZXBsb3lTZXJ2aWNlIGltcGxlbWVudHMgUHVyZW5vd0luZnJhUmVzb3VyY2VzIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERFRkFVTFRfQ0RLX0RJUiA9ICdjZGsnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFR3b1N0YWNrRGVwbG95U2VydmljZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGN3ZCAtIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHByb2plY3Qgcm9vdClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICBzdXBlcihjd2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGZpcnN0IGRlcGxveW1lbnQgd29ya2Zsb3c6IGRlcGxveSBJbmZyYSBcdTIxOTIgcmVhZCBvdXRwdXRzIFx1MjE5MiBkZXBsb3kgUnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICogQHBhcmFtIHN0YXJ0VGltZSAtIERlcGxveW1lbnQgc3RhcnQgdGltZXN0YW1wXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBkZXBsb3ltZW50IHJlc3VsdFxuICAgKiBAdGhyb3dzIHtEZXBsb3ltZW50RXJyb3J9IElmIEluZnJhIG9yIFJ1bnRpbWUgZGVwbG95bWVudCBmYWlsc1xuICAgKlxuICAgKiBAdG9kbzogY29tcGxldGUgZXh0ZW5zaWJsZSBkZXBsb3ltZW50IGFwcHJvYWNoIHdpdGggZHVyYXRpb24gbWV0cmljIGF0dGVuZGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlRGVwbG95PFQgZXh0ZW5kcyBTdGFja3NEZXBsb3lSZXN1bHQgPSBTdGFja3NEZXBsb3lSZXN1bHQ+KFxuICAgIG9wdGlvbnM6IFN0YWNrc0RlcGxveU9wdGlvbnMsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgc3RhZ2UsIGNvbmZpZyB9ID0gb3B0aW9ucztcblxuICAgIC8vIFNhbml0aXplIHN0YWNrIG5hbWVzIGZvciBBV1MgQ2xvdWRGb3JtYXRpb24gY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IGluZnJhU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVB1cmVub3dJbmZyYS0ke3N0YWdlfWApO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFja05hbWUgPSBzYW5pdGl6ZVN0YWNrTmFtZShgJHtvcHRpb25zLmNvbmZpZy5wcm9qZWN0TmFtZX0tUHVyZW5vd1J1bnRpbWUtJHtzdGFnZX1gKTtcbiAgICBjb25zdCBydW50aW1lV2ViU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVJ1bnRpbWVXZWItJHtzdGFnZX1gKTtcblxuICAgIGNvbnN0IHN0YWdlQ29uZmlnID0gZ2V0U3RhZ2UoY29uZmlnLCBzdGFnZSk7XG4gICAgaWYgKCFzdGFnZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgYFN0YWdlICcke3N0YWdlfScgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICBgQXZhaWxhYmxlIHN0YWdlczogJHtjb25maWcuc3RhZ2VzLm1hcCgoczogYW55KSA9PiBzLm5hbWUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY29uc3QgY2xvdWRGb3JtYXRpb25DbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoe1xuICAgIC8vICAgcmVnaW9uOiBzdGFnZUNvbmZpZy5hd3NSZWdpb24sXG4gICAgLy8gfSk7XG5cbiAgICAvLyBTdGVwIDE6IERlcGxveSBJbmZyYSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgSW5mcmFzdHJ1Y3R1cmUgc3RhY2suLi4nKTtcbiAgICBjb25zdCBpbmZyYVJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBpbmZyYVN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIWluZnJhUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdSdW50aW1lIHN0YWNrIHdpbGwgbm90IGJlIGRlcGxveWVkLiBGaXggSW5mcmEgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDI6IFJlYWQgSW5mcmEgb3V0cHV0c1xuICAgIC8vIGNvbnNvbGUubG9nKCdSZWFkaW5nIEluZnJhc3RydWN0dXJlIG91dHB1dHMuLi4nKTtcbiAgICAvLyBjb25zdCBpbmZyYU91dHB1dHMgPSBhd2FpdCB0aGlzLmdldEluZnJhT3V0cHV0cyhjbG91ZEZvcm1hdGlvbkNsaWVudCwgc3RhZ2UsIGNvbmZpZywgaW5mcmFTdGFja05hbWUsIHN0YWdlQ29uZmlnPy5hd3NQcm9maWxlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhgUmV0cmlldmVkICR7T2JqZWN0LmtleXMoaW5mcmFPdXRwdXRzKS5sZW5ndGh9IG91dHB1dHMgZnJvbSBJbmZyYXN0cnVjdHVyZSBzdGFja2ApO1xuXG4gICAgLy8gU3RlcCAzOiBEZXBsb3kgUnVudGltZSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgUHVyZW5vd1J1bnRpbWUgc3RhY2suLi4nKTtcbiAgICBjb25zdCBydW50aW1lUmVzdWx0ID0gYXdhaXQgdGhpcy5kZXBsb3lDZGtTdGFjayhcbiAgICAgIHJ1bnRpbWVTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFydW50aW1lUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdSdW50aW1lIGRlcGxveW1lbnQgZmFpbGVkJyxcbiAgICAgICAgJ0luZnJhc3RydWN0dXJlIGlzIGRlcGxveWVkIHN1Y2Nlc3NmdWxseS4gRml4IFJ1bnRpbWUgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDM6IERlcGxveSBSdW50aW1lIHN0YWNrXG4gICAgY29uc29sZS5sb2coJ0RlcGxveWluZyBSdW50aW1lV2ViIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgcnVudGltZVdlYlJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBydW50aW1lV2ViU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghcnVudGltZVdlYlJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnUnVudGltZVdlYiBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBpcyBkZXBsb3llZCBzdWNjZXNzZnVsbHkuIEZpeCBSdW50aW1lIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBpbmZyYVN0YWNrOiBpbmZyYVJlc3VsdCxcbiAgICAgIHJ1bnRpbWVTdGFjazogcnVudGltZVJlc3VsdCxcbiAgICAgIHJ1bnRpbWVXZWJTdGFjazogcnVudGltZVdlYlJlc3VsdCxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0gYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBkZXBsb3ltZW50IG91dHB1dHMgZnJvbSBDREsgb3V0cHV0cyBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIC0gTmFtZSBvZiB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAgICogQHJldHVybnMgRGVwbG95bWVudCBvdXRwdXRzIG1hcFxuICAgKlxuICAgKiBAaW1wb3J0YW50OiBPUFRJTUlTRSBUSElTIFNPTFVUSU9OXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSBvdXRwdXRzUGF0aFxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlU3RhY2tPdXRwdXRzKHN0YWNrTmFtZTogc3RyaW5nLCBvdXRwdXRzUGF0aDogc3RyaW5nKTogRGVwbG95bWVudE91dHB1dHMge1xuICAgIGNvbnN0IG91dHB1dHM6IFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMgPSBzdXBlci5wYXJzZVN0YWNrT3V0cHV0cyhzdGFja05hbWUsIG91dHB1dHNQYXRoKSBhcyBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgICAgcmV0dXJuIG91dHB1dHM7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dHNGaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBjZGtPdXRwdXRzID0gSlNPTi5wYXJzZShvdXRwdXRzRmlsZUNvbnRlbnQpO1xuXG4gICAgICAvLyBDREsgb3V0cHV0cyBmaWxlIHN0cnVjdHVyZTogeyBcIlN0YWNrTmFtZVwiOiB7IFwiT3V0cHV0S2V5XCI6IFwiT3V0cHV0VmFsdWVcIiB9IH1cbiAgICAgIGNvbnN0IHN0YWNrT3V0cHV0cyA9IGNka091dHB1dHNbc3RhY2tOYW1lXTtcbiAgICAgIGlmIChzdGFja091dHB1dHMpIHtcbiAgICAgICAgb3V0cHV0cy5sYW1iZGFBcm5MaXN0ID0gT2JqZWN0LmtleXMoc3RhY2tPdXRwdXRzKVxuICAgICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiBrZXkubWF0Y2goLyg/OkxhbWJkYSlbYS16QS1aXStBcm4kLykpXG4gICAgICAgICAgLm1hcCgobGFtYmRhTWF0Y2g6IGFueSkgPT4gc3RhY2tPdXRwdXRzW2xhbWJkYU1hdGNoXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIG91dHB1dHMgZmlsZSBmb3IgJHtzdGFja05hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0cztcbiAgfVxuXG5cbiAgLy8gQG5vdGU6IGR1cGxpY2F0ZXNcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHNpZ25hdHVyZSBmb3IgdGhlIHByb3ZpZGVkIHJlZ2lvbiBieSBleHRyYWN0aW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBzZWdtZW50IGluIHRoZSByZWdpb24gc3RyaW5nLCBkZWxpbWl0ZWQgYnkgaHlwaGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lvbiAtIFRoZSByZWdpb24gc3RyaW5nIHRvIGdlbmVyYXRlIHRoZSBzaWduYXR1cmUgZnJvbS4gSXQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBoeXBoZW4tc2VwYXJhdGVkIHN0cmluZy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHJlZ2lvbiBzaWduYXR1cmUsIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCB2YWxpZCBzZWdtZW50LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCBvciBlbXB0eS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZWdpb25TaWduYXR1cmUocmVnaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcmVnaW9uKSByZXR1cm4gJyc7XG5cbiAgICByZXR1cm4gcmVnaW9uXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcChwYXJ0ID0+IHBhcnRbMF0gPz8gJycpXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVzb3VyY2UgbmFtZSBieSBjb25jYXRlbmF0aW5nIHNlcnZpY2UgbmFtZSwgcmVzb3VyY2UgbmFtZSxcbiAgICogc2ltcGxpZmllZCByZWdpb24sIGFuZCBzdGFnZSB3aXRoIGh5cGhlbnMgYXMgc2VwYXJhdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2VydmljZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlZ2lvblNpbXBsaWZpZWQgLSBUaGUgc2ltcGxpZmllZCByZWdpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zdGFnZSAtIFRoZSBkZXBsb3ltZW50IHN0YWdlIG9mIHRoZSByZXNvdXJjZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbmNhdGVuYXRlZCByZXNvdXJjZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlc291cmNlTmFtZSh7IG5hbWUsIHNlcnZpY2VOYW1lLCBzdGFnZSwgcmVnaW9uIH06IFB1cmVub3dJbmZyYVJlc291cmNlT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnaW9uU2ltcGxpZmllZCA9IHNhbml0aXplU3RhY2tOYW1lKHRoaXMuZ2V0UmVnaW9uU2lnbmF0dXJlKHJlZ2lvbiB8fCAndXMtZWFzdC0xJykpO1xuICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0tJHtuYW1lfS0ke3JlZ2lvblNpbXBsaWZpZWR9LSR7c3RhZ2V9YDtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBTYW5pdGl6ZXMgYSBzdGFjayBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBBV1MgQ2xvdWRGb3JtYXRpb24gbmFtaW5nIHJlcXVpcmVtZW50cy5cbiAqIFxuICogQ2xvdWRGb3JtYXRpb24gc3RhY2sgbmFtZXMgbXVzdDpcbiAqIC0gQmUgMS0xMjggY2hhcmFjdGVycyBsb25nXG4gKiAtIENvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVuc1xuICogLSBTdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyXG4gKiAtIE5vdCBlbmQgd2l0aCBhIGh5cGhlblxuICogXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBzdGFjayBuYW1lIHRvIHNhbml0aXplXG4gKiBAcmV0dXJucyBUaGUgc2FuaXRpemVkIHN0YWNrIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplU3RhY2tOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBSZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycyB3aXRoIGh5cGhlbnNcbiAgICBsZXQgc2FuaXRpemVkID0gbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOS1dL2csICctJyk7XG5cbiAgICAvLyBFbnN1cmUgaXQgc3RhcnRzIHdpdGggYSBsZXR0ZXJcbiAgICBpZiAoIS9eW2EtekEtWl0vLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgICAgICBzYW5pdGl6ZWQgPSAnc3RhY2stJyArIHNhbml0aXplZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5yZXBsYWNlKC8tKy9nLCAnLScpO1xuXG4gICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGh5cGhlbnNcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZSgvLSskLywgJycpO1xuXG4gICAgLy8gRW5zdXJlIGl0J3Mgbm90IHRvbyBsb25nIChDbG91ZEZvcm1hdGlvbiBsaW1pdCBpcyAxMjggY2hhcmFjdGVycylcbiAgICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IDEyOCkge1xuICAgICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDAsIDEyOCkucmVwbGFjZSgvLSskLywgJycpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBpdCdzIG5vdCBlbXB0eSBhZnRlciBzYW5pdGl6YXRpb25cbiAgICBpZiAoIXNhbml0aXplZCkge1xuICAgICAgICBzYW5pdGl6ZWQgPSAnc3RhY2snO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG59IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGVwbG95bWVudFN0cmF0ZWd5LCBQdXJlbm93Q2xpQ29udGV4dCB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJy4vcHVyZW5vdy1ydW50aW1lLXN0YWNrcy1kZXBsb3kuc2VydmljZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcnVudGltZSBjb250ZXh0IGZvciB0aGUgUHVyZW5vdyBDTEksIGV4dGVuZGluZyB0aGUgYmFzZSBQdXJlbm93IENMSSBjb250ZXh0XG4gKiB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQgJiB7XG4gIHN0YWNrc0RlcGxveVNlcnZpY2U6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZTtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGRlcGxveW1lbnQgc3RyYXRlZ3kgdGhhdCBpbXBsZW1lbnRzIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAqXG4gKiBUaGlzIHN0cmF0ZWd5IGV4dGVuZHMgcHVyZW5vdydzIHR3by1zdGFjayBkZXBsb3ltZW50IHRvIHN1cHBvcnQgdGhyZWUgc3RhY2tzOlxuICogMS4gSW5mcmFzdHJ1Y3R1cmUgU3RhY2sgKGV4aXN0aW5nKVxuICogMi4gUnVudGltZSBTdGFjayAoZXhpc3RpbmcpXG4gKiAzLiBBZGRpdGlvbmFsIFJ1bnRpbWUgU3RhY2sgKG5ldylcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3kgaW1wbGVtZW50cyBEZXBsb3ltZW50U3RyYXRlZ3kge1xuICByZWFkb25seSByb2xlID0gJ2RlcGxveW1lbnQnO1xuICByZWFkb25seSBuYW1lID0gJ3J1bnRpbWUtcHVyZW5vdy1ydW50aW1lLXN0YWNrcyc7XG5cbiAgLyoqXG4gICAqIFByZS1kZXBsb3ltZW50IHZhbGlkYXRpb24gZm9yIHJ1bnRpbWUtc3BlY2lmaWMgcmVxdWlyZW1lbnRzXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZURlcGxveW1lbnQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQ+KGNvbnRleHQ6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIChyZXF1aXJlZCBmb3IgZGVwbG95bWVudClcbiAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLmlzVmFsaWQoKTtcblxuXG5cbiAgICAgIC8vIFZhbGlkYXRlIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgICAgLy8gY29uc3QgcnVudGltZUNvbmZpZyA9IGNvbnRleHQuY29uZmlnLjtcbiAgICAgIC8vIGlmIChydW50aW1lQ29uZmlnPy5lbmFibGVUaGlyZFN0YWNrICYmICFydW50aW1lQ29uZmlnLnJ1bnRpbWVXZWJNb2RlKSB7XG4gICAgICAvLyAgIGNvbnRleHQubG9nZ2VyLmVycm9yKCdSdW50aW1lLXdlYiBtb2RlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gUnVudGltZSBDb3JlIHN0YWNrIGlzIGVuYWJsZWQnKTtcbiAgICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gfVxuXG4gICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCdSdW50aW1lIGRlcGxveW1lbnQgdmFsaWRhdGlvbiBwYXNzZWQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihgUnVudGltZSBkZXBsb3ltZW50IHZhbGlkYXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50IGluc3RlYWQgb2YgdHdvIHN0YWNrc1xuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZURlcGxveW1lbnQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQ+KFxuICAgIGNvbnRleHQ6IFQsXG4gICAgY29uZmlnOiB1bmtub3duLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXBsb3lDb25maWcgPSBjb25maWcgYXMge1xuICAgICAgc3RhY2tzRGVwbG95U2VydmljZTogYW55O1xuICAgICAgb3B0aW9uczogYW55O1xuICAgICAgbG9nZ2VyOiBhbnk7XG4gICAgICBjd2Q6IHN0cmluZztcbiAgICAgIGVudlZhbGlkYXRvcjogYW55O1xuICAgIH07XG5cbiAgICBjb25zdCB7IGxvZ2dlciwgb3B0aW9ucyB9ID0gZGVwbG95Q29uZmlnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGxvZ2dlci5pbmZvKCdTdGFydGluZyBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50Li4uJyk7XG5cbiAgICAgIC8vIFVzZSB0aGUgcnVudGltZSBzdGFja3MgZGVwbG95IHNlcnZpY2UgZm9yIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJ1bnRpbWVTdGFja3NTZXJ2aWNlID0gY29udGV4dC5zdGFja3NEZXBsb3lTZXJ2aWNlIGFzIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZTtcblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVudGltZVN0YWNrc1NlcnZpY2UuZGVwbG95KHtcbiAgICAgICAgc3RhZ2U6IG9wdGlvbnMuc3RhZ2UsXG4gICAgICAgIGNvbmZpZzogY29udGV4dC5jb25maWcsXG4gICAgICAgIHNraXBCdWlsZDogb3B0aW9ucy5za2lwQnVpbGQgfHwgZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWUgVGFyZ2V0IHN0YWNrcyBkZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnUnVudGltZSBUYXJnZXQgc3RhY2sgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnSW5mcmFzdHJ1Y3R1cmUgc3RhY2sgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QtZGVwbG95bWVudCBhY3Rpb25zIGZvciBydW50aW1lLXNwZWNpZmljIHRhc2tzXG4gICAqL1xuICBhc3luYyBwb3N0RGVwbG95bWVudChyZXN1bHQ6IHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiB1bmtub3duIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAbm90ZTogcG9zdC1kZXBsb3ltZW50IGlzIG5vdCByZXF1aXJlZCBmb3IgUHVyZW5vdyBSdW50aW1lXG4gICAgLy8gaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnUnVudGltZSBkZXBsb3ltZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdBbGwgdGhyZWUgc3RhY2tzIGRlcGxveWVkIGFuZCBjb25maWd1cmVkJyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUgZGVwbG95bWVudCBmYWlsZWQnKTtcbiAgICAvLyAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgcmVzdWx0LmVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQuZXJyb3IubWVzc2FnZSA6IFN0cmluZyhyZXN1bHQuZXJyb3IpKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gIH1cbn1cblxuLy8gLyoqXG4vLyAgKiBUaGUgYFB1cmVub3dSdW50aW1lQ2xpYCBjbGFzcyBleHRlbmRzIHRoZSBgUHVyZW5vd0NsaWAgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5XG4vLyAgKiBzcGVjaWZpYyB0byB0aGUgUHVyZW5vdyBydW50aW1lLCBpbmNsdWRpbmcgdGhlIGNyZWF0aW9uIG9mIGEgY29udGV4dCB3aXRoIGFkZGl0aW9uYWwgc2VydmljZXMuXG4vLyAgKi9cbi8vIGV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZUNsaSBleHRlbmRzIFB1cmVub3dDbGkge1xuLy8gICBjb25zdHJ1Y3RvcihzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpIHtcbi8vICAgICBzdXBlcihzdHJhdGVnaWVzKTtcbi8vICAgfVxuLy9cbi8vICAgLyoqXG4vLyAgICAqIENyZWF0ZSBQdXJlbm93LXNwZWNpZmljIGNvbnRleHQgd2l0aCBhbGwgcmVxdWlyZWQgc2VydmljZXNcbi8vICAgICovXG4vLyAgIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDb250ZXh0PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dSdW50aW1lQ2xpQ29udGV4dD4oZ2xvYmFsT3B0czogR2xvYmFsT3B0aW9ucywgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogUHJvbWlzZTxUPiB7XG4vLyAgICAgY29uc3QgcHVyZW5vd0NvbnRleHQgPVxuLy8gICAgICAgYXdhaXQgc3VwZXIuY3JlYXRlQ29udGV4dDxQdXJlbm93Q2xpQ29udGV4dD4oZ2xvYmFsT3B0cywgY3dkKTtcbi8vXG4vLyAgICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2Vcbi8vICAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuLy9cbi8vICAgICByZXR1cm4ge1xuLy8gICAgICAgLi4ucHVyZW5vd0NvbnRleHQsXG4vLyAgICAgICBzdGFja3NEZXBsb3lTZXJ2aWNlLFxuLy8gICAgIH0gYXMgdW5rbm93biBhcyBUO1xuLy8gICB9XG4vLyB9XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbi8qKlxuICogR2VuZXJhdGUgaHRtbC10ZW1wbGF0ZS5lbWJlZGRlZC50cyBmaWxlIHdpdGggdGhlIEhUTUwgdGVtcGxhdGUgY29uc3RhbnQuXG4gKlxuICogVGhpcyBzY3JpcHQgaXMgcnVuIGF0IGJ1aWxkIHRpbWUgdG8gZW1iZWQgdGhlIHVzZXIncyBwdWJsaWMvaW5kZXguaHRtbFxuICogaW50byB0aGUgTGFtYmRhIGJ1bmRsZSBhcyBhIFR5cGVTY3JpcHQgY29uc3RhbnQuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZFxuICogZm9yIGZpbGUgc3lzdGVtIHJlYWRzIGF0IHJ1bnRpbWUgYW5kIGVuc3VyZXMgdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZVxuICogaW4gdGhlIExhbWJkYSBlbnZpcm9ubWVudC5cbiAqXG4gKiBUaGUgc2NyaXB0OlxuICogMS4gTG9hZHMgdGhlIEhUTUwgdGVtcGxhdGUgdXNpbmcgSHRtbFRlbXBsYXRlTG9hZGVyIGxvZ2ljXG4gKiAyLiBWYWxpZGF0ZXMgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZSBhbmQgc2l6ZVxuICogMy4gR2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBmaWxlIHdpdGggdGhlIHRlbXBsYXRlIGFzIGEgY29uc3RhbnRcbiAqIDQuIFdyaXRlcyB0aGUgZmlsZSB0byBzcmMvY29yZS9zZXJ2aWNlcy90ZW1wbGF0ZS9odG1sLXRlbXBsYXRlLmVtYmVkZGVkLnRzXG4gKiA1LiBWYWxpZGF0ZXMgdGhlIHJlc3VsdGluZyBidW5kbGUgc2l6ZSBpbXBhY3RcbiAqXG4gKiBUaGlzIGZpbGUgaXMgdGhlbiBpbXBvcnRlZCBieSBIdG1sVGVtcGxhdGVTZXJ2aWNlIGF0IHJ1bnRpbWUuXG4gKi9cblxuLy8gQ29uc3RhbnRzIGZvciB2YWxpZGF0aW9uXG5jb25zdCBNQVhfVEVNUExBVEVfU0laRV9CWVRFUyA9IDUgKiAxMDI0ICogMTAyNDsgLy8gNU1CIChjb25zZXJ2YXRpdmUgbGltaXQgdG8gc3RheSB1bmRlciAxME1CIExhbWJkYSBsaW1pdClcbmNvbnN0IExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUIgQVdTIExhbWJkYSBsaW1pdFxuY29uc3QgVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMU1CIHdhcm5pbmcgdGhyZXNob2xkXG5cbmZ1bmN0aW9uIGxvYWRUZW1wbGF0ZSgpIHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdwdWJsaWMvaW5kZXguaHRtbCcpO1xuICBjb25zdCB1c2VGYWxsYmFjayA9IHRydWU7IC8vIERlZmF1bHQgdG8gdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXG4gIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgaWYgKHVzZUZhbGxiYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oJ0RFUFJFQ0FUSU9OIFdBUk5JTkc6IE1pc3NpbmcgcHVibGljL2luZGV4Lmh0bWwnKTtcbiAgICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oYFxcbkZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuVGhlIFB1cmVub3cgZnJhbWV3b3JrIGlzIHVzaW5nIGEgZmFsbGJhY2sgSFRNTCB0ZW1wbGF0ZS4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBmYWxsYmFjayB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4nKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbk1pbmltYWwgdGVtcGxhdGUgc3RydWN0dXJlOicpO1xuICAgICAgY29uc29sZS53YXJuKCcnKTtcbiAgICAgIGNvbnNvbGUud2FybignPCFET0NUWVBFIGh0bWw+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJzxodG1sIGxhbmc9XCJlblwiPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxoZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nKTtcbiAgICAgIGNvbnNvbGUud2FybignICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPC9oZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxib2R5PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDwvYm9keT4nKTtcbiAgICAgIGNvbnNvbGUud2FybignPC9odG1sPicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgICAgIHJldHVybiBnZXREZWZhdWx0VGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogTWlzc2luZyBwdWJsaWMvaW5kZXguaHRtbFxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuXFxuYCArXG4gICAgICBgRmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBQdXJlbm93IGZyYW1ld29yayByZXF1aXJlcyBhIGJhc2UgSFRNTCB0ZW1wbGF0ZSBpbiB5b3VyIHByb2plY3QuXFxuXFxuYCArXG4gICAgICBgQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgd2l0aCB0aGUgZm9sbG93aW5nIG1pbmltYWwgc3RydWN0dXJlOlxcblxcbmAgK1xuICAgICAgYDwhRE9DVFlQRSBodG1sPlxcbmAgK1xuICAgICAgYDxodG1sIGxhbmc9XCJlblwiPlxcbmAgK1xuICAgICAgYCAgPGhlYWQ+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XFxuYCArXG4gICAgICBgICA8L2hlYWQ+XFxuYCArXG4gICAgICBgICA8Ym9keT5cXG5gICtcbiAgICAgIGAgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxcbmAgK1xuICAgICAgYCAgPC9ib2R5PlxcbmAgK1xuICAgICAgYDwvaHRtbD5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmLTgnKTtcblxuICAvLyBDaGVjayBpZiBmaWxlIGlzIGVtcHR5XG4gIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogRW1wdHkgcHVibGljL2luZGV4Lmh0bWxcXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcblxcbmAgK1xuICAgICAgYEZpbGUgbG9jYXRpb246ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHkuIEl0IG11c3QgY29udGFpbiBhIHZhbGlkIEhUTUwgZG9jdW1lbnQgc3RydWN0dXJlLlxcblxcbmAgK1xuICAgICAgYEFjdGlvbiByZXF1aXJlZDogQWRkIEhUTUwgY29udGVudCB0byBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRlbXBsYXRlIHNpemVcbiAgdmFsaWRhdGVUZW1wbGF0ZVNpemUoY29udGVudCwgdGVtcGxhdGVQYXRoKTtcblxuICAvLyBWYWxpZGF0ZSBIVE1MIHN0cnVjdHVyZVxuICB2YWxpZGF0ZVRlbXBsYXRlKGNvbnRlbnQsIHRlbXBsYXRlUGF0aCk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGVtcGxhdGVTaXplKGh0bWw6IHN0cmluZywgdGVtcGxhdGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2l6ZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoaHRtbCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHNpemVNQiA9IChzaXplQnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gIC8vIENoZWNrIGlmIHRlbXBsYXRlIGV4Y2VlZHMgbWF4aW11bSBzaXplXG4gIGlmIChzaXplQnl0ZXMgPiBNQVhfVEVNUExBVEVfU0laRV9CWVRFUykge1xuICAgIGNvbnN0IG1heFNpemVNQiA9IChNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEhUTUwgdGVtcGxhdGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke3RlbXBsYXRlUGF0aH1cXG5gICtcbiAgICAgIGBTaXplOiAke3NpemVNQn0gTUJcXG5gICtcbiAgICAgIGBNYXhpbXVtIGFsbG93ZWQ6ICR7bWF4U2l6ZU1CfSBNQlxcblxcbmAgK1xuICAgICAgYFRoZSBIVE1MIHRlbXBsYXRlIGlzIHRvbyBsYXJnZSBhbmQgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWRcXG5gICtcbiAgICAgIGB0aGUgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbCBieTpcXG5gICtcbiAgICAgIGAgIC0gUmVtb3ZpbmcgaW5saW5lIHN0eWxlcyAodXNlIGV4dGVybmFsIENTUyBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBSZW1vdmluZyBpbmxpbmUgc2NyaXB0cyAodXNlIGV4dGVybmFsIEpTIGZpbGVzIGluc3RlYWQpXFxuYCArXG4gICAgICBgICAtIFJlbW92aW5nIGxhcmdlIGVtYmVkZGVkIGRhdGEgKHVzZSBleHRlcm5hbCBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBNaW5pbWl6aW5nIEhUTUwgY29tbWVudHMgYW5kIHdoaXRlc3BhY2VcXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gaWYgdGVtcGxhdGUgaXMgYXBwcm9hY2hpbmcgdGhlIHdhcm5pbmcgdGhyZXNob2xkXG4gIGlmIChzaXplQnl0ZXMgPiBURU1QTEFURV9TSVpFX1dBUk5JTkdfVEhSRVNIT0xEKSB7XG4gICAgY29uc3Qgd2FybmluZ1RocmVzaG9sZE1CID0gKFRFTVBMQVRFX1NJWkVfV0FSTklOR19USFJFU0hPTEQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhcmdlIEhUTUwgdGVtcGxhdGUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBTaXplOiAke3NpemVNQn0gTUIgKHRocmVzaG9sZDogJHt3YXJuaW5nVGhyZXNob2xkTUJ9IE1CKWApO1xuICAgIGNvbnNvbGUud2FybignXFxuQSBsYXJnZSBIVE1MIHRlbXBsYXRlIGluY3JlYXNlcyBMYW1iZGEgYnVuZGxlIHNpemUgYW5kIGNvbGQgc3RhcnQgdGltZS4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbkNvbnNpZGVyOicpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc3R5bGVzIHRvIGV4dGVybmFsIENTUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc2NyaXB0cyB0byBleHRlcm5hbCBKUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIFJlZHVjaW5nIGVtYmVkZGVkIGRhdGEgYW5kIGNvbW1lbnRzJyk7XG4gICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZShodG1sOiBzdHJpbmcsIHRlbXBsYXRlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IG1pc3NpbmdUYWdzID0gW107XG5cbiAgaWYgKCEvPGh0bWxbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGh0bWw+Jyk7XG4gIH1cbiAgaWYgKCEvPGhlYWRbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGhlYWQ+Jyk7XG4gIH1cbiAgaWYgKCEvPGJvZHlbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGJvZHk+Jyk7XG4gIH1cblxuICBpZiAobWlzc2luZ1RhZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IEludmFsaWQgSFRNTCBzdHJ1Y3R1cmUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBNaXNzaW5nIHJlcXVpcmVkIHRhZ3M6ICR7bWlzc2luZ1RhZ3Muam9pbignLCAnKX1gKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcblRoZSBIVE1MIHRlbXBsYXRlIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseSBhdCBydW50aW1lLicpO1xuICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlY29tbWVuZGVkOiBBZGQgdGhlIG1pc3NpbmcgdGFncyB0byBwdWJsaWMvaW5kZXguaHRtbC4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VGVtcGxhdGUoKSB7XG4gIHJldHVybiBgPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIiAvPlxuICAgIDxtZXRhIG5hbWU9XCJ0aGVtZS1jb2xvclwiIGNvbnRlbnQ9XCIjMDAwMDAwXCIgLz5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bm9zY3JpcHQ+WW91IG5lZWQgdG8gZW5hYmxlIEphdmFTY3JpcHQgdG8gcnVuIHRoaXMgYXBwLjwvbm9zY3JpcHQ+XG4gICAgPGRpdiBpZD1cInJvb3QtaW50ZXJuYWxcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+YDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCdW5kbGVTaXplKGVtYmVkZGVkRmlsZVBhdGg6IGFueSkge1xuICAvLyBDaGVjayBpZiB0aGUgZW1iZWRkZWQgZmlsZSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGVtYmVkZGVkRmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBDb3VsZCBub3QgdmFsaWRhdGUgYnVuZGxlIHNpemUgLSBlbWJlZGRlZCBmaWxlIG5vdCBmb3VuZDogJHtlbWJlZGRlZEZpbGVQYXRofWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVtYmVkZGVkRmlsZVNpemUgPSBmcy5zdGF0U3luYyhlbWJlZGRlZEZpbGVQYXRoKS5zaXplO1xuICBjb25zdCBlbWJlZGRlZEZpbGVTaXplTUIgPSAoZW1iZWRkZWRGaWxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG5cbiAgLy8gY29uc29sZS5sb2coYCAgRW1iZWRkZWQgZmlsZSBzaXplOiAke2VtYmVkZGVkRmlsZVNpemVNQn0gTUJgKTtcblxuICAvLyBFc3RpbWF0ZSBpbXBhY3Qgb24gTGFtYmRhIGJ1bmRsZVxuICAvLyBUaGUgZW1iZWRkZWQgZmlsZSB3aWxsIGJlIHBhcnQgb2YgdGhlIExhbWJkYSBidW5kbGUsIHNvIHdlIGNoZWNrIGlmIGl0J3MgcmVhc29uYWJsZVxuICBpZiAoZW1iZWRkZWRGaWxlU2l6ZSA+IE1BWF9URU1QTEFURV9TSVpFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke2VtYmVkZGVkRmlsZVBhdGh9XFxuYCArXG4gICAgICBgU2l6ZTogJHtlbWJlZGRlZEZpbGVTaXplTUJ9IE1CXFxuYCArXG4gICAgICBgTWF4aW11bSBhbGxvd2VkOiAkeyhNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CXFxuXFxuYCArXG4gICAgICBgVGhlIGVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWQgdGhlXFxuYCArXG4gICAgICBgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIExhbWJkYSBidW5kbGUgZXhpc3RzIGFuZCB2YWxpZGF0ZSBpdHMgc2l6ZVxuICAvLyBOb3RlOiBUaGlzIGlzIGluZm9ybWF0aW9uYWwgb25seSBkdXJpbmcgdGVtcGxhdGUgZ2VuZXJhdGlvbiwgYXMgdGhlIGJ1bmRsZVxuICAvLyBtYXkgbm90IGhhdmUgYmVlbiByZWJ1aWx0IHlldCB3aXRoIHRoZSBuZXcgdGVtcGxhdGVcbiAgY29uc3QgbGFtYmRhQnVuZGxlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9vdXQvZGlzdC9sYW1iZGEvYnVuZGxlLmpzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpKSB7XG4gICAgY29uc3QgYnVuZGxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpLnNpemU7XG4gICAgY29uc3QgYnVuZGxlU2l6ZU1CID0gKGJ1bmRsZVNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gICAgY29uc29sZS5sb2coYCAgTGFtYmRhIGJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUIgKGV4aXN0aW5nIGJ1bmRsZSlgKTtcblxuICAgIC8vIE9ubHkgd2FybiBhYm91dCBidW5kbGUgc2l6ZSwgZG9uJ3QgZmFpbCB0aGUgYnVpbGRcbiAgICAvLyBUaGUgYnVuZGxlIHdpbGwgYmUgcmVidWlsdCBhZnRlciB0aGlzIHNjcmlwdCBydW5zXG4gICAgaWYgKGJ1bmRsZVNpemUgPiBMQU1CREFfQlVORExFX1NJWkVfTElNSVQpIHtcbiAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogRXhpc3RpbmcgTGFtYmRhIGJ1bmRsZSBleGNlZWRzIEFXUyBsaW1pdCcpO1xuICAgICAgY29uc29sZS53YXJuKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuQnVuZGxlOiAke2xhbWJkYUJ1bmRsZVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oYFNpemU6ICR7YnVuZGxlU2l6ZU1CfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKGBBV1MgTGFtYmRhIGxpbWl0OiAkeyhMQU1CREFfQlVORExFX1NJWkVfTElNSVQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5Ob3RlOiBUaGlzIGlzIHRoZSBleGlzdGluZyBidW5kbGUgYmVmb3JlIHRlbXBsYXRlIGVtYmVkZGluZy4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGJ1bmRsZSB3aWxsIGJlIHJlYnVpbHQgd2l0aCB0aGUgbmV3IHRlbXBsYXRlLicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5JZiB0aGUgYnVuZGxlIHNpemUgaXNzdWUgcGVyc2lzdHMgYWZ0ZXIgcmVidWlsZDonKTtcbiAgICAgIGNvbnNvbGUud2FybignICAxLiBFeHRlcm5hbGl6ZSBsYXJnZSBkZXBlbmRlbmNpZXMgaW4gZXNidWlsZCBjb25maWcnKTtcbiAgICAgIGNvbnNvbGUud2FybignICAyLiBVc2UgTGFtYmRhIGxheWVycyBmb3IgbGFyZ2UgZGVwZW5kZW5jaWVzJyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgMy4gUmVkdWNlIHRoZSBzaXplIG9mIHB1YmxpYy9pbmRleC5odG1sIGlmIG5lZWRlZCcpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdhcm4gaWYgYnVuZGxlIGlzIGFwcHJvYWNoaW5nIHRoZSBsaW1pdCAoPjhNQilcbiAgICAgIGNvbnN0IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQgPSA4ICogMTAyNCAqIDEwMjQ7XG4gICAgICBpZiAoYnVuZGxlU2l6ZSA+IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhbWJkYSBidW5kbGUgYXBwcm9hY2hpbmcgc2l6ZSBsaW1pdCcpO1xuICAgICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxcbkJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUJgKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBBV1MgbGltaXQ6ICR7KExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CYCk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuQ29uc2lkZXIgb3B0aW1pemluZyB0aGUgYnVuZGxlIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuJyk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApICsgJ1xcbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVtYmVkZGVkVGVtcGxhdGVGaWxlKCkge1xuICAvLyBjb25zb2xlLmxvZygnXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgLy8gY29uc29sZS5sb2coJ0dlbmVyYXRpbmcgSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgLy8gTG9hZCB0aGUgSFRNTCB0ZW1wbGF0ZVxuICBjb25zdCB0ZW1wbGF0ZSA9IGxvYWRUZW1wbGF0ZSgpO1xuXG4gIC8vIEdlbmVyYXRlIFR5cGVTY3JpcHQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYC8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBFbWJlZGRlZCBIVE1MIHRlbXBsYXRlIGZyb20gcHVibGljL2luZGV4Lmh0bWwuXG4gKiBcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGJ5IGJpbi9kZXBsb3kvZ2VuZXJhdGUtaHRtbC10ZW1wbGF0ZS5qcy5cbiAqIERPIE5PVCBFRElUIFRISVMgRklMRSBNQU5VQUxMWSAtIGNoYW5nZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBvbiBuZXh0IGJ1aWxkLlxuICogXG4gKiBUbyBtb2RpZnkgdGhlIEhUTUwgdGVtcGxhdGUsIGVkaXQgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEhUTUxfVEVNUExBVEUgPSAke0pTT04uc3RyaW5naWZ5KHRlbXBsYXRlKX07XG5gO1xuXG4gIC8vIFdyaXRlIHRvIHNyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHNcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICBfX2Rpcm5hbWUsXG4gICAgJy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHMnLFxuICApO1xuXG4gIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gIGNvbnN0IG91dHB1dERpciA9IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgZmlsZUNvbnRlbnQsICd1dGYtOCcpO1xuXG4gIGNvbnN0IHRlbXBsYXRlU2l6ZUtCID0gKHRlbXBsYXRlLmxlbmd0aCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gIC8vIGNvbnNvbGUubG9nKGBcdTI3MTMgR2VuZXJhdGVkOiAke291dHB1dFBhdGh9YCk7XG4gIC8vIGNvbnNvbGUubG9nKGAgIFRlbXBsYXRlIHNpemU6ICR7dGVtcGxhdGVTaXplS0J9IEtCYCk7XG5cbiAgLy8gVmFsaWRhdGUgYnVuZGxlIHNpemVcbiAgdmFsaWRhdGVCdW5kbGVTaXplKG91dHB1dFBhdGgpO1xuXG4gIC8vIGNvbnNvbGUubG9nKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAvLyBjb25zb2xlLmxvZygnSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcgQ29tcGxldGUnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRpY0h0bWwoc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIFJ1biB0aGUgZ2VuZXJhdG9yXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVFbWJlZGRlZFRlbXBsYXRlRmlsZSgpO1xuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLmVycm9yKCdCVUlMRCBGQUlMRUQ6IEhUTUwgVGVtcGxhdGUgR2VuZXJhdGlvbiBFcnJvcicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1xcbicgKyBlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAoZXJyb3Iuc3RhY2sgJiYgcHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcblN0YWNrIHRyYWNlOicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgfVxuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cblxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuZXhwb3J0IHsgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9ydW50aW1lLXdlYi1kZXBsb3ltZW50LnNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgICBidWlsZENvbW1hbmQsXG4gICAgdHlwZSBCdWlsZE9wdGlvbnNcbn0gZnJvbSAnLi9idWlsZC5jb21tYW5kJztcbmV4cG9ydCB7XG4gICAgcnVudGltZUluaXRDb21tYW5kLFxuICAgIHR5cGUgUnVudGltZUluaXRPcHRpb25zXG59IGZyb20gJy4vaW5pdCc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuLy8gY29uc3QgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIEJvb3RzdHJhcENyZWRlbnRpYWxzRXJyb3IsXG4gIEJvb3RzdHJhcFJlZ2lvbkVycm9yLFxuICBCdWlsZEVycm9yLFxuICBCdWlsZFNlcnZpY2UsXG4gIGJ1aWxkU3RhdGljSHRtbCxcbiAgQ2RrQm9vdHN0cmFwU2VydmljZSxcbiAgQ29tbWFuZFJlc3VsdCxcbiAgRGVwbG95bWVudEVycm9yLFxuICBEZXBsb3ltZW50U2VydmljZSxcbiAgRGVwbG95T3B0aW9ucyxcbiAgRGVwbG95U2VydmljZSxcbiAgZGV0ZWN0QW5kVmFsaWRhdGVDcmVkZW50aWFscyxcbiAgRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gIEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsXG4gIGdldFN0YWdlLFxuICBMb2dnZXIsXG4gIFN0YWNrc0RlcGxveVNlcnZpY2UsXG59IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dDbGlDb25maWcgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3V0aWxzJztcblxuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICdAYmluL3NlcnZpY2VzJztcblxuXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIGV4dGVuZHMgRGVwbG95bWVudFNlcnZpY2Uge1xuICAvKipcbiAgICogRGVwbG95IGFwcGxpY2F0aW9uIHRvIEFXU1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveUNvbW1hbmQoXG4gICAgc3RhY2tzRGVwbG95U2VydmljZTogU3RhY2tzRGVwbG95U2VydmljZSxcbiAgICBvcHRpb25zOiBEZXBsb3lPcHRpb25zLFxuICAgIGNvbmZpZzogUHVyZW5vd0NsaUNvbmZpZyxcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICAgZW52VmFsaWRhdG9yPzogRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gICk6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBBV1MgY3JlZGVudGlhbHMgZWFybHkgaWYgdmFsaWRhdG9yIHByb3ZpZGVkXG4gICAgICBpZiAoZW52VmFsaWRhdG9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICAgIGlmIChjb25maWcuaXNBd3NDcmVkZW50aWFsc0R1bXAoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1MgY3JlZGVudGlhbHMgRE8gTk9UIGV4aXN0LCBwbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBmaXJzdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JGb3JtYXR0ZXIgPSBuZXcgRnJpZW5kbHlFcnJvckZvcm1hdHRlcigpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yRm9ybWF0dGVyLmZvcm1hdE1pc3NpbmdDcmVkZW50aWFsc0Vycm9yKFsnQVdTX0FDQ0VTU19LRVlfSUQnLCAnQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZJ10sIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0b2RvOiBzZXQgc3RhZ2Ugb3JkZXIgZGV0ZWN0b3IgdG8gZG9jdW1lbnRhdGlvbiBSRUFETUUubWQgdG8ga25vd1xuICAgICAgLy8gICAgICAgIENMSSBzdGFnZSBcdTIwMTM+IGVudiBTVEFHRSBcdTIwMTM+IGNvbmZpZy5zdGFnZVswXSBcdTIwMTM+IGRldiAoZGVmYXVsdClcbiAgICAgIC8vICAgXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXG4gICAgICAvLyBEZXRlcm1pbmUgc3RhZ2VcbiAgICAgIGNvbnN0IHN0YWdlID0gb3B0aW9ucy5zdGFnZSB8fCBwcm9jZXNzLmVudi5TVEFHRSB8fCBjb25maWcuc3RhZ2VzWzBdPy5uYW1lIHx8ICdkZXYnO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzdGFnZSBleGlzdHMgaW4gY29uZmlndXJhdGlvblxuICAgICAgY29uc3Qgc3RhZ2VDb25maWcgPSBnZXRTdGFnZShjb25maWcsIHN0YWdlKTtcbiAgICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgICBgU3RhZ2UgJyR7c3RhZ2V9JyBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyl9XFxuYCArXG4gICAgICAgICAgYFVwZGF0ZSB5b3VyIHB1cmVub3cuY29uZmlnLnRzIHRvIGFkZCB0aGlzIHN0YWdlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkU3RhdGljSHRtbCgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhjaGFsay5ib2xkKGBEZXBsb3lpbmcgdG8gQVdTIChzdGFnZTogJHtjaGFsay5jeWFuKHN0YWdlKX0pLi4uYCkpO1xuICAgICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgICAvLyBJbml0aWFsaXplIHNlcnZpY2VzXG4gICAgICBjb25zdCBkZXBsb3lTZXJ2aWNlID0gbmV3IERlcGxveVNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJ1aWxkU2VydmljZSA9IG5ldyBCdWlsZFNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNlcnZpY2UgPSBuZXcgQ2RrQm9vdHN0cmFwU2VydmljZShsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDE6IERldGVjdCBhbmQgdmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IGRldGVjdEFuZFZhbGlkYXRlQ3JlZGVudGlhbHMobG9nZ2VyKTtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHN0YWdlQ29uZmlnLmF3c1JlZ2lvbiA/PyBjcmVkZW50aWFscy5yZWdpb24gPz8gJ3VzLWVhc3QtMSc7XG5cbiAgICAgIC8vIFN0ZXAgMjogVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIHdpdGggU1RTXG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ3JlZGVudGlhbHMoZGVwbG95U2VydmljZSwgc3RhZ2VDb25maWcsIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMzogRW5zdXJlIENESyBlbnZpcm9ubWVudCBpcyBib290c3RyYXBwZWRcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQm9vdHN0cmFwcGVkKGJvb3RzdHJhcFNlcnZpY2UsIGNvbmZpZywgc3RhZ2VDb25maWcsIGNyZWRlbnRpYWxzLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgNDogUHJlLWRlcGxveW1lbnQgdmFsaWRhdGlvblxuICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtUHJlRGVwbG95bWVudFZhbGlkYXRpb24oc3RhZ2UsIGNvbmZpZywgb3B0aW9ucywgbG9nZ2VyLCBjd2QpO1xuXG4gICAgICAvLyBTdGVwIDU6IEV4ZWN1dGUgdHdvLXN0YWNrIGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJlc3VsdDogUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFja3NEZXBsb3ltZW50PFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICAgICAgc3RhZ2UsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBvcHRpb25zLnNraXBCdWlsZCxcbiAgICAgICAgb3B0aW9ucy52ZXJib3NlLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RlcCA2OiBDbGVhciBTMyBjYWNoZSBpZiBlbmFibGVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyUzNDYWNoZURlcGxveW1lbnQocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDc6IFVwbG9hZCBSZWFjdCBCdWlsZCB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRSZWFjdEJ1bmRsZShyZXN1bHQuaW5mcmFTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCA4OiBVcGxvYWQgcHVibGljIGFzc2V0cyB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRQdWJsaWNBc3NldHMocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgOTogSW52YWxpZGF0ZSBDbG91ZEZyb250IGNhY2hlXG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250Q2FjaGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMTA6IEluamVjdCBBUEkgR2F0ZXdheSBVUkwgaW50byAuZW52IGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuaW5qZWN0QXBpR2F0ZXdheVVybChyZXN1bHQucnVudGltZVdlYlN0YWNrLCBjb25maWcsIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCAxMTogRGlzcGxheSBkZXBsb3ltZW50IHN1bW1hcnlcbiAgICAgIHRoaXMuZGlzcGxheVN0YWNrc0RlcGxveW1lbnRTdW1tYXJ5KHJlc3VsdCwgbG9nZ2VyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZXBsb3ltZW50RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbShlcnJvci5oaW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCb290c3RyYXBDcmVkZW50aWFsc0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgQm9vdHN0cmFwUmVnaW9uRXJyb3IpIHtcbiAgICAgICAgLy8gQm9vdHN0cmFwIGNyZWRlbnRpYWwvcmVnaW9uIGVycm9ycyBhbHJlYWR5IGxvZ2dlZCBpbiBkZXRlY3RBbmRWYWxpZGF0ZUNyZWRlbnRpYWxzXG4gICAgICAgIC8vIEp1c3QgcmV0dXJuIHdpdGggZXhpdCBjb2RlIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdHdvLXN0YWNrIGRlcGxveW1lbnQgc3VtbWFyeSB3aXRoIG91dHB1dHMgZnJvbSBib3RoIEluZnJhIGFuZCBSdW50aW1lIHN0YWNrc1xuICAgKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShcbiAgICByZXN1bHQ6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApOiB2b2lkIHtcbiAgICAvLyBAbm90ZTogZGlzcGxheSBhbGwgUHVyZW5vdyBkZXBsb3ltZW50IGluZm8gYnkgZGVmYXVsdFxuICAgIHN1cGVyLmRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShyZXN1bHQsIGxvZ2dlciwgeyBtb2RpZmllZDogdHJ1ZSB9KTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdSdW50aW1lIFdlYiBTdGFjazonKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdTdGFjayBOYW1lOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5zdGFja05hbWUpLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdEdXJhdGlvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHRoaXMuZm9ybWF0RHVyYXRpb24ocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5kdXJhdGlvbikpLFxuICAgICk7XG5cbiAgICAvLyBEaXNwbGF5IEFQSSBHYXRld2F5IFVSTCBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmFwaUdhdGV3YXlVcmwpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgIGNoYWxrLmN5YW4oJ0FQSSBHYXRld2F5OicpLFxuICAgICAgICBjaGFsay53aGl0ZShyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMuYXBpR2F0ZXdheVVybCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgTGFtYmRhIEFSTiBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QgJiYgcmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsuY3lhbignTGFtYmRhczonKSxcbiAgICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoKSxcbiAgICAgICk7XG4gICAgICByZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdC5mb3JFYWNoKChsYW1iZGFBcm46IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgICAgY2hhbGsuY3lhbignICBMYW1iZGEgQVJOOicpLFxuICAgICAgICAgIGNoYWxrLndoaXRlKGxhbWJkYUFybiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHJlZ2lvbiBhbmQgc3RhZ2VcbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGVwbG95bWVudCBJbmZvOicpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1JlZ2lvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHJlc3VsdC5pbmZyYVN0YWNrLnJlZ2lvbiksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1N0YWdlOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LmluZnJhU3RhY2suc3RhZ2UpLFxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gIH1cblxufVxuIiwgImNvbnN0IEFOU0lfQkFDS0dST1VORF9PRkZTRVQgPSAxMDtcblxuY29uc3Qgd3JhcEFuc2kxNiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7Y29kZSArIG9mZnNldH1tYDtcblxuY29uc3Qgd3JhcEFuc2kyNTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAob2Zmc2V0ID0gMCkgPT4gKHJlZCwgZ3JlZW4sIGJsdWUpID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzI7JHtyZWR9OyR7Z3JlZW59OyR7Ymx1ZX1tYDtcblxuY29uc3Qgc3R5bGVzID0ge1xuXHRtb2RpZmllcjoge1xuXHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0Ly8gMjEgaXNuJ3Qgd2lkZWx5IHN1cHBvcnRlZCBhbmQgMjIgZG9lcyB0aGUgc2FtZSB0aGluZ1xuXHRcdGJvbGQ6IFsxLCAyMl0sXG5cdFx0ZGltOiBbMiwgMjJdLFxuXHRcdGl0YWxpYzogWzMsIDIzXSxcblx0XHR1bmRlcmxpbmU6IFs0LCAyNF0sXG5cdFx0b3ZlcmxpbmU6IFs1MywgNTVdLFxuXHRcdGludmVyc2U6IFs3LCAyN10sXG5cdFx0aGlkZGVuOiBbOCwgMjhdLFxuXHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV0sXG5cdH0sXG5cdGNvbG9yOiB7XG5cdFx0YmxhY2s6IFszMCwgMzldLFxuXHRcdHJlZDogWzMxLCAzOV0sXG5cdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdHllbGxvdzogWzMzLCAzOV0sXG5cdFx0Ymx1ZTogWzM0LCAzOV0sXG5cdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0Y3lhbjogWzM2LCAzOV0sXG5cdFx0d2hpdGU6IFszNywgMzldLFxuXG5cdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0YmxhY2tCcmlnaHQ6IFs5MCwgMzldLFxuXHRcdGdyYXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG5cdFx0Z3JleTogWzkwLCAzOV0sIC8vIEFsaWFzIG9mIGBibGFja0JyaWdodGBcblx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdGdyZWVuQnJpZ2h0OiBbOTIsIDM5XSxcblx0XHR5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuXHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdG1hZ2VudGFCcmlnaHQ6IFs5NSwgMzldLFxuXHRcdGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuXHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XSxcblx0fSxcblx0YmdDb2xvcjoge1xuXHRcdGJnQmxhY2s6IFs0MCwgNDldLFxuXHRcdGJnUmVkOiBbNDEsIDQ5XSxcblx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRiZ1llbGxvdzogWzQzLCA0OV0sXG5cdFx0YmdCbHVlOiBbNDQsIDQ5XSxcblx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdGJnQ3lhbjogWzQ2LCA0OV0sXG5cdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cblx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRiZ0JsYWNrQnJpZ2h0OiBbMTAwLCA0OV0sXG5cdFx0YmdHcmF5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuXHRcdGJnR3JleTogWzEwMCwgNDldLCAvLyBBbGlhcyBvZiBgYmdCbGFja0JyaWdodGBcblx0XHRiZ1JlZEJyaWdodDogWzEwMSwgNDldLFxuXHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcblx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdGJnQmx1ZUJyaWdodDogWzEwNCwgNDldLFxuXHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuXHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdGJnV2hpdGVCcmlnaHQ6IFsxMDcsIDQ5XSxcblx0fSxcbn07XG5cbmV4cG9ydCBjb25zdCBtb2RpZmllck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLm1vZGlmaWVyKTtcbmV4cG9ydCBjb25zdCBmb3JlZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5jb2xvcik7XG5leHBvcnQgY29uc3QgYmFja2dyb3VuZENvbG9yTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMuYmdDb2xvcik7XG5leHBvcnQgY29uc3QgY29sb3JOYW1lcyA9IFsuLi5mb3JlZ3JvdW5kQ29sb3JOYW1lcywgLi4uYmFja2dyb3VuZENvbG9yTmFtZXNdO1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcblx0Y29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG5cblx0Zm9yIChjb25zdCBbZ3JvdXBOYW1lLCBncm91cF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0XHRcdG9wZW46IGBcXHUwMDFCWyR7c3R5bGVbMF19bWAsXG5cdFx0XHRcdGNsb3NlOiBgXFx1MDAxQlske3N0eWxlWzFdfW1gLFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0pO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgJ2NvZGVzJywge1xuXHRcdHZhbHVlOiBjb2Rlcyxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0fSk7XG5cblx0c3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcblx0c3R5bGVzLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHN0eWxlcy5jb2xvci5hbnNpID0gd3JhcEFuc2kxNigpO1xuXHRzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXG5cdC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL1FpeC0vY29sb3ItY29udmVydC9ibG9iLzNmMGUwZDRlOTJlMjM1Nzk2Y2NiMTdmNmU4NWM3MjA5NGE2NTFmNDkvY29udmVyc2lvbnMuanNcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3R5bGVzLCB7XG5cdFx0cmdiVG9BbnNpMjU2OiB7XG5cdFx0XHR2YWx1ZShyZWQsIGdyZWVuLCBibHVlKSB7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdFx0XHRcdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRcdFx0XHRpZiAocmVkID09PSBncmVlbiAmJiBncmVlbiA9PT0gYmx1ZSkge1xuXHRcdFx0XHRcdGlmIChyZWQgPCA4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMTY7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHJlZCA+IDI0OCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDIzMTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHJlZCAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAxNlxuXHRcdFx0XHRcdCsgKDM2ICogTWF0aC5yb3VuZChyZWQgLyAyNTUgKiA1KSlcblx0XHRcdFx0XHQrICg2ICogTWF0aC5yb3VuZChncmVlbiAvIDI1NSAqIDUpKVxuXHRcdFx0XHRcdCsgTWF0aC5yb3VuZChibHVlIC8gMjU1ICogNSk7XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb1JnYjoge1xuXHRcdFx0dmFsdWUoaGV4KSB7XG5cdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSAvW2EtZlxcZF17Nn18W2EtZlxcZF17M30vaS5leGVjKGhleC50b1N0cmluZygxNikpO1xuXHRcdFx0XHRpZiAoIW1hdGNoZXMpIHtcblx0XHRcdFx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IFtjb2xvclN0cmluZ10gPSBtYXRjaGVzO1xuXG5cdFx0XHRcdGlmIChjb2xvclN0cmluZy5sZW5ndGggPT09IDMpIHtcblx0XHRcdFx0XHRjb2xvclN0cmluZyA9IFsuLi5jb2xvclN0cmluZ10ubWFwKGNoYXJhY3RlciA9PiBjaGFyYWN0ZXIgKyBjaGFyYWN0ZXIpLmpvaW4oJycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW50ZWdlciA9IE51bWJlci5wYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDE2KSAmIDB4RkYsXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gOCkgJiAweEZGLFxuXHRcdFx0XHRcdGludGVnZXIgJiAweEZGLFxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqL1xuXHRcdFx0XHRdO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9BbnNpMjU2OiB7XG5cdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uc3R5bGVzLmhleFRvUmdiKGhleCkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRhbnNpMjU2VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZShjb2RlKSB7XG5cdFx0XHRcdGlmIChjb2RlIDwgOCkge1xuXHRcdFx0XHRcdHJldHVybiAzMCArIGNvZGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29kZSA8IDE2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDkwICsgKGNvZGUgLSA4KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCByZWQ7XG5cdFx0XHRcdGxldCBncmVlbjtcblx0XHRcdFx0bGV0IGJsdWU7XG5cblx0XHRcdFx0aWYgKGNvZGUgPj0gMjMyKSB7XG5cdFx0XHRcdFx0cmVkID0gKCgoY29kZSAtIDIzMikgKiAxMCkgKyA4KSAvIDI1NTtcblx0XHRcdFx0XHRncmVlbiA9IHJlZDtcblx0XHRcdFx0XHRibHVlID0gcmVkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvZGUgLT0gMTY7XG5cblx0XHRcdFx0XHRjb25zdCByZW1haW5kZXIgPSBjb2RlICUgMzY7XG5cblx0XHRcdFx0XHRyZWQgPSBNYXRoLmZsb29yKGNvZGUgLyAzNikgLyA1O1xuXHRcdFx0XHRcdGdyZWVuID0gTWF0aC5mbG9vcihyZW1haW5kZXIgLyA2KSAvIDU7XG5cdFx0XHRcdFx0Ymx1ZSA9IChyZW1haW5kZXIgJSA2KSAvIDU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IE1hdGgubWF4KHJlZCwgZ3JlZW4sIGJsdWUpICogMjtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gMzA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gMzAgKyAoKE1hdGgucm91bmQoYmx1ZSkgPDwgMikgfCAoTWF0aC5yb3VuZChncmVlbikgPDwgMSkgfCBNYXRoLnJvdW5kKHJlZCkpO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdFx0XHRcdHJlc3VsdCArPSA2MDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRyZ2JUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gc3R5bGVzLmFuc2kyNTZUb0Fuc2koc3R5bGVzLnJnYlRvQW5zaTI1NihyZWQsIGdyZWVuLCBibHVlKSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvQW5zaToge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMuYW5zaTI1NlRvQW5zaShzdHlsZXMuaGV4VG9BbnNpMjU2KGhleCkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuY29uc3QgYW5zaVN0eWxlcyA9IGFzc2VtYmxlU3R5bGVzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGFuc2lTdHlsZXM7XG4iLCAiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB0dHkgZnJvbSAnbm9kZTp0dHknO1xuXG4vLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2hhcy1mbGFnL2Jsb2IvbWFpbi9pbmRleC5qc1xuLy8vIGZ1bmN0aW9uIGhhc0ZsYWcoZmxhZywgYXJndiA9IGdsb2JhbFRoaXMuRGVubz8uYXJncyA/PyBwcm9jZXNzLmFyZ3YpIHtcbmZ1bmN0aW9uIGhhc0ZsYWcoZmxhZywgYXJndiA9IGdsb2JhbFRoaXMuRGVubyA/IGdsb2JhbFRoaXMuRGVuby5hcmdzIDogcHJvY2Vzcy5hcmd2KSB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59XG5cbmNvbnN0IHtlbnZ9ID0gcHJvY2VzcztcblxubGV0IGZsYWdGb3JjZUNvbG9yO1xuaWYgKFxuXHRoYXNGbGFnKCduby1jb2xvcicpXG5cdHx8IGhhc0ZsYWcoJ25vLWNvbG9ycycpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJylcblx0fHwgaGFzRmxhZygnY29sb3I9bmV2ZXInKVxuKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMDtcbn0gZWxzZSBpZiAoXG5cdGhhc0ZsYWcoJ2NvbG9yJylcblx0fHwgaGFzRmxhZygnY29sb3JzJylcblx0fHwgaGFzRmxhZygnY29sb3I9dHJ1ZScpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpXG4pIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAxO1xufVxuXG5mdW5jdGlvbiBlbnZGb3JjZUNvbG9yKCkge1xuXHRpZiAoJ0ZPUkNFX0NPTE9SJyBpbiBlbnYpIHtcblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAndHJ1ZScpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICdmYWxzZScpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKE51bWJlci5wYXJzZUludChlbnYuRk9SQ0VfQ09MT1IsIDEwKSwgMyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpIHtcblx0aWYgKGxldmVsID09PSAwKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZXZlbCxcblx0XHRoYXNCYXNpYzogdHJ1ZSxcblx0XHRoYXMyNTY6IGxldmVsID49IDIsXG5cdFx0aGFzMTZtOiBsZXZlbCA+PSAzLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBfc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCB7c3RyZWFtSXNUVFksIHNuaWZmRmxhZ3MgPSB0cnVlfSA9IHt9KSB7XG5cdGNvbnN0IG5vRmxhZ0ZvcmNlQ29sb3IgPSBlbnZGb3JjZUNvbG9yKCk7XG5cdGlmIChub0ZsYWdGb3JjZUNvbG9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRmbGFnRm9yY2VDb2xvciA9IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cdH1cblxuXHRjb25zdCBmb3JjZUNvbG9yID0gc25pZmZGbGFncyA/IGZsYWdGb3JjZUNvbG9yIDogbm9GbGFnRm9yY2VDb2xvcjtcblxuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKHNuaWZmRmxhZ3MpIHtcblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJylcblx0XHRcdHx8IGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKVxuXHRcdFx0fHwgaGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblxuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdFx0cmV0dXJuIDI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIEF6dXJlIERldk9wcyBwaXBlbGluZXMuXG5cdC8vIEhhcyB0byBiZSBhYm92ZSB0aGUgYCFzdHJlYW1Jc1RUWWAgY2hlY2suXG5cdGlmICgnVEZfQlVJTEQnIGluIGVudiAmJiAnQUdFTlRfTkFNRScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwXG5cdFx0XHQmJiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMF81ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNF85MzEgPyAzIDogMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ0knIGluIGVudikge1xuXHRcdGlmIChbJ0dJVEhVQl9BQ1RJT05TJywgJ0dJVEVBX0FDVElPTlMnLCAnQ0lSQ0xFQ0knXS5zb21lKGtleSA9PiBrZXkgaW4gZW52KSkge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKFsnVFJBVklTJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdCVUlMREtJVEUnLCAnRFJPTkUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ3h0ZXJtLWtpdHR5Jykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGVudi5URVJNID09PSAneHRlcm0tZ2hvc3R0eScpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ3dlenRlcm0nKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52KSB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IE51bWJlci5wYXJzZUludCgoZW52LlRFUk1fUFJPR1JBTV9WRVJTSU9OIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG5cblx0XHRzd2l0Y2ggKGVudi5URVJNX1BST0dSQU0pIHtcblx0XHRcdGNhc2UgJ2lUZXJtLmFwcCc6IHtcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6IHtcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyBkZWZhdWx0XG5cdFx0fVxuXHR9XG5cblx0aWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmICgvXnNjcmVlbnxeeHRlcm18XnZ0MTAwfF52dDIyMHxecnh2dHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NPTE9SVEVSTScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3VwcG9ydHNDb2xvcihzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsZXZlbCA9IF9zdXBwb3J0c0NvbG9yKHN0cmVhbSwge1xuXHRcdHN0cmVhbUlzVFRZOiBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZLFxuXHRcdC4uLm9wdGlvbnMsXG5cdH0pO1xuXG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbmNvbnN0IHN1cHBvcnRzQ29sb3IgPSB7XG5cdHN0ZG91dDogY3JlYXRlU3VwcG9ydHNDb2xvcih7aXNUVFk6IHR0eS5pc2F0dHkoMSl9KSxcblx0c3RkZXJyOiBjcmVhdGVTdXBwb3J0c0NvbG9yKHtpc1RUWTogdHR5LmlzYXR0eSgyKX0pLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgc3VwcG9ydHNDb2xvcjtcbiIsICIvLyBUT0RPOiBXaGVuIHRhcmdldGluZyBOb2RlLmpzIDE2LCB1c2UgYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbGAuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN1YnN0cmluZywgcmVwbGFjZXIpIHtcblx0bGV0IGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nKTtcblx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCBzdWJzdHJpbmdMZW5ndGggPSBzdWJzdHJpbmcubGVuZ3RoO1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCwgaW5kZXgpICsgc3Vic3RyaW5nICsgcmVwbGFjZXI7XG5cdFx0ZW5kSW5kZXggPSBpbmRleCArIHN1YnN0cmluZ0xlbmd0aDtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZywgZW5kSW5kZXgpO1xuXHR9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG5cdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIHByZWZpeCwgcG9zdGZpeCwgaW5kZXgpIHtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRjb25zdCBnb3RDUiA9IHN0cmluZ1tpbmRleCAtIDFdID09PSAnXFxyJztcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgsIChnb3RDUiA/IGluZGV4IC0gMSA6IGluZGV4KSkgKyBwcmVmaXggKyAoZ290Q1IgPyAnXFxyXFxuJyA6ICdcXG4nKSArIHBvc3RmaXg7XG5cdFx0ZW5kSW5kZXggPSBpbmRleCArIDE7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJywgZW5kSW5kZXgpO1xuXHR9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG5cdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbiIsICJpbXBvcnQgYW5zaVN0eWxlcyBmcm9tICcjYW5zaS1zdHlsZXMnO1xuaW1wb3J0IHN1cHBvcnRzQ29sb3IgZnJvbSAnI3N1cHBvcnRzLWNvbG9yJztcbmltcG9ydCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L29yZGVyXG5cdHN0cmluZ1JlcGxhY2VBbGwsXG5cdHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleCxcbn0gZnJvbSAnLi91dGlsaXRpZXMuanMnO1xuXG5jb25zdCB7c3Rkb3V0OiBzdGRvdXRDb2xvciwgc3RkZXJyOiBzdGRlcnJDb2xvcn0gPSBzdXBwb3J0c0NvbG9yO1xuXG5jb25zdCBHRU5FUkFUT1IgPSBTeW1ib2woJ0dFTkVSQVRPUicpO1xuY29uc3QgU1RZTEVSID0gU3ltYm9sKCdTVFlMRVInKTtcbmNvbnN0IElTX0VNUFRZID0gU3ltYm9sKCdJU19FTVBUWScpO1xuXG4vLyBgc3VwcG9ydHNDb2xvci5sZXZlbGAgXHUyMTkyIGBhbnNpU3R5bGVzLmNvbG9yW25hbWVdYCBtYXBwaW5nXG5jb25zdCBsZXZlbE1hcHBpbmcgPSBbXG5cdCdhbnNpJyxcblx0J2Fuc2knLFxuXHQnYW5zaTI1NicsXG5cdCdhbnNpMTZtJyxcbl07XG5cbmNvbnN0IHN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmNvbnN0IGFwcGx5T3B0aW9ucyA9IChvYmplY3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAob3B0aW9ucy5sZXZlbCAmJiAhKE51bWJlci5pc0ludGVnZXIob3B0aW9ucy5sZXZlbCkgJiYgb3B0aW9ucy5sZXZlbCA+PSAwICYmIG9wdGlvbnMubGV2ZWwgPD0gMykpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgbGV2ZWxgIG9wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDAgdG8gMycpO1xuXHR9XG5cblx0Ly8gRGV0ZWN0IGxldmVsIGlmIG5vdCBzZXQgbWFudWFsbHlcblx0Y29uc3QgY29sb3JMZXZlbCA9IHN0ZG91dENvbG9yID8gc3Rkb3V0Q29sb3IubGV2ZWwgOiAwO1xuXHRvYmplY3QubGV2ZWwgPSBvcHRpb25zLmxldmVsID09PSB1bmRlZmluZWQgPyBjb2xvckxldmVsIDogb3B0aW9ucy5sZXZlbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBDaGFsayB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RydWN0b3ItcmV0dXJuXG5cdFx0cmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcblx0fVxufVxuXG5jb25zdCBjaGFsa0ZhY3RvcnkgPSBvcHRpb25zID0+IHtcblx0Y29uc3QgY2hhbGsgPSAoLi4uc3RyaW5ncykgPT4gc3RyaW5ncy5qb2luKCcgJyk7XG5cdGFwcGx5T3B0aW9ucyhjaGFsaywgb3B0aW9ucyk7XG5cblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNoYWxrLCBjcmVhdGVDaGFsay5wcm90b3R5cGUpO1xuXG5cdHJldHVybiBjaGFsaztcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoYWxrKG9wdGlvbnMpIHtcblx0cmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcbn1cblxuT2JqZWN0LnNldFByb3RvdHlwZU9mKGNyZWF0ZUNoYWxrLnByb3RvdHlwZSwgRnVuY3Rpb24ucHJvdG90eXBlKTtcblxuZm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoYW5zaVN0eWxlcykpIHtcblx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGhpcywgY3JlYXRlU3R5bGVyKHN0eWxlLm9wZW4sIHN0eWxlLmNsb3NlLCB0aGlzW1NUWUxFUl0pLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgc3R5bGVOYW1lLCB7dmFsdWU6IGJ1aWxkZXJ9KTtcblx0XHRcdHJldHVybiBidWlsZGVyO1xuXHRcdH0sXG5cdH07XG59XG5cbnN0eWxlcy52aXNpYmxlID0ge1xuXHRnZXQoKSB7XG5cdFx0Y29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGhpcywgdGhpc1tTVFlMRVJdLCB0cnVlKTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Zpc2libGUnLCB7dmFsdWU6IGJ1aWxkZXJ9KTtcblx0XHRyZXR1cm4gYnVpbGRlcjtcblx0fSxcbn07XG5cbmNvbnN0IGdldE1vZGVsQW5zaSA9IChtb2RlbCwgbGV2ZWwsIHR5cGUsIC4uLmFyZ3VtZW50c18pID0+IHtcblx0aWYgKG1vZGVsID09PSAncmdiJykge1xuXHRcdGlmIChsZXZlbCA9PT0gJ2Fuc2kxNm0nKSB7XG5cdFx0XHRyZXR1cm4gYW5zaVN0eWxlc1t0eXBlXS5hbnNpMTZtKC4uLmFyZ3VtZW50c18pO1xuXHRcdH1cblxuXHRcdGlmIChsZXZlbCA9PT0gJ2Fuc2kyNTYnKSB7XG5cdFx0XHRyZXR1cm4gYW5zaVN0eWxlc1t0eXBlXS5hbnNpMjU2KGFuc2lTdHlsZXMucmdiVG9BbnNpMjU2KC4uLmFyZ3VtZW50c18pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYW5zaVN0eWxlc1t0eXBlXS5hbnNpKGFuc2lTdHlsZXMucmdiVG9BbnNpKC4uLmFyZ3VtZW50c18pKTtcblx0fVxuXG5cdGlmIChtb2RlbCA9PT0gJ2hleCcpIHtcblx0XHRyZXR1cm4gZ2V0TW9kZWxBbnNpKCdyZ2InLCBsZXZlbCwgdHlwZSwgLi4uYW5zaVN0eWxlcy5oZXhUb1JnYiguLi5hcmd1bWVudHNfKSk7XG5cdH1cblxuXHRyZXR1cm4gYW5zaVN0eWxlc1t0eXBlXVttb2RlbF0oLi4uYXJndW1lbnRzXyk7XG59O1xuXG5jb25zdCB1c2VkTW9kZWxzID0gWydyZ2InLCAnaGV4JywgJ2Fuc2kyNTYnXTtcblxuZm9yIChjb25zdCBtb2RlbCBvZiB1c2VkTW9kZWxzKSB7XG5cdHN0eWxlc1ttb2RlbF0gPSB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3Qge2xldmVsfSA9IHRoaXM7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcblx0XHRcdFx0Y29uc3Qgc3R5bGVyID0gY3JlYXRlU3R5bGVyKGdldE1vZGVsQW5zaShtb2RlbCwgbGV2ZWxNYXBwaW5nW2xldmVsXSwgJ2NvbG9yJywgLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuY29sb3IuY2xvc2UsIHRoaXNbU1RZTEVSXSk7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHR9O1xuXG5cdGNvbnN0IGJnTW9kZWwgPSAnYmcnICsgbW9kZWxbMF0udG9VcHBlckNhc2UoKSArIG1vZGVsLnNsaWNlKDEpO1xuXHRzdHlsZXNbYmdNb2RlbF0gPSB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3Qge2xldmVsfSA9IHRoaXM7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcblx0XHRcdFx0Y29uc3Qgc3R5bGVyID0gY3JlYXRlU3R5bGVyKGdldE1vZGVsQW5zaShtb2RlbCwgbGV2ZWxNYXBwaW5nW2xldmVsXSwgJ2JnQ29sb3InLCAuLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5iZ0NvbG9yLmNsb3NlLCB0aGlzW1NUWUxFUl0pO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdH07XG5cdFx0fSxcblx0fTtcbn1cblxuY29uc3QgcHJvdG8gPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcygoKSA9PiB7fSwge1xuXHQuLi5zdHlsZXMsXG5cdGxldmVsOiB7XG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1tHRU5FUkFUT1JdLmxldmVsO1xuXHRcdH0sXG5cdFx0c2V0KGxldmVsKSB7XG5cdFx0XHR0aGlzW0dFTkVSQVRPUl0ubGV2ZWwgPSBsZXZlbDtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IGNyZWF0ZVN0eWxlciA9IChvcGVuLCBjbG9zZSwgcGFyZW50KSA9PiB7XG5cdGxldCBvcGVuQWxsO1xuXHRsZXQgY2xvc2VBbGw7XG5cdGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdG9wZW5BbGwgPSBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2U7XG5cdH0gZWxzZSB7XG5cdFx0b3BlbkFsbCA9IHBhcmVudC5vcGVuQWxsICsgb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlICsgcGFyZW50LmNsb3NlQWxsO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRvcGVuLFxuXHRcdGNsb3NlLFxuXHRcdG9wZW5BbGwsXG5cdFx0Y2xvc2VBbGwsXG5cdFx0cGFyZW50LFxuXHR9O1xufTtcblxuY29uc3QgY3JlYXRlQnVpbGRlciA9IChzZWxmLCBfc3R5bGVyLCBfaXNFbXB0eSkgPT4ge1xuXHQvLyBTaW5nbGUgYXJndW1lbnQgaXMgaG90IHBhdGgsIGltcGxpY2l0IGNvZXJjaW9uIGlzIGZhc3RlciB0aGFuIGFueXRoaW5nXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvblxuXHRjb25zdCBidWlsZGVyID0gKC4uLmFyZ3VtZW50c18pID0+IGFwcGx5U3R5bGUoYnVpbGRlciwgKGFyZ3VtZW50c18ubGVuZ3RoID09PSAxKSA/ICgnJyArIGFyZ3VtZW50c19bMF0pIDogYXJndW1lbnRzXy5qb2luKCcgJykpO1xuXG5cdC8vIFdlIGFsdGVyIHRoZSBwcm90b3R5cGUgYmVjYXVzZSB3ZSBtdXN0IHJldHVybiBhIGZ1bmN0aW9uLCBidXQgdGhlcmUgaXNcblx0Ly8gbm8gd2F5IHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgcHJvdG90eXBlXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihidWlsZGVyLCBwcm90byk7XG5cblx0YnVpbGRlcltHRU5FUkFUT1JdID0gc2VsZjtcblx0YnVpbGRlcltTVFlMRVJdID0gX3N0eWxlcjtcblx0YnVpbGRlcltJU19FTVBUWV0gPSBfaXNFbXB0eTtcblxuXHRyZXR1cm4gYnVpbGRlcjtcbn07XG5cbmNvbnN0IGFwcGx5U3R5bGUgPSAoc2VsZiwgc3RyaW5nKSA9PiB7XG5cdGlmIChzZWxmLmxldmVsIDw9IDAgfHwgIXN0cmluZykge1xuXHRcdHJldHVybiBzZWxmW0lTX0VNUFRZXSA/ICcnIDogc3RyaW5nO1xuXHR9XG5cblx0bGV0IHN0eWxlciA9IHNlbGZbU1RZTEVSXTtcblxuXHRpZiAoc3R5bGVyID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gc3RyaW5nO1xuXHR9XG5cblx0Y29uc3Qge29wZW5BbGwsIGNsb3NlQWxsfSA9IHN0eWxlcjtcblx0aWYgKHN0cmluZy5pbmNsdWRlcygnXFx1MDAxQicpKSB7XG5cdFx0d2hpbGUgKHN0eWxlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBSZXBsYWNlIGFueSBpbnN0YW5jZXMgYWxyZWFkeSBwcmVzZW50IHdpdGggYSByZS1vcGVuaW5nIGNvZGVcblx0XHRcdC8vIG90aGVyd2lzZSBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcgdW50aWwgc2FpZCBjbG9zaW5nIGNvZGVcblx0XHRcdC8vIHdpbGwgYmUgY29sb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgc2ltcGx5IGJlICdwbGFpbicuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3R5bGVyLmNsb3NlLCBzdHlsZXIub3Blbik7XG5cblx0XHRcdHN0eWxlciA9IHN0eWxlci5wYXJlbnQ7XG5cdFx0fVxuXHR9XG5cblx0Ly8gV2UgY2FuIG1vdmUgYm90aCBuZXh0IGFjdGlvbnMgb3V0IG9mIGxvb3AsIGJlY2F1c2UgcmVtYWluaW5nIGFjdGlvbnMgaW4gbG9vcCB3b24ndCBoYXZlXG5cdC8vIGFueS92aXNpYmxlIGVmZmVjdCBvbiBwYXJ0cyB3ZSBhZGQgaGVyZS4gQ2xvc2UgdGhlIHN0eWxpbmcgYmVmb3JlIGEgbGluZWJyZWFrIGFuZCByZW9wZW5cblx0Ly8gYWZ0ZXIgbmV4dCBsaW5lIHRvIGZpeCBhIGJsZWVkIGlzc3VlIG9uIG1hY09TOiBodHRwczovL2dpdGh1Yi5jb20vY2hhbGsvY2hhbGsvcHVsbC85MlxuXHRjb25zdCBsZkluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicpO1xuXHRpZiAobGZJbmRleCAhPT0gLTEpIHtcblx0XHRzdHJpbmcgPSBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgoc3RyaW5nLCBjbG9zZUFsbCwgb3BlbkFsbCwgbGZJbmRleCk7XG5cdH1cblxuXHRyZXR1cm4gb3BlbkFsbCArIHN0cmluZyArIGNsb3NlQWxsO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY3JlYXRlQ2hhbGsucHJvdG90eXBlLCBzdHlsZXMpO1xuXG5jb25zdCBjaGFsayA9IGNyZWF0ZUNoYWxrKCk7XG5leHBvcnQgY29uc3QgY2hhbGtTdGRlcnIgPSBjcmVhdGVDaGFsayh7bGV2ZWw6IHN0ZGVyckNvbG9yID8gc3RkZXJyQ29sb3IubGV2ZWwgOiAwfSk7XG5cbmV4cG9ydCB7XG5cdG1vZGlmaWVyTmFtZXMsXG5cdGZvcmVncm91bmRDb2xvck5hbWVzLFxuXHRiYWNrZ3JvdW5kQ29sb3JOYW1lcyxcblx0Y29sb3JOYW1lcyxcblxuXHQvLyBUT0RPOiBSZW1vdmUgdGhlc2UgYWxpYXNlcyBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uXG5cdG1vZGlmaWVyTmFtZXMgYXMgbW9kaWZpZXJzLFxuXHRmb3JlZ3JvdW5kQ29sb3JOYW1lcyBhcyBmb3JlZ3JvdW5kQ29sb3JzLFxuXHRiYWNrZ3JvdW5kQ29sb3JOYW1lcyBhcyBiYWNrZ3JvdW5kQ29sb3JzLFxuXHRjb2xvck5hbWVzIGFzIGNvbG9ycyxcbn0gZnJvbSAnLi92ZW5kb3IvYW5zaS1zdHlsZXMvaW5kZXguanMnO1xuXG5leHBvcnQge1xuXHRzdGRvdXRDb2xvciBhcyBzdXBwb3J0c0NvbG9yLFxuXHRzdGRlcnJDb2xvciBhcyBzdXBwb3J0c0NvbG9yU3RkZXJyLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2hhbGs7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIExvZ2dlcixcbiAgQnVpbGRSZXN1bHQsXG4gIEJ1aWxkU2VydmljZSxcbiAgQnVpbGRUYXJnZXQsXG4gIEJ1aWxkRXJyb3IsXG4gIEZyaWVuZGx5RW52aXJvbm1lbnRFcnJvcixcbiAgLy8gUHVyZW5vd0NsaUNvbmZpZywgLy8gVE9ETzogSW1wb3J0IGZyb20gcHJvcGVyIGxvY2F0aW9uXG4gIGJ1aWxkU3RhdGljSHRtbFxufSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGJ1aWxkIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICAvKiogU3BlY2lmaWMgdGFyZ2V0IHRvIGJ1aWxkIChyZWFjdCwgbGFtYmRhLCBjZGssIG9yIGFsbCkgKi9cbiAgdGFyZ2V0PzogJ3JlYWN0JyB8ICdsYW1iZGEnIHwgJ2NkaycgfCAnYWxsJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBidWlsZCB0YXJnZXQgcmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzXG4gKi9cbmZ1bmN0aW9uIHRhcmdldFJlcXVpcmVzQ3JlZGVudGlhbHModGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTGFtYmRhIGFuZCBDREsgdGFyZ2V0cyBtYXkgbmVlZCBBV1MgY3JlZGVudGlhbHMgZm9yIGRlcGxveW1lbnQtcmVsYXRlZCBvcGVyYXRpb25zXG4gIC8vIFJlYWN0IHRhcmdldCBkb2VzIG5vdCByZXF1aXJlIEFXUyBjcmVkZW50aWFsc1xuICByZXR1cm4gdGFyZ2V0ID09PSAnbGFtYmRhJyB8fCB0YXJnZXQgPT09ICdjZGsnIHx8IHRhcmdldCA9PT0gJ2FsbCc7XG59XG5cbi8qKlxuICogQnVpbGQgYXBwbGljYXRpb24gdGFyZ2V0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21tYW5kKFxuICBvcHRpb25zOiBCdWlsZE9wdGlvbnMsXG4gIGNvbmZpZzogYW55LCAvLyBUT0RPOiBVc2UgcHJvcGVyIFB1cmVub3dDbGlDb25maWcgdHlwZVxuICBsb2dnZXI6IExvZ2dlcixcbiAgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBlbnZWYWxpZGF0b3I/OiBhbnksIC8vIFRPRE86IEltcG9ydCBwcm9wZXIgdHlwZSBmcm9tIHB1cmVub3dcbik6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0IHx8ICdhbGwnO1xuXG4gICAgLy8gVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIGlmIGJ1aWxkaW5nIEFXUyB0YXJnZXRzIGFuZCB2YWxpZGF0b3IgcHJvdmlkZWRcbiAgICBpZiAodGFyZ2V0UmVxdWlyZXNDcmVkZW50aWFscyh0YXJnZXQpICYmIGVudlZhbGlkYXRvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICBpZiAoY29uZmlnLmlzQXdzQ3JlZGVudGlhbHNEdW1wKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXUyBjcmVkZW50aWFscyBETyBOT1QgZXhpc3QsIHBsZWFzZSBjb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzIGZpcnN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZvciBidWlsZCBjb21tYW5kLCB3ZSdsbCBzaG93IGEgd2FybmluZyBidXQgYWxsb3cgdGhlIGJ1aWxkIHRvIGNvbnRpbnVlXG4gICAgICAgIC8vIHNpbmNlIHRoZSBidWlsZCBpdHNlbGYgZG9lc24ndCByZXF1aXJlIEFXUyBjcmVkZW50aWFscywgb25seSBkZXBsb3ltZW50IGRvZXNcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRnJpZW5kbHlFbnZpcm9ubWVudEVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0FXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZGltKCdCdWlsZGluZyB3aXRob3V0IEFXUyBjcmVkZW50aWFscy4gWW91IHdpbGwgbmVlZCB0byBjb25maWd1cmUgdGhlbSBiZWZvcmUgZGVwbG95bWVudC4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkU3RhdGljSHRtbCgpO1xuXG4gICAgY29uc3QgYnVpbGRTZXJ2aWNlID0gbmV3IEJ1aWxkU2VydmljZShjd2QpO1xuXG4gICAgbG9nZ2VyLmluZm8oY2hhbGsuYm9sZCgnQnVpbGRpbmcgUnVudGltZSBhcHBsaWNhdGlvbi4uLicpKTtcbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICBsZXQgcmVzdWx0czogQnVpbGRSZXN1bHRbXTtcbiAgICBsZXQgc2hvdWxkR2VuZXJhdGVUeXBlcyA9IGZhbHNlO1xuXG4gICAgaWYgKHRhcmdldCA9PT0gJ2FsbCcpIHtcbiAgICAgIC8vIEJ1aWxkIGFsbCB0YXJnZXRzXG4gICAgICAvLyBPbmx5IGdlbmVyYXRlIHR5cGVzIGZvciBSdW50aW1lIHBhY2thZ2UgaXRzZWxmLCBub3QgY29uc3VtZXIgcHJvamVjdHNcbiAgICAgIGNvbnN0IGlzUnVudGltZVBhY2thZ2UgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjd2QsICdzcmMvY29yZS9pbmRleC50cycpKTtcbiAgICAgIHNob3VsZEdlbmVyYXRlVHlwZXMgPSBpc1J1bnRpbWVQYWNrYWdlO1xuICAgICAgcmVzdWx0cyA9IGF3YWl0IGJ1aWxkQWxsVGFyZ2V0cyhidWlsZFNlcnZpY2UsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnVpbGQgc3BlY2lmaWMgdGFyZ2V0XG4gICAgICByZXN1bHRzID0gYXdhaXQgYnVpbGRTaW5nbGVUYXJnZXQoYnVpbGRTZXJ2aWNlLCB0YXJnZXQsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBpZiBidWlsZGluZyBhbGwgdGFyZ2V0cyAoUnVudGltZSBwYWNrYWdlIG9ubHkpXG4gICAgaWYgKHNob3VsZEdlbmVyYXRlVHlwZXMpIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlVHlwZURlY2xhcmF0aW9ucyhidWlsZFNlcnZpY2UsIGNvbmZpZywgbG9nZ2VyKTtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IGJ1aWxkIHN1bW1hcnlcbiAgICBkaXNwbGF5QnVpbGRTdW1tYXJ5KHJlc3VsdHMsIGN3ZCwgbG9nZ2VyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZXhpdENvZGU6IDAsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5kaW0oZXJyb3IuaGludCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcbiAgICAgIGV4aXRDb2RlOiAxLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBhbGwgdGFyZ2V0cyBzZXF1ZW50aWFsbHkgd2l0aCBwcm9ncmVzcyBpbmRpY2F0b3JzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWxsVGFyZ2V0cyhcbiAgYnVpbGRTZXJ2aWNlOiBCdWlsZFNlcnZpY2UsXG4gIGNvbmZpZzogYW55LFxuICBsb2dnZXI6IExvZ2dlcixcbik6IFByb21pc2U8QnVpbGRSZXN1bHRbXT4ge1xuICAvLyBDaGVjayBpZiB3ZSdyZSBpbiB0aGUgUnVudGltZSBwYWNrYWdlIGl0c2VsZiBvciBhIGNvbnN1bWVyIHByb2plY3RcbiAgY29uc3QgaXNSdW50aW1lUGFja2FnZSA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdzcmMvY29yZS9pbmRleC50cycpKTtcblxuICAvLyBGb3IgY29uc3VtZXIgcHJvamVjdHMsIG9ubHkgYnVpbGQgUmVhY3RcbiAgLy8gTGFtYmRhIGFuZCBDREsgYXJlIGludGVybmFsIHRvIFJ1bnRpbWUgYW5kIHByZS1idWlsdCBpbiB0aGUgcGFja2FnZVxuICBjb25zdCB0YXJnZXRzOiBCdWlsZFRhcmdldFtdID0gaXNSdW50aW1lUGFja2FnZVxuICAgID8gWydyZWFjdCcsICdsYW1iZGEnLCAnY2RrJ11cbiAgICA6IFsncmVhY3QnXTtcblxuICBjb25zdCByZXN1bHRzOiBCdWlsZFJlc3VsdFtdID0gW107XG5cbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IHNwaW5uZXIgPSBsb2dnZXIuc3Bpbm5lcihgQnVpbGRpbmcgJHt0YXJnZXR9IGJ1bmRsZS4uLmApO1xuICAgIHNwaW5uZXIuc3RhcnQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2VydmljZS5idWlsZFRhcmdldCh0YXJnZXQsIGNvbmZpZyk7XG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgJHtjYXBpdGFsaXplKHRhcmdldCl9IGJ1bmRsZSAoJHtmb3JtYXREdXJhdGlvbihyZXN1bHQuZHVyYXRpb24pfSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bpbm5lci5mYWlsKGAke2NhcGl0YWxpemUodGFyZ2V0KX0gYnVuZGxlIGZhaWxlZGApO1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkRXJyb3IoXG4gICAgICAgIGBCdWlsZCBmYWlsZWQgZm9yIHRhcmdldCAnJHt0YXJnZXR9J2AsXG4gICAgICAgIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQnVpbGQgYSBzaW5nbGUgdGFyZ2V0IHdpdGggcHJvZ3Jlc3MgaW5kaWNhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU2luZ2xlVGFyZ2V0KFxuICBidWlsZFNlcnZpY2U6IEJ1aWxkU2VydmljZSxcbiAgdGFyZ2V0OiBCdWlsZFRhcmdldCxcbiAgY29uZmlnOiBhbnksXG4gIGxvZ2dlcjogTG9nZ2VyLFxuKTogUHJvbWlzZTxCdWlsZFJlc3VsdFtdPiB7XG4gIGNvbnN0IHNwaW5uZXIgPSBsb2dnZXIuc3Bpbm5lcihgQnVpbGRpbmcgJHt0YXJnZXR9IGJ1bmRsZS4uLmApO1xuICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTZXJ2aWNlLmJ1aWxkVGFyZ2V0KHRhcmdldCwgY29uZmlnKTtcblxuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBzcGlubmVyLnN1Y2NlZWQoYCR7Y2FwaXRhbGl6ZSh0YXJnZXQpfSBidW5kbGUgKCR7Zm9ybWF0RHVyYXRpb24ocmVzdWx0LmR1cmF0aW9uKX0pYCk7XG4gIH0gZWxzZSB7XG4gICAgc3Bpbm5lci5mYWlsKGAke2NhcGl0YWxpemUodGFyZ2V0KX0gYnVuZGxlIGZhaWxlZGApO1xuICAgIHRocm93IG5ldyBCdWlsZEVycm9yKFxuICAgICAgYEJ1aWxkIGZhaWxlZCBmb3IgdGFyZ2V0ICcke3RhcmdldH0nYCxcbiAgICAgIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHRdO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZURlY2xhcmF0aW9ucyhcbiAgYnVpbGRTZXJ2aWNlOiBCdWlsZFNlcnZpY2UsXG4gIGNvbmZpZzogYW55LFxuICBsb2dnZXI6IExvZ2dlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoJ0dlbmVyYXRpbmcgdHlwZSBkZWNsYXJhdGlvbnMuLi4nKTtcbiAgc3Bpbm5lci5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRTZXJ2aWNlLmdlbmVyYXRlVHlwZXMoY29uZmlnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1R5cGUgZGVjbGFyYXRpb25zJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdUeXBlIGRlY2xhcmF0aW9ucyBmYWlsZWQnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgYnVpbGQgc3VtbWFyeSB3aXRoIGFydGlmYWN0IGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlCdWlsZFN1bW1hcnkoXG4gIHJlc3VsdHM6IEJ1aWxkUmVzdWx0W10sXG4gIGN3ZDogc3RyaW5nLFxuICBsb2dnZXI6IExvZ2dlcixcbik6IHZvaWQge1xuICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgLy8gQ2FsY3VsYXRlIHRvdGFsIGR1cmF0aW9uXG4gIGNvbnN0IHRvdGFsRHVyYXRpb24gPSByZXN1bHRzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLmR1cmF0aW9uLCAwKTtcblxuICBsb2dnZXIuc3VjY2VzcyhjaGFsay5ib2xkKGBCdWlsZCBjb21wbGV0ZSBpbiAke2Zvcm1hdER1cmF0aW9uKHRvdGFsRHVyYXRpb24pfWApKTtcblxuICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0FydGlmYWN0czonKSk7XG5cbiAgLy8gRGlzcGxheSBlYWNoIGFydGlmYWN0IHdpdGggc2l6ZVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsIHJlc3VsdC5vdXRwdXRQYXRoKTtcbiAgICAgIGNvbnN0IHNpemUgPSBnZXRGaWxlU2l6ZShmdWxsUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGN3ZCwgZnVsbFBhdGgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKCcgICcpLFxuICAgICAgICBjaGFsay53aGl0ZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgICBjaGFsay5kaW0oYCgke3NpemV9KWApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG59XG5cbi8qKlxuICogR2V0IGZpbGUgc2l6ZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gZ2V0RmlsZVNpemUoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZvcm1hdEJ5dGVzKHN0YXRzLnNpemUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGJ5dGVzIHRvIGh1bWFuLXJlYWRhYmxlIHNpemVcbiAqL1xuZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChieXRlcyA9PT0gMCkgcmV0dXJuICcwIEInO1xuXG4gIGNvbnN0IGsgPSAxMDI0O1xuICBjb25zdCBzaXplcyA9IFsnQicsICdLQicsICdNQicsICdHQiddO1xuICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG5cbiAgcmV0dXJuIGAkeyhieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDEpfSAke3NpemVzW2ldfWA7XG59XG5cbi8qKlxuICogRm9ybWF0IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB0byBodW1hbi1yZWFkYWJsZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtcyA8IDEwMDApIHtcbiAgICByZXR1cm4gYCR7bXN9bXNgO1xuICB9XG5cbiAgY29uc3Qgc2Vjb25kcyA9IChtcyAvIDEwMDApLnRvRml4ZWQoMSk7XG4gIHJldHVybiBgJHtzZWNvbmRzfXNgO1xufVxuXG4vKipcbiAqIENhcGl0YWxpemUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENvbW1hbmRSZXN1bHQsIExvZ2dlciB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgYXMgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnQGJpbi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgQ2RrSW5pdFNlcnZpY2UsXG4gICAgQ2RrQm9vdHN0cmFwU2VydmljZSxcbiAgICBQYWNrYWdlTWFuYWdlcixcbiAgICBQYWNrYWdlTWFuYWdlclNlcnZpY2UsXG4gICAgQXdzQ3JlZGVudGlhbHNEZXRlY3RvcixcbiAgICBsb2dDcmVkZW50aWFsc0Vycm9yLFxuICAgIEF3c1JlZ2lvblJlc29sdmVyLFxuICAgIFByb21wdFNlcnZpY2UsXG4gICAgVmFsaWRhdGlvbkVycm9yLFxuICAgIEVudmlyb25tZW50VmFsaWRhdG9yLFxufSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBydW50aW1lIGluaXQgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVJbml0T3B0aW9ucyB7XG4gICAgLyoqIFRhcmdldCBkaXJlY3RvcnkgZm9yIHRoZSBuZXcgcHJvamVjdCAqL1xuICAgIGRpcj86IHN0cmluZztcbiAgICAvKiogVGVtcGxhdGUgbmFtZSB0byB1c2UgKi9cbiAgICB0ZW1wbGF0ZT86IHN0cmluZztcbiAgICAvKiogSW5pdGlhbGl6ZSBDREsgaW5mcmFzdHJ1Y3R1cmUgb25seSAqL1xuICAgIGNkaz86IGJvb2xlYW47XG4gICAgLyoqIFByb2plY3QgY29yZSBpbnN0YW5jZTogYWx3YXlzIHJ1bnRpbWUtd2ViIGZvciBydW50aW1lIHBhY2thZ2UgKi9cbiAgICBjb3JlPzogc3RyaW5nO1xuICAgIC8qKiBGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKi9cbiAgICBmb3JjZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBSdW50aW1lIHByb2plY3QgdXNpbmcgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZXNcbiAqIFxuICogVGhpcyBjb21tYW5kIGV4dGVuZHMgcHVyZW5vdydzIGluaXQgZnVuY3Rpb25hbGl0eSBidXQgdXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gKiB0byBlbnN1cmUgdGVtcGxhdGVzIGFyZSByZXNvbHZlZCBmcm9tIHRoZSBydW50aW1lIHBhY2thZ2UncyBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bnRpbWVJbml0Q29tbWFuZChcbiAgICBvcHRpb25zOiBSdW50aW1lSW5pdE9wdGlvbnMsXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudlZhbGlkYXRvcj86IEVudmlyb25tZW50VmFsaWRhdG9yLFxuKTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gICAgLy8gTm90ZTogZW52VmFsaWRhdG9yIGlzIG9wdGlvbmFsIGFuZCBvbmx5IHVzZWQgZm9yIENESyBib290c3RyYXBcbiAgICAvLyBJbml0IGNvbW1hbmQgZG9lcyBOT1QgcmVxdWlyZSBBV1MgY3JlZGVudGlhbHNcbiAgICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoXG4gICAgICAgIG9wdGlvbnMuY2RrID8gJ0luaXRpYWxpemluZyBDREsgaW5mcmFzdHJ1Y3R1cmUuLi4nIDogJ0luaXRpYWxpemluZyBSdW50aW1lIHByb2plY3QuLi4nLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBDcmVhdGUgcnVudGltZSB0ZW1wbGF0ZSBzZXJ2aWNlICh1c2VzIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UpXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlU2VydmljZSA9IG5ldyBUZW1wbGF0ZVNlcnZpY2UoY3dkKTtcbiAgICAgICAgY29uc3QgcHJvbXB0U2VydmljZSA9IG5ldyBQcm9tcHRTZXJ2aWNlKCk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgQ0RLIGRpcmVjdG9yeSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKHVubGVzcyBmb3JjZSBmbGFnIGlzIHNldClcbiAgICAgICAgaWYgKG9wdGlvbnMuY2RrICYmICFvcHRpb25zLmZvcmNlICYmIHRlbXBsYXRlU2VydmljZS5jZGtEaXJlY3RvcnlFeGlzdHMoY3dkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgICAnQ0RLIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cycsXG4gICAgICAgICAgICAgICAgJ1VzZSAtLWZvcmNlIGZsYWcgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIENESyBpbmZyYXN0cnVjdHVyZScsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBvcHRpb25zIHdpdGggcnVudGltZS1zcGVjaWZpYyBkZWZhdWx0c1xuICAgICAgICBjb25zdCB0YXJnZXREaXIgPSBvcHRpb25zLmRpciB8fCAob3B0aW9ucy5jZGsgPyAnY2RrJyA6IGN3ZCk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gb3B0aW9ucy5jZGsgPyAnY2RrJyA6IChvcHRpb25zLnRlbXBsYXRlIHx8ICdiYXNpYycpO1xuICAgICAgICBjb25zdCBjb3JlID0gJ3J1bnRpbWUtd2ViJzsgLy8gQWx3YXlzIHVzZSBydW50aW1lLXdlYiBmb3IgcnVudGltZSBwYWNrYWdlXG4gICAgICAgIGxldCBmb3JjZSA9IG9wdGlvbnMuZm9yY2UgfHwgZmFsc2U7XG5cbiAgICAgICAgLy8gRGVyaXZlIHByb2plY3QgbmFtZSBmcm9tIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGN3ZCwgb3B0aW9ucy5jZGsgPyBjd2QgOiB0YXJnZXREaXIpKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXhpc3RpbmcgcHJvamVjdCBmaWxlcyAoaWYgbm90IENESy1vbmx5IGluaXQpXG4gICAgICAgIGlmICghb3B0aW9ucy5jZGsgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFRhcmdldERpciA9IHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpcik7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0ZpbGVzID0gYXdhaXQgY2hlY2tFeGlzdGluZ1Byb2plY3RGaWxlcyhyZXNvbHZlZFRhcmdldERpcik7XG5cbiAgICAgICAgICAgIGlmIChleGlzdGluZ0ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGlzdGluZyBwcm9qZWN0IGZpbGVzIGRldGVjdGVkOicpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nRmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIC0gJHtmaWxlfWApKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkT3ZlcndyaXRlID0gYXdhaXQgcHJvbXB0U2VydmljZS5jb25maXJtKFxuICAgICAgICAgICAgICAgICAgICAnRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZXNlIGZpbGVzPycsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBEZWZhdWx0IHRvIE5vXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghc2hvdWxkT3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9qZWN0IGluaXRpYWxpemF0aW9uIGNhbmNlbGxlZC4gRXhpc3RpbmcgZmlsZXMgcHJlc2VydmVkLicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFVzZXIgY29uZmlybWVkIG92ZXJ3cml0ZVxuICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNwaW5uZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyBVc2UgUnVudGltZVRlbXBsYXRlU2VydmljZSB0byBzY2FmZm9sZCB3aXRoIHJ1bnRpbWUtd2ViIHRlbXBsYXRlc1xuICAgICAgICBhd2FpdCB0ZW1wbGF0ZVNlcnZpY2Uuc2NhZmZvbGQoXG4gICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgIHRhcmdldERpciwge1xuICAgICAgICAgICAgcHJvamVjdE5hbWUsXG4gICAgICAgICAgICBmb3JjZSxcbiAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcmUsIC8vIEFsd2F5cyBydW50aW1lLXdlYlxuICAgICAgICApO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChcbiAgICAgICAgICAgIG9wdGlvbnMuY2RrID8gJ0NESyBpbmZyYXN0cnVjdHVyZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkhJyA6ICdSdW50aW1lIHByb2plY3QgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRGlzcGxheSBzdWNjZXNzIG1lc3NhZ2UgYW5kIG5leHQgc3RlcHNcbiAgICAgICAgaWYgKG9wdGlvbnMuY2RrKSB7XG4gICAgICAgICAgICBkaXNwbGF5Q2RrU3VjY2Vzc01lc3NhZ2UobG9nZ2VyLCBwcm9qZWN0TmFtZSwgdGFyZ2V0RGlyLCBjd2QpO1xuXG4gICAgICAgICAgICAvLyBGb3IgQ0RLLW9ubHkgaW5pdCwgY2hlY2sgY3JlZGVudGlhbHMgYW5kIG9mZmVyIGJvb3RzdHJhcFxuICAgICAgICAgICAgaWYgKGVudlZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2RrRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDZGtPbmx5Q3JlZGVudGlhbHMobG9nZ2VyLCBlbnZWYWxpZGF0b3IsIHJlc29sdmVkQ2RrRGlyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYXlSdW50aW1lU3VjY2Vzc01lc3NhZ2UobG9nZ2VyLCBwcm9qZWN0TmFtZSwgdGFyZ2V0RGlyLCBjd2QpO1xuXG4gICAgICAgICAgICAvLyBBZnRlciBtYWluIHByb2plY3QgaW5pdGlhbGl6YXRpb24sIHByb21wdCBmb3IgQ0RLIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgICBjb25zdCBwcm9tcHRTZXJ2aWNlID0gbmV3IFByb21wdFNlcnZpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEluaXRDZGsgPSBhd2FpdCBwcm9tcHRTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICAgICAgICAgJ0RvIHlvdSB3YW50IHRvIGluaXRpYWxpemUgQVdTIENESyBpbmZyYXN0cnVjdHVyZSBmb3IgdGhpcyBwcm9qZWN0IG5vdz8nLFxuICAgICAgICAgICAgICAgIHRydWUsIC8vIERlZmF1bHQgdG8gWWVzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc2hvdWxkSW5pdENkaykge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgQ0RLIHdvcmtmbG93IHdpdGggcnVudGltZS13ZWIgY29yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNka1Jlc3VsdCA9IGF3YWl0IGluaXRpYWxpemVDZGtXb3JrZmxvdyhcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKSxcbiAgICAgICAgICAgICAgICAgICAgY29yZSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICBlbnZWYWxpZGF0b3IsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghY2RrUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ0RLIGluaXRpYWxpemF0aW9uIGZhaWxlZCwgYnV0IG1haW4gcHJvamVjdCBpcyBPS1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignQ0RLIGluaXRpYWxpemF0aW9uIGZhaWxlZCwgYnV0IHlvdXIgUnVudGltZSBwcm9qZWN0IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gaW5pdGlhbGl6ZSBDREsgbGF0ZXIgYnkgcnVubmluZzogbnBtIGluc3RhbGwgJiYgcnVudGltZSBpbml0IC0tY2RrJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2VyIGRlY2xpbmVkIENESyBpbml0aWFsaXphdGlvblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1lvdSBjYW4gaW5pdGlhbGl6ZSBDREsgbGF0ZXIgYnkgcnVubmluZzogbnBtIGluc3RhbGwgJiYgcnVudGltZSBpbml0IC0tY2RrJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKG9wdGlvbnMuY2RrID8gJ0ZhaWxlZCB0byBpbml0aWFsaXplIENESyBpbmZyYXN0cnVjdHVyZScgOiAnRmFpbGVkIHRvIGluaXRpYWxpemUgUnVudGltZSBwcm9qZWN0Jyk7XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbShlcnJvci5oaW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBzdWNjZXNzIG1lc3NhZ2UgZm9yIFJ1bnRpbWUgcHJvamVjdHMgd2l0aCBuZXh0IHN0ZXBzXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlSdW50aW1lU3VjY2Vzc01lc3NhZ2UoXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXREaXI6IHN0cmluZyxcbiAgICBjd2Q6IHN0cmluZyxcbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKTtcbiAgICBjb25zdCBpc0N1cnJlbnREaXIgPSByZXNvbHZlZERpciA9PT0gY3dkO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoY2hhbGsuYm9sZChgUnVudGltZSBwcm9qZWN0ICcke3Byb2plY3ROYW1lfScgY3JlYXRlZCBzdWNjZXNzZnVsbHkhYCkpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnUHJvamVjdCBzdHJ1Y3R1cmU6JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgc3JjLycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTAyICAgXHUyNTFDXHUyNTAwXHUyNTAwIGluZGV4LnRzeCAgICAgICAjIFJlYWN0IGFwcCBlbnRyeScpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTAyICAgXHUyNTFDXHUyNTAwXHUyNTAwIEFwcC50c3ggICAgICAgICAjIFJvb3QgY29tcG9uZW50JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MDIgICBcdTI1MTRcdTI1MDBcdTI1MDAgcm91dGVzLnRzeCAgICAgICMgUmVhY3QgUm91dGVyIHJvdXRlcycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHB1YmxpYy8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxNFx1MjUwMFx1MjUwMCBpbmRleC5odG1sJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgcnVudGltZS5jb25maWcudHMgICAjIFJ1bnRpbWUgY29uZmlndXJhdGlvbicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHRzY29uZmlnLmpzb24gICAgICAgIyBUeXBlU2NyaXB0IGNvbmZpZycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTE0XHUyNTAwXHUyNTAwIHBhY2thZ2UuanNvbicpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ05leHQgc3RlcHM6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBpZiAoIWlzQ3VycmVudERpcikge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGAgIGNkICR7cGF0aC5yZWxhdGl2ZShjd2QsIHJlc29sdmVkRGlyKX1gKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGV2ZWxvcG1lbnQ6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXYnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgU3RhcnQgbG9jYWwgZGV2ZWxvcG1lbnQgc2VydmVyJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnQnVpbGQgJiBEZXBsb3k6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBidWlsZCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBCdWlsZCBhbGwgdGFyZ2V0cyAoUmVhY3QsIExhbWJkYSwgQ0RLKScpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIERlcGxveSB0byBBV1MnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcdUQ4M0RcdURDREEgTGVhcm4gbW9yZTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIGh0dHBzOi8vcnVudGltZXdlYi5jb20vZG9jcycpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbn1cblxuLyoqXG4gKiBEaXNwbGF5IENESy1zcGVjaWZpYyBzdWNjZXNzIG1lc3NhZ2Ugd2l0aCBuZXh0IHN0ZXBzXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlDZGtTdWNjZXNzTWVzc2FnZShcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICAgIHRhcmdldERpcjogc3RyaW5nLFxuICAgIGN3ZDogc3RyaW5nLFxuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZWREaXIgPSBwYXRoLnJlc29sdmUoY3dkLCB0YXJnZXREaXIpO1xuICAgIGNvbnN0IHJlbGF0aXZlRGlyID0gcGF0aC5yZWxhdGl2ZShjd2QsIHJlc29sdmVkRGlyKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgIGxvZ2dlci5zdWNjZXNzKGNoYWxrLmJvbGQoYENESyBpbmZyYXN0cnVjdHVyZSBmb3IgJyR7cHJvamVjdE5hbWV9JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFgKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdDREsgc3RydWN0dXJlOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgY2RrLycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIGJpbi8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxNFx1MjUwMFx1MjUwMCBhcHAudHMgICAgICAgICAgIyBDREsgYXBwIGVudHJ5IHBvaW50JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgY2RrLmpzb24gICAgICAgICAgICAjIENESyBjb25maWd1cmF0aW9uJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MUNcdTI1MDBcdTI1MDAgdHNjb25maWcuanNvbiAgICAgICAjIFR5cGVTY3JpcHQgY29uZmlnJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MTRcdTI1MDBcdTI1MDAgLmVudi5leGFtcGxlICAgICAgICAjIEVudmlyb25tZW50IHZhcmlhYmxlcyB0ZW1wbGF0ZScpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1JlYWR5IHRvIGRlcGxveTonKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYCAgY2QgJHtyZWxhdGl2ZURpcn1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgQWxsIGRlcGVuZGVuY2llcyBhcmUgYWxyZWFkeSBpbnN0YWxsZWQnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdEZXBsb3kgdG8gQVdTOicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgaW5pdCAtLWNkaycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBCb290c3RyYXAgQ0RLIChvbmx5IG5lZWRlZCBvbmNlIHBlciBhY2NvdW50L3JlZ2lvbiknKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIGNkayBkaWZmJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIFByZXZpZXcgY2hhbmdlcyBiZWZvcmUgZGVwbG95aW5nJykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBkZXYnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgRGVwbG95IHlvdXIgaW5mcmFzdHJ1Y3R1cmUnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcdUQ4M0NcdURGQUYgRGVwbG95IHRvIGRpZmZlcmVudCBzdGFnZXM6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBkZXYnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBzdGFnaW5nJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgcHJvZCcpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1x1RDgzRFx1RENEQSBMZWFybiBtb3JlOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgUnVudGltZSBDREs6IGh0dHBzOi8vcnVudGltZXdlYi5jb20vZG9jcy9jZGsnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIEFXUyBDREs6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxufVxuXG4vKipcbiAqIEluaXRpYWxpemUgQ0RLIGluZnJhc3RydWN0dXJlIHdvcmtmbG93IHVzaW5nIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUNka1dvcmtmbG93KFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByb2plY3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvamVjdERpcjogc3RyaW5nLFxuICAgIGNvcmU6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZVNlcnZpY2U6IFRlbXBsYXRlU2VydmljZSxcbiAgICBlbnZWYWxpZGF0b3I/OiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbik6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIC8vIEltcG9ydCB0aGUgQ0RLIHdvcmtmbG93IGxvZ2ljIGZyb20gcHVyZW5vdyBidXQgdXNlIG91ciBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gICAgY29uc3Qge1xuICAgICAgICBQcm9tcHRTZXJ2aWNlLFxuICAgICAgICBQYWNrYWdlTWFuYWdlclNlcnZpY2UsXG4gICAgICAgIENka0luaXRTZXJ2aWNlLFxuICAgICAgICBBd3NDcmVkZW50aWFsc0RldGVjdG9yLFxuICAgICAgICBBd3NSZWdpb25SZXNvbHZlcixcbiAgICB9ID0gYXdhaXQgaW1wb3J0KCdAd29ya3RpZi9wdXJlbm93L2JpbicpO1xuXG4gICAgY29uc3QgcHJvbXB0U2VydmljZSA9IG5ldyBQcm9tcHRTZXJ2aWNlKCk7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXJTZXJ2aWNlID0gbmV3IFBhY2thZ2VNYW5hZ2VyU2VydmljZSgpO1xuICAgIGNvbnN0IGNka0luaXRTZXJ2aWNlID0gbmV3IENka0luaXRTZXJ2aWNlKHRlbXBsYXRlU2VydmljZSwgcGFja2FnZU1hbmFnZXJTZXJ2aWNlLCBsb2dnZXIpO1xuICAgIGNvbnN0IGF3c0RldGVjdG9yID0gbmV3IEF3c0NyZWRlbnRpYWxzRGV0ZWN0b3IoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgICAgICAvLyBDaGVjayBpZiAvY2RrIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2RrRXhpc3RzID0gYXdhaXQgY2RrSW5pdFNlcnZpY2UuY2hlY2tDZGtEaXJlY3RvcnlFeGlzdHMocHJvamVjdERpcik7XG5cbiAgICAgICAgaWYgKGNka0V4aXN0cykge1xuICAgICAgICAgICAgLy8gUHJvbXB0IGZvciBvdmVyd3JpdGVcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZE92ZXJ3cml0ZSA9IGF3YWl0IHByb21wdFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgICAgICAgICAnQSAvY2RrIGZvbGRlciBhbHJlYWR5IGV4aXN0cy4gT3ZlcndyaXRlIGl0PycsXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIERlZmF1bHQgdG8gTm9cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghc2hvdWxkT3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBkZWNsaW5lZCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeGlzdGluZyBDREsgc2V0dXAgcHJlc2VydmVkLicpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgQVdTIHJlZ2lvbiB1c2luZyBTREsncyBkZWZhdWx0IHByb3ZpZGVyIGNoYWluXG4gICAgICAgIGNvbnN0IHJlZ2lvblJlc29sdmVyID0gbmV3IEF3c1JlZ2lvblJlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lvblJlc3VsdCA9IGF3YWl0IHJlZ2lvblJlc29sdmVyLnJlc29sdmVSZWdpb24oKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRSZWdpb24gPSByZWdpb25SZXN1bHQucmVnaW9uIHx8IEF3c1JlZ2lvblJlc29sdmVyLmdldERlZmF1bHRSZWdpb24oKTtcblxuICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIEFXUyByZWdpb246ICR7cmVzb2x2ZWRSZWdpb259IChzb3VyY2U6ICR7cmVnaW9uUmVzdWx0LnNvdXJjZX0pYCk7XG5cbiAgICAgICAgLy8gTG9hZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gKHVzZSBkZWZhdWx0cyBpZiBub3QgYXZhaWxhYmxlKVxuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBwcm9qZWN0TmFtZSxcbiAgICAgICAgICAgIHN0YWdlOiAnZGV2JyxcbiAgICAgICAgICAgIHJlZ2lvbjogcmVzb2x2ZWRSZWdpb24sXG4gICAgICAgICAgICBlbmFibGVTZW86IHRydWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRGV0ZWN0IHBhY2thZ2UgbWFuYWdlclxuICAgICAgICBjb25zdCBkZXRlY3RlZE1hbmFnZXIgPSBwYWNrYWdlTWFuYWdlclNlcnZpY2UuZGV0ZWN0UGFja2FnZU1hbmFnZXIocHJvamVjdERpcik7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIHBhY2thZ2UgbWFuYWdlcjogJHtjaGFsay5jeWFuKGRldGVjdGVkTWFuYWdlcil9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgICAgICAvLyBJbml0aWFsaXplIENESyB3aXRoIGF1dG9tYXRlZCBpbnN0YWxsYXRpb25cbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IGxvZ2dlci5zcGlubmVyKCdJbml0aWFsaXppbmcgQ0RLIGluZnJhc3RydWN0dXJlLi4uJyk7XG4gICAgICAgIHNwaW5uZXIuc3RhcnQoKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjZGtJbml0U2VydmljZS5pbml0aWFsaXplQ2RrKHtcbiAgICAgICAgICAgIHByb2plY3REaXIsXG4gICAgICAgICAgICBwcm9qZWN0TmFtZTogY29uZmlnLnByb2plY3ROYW1lLFxuICAgICAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgICAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICAgICAgICAgIGVuYWJsZVNlbzogY29uZmlnLmVuYWJsZVNlbyxcbiAgICAgICAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nOiBjZGtFeGlzdHMsXG4gICAgICAgICAgICBydW5Cb290c3RyYXA6IGZhbHNlLCAvLyBXZSdsbCBoYW5kbGUgYm9vdHN0cmFwIHNlcGFyYXRlbHlcbiAgICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyOiBkZXRlY3RlZE1hbmFnZXIsXG4gICAgICAgIH0sIGNvcmUpO1xuXG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGluaXRpYWxpemUgQ0RLIGluZnJhc3RydWN0dXJlJyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHJlc3VsdC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0NESyBpbmZyYXN0cnVjdHVyZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSBpbnN0YWxsYXRpb24gc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LnByb2plY3REZXBlbmRlbmNpZXNJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmdyZWVuKCdcdTI3MTMgUHJvamVjdCBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuY2RrRGVwZW5kZW5jaWVzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5ncmVlbignXHUyNzEzIENESyBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlIGNyZWRlbnRpYWxzIGNoZWNrIGZvciBDREstb25seSBpbml0IChydW50aW1lIGluaXQgLS1jZGspXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNka09ubHlDcmVkZW50aWFscyhcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBlbnZWYWxpZGF0b3I6IEVudmlyb25tZW50VmFsaWRhdG9yLFxuICAgIGNka0Rpcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBnZXQgdmFsaWRhdGVkIGNvbmZpZ1xuICAgICAgICBjb25zdCBjb25maWcgPSBlbnZWYWxpZGF0b3IuZ2V0Q29uZmlnKCk7XG4gICAgICAgIGNvbnN0IGlzQXdzQ3JlZGVudGlhbHNWYWxpZCA9ICFjb25maWcuaXNBd3NDcmVkZW50aWFsc0R1bXAoKTtcblxuICAgICAgICBpZiAoIWlzQXdzQ3JlZGVudGlhbHNWYWxpZCkge1xuICAgICAgICAgICAgbG9nQ3JlZGVudGlhbHNFcnJvcihsb2dnZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ3JlZGVudGlhbHMgYXJlIHZhbGlkIC0gaW5mb3JtIHVzZXJcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmdyZWVuKCdcdTI3MTMgQVdTIGNyZWRlbnRpYWxzIGRldGVjdGVkJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdZb3VyIENESyBpbmZyYXN0cnVjdHVyZSBpcyByZWFkeS4gWW91IGNhbiBub3c6Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBpbml0IC0tY2RrICAgICAgICAgICMgQm9vdHN0cmFwIHlvdXIgQVdTIGVudmlyb25tZW50IChmaXJzdCB0aW1lIG9ubHkpJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBucHggcnVudGltZSBkZXBsb3kgLS1zdGFnZSBkZXYgICMgRGVwbG95IHlvdXIgaW5mcmFzdHJ1Y3R1cmUnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIENyZWRlbnRpYWxzIHZhbGlkYXRpb24gZmFpbGVkIC0gZGlzcGxheSBmcmllbmRseSB3YXJuaW5nXG4gICAgICAgICAgICBsb2dnZXIud2FybihjaGFsay55ZWxsb3coJyEgIEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZC4nKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NESyBpbmZyYXN0cnVjdHVyZSBmaWxlcyB3ZXJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IGluIC9jZGsnKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdIb3dldmVyLCBBV1MgY3JlZGVudGlhbHMgYXJlIHJlcXVpcmVkIGZvciBkZXBsb3ltZW50LicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBiZWZvcmUgZGVwbG95aW5nOicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ09wdGlvbiAxOiBBV1MgQ0xJIChSZWNvbW1lbmRlZCknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBhd3MgY29uZmlndXJlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ09wdGlvbiAyOiBFbnZpcm9ubWVudCBWYXJpYWJsZXMnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX0FDQ0VTU19LRVlfSUQ9eW91cl9rZXlfaWQnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZPXlvdXJfc2VjcmV0X2tleScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAkIGV4cG9ydCBBV1NfUkVHSU9OPXVzLWVhc3QtMScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdPcHRpb24gMzogQVdTIFByb2ZpbGUnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX1BST0ZJTEU9eW91cl9wcm9maWxlX25hbWUnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FmdGVyIGNvbmZpZ3VyaW5nIGNyZWRlbnRpYWxzLCB5b3UgY2FuIGRlcGxveSBieSBydW5uaW5nOicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgaW5pdCAtLWNkayAgICAgICAgICAjIEJvb3RzdHJhcCB5b3VyIEFXUyBlbnZpcm9ubWVudCAoZmlyc3QgdGltZSBvbmx5KScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2ICAjIERlcGxveSB5b3VyIGluZnJhc3RydWN0dXJlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuZXhwZWN0ZWQgZXJyb3IgLSByZXRocm93XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgZXhpc3RpbmcgcHJvamVjdCBmaWxlcyB0aGF0IHdvdWxkIGJlIG92ZXJ3cml0dGVuXG4gKlxuICogQHBhcmFtIHByb2plY3REaXIgLSBQcm9qZWN0IGRpcmVjdG9yeSBwYXRoXG4gKiBAcmV0dXJucyBBcnJheSBvZiBleGlzdGluZyBmaWxlIHBhdGhzIChyZWxhdGl2ZSB0byBwcm9qZWN0IGRpcilcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tFeGlzdGluZ1Byb2plY3RGaWxlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgZXhpc3RpbmdGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEtleSBmaWxlcyB0aGF0IGluZGljYXRlIGFuIGV4aXN0aW5nIHByb2plY3RcbiAgICBjb25zdCBrZXlGaWxlcyA9IFtcbiAgICAgICAgJ3BhY2thZ2UuanNvbicsXG4gICAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgICAnc3JjL2luZGV4LnRzeCcsXG4gICAgICAgICdzcmMvQXBwLnRzeCcsXG4gICAgICAgICdydW50aW1lLmNvbmZpZy50cycsXG4gICAgICAgICdwdXJlbm93LmNvbmZpZy50cycsXG4gICAgICAgICd0c2NvbmZpZy5qc29uJyxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGtleUZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsIGZpbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGV4aXN0aW5nRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdGaWxlcztcbn0iXSwKICAibWFwcGluZ3MiOiAieW9CQUFBLElBQUFBLEdBQUFDLEdBQUEsS0FjQSxJQUFJQyxJQUNILFNBQVVBLEVBQVMsRUFHZixTQUFVQyxFQUFTLENBQ2hCLElBQUlDLEVBQU8sT0FBTyxZQUFlLFNBQVcsV0FDeEMsT0FBTyxRQUFXLFNBQVcsT0FDekIsT0FBTyxNQUFTLFNBQVcsS0FDdkIsT0FBTyxNQUFTLFNBQVcsS0FDdkJDLEVBQWUsRUFDM0JDLEVBQVdDLEVBQWFMLENBQU8sRUFDL0IsT0FBT0UsRUFBSyxRQUFZLE1BQ3hCRSxFQUFXQyxFQUFhSCxFQUFLLFFBQVNFLENB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QVdyQixhQUFpQnNCLEVBQStCLENBQ3pELElBQU1ELEVBQWlCSixFQUFVLDZCQUE2QmpCLEVBQU9tQixDQUFPLEVBQzVFLFFBQVEsTUFBTUUsQ0FBYyxDQUM5QixTQUFXckIsYUFBaUIsTUFBTyxDQUNqQyxJQUFNcUIsRUFBaUJKLEVBQVUsWUFBWWpCLEVBQU9tQixDQUFPLEVBQzNELFFBQVEsTUFBTUUsQ0FBYyxDQUM5QixNQUNFLFFBQVEsTUFBTSxpQkFBa0IsT0FBT3JCLENBQUssQ0FBQyxFQUUvQyxFQUFBQyxRQUFRLEtBQUssQ0FBQyxDQUNoQixDQUNGLEVBS08sU0FBU3NCLElBQWtDLENBQ2hELE9BQU8sSUFBSS9CLEVBQ2IiLAogICJuYW1lcyI6IFsicmVxdWlyZV9SZWZsZWN0IiwgIl9fY29tbW9uSlNNaW4iLCAiUmVmbGVjdCIsICJmYWN0b3J5IiwgInJvb3QiLCAic2xvcHB5TW9kZVRoaXMiLCAiZXhwb3J0ZXIiLCAibWFrZUV4cG9ydGVyIiwgInRhcmdldCIsICJwcmV2aW91cyIsICJrZXkiLCAidmFsdWUiLCAiZnVuY3Rpb25UaGlzIiwgImluZGlyZWN0RXZhbFRoaXMiLCAiaGFzT3duIiwgInN1cHBvcnRzU3ltYm9sIiwgInRvUHJpbWl0aXZlU3ltYm9sIiwgIml0ZXJhdG9yU3ltYm9sIiwgInN1cHBvcnRzQ3JlYXRlIiwgInN1cHBvcnRzUHJvdG8iLCAiZG93bkxldmVsIiwgIkhhc2hNYXAiLCAiTWFrZURpY3Rpb25hcnkiLCAibWFwIiwgImZ1bmN0aW9uUHJvdG90eXBlIiwgIl9NYXAiLCAiQ3JlYXRlTWFwUG9seWZpbGwiLCAiX1NldCIsICJDcmVhdGVTZXRQb2x5ZmlsbCIsICJfV2Vha01hcCIsICJDcmVhdGVXZWFrTWFwUG9seWZpbGwiLCAicmVnaXN0cnlTeW1ib2wiLCAibWV0YWRhdGFSZWdpc3RyeSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAibWV0YWRhdGFQcm92aWRlciIsICJDcmVhdGVNZXRhZGF0YVByb3ZpZGVyIiwgImRlY29yYXRlIiwgImRlY29yYXRvcnMiLCAicHJvcGVydHlLZXkiLCAiYXR0cmlidXRlcyIsICJJc1VuZGVmaW5lZCIsICJJc0FycmF5IiwgIklzQ29uc3RydWN0b3IiLCAiRGVjb3JhdGVDb25zdHJ1Y3RvciIsICJJc09iamVjdCIsICJJc051bGwiLCAiVG9Qcm9wZXJ0eUtleSIsICJEZWNvcmF0ZVByb3BlcnR5IiwgIm1ldGFkYXRhIiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhVmFsdWUiLCAiZGVjb3JhdG9yIiwgIklzUHJvcGVydHlLZXkiLCAiT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSIsICJkZWZpbmVNZXRhZGF0YSIsICJoYXNNZXRhZGF0YSIsICJPcmRpbmFyeUhhc01ldGFkYXRhIiwgImhhc093bk1ldGFkYXRhIiwgIk9yZGluYXJ5SGFzT3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlHZXRNZXRhZGF0YSIsICJnZXRPd25NZXRhZGF0YSIsICJPcmRpbmFyeUdldE93bk1ldGFkYXRhIiwgImdldE1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU1ldGFkYXRhS2V5cyIsICJnZXRPd25NZXRhZGF0YUtleXMiLCAiT3JkaW5hcnlPd25NZXRhZGF0YUtleXMiLCAiZGVsZXRlTWV0YWRhdGEiLCAicHJvdmlkZXIiLCAiR2V0TWV0YWRhdGFQcm92aWRlciIsICJpIiwgImRlY29yYXRlZCIsICJkZXNjcmlwdG9yIiwgIk1ldGFkYXRhS2V5IiwgIk8iLCAiUCIsICJwYXJlbnQiLCAiT3JkaW5hcnlHZXRQcm90b3R5cGVPZiIsICJUb0Jvb2xlYW4iLCAiTWV0YWRhdGFWYWx1ZSIsICJvd25LZXlzIiwgInBhcmVudEtleXMiLCAic2V0IiwgImtleXMiLCAiX2kiLCAib3duS2V5c18xIiwgImhhc0tleSIsICJfYSIsICJwYXJlbnRLZXlzXzEiLCAiVHlwZSIsICJ4IiwgIklzU3ltYm9sIiwgIlRvUHJpbWl0aXZlIiwgImlucHV0IiwgIlByZWZlcnJlZFR5cGUiLCAiaGludCIsICJleG90aWNUb1ByaW0iLCAiR2V0TWV0aG9kIiwgInJlc3VsdCIsICJPcmRpbmFyeVRvUHJpbWl0aXZlIiwgInRvU3RyaW5nXzEiLCAiSXNDYWxsYWJsZSIsICJ2YWx1ZU9mIiwgInRvU3RyaW5nXzIiLCAiYXJndW1lbnQiLCAiVG9TdHJpbmciLCAiU2FtZVZhbHVlWmVybyIsICJ5IiwgIlYiLCAiZnVuYyIsICJHZXRJdGVyYXRvciIsICJvYmoiLCAibWV0aG9kIiwgIml0ZXJhdG9yIiwgIkl0ZXJhdG9yVmFsdWUiLCAiaXRlclJlc3VsdCIsICJJdGVyYXRvclN0ZXAiLCAiSXRlcmF0b3JDbG9zZSIsICJmIiwgInByb3RvIiwgInByb3RvdHlwZSIsICJwcm90b3R5cGVQcm90byIsICJjb25zdHJ1Y3RvciIsICJDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwgImZhbGxiYWNrIiwgIkNyZWF0ZUZhbGxiYWNrUHJvdmlkZXIiLCAiZmlyc3QiLCAic2Vjb25kIiwgInJlc3QiLCAidGFyZ2V0UHJvdmlkZXJNYXAiLCAicmVnaXN0cnkiLCAicmVnaXN0ZXJQcm92aWRlciIsICJnZXRQcm92aWRlciIsICJzZXRQcm92aWRlciIsICJnZXRQcm92aWRlck5vQ2FjaGUiLCAibmV4dCIsICJwcm92aWRlck1hcCIsICJoYXNQcm92aWRlciIsICJleGlzdGluZ1Byb3ZpZGVyIiwgInRhcmdldE1ldGFkYXRhIiwgIk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEiLCAiR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCIsICJDcmVhdGUiLCAiY3JlYXRlZFRhcmdldE1ldGFkYXRhIiwgIm1ldGFkYXRhTWFwIiwgImtleXNPYmoiLCAiayIsICJuZXh0VmFsdWUiLCAiZSIsICJyZWZsZWN0IiwgIm1ldGFkYXRhT3duZXIiLCAibWV0YWRhdGFQcm9wZXJ0eVNldCIsICJyZWdpc3RlcmVkUHJvdmlkZXIiLCAiY2FjaGVTZW50aW5lbCIsICJhcnJheVNlbnRpbmVsIiwgIk1hcEl0ZXJhdG9yIiwgInZhbHVlcyIsICJzZWxlY3RvciIsICJpbmRleCIsICJlcnJvciIsICJNYXAiLCAic2l6ZSIsICJnZXRLZXkiLCAiZ2V0VmFsdWUiLCAiZ2V0RW50cnkiLCAiaW5zZXJ0IiwgIl8iLCAiU2V0IiwgIlVVSURfU0laRSIsICJyb290S2V5IiwgIkNyZWF0ZVVuaXF1ZUtleSIsICJXZWFrTWFwIiwgInRhYmxlIiwgIkdldE9yQ3JlYXRlV2Vha01hcFRhYmxlIiwgIkNyZWF0ZVVVSUQiLCAiY3JlYXRlIiwgIkZpbGxSYW5kb21CeXRlcyIsICJidWZmZXIiLCAiR2VuUmFuZG9tQnl0ZXMiLCAiYXJyYXkiLCAiZGF0YSIsICJvZmZzZXQiLCAiYnl0ZSIsICJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJSdW50aW1lQnVpbGRFcnJvciIsICJSdW50aW1lQ2xpRXJyb3IiLCAiUnVudGltZUNvbmZpZ0Vycm9yIiwgIlJ1bnRpbWVEZXBsb3ltZW50RXJyb3IiLCAiUnVudGltZURlcGxveW1lbnRTdHJhdGVneSIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJSdW50aW1lU3RydWN0dXJlZExvZ2dlciIsICJSdW50aW1lVGVtcGxhdGVFcnJvciIsICJSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIiwgIlJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIiwgIlJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IiLCAiUnVudGltZVdlYkNsaSIsICJSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UiLCAiYnVpbGRTdGF0aWNIdG1sIiwgImNyZWF0ZVJ1bnRpbWVDbGkiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9wcm9jZXNzIiwgImltcG9ydF9iaW4iLCAiZnMiLCAicGF0aCIsICJpbXBvcnRfYmluIiwgIlJ1bnRpbWVDbGlFcnJvciIsICJtZXNzYWdlIiwgImNvZGUiLCAiaGludCIsICJSdW50aW1lQ29uZmlnRXJyb3IiLCAiUnVudGltZUJ1aWxkRXJyb3IiLCAiUnVudGltZURlcGxveW1lbnRFcnJvciIsICJSdW50aW1lVmFsaWRhdGlvbkVycm9yIiwgIlJ1bnRpbWVDbGlFcnJvciIsICJtZXNzYWdlIiwgImhpbnQiLCAiUnVudGltZVRlbXBsYXRlRXJyb3IiLCAidGVtcGxhdGVOYW1lIiwgImNvcmVEaXIiLCAic2VhcmNoZWRQYXRocyIsICJwYWNrYWdlQ29udGV4dCIsICJyZXNvbHV0aW9uU3RyYXRlZ3kiLCAiUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IiLCAidGVtcGxhdGVEaXIiLCAidmFsaWRhdGlvbkVycm9ycyIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJlcnJvciIsICJ2ZXJib3NlIiwgImxpbmVzIiwgImZpZWxkTmFtZSIsICJzdGFja05hbWUiLCAib3BlcmF0aW9uIiwgInBhdGgiLCAidmFsaWRhdGlvbkVycm9yIiwgIlJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyIiwgIm1ldGFkYXRhIiwgImxvZ0VudHJ5IiwgIlJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UiLCAiUHVyZW5vd1RlbXBsYXRlU2VydmljZSIsICJjd2QiLCAidGVtcGxhdGVOYW1lIiwgInRhcmdldERpciIsICJvcHRpb25zIiwgImNvcmVEaXIiLCAidmFsaWRhdGlvbiIsICJSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciIsICJ0ZW1wbGF0ZVBhdGgiLCAiYXZhaWxhYmxlVGVtcGxhdGVzIiwgInJlc29sdXRpb25JbmZvIiwgIlJ1bnRpbWVUZW1wbGF0ZUVycm9yIiwgIm9yaWdpbmFsVGVtcGxhdGVzRGlyIiwgIm9yaWdpbmFsQ29weVRlbXBsYXRlRmlsZXMiLCAic291cmNlUGF0aCIsICJ0YXJnZXRQYXRoIiwgImNvbnRleHQiLCAicnVudGltZUNvbnRleHQiLCAic2VhcmNoUGF0aHMiLCAic2VhcmNoUmVzdWx0cyIsICJwYWNrYWdlQmFzZWRQYXRoIiwgInRlbXBsYXRlc1BhdGgiLCAibW9kdWxlQmFzZWRQYXRocyIsICJtb2R1bGVQYXRoIiwgIm5vZGVNb2R1bGVQYXRocyIsICJub2RlTW9kdWxlUGF0aCIsICJlbnZCYXNlZFBhdGhzIiwgImVudlBhdGgiLCAidmFsaWRSZXN1bHQiLCAicmVzdWx0IiwgInNlYXJjaGVkUGF0aHMiLCAicGFja2FnZVJvb3QiLCAiY3VycmVudERpciIsICJwYWNrYWdlSnNvblBhdGgiLCAicGF0aHMiLCAicnVudGltZVBhY2thZ2VQYXRoIiwgInJ1bnRpbWVSb290IiwgImNsaVBhdGgiLCAicnVudGltZVdlYlBhdGgiLCAiZW50cnkiLCAiY29yZVBhdGgiLCAiZXJyb3JzIiwgInRlbXBsYXRlRGlycyIsICJ0ZW1wbGF0ZURpciIsICJlcnJvciIsICJyZXNvbHV0aW9uU3RyYXRlZ3kiLCAiYXZhaWxhYmxlQ29yZXMiLCAiZnMiLCAic2FuaXRpemVTdGFja05hbWUiLCAibmFtZSIsICJzYW5pdGl6ZWQiLCAiaW1wb3J0X2JpbiIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiY3dkIiwgIm9wdGlvbnMiLCAic3RhcnRUaW1lIiwgInN0YWdlIiwgImNvbmZpZyIsICJpbmZyYVN0YWNrTmFtZSIsICJzYW5pdGl6ZVN0YWNrTmFtZSIsICJydW50aW1lU3RhY2tOYW1lIiwgInJ1bnRpbWVXZWJTdGFja05hbWUiLCAicyIsICJpbmZyYVJlc3VsdCIsICJydW50aW1lUmVzdWx0IiwgInJ1bnRpbWVXZWJSZXN1bHQiLCAiZHVyYXRpb24iLCAic3RhY2tOYW1lIiwgIm91dHB1dHNQYXRoIiwgIm91dHB1dHMiLCAib3V0cHV0c0ZpbGVDb250ZW50IiwgInN0YWNrT3V0cHV0cyIsICJrZXkiLCAibGFtYmRhTWF0Y2giLCAiZXJyb3IiLCAicmVnaW9uIiwgInBhcnQiLCAibmFtZSIsICJzZXJ2aWNlTmFtZSIsICJyZWdpb25TaW1wbGlmaWVkIiwgIlJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3kiLCAiY29udGV4dCIsICJlcnJvciIsICJjb25maWciLCAiZGVwbG95Q29uZmlnIiwgImxvZ2dlciIsICJvcHRpb25zIiwgInJlc3VsdCIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfZnMiLCAiTUFYX1RFTVBMQVRFX1NJWkVfQllURVMiLCAiTEFNQkRBX0JVTkRMRV9TSVpFX0xJTUlUIiwgIlRFTVBMQVRFX1NJWkVfV0FSTklOR19USFJFU0hPTEQiLCAibG9hZFRlbXBsYXRlIiwgInByb2plY3RSb290IiwgInRlbXBsYXRlUGF0aCIsICJwYXRoIiwgInVzZUZhbGxiYWNrIiwgImZzIiwgImdldERlZmF1bHRUZW1wbGF0ZSIsICJjb250ZW50IiwgInZhbGlkYXRlVGVtcGxhdGVTaXplIiwgInZhbGlkYXRlVGVtcGxhdGUiLCAiaHRtbCIsICJzaXplQnl0ZXMiLCAic2l6ZU1CIiwgIm1heFNpemVNQiIsICJ3YXJuaW5nVGhyZXNob2xkTUIiLCAibWlzc2luZ1RhZ3MiLCAidmFsaWRhdGVCdW5kbGVTaXplIiwgImVtYmVkZGVkRmlsZVBhdGgiLCAiZW1iZWRkZWRGaWxlU2l6ZSIsICJlbWJlZGRlZEZpbGVTaXplTUIiLCAibGFtYmRhQnVuZGxlUGF0aCIsICJidW5kbGVTaXplIiwgImJ1bmRsZVNpemVNQiIsICJnZW5lcmF0ZUVtYmVkZGVkVGVtcGxhdGVGaWxlIiwgInRlbXBsYXRlIiwgImZpbGVDb250ZW50IiwgIm91dHB1dFBhdGgiLCAib3V0cHV0RGlyIiwgInRlbXBsYXRlU2l6ZUtCIiwgImJ1aWxkU3RhdGljSHRtbCIsICJzaG91bGRFeGl0IiwgImVycm9yIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgIndyYXBBbnNpMTYiLCAib2Zmc2V0IiwgImNvZGUiLCAid3JhcEFuc2kyNTYiLCAid3JhcEFuc2kxNm0iLCAicmVkIiwgImdyZWVuIiwgImJsdWUiLCAic3R5bGVzIiwgIm1vZGlmaWVyTmFtZXMiLCAiZm9yZWdyb3VuZENvbG9yTmFtZXMiLCAiYmFja2dyb3VuZENvbG9yTmFtZXMiLCAiY29sb3JOYW1lcyIsICJhc3NlbWJsZVN0eWxlcyIsICJjb2RlcyIsICJncm91cE5hbWUiLCAiZ3JvdXAiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgImhleCIsICJtYXRjaGVzIiwgImNvbG9yU3RyaW5nIiwgImNoYXJhY3RlciIsICJpbnRlZ2VyIiwgInJlbWFpbmRlciIsICJ2YWx1ZSIsICJyZXN1bHQiLCAiYW5zaVN0eWxlcyIsICJhbnNpX3N0eWxlc19kZWZhdWx0IiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiaW1wb3J0X25vZGVfb3MiLCAiaW1wb3J0X25vZGVfdHR5IiwgImhhc0ZsYWciLCAiZmxhZyIsICJhcmd2IiwgInByb2Nlc3MiLCAicHJlZml4IiwgInBvc2l0aW9uIiwgInRlcm1pbmF0b3JQb3NpdGlvbiIsICJlbnYiLCAiZmxhZ0ZvcmNlQ29sb3IiLCAiZW52Rm9yY2VDb2xvciIsICJ0cmFuc2xhdGVMZXZlbCIsICJsZXZlbCIsICJfc3VwcG9ydHNDb2xvciIsICJoYXZlU3RyZWFtIiwgInN0cmVhbUlzVFRZIiwgInNuaWZmRmxhZ3MiLCAibm9GbGFnRm9yY2VDb2xvciIsICJmb3JjZUNvbG9yIiwgIm1pbiIsICJvc1JlbGVhc2UiLCAib3MiLCAia2V5IiwgInNpZ24iLCAidmVyc2lvbiIsICJjcmVhdGVTdXBwb3J0c0NvbG9yIiwgInN0cmVhbSIsICJvcHRpb25zIiwgInN1cHBvcnRzQ29sb3IiLCAidHR5IiwgInN1cHBvcnRzX2NvbG9yX2RlZmF1bHQiLCAic3RyaW5nUmVwbGFjZUFsbCIsICJzdHJpbmciLCAic3Vic3RyaW5nIiwgInJlcGxhY2VyIiwgImluZGV4IiwgInN1YnN0cmluZ0xlbmd0aCIsICJlbmRJbmRleCIsICJyZXR1cm5WYWx1ZSIsICJzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgiLCAicHJlZml4IiwgInBvc3RmaXgiLCAiZ290Q1IiLCAic3Rkb3V0Q29sb3IiLCAic3RkZXJyQ29sb3IiLCAic3VwcG9ydHNfY29sb3JfZGVmYXVsdCIsICJHRU5FUkFUT1IiLCAiU1RZTEVSIiwgIklTX0VNUFRZIiwgImxldmVsTWFwcGluZyIsICJzdHlsZXMiLCAiYXBwbHlPcHRpb25zIiwgIm9iamVjdCIsICJvcHRpb25zIiwgImNvbG9yTGV2ZWwiLCAiY2hhbGtGYWN0b3J5IiwgIm9wdGlvbnMiLCAiY2hhbGsiLCAic3RyaW5ncyIsICJhcHBseU9wdGlvbnMiLCAiY3JlYXRlQ2hhbGsiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgImFuc2lfc3R5bGVzX2RlZmF1bHQiLCAic3R5bGVzIiwgImJ1aWxkZXIiLCAiY3JlYXRlQnVpbGRlciIsICJjcmVhdGVTdHlsZXIiLCAiU1RZTEVSIiwgIklTX0VNUFRZIiwgImdldE1vZGVsQW5zaSIsICJtb2RlbCIsICJsZXZlbCIsICJ0eXBlIiwgImFyZ3VtZW50c18iLCAidXNlZE1vZGVscyIsICJzdHlsZXIiLCAibGV2ZWxNYXBwaW5nIiwgImJnTW9kZWwiLCAicHJvdG8iLCAiR0VORVJBVE9SIiwgIm9wZW4iLCAiY2xvc2UiLCAicGFyZW50IiwgIm9wZW5BbGwiLCAiY2xvc2VBbGwiLCAic2VsZiIsICJfc3R5bGVyIiwgIl9pc0VtcHR5IiwgImFwcGx5U3R5bGUiLCAic3RyaW5nIiwgInN0cmluZ1JlcGxhY2VBbGwiLCAibGZJbmRleCIsICJzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgiLCAiY2hhbGtTdGRlcnIiLCAic3RkZXJyQ29sb3IiLCAic291cmNlX2RlZmF1bHQiLCAiY2hhbGsiLCAiaW1wb3J0X3Byb2Nlc3MiLCAiaW1wb3J0X2JpbiIsICJSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UiLCAic3RhY2tzRGVwbG95U2VydmljZSIsICJvcHRpb25zIiwgImNvbmZpZyIsICJsb2dnZXIiLCAiY3dkIiwgInByb2Nlc3MiLCAiZW52VmFsaWRhdG9yIiwgImVycm9yIiwgIm1lc3NhZ2UiLCAic3RhZ2UiLCAic3RhZ2VDb25maWciLCAicyIsICJzb3VyY2VfZGVmYXVsdCIsICJkZXBsb3lTZXJ2aWNlIiwgImJ1aWxkU2VydmljZSIsICJib290c3RyYXBTZXJ2aWNlIiwgImNyZWRlbnRpYWxzIiwgInJlZ2lvbiIsICJyZXN1bHQiLCAibGFtYmRhQXJuIiwgImluZGV4IiwgImZzIiwgInBhdGgiLCAiaW1wb3J0X2JpbiIsICJ0YXJnZXRSZXF1aXJlc0NyZWRlbnRpYWxzIiwgInRhcmdldCIsICJidWlsZENvbW1hbmQiLCAib3B0aW9ucyIsICJjb25maWciLCAibG9nZ2VyIiwgImN3ZCIsICJlbnZWYWxpZGF0b3IiLCAiZXJyb3IiLCAic291cmNlX2RlZmF1bHQiLCAiYnVpbGRTZXJ2aWNlIiwgInJlc3VsdHMiLCAic2hvdWxkR2VuZXJhdGVUeXBlcyIsICJidWlsZEFsbFRhcmdldHMiLCAiYnVpbGRTaW5nbGVUYXJnZXQiLCAiZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zIiwgImRpc3BsYXlCdWlsZFN1bW1hcnkiLCAidGFyZ2V0cyIsICJzcGlubmVyIiwgInJlc3VsdCIsICJjYXBpdGFsaXplIiwgImZvcm1hdER1cmF0aW9uIiwgInRvdGFsRHVyYXRpb24iLCAic3VtIiwgInIiLCAiZnVsbFBhdGgiLCAic2l6ZSIsICJnZXRGaWxlU2l6ZSIsICJyZWxhdGl2ZVBhdGgiLCAiZmlsZVBhdGgiLCAic3RhdHMiLCAiZm9ybWF0Qnl0ZXMiLCAiYnl0ZXMiLCAiayIsICJzaXplcyIsICJpIiwgIm1zIiwgInN0ciIsICJwYXRoIiwgImZzIiwgImltcG9ydF9iaW4iLCAicnVudGltZUluaXRDb21tYW5kIiwgIm9wdGlvbnMiLCAibG9nZ2VyIiwgImN3ZCIsICJlbnZWYWxpZGF0b3IiLCAic3Bpbm5lciIsICJ0ZW1wbGF0ZVNlcnZpY2UiLCAiUnVudGltZVRlbXBsYXRlU2VydmljZSIsICJwcm9tcHRTZXJ2aWNlIiwgInRhcmdldERpciIsICJ0ZW1wbGF0ZSIsICJjb3JlIiwgImZvcmNlIiwgInByb2plY3ROYW1lIiwgInJlc29sdmVkVGFyZ2V0RGlyIiwgImV4aXN0aW5nRmlsZXMiLCAiY2hlY2tFeGlzdGluZ1Byb2plY3RGaWxlcyIsICJmaWxlIiwgInNvdXJjZV9kZWZhdWx0IiwgImRpc3BsYXlDZGtTdWNjZXNzTWVzc2FnZSIsICJyZXNvbHZlZENka0RpciIsICJoYW5kbGVDZGtPbmx5Q3JlZGVudGlhbHMiLCAiZGlzcGxheVJ1bnRpbWVTdWNjZXNzTWVzc2FnZSIsICJpbml0aWFsaXplQ2RrV29ya2Zsb3ciLCAiZXJyb3IiLCAicmVzb2x2ZWREaXIiLCAiaXNDdXJyZW50RGlyIiwgInJlbGF0aXZlRGlyIiwgInByb2plY3REaXIiLCAiUHJvbXB0U2VydmljZSIsICJQYWNrYWdlTWFuYWdlclNlcnZpY2UiLCAiQ2RrSW5pdFNlcnZpY2UiLCAiQXdzQ3JlZGVudGlhbHNEZXRlY3RvciIsICJBd3NSZWdpb25SZXNvbHZlciIsICJwYWNrYWdlTWFuYWdlclNlcnZpY2UiLCAiY2RrSW5pdFNlcnZpY2UiLCAiYXdzRGV0ZWN0b3IiLCAiY2RrRXhpc3RzIiwgInJlZ2lvblJlc3VsdCIsICJyZXNvbHZlZFJlZ2lvbiIsICJjb25maWciLCAiZGV0ZWN0ZWRNYW5hZ2VyIiwgInJlc3VsdCIsICJjZGtEaXIiLCAia2V5RmlsZXMiLCAiZmlsZVBhdGgiLCAiUnVudGltZVdlYkNsaSIsICJfUnVudGltZVdlYkNsaSIsICJ0YXJnZXRzIiwgIm5hbWUiLCAidGFyZ2V0IiwgImRlc2MiLCAib3B0aW9ucyIsICJidWlsZENvbW1hbmQiLCAiZXJyb3IiLCAicHJvY2VzcyIsICJkZXZPcHRpb25zIiwgInQiLCAiZ2xvYmFsT3B0cyIsICJjd2QiLCAicHVyZW5vd0NvbnRleHQiLCAic3RhY2tzRGVwbG95U2VydmljZSIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiY21kIiwgInN0cmF0ZWdpZXMiLCAiY29udGV4dCIsICJyZXN1bHQiLCAiUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIiwgInJ1bnRpbWVJbml0Q29tbWFuZCIsICJkZXN0cm95Q29tbWFuZCIsICJhcmdzIiwgImZvcm1hdHRlciIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJ2ZXJib3NlIiwgIlJ1bnRpbWVUZW1wbGF0ZUVycm9yIiwgImZvcm1hdHRlZEVycm9yIiwgIlJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIiwgImNyZWF0ZVJ1bnRpbWVDbGkiXQp9Cg==
171
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItbmFtZS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW5zaS1zdHlsZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWwuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS90ZW1wbGF0ZXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vcnVudGltZS13ZWItY2xpLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvdGVtcGxhdGUuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvYmluL3V0aWxzL2Vycm9ycy50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3N0YWNrLW5hbWUtc2FuaXRpemVyLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvcHVyZW5vdy1ydW50aW1lLWRlcGxveW1lbnQuc3RyYXRlZ3kudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy91dGlscy9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvcnVudGltZS13ZWItZGVwbG95bWVudC5zZXJ2aWNlLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvYnVpbGQuY29tbWFuZC50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL2luaXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgXHUwMEE3IDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCAiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsICIvKiBNSVQgbGljZW5zZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbWl4ZWQtb3BlcmF0b3JzICovXG5jb25zdCBjc3NLZXl3b3JkcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcblxuLy8gTk9URTogY29udmVyc2lvbnMgc2hvdWxkIG9ubHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgKGkuZS4gYXJyYXlzLCBvclxuLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuLy8gICAgICAgZG8gbm90IHVzZSBib3ggdmFsdWVzIHR5cGVzIChpLmUuIE51bWJlcigpLCBTdHJpbmcoKSwgZXRjLilcblxuY29uc3QgcmV2ZXJzZUtleXdvcmRzID0ge307XG5mb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjc3NLZXl3b3JkcykpIHtcblx0cmV2ZXJzZUtleXdvcmRzW2Nzc0tleXdvcmRzW2tleV1dID0ga2V5O1xufVxuXG5jb25zdCBjb252ZXJ0ID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG4vLyBIaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGlmICghKCdjaGFubmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHR9XG5cblx0aWYgKCEoJ2xhYmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHR9XG5cblx0aWYgKGNvbnZlcnRbbW9kZWxdLmxhYmVscy5sZW5ndGggIT09IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRjb25zdCB7Y2hhbm5lbHMsIGxhYmVsc30gPSBjb252ZXJ0W21vZGVsXTtcblx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBsYWJlbHN9KTtcbn1cblxuY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0Y29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0aCA9IDA7XG5cdH0gZWxzZSBpZiAociA9PT0gbWF4KSB7XG5cdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChnID09PSBtYXgpIHtcblx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChiID09PSBtYXgpIHtcblx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblx0fVxuXG5cdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjb25zdCBsID0gKG1pbiArIG1heCkgLyAyO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdHMgPSAwO1xuXHR9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG5cdFx0cyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuXHR9XG5cblx0cmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0bGV0IHJkaWY7XG5cdGxldCBnZGlmO1xuXHRsZXQgYmRpZjtcblx0bGV0IGg7XG5cdGxldCBzO1xuXG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGlmZiA9IHYgLSBNYXRoLm1pbihyLCBnLCBiKTtcblx0Y29uc3QgZGlmZmMgPSBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcblx0fTtcblxuXHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdGggPSAwO1xuXHRcdHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cblx0XHRpZiAoaCA8IDApIHtcblx0XHRcdGggKz0gMTtcblx0XHR9IGVsc2UgaWYgKGggPiAxKSB7XG5cdFx0XHRoIC09IDE7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtcblx0XHRoICogMzYwLFxuXHRcdHMgKiAxMDAsXG5cdFx0diAqIDEwMFxuXHRdO1xufTtcblxuY29udmVydC5yZ2IuaHdiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdO1xuXHRjb25zdCBnID0gcmdiWzFdO1xuXHRsZXQgYiA9IHJnYlsyXTtcblx0Y29uc3QgaCA9IGNvbnZlcnQucmdiLmhzbChyZ2IpWzBdO1xuXHRjb25zdCB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcblxuXHRiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG5cblx0cmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Y29uc3QgayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjb25zdCBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdGNvbnN0IG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgeSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG5mdW5jdGlvbiBjb21wYXJhdGl2ZURpc3RhbmNlKHgsIHkpIHtcblx0Lypcblx0XHRTZWUgaHR0cHM6Ly9lbi5tLndpa2lwZWRpYS5vcmcvd2lraS9FdWNsaWRlYW5fZGlzdGFuY2UjU3F1YXJlZF9FdWNsaWRlYW5fZGlzdGFuY2Vcblx0Ki9cblx0cmV0dXJuIChcblx0XHQoKHhbMF0gLSB5WzBdKSAqKiAyKSArXG5cdFx0KCh4WzFdIC0geVsxXSkgKiogMikgK1xuXHRcdCgoeFsyXSAtIHlbMl0pICoqIDIpXG5cdCk7XG59XG5cbmNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdGxldCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdGxldCBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yIChjb25zdCBrZXl3b3JkIG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRcdGNvbnN0IHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHQvLyBDb21wdXRlIGNvbXBhcmF0aXZlIGRpc3RhbmNlXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBjb21wYXJhdGl2ZURpc3RhbmNlKHJnYiwgdmFsdWUpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgaXRzIGxlc3MsIGlmIHNvIHNldCBhcyBjbG9zZXN0XG5cdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0Y3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdFx0Y3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudENsb3Nlc3RLZXl3b3JkO1xufTtcblxuY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcbn07XG5cbmNvbnZlcnQucmdiLnh5eiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0bGV0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGxldCBnID0gcmdiWzFdIC8gMjU1O1xuXHRsZXQgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHQvLyBBc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDQwNDUgPyAoKChyICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAociAvIDEyLjkyKTtcblx0ZyA9IGcgPiAwLjA0MDQ1ID8gKCgoZyArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGcgLyAxMi45Mik7XG5cdGIgPSBiID4gMC4wNDA0NSA/ICgoKGIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChiIC8gMTIuOTIpO1xuXG5cdGNvbnN0IHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG5cdGNvbnN0IHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdGNvbnN0IHogPSAociAqIDAuMDE5MykgKyAoZyAqIDAuMTE5MikgKyAoYiAqIDAuOTUwNSk7XG5cblx0cmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgeHl6ID0gY29udmVydC5yZ2IueHl6KHJnYik7XG5cdGxldCB4ID0geHl6WzBdO1xuXHRsZXQgeSA9IHh5elsxXTtcblx0bGV0IHogPSB4eXpbMl07XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/ICh4ICoqICgxIC8gMykpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gKHkgKiogKDEgLyAzKSkgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyAoeiAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRjb25zdCBsID0gKDExNiAqIHkpIC0gMTY7XG5cdGNvbnN0IGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRjb25zdCBiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBoID0gaHNsWzBdIC8gMzYwO1xuXHRjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuXHRjb25zdCBsID0gaHNsWzJdIC8gMTAwO1xuXHRsZXQgdDI7XG5cdGxldCB0Mztcblx0bGV0IHZhbDtcblxuXHRpZiAocyA9PT0gMCkge1xuXHRcdHZhbCA9IGwgKiAyNTU7XG5cdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0fVxuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0dDIgPSBsICogKDEgKyBzKTtcblx0fSBlbHNlIHtcblx0XHR0MiA9IGwgKyBzIC0gbCAqIHM7XG5cdH1cblxuXHRjb25zdCB0MSA9IDIgKiBsIC0gdDI7XG5cblx0Y29uc3QgcmdiID0gWzAsIDAsIDBdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHQzID0gaCArIDEgLyAzICogLShpIC0gMSk7XG5cdFx0aWYgKHQzIDwgMCkge1xuXHRcdFx0dDMrKztcblx0XHR9XG5cblx0XHRpZiAodDMgPiAxKSB7XG5cdFx0XHR0My0tO1xuXHRcdH1cblxuXHRcdGlmICg2ICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHR9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQyO1xuXHRcdH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWwgPSB0MTtcblx0XHR9XG5cblx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdH1cblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBoID0gaHNsWzBdO1xuXHRsZXQgcyA9IGhzbFsxXSAvIDEwMDtcblx0bGV0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCBzbWluID0gcztcblx0Y29uc3QgbG1pbiA9IE1hdGgubWF4KGwsIDAuMDEpO1xuXG5cdGwgKj0gMjtcblx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0c21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG5cdGNvbnN0IHYgPSAobCArIHMpIC8gMjtcblx0Y29uc3Qgc3YgPSBsID09PSAwID8gKDIgKiBzbWluKSAvIChsbWluICsgc21pbikgOiAoMiAqIHMpIC8gKGwgKyBzKTtcblxuXHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LnJnYiA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgaCA9IGhzdlswXSAvIDYwO1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRsZXQgdiA9IGhzdlsyXSAvIDEwMDtcblx0Y29uc3QgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuXHRjb25zdCBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG5cdGNvbnN0IHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0Y29uc3QgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpO1xuXHRjb25zdCB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSk7XG5cdHYgKj0gMjU1O1xuXG5cdHN3aXRjaCAoaGkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRyZXR1cm4gW3YsIHQsIHBdO1xuXHRcdGNhc2UgMTpcblx0XHRcdHJldHVybiBbcSwgdiwgcF07XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFtwLCB2LCB0XTtcblx0XHRjYXNlIDM6XG5cdFx0XHRyZXR1cm4gW3AsIHEsIHZdO1xuXHRcdGNhc2UgNDpcblx0XHRcdHJldHVybiBbdCwgcCwgdl07XG5cdFx0Y2FzZSA1OlxuXHRcdFx0cmV0dXJuIFt2LCBwLCBxXTtcblx0fVxufTtcblxuY29udmVydC5oc3YuaHNsID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdO1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRjb25zdCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdGxldCBzbDtcblx0bGV0IGw7XG5cblx0bCA9ICgyIC0gcykgKiB2O1xuXHRjb25zdCBsbWluID0gKDIgLSBzKSAqIHZtaW47XG5cdHNsID0gcyAqIHZtaW47XG5cdHNsIC89IChsbWluIDw9IDEpID8gbG1pbiA6IDIgLSBsbWluO1xuXHRzbCA9IHNsIHx8IDA7XG5cdGwgLz0gMjtcblxuXHRyZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn07XG5cbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuY29udmVydC5od2IucmdiID0gZnVuY3Rpb24gKGh3Yikge1xuXHRjb25zdCBoID0gaHdiWzBdIC8gMzYwO1xuXHRsZXQgd2ggPSBod2JbMV0gLyAxMDA7XG5cdGxldCBibCA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgcmF0aW8gPSB3aCArIGJsO1xuXHRsZXQgZjtcblxuXHQvLyBXaCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGNvbnN0IGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0Y29uc3QgdiA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdGNvbnN0IG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gTGluZWFyIGludGVycG9sYXRpb25cblxuXHRsZXQgcjtcblx0bGV0IGc7XG5cdGxldCBiO1xuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSxuby1tdWx0aS1zcGFjZXMgKi9cblx0c3dpdGNoIChpKSB7XG5cdFx0ZGVmYXVsdDpcblx0XHRjYXNlIDY6XG5cdFx0Y2FzZSAwOiByID0gdjsgIGcgPSBuOyAgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyAgZyA9IHY7ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMjogciA9IHdoOyBnID0gdjsgIGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47ICBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA0OiByID0gbjsgIGcgPSB3aDsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNTogciA9IHY7ICBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXHQvKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0Y29uc3QgYyA9IGNteWtbMF0gLyAxMDA7XG5cdGNvbnN0IG0gPSBjbXlrWzFdIC8gMTAwO1xuXHRjb25zdCB5ID0gY215a1syXSAvIDEwMDtcblx0Y29uc3QgayA9IGNteWtbM10gLyAxMDA7XG5cblx0Y29uc3QgciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuXHRjb25zdCBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoucmdiID0gZnVuY3Rpb24gKHh5eikge1xuXHRjb25zdCB4ID0geHl6WzBdIC8gMTAwO1xuXHRjb25zdCB5ID0geHl6WzFdIC8gMTAwO1xuXHRjb25zdCB6ID0geHl6WzJdIC8gMTAwO1xuXHRsZXQgcjtcblx0bGV0IGc7XG5cdGxldCBiO1xuXG5cdHIgPSAoeCAqIDMuMjQwNikgKyAoeSAqIC0xLjUzNzIpICsgKHogKiAtMC40OTg2KTtcblx0ZyA9ICh4ICogLTAuOTY4OSkgKyAoeSAqIDEuODc1OCkgKyAoeiAqIDAuMDQxNSk7XG5cdGIgPSAoeCAqIDAuMDU1NykgKyAoeSAqIC0wLjIwNDApICsgKHogKiAxLjA1NzApO1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKHIgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogciAqIDEyLjkyO1xuXG5cdGcgPSBnID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKGcgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKGIgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogYiAqIDEyLjkyO1xuXG5cdHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG5cdGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG5cdGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LmxhYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmxhYi54eXogPSBmdW5jdGlvbiAobGFiKSB7XG5cdGNvbnN0IGwgPSBsYWJbMF07XG5cdGNvbnN0IGEgPSBsYWJbMV07XG5cdGNvbnN0IGIgPSBsYWJbMl07XG5cdGxldCB4O1xuXHRsZXQgeTtcblx0bGV0IHo7XG5cblx0eSA9IChsICsgMTYpIC8gMTE2O1xuXHR4ID0gYSAvIDUwMCArIHk7XG5cdHogPSB5IC0gYiAvIDIwMDtcblxuXHRjb25zdCB5MiA9IHkgKiogMztcblx0Y29uc3QgeDIgPSB4ICoqIDM7XG5cdGNvbnN0IHoyID0geiAqKiAzO1xuXHR5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eCA9IHgyID4gMC4wMDg4NTYgPyB4MiA6ICh4IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHogPSB6MiA+IDAuMDA4ODU2ID8gejIgOiAoeiAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXG5cdHggKj0gOTUuMDQ3O1xuXHR5ICo9IDEwMDtcblx0eiAqPSAxMDguODgzO1xuXG5cdHJldHVybiBbeCwgeSwgel07XG59O1xuXG5jb252ZXJ0LmxhYi5sY2ggPSBmdW5jdGlvbiAobGFiKSB7XG5cdGNvbnN0IGwgPSBsYWJbMF07XG5cdGNvbnN0IGEgPSBsYWJbMV07XG5cdGNvbnN0IGIgPSBsYWJbMl07XG5cdGxldCBoO1xuXG5cdGNvbnN0IGhyID0gTWF0aC5hdGFuMihiLCBhKTtcblx0aCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjb25zdCBjID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXG5cdHJldHVybiBbbCwgYywgaF07XG59O1xuXG5jb252ZXJ0LmxjaC5sYWIgPSBmdW5jdGlvbiAobGNoKSB7XG5cdGNvbnN0IGwgPSBsY2hbMF07XG5cdGNvbnN0IGMgPSBsY2hbMV07XG5cdGNvbnN0IGggPSBsY2hbMl07XG5cblx0Y29uc3QgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG5cdGNvbnN0IGEgPSBjICogTWF0aC5jb3MoaHIpO1xuXHRjb25zdCBiID0gYyAqIE1hdGguc2luKGhyKTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MsIHNhdHVyYXRpb24gPSBudWxsKSB7XG5cdGNvbnN0IFtyLCBnLCBiXSA9IGFyZ3M7XG5cdGxldCB2YWx1ZSA9IHNhdHVyYXRpb24gPT09IG51bGwgPyBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl0gOiBzYXR1cmF0aW9uOyAvLyBIc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG5cdHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIDUwKTtcblxuXHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRyZXR1cm4gMzA7XG5cdH1cblxuXHRsZXQgYW5zaSA9IDMwXG5cdFx0KyAoKE1hdGgucm91bmQoYiAvIDI1NSkgPDwgMilcblx0XHR8IChNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEpXG5cdFx0fCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuXHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRhbnNpICs9IDYwO1xuXHR9XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0Lmhzdi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBPcHRpbWl6YXRpb24gaGVyZTsgd2UgYWxyZWFkeSBrbm93IHRoZSB2YWx1ZSBhbmQgZG9uJ3QgbmVlZCB0byBnZXRcblx0Ly8gaXQgY29udmVydGVkIGZvciB1cy5cblx0cmV0dXJuIGNvbnZlcnQucmdiLmFuc2kxNihjb252ZXJ0Lmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IHIgPSBhcmdzWzBdO1xuXHRjb25zdCBnID0gYXJnc1sxXTtcblx0Y29uc3QgYiA9IGFyZ3NbMl07XG5cblx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdGlmIChyID09PSBnICYmIGcgPT09IGIpIHtcblx0XHRpZiAociA8IDgpIHtcblx0XHRcdHJldHVybiAxNjtcblx0XHR9XG5cblx0XHRpZiAociA+IDI0OCkge1xuXHRcdFx0cmV0dXJuIDIzMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHIgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdH1cblxuXHRjb25zdCBhbnNpID0gMTZcblx0XHQrICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKVxuXHRcdCsgKDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSlcblx0XHQrIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0bGV0IGNvbG9yID0gYXJncyAlIDEwO1xuXG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG5cdFx0aWYgKGFyZ3MgPiA1MCkge1xuXHRcdFx0Y29sb3IgKz0gMy41O1xuXHRcdH1cblxuXHRcdGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuXG5cdFx0cmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcblx0fVxuXG5cdGNvbnN0IG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHRjb25zdCByID0gKChjb2xvciAmIDEpICogbXVsdCkgKiAyNTU7XG5cdGNvbnN0IGcgPSAoKChjb2xvciA+PiAxKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cdGNvbnN0IGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBIYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdGNvbnN0IGMgPSAoYXJncyAtIDIzMikgKiAxMCArIDg7XG5cdFx0cmV0dXJuIFtjLCBjLCBjXTtcblx0fVxuXG5cdGFyZ3MgLT0gMTY7XG5cblx0bGV0IHJlbTtcblx0Y29uc3QgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHRjb25zdCBiID0gKHJlbSAlIDYpIC8gNSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGV4ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KVxuXHRcdCsgKChNYXRoLnJvdW5kKGFyZ3NbMV0pICYgMHhGRikgPDwgOClcblx0XHQrIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG5cblx0Y29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IG1hdGNoID0gYXJncy50b1N0cmluZygxNikubWF0Y2goL1thLWYwLTldezZ9fFthLWYwLTldezN9L2kpO1xuXHRpZiAoIW1hdGNoKSB7XG5cdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0fVxuXG5cdGxldCBjb2xvclN0cmluZyA9IG1hdGNoWzBdO1xuXG5cdGlmIChtYXRjaFswXS5sZW5ndGggPT09IDMpIHtcblx0XHRjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHRjb25zdCBpbnRlZ2VyID0gcGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblx0Y29uc3QgciA9IChpbnRlZ2VyID4+IDE2KSAmIDB4RkY7XG5cdGNvbnN0IGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdGNvbnN0IGIgPSBpbnRlZ2VyICYgMHhGRjtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGNnID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0Y29uc3QgY2hyb21hID0gKG1heCAtIG1pbik7XG5cdGxldCBncmF5c2NhbGU7XG5cdGxldCBodWU7XG5cblx0aWYgKGNocm9tYSA8IDEpIHtcblx0XHRncmF5c2NhbGUgPSBtaW4gLyAoMSAtIGNocm9tYSk7XG5cdH0gZWxzZSB7XG5cdFx0Z3JheXNjYWxlID0gMDtcblx0fVxuXG5cdGlmIChjaHJvbWEgPD0gMCkge1xuXHRcdGh1ZSA9IDA7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSByKSB7XG5cdFx0aHVlID0gKChnIC0gYikgLyBjaHJvbWEpICUgNjtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IGcpIHtcblx0XHRodWUgPSAyICsgKGIgLSByKSAvIGNocm9tYTtcblx0fSBlbHNlIHtcblx0XHRodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYTtcblx0fVxuXG5cdGh1ZSAvPSA2O1xuXHRodWUgJT0gMTtcblxuXHRyZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xufTtcblxuY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuXHRjb25zdCBsID0gaHNsWzJdIC8gMTAwO1xuXG5cdGNvbnN0IGMgPSBsIDwgMC41ID8gKDIuMCAqIHMgKiBsKSA6ICgyLjAgKiBzICogKDEuMCAtIGwpKTtcblxuXHRsZXQgZiA9IDA7XG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzbFswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5oY2cgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IHMgKiB2O1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzdlswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGggPSBoY2dbMF0gLyAzNjA7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0aWYgKGMgPT09IDAuMCkge1xuXHRcdHJldHVybiBbZyAqIDI1NSwgZyAqIDI1NSwgZyAqIDI1NV07XG5cdH1cblxuXHRjb25zdCBwdXJlID0gWzAsIDAsIDBdO1xuXHRjb25zdCBoaSA9IChoICUgMSkgKiA2O1xuXHRjb25zdCB2ID0gaGkgJSAxO1xuXHRjb25zdCB3ID0gMSAtIHY7XG5cdGxldCBtZyA9IDA7XG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cblx0c3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gdjsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMTpcblx0XHRcdHB1cmVbMF0gPSB3OyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gdzsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGNhc2UgNDpcblx0XHRcdHB1cmVbMF0gPSB2OyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSB3O1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGNvbnN0IHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0bGV0IGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGNvbnN0IGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0bGV0IHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IHcgPSBod2JbMV0gLyAxMDA7XG5cdGNvbnN0IGIgPSBod2JbMl0gLyAxMDA7XG5cdGNvbnN0IHYgPSAxIC0gYjtcblx0Y29uc3QgYyA9IHYgLSB3O1xuXHRsZXQgZyA9IDA7XG5cblx0aWYgKGMgPCAxKSB7XG5cdFx0ZyA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtod2JbMF0sIGMgKiAxMDAsIGcgKiAxMDBdO1xufTtcblxuY29udmVydC5hcHBsZS5yZ2IgPSBmdW5jdGlvbiAoYXBwbGUpIHtcblx0cmV0dXJuIFsoYXBwbGVbMF0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsxXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzJdIC8gNjU1MzUpICogMjU1XTtcbn07XG5cbmNvbnZlcnQucmdiLmFwcGxlID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gWyhyZ2JbMF0gLyAyNTUpICogNjU1MzUsIChyZ2JbMV0gLyAyNTUpICogNjU1MzUsIChyZ2JbMl0gLyAyNTUpICogNjU1MzVdO1xufTtcblxuY29udmVydC5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHNsID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc3YgPSBjb252ZXJ0LmdyYXkuaHNsO1xuXG5jb252ZXJ0LmdyYXkuaHdiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAxMDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDAsIDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmxhYiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbZ3JheVswXSwgMCwgMF07XG59O1xuXG5jb252ZXJ0LmdyYXkuaGV4ID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0Y29uc3QgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG5cdGNvbnN0IGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0Y29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQucmdiLmdyYXkgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcblx0cmV0dXJuIFt2YWwgLyAyNTUgKiAxMDBdO1xufTtcbiIsICJjb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0VGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdGNvbnN0IGdyYXBoID0ge307XG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9vYmplY3Qta2V5cy12cy1mb3ItaW4td2l0aC1jbG9zdXJlLzNcblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAobGV0IGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0Y29uc3QgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gVW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuXHRncmFwaFtmcm9tTW9kZWxdLmRpc3RhbmNlID0gMDtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdGNvbnN0IGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAobGV0IGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvbnN0IGFkamFjZW50ID0gYWRqYWNlbnRzW2ldO1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0Y29uc3QgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHRsZXQgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdGxldCBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29uc3QgZ3JhcGggPSBkZXJpdmVCRlMoZnJvbU1vZGVsKTtcblx0Y29uc3QgY29udmVyc2lvbiA9IHt9O1xuXG5cdGNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGNvbnN0IHRvTW9kZWwgPSBtb2RlbHNbaV07XG5cdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBObyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsICJjb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcbmNvbnN0IHJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xuXG5jb25zdCBjb252ZXJ0ID0ge307XG5cbmNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zKTtcblxuZnVuY3Rpb24gd3JhcFJhdyhmbikge1xuXHRjb25zdCB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuXHRcdGNvbnN0IGFyZzAgPSBhcmdzWzBdO1xuXHRcdGlmIChhcmcwID09PSB1bmRlZmluZWQgfHwgYXJnMCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZzA7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZzAubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IGFyZzA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZuKGFyZ3MpO1xuXHR9O1xuXG5cdC8vIFByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXHRpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG5cdFx0d3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuXHR9XG5cblx0cmV0dXJuIHdyYXBwZWRGbjtcbn1cblxuZnVuY3Rpb24gd3JhcFJvdW5kZWQoZm4pIHtcblx0Y29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBhcmcwID0gYXJnc1swXTtcblxuXHRcdGlmIChhcmcwID09PSB1bmRlZmluZWQgfHwgYXJnMCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZzA7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZzAubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IGFyZzA7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0ID0gZm4oYXJncyk7XG5cblx0XHQvLyBXZSdyZSBhc3N1bWluZyB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IGhlcmUuXG5cdFx0Ly8gc2VlIG5vdGljZSBpbiBjb252ZXJzaW9ucy5qczsgZG9uJ3QgdXNlIGJveCB0eXBlc1xuXHRcdC8vIGluIGNvbnZlcnNpb24gZnVuY3Rpb25zLlxuXHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0Zm9yIChsZXQgbGVuID0gcmVzdWx0Lmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRyZXN1bHRbaV0gPSBNYXRoLnJvdW5kKHJlc3VsdFtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbm1vZGVscy5mb3JFYWNoKGZyb21Nb2RlbCA9PiB7XG5cdGNvbnZlcnRbZnJvbU1vZGVsXSA9IHt9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5jaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmxhYmVsc30pO1xuXG5cdGNvbnN0IHJvdXRlcyA9IHJvdXRlKGZyb21Nb2RlbCk7XG5cdGNvbnN0IHJvdXRlTW9kZWxzID0gT2JqZWN0LmtleXMocm91dGVzKTtcblxuXHRyb3V0ZU1vZGVscy5mb3JFYWNoKHRvTW9kZWwgPT4ge1xuXHRcdGNvbnN0IGZuID0gcm91dGVzW3RvTW9kZWxdO1xuXG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdID0gd3JhcFJvdW5kZWQoZm4pO1xuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXS5yYXcgPSB3cmFwUmF3KGZuKTtcblx0fSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgd3JhcEFuc2kxNiA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG59O1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcbn07XG5cbmNvbnN0IHdyYXBBbnNpMTZtID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IHJnYiA9IGZuKC4uLmFyZ3MpO1xuXHRyZXR1cm4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JnYlswXX07JHtyZ2JbMV19OyR7cmdiWzJdfW1gO1xufTtcblxuY29uc3QgYW5zaTJhbnNpID0gbiA9PiBuO1xuY29uc3QgcmdiMnJnYiA9IChyLCBnLCBiKSA9PiBbciwgZywgYl07XG5cbmNvbnN0IHNldExhenlQcm9wZXJ0eSA9IChvYmplY3QsIHByb3BlcnR5LCBnZXQpID0+IHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcblx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdGNvbnN0IHZhbHVlID0gZ2V0KCk7XG5cblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHR9KTtcbn07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnY29sb3ItY29udmVydCcpfSAqL1xubGV0IGNvbG9yQ29udmVydDtcbmNvbnN0IG1ha2VEeW5hbWljU3R5bGVzID0gKHdyYXAsIHRhcmdldFNwYWNlLCBpZGVudGl0eSwgaXNCYWNrZ3JvdW5kKSA9PiB7XG5cdGlmIChjb2xvckNvbnZlcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbG9yQ29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblx0fVxuXG5cdGNvbnN0IG9mZnNldCA9IGlzQmFja2dyb3VuZCA/IDEwIDogMDtcblx0Y29uc3Qgc3R5bGVzID0ge307XG5cblx0Zm9yIChjb25zdCBbc291cmNlU3BhY2UsIHN1aXRlXSBvZiBPYmplY3QuZW50cmllcyhjb2xvckNvbnZlcnQpKSB7XG5cdFx0Y29uc3QgbmFtZSA9IHNvdXJjZVNwYWNlID09PSAnYW5zaTE2JyA/ICdhbnNpJyA6IHNvdXJjZVNwYWNlO1xuXHRcdGlmIChzb3VyY2VTcGFjZSA9PT0gdGFyZ2V0U3BhY2UpIHtcblx0XHRcdHN0eWxlc1tuYW1lXSA9IHdyYXAoaWRlbnRpdHksIG9mZnNldCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygc3VpdGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRzdHlsZXNbbmFtZV0gPSB3cmFwKHN1aXRlW3RhcmdldFNwYWNlXSwgb2Zmc2V0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gc3R5bGVzO1xufTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXHRjb25zdCBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXI6IHtcblx0XHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yOiB7XG5cdFx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcjoge1xuXHRcdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldXG5cdFx0fVxuXHR9O1xuXG5cdC8vIEFsaWFzIGJyaWdodCBibGFjayBhcyBncmF5IChhbmQgZ3JleSlcblx0c3R5bGVzLmNvbG9yLmdyYXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyZXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMjU2JywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kyNTYsICdhbnNpMjU2JywgYW5zaTJhbnNpLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaTE2bScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTZtLCAncmdiJywgcmdiMnJnYiwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIHRydWUpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaTI1NicsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMjU2LCAnYW5zaTI1NicsIGFuc2kyYW5zaSwgdHJ1ZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCB0cnVlKSk7XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuLy8gTWFrZSB0aGUgZXhwb3J0IGltbXV0YWJsZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdGVudW1lcmFibGU6IHRydWUsXG5cdGdldDogYXNzZW1ibGVTdHlsZXNcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAoZmxhZywgYXJndiA9IHByb2Nlc3MuYXJndikgPT4ge1xuXHRjb25zdCBwcmVmaXggPSBmbGFnLnN0YXJ0c1dpdGgoJy0nKSA/ICcnIDogKGZsYWcubGVuZ3RoID09PSAxID8gJy0nIDogJy0tJyk7XG5cdGNvbnN0IHBvc2l0aW9uID0gYXJndi5pbmRleE9mKHByZWZpeCArIGZsYWcpO1xuXHRjb25zdCB0ZXJtaW5hdG9yUG9zaXRpb24gPSBhcmd2LmluZGV4T2YoJy0tJyk7XG5cdHJldHVybiBwb3NpdGlvbiAhPT0gLTEgJiYgKHRlcm1pbmF0b3JQb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPCB0ZXJtaW5hdG9yUG9zaXRpb24pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmb3JjZUNvbG9yO1xuaWYgKGhhc0ZsYWcoJ25vLWNvbG9yJykgfHxcblx0aGFzRmxhZygnbm8tY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9ZmFsc2UnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1uZXZlcicpKSB7XG5cdGZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmb3JjZUNvbG9yID0gMTtcbn1cblxuaWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAxO1xuXHR9IGVsc2UgaWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdGZvcmNlQ29sb3IgPSBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKHBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCBzdHJlYW1Jc1RUWSkge1xuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gcGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZKTtcblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHN1cHBvcnRzQ29sb3I6IGdldFN1cHBvcnRMZXZlbCxcblx0c3Rkb3V0OiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMSkpKSxcblx0c3RkZXJyOiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMikpKVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ1JlcGxhY2VBbGwgPSAoc3RyaW5nLCBzdWJzdHJpbmcsIHJlcGxhY2VyKSA9PiB7XG5cdGxldCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZyk7XG5cdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gc3RyaW5nO1xuXHR9XG5cblx0Y29uc3Qgc3Vic3RyaW5nTGVuZ3RoID0gc3Vic3RyaW5nLmxlbmd0aDtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc3Vic3RyKGVuZEluZGV4LCBpbmRleCAtIGVuZEluZGV4KSArIHN1YnN0cmluZyArIHJlcGxhY2VyO1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyBzdWJzdHJpbmdMZW5ndGg7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc3Vic3RyKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxuY29uc3Qgc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4ID0gKHN0cmluZywgcHJlZml4LCBwb3N0Zml4LCBpbmRleCkgPT4ge1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdGNvbnN0IGdvdENSID0gc3RyaW5nW2luZGV4IC0gMV0gPT09ICdcXHInO1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zdWJzdHIoZW5kSW5kZXgsIChnb3RDUiA/IGluZGV4IC0gMSA6IGluZGV4KSAtIGVuZEluZGV4KSArIHByZWZpeCArIChnb3RDUiA/ICdcXHJcXG4nIDogJ1xcbicpICsgcG9zdGZpeDtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgMTtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnN1YnN0cihlbmRJbmRleCk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdHJpbmdSZXBsYWNlQWxsLFxuXHRzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXhcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3QgVEVNUExBVEVfUkVHRVggPSAvKD86XFxcXCh1KD86W2EtZlxcZF17NH18XFx7W2EtZlxcZF17MSw2fVxcfSl8eFthLWZcXGRdezJ9fC4pKXwoPzpcXHsofik/KFxcdysoPzpcXChbXildKlxcKSk/KD86XFwuXFx3Kyg/OlxcKFteKV0qXFwpKT8pKikoPzpbIFxcdF18KD89XFxyP1xcbikpKXwoXFx9KXwoKD86LnxbXFxyXFxuXFxmXSkrPykvZ2k7XG5jb25zdCBTVFlMRV9SRUdFWCA9IC8oPzpefFxcLikoXFx3KykoPzpcXCgoW14pXSopXFwpKT8vZztcbmNvbnN0IFNUUklOR19SRUdFWCA9IC9eKFsnXCJdKSgoPzpcXFxcLnwoPyFcXDEpW15cXFxcXSkqKVxcMSQvO1xuY29uc3QgRVNDQVBFX1JFR0VYID0gL1xcXFwodSg/OlthLWZcXGRdezR9fHtbYS1mXFxkXXsxLDZ9fSl8eFthLWZcXGRdezJ9fC4pfChbXlxcXFxdKS9naTtcblxuY29uc3QgRVNDQVBFUyA9IG5ldyBNYXAoW1xuXHRbJ24nLCAnXFxuJ10sXG5cdFsncicsICdcXHInXSxcblx0Wyd0JywgJ1xcdCddLFxuXHRbJ2InLCAnXFxiJ10sXG5cdFsnZicsICdcXGYnXSxcblx0Wyd2JywgJ1xcdiddLFxuXHRbJzAnLCAnXFwwJ10sXG5cdFsnXFxcXCcsICdcXFxcJ10sXG5cdFsnZScsICdcXHUwMDFCJ10sXG5cdFsnYScsICdcXHUwMDA3J11cbl0pO1xuXG5mdW5jdGlvbiB1bmVzY2FwZShjKSB7XG5cdGNvbnN0IHUgPSBjWzBdID09PSAndSc7XG5cdGNvbnN0IGJyYWNrZXQgPSBjWzFdID09PSAneyc7XG5cblx0aWYgKCh1ICYmICFicmFja2V0ICYmIGMubGVuZ3RoID09PSA1KSB8fCAoY1swXSA9PT0gJ3gnICYmIGMubGVuZ3RoID09PSAzKSkge1xuXHRcdHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc2xpY2UoMSksIDE2KSk7XG5cdH1cblxuXHRpZiAodSAmJiBicmFja2V0KSB7XG5cdFx0cmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KHBhcnNlSW50KGMuc2xpY2UoMiwgLTEpLCAxNikpO1xuXHR9XG5cblx0cmV0dXJuIEVTQ0FQRVMuZ2V0KGMpIHx8IGM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJndW1lbnRzKG5hbWUsIGFyZ3VtZW50c18pIHtcblx0Y29uc3QgcmVzdWx0cyA9IFtdO1xuXHRjb25zdCBjaHVua3MgPSBhcmd1bWVudHNfLnRyaW0oKS5zcGxpdCgvXFxzKixcXHMqL2cpO1xuXHRsZXQgbWF0Y2hlcztcblxuXHRmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuXHRcdGNvbnN0IG51bWJlciA9IE51bWJlcihjaHVuayk7XG5cdFx0aWYgKCFOdW1iZXIuaXNOYU4obnVtYmVyKSkge1xuXHRcdFx0cmVzdWx0cy5wdXNoKG51bWJlcik7XG5cdFx0fSBlbHNlIGlmICgobWF0Y2hlcyA9IGNodW5rLm1hdGNoKFNUUklOR19SRUdFWCkpKSB7XG5cdFx0XHRyZXN1bHRzLnB1c2gobWF0Y2hlc1syXS5yZXBsYWNlKEVTQ0FQRV9SRUdFWCwgKG0sIGVzY2FwZSwgY2hhcmFjdGVyKSA9PiBlc2NhcGUgPyB1bmVzY2FwZShlc2NhcGUpIDogY2hhcmFjdGVyKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBDaGFsayB0ZW1wbGF0ZSBzdHlsZSBhcmd1bWVudDogJHtjaHVua30gKGluIHN0eWxlICcke25hbWV9JylgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcGFyc2VTdHlsZShzdHlsZSkge1xuXHRTVFlMRV9SRUdFWC5sYXN0SW5kZXggPSAwO1xuXG5cdGNvbnN0IHJlc3VsdHMgPSBbXTtcblx0bGV0IG1hdGNoZXM7XG5cblx0d2hpbGUgKChtYXRjaGVzID0gU1RZTEVfUkVHRVguZXhlYyhzdHlsZSkpICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgbmFtZSA9IG1hdGNoZXNbMV07XG5cblx0XHRpZiAobWF0Y2hlc1syXSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IHBhcnNlQXJndW1lbnRzKG5hbWUsIG1hdGNoZXNbMl0pO1xuXHRcdFx0cmVzdWx0cy5wdXNoKFtuYW1lXS5jb25jYXQoYXJncykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRzLnB1c2goW25hbWVdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gYnVpbGRTdHlsZShjaGFsaywgc3R5bGVzKSB7XG5cdGNvbnN0IGVuYWJsZWQgPSB7fTtcblxuXHRmb3IgKGNvbnN0IGxheWVyIG9mIHN0eWxlcykge1xuXHRcdGZvciAoY29uc3Qgc3R5bGUgb2YgbGF5ZXIuc3R5bGVzKSB7XG5cdFx0XHRlbmFibGVkW3N0eWxlWzBdXSA9IGxheWVyLmludmVyc2UgPyBudWxsIDogc3R5bGUuc2xpY2UoMSk7XG5cdFx0fVxuXHR9XG5cblx0bGV0IGN1cnJlbnQgPSBjaGFsaztcblx0Zm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKGVuYWJsZWQpKSB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHN0eWxlcykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmICghKHN0eWxlTmFtZSBpbiBjdXJyZW50KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIENoYWxrIHN0eWxlOiAke3N0eWxlTmFtZX1gKTtcblx0XHR9XG5cblx0XHRjdXJyZW50ID0gc3R5bGVzLmxlbmd0aCA+IDAgPyBjdXJyZW50W3N0eWxlTmFtZV0oLi4uc3R5bGVzKSA6IGN1cnJlbnRbc3R5bGVOYW1lXTtcblx0fVxuXG5cdHJldHVybiBjdXJyZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IChjaGFsaywgdGVtcG9yYXJ5KSA9PiB7XG5cdGNvbnN0IHN0eWxlcyA9IFtdO1xuXHRjb25zdCBjaHVua3MgPSBbXTtcblx0bGV0IGNodW5rID0gW107XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblx0dGVtcG9yYXJ5LnJlcGxhY2UoVEVNUExBVEVfUkVHRVgsIChtLCBlc2NhcGVDaGFyYWN0ZXIsIGludmVyc2UsIHN0eWxlLCBjbG9zZSwgY2hhcmFjdGVyKSA9PiB7XG5cdFx0aWYgKGVzY2FwZUNoYXJhY3Rlcikge1xuXHRcdFx0Y2h1bmsucHVzaCh1bmVzY2FwZShlc2NhcGVDaGFyYWN0ZXIpKTtcblx0XHR9IGVsc2UgaWYgKHN0eWxlKSB7XG5cdFx0XHRjb25zdCBzdHJpbmcgPSBjaHVuay5qb2luKCcnKTtcblx0XHRcdGNodW5rID0gW107XG5cdFx0XHRjaHVua3MucHVzaChzdHlsZXMubGVuZ3RoID09PSAwID8gc3RyaW5nIDogYnVpbGRTdHlsZShjaGFsaywgc3R5bGVzKShzdHJpbmcpKTtcblx0XHRcdHN0eWxlcy5wdXNoKHtpbnZlcnNlLCBzdHlsZXM6IHBhcnNlU3R5bGUoc3R5bGUpfSk7XG5cdFx0fSBlbHNlIGlmIChjbG9zZSkge1xuXHRcdFx0aWYgKHN0eWxlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdGb3VuZCBleHRyYW5lb3VzIH0gaW4gQ2hhbGsgdGVtcGxhdGUgbGl0ZXJhbCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRjaHVua3MucHVzaChidWlsZFN0eWxlKGNoYWxrLCBzdHlsZXMpKGNodW5rLmpvaW4oJycpKSk7XG5cdFx0XHRjaHVuayA9IFtdO1xuXHRcdFx0c3R5bGVzLnBvcCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjaHVuay5wdXNoKGNoYXJhY3Rlcik7XG5cdFx0fVxuXHR9KTtcblxuXHRjaHVua3MucHVzaChjaHVuay5qb2luKCcnKSk7XG5cblx0aWYgKHN0eWxlcy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgZXJyTWVzc2FnZSA9IGBDaGFsayB0ZW1wbGF0ZSBsaXRlcmFsIGlzIG1pc3NpbmcgJHtzdHlsZXMubGVuZ3RofSBjbG9zaW5nIGJyYWNrZXQke3N0eWxlcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gKFxcYH1cXGApYDtcblx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyTWVzc2FnZSk7XG5cdH1cblxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oJycpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCBhbnNpU3R5bGVzID0gcmVxdWlyZSgnYW5zaS1zdHlsZXMnKTtcbmNvbnN0IHtzdGRvdXQ6IHN0ZG91dENvbG9yLCBzdGRlcnI6IHN0ZGVyckNvbG9yfSA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5jb25zdCB7XG5cdHN0cmluZ1JlcGxhY2VBbGwsXG5cdHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleFxufSA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLy8gYHN1cHBvcnRzQ29sb3IubGV2ZWxgIFx1MjE5MiBgYW5zaVN0eWxlcy5jb2xvcltuYW1lXWAgbWFwcGluZ1xuY29uc3QgbGV2ZWxNYXBwaW5nID0gW1xuXHQnYW5zaScsXG5cdCdhbnNpJyxcblx0J2Fuc2kyNTYnLFxuXHQnYW5zaTE2bSdcbl07XG5cbmNvbnN0IHN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmNvbnN0IGFwcGx5T3B0aW9ucyA9IChvYmplY3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAob3B0aW9ucy5sZXZlbCAmJiAhKE51bWJlci5pc0ludGVnZXIob3B0aW9ucy5sZXZlbCkgJiYgb3B0aW9ucy5sZXZlbCA+PSAwICYmIG9wdGlvbnMubGV2ZWwgPD0gMykpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgbGV2ZWxgIG9wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDAgdG8gMycpO1xuXHR9XG5cblx0Ly8gRGV0ZWN0IGxldmVsIGlmIG5vdCBzZXQgbWFudWFsbHlcblx0Y29uc3QgY29sb3JMZXZlbCA9IHN0ZG91dENvbG9yID8gc3Rkb3V0Q29sb3IubGV2ZWwgOiAwO1xuXHRvYmplY3QubGV2ZWwgPSBvcHRpb25zLmxldmVsID09PSB1bmRlZmluZWQgPyBjb2xvckxldmVsIDogb3B0aW9ucy5sZXZlbDtcbn07XG5cbmNsYXNzIENoYWxrQ2xhc3Mge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuXHRcdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG5cdH1cbn1cblxuY29uc3QgY2hhbGtGYWN0b3J5ID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGNoYWxrID0ge307XG5cdGFwcGx5T3B0aW9ucyhjaGFsaywgb3B0aW9ucyk7XG5cblx0Y2hhbGsudGVtcGxhdGUgPSAoLi4uYXJndW1lbnRzXykgPT4gY2hhbGtUYWcoY2hhbGsudGVtcGxhdGUsIC4uLmFyZ3VtZW50c18pO1xuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgQ2hhbGsucHJvdG90eXBlKTtcblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNoYWxrLnRlbXBsYXRlLCBjaGFsayk7XG5cblx0Y2hhbGsudGVtcGxhdGUuY29uc3RydWN0b3IgPSAoKSA9PiB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdgY2hhbGsuY29uc3RydWN0b3IoKWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBuZXcgY2hhbGsuSW5zdGFuY2UoKWAgaW5zdGVhZC4nKTtcblx0fTtcblxuXHRjaGFsay50ZW1wbGF0ZS5JbnN0YW5jZSA9IENoYWxrQ2xhc3M7XG5cblx0cmV0dXJuIGNoYWxrLnRlbXBsYXRlO1xufTtcblxuZnVuY3Rpb24gQ2hhbGsob3B0aW9ucykge1xuXHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xufVxuXG5mb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhhbnNpU3R5bGVzKSkge1xuXHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCBjcmVhdGVTdHlsZXIoc3R5bGUub3Blbiwgc3R5bGUuY2xvc2UsIHRoaXMuX3N0eWxlciksIHRoaXMuX2lzRW1wdHkpO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN0eWxlTmFtZSwge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0XHRyZXR1cm4gYnVpbGRlcjtcblx0XHR9XG5cdH07XG59XG5cbnN0eWxlcy52aXNpYmxlID0ge1xuXHRnZXQoKSB7XG5cdFx0Y29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGhpcywgdGhpcy5fc3R5bGVyLCB0cnVlKTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Zpc2libGUnLCB7dmFsdWU6IGJ1aWxkZXJ9KTtcblx0XHRyZXR1cm4gYnVpbGRlcjtcblx0fVxufTtcblxuY29uc3QgdXNlZE1vZGVscyA9IFsncmdiJywgJ2hleCcsICdrZXl3b3JkJywgJ2hzbCcsICdoc3YnLCAnaHdiJywgJ2Fuc2knLCAnYW5zaTI1NiddO1xuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIHVzZWRNb2RlbHMpIHtcblx0c3R5bGVzW21vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoYW5zaVN0eWxlcy5jb2xvcltsZXZlbE1hcHBpbmdbbGV2ZWxdXVttb2RlbF0oLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuY29sb3IuY2xvc2UsIHRoaXMuX3N0eWxlcik7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpcy5faXNFbXB0eSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcbn1cblxuZm9yIChjb25zdCBtb2RlbCBvZiB1c2VkTW9kZWxzKSB7XG5cdGNvbnN0IGJnTW9kZWwgPSAnYmcnICsgbW9kZWxbMF0udG9VcHBlckNhc2UoKSArIG1vZGVsLnNsaWNlKDEpO1xuXHRzdHlsZXNbYmdNb2RlbF0gPSB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3Qge2xldmVsfSA9IHRoaXM7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcblx0XHRcdFx0Y29uc3Qgc3R5bGVyID0gY3JlYXRlU3R5bGVyKGFuc2lTdHlsZXMuYmdDb2xvcltsZXZlbE1hcHBpbmdbbGV2ZWxdXVttb2RlbF0oLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZSwgdGhpcy5fc3R5bGVyKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzLl9pc0VtcHR5KTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xufVxuXG5jb25zdCBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCgpID0+IHt9LCB7XG5cdC4uLnN0eWxlcyxcblx0bGV2ZWw6IHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZW5lcmF0b3IubGV2ZWw7XG5cdFx0fSxcblx0XHRzZXQobGV2ZWwpIHtcblx0XHRcdHRoaXMuX2dlbmVyYXRvci5sZXZlbCA9IGxldmVsO1xuXHRcdH1cblx0fVxufSk7XG5cbmNvbnN0IGNyZWF0ZVN0eWxlciA9IChvcGVuLCBjbG9zZSwgcGFyZW50KSA9PiB7XG5cdGxldCBvcGVuQWxsO1xuXHRsZXQgY2xvc2VBbGw7XG5cdGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdG9wZW5BbGwgPSBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2U7XG5cdH0gZWxzZSB7XG5cdFx0b3BlbkFsbCA9IHBhcmVudC5vcGVuQWxsICsgb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlICsgcGFyZW50LmNsb3NlQWxsO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRvcGVuLFxuXHRcdGNsb3NlLFxuXHRcdG9wZW5BbGwsXG5cdFx0Y2xvc2VBbGwsXG5cdFx0cGFyZW50XG5cdH07XG59O1xuXG5jb25zdCBjcmVhdGVCdWlsZGVyID0gKHNlbGYsIF9zdHlsZXIsIF9pc0VtcHR5KSA9PiB7XG5cdGNvbnN0IGJ1aWxkZXIgPSAoLi4uYXJndW1lbnRzXykgPT4ge1xuXHRcdGlmIChpc0FycmF5KGFyZ3VtZW50c19bMF0pICYmIGlzQXJyYXkoYXJndW1lbnRzX1swXS5yYXcpKSB7XG5cdFx0XHQvLyBDYWxsZWQgYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsLCBmb3IgZXhhbXBsZTogY2hhbGsucmVkYDIgKyAzID0ge2JvbGQgJHsyKzN9fWBcblx0XHRcdHJldHVybiBhcHBseVN0eWxlKGJ1aWxkZXIsIGNoYWxrVGFnKGJ1aWxkZXIsIC4uLmFyZ3VtZW50c18pKTtcblx0XHR9XG5cblx0XHQvLyBTaW5nbGUgYXJndW1lbnQgaXMgaG90IHBhdGgsIGltcGxpY2l0IGNvZXJjaW9uIGlzIGZhc3RlciB0aGFuIGFueXRoaW5nXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdFx0cmV0dXJuIGFwcGx5U3R5bGUoYnVpbGRlciwgKGFyZ3VtZW50c18ubGVuZ3RoID09PSAxKSA/ICgnJyArIGFyZ3VtZW50c19bMF0pIDogYXJndW1lbnRzXy5qb2luKCcgJykpO1xuXHR9O1xuXG5cdC8vIFdlIGFsdGVyIHRoZSBwcm90b3R5cGUgYmVjYXVzZSB3ZSBtdXN0IHJldHVybiBhIGZ1bmN0aW9uLCBidXQgdGhlcmUgaXNcblx0Ly8gbm8gd2F5IHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgcHJvdG90eXBlXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihidWlsZGVyLCBwcm90byk7XG5cblx0YnVpbGRlci5fZ2VuZXJhdG9yID0gc2VsZjtcblx0YnVpbGRlci5fc3R5bGVyID0gX3N0eWxlcjtcblx0YnVpbGRlci5faXNFbXB0eSA9IF9pc0VtcHR5O1xuXG5cdHJldHVybiBidWlsZGVyO1xufTtcblxuY29uc3QgYXBwbHlTdHlsZSA9IChzZWxmLCBzdHJpbmcpID0+IHtcblx0aWYgKHNlbGYubGV2ZWwgPD0gMCB8fCAhc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNlbGYuX2lzRW1wdHkgPyAnJyA6IHN0cmluZztcblx0fVxuXG5cdGxldCBzdHlsZXIgPSBzZWxmLl9zdHlsZXI7XG5cblx0aWYgKHN0eWxlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHtvcGVuQWxsLCBjbG9zZUFsbH0gPSBzdHlsZXI7XG5cdGlmIChzdHJpbmcuaW5kZXhPZignXFx1MDAxQicpICE9PSAtMSkge1xuXHRcdHdoaWxlIChzdHlsZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gUmVwbGFjZSBhbnkgaW5zdGFuY2VzIGFscmVhZHkgcHJlc2VudCB3aXRoIGEgcmUtb3BlbmluZyBjb2RlXG5cdFx0XHQvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG5cdFx0XHQvLyB3aWxsIGJlIGNvbG9yZWQsIGFuZCB0aGUgcmVzdCB3aWxsIHNpbXBseSBiZSAncGxhaW4nLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN0eWxlci5jbG9zZSwgc3R5bGVyLm9wZW4pO1xuXG5cdFx0XHRzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGNhbiBtb3ZlIGJvdGggbmV4dCBhY3Rpb25zIG91dCBvZiBsb29wLCBiZWNhdXNlIHJlbWFpbmluZyBhY3Rpb25zIGluIGxvb3Agd29uJ3QgaGF2ZVxuXHQvLyBhbnkvdmlzaWJsZSBlZmZlY3Qgb24gcGFydHMgd2UgYWRkIGhlcmUuIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG5cdC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPUzogaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL3B1bGwvOTJcblx0Y29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcblx0aWYgKGxmSW5kZXggIT09IC0xKSB7XG5cdFx0c3RyaW5nID0gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgY2xvc2VBbGwsIG9wZW5BbGwsIGxmSW5kZXgpO1xuXHR9XG5cblx0cmV0dXJuIG9wZW5BbGwgKyBzdHJpbmcgKyBjbG9zZUFsbDtcbn07XG5cbmxldCB0ZW1wbGF0ZTtcbmNvbnN0IGNoYWxrVGFnID0gKGNoYWxrLCAuLi5zdHJpbmdzKSA9PiB7XG5cdGNvbnN0IFtmaXJzdFN0cmluZ10gPSBzdHJpbmdzO1xuXG5cdGlmICghaXNBcnJheShmaXJzdFN0cmluZykgfHwgIWlzQXJyYXkoZmlyc3RTdHJpbmcucmF3KSkge1xuXHRcdC8vIElmIGNoYWxrKCkgd2FzIGNhbGxlZCBieSBpdHNlbGYgb3Igd2l0aCBhIHN0cmluZyxcblx0XHQvLyByZXR1cm4gdGhlIHN0cmluZyBpdHNlbGYgYXMgYSBzdHJpbmcuXG5cdFx0cmV0dXJuIHN0cmluZ3Muam9pbignICcpO1xuXHR9XG5cblx0Y29uc3QgYXJndW1lbnRzXyA9IHN0cmluZ3Muc2xpY2UoMSk7XG5cdGNvbnN0IHBhcnRzID0gW2ZpcnN0U3RyaW5nLnJhd1swXV07XG5cblx0Zm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdFN0cmluZy5sZW5ndGg7IGkrKykge1xuXHRcdHBhcnRzLnB1c2goXG5cdFx0XHRTdHJpbmcoYXJndW1lbnRzX1tpIC0gMV0pLnJlcGxhY2UoL1t7fVxcXFxdL2csICdcXFxcJCYnKSxcblx0XHRcdFN0cmluZyhmaXJzdFN0cmluZy5yYXdbaV0pXG5cdFx0KTtcblx0fVxuXG5cdGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGVtcGxhdGUgPSByZXF1aXJlKCcuL3RlbXBsYXRlcycpO1xuXHR9XG5cblx0cmV0dXJuIHRlbXBsYXRlKGNoYWxrLCBwYXJ0cy5qb2luKCcnKSk7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDaGFsay5wcm90b3R5cGUsIHN0eWxlcyk7XG5cbmNvbnN0IGNoYWxrID0gQ2hhbGsoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5jaGFsay5zdXBwb3J0c0NvbG9yID0gc3Rkb3V0Q29sb3I7XG5jaGFsay5zdGRlcnIgPSBDaGFsayh7bGV2ZWw6IHN0ZGVyckNvbG9yID8gc3RkZXJyQ29sb3IubGV2ZWwgOiAwfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuY2hhbGsuc3RkZXJyLnN1cHBvcnRzQ29sb3IgPSBzdGRlcnJDb2xvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBjaGFsaztcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzIChhdm9pZCBjb25mbGljdHMgd2l0aCBwdXJlbm93KVxuZXhwb3J0IHsgUnVudGltZVdlYkNsaSwgY3JlYXRlUnVudGltZUNsaSB9IGZyb20gJ0BiaW4vcnVudGltZS13ZWItY2xpJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgc2VydmljZSB3aXRoIGRpZmZlcmVudCBuYW1lcyB0byBhdm9pZCBjb25mbGljdHNcbmV4cG9ydCB7XG4gIFRlbXBsYXRlU2VydmljZSBhcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlLFxuICBTY2FmZm9sZE9wdGlvbnMgYXMgUnVudGltZVNjYWZmb2xkT3B0aW9ucyxcbiAgVGVtcGxhdGVDb250ZXh0IGFzIFJ1bnRpbWVUZW1wbGF0ZUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSxcbiAgUnVudGltZURlcGxveW1lbnRTdHJhdGVneSxcbiAgYnVpbGRTdGF0aWNIdG1sLFxuICBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxufSBmcm9tICcuL3NlcnZpY2VzJztcblxuZXhwb3J0IHsgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5leHBvcnQge1xuICBSdW50aW1lQnVpbGRFcnJvcixcbiAgUnVudGltZUNsaUVycm9yLFxuICBSdW50aW1lQ29uZmlnRXJyb3IsXG4gIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IsXG4gIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IsXG4gIFJ1bnRpbWVUZW1wbGF0ZUVycm9yLFxuICBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvcixcbiAgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyLFxufSBmcm9tICcuL3V0aWxzL2Vycm9ycyc7XG5cbi8vIGV4cG9ydCB7IFB1cmVub3dSdW50aW1lQ2xpIH0gZnJvbSAnLi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtZGVwbG95bWVudC5zdHJhdGVneSc7XG4iLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5cbmltcG9ydCB7XG4gIEdsb2JhbE9wdGlvbnMsXG4gIFB1cmVub3dDbGksXG4gIFB1cmVub3dDbGlDb250ZXh0LFxuICBwdXJlbm93Q29tbWFuZENvbmZpZyxcbiAgdHlwZSBTdHJhdGVneUNvbnRhaW5lcixcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDb21tYW5kLFxuICB0eXBlIEJ1aWxkT3B0aW9ucyxcbiAgLy8gZGV2VmFsaWRhdGlvbkNvbW1hbmQsIC8vIFRPRE86IEltcGxlbWVudCBkZXYgdmFsaWRhdGlvblxuICAvLyB0eXBlIERldlZhbGlkYXRpb25PcHRpb25zLFxuICBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UsXG59IGZyb20gJ0BiaW4vY29tbWFuZHMnO1xuXG5pbXBvcnQgeyBydW50aW1lSW5pdENvbW1hbmQsIHR5cGUgUnVudGltZUluaXRPcHRpb25zIH0gZnJvbSAnQGJpbi9jb21tYW5kcy9pbml0JztcblxuaW1wb3J0IHsgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsIFJ1bnRpbWVUZW1wbGF0ZUVycm9yLCBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciB9IGZyb20gJ0BiaW4vdXRpbHMvZXJyb3JzJztcbmltcG9ydCB7IFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgYXMgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnQGJpbi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBSdW50aW1lIENMSSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgUHVyZW5vd0NsaSB1c2luZyB0aGUgZXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmVcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHVyZW5vdydzIEV4dGVuc2libGVDbGlDb3JlLmFkZENvbW1hbmRzKCkgYW5kIGFkZEFjdGlvbnMoKVxuICogdG8gYWRkIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB3aGlsZSBwcmVzZXJ2aW5nIGFsbCBleGlzdGluZyBwdXJlbm93IGNvbW1hbmRzLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkNsaSBleHRlbmRzIFB1cmVub3dDbGkge1xuICBzdGF0aWMgZGVmYXVsdFRvb2xOYW1lOiBzdHJpbmcgPSAncnVudGltZSc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgc3RyYXRlZ2llc1xuICAgIC8vIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU3RyYXRlZ3lDb250YWluZXIoKTtcbiAgICAvL1xuICAgIC8vIC8vIEFkZCBydW50aW1lIGRlcGxveW1lbnQgc3RyYXRlZ3kgZm9yIHRocmVlLXN0YWNrIGRlcGxveW1lbnRcbiAgICAvLyBzdHJhdGVnaWVzLmFkZFN0cmF0ZWd5KG5ldyBSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5KCkpO1xuXG4gICAgc3VwZXIodm9pZCAwIC8qc3RyYXRlZ2llcyovLCB7XG4gICAgICB0b29sTmFtZTogUnVudGltZVdlYkNsaS5kZWZhdWx0VG9vbE5hbWUsXG4gICAgICBoZWxwZXJUb29sTmFtZTogJ1J1bnRpbWUgV2ViJyxcbiAgICAgIHRpdGxlOiAnUnVudGltZSB0YXJnZXQgZnJhbWV3b3JrIGZvciBBV1MgTGFtYmRhJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUnVudGltZSB0YXJnZXQgZnJhbWV3b3JrIGZvciBBV1MgTGFtYmRhJyxcbiAgICAgIGZhbGxiYWNrVmVyc2lvbjogJzAuMi4xMzUnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb21tYW5kcyA9IHB1cmVub3dDb21tYW5kQ29uZmlnKFJ1bnRpbWVXZWJDbGkuZGVmYXVsdFRvb2xOYW1lKTtcblxuICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGJ1aWxkIGNvbW1hbmRzXG4gICAgdGhpcy5hZGRCdWlsZENvbW1hbmRzKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIHJ1bnRpbWUtd2ViIGV4dGVuc2lvbnNcbiAgICAvLyB0aGlzLnJ1bnRpbWVFeHRlbnNpb25zID0gbmV3IFJ1bnRpbWVXZWJDbGlFeHRlbnNpb25zKCk7XG5cbiAgICAvLyBBZGQgcnVudGltZS1zcGVjaWZpYyBjb21tYW5kcyB1c2luZyBleHRlbnNpYmxlIGFyY2hpdGVjdHVyZVxuICAgIC8vIEBub3RlOiBpcyBub3QgbmVjZXNzYXJ5LCB3ZSBleHBlY3QgdG8gcmVkZWZpbmUgZGVwbG95bWVudCBzdHJhdGVneSBvbmx5XG4gICAgLy8gdGhpcy5hZGRSdW50aW1lQ29tbWFuZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcnVudGltZS1zcGVjaWZpYyBidWlsZCBjb21tYW5kc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRCdWlsZENvbW1hbmRzKCk6IHZvaWQge1xuICAgIC8vIEVuaGFuY2VkIGJ1aWxkIGNvbW1hbmQgd2l0aCBtdWx0aXBsZSB0YXJnZXQgc3VwcG9ydFxuICAgIC8vIHRoaXMucHJvZ3JhbVxuICAgIC8vICAgLmNvbW1hbmQoJ2J1aWxkJylcbiAgICAvLyAgIC5kZXNjcmlwdGlvbignQnVpbGQgcnVudGltZSBidW5kbGVzIGZvciBkaWZmZXJlbnQgdGFyZ2V0cycpXG4gICAgLy8gICAub3B0aW9uKCctdCwgLS10YXJnZXQgPHRhcmdldD4nLCAnQnVpbGQgdGFyZ2V0IChhbGx8YnJvd3NlcnxsYW1iZGF8bGlifGxpYi1lc218aW5mcmF8Y2xpfGJpbnxjZGspJywgJ2FsbCcpXG4gICAgLy8gICAub3B0aW9uKCctLWRldicsICdFbmFibGUgZGV2ZWxvcG1lbnQgbW9kZSAoZmFzdGVyIGJ1aWxkcywgc291cmNlIG1hcHMpJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLXdhdGNoJywgJ0VuYWJsZSB3YXRjaCBtb2RlIGZvciBjb250aW51b3VzIHJlYnVpbGRzJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLXNraXAtdmFsaWRhdGlvbicsICdTa2lwIGJ1bmRsZSB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctLWRldi12YWxpZGF0aW9uJywgJ0VuYWJsZSBlbmhhbmNlZCBkZXZlbG9wbWVudCB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgLy8gICAub3B0aW9uKCctdiwgLS12ZXJib3NlJywgJ0VuYWJsZSB2ZXJib3NlIG91dHB1dCcsIGZhbHNlKVxuICAgIC8vICAgLm9wdGlvbignLS1vdXRkaXIgPGRpcj4nLCAnT3ZlcnJpZGUgb3V0cHV0IGRpcmVjdG9yeScpXG4gICAgLy8gICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0ID09PSAnYnJvd3NlcicgPyAncmVhY3QnIDogb3B0aW9ucy50YXJnZXQsXG4gICAgLy8gICAgICAgICBkZXY6IG9wdGlvbnMuZGV2LFxuICAgIC8vICAgICAgICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2gsXG4gICAgLy8gICAgICAgICBza2lwVmFsaWRhdGlvbjogb3B0aW9ucy5za2lwVmFsaWRhdGlvbixcbiAgICAvLyAgICAgICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcbiAgICAvLyAgICAgICAgIG91dGRpcjogb3B0aW9ucy5vdXRkaXIsXG4gICAgLy8gICAgICAgfTtcbiAgICAvL1xuICAgIC8vICAgICAgIGF3YWl0IGJ1aWxkQ29tbWFuZChidWlsZE9wdGlvbnMpO1xuICAgIC8vXG4gICAgLy8gICAgICAgLy8gUnVuIGRldmVsb3BtZW50IHZhbGlkYXRpb24gaWYgcmVxdWVzdGVkXG4gICAgLy8gICAgICAgaWYgKG9wdGlvbnMuZGV2VmFsaWRhdGlvbikge1xuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coJ1xcblx1RDgzRFx1REQwRCBTdGFydGluZyBkZXZlbG9wbWVudCB2YWxpZGF0aW9uLi4uJyk7XG4gICAgLy8gICAgICAgICBjb25zdCBkZXZPcHRpb25zOiBEZXZWYWxpZGF0aW9uT3B0aW9ucyA9IHtcbiAgICAvLyAgICAgICAgICAgdGFyZ2V0czogW29wdGlvbnMudGFyZ2V0ID09PSAnYnJvd3NlcicgPyAncmVhY3QnIDogb3B0aW9ucy50YXJnZXRdLFxuICAgIC8vICAgICAgICAgICB3YXRjaDogZmFsc2UsIC8vIFNpbmdsZSBydW4gZm9yIGJ1aWxkIGNvbW1hbmRcbiAgICAvLyAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgIC8vICAgICAgICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXG4gICAgLy8gICAgICAgICB9O1xuICAgIC8vXG4gICAgLy8gICAgICAgICBjb25zdCB7IERldlZhbGlkYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJ0BiaW4vY29tbWFuZHMnKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IGRldlNlcnZpY2UgPSBuZXcgRGV2VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICAvLyAgICAgICAgIGF3YWl0IGRldlNlcnZpY2UucnVuVmFsaWRhdGlvbihkZXZPcHRpb25zLnRhcmdldHMhLCBkZXZPcHRpb25zLnZlcmJvc2UpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdCdWlsZCBmYWlsZWQ6JywgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAvLyAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pO1xuXG4gICAgLy8gSW5kaXZpZHVhbCB0YXJnZXQgYnVpbGQgY29tbWFuZHMgZm9yIGNvbnZlbmllbmNlXG4gICAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmJyb3dzZXInLCB0YXJnZXQ6ICdyZWFjdCcsIGRlc2M6ICdCdWlsZCBicm93c2VyIGJ1bmRsZSAoRVNNKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxhbWJkYScsIHRhcmdldDogJ2xhbWJkYScsIGRlc2M6ICdCdWlsZCBMYW1iZGEgYnVuZGxlIChDb21tb25KUyknIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDpsaWInLCB0YXJnZXQ6ICdsaWInLCBkZXNjOiAnQnVpbGQgbGlicmFyeSBidW5kbGUgKENvbW1vbkpTKScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmxpYi1lc20nLCB0YXJnZXQ6ICdsaWItZXNtJywgZGVzYzogJ0J1aWxkIGxpYnJhcnkgYnVuZGxlIChFU00pJyB9LFxuICAgICAgeyBuYW1lOiAnYnVpbGQ6aW5mcmEnLCB0YXJnZXQ6ICdpbmZyYScsIGRlc2M6ICdCdWlsZCBpbmZyYXN0cnVjdHVyZSBidW5kbGUnIH0sXG4gICAgICB7IG5hbWU6ICdidWlsZDpjbGknLCB0YXJnZXQ6ICdjbGknLCBkZXNjOiAnQnVpbGQgQ0xJIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmJpbicsIHRhcmdldDogJ2JpbicsIGRlc2M6ICdCdWlsZCBiaW4gdXRpbGl0aWVzIGJ1bmRsZScgfSxcbiAgICAgIHsgbmFtZTogJ2J1aWxkOmNkaycsIHRhcmdldDogJ2NkaycsIGRlc2M6ICdCdWlsZCBDREsgYXBwbGljYXRpb24gYnVuZGxlJyB9LFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdGFyZ2V0LCBkZXNjIH0gb2YgdGFyZ2V0cykge1xuICAgICAgdGhpcy5wcm9ncmFtXG4gICAgICAgIC5jb21tYW5kKG5hbWUpXG4gICAgICAgIC5kZXNjcmlwdGlvbihkZXNjKVxuICAgICAgICAub3B0aW9uKCctLWRldicsICdFbmFibGUgZGV2ZWxvcG1lbnQgbW9kZScsIGZhbHNlKVxuICAgICAgICAub3B0aW9uKCctLXNraXAtdmFsaWRhdGlvbicsICdTa2lwIGJ1bmRsZSB2YWxpZGF0aW9uJywgZmFsc2UpXG4gICAgICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0IGFzIGFueSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEdldCBjb25maWcgYW5kIGxvZ2dlciBmcm9tIHNvbWV3aGVyZSAtIHRoaXMgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgcHJvcGVybHlcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHt9IGFzIGFueTsgLy8gVE9ETzogR2V0IHByb3BlciBjb25maWdcbiAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGNvbnNvbGUgYXMgYW55OyAvLyBUT0RPOiBHZXQgcHJvcGVyIGxvZ2dlclxuXG4gICAgICAgICAgICBhd2FpdCBidWlsZENvbW1hbmQoYnVpbGRPcHRpb25zLCBjb25maWcsIGxvZ2dlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bmFtZX0gZmFpbGVkOmAsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZXZlbG9wbWVudCB2YWxpZGF0aW9uIGNvbW1hbmRcbiAgICB0aGlzLnByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdkZXY6dmFsaWRhdGUnKVxuICAgICAgLmRlc2NyaXB0aW9uKCdTdGFydCBkZXZlbG9wbWVudCBtb2RlIGJ1bmRsZSB2YWxpZGF0aW9uIHdpdGggcmVhbC10aW1lIGZlZWRiYWNrJylcbiAgICAgIC5vcHRpb24oJy10LCAtLXRhcmdldHMgPHRhcmdldHM+JywgJ0NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMgdG8gdmFsaWRhdGUnLCAncmVhY3QsbGFtYmRhJylcbiAgICAgIC5vcHRpb24oJy0tbm8td2F0Y2gnLCAnRGlzYWJsZSBmaWxlIHdhdGNoaW5nJywgZmFsc2UpXG4gICAgICAub3B0aW9uKCctLWludGVydmFsIDxtcz4nLCAnVmFsaWRhdGlvbiBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMnLCAnNTAwMCcpXG4gICAgICAub3B0aW9uKCctLW5vLWltbWVkaWF0ZScsICdTa2lwIGltbWVkaWF0ZSB2YWxpZGF0aW9uIG9uIHN0YXJ0dXAnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnRW5hYmxlIHZlcmJvc2Ugb3V0cHV0JywgZmFsc2UpXG4gICAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IG9wdGlvbnMudGFyZ2V0cy5zcGxpdCgnLCcpLm1hcCgodDogc3RyaW5nKSA9PiB0LnRyaW0oKSk7XG4gICAgICAgICAgY29uc3QgZGV2T3B0aW9uczogYW55ID0geyAvLyBUT0RPOiBVc2UgcHJvcGVyIERldlZhbGlkYXRpb25PcHRpb25zIHR5cGVcbiAgICAgICAgICAgIHRhcmdldHMsXG4gICAgICAgICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCxcbiAgICAgICAgICAgIGludGVydmFsOiBwYXJzZUludChvcHRpb25zLmludGVydmFsLCAxMCksXG4gICAgICAgICAgICBpbW1lZGlhdGU6IG9wdGlvbnMuaW1tZWRpYXRlLFxuICAgICAgICAgICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBhd2FpdCBkZXZWYWxpZGF0aW9uQ29tbWFuZChkZXZPcHRpb25zKTsgLy8gVE9ETzogSW1wbGVtZW50IGRldiB2YWxpZGF0aW9uXG4gICAgICAgICAgY29uc29sZS5sb2coJ0RldiB2YWxpZGF0aW9uIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZXZlbG9wbWVudCB2YWxpZGF0aW9uIGZhaWxlZDonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFB1cmVub3ctc3BlY2lmaWMgY29udGV4dCB3aXRoIGFsbCByZXF1aXJlZCBzZXJ2aWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUNvbnRleHQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0PihcbiAgICBnbG9iYWxPcHRzOiBHbG9iYWxPcHRpb25zLCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHB1cmVub3dDb250ZXh0ID1cbiAgICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUNvbnRleHQ8UHVyZW5vd0NsaUNvbnRleHQ+KHtcbiAgICAgICAgLi4uZ2xvYmFsT3B0cyxcbiAgICAgICAgY29uZmlnOiBnbG9iYWxPcHRzLmNvbmZpZyA/PyAncnVudGltZS5jb25maWcudHMnXG4gICAgICB9LCBjd2QpO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2VcbiAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZvciBkZXBsb3kgY29tbWFuZCAocmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzKVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlZmF1bHQgZGVwbG95bWVudCBiZWhhdmlvclxuICAgICAgY29uc3QgZGVwbG95bWVudFNlcnZpY2UgPSBuZXcgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50U2VydmljZS5kZXBsb3lDb21tYW5kKFxuICAgICAgICBjb250ZXh0LnN0YWNrc0RlcGxveVNlcnZpY2UsXG4gICAgICAgIG9wdGlvbnMgYXMgYW55LFxuICAgICAgICBjb250ZXh0LmNvbmZpZyxcbiAgICAgICAgY29udGV4dC5sb2dnZXIsXG4gICAgICAgIGNvbnRleHQuY3dkLFxuICAgICAgICBjb250ZXh0LmVudlZhbGlkYXRvcixcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KHJlc3VsdC5leGl0Q29kZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZm9yIGluaXQgY29tbWFuZCAodXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlKVxuICAgKi9cbiAgYXN5bmMgaW5pdENvbW1hbmQob3B0aW9uczogdW5rbm93biwgY21kOiBDb21tYW5kLCBzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBoZWxwIHdhcyByZXF1ZXN0ZWQgLSBsZXQgQ29tbWFuZGVyLmpzIGhhbmRsZSBpdFxuICAgIGlmICh0aGlzLmlzSGVscFJlcXVlc3RlZChjbWQpKSB7XG4gICAgICBjbWQuaGVscCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmdldENvbnRleHQob3B0aW9ucywgY21kKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgcnVudGltZS1zcGVjaWZpYyBpbml0IGNvbW1hbmQgd2l0aCBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gICAgICBjb25zdCBpbml0T3B0aW9ucyA9IG9wdGlvbnMgYXMgUnVudGltZUluaXRPcHRpb25zO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW50aW1lSW5pdENvbW1hbmQoXG4gICAgICAgIGluaXRPcHRpb25zLFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBwcm9jZXNzLmV4aXQocmVzdWx0LmV4aXRDb2RlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBmb3IgZGVzdHJveSBjb21tYW5kIChyZXF1aXJlcyBBV1MgY3JlZGVudGlhbHMpXG4gICAqL1xuICBhc3luYyBkZXN0cm95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCBhbmQgZXhlY3V0ZSBkZXN0cm95IGNvbW1hbmRcbiAgICAgIGNvbnN0IHsgZGVzdHJveUNvbW1hbmQgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmt0aWYvcHVyZW5vdy9iaW4nKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlc3Ryb3lDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ub3B0aW9ucyBhcyBhbnksXG4gICAgICAgICAgYmFja3VwRGlyOiAnLi8ucnVudGltZS1iYWNrdXBzJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LmxvZ2dlcixcbiAgICAgICAgY29udGV4dC5jd2QsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdChyZXN1bHQuZXhpdENvZGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIENMSSB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKi9cbiAgYXN5bmMgcnVuKGFyZ3M/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvZ3JhbS5wYXJzZUFzeW5jKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBsb2dnaW5nIChubyBlbW9qaSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyKCk7XG4gICAgY29uc3QgdmVyYm9zZSA9ICEhcHJvY2Vzcy5lbnYuREVCVUc7XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lVGVtcGxhdGVFcnJvcikge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBmb3JtYXR0ZXIuZm9ybWF0VGVtcGxhdGVFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEVycm9yID0gZm9ybWF0dGVyLmZvcm1hdFRlbXBsYXRlU3RydWN0dXJlRXJyb3IoZXJyb3IsIHZlcmJvc2UpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRFcnJvcik7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRFcnJvciA9IGZvcm1hdHRlci5mb3JtYXRFcnJvcihlcnJvciwgdmVyYm9zZSk7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZEVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBlcnJvcjonLCBTdHJpbmcoZXJyb3IpKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIENMSSBpbnN0YW5jZSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgcHVyZW5vd1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVudGltZUNsaSgpOiBSdW50aW1lV2ViQ2xpIHtcbiAgcmV0dXJuIG5ldyBSdW50aW1lV2ViQ2xpKCk7XG59XG5cbi8vIC8qKlxuLy8gICogTWFpbiBDTEkgZW50cnkgcG9pbnQgdXNpbmcgcHJvcGVyIHB1cmVub3cgZXh0ZW5zaW9uXG4vLyAgKi9cbi8vIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuLy8gICB0cnkge1xuLy8gICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbi8vICAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG4vL1xuLy8gICAgIC8vIFBhcnNlIGFuZCBleGVjdXRlIENMSSBjb21tYW5kc1xuLy8gICAgIGF3YWl0IGNsaS5ydW4oKTtcbi8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICBQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4vLyAgIH1cbi8vIH1cblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuLy8gICBtYWluKCkuY2F0Y2goUHVyZW5vd1J1bnRpbWVDbGkuaGFuZGxlRXJyb3IpO1xuLy8gfVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFRlbXBsYXRlU2VydmljZSBhcyBQdXJlbm93VGVtcGxhdGVTZXJ2aWNlLCB0eXBlIFNjYWZmb2xkT3B0aW9ucywgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBSdW50aW1lVGVtcGxhdGVFcnJvciwgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IgfSBmcm9tICdAYmluL3V0aWxzL2Vycm9ycyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmb3IgY29tcGF0aWJpbGl0eVxuZXhwb3J0IHR5cGUgeyBTY2FmZm9sZE9wdGlvbnMsIFRlbXBsYXRlQ29udGV4dCB9O1xuXG4vKipcbiAqIFJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgc2VydmljZSB0aGF0IGV4dGVuZHMgcHVyZW5vdydzIFRlbXBsYXRlU2VydmljZVxuICogdG8gcmVzb2x2ZSB0ZW1wbGF0ZXMgZnJvbSB0aGUgcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0gaW5zdGVhZCBvZiBwdXJlbm93J3MuXG4gKiBcbiAqIFRoaXMgc2VydmljZSBhZGRyZXNzZXMgdGhlIGlzc3VlIHdoZXJlIGBAd29ya3RpZi9ydW50aW1lIGluaXRgIHdhcyB1c2luZ1xuICogcHVyZW5vdyB0ZW1wbGF0ZXMgaW5zdGVhZCBvZiBydW50aW1lLXNwZWNpZmljIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgZXh0ZW5kcyBQdXJlbm93VGVtcGxhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lVGVtcGxhdGVzRGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKSB7XG4gICAgc3VwZXIoY3dkKTtcblxuICAgIC8vIFJlc29sdmUgcnVudGltZSBwYWNrYWdlIHRlbXBsYXRlIGRpcmVjdG9yeVxuICAgIHRoaXMucnVudGltZVRlbXBsYXRlc0RpciA9IHRoaXMucmVzb2x2ZVJ1bnRpbWVUZW1wbGF0ZURpcmVjdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWZmb2xkIGEgbmV3IHByb2plY3QgdXNpbmcgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZXNcbiAgICogXG4gICAqIE92ZXJyaWRlcyB0aGUgcGFyZW50IG1ldGhvZCB0byB1c2UgcnVudGltZSB0ZW1wbGF0ZXMgZnJvbSB0aGVcbiAgICogcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0gaW5zdGVhZCBvZiBwdXJlbm93IHRlbXBsYXRlcy5cbiAgICogXG4gICAqIEltcGxlbWVudHMgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGFuZCBmYWxsYmFjayBzdHJhdGVnaWVzOlxuICAgKiAtIFZhbGlkYXRlcyB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAqIC0gUHJvdmlkZXMgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMgZm9yIHRyb3VibGVzaG9vdGluZ1xuICAgKiAtIEVuc3VyZXMgcnVudGltZS1zcGVjaWZpYyB0ZW1wbGF0ZSByZXNvbHV0aW9uXG4gICAqL1xuICBhc3luYyBzY2FmZm9sZChcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXREaXI6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTY2FmZm9sZE9wdGlvbnMsXG4gICAgY29yZURpcjogc3RyaW5nID0gJ3J1bnRpbWUtd2ViJyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmFsaWRhdGUgcnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlVGVtcGxhdGVTdHJ1Y3R1cmUoY29yZURpcik7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IoXG4gICAgICAgIGBSdW50aW1lIHRlbXBsYXRlIGRpcmVjdG9yeSB2YWxpZGF0aW9uIGZhaWxlZGAsXG4gICAgICAgIHRoaXMucnVudGltZVRlbXBsYXRlc0RpcixcbiAgICAgICAgdmFsaWRhdGlvbi5lcnJvcnMsXG4gICAgICAgIGBFbnN1cmUgdGhlIHJ1bnRpbWUgcGFja2FnZSBpcyBwcm9wZXJseSBpbnN0YWxsZWQgYW5kIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJ1Y3R1cmVgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIGNvcmVEaXIsIHRlbXBsYXRlTmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBzcGVjaWZpYyB0ZW1wbGF0ZSBleGlzdHMgaW4gcnVudGltZSBwYWNrYWdlXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZVRlbXBsYXRlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlVGVtcGxhdGVzKGNvcmVEaXIpO1xuICAgICAgY29uc3QgcmVzb2x1dGlvbkluZm8gPSB0aGlzLmdldFRlbXBsYXRlUmVzb2x1dGlvbkluZm8oKTtcblxuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVUZW1wbGF0ZUVycm9yKFxuICAgICAgICBgUnVudGltZSB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZU5hbWV9JyBub3QgZm91bmRgLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUsXG4gICAgICAgIGNvcmVEaXIsXG4gICAgICAgIFt0ZW1wbGF0ZVBhdGhdLFxuICAgICAgICByZXNvbHV0aW9uSW5mby5wYWNrYWdlQ29udGV4dCB8fCAndW5rbm93bicsXG4gICAgICAgIHJlc29sdXRpb25JbmZvLnJlc29sdXRpb25TdHJhdGVneSxcbiAgICAgICAgYXZhaWxhYmxlVGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGBBdmFpbGFibGUgdGVtcGxhdGVzOiAke2F2YWlsYWJsZVRlbXBsYXRlcy5qb2luKCcsICcpfS4gVHJ5OiBydW50aW1lIGluaXQgPHByb2plY3QtbmFtZT4gLS10ZW1wbGF0ZSAke2F2YWlsYWJsZVRlbXBsYXRlc1swXX1gXG4gICAgICAgICAgOiBgTm8gdGVtcGxhdGVzIGZvdW5kIGluICcke2NvcmVEaXJ9Jy4gVGhlIHJ1bnRpbWUgcGFja2FnZSBtYXkgbm90IGJlIHByb3Blcmx5IGluc3RhbGxlZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRlbXBsYXRlIGRpcmVjdG9yeSBpcyBub3QgZW1wdHlcbiAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gZnMucmVhZGRpclN5bmModGVtcGxhdGVQYXRoKTtcbiAgICBpZiAodGVtcGxhdGVGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdXRpb25JbmZvID0gdGhpcy5nZXRUZW1wbGF0ZVJlc29sdXRpb25JbmZvKCk7XG5cbiAgICAgIHRocm93IG5ldyBSdW50aW1lVGVtcGxhdGVFcnJvcihcbiAgICAgICAgYFJ1bnRpbWUgdGVtcGxhdGUgJyR7dGVtcGxhdGVOYW1lfScgZGlyZWN0b3J5IGlzIGVtcHR5YCxcbiAgICAgICAgdGVtcGxhdGVOYW1lLFxuICAgICAgICBjb3JlRGlyLFxuICAgICAgICBbdGVtcGxhdGVQYXRoXSxcbiAgICAgICAgcmVzb2x1dGlvbkluZm8ucGFja2FnZUNvbnRleHQgfHwgJ3Vua25vd24nLFxuICAgICAgICByZXNvbHV0aW9uSW5mby5yZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgICAgIGBUaGlzIGluZGljYXRlcyBhIGNvcnJ1cHRlZCBvciBpbmNvbXBsZXRlIHRlbXBsYXRlIGluc3RhbGxhdGlvbi4gVHJ5IHJlaW5zdGFsbGluZyB0aGUgcnVudGltZSBwYWNrYWdlLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBwYXJlbnQgY2xhc3MgbG9naWMgYnV0IHdpdGggcnVudGltZSB0ZW1wbGF0ZSBwYXRoXG4gICAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSBvdmVycmlkZSB0aGUgdGVtcGxhdGVzRGlyIGZvciB0aGlzIG9wZXJhdGlvblxuICAgIGNvbnN0IG9yaWdpbmFsVGVtcGxhdGVzRGlyID0gKHRoaXMgYXMgYW55KS50ZW1wbGF0ZXNEaXI7XG4gICAgKHRoaXMgYXMgYW55KS50ZW1wbGF0ZXNEaXIgPSB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXI7XG5cbiAgICB0cnkge1xuICAgICAgLy8gT3ZlcnJpZGUgdGhlIGNvcHlUZW1wbGF0ZUZpbGVzIG1ldGhvZCB0byBpbmNsdWRlIHJ1bnRpbWUtc3BlY2lmaWMgdmFyaWFibGVzXG4gICAgICBjb25zdCBvcmlnaW5hbENvcHlUZW1wbGF0ZUZpbGVzID0gKHRoaXMgYXMgYW55KS5jb3B5VGVtcGxhdGVGaWxlcztcbiAgICAgICh0aGlzIGFzIGFueSkuY29weVRlbXBsYXRlRmlsZXMgPSBhc3luYyAoc291cmNlUGF0aDogc3RyaW5nLCB0YXJnZXRQYXRoOiBzdHJpbmcsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCkgPT4ge1xuICAgICAgICAvLyBBZGQgcnVudGltZS1zcGVjaWZpYyB2YXJpYWJsZXMgdG8gdGhlIGNvbnRleHRcbiAgICAgICAgY29uc3QgcnVudGltZUNvbnRleHQgPSB7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICBwYWNrYWdlVmVyc2lvbjogdGhpcy5nZXRSdW50aW1lUGFja2FnZVZlcnNpb24oKSxcbiAgICAgICAgICBQVVJFTk9XX1ZFUlNJT046IHRoaXMuZ2V0UnVudGltZVBhY2thZ2VWZXJzaW9uKCksXG4gICAgICAgICAgU1RBQ0tfTkFNRTogY29udGV4dC5wcm9qZWN0TmFtZSxcbiAgICAgICAgICBQUk9KRUNUX05BTUU6IGNvbnRleHQucHJvamVjdE5hbWUsXG4gICAgICAgICAgUkVHSU9OOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICBFTkFCTEVfU0VPOiAnZmFsc2UnLFxuICAgICAgICAgIFNUQUdFOiAnZGV2JyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsQ29weVRlbXBsYXRlRmlsZXMuY2FsbCh0aGlzLCBzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBydW50aW1lQ29udGV4dCk7XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBzdXBlci5zY2FmZm9sZCh0ZW1wbGF0ZU5hbWUsIHRhcmdldERpciwgb3B0aW9ucywgY29yZURpcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgdGVtcGxhdGVzRGlyXG4gICAgICAodGhpcyBhcyBhbnkpLnRlbXBsYXRlc0RpciA9IG9yaWdpbmFsVGVtcGxhdGVzRGlyO1xuICAgIH1cbiAgfVxuXG5cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgcnVudGltZSBwYWNrYWdlJ3MgdGVtcGxhdGUgZGlyZWN0b3J5XG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBkZXRlY3RzIHRoZSBydW50aW1lIHBhY2thZ2UgY29udGV4dCBhbmQgZmluZHMgdGhlIGNvcnJlY3RcbiAgICogdGVtcGxhdGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0uXG4gICAqIFxuICAgKiBJbXBsZW1lbnRzIG11bHRpcGxlIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIHJvYnVzdCB0ZW1wbGF0ZSBwYXRoIGRldGVjdGlvbjpcbiAgICogMS4gUGFja2FnZS5qc29uIGRldGVjdGlvbiAobW9zdCByZWxpYWJsZSlcbiAgICogMi4gTW9kdWxlIGxvY2F0aW9uLWJhc2VkIGRldGVjdGlvblxuICAgKiAzLiBOb2RlLmpzIG1vZHVsZSByZXNvbHV0aW9uXG4gICAqIDQuIEVudmlyb25tZW50LWJhc2VkIGRldGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUnVudGltZVRlbXBsYXRlRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0czogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IHN0cmF0ZWd5OiBzdHJpbmc7IHZhbGlkOiBib29sZWFuIH0+ID0gW107XG5cbiAgICAvLyBTdHJhdGVneSAxOiBQYWNrYWdlLmpzb24gZGV0ZWN0aW9uIChtb3N0IHJlbGlhYmxlKVxuICAgIGNvbnN0IHBhY2thZ2VCYXNlZFBhdGggPSB0aGlzLmRldGVjdFJ1bnRpbWVQYWNrYWdlUm9vdCgpO1xuICAgIGlmIChwYWNrYWdlQmFzZWRQYXRoKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZXNQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VCYXNlZFBhdGgsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpO1xuICAgICAgc2VhcmNoUGF0aHMucHVzaCh0ZW1wbGF0ZXNQYXRoKTtcbiAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHBhdGg6IHRlbXBsYXRlc1BhdGgsXG4gICAgICAgIHN0cmF0ZWd5OiAncGFja2FnZS5qc29uIGRldGVjdGlvbicsXG4gICAgICAgIHZhbGlkOiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkodGVtcGxhdGVzUGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IDI6IE1vZHVsZSBsb2NhdGlvbi1iYXNlZCBkZXRlY3Rpb25cbiAgICBjb25zdCBtb2R1bGVCYXNlZFBhdGhzID0gdGhpcy5nZXRNb2R1bGVCYXNlZFBhdGhzKCk7XG4gICAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIG1vZHVsZUJhc2VkUGF0aHMpIHtcbiAgICAgIHNlYXJjaFBhdGhzLnB1c2gobW9kdWxlUGF0aCk7XG4gICAgICBzZWFyY2hSZXN1bHRzLnB1c2goe1xuICAgICAgICBwYXRoOiBtb2R1bGVQYXRoLFxuICAgICAgICBzdHJhdGVneTogJ21vZHVsZSBsb2NhdGlvbicsXG4gICAgICAgIHZhbGlkOiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkobW9kdWxlUGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IDM6IE5vZGUuanMgbW9kdWxlIHJlc29sdXRpb25cbiAgICBjb25zdCBub2RlTW9kdWxlUGF0aHMgPSB0aGlzLmdldE5vZGVNb2R1bGVQYXRocygpO1xuICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZVBhdGggb2Ygbm9kZU1vZHVsZVBhdGhzKSB7XG4gICAgICBzZWFyY2hQYXRocy5wdXNoKG5vZGVNb2R1bGVQYXRoKTtcbiAgICAgIHNlYXJjaFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHBhdGg6IG5vZGVNb2R1bGVQYXRoLFxuICAgICAgICBzdHJhdGVneTogJ25vZGVfbW9kdWxlcyByZXNvbHV0aW9uJyxcbiAgICAgICAgdmFsaWQ6IHRoaXMudmFsaWRhdGVUZW1wbGF0ZURpcmVjdG9yeShub2RlTW9kdWxlUGF0aClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IDQ6IEVudmlyb25tZW50LWJhc2VkIGRldGVjdGlvblxuICAgIGNvbnN0IGVudkJhc2VkUGF0aHMgPSB0aGlzLmdldEVudmlyb25tZW50QmFzZWRQYXRocygpO1xuICAgIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZCYXNlZFBhdGhzKSB7XG4gICAgICBzZWFyY2hQYXRocy5wdXNoKGVudlBhdGgpO1xuICAgICAgc2VhcmNoUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgcGF0aDogZW52UGF0aCxcbiAgICAgICAgc3RyYXRlZ3k6ICdlbnZpcm9ubWVudCBkZXRlY3Rpb24nLFxuICAgICAgICB2YWxpZDogdGhpcy52YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KGVudlBhdGgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBmaXJzdCB2YWxpZCBwYXRoXG4gICAgY29uc3QgdmFsaWRSZXN1bHQgPSBzZWFyY2hSZXN1bHRzLmZpbmQocmVzdWx0ID0+IHJlc3VsdC52YWxpZCk7XG5cbiAgICBpZiAodmFsaWRSZXN1bHQpIHtcbiAgICAgIHJldHVybiB2YWxpZFJlc3VsdC5wYXRoO1xuICAgIH1cblxuICAgIC8vIElmIG5vIHZhbGlkIHBhdGggZm91bmQsIHByb3ZpZGUgZGV0YWlsZWQgZXJyb3IgaW5mb3JtYXRpb25cbiAgICBjb25zdCBzZWFyY2hlZFBhdGhzID0gc2VhcmNoUmVzdWx0cy5tYXAocmVzdWx0ID0+IHJlc3VsdC5wYXRoKTtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHRoaXMuZGV0ZWN0UnVudGltZVBhY2thZ2VSb290KCk7XG5cbiAgICB0aHJvdyBuZXcgUnVudGltZVRlbXBsYXRlRXJyb3IoXG4gICAgICBgUnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IG5vdCBmb3VuZGAsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAncnVudGltZS13ZWInLFxuICAgICAgc2VhcmNoZWRQYXRocyxcbiAgICAgIHBhY2thZ2VSb290IHx8ICd1bmtub3duJyxcbiAgICAgICdjb21wcmVoZW5zaXZlIHNlYXJjaCcsXG4gICAgICBgRW5zdXJlIEB3b3JrdGlmL3J1bnRpbWUgcGFja2FnZSBpcyBwcm9wZXJseSBpbnN0YWxsZWQgd2l0aCB0ZW1wbGF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHJ1bnRpbWUgcGFja2FnZSByb290IGJ5IHNlYXJjaGluZyBmb3IgcGFja2FnZS5qc29uIHdpdGggQHdvcmt0aWYvcnVudGltZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnREaXIgPSBfX2Rpcm5hbWU7XG5cbiAgICAvLyBTZWFyY2ggdXAgdGhlIGRpcmVjdG9yeSB0cmVlIGZvciBwYWNrYWdlLmpzb25cbiAgICB3aGlsZSAoY3VycmVudERpciAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgICBpZiAocGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3b3JrdGlmL3J1bnRpbWUnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gQ29udGludWUgc2VhcmNoaW5nIGlmIEpTT04gcGFyc2UgZmFpbHNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3NzaWJsZSB0ZW1wbGF0ZSBwYXRocyBiYXNlZCBvbiBtb2R1bGUgbG9jYXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0TW9kdWxlQmFzZWRQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIGluc3RhbGxlZCBydW50aW1lIHBhY2thZ2VcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIHNvdXJjZSBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIEFsdGVybmF0aXZlOiByZWxhdGl2ZSB0byB0aGUgcnVudGltZSBwYWNrYWdlIHJvb3RcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdiaW4nLCAndGVtcGxhdGVzJyksXG4gICAgICAvLyBCdW5kbGVkIGxvY2F0aW9uXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3NzaWJsZSB0ZW1wbGF0ZSBwYXRocyBmcm9tIG5vZGVfbW9kdWxlcyByZXNvbHV0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldE5vZGVNb2R1bGVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHJlc29sdmUgQHdvcmt0aWYvcnVudGltZSBwYWNrYWdlXG4gICAgICBjb25zdCBydW50aW1lUGFja2FnZVBhdGggPSByZXF1aXJlLnJlc29sdmUoJ0B3b3JrdGlmL3J1bnRpbWUvcGFja2FnZS5qc29uJyk7XG4gICAgICBjb25zdCBydW50aW1lUm9vdCA9IHBhdGguZGlybmFtZShydW50aW1lUGFja2FnZVBhdGgpO1xuICAgICAgcGF0aHMucHVzaChwYXRoLmpvaW4ocnVudGltZVJvb3QsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKHJ1bnRpbWVSb290LCAnb3V0JywgJ2Rpc3QnLCAnYmluJywgJ3RlbXBsYXRlcycpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUGFja2FnZSBub3QgZm91bmQgaW4gbm9kZV9tb2R1bGVzLCBjb250aW51ZSB3aXRoIG90aGVyIHN0cmF0ZWdpZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3NpYmxlIHRlbXBsYXRlIHBhdGhzIGJhc2VkIG9uIGVudmlyb25tZW50XG4gICAqL1xuICBwcml2YXRlIGdldEVudmlyb25tZW50QmFzZWRQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDaGVjayBpZiBydW5uaW5nIGZyb20gQ0xJIGJpbmFyeVxuICAgIGlmIChwcm9jZXNzLmFyZ3ZbMV0pIHtcbiAgICAgIGNvbnN0IGNsaVBhdGggPSBwYXRoLmRpcm5hbWUocHJvY2Vzcy5hcmd2WzFdKTtcbiAgICAgIHBhdGhzLnB1c2gocGF0aC5qb2luKGNsaVBhdGgsICd0ZW1wbGF0ZXMnKSk7XG4gICAgICBwYXRocy5wdXNoKHBhdGguam9pbihjbGlQYXRoLCAnLi4nLCAndGVtcGxhdGVzJykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgICBwYXRocy5wdXNoKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjJywgJ2JpbicsICd0ZW1wbGF0ZXMnKSk7XG4gICAgcGF0aHMucHVzaChwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcycsICdAd29ya3RpZicsICdydW50aW1lJywgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJykpO1xuXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgYSB0ZW1wbGF0ZSBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRlbXBsYXRlRGlyZWN0b3J5KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGRpcmVjdG9yeVxuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKHRlbXBsYXRlUGF0aCk7XG4gICAgICBpZiAoIXN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJ1bnRpbWUtd2ViIHN1YmRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHJ1bnRpbWVXZWJQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aCwgJ3J1bnRpbWUtd2ViJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocnVudGltZVdlYlBhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgcnVudGltZS13ZWIgY29udGFpbnMgdGVtcGxhdGUgZGlyZWN0b3JpZXNcbiAgICAgIGNvbnN0IHJ1bnRpbWVXZWJTdGF0ID0gZnMuc3RhdFN5bmMocnVudGltZVdlYlBhdGgpO1xuICAgICAgaWYgKCFydW50aW1lV2ViU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHJ1bnRpbWUtd2ViIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVEaXJzID0gZnMucmVhZGRpclN5bmMocnVudGltZVdlYlBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSk7XG5cbiAgICAgIHJldHVybiB0ZW1wbGF0ZURpcnMubGVuZ3RoID4gMDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG5cblxuICAvKipcbiAgICogR2V0IGF2YWlsYWJsZSB0ZW1wbGF0ZXMgaW4gdGhlIHNwZWNpZmllZCBjb3JlIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdmFpbGFibGVUZW1wbGF0ZXMoY29yZURpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb3JlUGF0aCA9IHBhdGguam9pbih0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIGNvcmVEaXIpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvcmVQYXRoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhjb3JlUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS5uYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICogXG4gICAqIFBlcmZvcm1zIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZTpcbiAgICogLSBWZXJpZmllcyBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlXG4gICAqIC0gVmFsaWRhdGVzIHJ1bnRpbWUtd2ViIHN1YmRpcmVjdG9yeSBleGlzdHNcbiAgICogLSBDaGVja3MgdGhhdCB0ZW1wbGF0ZXMgY29udGFpbiByZXF1aXJlZCBmaWxlc1xuICAgKiAtIFZhbGlkYXRlcyB0ZW1wbGF0ZSBzdHJ1Y3R1cmUgaW50ZWdyaXR5XG4gICAqL1xuICB2YWxpZGF0ZVJ1bnRpbWVUZW1wbGF0ZXMoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGVtcGxhdGVEaXJlY3RvcnkodGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGVtcGxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYSBzcGVjaWZpYyBjb3JlIGRpcmVjdG9yeVxuICAgKi9cbiAgdmFsaWRhdGVUZW1wbGF0ZVN0cnVjdHVyZShjb3JlRGlyOiBzdHJpbmcgPSAncnVudGltZS13ZWInKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgbWFpbiB0ZW1wbGF0ZXMgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMucnVudGltZVRlbXBsYXRlc0RpcikpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYFRlbXBsYXRlcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7dGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyfWApO1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBjb3JlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IGNvcmVQYXRoID0gcGF0aC5qb2luKHRoaXMucnVudGltZVRlbXBsYXRlc0RpciwgY29yZURpcik7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29yZVBhdGgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBDb3JlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJHtjb3JlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgY29yZSBkaXJlY3RvcnkgaXMgYWN0dWFsbHkgYSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGNvcmVTdGF0ID0gZnMuc3RhdFN5bmMoY29yZVBhdGgpO1xuICAgICAgaWYgKCFjb3JlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBDb3JlIHBhdGggaXMgbm90IGEgZGlyZWN0b3J5OiAke2NvcmVQYXRofWApO1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgYXZhaWxhYmxlIHRlbXBsYXRlc1xuICAgICAgY29uc3QgdGVtcGxhdGVEaXJzID0gZnMucmVhZGRpclN5bmMoY29yZVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSk7XG5cbiAgICAgIGlmICh0ZW1wbGF0ZURpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBObyB0ZW1wbGF0ZSBkaXJlY3RvcmllcyBmb3VuZCBpbjogJHtjb3JlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZWFjaCB0ZW1wbGF0ZSBkaXJlY3RvcnlcbiAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVEaXIgb2YgdGVtcGxhdGVEaXJzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihjb3JlUGF0aCwgdGVtcGxhdGVEaXIpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gZnMucmVhZGRpclN5bmModGVtcGxhdGVQYXRoKTtcblxuICAgICAgICBpZiAodGVtcGxhdGVGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgVGVtcGxhdGUgZGlyZWN0b3J5IGlzIGVtcHR5OiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCwgZXJyb3JzIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBWYWxpZGF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVzb2x2ZWQgcnVudGltZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIGdldFJ1bnRpbWVUZW1wbGF0ZXNEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcnVudGltZSBwYWNrYWdlIHZlcnNpb24gZm9yIHRlbXBsYXRlIHN1YnN0aXR1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSdW50aW1lUGFja2FnZVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGdldCB2ZXJzaW9uIGZyb20gcnVudGltZSBwYWNrYWdlLmpzb25cbiAgICAgIGNvbnN0IHBhY2thZ2VSb290ID0gdGhpcy5kZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTtcbiAgICAgIGlmIChwYWNrYWdlUm9vdCkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ocGFja2FnZVJvb3QsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgICAgICAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMy4wJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogdHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVQYWNrYWdlUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHdvcmt0aWYvcnVudGltZS9wYWNrYWdlLmpzb24nKTtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhydW50aW1lUGFja2FnZVBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMy4wJztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGaW5hbCBmYWxsYmFja1xuICAgICAgICByZXR1cm4gJzAuMy4wJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAnMC4zLjAnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGVtcGxhdGUgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAqL1xuICBnZXRUZW1wbGF0ZVJlc29sdXRpb25JbmZvKCk6IHtcbiAgICBydW50aW1lVGVtcGxhdGVzRGlyOiBzdHJpbmc7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBhdmFpbGFibGVDb3Jlczogc3RyaW5nW107XG4gICAgcGFja2FnZUNvbnRleHQ6IHN0cmluZyB8IG51bGw7XG4gICAgcmVzb2x1dGlvblN0cmF0ZWd5OiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gdGhpcy5kZXRlY3RSdW50aW1lUGFja2FnZVJvb3QoKTtcblxuICAgIC8vIERldGVybWluZSB3aGljaCByZXNvbHV0aW9uIHN0cmF0ZWd5IHdhcyB1c2VkXG4gICAgbGV0IHJlc29sdXRpb25TdHJhdGVneSA9ICd1bmtub3duJztcbiAgICBpZiAocGFja2FnZVJvb3QgJiYgdGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLmluY2x1ZGVzKHBhY2thZ2VSb290KSkge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ3BhY2thZ2UuanNvbiBkZXRlY3Rpb24nO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ydW50aW1lVGVtcGxhdGVzRGlyLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSkge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ25vZGVfbW9kdWxlcyByZXNvbHV0aW9uJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucnVudGltZVRlbXBsYXRlc0Rpci5pbmNsdWRlcyhfX2Rpcm5hbWUpKSB7XG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3kgPSAnbW9kdWxlIGxvY2F0aW9uJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x1dGlvblN0cmF0ZWd5ID0gJ2Vudmlyb25tZW50IGRldGVjdGlvbic7XG4gICAgfVxuXG4gICAgLy8gR2V0IGF2YWlsYWJsZSBjb3JlIGRpcmVjdG9yaWVzXG4gICAgY29uc3QgYXZhaWxhYmxlQ29yZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMucnVudGltZVRlbXBsYXRlc0RpcikpIHtcbiAgICAgICAgYXZhaWxhYmxlQ29yZXMucHVzaCguLi5mcy5yZWFkZGlyU3luYyh0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAubWFwKGVudHJ5ID0+IGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgd2hlbiByZWFkaW5nIGRpcmVjdG9yeVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBydW50aW1lVGVtcGxhdGVzRGlyOiB0aGlzLnJ1bnRpbWVUZW1wbGF0ZXNEaXIsXG4gICAgICBpc1ZhbGlkOiB0aGlzLnZhbGlkYXRlUnVudGltZVRlbXBsYXRlcygpLFxuICAgICAgYXZhaWxhYmxlQ29yZXMsXG4gICAgICBwYWNrYWdlQ29udGV4dDogcGFja2FnZVJvb3QsXG4gICAgICByZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgfTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgYXMgVGVtcGxhdGVTZXJ2aWNlIGZvciBjb21wYXRpYmlsaXR5XG5leHBvcnQgeyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIGFzIFRlbXBsYXRlU2VydmljZSB9O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgUnVudGltZSBDTEkgZXJyb3JzXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDbGlFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nXG4gKiBFeHRlbmRzIHB1cmVub3cgQ29uZmlnRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNvbmZpZ0Vycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfQ09ORklHX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGJ1aWxkIG9wZXJhdGlvbnMgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IEJ1aWxkRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUJ1aWxkRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9CVUlMRF9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQnVpbGRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGRlcGxveW1lbnQgb3BlcmF0aW9ucyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgRGVwbG95bWVudEVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9ERVBMT1lNRU5UX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgdG8gbWF0Y2ggcHVyZW5vdyBwYXR0ZXJuc1xuICovXG5leHBvcnQgY2xhc3MgRGVwbG95bWVudEVycm9yIGV4dGVuZHMgUnVudGltZURlcGxveW1lbnRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgaGludD86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB2YWxpZGF0aW9uIGNoZWNrcyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgVmFsaWRhdGlvbkVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9WQUxJREFUSU9OX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB0ZW1wbGF0ZSByZXNvbHV0aW9uIGZhaWxzXG4gKiBQcm92aWRlcyBkZXRhaWxlZCBjb250ZXh0IGFib3V0IHBhY2thZ2UgcmVzb2x1dGlvbiBhbmQgc2VhcmNoZWQgcGF0aHNcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVUZW1wbGF0ZUVycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZU5hbWU/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvcmVEaXI/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNlYXJjaGVkUGF0aHM/OiBzdHJpbmdbXSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFja2FnZUNvbnRleHQ/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc29sdXRpb25TdHJhdGVneT86IHN0cmluZyxcbiAgICBoaW50Pzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9URU1QTEFURV9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lVGVtcGxhdGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIHRlbXBsYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgaW52YWxpZFxuICogUHJvdmlkZXMgZGV0YWlsZWQgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHRyb3VibGVzaG9vdGluZyBndWlkYW5jZVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlRGlyPzogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWxpZGF0aW9uRXJyb3JzPzogc3RyaW5nW10sXG4gICAgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfVEVNUExBVEVfU1RSVUNUVVJFX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEZyaWVuZGx5IGVycm9yIGZvcm1hdHRlciBmb3IgcnVudGltZSB3b3Jrc3BhY2VcbiAqIEZvbGxvd3MgcHVyZW5vdyBGcmllbmRseUVycm9yRm9ybWF0dGVyIHBhdHRlcm4gd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIge1xuICAvKipcbiAgICogRm9ybWF0IGVycm9yIGFzIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugd2l0aG91dCBlbW9qaVxuICAgKi9cbiAgZm9ybWF0RXJyb3IoZXJyb3I6IEVycm9yLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSGVhZGVyIHdpdGhvdXQgZW1vamlcbiAgICBsaW5lcy5wdXNoKGBFcnJvcjogJHtlcnJvci5uYW1lIHx8ICdSdW50aW1lRXJyb3InfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gRXJyb3IgbWVzc2FnZVxuICAgIGxpbmVzLnB1c2goYE1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIEhpbnQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZUNsaUVycm9yICYmIGVycm9yLmhpbnQpIHtcbiAgICAgIGxpbmVzLnB1c2goYEhpbnQ6ICR7ZXJyb3IuaGludH1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIFN0YWNrIHRyYWNlIGluIHZlcmJvc2UgbW9kZVxuICAgIGlmICh2ZXJib3NlICYmIGVycm9yLnN0YWNrKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gU3RhY2sgVHJhY2UgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGVycm9yLnN0YWNrKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdmFsaWRhdGlvbiBlcnJvciB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXRWYWxpZGF0aW9uRXJyb3IoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ1ZhbGlkYXRpb24gRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBGaWVsZDogJHtmaWVsZE5hbWV9YCk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7bWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBGaWVsZCB2YWxpZGF0aW9uIGZhaWxlZCBmb3I6ICR7ZmllbGROYW1lfWApO1xuICAgICAgbGluZXMucHVzaChgVmFsaWRhdGlvbiBtZXNzYWdlOiAke21lc3NhZ2V9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGRlcGxveW1lbnQgZXJyb3Igd2l0aG91dCBlbW9qaVxuICAgKi9cbiAgZm9ybWF0RGVwbG95bWVudEVycm9yKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCdEZXBsb3ltZW50IEVycm9yJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgU3RhY2s6ICR7c3RhY2tOYW1lfWApO1xuICAgIGxpbmVzLnB1c2goYE9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7bWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGxpbmVzLnB1c2goJ1Ryb3VibGVzaG9vdGluZzonKTtcbiAgICBsaW5lcy5wdXNoKCcxLiBDaGVjayBBV1MgY3JlZGVudGlhbHMgYW5kIHBlcm1pc3Npb25zJyk7XG4gICAgbGluZXMucHVzaCgnMi4gVmVyaWZ5IHN0YWNrIGNvbmZpZ3VyYXRpb24nKTtcbiAgICBsaW5lcy5wdXNoKCczLiBSZXZpZXcgQ2xvdWRGb3JtYXRpb24gZXZlbnRzIGluIEFXUyBDb25zb2xlJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbGluZXMucHVzaCgnLS0tIFRlY2huaWNhbCBEZXRhaWxzICgtLXZlcmJvc2UpIC0tLScpO1xuICAgICAgbGluZXMucHVzaChgU3RhY2sgbmFtZTogJHtzdGFja05hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKGBGYWlsZWQgb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICAgIGxpbmVzLnB1c2goYEVycm9yIGRldGFpbHM6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgcnVudGltZSB0ZW1wbGF0ZSBlcnJvciB3aXRoIGRldGFpbGVkIGNvbnRleHRcbiAgICovXG4gIGZvcm1hdFRlbXBsYXRlRXJyb3IoZXJyb3I6IFJ1bnRpbWVUZW1wbGF0ZUVycm9yLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnUnVudGltZSBUZW1wbGF0ZSBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYElzc3VlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBUZW1wbGF0ZSBjb250ZXh0XG4gICAgaWYgKGVycm9yLnRlbXBsYXRlTmFtZSkge1xuICAgICAgbGluZXMucHVzaChgVGVtcGxhdGU6ICR7ZXJyb3IudGVtcGxhdGVOYW1lfWApO1xuICAgIH1cbiAgICBpZiAoZXJyb3IuY29yZURpcikge1xuICAgICAgbGluZXMucHVzaChgQ29yZSBEaXJlY3Rvcnk6ICR7ZXJyb3IuY29yZURpcn1gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLnBhY2thZ2VDb250ZXh0KSB7XG4gICAgICBsaW5lcy5wdXNoKGBQYWNrYWdlIENvbnRleHQ6ICR7ZXJyb3IucGFja2FnZUNvbnRleHR9YCk7XG4gICAgfVxuICAgIGlmIChlcnJvci5yZXNvbHV0aW9uU3RyYXRlZ3kpIHtcbiAgICAgIGxpbmVzLnB1c2goYFJlc29sdXRpb24gU3RyYXRlZ3k6ICR7ZXJyb3IucmVzb2x1dGlvblN0cmF0ZWd5fWApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIFNlYXJjaGVkIHBhdGhzXG4gICAgaWYgKGVycm9yLnNlYXJjaGVkUGF0aHMgJiYgZXJyb3Iuc2VhcmNoZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdTZWFyY2hlZCBQYXRoczonKTtcbiAgICAgIGVycm9yLnNlYXJjaGVkUGF0aHMuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgbGluZXMucHVzaChgICAtICR7cGF0aH1gKTtcbiAgICAgIH0pO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVHJvdWJsZXNob290aW5nIGd1aWRhbmNlXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIEVuc3VyZSBAd29ya3RpZi9ydW50aW1lIHBhY2thZ2UgaXMgcHJvcGVybHkgaW5zdGFsbGVkJyk7XG4gICAgbGluZXMucHVzaCgnMi4gVmVyaWZ5IHRoZSBwYWNrYWdlIGNvbnRhaW5zIHNyYy9iaW4vdGVtcGxhdGVzL3J1bnRpbWUtd2ViLyBkaXJlY3RvcnknKTtcbiAgICBsaW5lcy5wdXNoKCczLiBDaGVjayB0aGF0IHJ1bnRpbWUtd2ViIGRpcmVjdG9yeSBjb250YWlucyB0ZW1wbGF0ZSBzdWJkaXJlY3RvcmllcycpO1xuICAgIGxpbmVzLnB1c2goJzQuIElmIHJ1bm5pbmcgZnJvbSBzb3VyY2UsIGVuc3VyZSB5b3VcXCdyZSBpbiB0aGUgcnVudGltZSBwYWNrYWdlIGRpcmVjdG9yeScpO1xuICAgIGxpbmVzLnB1c2goJzUuIFRyeSByZWluc3RhbGxpbmcgdGhlIHJ1bnRpbWUgcGFja2FnZTogbnBtIGluc3RhbGwgQHdvcmt0aWYvcnVudGltZScpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEVycm9yIGNvZGU6ICR7ZXJyb3IuY29kZX1gKTtcbiAgICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICBsaW5lcy5wdXNoKCdTdGFjayB0cmFjZTonKTtcbiAgICAgICAgbGluZXMucHVzaChlcnJvci5zdGFjayk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJ1bnRpbWUgdGVtcGxhdGUgc3RydWN0dXJlIGVycm9yIHdpdGggdmFsaWRhdGlvbiBkZXRhaWxzXG4gICAqL1xuICBmb3JtYXRUZW1wbGF0ZVN0cnVjdHVyZUVycm9yKGVycm9yOiBSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciwgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ1J1bnRpbWUgVGVtcGxhdGUgU3RydWN0dXJlIEVycm9yJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgSXNzdWU6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmIChlcnJvci50ZW1wbGF0ZURpcikge1xuICAgICAgbGluZXMucHVzaChgVGVtcGxhdGUgRGlyZWN0b3J5OiAke2Vycm9yLnRlbXBsYXRlRGlyfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGlvbiBlcnJvcnNcbiAgICBpZiAoZXJyb3IudmFsaWRhdGlvbkVycm9ycyAmJiBlcnJvci52YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJ1ZhbGlkYXRpb24gRXJyb3JzOicpO1xuICAgICAgZXJyb3IudmFsaWRhdGlvbkVycm9ycy5mb3JFYWNoKHZhbGlkYXRpb25FcnJvciA9PiB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgLSAke3ZhbGlkYXRpb25FcnJvcn1gKTtcbiAgICAgIH0pO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVHJvdWJsZXNob290aW5nIGd1aWRhbmNlXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIFZlcmlmeSB0aGUgcnVudGltZSBwYWNrYWdlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZScpO1xuICAgIGxpbmVzLnB1c2goJzIuIENoZWNrIHRoYXQgc3JjL2Jpbi90ZW1wbGF0ZXMvcnVudGltZS13ZWIvIGV4aXN0cyBpbiB0aGUgcGFja2FnZScpO1xuICAgIGxpbmVzLnB1c2goJzMuIEVuc3VyZSB0ZW1wbGF0ZSBkaXJlY3RvcmllcyBjb250YWluIHRoZSByZXF1aXJlZCBmaWxlcycpO1xuICAgIGxpbmVzLnB1c2goJzQuIFRyeSByZWluc3RhbGxpbmc6IG5wbSBpbnN0YWxsIEB3b3JrdGlmL3J1bnRpbWUnKTtcbiAgICBsaW5lcy5wdXNoKCc1LiBJZiBkZXZlbG9waW5nIGxvY2FsbHksIGVuc3VyZSB0ZW1wbGF0ZXMgYXJlIGJ1aWx0IGNvcnJlY3RseScpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEVycm9yIGNvZGU6ICR7ZXJyb3IuY29kZX1gKTtcbiAgICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICBsaW5lcy5wdXNoKCdTdGFjayB0cmFjZTonKTtcbiAgICAgICAgbGluZXMucHVzaChlcnJvci5zdGFjayk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmVkIGxvZ2dlciBmb3IgcnVudGltZSB3b3Jrc3BhY2VcbiAqIEZvbGxvd3MgcHVyZW5vdyBsb2dnaW5nIHBhdHRlcm5zIHdpdGhvdXQgZW1vamlcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGNvbnN0IGxvZ0VudHJ5ID0ge1xuICAgICAgbGV2ZWw6ICd3YXJuJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLndhcm4oSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmICghdGhpcy52ZXJib3NlKSByZXR1cm47XG5cbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnNvbGUuZGVidWcoSlNPTi5zdHJpbmdpZnkobG9nRW50cnksIG51bGwsIDIpKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgUHVyZW5vd0luZnJhUmVzb3VyY2VPcHRpb25zLCBQdXJlbm93SW5mcmFSZXNvdXJjZXMgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2luZnJhJztcbmltcG9ydCB7IHNhbml0aXplU3RhY2tOYW1lIH0gZnJvbSAnQHV0aWxzL3N0YWNrLW5hbWUtc2FuaXRpemVyJztcbmltcG9ydCB7XG4gIERlcGxveW1lbnRFcnJvcixcbiAgdHlwZSBEZXBsb3ltZW50T3V0cHV0cyxcbiAgZ2V0U3RhZ2UsXG4gIFN0YWNrc0RlcGxveU9wdGlvbnMsIFN0YWNrc0RlcGxveVJlc3VsdCxcbiAgU3RhY2tzRGVwbG95U2VydmljZSxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cywgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHlwZXMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgZXh0ZW5kcyBTdGFja3NEZXBsb3lTZXJ2aWNlIGltcGxlbWVudHMgUHVyZW5vd0luZnJhUmVzb3VyY2VzIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERFRkFVTFRfQ0RLX0RJUiA9ICdjZGsnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFR3b1N0YWNrRGVwbG95U2VydmljZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGN3ZCAtIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHByb2plY3Qgcm9vdClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICBzdXBlcihjd2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGZpcnN0IGRlcGxveW1lbnQgd29ya2Zsb3c6IGRlcGxveSBJbmZyYSBcdTIxOTIgcmVhZCBvdXRwdXRzIFx1MjE5MiBkZXBsb3kgUnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICogQHBhcmFtIHN0YXJ0VGltZSAtIERlcGxveW1lbnQgc3RhcnQgdGltZXN0YW1wXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBkZXBsb3ltZW50IHJlc3VsdFxuICAgKiBAdGhyb3dzIHtEZXBsb3ltZW50RXJyb3J9IElmIEluZnJhIG9yIFJ1bnRpbWUgZGVwbG95bWVudCBmYWlsc1xuICAgKlxuICAgKiBAdG9kbzogY29tcGxldGUgZXh0ZW5zaWJsZSBkZXBsb3ltZW50IGFwcHJvYWNoIHdpdGggZHVyYXRpb24gbWV0cmljIGF0dGVuZGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlRGVwbG95PFQgZXh0ZW5kcyBTdGFja3NEZXBsb3lSZXN1bHQgPSBTdGFja3NEZXBsb3lSZXN1bHQ+KFxuICAgIG9wdGlvbnM6IFN0YWNrc0RlcGxveU9wdGlvbnMsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgc3RhZ2UsIGNvbmZpZyB9ID0gb3B0aW9ucztcblxuICAgIC8vIFNhbml0aXplIHN0YWNrIG5hbWVzIGZvciBBV1MgQ2xvdWRGb3JtYXRpb24gY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IGluZnJhU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVB1cmVub3dJbmZyYS0ke3N0YWdlfWApO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFja05hbWUgPSBzYW5pdGl6ZVN0YWNrTmFtZShgJHtvcHRpb25zLmNvbmZpZy5wcm9qZWN0TmFtZX0tUHVyZW5vd1J1bnRpbWUtJHtzdGFnZX1gKTtcbiAgICBjb25zdCBydW50aW1lV2ViU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVJ1bnRpbWVXZWItJHtzdGFnZX1gKTtcblxuICAgIGNvbnN0IHN0YWdlQ29uZmlnID0gZ2V0U3RhZ2UoY29uZmlnLCBzdGFnZSk7XG4gICAgaWYgKCFzdGFnZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgYFN0YWdlICcke3N0YWdlfScgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICBgQXZhaWxhYmxlIHN0YWdlczogJHtjb25maWcuc3RhZ2VzLm1hcCgoczogYW55KSA9PiBzLm5hbWUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY29uc3QgY2xvdWRGb3JtYXRpb25DbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoe1xuICAgIC8vICAgcmVnaW9uOiBzdGFnZUNvbmZpZy5hd3NSZWdpb24sXG4gICAgLy8gfSk7XG5cbiAgICAvLyBTdGVwIDE6IERlcGxveSBJbmZyYSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgSW5mcmFzdHJ1Y3R1cmUgc3RhY2suLi4nKTtcbiAgICBjb25zdCBpbmZyYVJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBpbmZyYVN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIWluZnJhUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdSdW50aW1lIHN0YWNrIHdpbGwgbm90IGJlIGRlcGxveWVkLiBGaXggSW5mcmEgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDI6IFJlYWQgSW5mcmEgb3V0cHV0c1xuICAgIC8vIGNvbnNvbGUubG9nKCdSZWFkaW5nIEluZnJhc3RydWN0dXJlIG91dHB1dHMuLi4nKTtcbiAgICAvLyBjb25zdCBpbmZyYU91dHB1dHMgPSBhd2FpdCB0aGlzLmdldEluZnJhT3V0cHV0cyhjbG91ZEZvcm1hdGlvbkNsaWVudCwgc3RhZ2UsIGNvbmZpZywgaW5mcmFTdGFja05hbWUsIHN0YWdlQ29uZmlnPy5hd3NQcm9maWxlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhgUmV0cmlldmVkICR7T2JqZWN0LmtleXMoaW5mcmFPdXRwdXRzKS5sZW5ndGh9IG91dHB1dHMgZnJvbSBJbmZyYXN0cnVjdHVyZSBzdGFja2ApO1xuXG4gICAgLy8gU3RlcCAzOiBEZXBsb3kgUnVudGltZSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgUHVyZW5vd1J1bnRpbWUgc3RhY2suLi4nKTtcbiAgICBjb25zdCBydW50aW1lUmVzdWx0ID0gYXdhaXQgdGhpcy5kZXBsb3lDZGtTdGFjayhcbiAgICAgIHJ1bnRpbWVTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFydW50aW1lUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdSdW50aW1lIGRlcGxveW1lbnQgZmFpbGVkJyxcbiAgICAgICAgJ0luZnJhc3RydWN0dXJlIGlzIGRlcGxveWVkIHN1Y2Nlc3NmdWxseS4gRml4IFJ1bnRpbWUgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDM6IERlcGxveSBSdW50aW1lIHN0YWNrXG4gICAgY29uc29sZS5sb2coJ0RlcGxveWluZyBSdW50aW1lV2ViIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgcnVudGltZVdlYlJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBydW50aW1lV2ViU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghcnVudGltZVdlYlJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnUnVudGltZVdlYiBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBpcyBkZXBsb3llZCBzdWNjZXNzZnVsbHkuIEZpeCBSdW50aW1lIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBpbmZyYVN0YWNrOiBpbmZyYVJlc3VsdCxcbiAgICAgIHJ1bnRpbWVTdGFjazogcnVudGltZVJlc3VsdCxcbiAgICAgIHJ1bnRpbWVXZWJTdGFjazogcnVudGltZVdlYlJlc3VsdCxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0gYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBkZXBsb3ltZW50IG91dHB1dHMgZnJvbSBDREsgb3V0cHV0cyBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIC0gTmFtZSBvZiB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAgICogQHJldHVybnMgRGVwbG95bWVudCBvdXRwdXRzIG1hcFxuICAgKlxuICAgKiBAaW1wb3J0YW50OiBPUFRJTUlTRSBUSElTIFNPTFVUSU9OXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSBvdXRwdXRzUGF0aFxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlU3RhY2tPdXRwdXRzKHN0YWNrTmFtZTogc3RyaW5nLCBvdXRwdXRzUGF0aDogc3RyaW5nKTogRGVwbG95bWVudE91dHB1dHMge1xuICAgIGNvbnN0IG91dHB1dHM6IFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMgPSBzdXBlci5wYXJzZVN0YWNrT3V0cHV0cyhzdGFja05hbWUsIG91dHB1dHNQYXRoKSBhcyBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgICAgcmV0dXJuIG91dHB1dHM7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dHNGaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBjZGtPdXRwdXRzID0gSlNPTi5wYXJzZShvdXRwdXRzRmlsZUNvbnRlbnQpO1xuXG4gICAgICAvLyBDREsgb3V0cHV0cyBmaWxlIHN0cnVjdHVyZTogeyBcIlN0YWNrTmFtZVwiOiB7IFwiT3V0cHV0S2V5XCI6IFwiT3V0cHV0VmFsdWVcIiB9IH1cbiAgICAgIGNvbnN0IHN0YWNrT3V0cHV0cyA9IGNka091dHB1dHNbc3RhY2tOYW1lXTtcbiAgICAgIGlmIChzdGFja091dHB1dHMpIHtcbiAgICAgICAgb3V0cHV0cy5sYW1iZGFBcm5MaXN0ID0gT2JqZWN0LmtleXMoc3RhY2tPdXRwdXRzKVxuICAgICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiBrZXkubWF0Y2goLyg/OkxhbWJkYSlbYS16QS1aXStBcm4kLykpXG4gICAgICAgICAgLm1hcCgobGFtYmRhTWF0Y2g6IGFueSkgPT4gc3RhY2tPdXRwdXRzW2xhbWJkYU1hdGNoXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIG91dHB1dHMgZmlsZSBmb3IgJHtzdGFja05hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0cztcbiAgfVxuXG5cbiAgLy8gQG5vdGU6IGR1cGxpY2F0ZXNcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHNpZ25hdHVyZSBmb3IgdGhlIHByb3ZpZGVkIHJlZ2lvbiBieSBleHRyYWN0aW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBzZWdtZW50IGluIHRoZSByZWdpb24gc3RyaW5nLCBkZWxpbWl0ZWQgYnkgaHlwaGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lvbiAtIFRoZSByZWdpb24gc3RyaW5nIHRvIGdlbmVyYXRlIHRoZSBzaWduYXR1cmUgZnJvbS4gSXQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBoeXBoZW4tc2VwYXJhdGVkIHN0cmluZy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHJlZ2lvbiBzaWduYXR1cmUsIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCB2YWxpZCBzZWdtZW50LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCBvciBlbXB0eS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZWdpb25TaWduYXR1cmUocmVnaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcmVnaW9uKSByZXR1cm4gJyc7XG5cbiAgICByZXR1cm4gcmVnaW9uXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcChwYXJ0ID0+IHBhcnRbMF0gPz8gJycpXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVzb3VyY2UgbmFtZSBieSBjb25jYXRlbmF0aW5nIHNlcnZpY2UgbmFtZSwgcmVzb3VyY2UgbmFtZSxcbiAgICogc2ltcGxpZmllZCByZWdpb24sIGFuZCBzdGFnZSB3aXRoIGh5cGhlbnMgYXMgc2VwYXJhdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2VydmljZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlZ2lvblNpbXBsaWZpZWQgLSBUaGUgc2ltcGxpZmllZCByZWdpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zdGFnZSAtIFRoZSBkZXBsb3ltZW50IHN0YWdlIG9mIHRoZSByZXNvdXJjZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbmNhdGVuYXRlZCByZXNvdXJjZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlc291cmNlTmFtZSh7IG5hbWUsIHNlcnZpY2VOYW1lLCBzdGFnZSwgcmVnaW9uIH06IFB1cmVub3dJbmZyYVJlc291cmNlT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnaW9uU2ltcGxpZmllZCA9IHNhbml0aXplU3RhY2tOYW1lKHRoaXMuZ2V0UmVnaW9uU2lnbmF0dXJlKHJlZ2lvbiB8fCAndXMtZWFzdC0xJykpO1xuICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0tJHtuYW1lfS0ke3JlZ2lvblNpbXBsaWZpZWR9LSR7c3RhZ2V9YDtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBTYW5pdGl6ZXMgYSBzdGFjayBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBBV1MgQ2xvdWRGb3JtYXRpb24gbmFtaW5nIHJlcXVpcmVtZW50cy5cbiAqIFxuICogQ2xvdWRGb3JtYXRpb24gc3RhY2sgbmFtZXMgbXVzdDpcbiAqIC0gQmUgMS0xMjggY2hhcmFjdGVycyBsb25nXG4gKiAtIENvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVuc1xuICogLSBTdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyXG4gKiAtIE5vdCBlbmQgd2l0aCBhIGh5cGhlblxuICogXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBzdGFjayBuYW1lIHRvIHNhbml0aXplXG4gKiBAcmV0dXJucyBUaGUgc2FuaXRpemVkIHN0YWNrIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplU3RhY2tOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBSZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycyB3aXRoIGh5cGhlbnNcbiAgICBsZXQgc2FuaXRpemVkID0gbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOS1dL2csICctJyk7XG5cbiAgICAvLyBFbnN1cmUgaXQgc3RhcnRzIHdpdGggYSBsZXR0ZXJcbiAgICBpZiAoIS9eW2EtekEtWl0vLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgICAgICBzYW5pdGl6ZWQgPSAnc3RhY2stJyArIHNhbml0aXplZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5yZXBsYWNlKC8tKy9nLCAnLScpO1xuXG4gICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGh5cGhlbnNcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZSgvLSskLywgJycpO1xuXG4gICAgLy8gRW5zdXJlIGl0J3Mgbm90IHRvbyBsb25nIChDbG91ZEZvcm1hdGlvbiBsaW1pdCBpcyAxMjggY2hhcmFjdGVycylcbiAgICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IDEyOCkge1xuICAgICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDAsIDEyOCkucmVwbGFjZSgvLSskLywgJycpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBpdCdzIG5vdCBlbXB0eSBhZnRlciBzYW5pdGl6YXRpb25cbiAgICBpZiAoIXNhbml0aXplZCkge1xuICAgICAgICBzYW5pdGl6ZWQgPSAnc3RhY2snO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG59IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGVwbG95bWVudFN0cmF0ZWd5LCBQdXJlbm93Q2xpQ29udGV4dCB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJy4vcHVyZW5vdy1ydW50aW1lLXN0YWNrcy1kZXBsb3kuc2VydmljZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcnVudGltZSBjb250ZXh0IGZvciB0aGUgUHVyZW5vdyBDTEksIGV4dGVuZGluZyB0aGUgYmFzZSBQdXJlbm93IENMSSBjb250ZXh0XG4gKiB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQgJiB7XG4gIHN0YWNrc0RlcGxveVNlcnZpY2U6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZTtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGRlcGxveW1lbnQgc3RyYXRlZ3kgdGhhdCBpbXBsZW1lbnRzIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAqXG4gKiBUaGlzIHN0cmF0ZWd5IGV4dGVuZHMgcHVyZW5vdydzIHR3by1zdGFjayBkZXBsb3ltZW50IHRvIHN1cHBvcnQgdGhyZWUgc3RhY2tzOlxuICogMS4gSW5mcmFzdHJ1Y3R1cmUgU3RhY2sgKGV4aXN0aW5nKVxuICogMi4gUnVudGltZSBTdGFjayAoZXhpc3RpbmcpXG4gKiAzLiBBZGRpdGlvbmFsIFJ1bnRpbWUgU3RhY2sgKG5ldylcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3kgaW1wbGVtZW50cyBEZXBsb3ltZW50U3RyYXRlZ3kge1xuICByZWFkb25seSByb2xlID0gJ2RlcGxveW1lbnQnO1xuICByZWFkb25seSBuYW1lID0gJ3J1bnRpbWUtcHVyZW5vdy1ydW50aW1lLXN0YWNrcyc7XG5cbiAgLyoqXG4gICAqIFByZS1kZXBsb3ltZW50IHZhbGlkYXRpb24gZm9yIHJ1bnRpbWUtc3BlY2lmaWMgcmVxdWlyZW1lbnRzXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZURlcGxveW1lbnQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQ+KGNvbnRleHQ6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIChyZXF1aXJlZCBmb3IgZGVwbG95bWVudClcbiAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLmlzVmFsaWQoKTtcblxuXG5cbiAgICAgIC8vIFZhbGlkYXRlIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgICAgLy8gY29uc3QgcnVudGltZUNvbmZpZyA9IGNvbnRleHQuY29uZmlnLjtcbiAgICAgIC8vIGlmIChydW50aW1lQ29uZmlnPy5lbmFibGVUaGlyZFN0YWNrICYmICFydW50aW1lQ29uZmlnLnJ1bnRpbWVXZWJNb2RlKSB7XG4gICAgICAvLyAgIGNvbnRleHQubG9nZ2VyLmVycm9yKCdSdW50aW1lLXdlYiBtb2RlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gUnVudGltZSBDb3JlIHN0YWNrIGlzIGVuYWJsZWQnKTtcbiAgICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gfVxuXG4gICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCdSdW50aW1lIGRlcGxveW1lbnQgdmFsaWRhdGlvbiBwYXNzZWQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihgUnVudGltZSBkZXBsb3ltZW50IHZhbGlkYXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50IGluc3RlYWQgb2YgdHdvIHN0YWNrc1xuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZURlcGxveW1lbnQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQ+KFxuICAgIGNvbnRleHQ6IFQsXG4gICAgY29uZmlnOiB1bmtub3duLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXBsb3lDb25maWcgPSBjb25maWcgYXMge1xuICAgICAgc3RhY2tzRGVwbG95U2VydmljZTogYW55O1xuICAgICAgb3B0aW9uczogYW55O1xuICAgICAgbG9nZ2VyOiBhbnk7XG4gICAgICBjd2Q6IHN0cmluZztcbiAgICAgIGVudlZhbGlkYXRvcjogYW55O1xuICAgIH07XG5cbiAgICBjb25zdCB7IGxvZ2dlciwgb3B0aW9ucyB9ID0gZGVwbG95Q29uZmlnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGxvZ2dlci5pbmZvKCdTdGFydGluZyBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50Li4uJyk7XG5cbiAgICAgIC8vIFVzZSB0aGUgcnVudGltZSBzdGFja3MgZGVwbG95IHNlcnZpY2UgZm9yIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJ1bnRpbWVTdGFja3NTZXJ2aWNlID0gY29udGV4dC5zdGFja3NEZXBsb3lTZXJ2aWNlIGFzIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZTtcblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVudGltZVN0YWNrc1NlcnZpY2UuZGVwbG95KHtcbiAgICAgICAgc3RhZ2U6IG9wdGlvbnMuc3RhZ2UsXG4gICAgICAgIGNvbmZpZzogY29udGV4dC5jb25maWcsXG4gICAgICAgIHNraXBCdWlsZDogb3B0aW9ucy5za2lwQnVpbGQgfHwgZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWUgVGFyZ2V0IHN0YWNrcyBkZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnUnVudGltZSBUYXJnZXQgc3RhY2sgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnSW5mcmFzdHJ1Y3R1cmUgc3RhY2sgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QtZGVwbG95bWVudCBhY3Rpb25zIGZvciBydW50aW1lLXNwZWNpZmljIHRhc2tzXG4gICAqL1xuICBhc3luYyBwb3N0RGVwbG95bWVudChyZXN1bHQ6IHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiB1bmtub3duIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAbm90ZTogcG9zdC1kZXBsb3ltZW50IGlzIG5vdCByZXF1aXJlZCBmb3IgUHVyZW5vdyBSdW50aW1lXG4gICAgLy8gaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnUnVudGltZSBkZXBsb3ltZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdBbGwgdGhyZWUgc3RhY2tzIGRlcGxveWVkIGFuZCBjb25maWd1cmVkJyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUgZGVwbG95bWVudCBmYWlsZWQnKTtcbiAgICAvLyAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgcmVzdWx0LmVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQuZXJyb3IubWVzc2FnZSA6IFN0cmluZyhyZXN1bHQuZXJyb3IpKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gIH1cbn1cblxuLy8gLyoqXG4vLyAgKiBUaGUgYFB1cmVub3dSdW50aW1lQ2xpYCBjbGFzcyBleHRlbmRzIHRoZSBgUHVyZW5vd0NsaWAgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5XG4vLyAgKiBzcGVjaWZpYyB0byB0aGUgUHVyZW5vdyBydW50aW1lLCBpbmNsdWRpbmcgdGhlIGNyZWF0aW9uIG9mIGEgY29udGV4dCB3aXRoIGFkZGl0aW9uYWwgc2VydmljZXMuXG4vLyAgKi9cbi8vIGV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZUNsaSBleHRlbmRzIFB1cmVub3dDbGkge1xuLy8gICBjb25zdHJ1Y3RvcihzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpIHtcbi8vICAgICBzdXBlcihzdHJhdGVnaWVzKTtcbi8vICAgfVxuLy9cbi8vICAgLyoqXG4vLyAgICAqIENyZWF0ZSBQdXJlbm93LXNwZWNpZmljIGNvbnRleHQgd2l0aCBhbGwgcmVxdWlyZWQgc2VydmljZXNcbi8vICAgICovXG4vLyAgIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDb250ZXh0PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dSdW50aW1lQ2xpQ29udGV4dD4oZ2xvYmFsT3B0czogR2xvYmFsT3B0aW9ucywgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogUHJvbWlzZTxUPiB7XG4vLyAgICAgY29uc3QgcHVyZW5vd0NvbnRleHQgPVxuLy8gICAgICAgYXdhaXQgc3VwZXIuY3JlYXRlQ29udGV4dDxQdXJlbm93Q2xpQ29udGV4dD4oZ2xvYmFsT3B0cywgY3dkKTtcbi8vXG4vLyAgICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2Vcbi8vICAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuLy9cbi8vICAgICByZXR1cm4ge1xuLy8gICAgICAgLi4ucHVyZW5vd0NvbnRleHQsXG4vLyAgICAgICBzdGFja3NEZXBsb3lTZXJ2aWNlLFxuLy8gICAgIH0gYXMgdW5rbm93biBhcyBUO1xuLy8gICB9XG4vLyB9XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbi8qKlxuICogR2VuZXJhdGUgaHRtbC10ZW1wbGF0ZS5lbWJlZGRlZC50cyBmaWxlIHdpdGggdGhlIEhUTUwgdGVtcGxhdGUgY29uc3RhbnQuXG4gKlxuICogVGhpcyBzY3JpcHQgaXMgcnVuIGF0IGJ1aWxkIHRpbWUgdG8gZW1iZWQgdGhlIHVzZXIncyBwdWJsaWMvaW5kZXguaHRtbFxuICogaW50byB0aGUgTGFtYmRhIGJ1bmRsZSBhcyBhIFR5cGVTY3JpcHQgY29uc3RhbnQuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZFxuICogZm9yIGZpbGUgc3lzdGVtIHJlYWRzIGF0IHJ1bnRpbWUgYW5kIGVuc3VyZXMgdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZVxuICogaW4gdGhlIExhbWJkYSBlbnZpcm9ubWVudC5cbiAqXG4gKiBUaGUgc2NyaXB0OlxuICogMS4gTG9hZHMgdGhlIEhUTUwgdGVtcGxhdGUgdXNpbmcgSHRtbFRlbXBsYXRlTG9hZGVyIGxvZ2ljXG4gKiAyLiBWYWxpZGF0ZXMgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZSBhbmQgc2l6ZVxuICogMy4gR2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBmaWxlIHdpdGggdGhlIHRlbXBsYXRlIGFzIGEgY29uc3RhbnRcbiAqIDQuIFdyaXRlcyB0aGUgZmlsZSB0byBzcmMvY29yZS9zZXJ2aWNlcy90ZW1wbGF0ZS9odG1sLXRlbXBsYXRlLmVtYmVkZGVkLnRzXG4gKiA1LiBWYWxpZGF0ZXMgdGhlIHJlc3VsdGluZyBidW5kbGUgc2l6ZSBpbXBhY3RcbiAqXG4gKiBUaGlzIGZpbGUgaXMgdGhlbiBpbXBvcnRlZCBieSBIdG1sVGVtcGxhdGVTZXJ2aWNlIGF0IHJ1bnRpbWUuXG4gKi9cblxuLy8gQ29uc3RhbnRzIGZvciB2YWxpZGF0aW9uXG5jb25zdCBNQVhfVEVNUExBVEVfU0laRV9CWVRFUyA9IDUgKiAxMDI0ICogMTAyNDsgLy8gNU1CIChjb25zZXJ2YXRpdmUgbGltaXQgdG8gc3RheSB1bmRlciAxME1CIExhbWJkYSBsaW1pdClcbmNvbnN0IExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUIgQVdTIExhbWJkYSBsaW1pdFxuY29uc3QgVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMU1CIHdhcm5pbmcgdGhyZXNob2xkXG5cbmZ1bmN0aW9uIGxvYWRUZW1wbGF0ZSgpIHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdwdWJsaWMvaW5kZXguaHRtbCcpO1xuICBjb25zdCB1c2VGYWxsYmFjayA9IHRydWU7IC8vIERlZmF1bHQgdG8gdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXG4gIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgaWYgKHVzZUZhbGxiYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oJ0RFUFJFQ0FUSU9OIFdBUk5JTkc6IE1pc3NpbmcgcHVibGljL2luZGV4Lmh0bWwnKTtcbiAgICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oYFxcbkZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuVGhlIFB1cmVub3cgZnJhbWV3b3JrIGlzIHVzaW5nIGEgZmFsbGJhY2sgSFRNTCB0ZW1wbGF0ZS4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBmYWxsYmFjayB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4nKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbk1pbmltYWwgdGVtcGxhdGUgc3RydWN0dXJlOicpO1xuICAgICAgY29uc29sZS53YXJuKCcnKTtcbiAgICAgIGNvbnNvbGUud2FybignPCFET0NUWVBFIGh0bWw+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJzxodG1sIGxhbmc9XCJlblwiPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxoZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nKTtcbiAgICAgIGNvbnNvbGUud2FybignICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPC9oZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxib2R5PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDwvYm9keT4nKTtcbiAgICAgIGNvbnNvbGUud2FybignPC9odG1sPicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgICAgIHJldHVybiBnZXREZWZhdWx0VGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogTWlzc2luZyBwdWJsaWMvaW5kZXguaHRtbFxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuXFxuYCArXG4gICAgICBgRmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBQdXJlbm93IGZyYW1ld29yayByZXF1aXJlcyBhIGJhc2UgSFRNTCB0ZW1wbGF0ZSBpbiB5b3VyIHByb2plY3QuXFxuXFxuYCArXG4gICAgICBgQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgd2l0aCB0aGUgZm9sbG93aW5nIG1pbmltYWwgc3RydWN0dXJlOlxcblxcbmAgK1xuICAgICAgYDwhRE9DVFlQRSBodG1sPlxcbmAgK1xuICAgICAgYDxodG1sIGxhbmc9XCJlblwiPlxcbmAgK1xuICAgICAgYCAgPGhlYWQ+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XFxuYCArXG4gICAgICBgICA8L2hlYWQ+XFxuYCArXG4gICAgICBgICA8Ym9keT5cXG5gICtcbiAgICAgIGAgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxcbmAgK1xuICAgICAgYCAgPC9ib2R5PlxcbmAgK1xuICAgICAgYDwvaHRtbD5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmLTgnKTtcblxuICAvLyBDaGVjayBpZiBmaWxlIGlzIGVtcHR5XG4gIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogRW1wdHkgcHVibGljL2luZGV4Lmh0bWxcXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcblxcbmAgK1xuICAgICAgYEZpbGUgbG9jYXRpb246ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHkuIEl0IG11c3QgY29udGFpbiBhIHZhbGlkIEhUTUwgZG9jdW1lbnQgc3RydWN0dXJlLlxcblxcbmAgK1xuICAgICAgYEFjdGlvbiByZXF1aXJlZDogQWRkIEhUTUwgY29udGVudCB0byBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRlbXBsYXRlIHNpemVcbiAgdmFsaWRhdGVUZW1wbGF0ZVNpemUoY29udGVudCwgdGVtcGxhdGVQYXRoKTtcblxuICAvLyBWYWxpZGF0ZSBIVE1MIHN0cnVjdHVyZVxuICB2YWxpZGF0ZVRlbXBsYXRlKGNvbnRlbnQsIHRlbXBsYXRlUGF0aCk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGVtcGxhdGVTaXplKGh0bWw6IHN0cmluZywgdGVtcGxhdGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2l6ZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoaHRtbCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHNpemVNQiA9IChzaXplQnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gIC8vIENoZWNrIGlmIHRlbXBsYXRlIGV4Y2VlZHMgbWF4aW11bSBzaXplXG4gIGlmIChzaXplQnl0ZXMgPiBNQVhfVEVNUExBVEVfU0laRV9CWVRFUykge1xuICAgIGNvbnN0IG1heFNpemVNQiA9IChNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEhUTUwgdGVtcGxhdGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke3RlbXBsYXRlUGF0aH1cXG5gICtcbiAgICAgIGBTaXplOiAke3NpemVNQn0gTUJcXG5gICtcbiAgICAgIGBNYXhpbXVtIGFsbG93ZWQ6ICR7bWF4U2l6ZU1CfSBNQlxcblxcbmAgK1xuICAgICAgYFRoZSBIVE1MIHRlbXBsYXRlIGlzIHRvbyBsYXJnZSBhbmQgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWRcXG5gICtcbiAgICAgIGB0aGUgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbCBieTpcXG5gICtcbiAgICAgIGAgIC0gUmVtb3ZpbmcgaW5saW5lIHN0eWxlcyAodXNlIGV4dGVybmFsIENTUyBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBSZW1vdmluZyBpbmxpbmUgc2NyaXB0cyAodXNlIGV4dGVybmFsIEpTIGZpbGVzIGluc3RlYWQpXFxuYCArXG4gICAgICBgICAtIFJlbW92aW5nIGxhcmdlIGVtYmVkZGVkIGRhdGEgKHVzZSBleHRlcm5hbCBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBNaW5pbWl6aW5nIEhUTUwgY29tbWVudHMgYW5kIHdoaXRlc3BhY2VcXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gaWYgdGVtcGxhdGUgaXMgYXBwcm9hY2hpbmcgdGhlIHdhcm5pbmcgdGhyZXNob2xkXG4gIGlmIChzaXplQnl0ZXMgPiBURU1QTEFURV9TSVpFX1dBUk5JTkdfVEhSRVNIT0xEKSB7XG4gICAgY29uc3Qgd2FybmluZ1RocmVzaG9sZE1CID0gKFRFTVBMQVRFX1NJWkVfV0FSTklOR19USFJFU0hPTEQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhcmdlIEhUTUwgdGVtcGxhdGUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBTaXplOiAke3NpemVNQn0gTUIgKHRocmVzaG9sZDogJHt3YXJuaW5nVGhyZXNob2xkTUJ9IE1CKWApO1xuICAgIGNvbnNvbGUud2FybignXFxuQSBsYXJnZSBIVE1MIHRlbXBsYXRlIGluY3JlYXNlcyBMYW1iZGEgYnVuZGxlIHNpemUgYW5kIGNvbGQgc3RhcnQgdGltZS4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbkNvbnNpZGVyOicpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc3R5bGVzIHRvIGV4dGVybmFsIENTUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc2NyaXB0cyB0byBleHRlcm5hbCBKUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIFJlZHVjaW5nIGVtYmVkZGVkIGRhdGEgYW5kIGNvbW1lbnRzJyk7XG4gICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZShodG1sOiBzdHJpbmcsIHRlbXBsYXRlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IG1pc3NpbmdUYWdzID0gW107XG5cbiAgaWYgKCEvPGh0bWxbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGh0bWw+Jyk7XG4gIH1cbiAgaWYgKCEvPGhlYWRbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGhlYWQ+Jyk7XG4gIH1cbiAgaWYgKCEvPGJvZHlbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGJvZHk+Jyk7XG4gIH1cblxuICBpZiAobWlzc2luZ1RhZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IEludmFsaWQgSFRNTCBzdHJ1Y3R1cmUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBNaXNzaW5nIHJlcXVpcmVkIHRhZ3M6ICR7bWlzc2luZ1RhZ3Muam9pbignLCAnKX1gKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcblRoZSBIVE1MIHRlbXBsYXRlIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseSBhdCBydW50aW1lLicpO1xuICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlY29tbWVuZGVkOiBBZGQgdGhlIG1pc3NpbmcgdGFncyB0byBwdWJsaWMvaW5kZXguaHRtbC4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VGVtcGxhdGUoKSB7XG4gIHJldHVybiBgPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIiAvPlxuICAgIDxtZXRhIG5hbWU9XCJ0aGVtZS1jb2xvclwiIGNvbnRlbnQ9XCIjMDAwMDAwXCIgLz5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bm9zY3JpcHQ+WW91IG5lZWQgdG8gZW5hYmxlIEphdmFTY3JpcHQgdG8gcnVuIHRoaXMgYXBwLjwvbm9zY3JpcHQ+XG4gICAgPGRpdiBpZD1cInJvb3QtaW50ZXJuYWxcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+YDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCdW5kbGVTaXplKGVtYmVkZGVkRmlsZVBhdGg6IGFueSkge1xuICAvLyBDaGVjayBpZiB0aGUgZW1iZWRkZWQgZmlsZSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGVtYmVkZGVkRmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBDb3VsZCBub3QgdmFsaWRhdGUgYnVuZGxlIHNpemUgLSBlbWJlZGRlZCBmaWxlIG5vdCBmb3VuZDogJHtlbWJlZGRlZEZpbGVQYXRofWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVtYmVkZGVkRmlsZVNpemUgPSBmcy5zdGF0U3luYyhlbWJlZGRlZEZpbGVQYXRoKS5zaXplO1xuICBjb25zdCBlbWJlZGRlZEZpbGVTaXplTUIgPSAoZW1iZWRkZWRGaWxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG5cbiAgLy8gY29uc29sZS5sb2coYCAgRW1iZWRkZWQgZmlsZSBzaXplOiAke2VtYmVkZGVkRmlsZVNpemVNQn0gTUJgKTtcblxuICAvLyBFc3RpbWF0ZSBpbXBhY3Qgb24gTGFtYmRhIGJ1bmRsZVxuICAvLyBUaGUgZW1iZWRkZWQgZmlsZSB3aWxsIGJlIHBhcnQgb2YgdGhlIExhbWJkYSBidW5kbGUsIHNvIHdlIGNoZWNrIGlmIGl0J3MgcmVhc29uYWJsZVxuICBpZiAoZW1iZWRkZWRGaWxlU2l6ZSA+IE1BWF9URU1QTEFURV9TSVpFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke2VtYmVkZGVkRmlsZVBhdGh9XFxuYCArXG4gICAgICBgU2l6ZTogJHtlbWJlZGRlZEZpbGVTaXplTUJ9IE1CXFxuYCArXG4gICAgICBgTWF4aW11bSBhbGxvd2VkOiAkeyhNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CXFxuXFxuYCArXG4gICAgICBgVGhlIGVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWQgdGhlXFxuYCArXG4gICAgICBgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIExhbWJkYSBidW5kbGUgZXhpc3RzIGFuZCB2YWxpZGF0ZSBpdHMgc2l6ZVxuICAvLyBOb3RlOiBUaGlzIGlzIGluZm9ybWF0aW9uYWwgb25seSBkdXJpbmcgdGVtcGxhdGUgZ2VuZXJhdGlvbiwgYXMgdGhlIGJ1bmRsZVxuICAvLyBtYXkgbm90IGhhdmUgYmVlbiByZWJ1aWx0IHlldCB3aXRoIHRoZSBuZXcgdGVtcGxhdGVcbiAgY29uc3QgbGFtYmRhQnVuZGxlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9vdXQvZGlzdC9sYW1iZGEvYnVuZGxlLmpzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpKSB7XG4gICAgY29uc3QgYnVuZGxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpLnNpemU7XG4gICAgY29uc3QgYnVuZGxlU2l6ZU1CID0gKGJ1bmRsZVNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gICAgY29uc29sZS5sb2coYCAgTGFtYmRhIGJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUIgKGV4aXN0aW5nIGJ1bmRsZSlgKTtcblxuICAgIC8vIE9ubHkgd2FybiBhYm91dCBidW5kbGUgc2l6ZSwgZG9uJ3QgZmFpbCB0aGUgYnVpbGRcbiAgICAvLyBUaGUgYnVuZGxlIHdpbGwgYmUgcmVidWlsdCBhZnRlciB0aGlzIHNjcmlwdCBydW5zXG4gICAgaWYgKGJ1bmRsZVNpemUgPiBMQU1CREFfQlVORExFX1NJWkVfTElNSVQpIHtcbiAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogRXhpc3RpbmcgTGFtYmRhIGJ1bmRsZSBleGNlZWRzIEFXUyBsaW1pdCcpO1xuICAgICAgY29uc29sZS53YXJuKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuQnVuZGxlOiAke2xhbWJkYUJ1bmRsZVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oYFNpemU6ICR7YnVuZGxlU2l6ZU1CfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKGBBV1MgTGFtYmRhIGxpbWl0OiAkeyhMQU1CREFfQlVORExFX1NJWkVfTElNSVQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5Ob3RlOiBUaGlzIGlzIHRoZSBleGlzdGluZyBidW5kbGUgYmVmb3JlIHRlbXBsYXRlIGVtYmVkZGluZy4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGJ1bmRsZSB3aWxsIGJlIHJlYnVpbHQgd2l0aCB0aGUgbmV3IHRlbXBsYXRlLicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5JZiB0aGUgYnVuZGxlIHNpemUgaXNzdWUgcGVyc2lzdHMgYWZ0ZXIgcmVidWlsZDonKTtcbiAgICAgIGNvbnNvbGUud2FybignICAxLiBFeHRlcm5hbGl6ZSBsYXJnZSBkZXBlbmRlbmNpZXMgaW4gZXNidWlsZCBjb25maWcnKTtcbiAgICAgIGNvbnNvbGUud2FybignICAyLiBVc2UgTGFtYmRhIGxheWVycyBmb3IgbGFyZ2UgZGVwZW5kZW5jaWVzJyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgMy4gUmVkdWNlIHRoZSBzaXplIG9mIHB1YmxpYy9pbmRleC5odG1sIGlmIG5lZWRlZCcpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdhcm4gaWYgYnVuZGxlIGlzIGFwcHJvYWNoaW5nIHRoZSBsaW1pdCAoPjhNQilcbiAgICAgIGNvbnN0IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQgPSA4ICogMTAyNCAqIDEwMjQ7XG4gICAgICBpZiAoYnVuZGxlU2l6ZSA+IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhbWJkYSBidW5kbGUgYXBwcm9hY2hpbmcgc2l6ZSBsaW1pdCcpO1xuICAgICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxcbkJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUJgKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBBV1MgbGltaXQ6ICR7KExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CYCk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuQ29uc2lkZXIgb3B0aW1pemluZyB0aGUgYnVuZGxlIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuJyk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApICsgJ1xcbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVtYmVkZGVkVGVtcGxhdGVGaWxlKCkge1xuICAvLyBjb25zb2xlLmxvZygnXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgLy8gY29uc29sZS5sb2coJ0dlbmVyYXRpbmcgSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgLy8gTG9hZCB0aGUgSFRNTCB0ZW1wbGF0ZVxuICBjb25zdCB0ZW1wbGF0ZSA9IGxvYWRUZW1wbGF0ZSgpO1xuXG4gIC8vIEdlbmVyYXRlIFR5cGVTY3JpcHQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYC8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBFbWJlZGRlZCBIVE1MIHRlbXBsYXRlIGZyb20gcHVibGljL2luZGV4Lmh0bWwuXG4gKiBcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGJ5IGJpbi9kZXBsb3kvZ2VuZXJhdGUtaHRtbC10ZW1wbGF0ZS5qcy5cbiAqIERPIE5PVCBFRElUIFRISVMgRklMRSBNQU5VQUxMWSAtIGNoYW5nZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBvbiBuZXh0IGJ1aWxkLlxuICogXG4gKiBUbyBtb2RpZnkgdGhlIEhUTUwgdGVtcGxhdGUsIGVkaXQgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEhUTUxfVEVNUExBVEUgPSAke0pTT04uc3RyaW5naWZ5KHRlbXBsYXRlKX07XG5gO1xuXG4gIC8vIFdyaXRlIHRvIHNyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHNcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICBfX2Rpcm5hbWUsXG4gICAgJy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHMnLFxuICApO1xuXG4gIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gIGNvbnN0IG91dHB1dERpciA9IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgZmlsZUNvbnRlbnQsICd1dGYtOCcpO1xuXG4gIGNvbnN0IHRlbXBsYXRlU2l6ZUtCID0gKHRlbXBsYXRlLmxlbmd0aCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gIC8vIGNvbnNvbGUubG9nKGBcdTI3MTMgR2VuZXJhdGVkOiAke291dHB1dFBhdGh9YCk7XG4gIC8vIGNvbnNvbGUubG9nKGAgIFRlbXBsYXRlIHNpemU6ICR7dGVtcGxhdGVTaXplS0J9IEtCYCk7XG5cbiAgLy8gVmFsaWRhdGUgYnVuZGxlIHNpemVcbiAgdmFsaWRhdGVCdW5kbGVTaXplKG91dHB1dFBhdGgpO1xuXG4gIC8vIGNvbnNvbGUubG9nKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAvLyBjb25zb2xlLmxvZygnSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcgQ29tcGxldGUnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRpY0h0bWwoc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIFJ1biB0aGUgZ2VuZXJhdG9yXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVFbWJlZGRlZFRlbXBsYXRlRmlsZSgpO1xuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLmVycm9yKCdCVUlMRCBGQUlMRUQ6IEhUTUwgVGVtcGxhdGUgR2VuZXJhdGlvbiBFcnJvcicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1xcbicgKyBlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAoZXJyb3Iuc3RhY2sgJiYgcHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcblN0YWNrIHRyYWNlOicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgfVxuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cblxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuZXhwb3J0IHsgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9ydW50aW1lLXdlYi1kZXBsb3ltZW50LnNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgICBidWlsZENvbW1hbmQsXG4gICAgdHlwZSBCdWlsZE9wdGlvbnNcbn0gZnJvbSAnLi9idWlsZC5jb21tYW5kJztcbmV4cG9ydCB7XG4gICAgcnVudGltZUluaXRDb21tYW5kLFxuICAgIHR5cGUgUnVudGltZUluaXRPcHRpb25zXG59IGZyb20gJy4vaW5pdCc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuLy8gY29uc3QgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIEJvb3RzdHJhcENyZWRlbnRpYWxzRXJyb3IsXG4gIEJvb3RzdHJhcFJlZ2lvbkVycm9yLFxuICBCdWlsZEVycm9yLFxuICBCdWlsZFNlcnZpY2UsXG4gIGJ1aWxkU3RhdGljSHRtbCxcbiAgQ2RrQm9vdHN0cmFwU2VydmljZSxcbiAgQ29tbWFuZFJlc3VsdCxcbiAgRGVwbG95bWVudEVycm9yLFxuICBEZXBsb3ltZW50U2VydmljZSxcbiAgRGVwbG95T3B0aW9ucyxcbiAgRGVwbG95U2VydmljZSxcbiAgZGV0ZWN0QW5kVmFsaWRhdGVDcmVkZW50aWFscyxcbiAgRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gIEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsXG4gIGdldFN0YWdlLFxuICBMb2dnZXIsXG4gIFN0YWNrc0RlcGxveVNlcnZpY2UsXG59IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dDbGlDb25maWcgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3V0aWxzJztcblxuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICdAYmluL3NlcnZpY2VzJztcblxuXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIGV4dGVuZHMgRGVwbG95bWVudFNlcnZpY2Uge1xuICAvKipcbiAgICogRGVwbG95IGFwcGxpY2F0aW9uIHRvIEFXU1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveUNvbW1hbmQoXG4gICAgc3RhY2tzRGVwbG95U2VydmljZTogU3RhY2tzRGVwbG95U2VydmljZSxcbiAgICBvcHRpb25zOiBEZXBsb3lPcHRpb25zLFxuICAgIGNvbmZpZzogUHVyZW5vd0NsaUNvbmZpZyxcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICAgZW52VmFsaWRhdG9yPzogRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gICk6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBBV1MgY3JlZGVudGlhbHMgZWFybHkgaWYgdmFsaWRhdG9yIHByb3ZpZGVkXG4gICAgICBpZiAoZW52VmFsaWRhdG9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICAgIGlmIChjb25maWcuaXNBd3NDcmVkZW50aWFsc0R1bXAoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1MgY3JlZGVudGlhbHMgRE8gTk9UIGV4aXN0LCBwbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBmaXJzdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JGb3JtYXR0ZXIgPSBuZXcgRnJpZW5kbHlFcnJvckZvcm1hdHRlcigpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yRm9ybWF0dGVyLmZvcm1hdE1pc3NpbmdDcmVkZW50aWFsc0Vycm9yKFsnQVdTX0FDQ0VTU19LRVlfSUQnLCAnQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZJ10sIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0b2RvOiBzZXQgc3RhZ2Ugb3JkZXIgZGV0ZWN0b3IgdG8gZG9jdW1lbnRhdGlvbiBSRUFETUUubWQgdG8ga25vd1xuICAgICAgLy8gICAgICAgIENMSSBzdGFnZSBcdTIwMTM+IGVudiBTVEFHRSBcdTIwMTM+IGNvbmZpZy5zdGFnZVswXSBcdTIwMTM+IGRldiAoZGVmYXVsdClcbiAgICAgIC8vICAgXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXG4gICAgICAvLyBEZXRlcm1pbmUgc3RhZ2VcbiAgICAgIGNvbnN0IHN0YWdlID0gb3B0aW9ucy5zdGFnZSB8fCBwcm9jZXNzLmVudi5TVEFHRSB8fCBjb25maWcuc3RhZ2VzWzBdPy5uYW1lIHx8ICdkZXYnO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzdGFnZSBleGlzdHMgaW4gY29uZmlndXJhdGlvblxuICAgICAgY29uc3Qgc3RhZ2VDb25maWcgPSBnZXRTdGFnZShjb25maWcsIHN0YWdlKTtcbiAgICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgICBgU3RhZ2UgJyR7c3RhZ2V9JyBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyl9XFxuYCArXG4gICAgICAgICAgYFVwZGF0ZSB5b3VyIHB1cmVub3cuY29uZmlnLnRzIHRvIGFkZCB0aGlzIHN0YWdlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkU3RhdGljSHRtbCgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhjaGFsay5ib2xkKGBEZXBsb3lpbmcgdG8gQVdTIChzdGFnZTogJHtjaGFsay5jeWFuKHN0YWdlKX0pLi4uYCkpO1xuICAgICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgICAvLyBJbml0aWFsaXplIHNlcnZpY2VzXG4gICAgICBjb25zdCBkZXBsb3lTZXJ2aWNlID0gbmV3IERlcGxveVNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJ1aWxkU2VydmljZSA9IG5ldyBCdWlsZFNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNlcnZpY2UgPSBuZXcgQ2RrQm9vdHN0cmFwU2VydmljZShsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDE6IERldGVjdCBhbmQgdmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IGRldGVjdEFuZFZhbGlkYXRlQ3JlZGVudGlhbHMobG9nZ2VyKTtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHN0YWdlQ29uZmlnLmF3c1JlZ2lvbiA/PyBjcmVkZW50aWFscy5yZWdpb24gPz8gJ3VzLWVhc3QtMSc7XG5cbiAgICAgIC8vIFN0ZXAgMjogVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIHdpdGggU1RTXG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ3JlZGVudGlhbHMoZGVwbG95U2VydmljZSwgc3RhZ2VDb25maWcsIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMzogRW5zdXJlIENESyBlbnZpcm9ubWVudCBpcyBib290c3RyYXBwZWRcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQm9vdHN0cmFwcGVkKGJvb3RzdHJhcFNlcnZpY2UsIGNvbmZpZywgc3RhZ2VDb25maWcsIGNyZWRlbnRpYWxzLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgNDogUHJlLWRlcGxveW1lbnQgdmFsaWRhdGlvblxuICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtUHJlRGVwbG95bWVudFZhbGlkYXRpb24oc3RhZ2UsIGNvbmZpZywgb3B0aW9ucywgbG9nZ2VyLCBjd2QpO1xuXG4gICAgICAvLyBTdGVwIDU6IEV4ZWN1dGUgdHdvLXN0YWNrIGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJlc3VsdDogUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFja3NEZXBsb3ltZW50PFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICAgICAgc3RhZ2UsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBvcHRpb25zLnNraXBCdWlsZCxcbiAgICAgICAgb3B0aW9ucy52ZXJib3NlLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RlcCA2OiBDbGVhciBTMyBjYWNoZSBpZiBlbmFibGVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyUzNDYWNoZURlcGxveW1lbnQocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDc6IFVwbG9hZCBSZWFjdCBCdWlsZCB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRSZWFjdEJ1bmRsZShyZXN1bHQuaW5mcmFTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCA4OiBVcGxvYWQgcHVibGljIGFzc2V0cyB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRQdWJsaWNBc3NldHMocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgOTogSW52YWxpZGF0ZSBDbG91ZEZyb250IGNhY2hlXG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250Q2FjaGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMTA6IEluamVjdCBBUEkgR2F0ZXdheSBVUkwgaW50byAuZW52IGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuaW5qZWN0QXBpR2F0ZXdheVVybChyZXN1bHQucnVudGltZVdlYlN0YWNrLCBjb25maWcsIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCAxMTogRGlzcGxheSBkZXBsb3ltZW50IHN1bW1hcnlcbiAgICAgIHRoaXMuZGlzcGxheVN0YWNrc0RlcGxveW1lbnRTdW1tYXJ5KHJlc3VsdCwgbG9nZ2VyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZXBsb3ltZW50RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbShlcnJvci5oaW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCb290c3RyYXBDcmVkZW50aWFsc0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgQm9vdHN0cmFwUmVnaW9uRXJyb3IpIHtcbiAgICAgICAgLy8gQm9vdHN0cmFwIGNyZWRlbnRpYWwvcmVnaW9uIGVycm9ycyBhbHJlYWR5IGxvZ2dlZCBpbiBkZXRlY3RBbmRWYWxpZGF0ZUNyZWRlbnRpYWxzXG4gICAgICAgIC8vIEp1c3QgcmV0dXJuIHdpdGggZXhpdCBjb2RlIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdHdvLXN0YWNrIGRlcGxveW1lbnQgc3VtbWFyeSB3aXRoIG91dHB1dHMgZnJvbSBib3RoIEluZnJhIGFuZCBSdW50aW1lIHN0YWNrc1xuICAgKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShcbiAgICByZXN1bHQ6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApOiB2b2lkIHtcbiAgICAvLyBAbm90ZTogZGlzcGxheSBhbGwgUHVyZW5vdyBkZXBsb3ltZW50IGluZm8gYnkgZGVmYXVsdFxuICAgIHN1cGVyLmRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShyZXN1bHQsIGxvZ2dlciwgeyBtb2RpZmllZDogdHJ1ZSB9KTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdSdW50aW1lIFdlYiBTdGFjazonKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdTdGFjayBOYW1lOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5zdGFja05hbWUpLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdEdXJhdGlvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHRoaXMuZm9ybWF0RHVyYXRpb24ocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5kdXJhdGlvbikpLFxuICAgICk7XG5cbiAgICAvLyBEaXNwbGF5IEFQSSBHYXRld2F5IFVSTCBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmFwaUdhdGV3YXlVcmwpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgIGNoYWxrLmN5YW4oJ0FQSSBHYXRld2F5OicpLFxuICAgICAgICBjaGFsay53aGl0ZShyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMuYXBpR2F0ZXdheVVybCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgTGFtYmRhIEFSTiBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QgJiYgcmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsuY3lhbignTGFtYmRhczonKSxcbiAgICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoKSxcbiAgICAgICk7XG4gICAgICByZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdC5mb3JFYWNoKChsYW1iZGFBcm46IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgICAgY2hhbGsuY3lhbignICBMYW1iZGEgQVJOOicpLFxuICAgICAgICAgIGNoYWxrLndoaXRlKGxhbWJkYUFybiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHJlZ2lvbiBhbmQgc3RhZ2VcbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGVwbG95bWVudCBJbmZvOicpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1JlZ2lvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHJlc3VsdC5pbmZyYVN0YWNrLnJlZ2lvbiksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1N0YWdlOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LmluZnJhU3RhY2suc3RhZ2UpLFxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gIH1cblxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge1xuICBDb21tYW5kUmVzdWx0LFxuICBMb2dnZXIsXG4gIEJ1aWxkUmVzdWx0LFxuICBCdWlsZFNlcnZpY2UsXG4gIEJ1aWxkVGFyZ2V0LFxuICBCdWlsZEVycm9yLFxuICBGcmllbmRseUVudmlyb25tZW50RXJyb3IsXG4gIC8vIFB1cmVub3dDbGlDb25maWcsIC8vIFRPRE86IEltcG9ydCBmcm9tIHByb3BlciBsb2NhdGlvblxuICBidWlsZFN0YXRpY0h0bWxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBidWlsZCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgLyoqIFNwZWNpZmljIHRhcmdldCB0byBidWlsZCAocmVhY3QsIGxhbWJkYSwgY2RrLCBvciBhbGwpICovXG4gIHRhcmdldD86ICdyZWFjdCcgfCAnbGFtYmRhJyB8ICdjZGsnIHwgJ2FsbCc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYnVpbGQgdGFyZ2V0IHJlcXVpcmVzIEFXUyBjcmVkZW50aWFsc1xuICovXG5mdW5jdGlvbiB0YXJnZXRSZXF1aXJlc0NyZWRlbnRpYWxzKHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIExhbWJkYSBhbmQgQ0RLIHRhcmdldHMgbWF5IG5lZWQgQVdTIGNyZWRlbnRpYWxzIGZvciBkZXBsb3ltZW50LXJlbGF0ZWQgb3BlcmF0aW9uc1xuICAvLyBSZWFjdCB0YXJnZXQgZG9lcyBub3QgcmVxdWlyZSBBV1MgY3JlZGVudGlhbHNcbiAgcmV0dXJuIHRhcmdldCA9PT0gJ2xhbWJkYScgfHwgdGFyZ2V0ID09PSAnY2RrJyB8fCB0YXJnZXQgPT09ICdhbGwnO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFwcGxpY2F0aW9uIHRhcmdldHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChcbiAgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICBjb25maWc6IGFueSwgLy8gVE9ETzogVXNlIHByb3BlciBQdXJlbm93Q2xpQ29uZmlnIHR5cGVcbiAgbG9nZ2VyOiBMb2dnZXIsXG4gIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgZW52VmFsaWRhdG9yPzogYW55LCAvLyBUT0RPOiBJbXBvcnQgcHJvcGVyIHR5cGUgZnJvbSBwdXJlbm93XG4pOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLnRhcmdldCB8fCAnYWxsJztcblxuICAgIC8vIFZhbGlkYXRlIEFXUyBjcmVkZW50aWFscyBpZiBidWlsZGluZyBBV1MgdGFyZ2V0cyBhbmQgdmFsaWRhdG9yIHByb3ZpZGVkXG4gICAgaWYgKHRhcmdldFJlcXVpcmVzQ3JlZGVudGlhbHModGFyZ2V0KSAmJiBlbnZWYWxpZGF0b3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGVudlZhbGlkYXRvci5nZXRDb25maWcoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pc0F3c0NyZWRlbnRpYWxzRHVtcCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1MgY3JlZGVudGlhbHMgRE8gTk9UIGV4aXN0LCBwbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBmaXJzdCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGb3IgYnVpbGQgY29tbWFuZCwgd2UnbGwgc2hvdyBhIHdhcm5pbmcgYnV0IGFsbG93IHRoZSBidWlsZCB0byBjb250aW51ZVxuICAgICAgICAvLyBzaW5jZSB0aGUgYnVpbGQgaXRzZWxmIGRvZXNuJ3QgcmVxdWlyZSBBV1MgY3JlZGVudGlhbHMsIG9ubHkgZGVwbG95bWVudCBkb2VzXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZyaWVuZGx5RW52aXJvbm1lbnRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdBV1MgY3JlZGVudGlhbHMgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbSgnQnVpbGRpbmcgd2l0aG91dCBBV1MgY3JlZGVudGlhbHMuIFlvdSB3aWxsIG5lZWQgdG8gY29uZmlndXJlIHRoZW0gYmVmb3JlIGRlcGxveW1lbnQuJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZFN0YXRpY0h0bWwoKTtcblxuICAgIGNvbnN0IGJ1aWxkU2VydmljZSA9IG5ldyBCdWlsZFNlcnZpY2UoY3dkKTtcblxuICAgIGxvZ2dlci5pbmZvKGNoYWxrLmJvbGQoJ0J1aWxkaW5nIFJ1bnRpbWUgYXBwbGljYXRpb24uLi4nKSk7XG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgbGV0IHJlc3VsdHM6IEJ1aWxkUmVzdWx0W107XG4gICAgbGV0IHNob3VsZEdlbmVyYXRlVHlwZXMgPSBmYWxzZTtcblxuICAgIGlmICh0YXJnZXQgPT09ICdhbGwnKSB7XG4gICAgICAvLyBCdWlsZCBhbGwgdGFyZ2V0c1xuICAgICAgLy8gT25seSBnZW5lcmF0ZSB0eXBlcyBmb3IgUnVudGltZSBwYWNrYWdlIGl0c2VsZiwgbm90IGNvbnN1bWVyIHByb2plY3RzXG4gICAgICBjb25zdCBpc1J1bnRpbWVQYWNrYWdlID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3dkLCAnc3JjL2NvcmUvaW5kZXgudHMnKSk7XG4gICAgICBzaG91bGRHZW5lcmF0ZVR5cGVzID0gaXNSdW50aW1lUGFja2FnZTtcbiAgICAgIHJlc3VsdHMgPSBhd2FpdCBidWlsZEFsbFRhcmdldHMoYnVpbGRTZXJ2aWNlLCBjb25maWcsIGxvZ2dlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJ1aWxkIHNwZWNpZmljIHRhcmdldFxuICAgICAgcmVzdWx0cyA9IGF3YWl0IGJ1aWxkU2luZ2xlVGFyZ2V0KGJ1aWxkU2VydmljZSwgdGFyZ2V0LCBjb25maWcsIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbnMgaWYgYnVpbGRpbmcgYWxsIHRhcmdldHMgKFJ1bnRpbWUgcGFja2FnZSBvbmx5KVxuICAgIGlmIChzaG91bGRHZW5lcmF0ZVR5cGVzKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoYnVpbGRTZXJ2aWNlLCBjb25maWcsIGxvZ2dlcik7XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBidWlsZCBzdW1tYXJ5XG4gICAgZGlzcGxheUJ1aWxkU3VtbWFyeShyZXN1bHRzLCBjd2QsIGxvZ2dlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGV4aXRDb2RlOiAwLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQnVpbGRFcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZGltKGVycm9yLmhpbnQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICBleGl0Q29kZTogMSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYWxsIHRhcmdldHMgc2VxdWVudGlhbGx5IHdpdGggcHJvZ3Jlc3MgaW5kaWNhdG9yc1xuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEFsbFRhcmdldHMoXG4gIGJ1aWxkU2VydmljZTogQnVpbGRTZXJ2aWNlLFxuICBjb25maWc6IGFueSxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiBQcm9taXNlPEJ1aWxkUmVzdWx0W10+IHtcbiAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gdGhlIFJ1bnRpbWUgcGFja2FnZSBpdHNlbGYgb3IgYSBjb25zdW1lciBwcm9qZWN0XG4gIGNvbnN0IGlzUnVudGltZVBhY2thZ2UgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjL2NvcmUvaW5kZXgudHMnKSk7XG5cbiAgLy8gRm9yIGNvbnN1bWVyIHByb2plY3RzLCBvbmx5IGJ1aWxkIFJlYWN0XG4gIC8vIExhbWJkYSBhbmQgQ0RLIGFyZSBpbnRlcm5hbCB0byBSdW50aW1lIGFuZCBwcmUtYnVpbHQgaW4gdGhlIHBhY2thZ2VcbiAgY29uc3QgdGFyZ2V0czogQnVpbGRUYXJnZXRbXSA9IGlzUnVudGltZVBhY2thZ2VcbiAgICA/IFsncmVhY3QnLCAnbGFtYmRhJywgJ2NkayddXG4gICAgOiBbJ3JlYWN0J107XG5cbiAgY29uc3QgcmVzdWx0czogQnVpbGRSZXN1bHRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoYEJ1aWxkaW5nICR7dGFyZ2V0fSBidW5kbGUuLi5gKTtcbiAgICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNlcnZpY2UuYnVpbGRUYXJnZXQodGFyZ2V0LCBjb25maWcpO1xuICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYCR7Y2FwaXRhbGl6ZSh0YXJnZXQpfSBidW5kbGUgKCR7Zm9ybWF0RHVyYXRpb24ocmVzdWx0LmR1cmF0aW9uKX0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwaW5uZXIuZmFpbChgJHtjYXBpdGFsaXplKHRhcmdldCl9IGJ1bmRsZSBmYWlsZWRgKTtcbiAgICAgIHRocm93IG5ldyBCdWlsZEVycm9yKFxuICAgICAgICBgQnVpbGQgZmFpbGVkIGZvciB0YXJnZXQgJyR7dGFyZ2V0fSdgLFxuICAgICAgICByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc2luZ2xlIHRhcmdldCB3aXRoIHByb2dyZXNzIGluZGljYXRvclxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFNpbmdsZVRhcmdldChcbiAgYnVpbGRTZXJ2aWNlOiBCdWlsZFNlcnZpY2UsXG4gIHRhcmdldDogQnVpbGRUYXJnZXQsXG4gIGNvbmZpZzogYW55LFxuICBsb2dnZXI6IExvZ2dlcixcbik6IFByb21pc2U8QnVpbGRSZXN1bHRbXT4ge1xuICBjb25zdCBzcGlubmVyID0gbG9nZ2VyLnNwaW5uZXIoYEJ1aWxkaW5nICR7dGFyZ2V0fSBidW5kbGUuLi5gKTtcbiAgc3Bpbm5lci5zdGFydCgpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2VydmljZS5idWlsZFRhcmdldCh0YXJnZXQsIGNvbmZpZyk7XG5cbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgc3Bpbm5lci5zdWNjZWVkKGAke2NhcGl0YWxpemUodGFyZ2V0KX0gYnVuZGxlICgke2Zvcm1hdER1cmF0aW9uKHJlc3VsdC5kdXJhdGlvbil9KWApO1xuICB9IGVsc2Uge1xuICAgIHNwaW5uZXIuZmFpbChgJHtjYXBpdGFsaXplKHRhcmdldCl9IGJ1bmRsZSBmYWlsZWRgKTtcbiAgICB0aHJvdyBuZXcgQnVpbGRFcnJvcihcbiAgICAgIGBCdWlsZCBmYWlsZWQgZm9yIHRhcmdldCAnJHt0YXJnZXR9J2AsXG4gICAgICByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzdWx0XTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoXG4gIGJ1aWxkU2VydmljZTogQnVpbGRTZXJ2aWNlLFxuICBjb25maWc6IGFueSxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3Bpbm5lciA9IGxvZ2dlci5zcGlubmVyKCdHZW5lcmF0aW5nIHR5cGUgZGVjbGFyYXRpb25zLi4uJyk7XG4gIHNwaW5uZXIuc3RhcnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkU2VydmljZS5nZW5lcmF0ZVR5cGVzKGNvbmZpZyk7XG4gICAgc3Bpbm5lci5zdWNjZWVkKCdUeXBlIGRlY2xhcmF0aW9ucycpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnVHlwZSBkZWNsYXJhdGlvbnMgZmFpbGVkJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IGJ1aWxkIHN1bW1hcnkgd2l0aCBhcnRpZmFjdCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwbGF5QnVpbGRTdW1tYXJ5KFxuICByZXN1bHRzOiBCdWlsZFJlc3VsdFtdLFxuICBjd2Q6IHN0cmluZyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4pOiB2b2lkIHtcbiAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gIC8vIENhbGN1bGF0ZSB0b3RhbCBkdXJhdGlvblxuICBjb25zdCB0b3RhbER1cmF0aW9uID0gcmVzdWx0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5kdXJhdGlvbiwgMCk7XG5cbiAgbG9nZ2VyLnN1Y2Nlc3MoY2hhbGsuYm9sZChgQnVpbGQgY29tcGxldGUgaW4gJHtmb3JtYXREdXJhdGlvbih0b3RhbER1cmF0aW9uKX1gKSk7XG5cbiAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdBcnRpZmFjdHM6JykpO1xuXG4gIC8vIERpc3BsYXkgZWFjaCBhcnRpZmFjdCB3aXRoIHNpemVcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCByZXN1bHQub3V0cHV0UGF0aCk7XG4gICAgICBjb25zdCBzaXplID0gZ2V0RmlsZVNpemUoZnVsbFBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjd2QsIGZ1bGxQYXRoKTtcblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsud2hpdGUocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgY2hhbGsuZGltKGAoJHtzaXplfSlgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxufVxuXG4vKipcbiAqIEdldCBmaWxlIHNpemUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZVBhdGgpO1xuICAgIHJldHVybiBmb3JtYXRCeXRlcyhzdGF0cy5zaXplKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdCBieXRlcyB0byBodW1hbi1yZWFkYWJsZSBzaXplXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEJ5dGVzKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcblxuICBjb25zdCBrID0gMTAyNDtcbiAgY29uc3Qgc2l6ZXMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InXTtcbiAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuXG4gIHJldHVybiBgJHsoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgxKX0gJHtzaXplc1tpXX1gO1xufVxuXG4vKipcbiAqIEZvcm1hdCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdG8gaHVtYW4tcmVhZGFibGUgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobXMgPCAxMDAwKSB7XG4gICAgcmV0dXJuIGAke21zfW1zYDtcbiAgfVxuXG4gIGNvbnN0IHNlY29uZHMgPSAobXMgLyAxMDAwKS50b0ZpeGVkKDEpO1xuICByZXR1cm4gYCR7c2Vjb25kc31zYDtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBDb21tYW5kUmVzdWx0LCBMb2dnZXIgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlIGFzIFRlbXBsYXRlU2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMvdGVtcGxhdGUuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIENka0luaXRTZXJ2aWNlLFxuICAgIENka0Jvb3RzdHJhcFNlcnZpY2UsXG4gICAgUGFja2FnZU1hbmFnZXIsXG4gICAgUGFja2FnZU1hbmFnZXJTZXJ2aWNlLFxuICAgIEF3c0NyZWRlbnRpYWxzRGV0ZWN0b3IsXG4gICAgbG9nQ3JlZGVudGlhbHNFcnJvcixcbiAgICBBd3NSZWdpb25SZXNvbHZlcixcbiAgICBQcm9tcHRTZXJ2aWNlLFxuICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICBFbnZpcm9ubWVudFZhbGlkYXRvcixcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgcnVudGltZSBpbml0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lSW5pdE9wdGlvbnMge1xuICAgIC8qKiBUYXJnZXQgZGlyZWN0b3J5IGZvciB0aGUgbmV3IHByb2plY3QgKi9cbiAgICBkaXI/OiBzdHJpbmc7XG4gICAgLyoqIFRlbXBsYXRlIG5hbWUgdG8gdXNlICovXG4gICAgdGVtcGxhdGU/OiBzdHJpbmc7XG4gICAgLyoqIEluaXRpYWxpemUgQ0RLIGluZnJhc3RydWN0dXJlIG9ubHkgKi9cbiAgICBjZGs/OiBib29sZWFuO1xuICAgIC8qKiBQcm9qZWN0IGNvcmUgaW5zdGFuY2U6IGFsd2F5cyBydW50aW1lLXdlYiBmb3IgcnVudGltZSBwYWNrYWdlICovXG4gICAgY29yZT86IHN0cmluZztcbiAgICAvKiogRm9yY2Ugb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovXG4gICAgZm9yY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgUnVudGltZSBwcm9qZWN0IHVzaW5nIHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGVzXG4gKiBcbiAqIFRoaXMgY29tbWFuZCBleHRlbmRzIHB1cmVub3cncyBpbml0IGZ1bmN0aW9uYWxpdHkgYnV0IHVzZXMgUnVudGltZVRlbXBsYXRlU2VydmljZVxuICogdG8gZW5zdXJlIHRlbXBsYXRlcyBhcmUgcmVzb2x2ZWQgZnJvbSB0aGUgcnVudGltZSBwYWNrYWdlJ3MgZmlsZSBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW50aW1lSW5pdENvbW1hbmQoXG4gICAgb3B0aW9uczogUnVudGltZUluaXRPcHRpb25zLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnZWYWxpZGF0b3I/OiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbik6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIC8vIE5vdGU6IGVudlZhbGlkYXRvciBpcyBvcHRpb25hbCBhbmQgb25seSB1c2VkIGZvciBDREsgYm9vdHN0cmFwXG4gICAgLy8gSW5pdCBjb21tYW5kIGRvZXMgTk9UIHJlcXVpcmUgQVdTIGNyZWRlbnRpYWxzXG4gICAgY29uc3Qgc3Bpbm5lciA9IGxvZ2dlci5zcGlubmVyKFxuICAgICAgICBvcHRpb25zLmNkayA/ICdJbml0aWFsaXppbmcgQ0RLIGluZnJhc3RydWN0dXJlLi4uJyA6ICdJbml0aWFsaXppbmcgUnVudGltZSBwcm9qZWN0Li4uJyxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQ3JlYXRlIHJ1bnRpbWUgdGVtcGxhdGUgc2VydmljZSAodXNlcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlKVxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVNlcnZpY2UgPSBuZXcgVGVtcGxhdGVTZXJ2aWNlKGN3ZCk7XG4gICAgICAgIGNvbnN0IHByb21wdFNlcnZpY2UgPSBuZXcgUHJvbXB0U2VydmljZSgpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIENESyBkaXJlY3RvcnkgZG9lc24ndCBhbHJlYWR5IGV4aXN0ICh1bmxlc3MgZm9yY2UgZmxhZyBpcyBzZXQpXG4gICAgICAgIGlmIChvcHRpb25zLmNkayAmJiAhb3B0aW9ucy5mb3JjZSAmJiB0ZW1wbGF0ZVNlcnZpY2UuY2RrRGlyZWN0b3J5RXhpc3RzKGN3ZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgJ0NESyBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMnLFxuICAgICAgICAgICAgICAgICdVc2UgLS1mb3JjZSBmbGFnIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBDREsgaW5mcmFzdHJ1Y3R1cmUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgb3B0aW9ucyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgZGVmYXVsdHNcbiAgICAgICAgY29uc3QgdGFyZ2V0RGlyID0gb3B0aW9ucy5kaXIgfHwgKG9wdGlvbnMuY2RrID8gJ2NkaycgOiBjd2QpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IG9wdGlvbnMuY2RrID8gJ2NkaycgOiAob3B0aW9ucy50ZW1wbGF0ZSB8fCAnYmFzaWMnKTtcbiAgICAgICAgY29uc3QgY29yZSA9ICdydW50aW1lLXdlYic7IC8vIEFsd2F5cyB1c2UgcnVudGltZS13ZWIgZm9yIHJ1bnRpbWUgcGFja2FnZVxuICAgICAgICBsZXQgZm9yY2UgPSBvcHRpb25zLmZvcmNlIHx8IGZhbHNlO1xuXG4gICAgICAgIC8vIERlcml2ZSBwcm9qZWN0IG5hbWUgZnJvbSBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgcHJvamVjdE5hbWUgPSBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShjd2QsIG9wdGlvbnMuY2RrID8gY3dkIDogdGFyZ2V0RGlyKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHByb2plY3QgZmlsZXMgKGlmIG5vdCBDREstb25seSBpbml0KVxuICAgICAgICBpZiAoIW9wdGlvbnMuY2RrICYmICFmb3JjZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRUYXJnZXREaXIgPSBwYXRoLnJlc29sdmUoY3dkLCB0YXJnZXREaXIpO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdGaWxlcyA9IGF3YWl0IGNoZWNrRXhpc3RpbmdQcm9qZWN0RmlsZXMocmVzb2x2ZWRUYXJnZXREaXIpO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhpc3RpbmcgcHJvamVjdCBmaWxlcyBkZXRlY3RlZDonKTtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAtICR7ZmlsZX1gKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZE92ZXJ3cml0ZSA9IGF3YWl0IHByb21wdFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgJ0RvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGVzZSBmaWxlcz8nLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gRGVmYXVsdCB0byBOb1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZE92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCBpbml0aWFsaXphdGlvbiBjYW5jZWxsZWQuIEV4aXN0aW5nIGZpbGVzIHByZXNlcnZlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBVc2VyIGNvbmZpcm1lZCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgLy8gVXNlIFJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UgdG8gc2NhZmZvbGQgd2l0aCBydW50aW1lLXdlYiB0ZW1wbGF0ZXNcbiAgICAgICAgYXdhaXQgdGVtcGxhdGVTZXJ2aWNlLnNjYWZmb2xkKFxuICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICB0YXJnZXREaXIsIHtcbiAgICAgICAgICAgIHByb2plY3ROYW1lLFxuICAgICAgICAgICAgZm9yY2UsXG4gICAgICAgIH0sXG4gICAgICAgICAgICBjb3JlLCAvLyBBbHdheXMgcnVudGltZS13ZWJcbiAgICAgICAgKTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXG4gICAgICAgICAgICBvcHRpb25zLmNkayA/ICdDREsgaW5mcmFzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IScgOiAnUnVudGltZSBwcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERpc3BsYXkgc3VjY2VzcyBtZXNzYWdlIGFuZCBuZXh0IHN0ZXBzXG4gICAgICAgIGlmIChvcHRpb25zLmNkaykge1xuICAgICAgICAgICAgZGlzcGxheUNka1N1Y2Nlc3NNZXNzYWdlKGxvZ2dlciwgcHJvamVjdE5hbWUsIHRhcmdldERpciwgY3dkKTtcblxuICAgICAgICAgICAgLy8gRm9yIENESy1vbmx5IGluaXQsIGNoZWNrIGNyZWRlbnRpYWxzIGFuZCBvZmZlciBib290c3RyYXBcbiAgICAgICAgICAgIGlmIChlbnZWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENka0RpciA9IHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpcik7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2RrT25seUNyZWRlbnRpYWxzKGxvZ2dlciwgZW52VmFsaWRhdG9yLCByZXNvbHZlZENka0Rpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGF5UnVudGltZVN1Y2Nlc3NNZXNzYWdlKGxvZ2dlciwgcHJvamVjdE5hbWUsIHRhcmdldERpciwgY3dkKTtcblxuICAgICAgICAgICAgLy8gQWZ0ZXIgbWFpbiBwcm9qZWN0IGluaXRpYWxpemF0aW9uLCBwcm9tcHQgZm9yIENESyBpbml0aWFsaXphdGlvblxuICAgICAgICAgICAgY29uc3QgcHJvbXB0U2VydmljZSA9IG5ldyBQcm9tcHRTZXJ2aWNlKCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRJbml0Q2RrID0gYXdhaXQgcHJvbXB0U2VydmljZS5jb25maXJtKFxuICAgICAgICAgICAgICAgICdEbyB5b3Ugd2FudCB0byBpbml0aWFsaXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgZm9yIHRoaXMgcHJvamVjdCBub3c/JyxcbiAgICAgICAgICAgICAgICB0cnVlLCAvLyBEZWZhdWx0IHRvIFllc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHNob3VsZEluaXRDZGspIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIENESyB3b3JrZmxvdyB3aXRoIHJ1bnRpbWUtd2ViIGNvcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjZGtSZXN1bHQgPSBhd2FpdCBpbml0aWFsaXplQ2RrV29ya2Zsb3coXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpciksXG4gICAgICAgICAgICAgICAgICAgIGNvcmUsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgZW52VmFsaWRhdG9yLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNka1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENESyBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGJ1dCBtYWluIHByb2plY3QgaXMgT0tcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0NESyBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGJ1dCB5b3VyIFJ1bnRpbWUgcHJvamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdZb3UgY2FuIGluaXRpYWxpemUgQ0RLIGxhdGVyIGJ5IHJ1bm5pbmc6IG5wbSBpbnN0YWxsICYmIHJ1bnRpbWUgaW5pdCAtLWNkaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBkZWNsaW5lZCBDREsgaW5pdGlhbGl6YXRpb25cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdZb3UgY2FuIGluaXRpYWxpemUgQ0RLIGxhdGVyIGJ5IHJ1bm5pbmc6IG5wbSBpbnN0YWxsICYmIHJ1bnRpbWUgaW5pdCAtLWNkaycpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbChvcHRpb25zLmNkayA/ICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBDREsgaW5mcmFzdHJ1Y3R1cmUnIDogJ0ZhaWxlZCB0byBpbml0aWFsaXplIFJ1bnRpbWUgcHJvamVjdCcpO1xuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5kaW0oZXJyb3IuaGludCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICAgICAgZXhpdENvZGU6IDEsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgc3VjY2VzcyBtZXNzYWdlIGZvciBSdW50aW1lIHByb2plY3RzIHdpdGggbmV4dCBzdGVwc1xuICovXG5mdW5jdGlvbiBkaXNwbGF5UnVudGltZVN1Y2Nlc3NNZXNzYWdlKFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByb2plY3ROYW1lOiBzdHJpbmcsXG4gICAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gICAgY3dkOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlZERpciA9IHBhdGgucmVzb2x2ZShjd2QsIHRhcmdldERpcik7XG4gICAgY29uc3QgaXNDdXJyZW50RGlyID0gcmVzb2x2ZWREaXIgPT09IGN3ZDtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgIGxvZ2dlci5zdWNjZXNzKGNoYWxrLmJvbGQoYFJ1bnRpbWUgcHJvamVjdCAnJHtwcm9qZWN0TmFtZX0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IWApKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1Byb2plY3Qgc3RydWN0dXJlOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHNyYy8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxQ1x1MjUwMFx1MjUwMCBpbmRleC50c3ggICAgICAgIyBSZWFjdCBhcHAgZW50cnknKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUwMiAgIFx1MjUxQ1x1MjUwMFx1MjUwMCBBcHAudHN4ICAgICAgICAgIyBSb290IGNvbXBvbmVudCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTAyICAgXHUyNTE0XHUyNTAwXHUyNTAwIHJvdXRlcy50c3ggICAgICAjIFJlYWN0IFJvdXRlciByb3V0ZXMnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxQ1x1MjUwMFx1MjUwMCBwdWJsaWMvJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MDIgICBcdTI1MTRcdTI1MDBcdTI1MDAgaW5kZXguaHRtbCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHJ1bnRpbWUuY29uZmlnLnRzICAgIyBSdW50aW1lIGNvbmZpZ3VyYXRpb24nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxQ1x1MjUwMFx1MjUwMCB0c2NvbmZpZy5qc29uICAgICAgICMgVHlwZVNjcmlwdCBjb25maWcnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxNFx1MjUwMFx1MjUwMCBwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdOZXh0IHN0ZXBzOicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgaWYgKCFpc0N1cnJlbnREaXIpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgICBjZCAke3BhdGgucmVsYXRpdmUoY3dkLCByZXNvbHZlZERpcil9YCkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0RldmVsb3BtZW50OicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIFN0YXJ0IGxvY2FsIGRldmVsb3BtZW50IHNlcnZlcicpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0J1aWxkICYgRGVwbG95OicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgYnVpbGQnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgQnVpbGQgYWxsIHRhcmdldHMgKFJlYWN0LCBMYW1iZGEsIENESyknKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGRlcGxveSAtLXN0YWdlIGRldicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBEZXBsb3kgdG8gQVdTJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXHVEODNEXHVEQ0RBIExlYXJuIG1vcmU6JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBodHRwczovL3J1bnRpbWV3ZWIuY29tL2RvY3MnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG59XG5cbi8qKlxuICogRGlzcGxheSBDREstc3BlY2lmaWMgc3VjY2VzcyBtZXNzYWdlIHdpdGggbmV4dCBzdGVwc1xuICovXG5mdW5jdGlvbiBkaXNwbGF5Q2RrU3VjY2Vzc01lc3NhZ2UoXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgICB0YXJnZXREaXI6IHN0cmluZyxcbiAgICBjd2Q6IHN0cmluZyxcbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgdGFyZ2V0RGlyKTtcbiAgICBjb25zdCByZWxhdGl2ZURpciA9IHBhdGgucmVsYXRpdmUoY3dkLCByZXNvbHZlZERpcik7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICBsb2dnZXIuc3VjY2VzcyhjaGFsay5ib2xkKGBDREsgaW5mcmFzdHJ1Y3R1cmUgZm9yICcke3Byb2plY3ROYW1lfScgY3JlYXRlZCBzdWNjZXNzZnVsbHkhYCkpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnQ0RLIHN0cnVjdHVyZTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIGNkay8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFx1MjUxQ1x1MjUwMFx1MjUwMCBiaW4vJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBcdTI1MDIgICBcdTI1MTRcdTI1MDBcdTI1MDAgYXBwLnRzICAgICAgICAgICMgQ0RLIGFwcCBlbnRyeSBwb2ludCcpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIGNkay5qc29uICAgICAgICAgICAgIyBDREsgY29uZmlndXJhdGlvbicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTFDXHUyNTAwXHUyNTAwIHRzY29uZmlnLmpzb24gICAgICAgIyBUeXBlU2NyaXB0IGNvbmZpZycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgXHUyNTE0XHUyNTAwXHUyNTAwIC5lbnYuZXhhbXBsZSAgICAgICAgIyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdGVtcGxhdGUnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdSZWFkeSB0byBkZXBsb3k6JykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGAgIGNkICR7cmVsYXRpdmVEaXJ9YCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIEFsbCBkZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgaW5zdGFsbGVkJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGVwbG95IHRvIEFXUzonKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGluaXQgLS1jZGsnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICMgQm9vdHN0cmFwIENESyAob25seSBuZWVkZWQgb25jZSBwZXIgYWNjb3VudC9yZWdpb24pJykpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignICBjZGsgZGlmZicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgIyBQcmV2aWV3IGNoYW5nZXMgYmVmb3JlIGRlcGxveWluZycpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICAjIERlcGxveSB5b3VyIGluZnJhc3RydWN0dXJlJykpO1xuXG4gICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXHVEODNDXHVERkFGIERlcGxveSB0byBkaWZmZXJlbnQgc3RhZ2VzOicpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2Ugc3RhZ2luZycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGRlcGxveSAtLXN0YWdlIHByb2QnKSk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcdUQ4M0RcdURDREEgTGVhcm4gbW9yZTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgIFJ1bnRpbWUgQ0RLOiBodHRwczovL3J1bnRpbWV3ZWIuY29tL2RvY3MvY2RrJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbSgnICBBV1MgQ0RLOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrLycpKTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIENESyBpbmZyYXN0cnVjdHVyZSB3b3JrZmxvdyB1c2luZyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVDZGtXb3JrZmxvdyhcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgICBjb3JlOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXG4gICAgZW52VmFsaWRhdG9yPzogRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4pOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgICAvLyBJbXBvcnQgdGhlIENESyB3b3JrZmxvdyBsb2dpYyBmcm9tIHB1cmVub3cgYnV0IHVzZSBvdXIgUnVudGltZVRlbXBsYXRlU2VydmljZVxuICAgIGNvbnN0IHtcbiAgICAgICAgUHJvbXB0U2VydmljZSxcbiAgICAgICAgUGFja2FnZU1hbmFnZXJTZXJ2aWNlLFxuICAgICAgICBDZGtJbml0U2VydmljZSxcbiAgICAgICAgQXdzQ3JlZGVudGlhbHNEZXRlY3RvcixcbiAgICAgICAgQXdzUmVnaW9uUmVzb2x2ZXIsXG4gICAgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmt0aWYvcHVyZW5vdy9iaW4nKTtcblxuICAgIGNvbnN0IHByb21wdFNlcnZpY2UgPSBuZXcgUHJvbXB0U2VydmljZSgpO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyU2VydmljZSA9IG5ldyBQYWNrYWdlTWFuYWdlclNlcnZpY2UoKTtcbiAgICBjb25zdCBjZGtJbml0U2VydmljZSA9IG5ldyBDZGtJbml0U2VydmljZSh0ZW1wbGF0ZVNlcnZpY2UsIHBhY2thZ2VNYW5hZ2VyU2VydmljZSwgbG9nZ2VyKTtcbiAgICBjb25zdCBhd3NEZXRlY3RvciA9IG5ldyBBd3NDcmVkZW50aWFsc0RldGVjdG9yKCk7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lIGZvciBzcGFjaW5nXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgL2NkayBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGNka0V4aXN0cyA9IGF3YWl0IGNka0luaXRTZXJ2aWNlLmNoZWNrQ2RrRGlyZWN0b3J5RXhpc3RzKHByb2plY3REaXIpO1xuXG4gICAgICAgIGlmIChjZGtFeGlzdHMpIHtcbiAgICAgICAgICAgIC8vIFByb21wdCBmb3Igb3ZlcndyaXRlXG4gICAgICAgICAgICBjb25zdCBzaG91bGRPdmVyd3JpdGUgPSBhd2FpdCBwcm9tcHRTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICAgICAgICAgJ0EgL2NkayBmb2xkZXIgYWxyZWFkeSBleGlzdHMuIE92ZXJ3cml0ZSBpdD8nLFxuICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBEZWZhdWx0IHRvIE5vXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXNob3VsZE92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgZGVjbGluZWQgb3ZlcndyaXRlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnRXhpc3RpbmcgQ0RLIHNldHVwIHByZXNlcnZlZC4nKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIEFXUyByZWdpb24gdXNpbmcgU0RLJ3MgZGVmYXVsdCBwcm92aWRlciBjaGFpblxuICAgICAgICBjb25zdCByZWdpb25SZXNvbHZlciA9IG5ldyBBd3NSZWdpb25SZXNvbHZlcigpO1xuICAgICAgICBjb25zdCByZWdpb25SZXN1bHQgPSBhd2FpdCByZWdpb25SZXNvbHZlci5yZXNvbHZlUmVnaW9uKCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUmVnaW9uID0gcmVnaW9uUmVzdWx0LnJlZ2lvbiB8fCBBd3NSZWdpb25SZXNvbHZlci5nZXREZWZhdWx0UmVnaW9uKCk7XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNvbHZlZCBBV1MgcmVnaW9uOiAke3Jlc29sdmVkUmVnaW9ufSAoc291cmNlOiAke3JlZ2lvblJlc3VsdC5zb3VyY2V9KWApO1xuXG4gICAgICAgIC8vIExvYWQgcHJvamVjdCBjb25maWd1cmF0aW9uICh1c2UgZGVmYXVsdHMgaWYgbm90IGF2YWlsYWJsZSlcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgcHJvamVjdE5hbWUsXG4gICAgICAgICAgICBzdGFnZTogJ2RldicsXG4gICAgICAgICAgICByZWdpb246IHJlc29sdmVkUmVnaW9uLFxuICAgICAgICAgICAgZW5hYmxlU2VvOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERldGVjdCBwYWNrYWdlIG1hbmFnZXJcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXJTZXJ2aWNlLmRldGVjdFBhY2thZ2VNYW5hZ2VyKHByb2plY3REaXIpO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBwYWNrYWdlIG1hbmFnZXI6ICR7Y2hhbGsuY3lhbihkZXRlY3RlZE1hbmFnZXIpfWApO1xuICAgICAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBDREsgd2l0aCBhdXRvbWF0ZWQgaW5zdGFsbGF0aW9uXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBsb2dnZXIuc3Bpbm5lcignSW5pdGlhbGl6aW5nIENESyBpbmZyYXN0cnVjdHVyZS4uLicpO1xuICAgICAgICBzcGlubmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2RrSW5pdFNlcnZpY2UuaW5pdGlhbGl6ZUNkayh7XG4gICAgICAgICAgICBwcm9qZWN0RGlyLFxuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgICAgICBlbmFibGVTZW86IGNvbmZpZy5lbmFibGVTZW8sXG4gICAgICAgICAgICBvdmVyd3JpdGVFeGlzdGluZzogY2RrRXhpc3RzLFxuICAgICAgICAgICAgcnVuQm9vdHN0cmFwOiBmYWxzZSwgLy8gV2UnbGwgaGFuZGxlIGJvb3RzdHJhcCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICBwYWNrYWdlTWFuYWdlcjogZGV0ZWN0ZWRNYW5hZ2VyLFxuICAgICAgICB9LCBjb3JlKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBpbml0aWFsaXplIENESyBpbmZyYXN0cnVjdHVyZScpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihyZXN1bHQuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3IsXG4gICAgICAgICAgICAgICAgZXhpdENvZGU6IDEsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdDREsgaW5mcmFzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuXG4gICAgICAgIC8vIERpc3BsYXkgaW5zdGFsbGF0aW9uIHN1bW1hcnlcbiAgICAgICAgaWYgKHJlc3VsdC5wcm9qZWN0RGVwZW5kZW5jaWVzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5ncmVlbignXHUyNzEzIFByb2plY3QgZGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmNka0RlcGVuZGVuY2llc0luc3RhbGxlZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oY2hhbGsuZ3JlZW4oJ1x1MjcxMyBDREsgZGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICAgICAgZXhpdENvZGU6IDEsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZSBjcmVkZW50aWFscyBjaGVjayBmb3IgQ0RLLW9ubHkgaW5pdCAocnVudGltZSBpbml0IC0tY2RrKVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDZGtPbmx5Q3JlZGVudGlhbHMoXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICAgZW52VmFsaWRhdG9yOiBFbnZpcm9ubWVudFZhbGlkYXRvcixcbiAgICBjZGtEaXI6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmUgZm9yIHNwYWNpbmdcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gZ2V0IHZhbGlkYXRlZCBjb25maWdcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICBjb25zdCBpc0F3c0NyZWRlbnRpYWxzVmFsaWQgPSAhY29uZmlnLmlzQXdzQ3JlZGVudGlhbHNEdW1wKCk7XG5cbiAgICAgICAgaWYgKCFpc0F3c0NyZWRlbnRpYWxzVmFsaWQpIHtcbiAgICAgICAgICAgIGxvZ0NyZWRlbnRpYWxzRXJyb3IobG9nZ2VyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENyZWRlbnRpYWxzIGFyZSB2YWxpZCAtIGluZm9ybSB1c2VyXG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhjaGFsay5ncmVlbignXHUyNzEzIEFXUyBjcmVkZW50aWFscyBkZXRlY3RlZCcpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnWW91ciBDREsgaW5mcmFzdHJ1Y3R1cmUgaXMgcmVhZHkuIFlvdSBjYW4gbm93OicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgaW5pdCAtLWNkayAgICAgICAgICAjIEJvb3RzdHJhcCB5b3VyIEFXUyBlbnZpcm9ubWVudCAoZmlyc3QgdGltZSBvbmx5KScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgbnB4IHJ1bnRpbWUgZGVwbG95IC0tc3RhZ2UgZGV2ICAjIERlcGxveSB5b3VyIGluZnJhc3RydWN0dXJlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAvLyBDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCAtIGRpc3BsYXkgZnJpZW5kbHkgd2FybmluZ1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oY2hhbGsueWVsbG93KCchICBBV1MgY3JlZGVudGlhbHMgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDREsgaW5mcmFzdHJ1Y3R1cmUgZmlsZXMgd2VyZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSBpbiAvY2RrJyk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnSG93ZXZlciwgQVdTIGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCBmb3IgZGVwbG95bWVudC4nKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnUGxlYXNlIGNvbmZpZ3VyZSBBV1MgY3JlZGVudGlhbHMgYmVmb3JlIGRlcGxveWluZzonKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdPcHRpb24gMTogQVdTIENMSSAoUmVjb21tZW5kZWQpJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgYXdzIGNvbmZpZ3VyZScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdPcHRpb24gMjogRW52aXJvbm1lbnQgVmFyaWFibGVzJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgZXhwb3J0IEFXU19BQ0NFU1NfS0VZX0lEPXlvdXJfa2V5X2lkJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgZXhwb3J0IEFXU19TRUNSRVRfQUNDRVNTX0tFWT15b3VyX3NlY3JldF9rZXknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oJyAgJCBleHBvcnQgQVdTX1JFR0lPTj11cy1lYXN0LTEnKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnT3B0aW9uIDM6IEFXUyBQcm9maWxlJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKCcgICQgZXhwb3J0IEFXU19QUk9GSUxFPXlvdXJfcHJvZmlsZV9uYW1lJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBZnRlciBjb25maWd1cmluZyBjcmVkZW50aWFscywgeW91IGNhbiBkZXBsb3kgYnkgcnVubmluZzonKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGluaXQgLS1jZGsgICAgICAgICAgIyBCb290c3RyYXAgeW91ciBBV1MgZW52aXJvbm1lbnQgKGZpcnN0IHRpbWUgb25seSknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIG5weCBydW50aW1lIGRlcGxveSAtLXN0YWdlIGRldiAgIyBEZXBsb3kgeW91ciBpbmZyYXN0cnVjdHVyZScpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yIC0gcmV0aHJvd1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGV4aXN0aW5nIHByb2plY3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBvdmVyd3JpdHRlblxuICpcbiAqIEBwYXJhbSBwcm9qZWN0RGlyIC0gUHJvamVjdCBkaXJlY3RvcnkgcGF0aFxuICogQHJldHVybnMgQXJyYXkgb2YgZXhpc3RpbmcgZmlsZSBwYXRocyAocmVsYXRpdmUgdG8gcHJvamVjdCBkaXIpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdQcm9qZWN0RmlsZXMocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBLZXkgZmlsZXMgdGhhdCBpbmRpY2F0ZSBhbiBleGlzdGluZyBwcm9qZWN0XG4gICAgY29uc3Qga2V5RmlsZXMgPSBbXG4gICAgICAgICdwYWNrYWdlLmpzb24nLFxuICAgICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICAgJ3NyYy9pbmRleC50c3gnLFxuICAgICAgICAnc3JjL0FwcC50c3gnLFxuICAgICAgICAncnVudGltZS5jb25maWcudHMnLFxuICAgICAgICAncHVyZW5vdy5jb25maWcudHMnLFxuICAgICAgICAndHNjb25maWcuanNvbicsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBrZXlGaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBmaWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgICAgICBleGlzdGluZ0ZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBjb250aW51ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nRmlsZXM7XG59Il0sCiAgIm1hcHBpbmdzIjogIndvQkFBQSxJQUFBQSxHQUFBQyxFQUFBLEtBY0EsSUFBSUMsSUFDSCxTQUFVQSxFQUFTLEVBR2YsU0FBVUMsRUFBUyxDQUNoQixJQUFJQyxFQUFPLE9BQU8sWUFBZSxTQUFXLFdBQ3hDLE9BQU8sUUFBVyxTQUFXLE9BQ3pCLE9BQU8sTUFBUyxTQUFXLEtBQ3ZCLE9BQU8sTUFBUyxTQUFXLEtBQ3ZCQyxFQUFlLEVBQzNCQyxFQUFXQyxFQUFhTCxDQUFPLEVBQy9CLE9BQU9FLEVBQUssUUFBWSxNQUN4QkUsRUFBV0MsRUFBYUgsRUFBSyxRQUFTRSxDQUFRLEdBRWxESCxFQUFRRyxFQUFVRixDQUFJLEVBQ2xCLE9BQU9BLEVBQUssUUFBWSxNQUN4QkEsRUFBSyxRQUFVRixHQUVuQixTQUFTSyxFQUFhQyxFQUFRQyxFQUFVLENBQ3BDLE9BQU8sU0FBVUMsRUFBS0MsRUFBTyxDQUN6QixPQUFPLGVBQWVILEVBQVFFLEVBQUssQ0FBRSxhQUFjLEdBQU0sU0FBVSxHQUFNLE1BQU9DLENBQU0sQ0FBQyxFQUNuRkYsR0FDQUEsRUFBU0MsRUFBS0MsQ0FBSyxDQUMzQixDQUNKLENBQ0EsU0FBU0MsR0FBZSxDQUNwQixHQUFJLENBQ0EsT0FBTyxTQUFTLGNBQWMsRUFBRSxDQUNwQyxNQUNVLENBQUUsQ0FDaEIsQ0FDQSxTQUFTQyxHQUFtQixDQUN4QixHQUFJLENBQ0EsU0FBZ0IsTUFBTSxpQ0FBaUMsQ0FDM0QsTUFDVSxDQUFFLENBQ2hCLENBQ0EsU0FBU1IsR0FB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TyxzQkFBc0IsRUFDeERILEVBQVMsTUFBTUcsRUFDbkIsQ0FDRSxHQUFHakIsRUFDSCxVQUFXLG9CQUNiLEVBQ0FhLEVBQVEsT0FDUkEsRUFBUSxHQUNWLEVBRUtDLEVBQU8sU0FDVixFQUFBWCxRQUFRLEtBQUtXLEVBQU8sUUFBUSxDQUVoQyxPQUFTWixFQUFPLENBQ2RXLEVBQVEsT0FBTyxNQUFNWCxhQUFpQixNQUFRQSxFQUFNLFFBQVUsT0FBT0EsQ0FBSyxDQUFDLEVBQzNFLEVBQUFDLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0YsQ0FLQSxNQUFNLElBQUllLEVBQWdDLENBQ3hDLE1BQU0sS0FBSyxRQUFRLFdBQVdBLEdBQVEsRUFBQWYsUUFBUSxJQUFJLENBQ3BELENBS0EsT0FBYyxZQUFZRCxFQUF1QixDQUMvQyxJQUFNaUIsRUFBWSxJQUFJQyxHQUNoQkMsRUFBVSxDQUFDLENBQUMsRUFBQWxCLFFBQVEsSUFBSSxNQUU5QixHQUFJRCxhQUFpQm9CLEVBQXNCLENBQ3pDLElBQU1DLEVBQWlCSixFQUFVLG9CQUFvQmpCLEVBQU9tQixDQUFPLEVBQ25FLFFBQVEsTUFBTUUsQ0FBYyxDQUM5QixTQUFXckIsYUFBaUJzQixHQUErQixDQUN6RCxJQUFNRCxFQUFpQkosRUFBVSw2QkFBNkJqQixFQUFPbUIsQ0FBTyxFQUM1RSxRQUFRLE1BQU1FLENBQWMsQ0FDOUIsU0FBV3JCLGFBQWlCLE1BQU8sQ0FDakMsSUFBTXFCLEVBQWlCSixFQUFVLFlBQVlqQixFQUFPbUIsQ0FBTyxFQUMzRCxRQUFRLE1BQU1FLENBQWMsQ0FDOUIsTUFDRSxRQUFRLE1BQU0saUJBQWtCLE9BQU9yQixDQUFLLENBQUMsRUFFL0MsRUFBQUMsUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FDRixFQUtPLFNBQVNzQixJQUFrQyxDQUNoRCxPQUFPLElBQUkvQixFQUNiIiwKICAibmFtZXMiOiBbInJlcXVpcmVfUmVmbGVjdCIsICJfX2NvbW1vbkpTTWluIiwgIlJlZmxlY3QiLCAiZmFjdG9yeSIsICJyb290IiwgInNsb3BweU1vZGVUaGlzIiwgImV4cG9ydGVyIiwgIm1ha2VFeHBvcnRlciIsICJ0YXJnZXQiLCAicHJldmlvdXMiLCAia2V5IiwgInZhbHVlIiwgImZ1bmN0aW9uVGhpcyIsICJpbmRpcmVjdEV2YWxUaGlzIiwgImhhc093biIsICJzdXBwb3J0c1N5bWJvbCIsICJ0b1ByaW1pdGl2ZVN5bWJvbCIsICJpdGVyYXRvclN5bWJvbCIsICJzdXBwb3J0c0NyZWF0ZSIsICJzdXBwb3J0c1Byb3RvIiwgImRvd25MZXZlbCIsICJIYXNoTWFwIiwgIk1ha2VEaWN0aW9uYXJ5IiwgIm1hcCIsICJmdW5jdGlvblByb3RvdHlwZSIsICJfTWFwIiwgIkNyZWF0ZU1hcFBvbHlmaWxsIiwgIl9TZXQiLCAiQ3JlYXRlU2V0UG9seWZpbGwiLCAiX1dlYWtNYXAiLCAiQ3JlYXRlV2Vha01hcFBvbHlmaWxsIiwgInJlZ2lzdHJ5U3ltYm9sIiwgIm1ldGFkYXRhUmVnaXN0cnkiLCAiR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwgIm1ldGFkYXRhUHJvdmlkZXIiLCAiQ3JlYXRlTWV0YWRhdGFQcm92aWRlciIsICJkZWNvcmF0ZSIsICJkZWNvcmF0b3JzIiwgInByb3BlcnR5S2V5IiwgImF0dHJpYnV0ZXMiLCAiSXNVbmRlZmluZWQiLCAiSXNBcnJheSIsICJJc0NvbnN0cnVjdG9yIiwgIkRlY29yYXRlQ29uc3RydWN0b3IiLCAiSXNPYmplY3QiLCAiSXNOdWxsIiwgIlRvUHJvcGVydHlLZXkiLCAiRGVjb3JhdGVQcm9wZXJ0eSIsICJtZXRhZGF0YSIsICJtZXRhZGF0YUtleSIsICJtZXRhZGF0YVZhbHVlIiwgImRlY29yYXRvciIsICJJc1Byb3BlcnR5S2V5IiwgIk9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaGFzTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNNZXRhZGF0YSIsICJoYXNPd25NZXRhZGF0YSIsICJPcmRpbmFyeUhhc093bk1ldGFkYXRhIiwgImdldE1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0TWV0YWRhdGEiLCAiZ2V0T3duTWV0YWRhdGEiLCAiT3JkaW5hcnlHZXRPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YUtleXMiLCAiT3JkaW5hcnlNZXRhZGF0YUtleXMiLCAiZ2V0T3duTWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5T3duTWV0YWRhdGFLZXlzIiwgImRlbGV0ZU1ldGFkYXRhIiwgInByb3ZpZGVyIiwgIkdldE1ldGFkYXRhUHJvdmlkZXIiLCAiaSIsICJkZWNvcmF0ZWQiLCAiZGVzY3JpcHRvciIsICJNZXRhZGF0YUtleSIsICJPIiwgIlAiLCAicGFyZW50IiwgIk9yZGluYXJ5R2V0UHJvdG90eXBlT2YiLCAiVG9Cb29sZWFuIiwgIk1ldGFkYXRhVmFsdWUiLCAib3duS2V5cyIsICJwYXJlbnRLZXlzIiwgInNldCIsICJrZXlzIiwgIl9pIiwgIm93bktleXNfMSIsICJoYXNLZXkiLCAiX2EiLCAicGFyZW50S2V5c18xIiwgIlR5cGUiLCAieCIsICJJc1N5bWJvbCIsICJUb1ByaW1pdGl2ZSIsICJpbnB1dCIsICJQcmVmZXJyZWRUeXBlIiwgImhpbnQiLCAiZXhvdGljVG9QcmltIiwgIkdldE1ldGhvZCIsICJyZXN1bHQiLCAiT3JkaW5hcnlUb1ByaW1pdGl2ZSIsICJ0b1N0cmluZ18xIiwgIklzQ2FsbGFibGUiLCAidmFsdWVPZiIsICJ0b1N0cmluZ18yIiwgImFyZ3VtZW50IiwgIlRvU3RyaW5nIiwgIlNhbWVWYWx1ZVplcm8iLCAieSIsICJWIiwgImZ1bmMiLCAiR2V0SXRlcmF0b3IiLCAib2JqIiwgIm1ldGhvZCIsICJpdGVyYXRvciIsICJJdGVyYXRvclZhbHVlIiwgIml0ZXJSZXN1bHQiLCAiSXRlcmF0b3JTdGVwIiwgIkl0ZXJhdG9yQ2xvc2UiLCAiZiIsICJwcm90byIsICJwcm90b3R5cGUiLCAicHJvdG90eXBlUHJvdG8iLCAiY29uc3RydWN0b3IiLCAiQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJmYWxsYmFjayIsICJDcmVhdGVGYWxsYmFja1Byb3ZpZGVyIiwgImZpcnN0IiwgInNlY29uZCIsICJyZXN0IiwgInRhcmdldFByb3ZpZGVyTWFwIiwgInJlZ2lzdHJ5IiwgInJlZ2lzdGVyUHJvdmlkZXIiLCAiZ2V0UHJvdmlkZXIiLCAic2V0UHJvdmlkZXIiLCAiZ2V0UHJvdmlkZXJOb0NhY2hlIiwgIm5leHQiLCAicHJvdmlkZXJNYXAiLCAiaGFzUHJvdmlkZXIiLCAiZXhpc3RpbmdQcm92aWRlciIsICJ0YXJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeURlbGV0ZU1ldGFkYXRhIiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFNYXAiLCAiQ3JlYXRlIiwgImNyZWF0ZWRUYXJnZXRNZXRhZGF0YSIsICJtZXRhZGF0YU1hcCIsICJrZXlzT2JqIiwgImsiLCAibmV4dFZhbHVlIiwgImUiLCAicmVmbGVjdCIsICJtZXRhZGF0YU93bmVyIiwgIm1ldGFkYXRhUHJvcGVydHlTZXQiLCAicmVnaXN0ZXJlZFByb3ZpZGVyIiwgImNhY2hlU2VudGluZWwiLCAiYXJyYXlTZW50aW5lbCIsICJNYXBJdGVyYXRvciIsICJ2YWx1ZXMiLCAic2VsZWN0b3IiLCAiaW5kZXgiLCAiZXJyb3IiLCAiTWFwIiwgInNpemUiLCAiZ2V0S2V5IiwgImdldFZhbHVlIiwgImdldEVudHJ5IiwgImluc2VydCIsICJfIiwgIlNldCIsICJVVUlEX1NJWkUiLCAicm9vdEtleSIsICJDcmVhdGVVbmlxdWVLZXkiLCAiV2Vha01hcCIsICJ0YWJsZSIsICJHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSIsICJDcmVhdGVVVUlEIiwgImNyZWF0ZSIsICJGaWxsUmFuZG9tQnl0ZXMiLCAiYnVmZmVyIiwgIkdlblJhbmRvbUJ5dGVzIiwgImFycmF5IiwgImRhdGEiLCAib2Zmc2V0IiwgImJ5dGUiLCAicmVxdWlyZV9jb2xvcl9uYW1lIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAicmVxdWlyZV9jb252ZXJzaW9ucyIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImNzc0tleXdvcmRzIiwgInJldmVyc2VLZXl3b3JkcyIsICJrZXkiLCAiY29udmVydCIsICJtb2RlbCIsICJjaGFubmVscyIsICJsYWJlbHMiLCAicmdiIiwgInIiLCAiZyIsICJiIiwgIm1pbiIsICJtYXgiLCAiZGVsdGEiLCAiaCIsICJzIiwgImwiLCAicmRpZiIsICJnZGlmIiwgImJkaWYiLCAiZGlmZiIsICJkaWZmYyIsICJjIiwgInciLCAiayIsICJtIiwgInkiLCAiY29tcGFyYXRpdmVEaXN0YW5jZSIsICJ4IiwgInJldmVyc2VkIiwgImN1cnJlbnRDbG9zZXN0RGlzdGFuY2UiLCAiY3VycmVudENsb3Nlc3RLZXl3b3JkIiwgImtleXdvcmQiLCAidmFsdWUiLCAiZGlzdGFuY2UiLCAieiIsICJ4eXoiLCAiYSIsICJoc2wiLCAidDIiLCAidDMiLCAidmFsIiwgInQxIiwgImkiLCAic21pbiIsICJsbWluIiwgInYiLCAic3YiLCAiaHN2IiwgImhpIiwgImYiLCAicCIsICJxIiwgInQiLCAidm1pbiIsICJzbCIsICJod2IiLCAid2giLCAiYmwiLCAicmF0aW8iLCAibiIsICJjbXlrIiwgImxhYiIsICJ5MiIsICJ4MiIsICJ6MiIsICJsY2giLCAiaHIiLCAiYXJncyIsICJzYXR1cmF0aW9uIiwgImFuc2kiLCAiY29sb3IiLCAibXVsdCIsICJyZW0iLCAic3RyaW5nIiwgIm1hdGNoIiwgImNvbG9yU3RyaW5nIiwgImNoYXIiLCAiaW50ZWdlciIsICJjaHJvbWEiLCAiZ3JheXNjYWxlIiwgImh1ZSIsICJoY2ciLCAicHVyZSIsICJtZyIsICJhcHBsZSIsICJncmF5IiwgInJlcXVpcmVfcm91dGUiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJjb252ZXJzaW9ucyIsICJidWlsZEdyYXBoIiwgImdyYXBoIiwgIm1vZGVscyIsICJsZW4iLCAiaSIsICJkZXJpdmVCRlMiLCAiZnJvbU1vZGVsIiwgInF1ZXVlIiwgImN1cnJlbnQiLCAiYWRqYWNlbnRzIiwgImFkamFjZW50IiwgIm5vZGUiLCAibGluayIsICJmcm9tIiwgInRvIiwgImFyZ3MiLCAid3JhcENvbnZlcnNpb24iLCAidG9Nb2RlbCIsICJwYXRoIiwgImZuIiwgImN1ciIsICJjb252ZXJzaW9uIiwgInJlcXVpcmVfY29sb3JfY29udmVydCIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImNvbnZlcnNpb25zIiwgInJvdXRlIiwgImNvbnZlcnQiLCAibW9kZWxzIiwgIndyYXBSYXciLCAiZm4iLCAid3JhcHBlZEZuIiwgImFyZ3MiLCAiYXJnMCIsICJ3cmFwUm91bmRlZCIsICJyZXN1bHQiLCAibGVuIiwgImkiLCAiZnJvbU1vZGVsIiwgInJvdXRlcyIsICJ0b01vZGVsIiwgInJlcXVpcmVfYW5zaV9zdHlsZXMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJ3cmFwQW5zaTE2IiwgImZuIiwgIm9mZnNldCIsICJhcmdzIiwgIndyYXBBbnNpMjU2IiwgImNvZGUiLCAid3JhcEFuc2kxNm0iLCAicmdiIiwgImFuc2kyYW5zaSIsICJuIiwgInJnYjJyZ2IiLCAiZyIsICJiIiwgInNldExhenlQcm9wZXJ0eSIsICJvYmplY3QiLCAicHJvcGVydHkiLCAiZ2V0IiwgInZhbHVlIiwgImNvbG9yQ29udmVydCIsICJtYWtlRHluYW1pY1N0eWxlcyIsICJ3cmFwIiwgInRhcmdldFNwYWNlIiwgImlkZW50aXR5IiwgImlzQmFja2dyb3VuZCIsICJzdHlsZXMiLCAic291cmNlU3BhY2UiLCAic3VpdGUiLCAibmFtZSIsICJhc3NlbWJsZVN0eWxlcyIsICJjb2RlcyIsICJncm91cE5hbWUiLCAiZ3JvdXAiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgInJlcXVpcmVfaGFzX2ZsYWciLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJmbGFnIiwgImFyZ3YiLCAicHJlZml4IiwgInBvc2l0aW9uIiwgInRlcm1pbmF0b3JQb3NpdGlvbiIsICJyZXF1aXJlX3N1cHBvcnRzX2NvbG9yIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAib3MiLCAidHR5IiwgImhhc0ZsYWciLCAiZW52IiwgImZvcmNlQ29sb3IiLCAidHJhbnNsYXRlTGV2ZWwiLCAibGV2ZWwiLCAic3VwcG9ydHNDb2xvciIsICJoYXZlU3RyZWFtIiwgInN0cmVhbUlzVFRZIiwgIm1pbiIsICJvc1JlbGVhc2UiLCAic2lnbiIsICJ2ZXJzaW9uIiwgImdldFN1cHBvcnRMZXZlbCIsICJzdHJlYW0iLCAicmVxdWlyZV91dGlsIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAic3RyaW5nUmVwbGFjZUFsbCIsICJzdHJpbmciLCAic3Vic3RyaW5nIiwgInJlcGxhY2VyIiwgImluZGV4IiwgInN1YnN0cmluZ0xlbmd0aCIsICJlbmRJbmRleCIsICJyZXR1cm5WYWx1ZSIsICJzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgiLCAicHJlZml4IiwgInBvc3RmaXgiLCAiZ290Q1IiLCAicmVxdWlyZV90ZW1wbGF0ZXMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJURU1QTEFURV9SRUdFWCIsICJTVFlMRV9SRUdFWCIsICJTVFJJTkdfUkVHRVgiLCAiRVNDQVBFX1JFR0VYIiwgIkVTQ0FQRVMiLCAidW5lc2NhcGUiLCAiYyIsICJ1IiwgImJyYWNrZXQiLCAicGFyc2VBcmd1bWVudHMiLCAibmFtZSIsICJhcmd1bWVudHNfIiwgInJlc3VsdHMiLCAiY2h1bmtzIiwgIm1hdGNoZXMiLCAiY2h1bmsiLCAibnVtYmVyIiwgIm0iLCAiZXNjYXBlIiwgImNoYXJhY3RlciIsICJwYXJzZVN0eWxlIiwgInN0eWxlIiwgImFyZ3MiLCAiYnVpbGRTdHlsZSIsICJjaGFsayIsICJzdHlsZXMiLCAiZW5hYmxlZCIsICJsYXllciIsICJjdXJyZW50IiwgInN0eWxlTmFtZSIsICJ0ZW1wb3JhcnkiLCAiZXNjYXBlQ2hhcmFjdGVyIiwgImludmVyc2UiLCAiY2xvc2UiLCAic3RyaW5nIiwgImVyck1lc3NhZ2UiLCAicmVxdWlyZV9zb3VyY2UiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJhbnNpU3R5bGVzIiwgInN0ZG91dENvbG9yIiwgInN0ZGVyckNvbG9yIiwgInN0cmluZ1JlcGxhY2VBbGwiLCAic3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4IiwgImlzQXJyYXkiLCAibGV2ZWxNYXBwaW5nIiwgInN0eWxlcyIsICJhcHBseU9wdGlvbnMiLCAib2JqZWN0IiwgIm9wdGlvbnMiLCAiY29sb3JMZXZlbCIsICJDaGFsa0NsYXNzIiwgImNoYWxrRmFjdG9yeSIsICJjaGFsayIsICJhcmd1bWVudHNfIiwgImNoYWxrVGFnIiwgIkNoYWxrIiwgInN0eWxlTmFtZSIsICJzdHlsZSIsICJidWlsZGVyIiwgImNyZWF0ZUJ1aWxkZXIiLCAiY3JlYXRlU3R5bGVyIiwgInVzZWRNb2RlbHMiLCAibW9kZWwiLCAibGV2ZWwiLCAic3R5bGVyIiwgImJnTW9kZWwiLCAicHJvdG8iLCAib3BlbiIsICJjbG9zZSIsICJwYXJlbnQiLCAib3BlbkFsbCIsICJjbG9zZUFsbCIsICJzZWxmIiwgIl9zdHlsZXIiLCAiX2lzRW1wdHkiLCAiYXBwbHlTdHlsZSIsICJzdHJpbmciLCAibGZJbmRleCIsICJ0ZW1wbGF0ZSIsICJzdHJpbmdzIiwgImZpcnN0U3RyaW5nIiwgInBhcnRzIiwgImluZGV4X2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lTZXJ2aWNlIiwgIlJ1bnRpbWVCdWlsZEVycm9yIiwgIlJ1bnRpbWVDbGlFcnJvciIsICJSdW50aW1lQ29uZmlnRXJyb3IiLCAiUnVudGltZURlcGxveW1lbnRFcnJvciIsICJSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5IiwgIlJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIiwgIlJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyIiwgIlJ1bnRpbWVUZW1wbGF0ZUVycm9yIiwgIlJ1bnRpbWVUZW1wbGF0ZVNlcnZpY2UiLCAiUnVudGltZVRlbXBsYXRlU3RydWN0dXJlRXJyb3IiLCAiUnVudGltZVZhbGlkYXRpb25FcnJvciIsICJSdW50aW1lV2ViQ2xpIiwgIlJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSIsICJidWlsZFN0YXRpY0h0bWwiLCAiY3JlYXRlUnVudGltZUNsaSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3Byb2Nlc3MiLCAiaW1wb3J0X2JpbiIsICJmcyIsICJwYXRoIiwgImltcG9ydF9iaW4iLCAiUnVudGltZUNsaUVycm9yIiwgIm1lc3NhZ2UiLCAiY29kZSIsICJoaW50IiwgIlJ1bnRpbWVDb25maWdFcnJvciIsICJSdW50aW1lQnVpbGRFcnJvciIsICJSdW50aW1lRGVwbG95bWVudEVycm9yIiwgIlJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IiLCAiUnVudGltZUNsaUVycm9yIiwgIm1lc3NhZ2UiLCAiaGludCIsICJSdW50aW1lVGVtcGxhdGVFcnJvciIsICJ0ZW1wbGF0ZU5hbWUiLCAiY29yZURpciIsICJzZWFyY2hlZFBhdGhzIiwgInBhY2thZ2VDb250ZXh0IiwgInJlc29sdXRpb25TdHJhdGVneSIsICJSdW50aW1lVGVtcGxhdGVTdHJ1Y3R1cmVFcnJvciIsICJ0ZW1wbGF0ZURpciIsICJ2YWxpZGF0aW9uRXJyb3JzIiwgIlJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIiwgImVycm9yIiwgInZlcmJvc2UiLCAibGluZXMiLCAiZmllbGROYW1lIiwgInN0YWNrTmFtZSIsICJvcGVyYXRpb24iLCAicGF0aCIsICJ2YWxpZGF0aW9uRXJyb3IiLCAiUnVudGltZVN0cnVjdHVyZWRMb2dnZXIiLCAibWV0YWRhdGEiLCAibG9nRW50cnkiLCAiUnVudGltZVRlbXBsYXRlU2VydmljZSIsICJQdXJlbm93VGVtcGxhdGVTZXJ2aWNlIiwgImN3ZCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGFyZ2V0RGlyIiwgIm9wdGlvbnMiLCAiY29yZURpciIsICJ2YWxpZGF0aW9uIiwgIlJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIiwgInRlbXBsYXRlUGF0aCIsICJhdmFpbGFibGVUZW1wbGF0ZXMiLCAicmVzb2x1dGlvbkluZm8iLCAiUnVudGltZVRlbXBsYXRlRXJyb3IiLCAib3JpZ2luYWxUZW1wbGF0ZXNEaXIiLCAib3JpZ2luYWxDb3B5VGVtcGxhdGVGaWxlcyIsICJzb3VyY2VQYXRoIiwgInRhcmdldFBhdGgiLCAiY29udGV4dCIsICJydW50aW1lQ29udGV4dCIsICJzZWFyY2hQYXRocyIsICJzZWFyY2hSZXN1bHRzIiwgInBhY2thZ2VCYXNlZFBhdGgiLCAidGVtcGxhdGVzUGF0aCIsICJtb2R1bGVCYXNlZFBhdGhzIiwgIm1vZHVsZVBhdGgiLCAibm9kZU1vZHVsZVBhdGhzIiwgIm5vZGVNb2R1bGVQYXRoIiwgImVudkJhc2VkUGF0aHMiLCAiZW52UGF0aCIsICJ2YWxpZFJlc3VsdCIsICJyZXN1bHQiLCAic2VhcmNoZWRQYXRocyIsICJwYWNrYWdlUm9vdCIsICJjdXJyZW50RGlyIiwgInBhY2thZ2VKc29uUGF0aCIsICJwYXRocyIsICJydW50aW1lUGFja2FnZVBhdGgiLCAicnVudGltZVJvb3QiLCAiY2xpUGF0aCIsICJydW50aW1lV2ViUGF0aCIsICJlbnRyeSIsICJjb3JlUGF0aCIsICJlcnJvcnMiLCAidGVtcGxhdGVEaXJzIiwgInRlbXBsYXRlRGlyIiwgImVycm9yIiwgInJlc29sdXRpb25TdHJhdGVneSIsICJhdmFpbGFibGVDb3JlcyIsICJmcyIsICJzYW5pdGl6ZVN0YWNrTmFtZSIsICJuYW1lIiwgInNhbml0aXplZCIsICJpbXBvcnRfYmluIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJjd2QiLCAib3B0aW9ucyIsICJzdGFydFRpbWUiLCAic3RhZ2UiLCAiY29uZmlnIiwgImluZnJhU3RhY2tOYW1lIiwgInNhbml0aXplU3RhY2tOYW1lIiwgInJ1bnRpbWVTdGFja05hbWUiLCAicnVudGltZVdlYlN0YWNrTmFtZSIsICJzIiwgImluZnJhUmVzdWx0IiwgInJ1bnRpbWVSZXN1bHQiLCAicnVudGltZVdlYlJlc3VsdCIsICJkdXJhdGlvbiIsICJzdGFja05hbWUiLCAib3V0cHV0c1BhdGgiLCAib3V0cHV0cyIsICJvdXRwdXRzRmlsZUNvbnRlbnQiLCAic3RhY2tPdXRwdXRzIiwgImtleSIsICJsYW1iZGFNYXRjaCIsICJlcnJvciIsICJyZWdpb24iLCAicGFydCIsICJuYW1lIiwgInNlcnZpY2VOYW1lIiwgInJlZ2lvblNpbXBsaWZpZWQiLCAiUnVudGltZURlcGxveW1lbnRTdHJhdGVneSIsICJjb250ZXh0IiwgImVycm9yIiwgImNvbmZpZyIsICJkZXBsb3lDb25maWciLCAibG9nZ2VyIiwgIm9wdGlvbnMiLCAicmVzdWx0IiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mcyIsICJNQVhfVEVNUExBVEVfU0laRV9CWVRFUyIsICJMQU1CREFfQlVORExFX1NJWkVfTElNSVQiLCAiVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCIsICJsb2FkVGVtcGxhdGUiLCAicHJvamVjdFJvb3QiLCAidGVtcGxhdGVQYXRoIiwgInBhdGgiLCAidXNlRmFsbGJhY2siLCAiZnMiLCAiZ2V0RGVmYXVsdFRlbXBsYXRlIiwgImNvbnRlbnQiLCAidmFsaWRhdGVUZW1wbGF0ZVNpemUiLCAidmFsaWRhdGVUZW1wbGF0ZSIsICJodG1sIiwgInNpemVCeXRlcyIsICJzaXplTUIiLCAibWF4U2l6ZU1CIiwgIndhcm5pbmdUaHJlc2hvbGRNQiIsICJtaXNzaW5nVGFncyIsICJ2YWxpZGF0ZUJ1bmRsZVNpemUiLCAiZW1iZWRkZWRGaWxlUGF0aCIsICJlbWJlZGRlZEZpbGVTaXplIiwgImVtYmVkZGVkRmlsZVNpemVNQiIsICJsYW1iZGFCdW5kbGVQYXRoIiwgImJ1bmRsZVNpemUiLCAiYnVuZGxlU2l6ZU1CIiwgImdlbmVyYXRlRW1iZWRkZWRUZW1wbGF0ZUZpbGUiLCAidGVtcGxhdGUiLCAiZmlsZUNvbnRlbnQiLCAib3V0cHV0UGF0aCIsICJvdXRwdXREaXIiLCAidGVtcGxhdGVTaXplS0IiLCAiYnVpbGRTdGF0aWNIdG1sIiwgInNob3VsZEV4aXQiLCAiZXJyb3IiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X2NoYWxrIiwgImltcG9ydF9wcm9jZXNzIiwgImltcG9ydF9iaW4iLCAiUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIiwgInN0YWNrc0RlcGxveVNlcnZpY2UiLCAib3B0aW9ucyIsICJjb25maWciLCAibG9nZ2VyIiwgImN3ZCIsICJwcm9jZXNzIiwgImVudlZhbGlkYXRvciIsICJlcnJvciIsICJtZXNzYWdlIiwgInN0YWdlIiwgInN0YWdlQ29uZmlnIiwgInMiLCAiY2hhbGsiLCAiZGVwbG95U2VydmljZSIsICJidWlsZFNlcnZpY2UiLCAiYm9vdHN0cmFwU2VydmljZSIsICJjcmVkZW50aWFscyIsICJyZWdpb24iLCAicmVzdWx0IiwgImxhbWJkYUFybiIsICJpbmRleCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9jaGFsayIsICJpbXBvcnRfYmluIiwgInRhcmdldFJlcXVpcmVzQ3JlZGVudGlhbHMiLCAidGFyZ2V0IiwgImJ1aWxkQ29tbWFuZCIsICJvcHRpb25zIiwgImNvbmZpZyIsICJsb2dnZXIiLCAiY3dkIiwgImVudlZhbGlkYXRvciIsICJlcnJvciIsICJjaGFsayIsICJidWlsZFNlcnZpY2UiLCAicmVzdWx0cyIsICJzaG91bGRHZW5lcmF0ZVR5cGVzIiwgImJ1aWxkQWxsVGFyZ2V0cyIsICJidWlsZFNpbmdsZVRhcmdldCIsICJnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMiLCAiZGlzcGxheUJ1aWxkU3VtbWFyeSIsICJ0YXJnZXRzIiwgInNwaW5uZXIiLCAicmVzdWx0IiwgImNhcGl0YWxpemUiLCAiZm9ybWF0RHVyYXRpb24iLCAidG90YWxEdXJhdGlvbiIsICJzdW0iLCAiciIsICJmdWxsUGF0aCIsICJzaXplIiwgImdldEZpbGVTaXplIiwgInJlbGF0aXZlUGF0aCIsICJmaWxlUGF0aCIsICJzdGF0cyIsICJmb3JtYXRCeXRlcyIsICJieXRlcyIsICJrIiwgInNpemVzIiwgImkiLCAibXMiLCAic3RyIiwgInBhdGgiLCAiZnMiLCAiaW1wb3J0X2JpbiIsICJpbXBvcnRfY2hhbGsiLCAicnVudGltZUluaXRDb21tYW5kIiwgIm9wdGlvbnMiLCAibG9nZ2VyIiwgImN3ZCIsICJlbnZWYWxpZGF0b3IiLCAic3Bpbm5lciIsICJ0ZW1wbGF0ZVNlcnZpY2UiLCAiUnVudGltZVRlbXBsYXRlU2VydmljZSIsICJwcm9tcHRTZXJ2aWNlIiwgInRhcmdldERpciIsICJ0ZW1wbGF0ZSIsICJjb3JlIiwgImZvcmNlIiwgInByb2plY3ROYW1lIiwgInJlc29sdmVkVGFyZ2V0RGlyIiwgImV4aXN0aW5nRmlsZXMiLCAiY2hlY2tFeGlzdGluZ1Byb2plY3RGaWxlcyIsICJmaWxlIiwgImNoYWxrIiwgImRpc3BsYXlDZGtTdWNjZXNzTWVzc2FnZSIsICJyZXNvbHZlZENka0RpciIsICJoYW5kbGVDZGtPbmx5Q3JlZGVudGlhbHMiLCAiZGlzcGxheVJ1bnRpbWVTdWNjZXNzTWVzc2FnZSIsICJpbml0aWFsaXplQ2RrV29ya2Zsb3ciLCAiZXJyb3IiLCAicmVzb2x2ZWREaXIiLCAiaXNDdXJyZW50RGlyIiwgInJlbGF0aXZlRGlyIiwgInByb2plY3REaXIiLCAiUHJvbXB0U2VydmljZSIsICJQYWNrYWdlTWFuYWdlclNlcnZpY2UiLCAiQ2RrSW5pdFNlcnZpY2UiLCAiQXdzQ3JlZGVudGlhbHNEZXRlY3RvciIsICJBd3NSZWdpb25SZXNvbHZlciIsICJwYWNrYWdlTWFuYWdlclNlcnZpY2UiLCAiY2RrSW5pdFNlcnZpY2UiLCAiYXdzRGV0ZWN0b3IiLCAiY2RrRXhpc3RzIiwgInJlZ2lvblJlc3VsdCIsICJyZXNvbHZlZFJlZ2lvbiIsICJjb25maWciLCAiZGV0ZWN0ZWRNYW5hZ2VyIiwgInJlc3VsdCIsICJjZGtEaXIiLCAia2V5RmlsZXMiLCAiZmlsZVBhdGgiLCAiUnVudGltZVdlYkNsaSIsICJfUnVudGltZVdlYkNsaSIsICJ0YXJnZXRzIiwgIm5hbWUiLCAidGFyZ2V0IiwgImRlc2MiLCAib3B0aW9ucyIsICJidWlsZENvbW1hbmQiLCAiZXJyb3IiLCAicHJvY2VzcyIsICJkZXZPcHRpb25zIiwgInQiLCAiZ2xvYmFsT3B0cyIsICJjd2QiLCAicHVyZW5vd0NvbnRleHQiLCAic3RhY2tzRGVwbG95U2VydmljZSIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiY21kIiwgInN0cmF0ZWdpZXMiLCAiY29udGV4dCIsICJyZXN1bHQiLCAiUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIiwgInJ1bnRpbWVJbml0Q29tbWFuZCIsICJkZXN0cm95Q29tbWFuZCIsICJhcmdzIiwgImZvcm1hdHRlciIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJ2ZXJib3NlIiwgIlJ1bnRpbWVUZW1wbGF0ZUVycm9yIiwgImZvcm1hdHRlZEVycm9yIiwgIlJ1bnRpbWVUZW1wbGF0ZVN0cnVjdHVyZUVycm9yIiwgImNyZWF0ZVJ1bnRpbWVDbGkiXQp9Cg==